2017-09-06 115 views
1

我开发OpenOffice的Calc的“宏”。作为语言,我选择了Java,以便在Eclipse中获得代码帮助。我甚至写了一个小的ant构建脚本,它编译和嵌入*.ods文件中的“宏”。一般来说,这工作得很好,并且令人惊讶地快;我已经很成功地使用了一些简单的东西。如何知道Java接口OpenOffice的Calc的UNO对象支持(通过的QueryInterface)

所以我常常会被卡住,因为与UNO,我需要“查询”对于任何给定的不平凡的对象的接口,以便能够访问该对象的数据/呼叫的方法。也就是说,我需要猜测给定对象可能提供的接口。这是根本明显的,而不是Java开发(通过某种元信息,反射等)过程中偶可见,也稀疏文件(我下载吨的东西,但我不找到源头或也许JavaDoc为我使用的接口,如XButtonXPropertySet等 - XButtonsetLabel,但是不是getLabel - 什么??)。

有一些在线文档(对于最基本的概念来说,它根本不坏!),但是它缺少我面对的许多细节。它总是神奇地停在我需要解决的地步。

我愿意查看C++代码,以获得有关接口对象(例如,我目前卡住的按钮/事件)可能提供的线索。令人困惑的是,C++类和文件名不完全匹配Java接口。它的差不多我在找什么,但后来在Java中,我并没有真的找到相应的,在给定的对象上调用queryInterface返回null ..它变得有点令人沮丧。

如何在UNO Java接口产生的?代码中是否存在某种类型的文档,作为生成的(Java)代码的来源?

我想我真的需要知道哪些接口可用此时,为了成为更流畅一点Java的UNO-宏观开发过程中。

回答

0

对于任何严肃的UNO项目,使用的内省工具。

作为一个例子,我在Calc中创建了一个按钮,然后使用的Java Object Inspector浏览到该按钮。 右键单击并选择“添加到源代码”生成以下内容。

import com.sun.star.awt.XControlModel; 
import com.sun.star.beans.XPropertySet; 
import com.sun.star.container.XIndexAccess; 
import com.sun.star.container.XNameAccess; 
import com.sun.star.drawing.XControlShape; 
import com.sun.star.drawing.XDrawPage; 
import com.sun.star.drawing.XDrawPageSupplier; 
import com.sun.star.sheet.XSpreadsheetDocument; 
import com.sun.star.sheet.XSpreadsheets; 
import com.sun.star.uno.AnyConverter; 
import com.sun.star.uno.UnoRuntime; 
import com.sun.star.uno.XInterface; 

//... 
public void codesnippet(XInterface _oUnoEntryObject){ 
try{ 
    XSpreadsheetDocument xSpreadsheetDocument = (XSpreadsheetDocument) UnoRuntime.queryInterface(XSpreadsheetDocument.class, _oUnoEntryObject); 
    XSpreadsheets xSpreadsheets = xSpreadsheetDocument.getSheets(); 
    XNameAccess xNameAccess = (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class, xSpreadsheets); 
    Object oName = xNameAccess.getByName("Sheet1"); 
    XDrawPageSupplier xDrawPageSupplier = (XDrawPageSupplier) UnoRuntime.queryInterface(XDrawPageSupplier.class, oName); 
    XDrawPage xDrawPage = xDrawPageSupplier.getDrawPage(); 
    XIndexAccess xIndexAccess = (XIndexAccess) UnoRuntime.queryInterface(XIndexAccess.class, xDrawPage); 
    Object oIndex = xIndexAccess.getByIndex(0); 
    XControlShape xControlShape = (XControlShape) UnoRuntime.queryInterface(XControlShape.class, oIndex); 
    XControlModel xControlModel = xControlShape.getControl(); 
    XPropertySet xPropertySet = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xControlModel); 
    String sLabel = AnyConverter.toString(xPropertySet.getPropertyValue("Label")); 
}catch (com.sun.star.beans.UnknownPropertyException e){ 
    e.printStackTrace(System.out); 
    //Enter your Code here... 
}catch (com.sun.star.lang.WrappedTargetException e2){ 
    e2.printStackTrace(System.out); 
    //Enter your Code here... 
}catch (com.sun.star.lang.IllegalArgumentException e3){ 
    e3.printStackTrace(System.out); 
    //Enter your Code here... 
} 
} 
//... 

Python-UNO可能比Java更好,因为它不需要查询特定的接口。 XrayTool和MRI也比Java Object Inspector更容易使用。

+0

这是伟大的!非常感谢。 Python的提示也很好,我已经怀疑非Java/-C++方法,以便于访问。谢谢! – SomeDev

相关问题