giovedì 8 marzo 2012

Otto Marzo

Valerio, un utente della mailing list italiana di OpenOffice.org sta scrivendo del codice StarBasic per calcolare la parità di un numero.
Dopo avere incontrato alcune difficoltà scrive un po contrariato:
> P.S. se penso che in C è così semplice calcolare la parità bit a bit ... ;-))
> solo che poi non avrei tutte le altre comodità di Calc.
La cosa mi ha incuriosito, e poi oggi è l'8 marzo e la parità è l'argomento del giorno!! :-)
Oltre a questo, ovviamente c'è il sapore della sfida.
Ben sapendo che StarBasic è il linguaggio più potente dell'universo ;) non posso accettare che si sostenga che con il linguaggio C codificare  la tal cosa sarebbe più semplice o più efficace eccetera eccetera...
Dunque vediamo un po di cosa si tratta:
secondo wikipedia:
Il bit di parità è un codice di controllo utilizzato nei calcolatori per prevenire errori nella trasmissione o nella memorizzazione dei dati.
In sostanza, si vanno a contare i bit alzati in un pacchetto di dati e si verifica se il numero risultante è pari o dispari.
In C esistono diversi metodi, ma questo mi è sembrato molto brillante:
Computing parity (1 if an odd number of bits set, 0 otherwise)
//--------------------------------
unsigned int v;       // word value to compute the parity of
bool parity = false;  // parity will be the parity of v

while (v)
{
  parity = !parity;
  v = v & (v - 1);
}
//--------------------------------
La traduzione in Basic è banale.
'__________________________________________________________________________
Function Parity(v As Long) As Boolean
Dim p As Boolean' parity will be the parity of v

    While (v)
      p = Not p
      v = v And (v - 1)
    Wend
    Parity = p

End Function
Per poter adattare la funzione all'uso nel foglio di calcolo però occorre fare un ulteriore passaggio:
A livello del foglio di calcolo infatti, non esiste un vero e proprio tipo di dato booleano.
Le funzioni di Calc che restituiscono valori booleani in realtà restituiscono un intero: 0 corrisponde a FALSO e 1 corrisponde a VERO
Esiste poi un formato numerico booleano che mostra il valore 0 come FALSO e qualsiasi altro valore come VERO
Perciò, per una migliore compatibilità con il foglio elettronico è opportuno modificare la funzione come segue:
'__________________________________________________________________________
Function Parity(v As Long) As Integer
Dim c As Long    ' c accumulates the total bits set in v
    While v
        c = c + 1
        v = v And  (v - 1) ' clear the least significant bit set
    Wend
    Parity =  c Mod 2
   
End Function
Paolo Mantovani

martedì 28 settembre 2010

La comunità OpenOffice.org annuncia The Document Foundation

La comunità dei volontari che sviluppano e promuovono OpenOffice.org dà vita a una fondazione indipendente per assicurare il futuro e l'evoluzione del progetto

The Internet, 28 sett 2010 - La comunità dei volontari che sviluppano e promuovono OpenOffice.org, il più importante software libero per la produttività individuale, annuncia una significativa evoluzione del progetto. Dopo dieci anni di evoluzione con Sun Microsystems come fondatore e principale sponsor, il progetto annuncia una fondazione indipendente chiamata "The Document Foundation" con l'obiettivo di dare vita alla promessa di indipendenza del programma originale.

La Fondazione sarà al centro di un nuovo ecosistema in cui individui e organizzazioni potranno allo stesso tempo contribuire e trarre beneficio da una suite di produttività autenticamente libera e indipendente. Questo darà vita a una concorrenza più forte, e a una maggiore scelta, a tutto vantaggio degli utenti e dell'innovazione sul mercato. D'ora in avanti, la comunità dei volontari di OpenOffice.org sarà conosciuta come "The Document Foundation".

