Как получить открытый документ с помощью UNO?
Я пишу надстройку, которая открывает диалоговое окно, и мне нужно получить доступ к текущему открытому текстовому документу, но я не знаю, как его получить.
Я использую плагин OpenOffice в NetBeans и начал с проекта надстройки. Он создал класс, который дает мне экземпляр XComponentContext, но я не знаю, как его использовать, чтобы получить экземпляр OfficeDocument текущего документа.
Я уже некоторое время гуглю и не могу найти ни одного примера, который бы использовал существующий открытый документ. Все они начинаются с нового документа или документа, который загружается первым, поэтому у них есть URL для него.
Я дал ему попробовать на основе OpenOffice вики (https://wiki.openoffice.org/wiki/API/Samples/Java/Office/DocumentHandling) и вот что я придумала:
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;
}
Но происходит нечто странное. Просто имея этот метод в моем классе,даже если он никогда нигде не вызывался, вызывает ошибку при добавлении дополнения.
(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 }}}}
Кажется, эта строка вызывает ошибку:
XMultiComponentFactory xMultiComponentFactory = this.xComponentContext.getServiceManager();
Я понятия не имею, как это сделать.
Я разместил этот вопрос наФорум OpenOffice но у меня нет ответа там. Я сейчас пытаюсь везти.