我正在编写一个打开对话框的附加组件,我需要访问当前打开的文本文档,但我不知道如何获取它。
我在NetBeans中使用OpenOffice插件,我从一个Add-on项目开始。它创建了一个类,它给了我一个XComponentContext实例,但我不知道如何使用它来获取当前文档的OfficeDocument实例。
我已经谷歌搜索了一段时间,我无法找到任何使用现有的已打开文档的示例。它们都是从一个新文档或首先加载的文档开始的,因此它们有一个URL。
我根据OpenOffice wiki(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 forum上发布了这个问题,但我还没有得到回应。我现在在这里试试运气。
答案 0 :(得分:1)
在您的代码中使用它来获取当前文档:
import com.sun.star.frame.XDesktop;
...
XDesktop xDesktop = (XDesktop) UnoRuntime.queryInterface(XDesktop.class, oDesktop);
XComponent xComponent = xDesktop.getCurrentComponent();
我在NetBeans中打开了the BookmarkInsertion sample并添加了此代码以使用当前文档而不是加载新文档。
就错误而言,可能存在如何构建错误的问题。要检查的几件事情:
如果您对尝试正确设置构建感到沮丧,那么您可能会发现使用python更容易,因为它不需要编译。 python也不需要queryInterface()。