Oracle, che ha acquisito la proprietà di OpenOffice.org in seguito all'acquisizione di Sun Microsystems, è stata invitata ad aderire alla nuova Fondazione, e a donare il marchio che la comunità ha fatto crescere nel corso di questi dieci anni di storia del progetto. In caso contrario, la Fondazione ha scelto il marchio "LibreOffice" per le future versioni del software.

The Document Foundation è il risultato dello sforzo collettivo di alcuni tra i membri più attivi all'interno della comunità indipendente OpenOffice.org, tra cui leader di progetto e membri del Community Council. In questo periodo di transizione, verrà guidata da uno Steering Committee composto da sviluppatori e leader dei progetti linguistici nazionali. L'obiettivo della Fondazione è quello di eliminare le barriere all'adozione sia per gli utenti che per gli sviluppatori, e fare di LibreOffice la più accessibile tra le suite di produttività.

La Fondazione coordinerà lo sviluppo di LibreOffice, che è disponibile in versione beta all'indirizzo provvisorio: http://www.libreoffice.org. Gli sviluppatori sono invitati ad aderire al progetto e contribuire al codice in un ambiente aperto e collaborativo, per dare vita al futuro delle suite di produttività insieme a chi traduce, verifica, documenta, supporta e promuove il software.

Parlando a nome del gruppo di volontari, Italo Vignoli - Presidente dell'Associazione PLIO - ha dichiarato: "Riteniamo che la Fondazione sia un passo molto importante per l'evoluzione della suite di produttività libera, perché separa lo sviluppo del codice e il futuro del progetto dagli interessi commerciali di una singola azienda. I sostenitori del software libero, in ogni parte del mondo, hanno la straordinaria opportunità di unirsi al gruppo dei membri fondatori a partire da oggi, per scrivere un nuovo capitolo nella storia del FLOSS".

Richard Stallman, Presidente della Free Software Foundation, ha dato il benvenuto a LibreOffice e alla sua decisione di puntare esclusivamente sul software libero. "Sono felice di sapere che The Document Foundation non raccomanderà l'uso di estensioni non libere, che in questo momento rappresentano il principale problema di OpenOffice.org. Spero che gli sviluppatori di LibreOffice e gli sviluppatori di OpenOffice.org pagati da Oracle riescano a collaborare allo sviluppo del codice sorgente".

"The Document Foundation supporta l'Open Document Format, e intende collaborare con OASIS alla prossima evoluzione dello standard ISO", afferma Charles Schulz, membro del Community Council e coordinatore della Native Language Confederation. "The Document Foundation esprime il punto di vista degli sviluppatori e degli utenti, e questo può accelerare il processo di adozione di ODF tra le istituzioni e le aziende".

Chris DiBona, Open Source Programs Manager di Google, Inc., ha commentato: "La nascita di The Document Foundation è un passo in avanti significativo per gli sviluppi futuri delle suite di produttività. L'eliminazione delle barriere di accesso ai contributi è fondamentale per creare una comunità ampia e attiva intorno a un progetto di software libero. Google è orgogliosa di essere tra i supporter di The Document Foundation e di partecipare al progetto".

"Viva LibreOffice", dice Guy Lunardi, Product Managment Director di Novell. "Siamo impazienti di collaborare con The Document Foundation allo sviluppo di una suite di produttività libera. Speriamo che LibreOffice riesca a fare nel settore dei software per la produttività quello che Mozilla Firefox ha fatto in quello dei browser".

Jan Wildeboer, EMEA Open Source Affairs di Red Hat, ha commentato: "In ogni parte del mondo, gli utenti, le aziende e le istituzioni stanno scegliendo soluzioni software aperte basate su standard aperti. LibreOffice rappresenta l'anello mancante nel mondo dell'ufficio, e noi di Red Hat siamo fieri di far parte di questo progetto".

Mark Shuttleworth, fondatore e azionista di riferimento di Canonical, e ispiratore di Ubuntu, ha dichiarato: "Il software di produttività è un componente indispensabile del desktop libero, e il nostro progetto integrerà LibreOffice di The Document Foundation nelle prossime versioni di Ubuntu. Grazie al patrocinio di The Document Foundation, LibreOffice offre agli sviluppatori di Ubuntu la possibilità di collaborare al codice, e questo permette a Ubuntu di essere una soluzione eccellente per i desktop in ambiente da ufficio".

