¿Cómo obtener el documento abierto usando UNO?
Estoy escribiendo un complemento que abre un cuadro de diálogo y necesito acceder al documento de texto abierto actualmente, pero no sé cómo obtenerlo.
Estoy usando el complemento OpenOffice en NetBeans y comencé desde un proyecto de complemento. Creó una clase que me da una instancia de XComponentContext pero no sé cómo usarla para obtener una instancia de OfficeDocument del documento actual.
He estado buscando en Google durante algún tiempo y no puedo encontrar ningún ejemplo que use un documento abierto existente. Todos comienzan desde un nuevo documento o un documento que se carga primero para que tengan una URL para él.
Lo probé basado en el wiki de OpenOffice (https://wiki.openoffice.org/wiki/API/Samples/Java/Office/DocumentHandling) y esto es lo que se me ocurrió:
private OfficeDocument getDocument() {
if (this.officeDocument == null) {
try {
// this causes the error
XMultiComponentFactory xMultiComponentFactory = this.xComponentContext.getServiceManager();
Object oDesktop = xMultiComponentFactory.createInstanceWithContext("com.sun.star.frame.Desktop", this.xComponentContext);
XComponentLoader xComponentLoader = UnoRuntime.queryInterface(XComponentLoader.class, oDesktop);
String url = "private:factory/swriter";
String targetFrameName = "_self";
int searchFlags = FrameSearchFlag.SELF;
PropertyValue[] propertyValues = new PropertyValue[1];
propertyValues[0] = new PropertyValue();
propertyValues[0].Name = "Hidden";
propertyValues[0].Value = Boolean.TRUE;
XComponent xComponent = xComponentLoader.loadComponentFromURL(url, targetFrameName, searchFlags, propertyValues);
XModel xModel = UnoRuntime.queryInterface(XModel.class, xComponent);
this.officeDocument = new OfficeDocument(xModel);
} catch (com.sun.star.uno.Exception ex) {
throw new RuntimeException(ex);
}
}
return this.officeDocument;
}
Pero hay algo extraño sucediendo. Solo teniendo este método en mi clase,incluso si nunca se ha llamado a ninguna parte, provoca un error al agregar el complemento.
(com.sun.star.depoyment.DeploymentDescription){{ Message = "Error during activation of: VaphAddOn.jar", Context = (com.sun.star.uno.XInterface) @6ce03e0 }, Cause = (any) {(com.sun.star.registry.CannotRegisterImplementationException){{ Message = "", Context = (com.sun.star.uno.XInterface) @0 }}}}
Parece que esta línea causa el error:
XMultiComponentFactory xMultiComponentFactory = this.xComponentContext.getServiceManager();
No tengo idea de cómo preceder.
Publiqué esta pregunta en elForo OpenOffice Pero no tengo una respuesta allí. Estoy probando suerte aquí ahora.