2017-09-06 117 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

相關問題