The Document Foundation: http://www.documentfoundation.org
Elenco dei membri fondatori: http://www.documentfoundation.org/foundation/.
Sezione dedicata agli sviluppatori: http://www.documentfoundation.org/develop/.
Twitter: http://twitter.com/docufoundation - Identi.ca: http://identi.ca/docufoundation.
Mailing list per gli annunci (inglese): announce+subscribe@documentfoundation.org.
Mailing list per le discussioni (inglese): discuss+subscribe@documentfoundation.org.

The Document Foundation

The Document Foundation is an independent self-governing democratic Foundation created by leading members of the former OpenOffice.org Community. It continues to build on the Foundation of ten years' dedicated work by the OpenOffice.org community, and was created in the belief that an independent Foundation is the best fit to the Community's core values of openness, transparency, and valuing people for their contribution. It is open to any individual who agrees with our core values and contributes to our activities, and welcomes corporate participation, e.g. by sponsoring individuals to work as equals alongside other contributors in the community.

Italo Vignoli: italo.vignoli@documentfoundation.org

DICHIARAZIONI

Simon Phipps, OSI

"The Open Source Initiative has observed a trend back towards open collaborative communities for open source software", said Simon Phipps, a Director of the Open Source Initiative. "We welcome The Document Foundation initiative and look forward to the innovation it is able to drive with a truly open community gathered around a free software commons, in the spirit of the best of open source software".

Stormy Peters, GNOME Foundation

"We welcome the LibreOffice project to the free software community as we believe there is a great opportunity for them to enrich the free desktop experience", says Stormy Peters, Executive Director of the GNOME Foundation. "Over the years the GNOME community has been supportive of OpenOffice together with applications in the GNOME Office suite, such as Gnumeric, GnuCash and Abiword. As LibreOffice joins the free software community, we believe that free desktop users will benefit from a rich set of choices".

Patrick Luby ed Ed Peterlin, NeoOffice

Patrick Luby, Chief Engineer of NeoOffice says "I am happy to see a new, independent LibreOffice foundation to continue creating an office suite with enhanced features, pushing OpenOffice.org in new, exciting directions". Ed Peterlin, Chief Visionary at NeoOffice says "I am excited we will be able to continue bringing excellent features from LibreOffice to the Mac platform. In the future I also hope to extend our web based collaboration tools to support LibreOffice users on all platforms".

Chris Hall, Credativ

Chris Halls, UK Managing Director of Credativ, an independent consulting and services company specialising in the development, implementation and support of open source solutions: "Welcomes the foundation as an opportunity to provide a new focus for the community contributors and allow them to move the project forward together. In our business, we support thousands of office desktops in many different environments. It is  vital that the feedback and code that we can contribute as part of our day to day work can flow easily into the project".

Claudio Filho, BrOffice

"The creation of The Document Foundation is in line with the vision BrOffice.org - Projeto Brasil has for the Brazilian OpenOffice.org community. Our country already has a large investment in the Open Document Format and the software tools fully suporting it. BrOffice.org and The Document Foundation share the same values and objectives and we are more than happy to be part of it," says Claudio Filho, Chairman of the BrOffice.org NGO of Brazil.

Norwegian Foundation Åpne Kontorprogram På Norsk (Open Office Suites in Norwegian)

So far the Norwegian project has been administered and financed mainly by counties and municipalities, but recently the foundation has started a process for getting commercial companies more actively involved. We realise the need for a more substantial commercial participation to establish a long-term sustainable project. Our foundation notes that the other Nordic countries, a majority of the European countries, as well as a range of worldwide big companies like Google, Novell, Canonical and Red Hat are now cooperating with The Document Foundation. We believe this is the right way forward also for Norway. A cooperation with The Document Foundation will make it easier to create more innovative and user-friendly solutions integrated with the LibreOffice suite. Eliminating license barriers and obtaining easy access to source code and standards will facilitate further development of related and integrated surrounding products.

