venerdì 27 agosto 2010

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







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: