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]);
}
}
}