venerdì 17 settembre 2010

Celle di Calc

In un precedente post abbiamo visto come fare parecchie cose con le tabelle di Calc. Il passo successivo è riuscire a lavorare con intervalli e celle.
Prima di tutto occorre senza dubbio ottenere il riferimento ad un oggetto tabella, ad esempio la tabella attiva:
oSheet = ThisComponent.CurrentController.ActiveSheet
(qui altri modi per ottenere una tabella)
Le celle sono raggiungibili attraverso le loro coordinate, ovvero gli indici di colonna e riga.
Occorre ricordare che nell'API di OpenOffice.org gli indici cominciano sempre da 0.
La prima cella in alto a sinistra (cella “A1”) avrà pertanto indice di colonna=0 e indice di riga=0 mentre l'ultima cella in basso a destra (cella “AMJ65536” ) avrà indice di colonna=1023 e indice di riga=65535
Per ottenere un riferimento ad una cella occorre utilizzare il seguente metodo API:
oCell = oSheet.getCellByPosition(col, row)
dove col e row sono rispettivamente gli indici di colonna e di riga della cella che si vuole ottenere.
Esempio, per ottenere un riferimento alla cella G4:
oCell = oSheet.getCellByPosition(6, 3)
Una volta ottenuto il riferimento ad un oggetto “cella” possiamo imparare come leggere e scrivere il suo contenuto.
L'accesso ai dati contenuti in una cella è garantito attraverso tre modalità diverse, anzi quattro:
  1. String
  2. Value
  3. Formula
  4. FormulaLocal
Se vogliamo accedere ai dati trattandoli come stringhe di testo useremo la proprietà String:
Leggere:
vData = oCell.String 
Print vData
Scrivere:
oCell.String = "Ciao Mondo"
Se invece vogliamo accedere al contenuto della cella sotto forma di valore numerico useremo la proprietà Value:
Leggere:
vData = oCell.Value 
Print vData
Scrivere:
oCell.Value = "Ciao Mondo"
Allo stesso modo la proprietà Formula ci consente di accedere al contenuto della cella sotto forma di funzione Calc:
N.B. con la proprietà formula i nomi delle funzioni di Calc sono riportati in inglese.
Esempio:
supponiamo che nella cella A1 sia contenuta la seguente funzione =SOMMA(B1:B9)
Eseguendo il codice seguente avremo:
oCell = oSheet.getCellByPosition(0, 0) 'cella A1
vData = oCell.Formula 
Print vData 'stampa: =SUM(B1:B9)
Per ottenere le funzioni con i loro nomi tradotti nella lingua locale di OpenOffice.org occorre usare la variante FormulaLocal
oCell = oSheet.getCellByPosition(0, 0) 'cella A1
vData = oCell.FormulaLocal 
Print vData 'stampa: =SOMMA(B1:B9)
Nel prossimo post vedremo come lavorare con gli intervalli anziché con le singole celle.

venerdì 3 settembre 2010

API - primi passi

OpenOffice.org mette a disposizione un sistema API (Application Programming Interface) che in sostanza è la tecnologia che ci permette di scrivere macro. Più dettagliatamente, si tratta di un'interfaccia di programmazione ovvero di uno “strato” software che ci consente di interagire con OpenOffice.org utilizzando un linguaggio di programmazione opportunamente predisposto.
Per raffigurare la situazione con un esempio pratico possiamo immaginare la nostra TV di casa.
La TV dispone di un certo numero di pulsanti, levette e talvolta manopole disponibili sul fronte dell'apparecchio.
Potremmo definire questo sistema di comandi come l' interfaccia utente del nostro TV mentre il telecomando che ci consente di operare “da remoto” potrebbe essere paragonato all' interfaccia di programmazione (API)
In sostanza possiamo arditamente paragonare l'API di OpenOffice.org ad un telecomando che ci permette di utilizzare le funzionalità della suite “da remoto” ovvero senza mettere mano all'interfaccia utente.
Per completare il quadro però occorre introdurre un terzo elemento, ovvero la logica di controllo.
Nel caso del TV la logica è sempre data dall'elemento umano ovvero da noi stessi che pigiamo materialmente i pulsanti del telecomando.
Nel caso dell'API di OpenOffice.org l'interazione non avviene direttamente con l'utente ma con un programma di controllo o macro.



