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 MasterAlla 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
i La piattaforma UNO (Universal Network Objects) è la tecnologia sulla quale si basa l'interfaccia di programmazione di OpenOffice.org. Nella piattaforma UNO il concetto di “servizio” equivale al concetto di “oggetto” che possiamo trovare in altri ambienti/linguaggi come ad esempio Visual Basic
Nessun commento:
Posta un commento