[Risolto] addon con java in netbeans rif al documento attivo

Discussioni sull'uso di estensioni esterne con OpenOffice
Rispondi
johnrdorazio
Messaggi: 3
Iscritto il: domenica 21 settembre 2014, 0:16

[Risolto] addon con java in netbeans rif al documento attivo

Messaggio da johnrdorazio »

Ho scaricato l'SDK e ho installato il plugin per Netbeans 8.0.
Ho creato un progetto di tipo "Add-on di Apache OpenOffice", con delle voci di menu contestualizzate in Writer.
Ora vorrei sapere come avere un riferimento al Documento Attivo dalla classe dell'add-on.
Sarebbe utile avere un esempio di codice per questo, è impossibile trovare esempi in giro per le nuove API!

Nel metodo "dispatch" che viene creato in automatico, posso intercettare i click sulle voci di menu, ma poi non so come avere un riferimento al documento attivo.

Trovo qualche esempio che usa XScriptContext, ma la mia impressione è che il nuovo SDK / API non utilizza XSCriptContext ma XComponentContext...

Dagli esempi che ho visto, credo che bisogna interrogare UnoRuntime.queryInterface(), ma non so farlo con XComponentContext.

Riporto il codice che viene creato in automatico dal Wizard per gli Add-in, e dove c'è il commento "//Ora come avere un riferimento al documento attivo?" vorrei iniziare ad interagire con il documento attivo (inserire paragrafi, inserire testo, ecc.):

Codice: Seleziona tutto

package com.example;

import com.sun.star.lang.XSingleComponentFactory;
import com.sun.star.lib.uno.helper.Factory;
import com.sun.star.lib.uno.helper.WeakBase;
import com.sun.star.registry.XRegistryKey;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;

public final class BibleGetIO extends WeakBase
        implements com.sun.star.frame.XDispatchProvider,
        com.sun.star.frame.XDispatch,
        com.sun.star.lang.XServiceInfo,
        com.sun.star.lang.XInitialization {

    private final XComponentContext m_xContext;
    private com.sun.star.frame.XFrame m_xFrame;
    private static final String m_implementationName = BibleGetIO.class.getName();
    private static final String[] m_serviceNames = {"com.sun.star.frame.ProtocolHandler"};

    public BibleGetIO(XComponentContext context) {
        m_xContext = context;
    };

    public static XSingleComponentFactory __getComponentFactory(String sImplementationName) {
        XSingleComponentFactory xFactory = null;

        if (sImplementationName.equals(m_implementationName)) {
            xFactory = Factory.createComponentFactory(BibleGetIO.class, m_serviceNames);
        }
        return xFactory;
    }

    public static boolean __writeRegistryServiceInfo(XRegistryKey xRegistryKey) {
        return Factory.writeRegistryServiceInfo(m_implementationName,
                m_serviceNames,
                xRegistryKey);
    }

    // com.sun.star.frame.XDispatchProvider:
    public com.sun.star.frame.XDispatch queryDispatch(com.sun.star.util.URL aURL,
            String sTargetFrameName,
            int iSearchFlags) {
        if (aURL.Protocol.compareTo("com.example.biblegetio:") == 0) {
            if (aURL.Path.compareTo("CitazioneDaInput") == 0) {
                return this;
            }
        }
        return null;
    }

    // com.sun.star.frame.XDispatchProvider:
    public com.sun.star.frame.XDispatch[] queryDispatches(
            com.sun.star.frame.DispatchDescriptor[] seqDescriptors) {
        int nCount = seqDescriptors.length;
        com.sun.star.frame.XDispatch[] seqDispatcher
                = new com.sun.star.frame.XDispatch[seqDescriptors.length];

        for (int i = 0; i < nCount; ++i) {
            seqDispatcher[i] = queryDispatch(seqDescriptors[i].FeatureURL,
                    seqDescriptors[i].FrameName,
                    seqDescriptors[i].SearchFlags);
        }
        return seqDispatcher;
    }

   public void dispatch(com.sun.star.util.URL aURL,
            com.sun.star.beans.PropertyValue[] aArguments) {
        if (aURL.Protocol.compareTo("de.bibleget.biblegetio:") == 0) {
            if (aURL.Path.compareTo("CitazioneDaInput") == 0) {
                // add your own code here
                System.out.println("Hai cliccato sulla voce di menu CitazioneDaInput");

                //Ora come avere un riferimento al documento attivo?

                return;
            }
         }
    }

    public void addStatusListener(com.sun.star.frame.XStatusListener xControl,
            com.sun.star.util.URL aURL) {
        // add your own code here
    }

    public void removeStatusListener(com.sun.star.frame.XStatusListener xControl,
            com.sun.star.util.URL aURL) {
        // add your own code here
    }

    // com.sun.star.lang.XServiceInfo:
    public String getImplementationName() {
        return m_implementationName;
    }

    public boolean supportsService(String sService) {
        int len = m_serviceNames.length;

        for (int i = 0; i < len; i++) {
            if (sService.equals(m_serviceNames[i])) {
                return true;
            }
        }
        return false;
    }

    public String[] getSupportedServiceNames() {
        return m_serviceNames;
    }

    // com.sun.star.lang.XInitialization:
    public void initialize(Object[] object)
            throws com.sun.star.uno.Exception {
        if (object.length > 0) {
            m_xFrame = (com.sun.star.frame.XFrame) UnoRuntime.queryInterface(
                    com.sun.star.frame.XFrame.class, object[0]);
        }
    }

}
Ultima modifica di johnrdorazio il domenica 21 settembre 2014, 12:41, modificato 2 volte in totale.
OpenOffice 4.1.1 su Windows 7 x64
johnrdorazio
Messaggi: 3
Iscritto il: domenica 21 settembre 2014, 0:16

Re: addon con java in netbeans

Messaggio da johnrdorazio »

Ho ricevuto la soluzione dall'utente Hanya nel forum inglese qui: https://forum.openoffice.org/en/forum/v ... 47&t=72459.

Nel metodo di inizializzazione posso fare così (avendo già dichiarato le variabili m_xModel e m_xTextDocument all'inizio della classe):

Codice: Seleziona tutto

    // com.sun.star.lang.XInitialization:
    public void initialize(Object[] object)
            throws com.sun.star.uno.Exception {
        if (object.length > 0) {
            m_xFrame = (com.sun.star.frame.XFrame) UnoRuntime.queryInterface(
                    com.sun.star.frame.XFrame.class, object[0]);
            com.sun.star.frame.XController xController = m_xFrame.getController();
            if (xController != null) {
                m_xModel = (com.sun.star.frame.XModel) xController.getModel();
                m_xTextDocument = (com.sun.star.text.XTextDocument) UnoRuntime.queryInterface(XTextDocument.class,m_xModel);
            }
        }
    }
OpenOffice 4.1.1 su Windows 7 x64
Rispondi