martedì 31 agosto 2010

Lavorare con le tabelle di Calc

In questo post vedremo come effettuare via macro le operazioni più comuni sulle tabelle di OOo Calc.
Per cominciare occorre ottenere un documento Calc.
Con il codice seguente viene creato un nuovo documento.


    sUrl = "private:factory/scalc" 
    oDoc = StarDesktop.loadComponentFromURL(sUrl,"_default",0, Array())

E' possibile usare lo stesso codice anche per aprire un documento esistente, è sufficiente utilizzare l'URL del documento da aprire al posto di quello usato nell'esempio.
Se si intende lavorare con il documento corrente invece:

    oCalcDocument = StarDesktop.getCurrentComponent()

Oppure, più semplicemente:

    oCalcDocument = ThisComponent

Va detto che le due istruzioni appena illustrate non sono perfettamente equivalenti ma magari dedicherò a questo argomento un post specifico in futuro.
Tornando all'argomento del post, ecco come ottenere l'insieme delle tabelle di un documento Calc:

    oSheets = oCalcDocument.getSheets()

Come recuperare le singole tabelle:

  • Medante indice:

    oCalcSheet = oSheets.getByIndex(0)
    
    ' forma equivalente abbreviata:
    oCalcSheet = oSheets(0)

Come sempre nell'API di OpenOffice.org, l'indice comincia da 0 e rappresenta la posizione della tabella nel documento, pertanto la tabella con indice 0 sarà quella che appare con la linguetta più a sinistra (Tabella1 nella figura)



  • Mediante il nome:
    oCalcSheet = oSheets.getByName("Tabella2")

    ' anche in questo caso esiste una forma equivalente abbreviata:
    oCalcSheet = oSheets("Tabella2")

Rinominare una tabella

    oSheets("Tabella1").Name = "Nuovo nome"

Spostare una tabella:

Il metodo richiede 2 parametri: il nome della tabella da spostare (che deve esistere) e la posizione di destinazione.

    'spostiamola dopo la terza tabella (all'ultima posizione)
    oSheets.moveByName( "Tabella1", 3) 

Aggiungere una tabella:

Il metodo insertNewByName provvede a creare una nuova tabella e inserirla nella posizione specificata. Il metodo prende 2 argomenti: il nome della tabella da creare e la posizione di inserimento.


    oSheets.insertNewByName("Nuova Tabella",3)

Eliminare una tabella:

Questo metodo richiede un solo parametro: il nome della tabella da eliminare.


    oSheets.removeByName("Nuova Tabella") 

Proteggere / sproteggere una tabella:

Il seguente codice imposta la protezione con password sulla tabella “Tabella1”
    oSheets("Tabella1").protect("Password") 
 
Per rimuovere la protezione:

     oSheets("Tabella1").unprotect("Password")

Ecco un modo per controllare se una data tabella è protetta
        If oSheets("Tabella1").IsProtected Then 
        Print "la tabella: " & oCalcSheet.Name & " è protetta!"
        End If

Nascondere/mostrare una tabella:

Occorre ricordare che almeno una tabella deve essere sempre visibile, ovvero non è possibile nascondere tutte le tabelle


    ' nasconde la tabella
    oSheets("Tabella1").IsVisible = False

    ' mostra la tabella
    oSheets("Tabella1").IsVisible = True

Contare le tabelle:

    Print oSheets.getCount()

Enumerare le tabelle:

E' importante ricordare che la prima tabella ha l'indice zero

    For I = 0 to oSheets.Count -1 
        oCalcSheet = oSheets.getByIndex(I)
        print oCalcSheet.Name
    Next I

Usando la scorciatoia del ciclo “For Each” invece non occorre conoscere a priori il numero degli elementi da iterare:

    For Each oCalcSheet In oSheets
        Print oCalcSheet.Name
    Next 

Rendere attiva una tabella:

Occorre prima fare conoscenza con un nuovo oggetto utilissimo, il controller.
Il controller è il servizio che all'interno del documento è responsabile per la gestione dell'interazione con l'utente (ad esempio schermo, tastiera, mouse, la selezione corrente, eccetera)

    oView = oCalcDocument.getCurrentController()
    oCalcSheet = oSheets("Tabella2")
    oView.setActiveSheet(oCalcSheet)

E per quanto riguarda le tabelle di Calc direi che abbiamo visto se non proprio tutto almeno parecchio ;)

--
Paolo

venerdì 27 agosto 2010

OOoCon 2010 (remider!)

Tra pochissimi giorni inizierà l'annuale convegno mondiale di OpenOffice.org: OOoCon 2010.
Quest'anno l'evento avrà luogo avrà luogo a Budapest in Ungheria, dal 31 Agosto al 3 Settembre.
Il PLIO sarà ben rappresentato, infatti tra i relatori figurano:
Italo Vignoli, presidente, con ben tre presentazioni:
    Andrea Pescetti, consigliere e mantainer del progetto linguistico Italiano, con una presentazione sugli strumenti linguistici di OpenOffice.org:
      Per quanto riguarda la programmabilità di OpenOffice.org, macro ed extension, segnalo alcune presentazioni che ritengo molto interessanti:

      Wrap up of the latest Extensions infra structure features 
        di Juergen Schmidt
        Using UNO AWT for creating GUIs in extensions
          di Mihaela Kedikova
          New Extensions in EuroOffice 2010
            di Kazmer Koleszar, Gergely Farkas
            Extension Development for Non-programmers
              di Dmitri Popov
              VBA, can you hack it, yes you can!!
                di Noel Thomas Power, Hui Li



                Bene, concludo con un in bocca al lupo ad Italo e Andrea e buon divertimento a chi ci sarà!!


                a presto
                Paolo

                Scoprire il tipo del documento attivo

                Durante una sessione di lavoro con OpenOffice.org, in un istante qualsiasi può esistere un solo documento attivo che corrisponde al documento contenuto nella finestra di OpenOffice.org che ha il focus in quel dato momento.
                Dato che, a differenza di MS Office, OpenOffice.org è un'applicazione monolitica, il documento attivo può essere di qualunque tipo: un foglio elettronico, un database, un documento di testo e altro ancora.
                Per questo motivo, sviluppando macro, capita abbastanza spesso di avere la necessità di sapere il tipo di documento attivo per poter applicare i metodi appropriati.
                In MS Office esiste un programma eseguibile associato a ciascun tipo di documento, in OpenOffice.org invece esiste un componente specifico associato a ciascun tipo di documento, perciò la questione si riduce a conoscere il componente attivo piuttosto che il documento attivo.
                I componenti sono dei servizi UNOi che hanno particolari caratteristiche. Senza volerci addentrare in dettagli, diciamo solo che i servizi UNO più complessi solitamente mettono a disposizione dei metodi specifici che permettono di identificare il servizio stesso e ottenere informazioni sulle caratteristiche supportate.
                Vediamo ora i metodi più interessanti per il nostro utilizzo:

                Nome Descrizione
                getSupportedServiceNames() Restituisce un array con i nomi di tutti i servizi UNO supportati dall'oggetto, incluso il servizio UNO principale. Questo metodo non prende argomenti
                supportsService( String: ServiceName) Controlla se un particolare servizio è supportato dall'oggetto.
                Il metodo prende in argomento il nome del servizio che si vuole testare e restituisce Vero (True) se il servizio è supportato, Falso (False) se il servizio non è supportato dall'oggetto.

                Vediamo ora come utilizzare quanto osservato fino ad ora per risolvere il problema iniziale, ovvero determinare il tipo di documento attivo.
                Prima di tutto otteniamo un riferimento al documento attivo:

                    oDoc = StarDesktop.getCurrentComponent()
                
                Ora dobbiamo controllare se il componente attivo supporta alcuni servizi specifici che identificano univocamente il tipo di documento.
                Per effettuare il test useremo il metodo supportsService
                Ecco l'elenco dei nomi dei servizi UNO con il tipo di documento associato:

                Servizio UNO Tipo di documento
                com.sun.star.text.TextDocument Documento di testo (Writer)
                com.sun.star.text.WebDocument Documento HTML (Writer)
                com.sun.star.text.GlobalDocument Documento Master (Writer)
                com.sun.star.sheet.SpreadsheetDocument Foglio elettronico (Calc)
                com.sun.star.presentation.PresentationDocument Presentazione (Impress)
                com.sun.star.drawing.DrawingDocument Disegno (Draw)
                com.sun.star.formula.FormularProperties Formula matematica (Math)
                com.sun.star.sdb.OfficeDatabaseDocument Documento database (Base)


                Non rimane altro che scrivere il codice che esegue materialmente il test:

                REM  *****  BASIC  *****
                
                Sub TestDocumentType()
                    oDoc = StarDesktop.getCurrentComponent()
                
                    If oDoc.supportsService("com.sun.star.text.TextDocument") Then
                        MsgBox "Documento di testo OOo Writer"
                    ElseIf oDoc.supportsService("com.sun.star.text.WebDocument") Then
                        MsgBox "Documento HTML di OOo Writer"
                    ElseIf oDoc.supportsService("com.sun.star.text.GlobalDocument") Then
                        MsgBox "Documento Master di OOo Writer"
                    ElseIf oDoc.supportsService("com.sun.star.sheet.SpreadsheetDocument") Then
                        MsgBox "Foglio elettronico di OOo Calc"
                    ElseIf oDoc.supportsService("com.sun.star.drawing.DrawingDocument") Then
                        MsgBox "Disegno di OOo Draw"
                    ElseIf oDoc.supportsService("com.sun.star.presentation.PresentationDocument") Then
                        MsgBox "Presentazione di OOo Impress"
                    ElseIf oDoc.supportsService("com.sun.star.formula.FormulaProperties") Then
                        MsgBox "Formula matematica di OOo Math"
                    ElseIf oDoc.supportsService("com.sun.star.sdb.OfficeDatabaseDocument") Then
                        MsgBox "Documento database di OOo Base"
                    End If
                    
                End Sub
                
                
                Per testare il codice è sufficiente copiarlo in nuovo modulo nella libreria Standard del proprio utente, creare un nuovo documento di qualsiasi tipo, tornare nell ambiente di sviluppo (IDE) di StarBasic e lanciare la macro mediante l'apposito pulanste della barra degli strumenti oppure mediante il tasto
                Per un uso più generalizzato sarebbe opportuno trasformare la routine dell'esempio in una funzione.
                Effettivamente esiste già una funzione simile nella libreria Tools, modulo Misc:


                Si tratta della funzione GetDocumentType().
                Ecco come utilizzarla:

                REM  *****  BASIC  *****
                
                Sub TestToolsFunction()
                
                    oDoc = StarDesktop.getCurrentComponent()
                    
                    'prima di utilizzar el efunzioi della libreria 
                    'condivisa Tools occorre caricarla:
                    BasicLibraries.loadLibrary.Tools
                    
                    'ora è possibile  richiamare la funzione
                    sDocType = GetDocumentType(oDoc)
                    MsgBox sDocType
                    
                End Sub
                 
                La funzione inclusa nella libreria Tools purtroppo non è molto aggiornata e non è in grado di riconoscere i documenti OOo Base, i documenti HTML e i documenti Master
                Alla luce di quanto illustrato fino ad ora dovrebbe essere piuttosto facile modificare la funzione della libreria Tools aggiungendo i tipi di documento mancanti.

                A presto
                Paolo