使用新的 OpenOffice.org 插件模塊創建、構建、部署和調試 OpenOffice.org/StarOffice 擴展和客戶端應用程序
使用 Office 套件的 API 能進行的常見任務有:自動完成辦公任務、實現基於文檔的工作流、構建公司解決方案。擁有數百萬用戶的 OpenOffice.org 與擁有龐大社區的 Java 有許多相似之處,例如,二者都是多平臺和開放源碼。但卻缺少能將二者組合到一起的工具。這就是用於 NetBeans 的新 OpenOffice.org 插件模塊得以出現的原因。
在本文中,我們將向您演示如何使用新模塊構建能夠擴展 OpenOffice.org 一般功能的 Java 組件;我們還要創建新的 Calc 功能以及能夠訪問 OOo 特性的客戶端應用程序。(本文中並沒有明確提到 StarOffice,但這裏演示的所有內容同樣適用於 StarOffice。)
概述
用於 NetBeans 的 OpenOffice.org 插件模塊提供了四個嚮導,您可以通過這四個嚮導創建一般的附件、Calc 加載項、組件和客戶端應用程序:
l 附件的使用範圍很廣,它並不僅限於某個文檔類型。它還可以實現自己的工具欄和菜單。附件通常用於實現可由用戶直接訪問的新功能。
l Calc 加載項實現針對電子表格文檔中 Function Autopilot 的新 Calc 功能。Calc 功能需要的屬性集合與一般的 Add-On 嚮導所包含的屬性集合不同 – 比如功能參數定義。
l 組件可用於擴展 OpenOffice.org API 而且能夠通過腳本語言進行訪問。組件還可以擴展 OOo 的圖表功能。
l 最後,外部客戶端應用程序可使用 OpenOffice.org 的功能創建、轉換、打印或操縱數據。因此,OpenOffice.org 可在較大的解決方案中用作強大的呈現和打印引擎。
新嚮導使用所有必要的配置創建 NetBeans 項目,例如:指向 OpenOffice.org Java 庫的鏈接。它們還在其他操作中定義構建目標、執行遠程調試安裝和生成 Java 代碼框架。
要求、安裝和配置
要使用 NetBeans OOo 插件模塊,您需要有 NetBeans 5.5 或更新的版本、OpenOffice.org 2.0.4 或 StarOffice 8 PU4、還需要 OpenOffice.org SDK 2.0.4 或更新的版本。
通用 NetBeans 模塊中提供的嚮導可以通過 Update Center 安裝或更新。只需下載文件 api.openoffice.org/Projects/NetBeansIntegration/
org-openoffice-extensions.nbm,然後使用 Run>Update Center>Install Manually Downloaded Modules (.nbm Files)1 即可安裝成功。
設置十分簡單。只有兩個可用的配置項目:OpenOffice.org 安裝路徑和 SDK 路徑。您可以在安裝過程中訪問它們,也可以通過 Tools>Options>Miscellaneous 對話框訪問它們。
1 您閱讀到此信息時,可能會在 Update Center 中顯示模塊,您不必要進行手動下載。
創建 OOo 擴展
所有的四種擴展類型都打包爲 OOo 包。這種包的格式是在 OpenOffice.org 2.0.4 中引入的,它使用文件擴展名 .OXT。相應的 MIME 類型是在 OpenOffice.org 中註冊的,這使用戶只需雙擊即可安裝擴展。
附件
File>New Project 對話框提供了一個新的 OpenOffice.org 類別,它可打開 Add-On 嚮導。啓動向導,然後爲項目名稱和附件名稱均輸入“myAddOn”。將 Java 包設置爲“org.openoffice”;提供項目文件夾,然後選中 Create Menu 和 Create Toolbar 複選框。
單擊 Next,您將可以指定附件命令。可在工具欄上爲每個命令分配一個圖標。理想情況下,您應當提供四個不同的圖標(兩種對比度級別中的兩種不同大小),但也可以對所有圖標類型使用同一個圖像。如果執行了此操作,則 OpenOffice.org 將相應地縮放圖像。
您還需要輸入命令的顯示名稱。此名稱用於菜單和工具欄,它可以與命令名稱不同。注意,只有顯示名稱可以翻譯:嚮導允許您定義不同的語言環境,但對於所有的語言環境,命令名都是相同的。
在下一步中,您可以定義菜單結構。這一步爲可選步驟,因爲並非所有附件都有自己的菜單。
下一步也是可選步驟:定義用於調用附件命令的工具欄。工具欄預覽中的圖標看起來應當很熟悉,因爲它們是在步驟 3 中指定的。將名稱設置爲“myAddOn”,定義圖標並設置類別。
單擊 Finish 後,嚮導將創建兩個配置文件和一個 Java 類框架。AddOns.xcu 配置文件包括附件的參數,而 ProtocolHandler.xcu 則定義協議處理器的配置。協議處理器是 OpenOffice.org 分派框架的一部分;它們將用戶界面控件(例如:菜單或工具欄項目)綁定到 OpenOffice.org 的功能上。可通過用戶界面實現的所有功能都由命令 URL 和相應的參數進行描述。
ProtocolHandler.xcu 文件的結構將爲附件定義一個名稱空間(我們的例子中是org.openoffice.myaddon)。由同一個附件定義的所有命令都將使用此名稱空間。
Java 代碼框架看起來十分複雜,但實際上並非如此。大多數方法僅對於 OpenOffice.org 的內部實現是必需的,而且不需要進行任何更改。
OpenOffice.org 每次調用 dispatch() 方法時,協議處理器都將路由命令。列表 2 顯示全面實現的 dispatch() 方法,它將“Hello World”消息添加到當前文檔中。注意,只有顯示爲粗體的行是新的;其餘的都是框架的一部分。代碼基本上確定了當前的文檔,然後向文檔中添加文本。另請注意,aURL 參數使用 OpenOffice.org 指定 com.sun.star.util.URL 類而不是 java.net.URL 類。
列表2:Dispatch() 方法示例。 |
|
因爲由用戶界面激活的所有命令都通過 dispatch() 方法傳遞,因此,有必要對名稱空間 org.openoffice.myaddon 進行顯式過濾,該名稱空間表示我們附件的命令。最後,myAddOn 是在用戶通過工具欄或菜單調用附件時被激活的命令。
現在,我們的附件已經準備好了,可以對其進行部署。右鍵單擊項目名稱並從上下文菜單中選擇 Deploy Office Extension。NetBeans 將編譯所有必要的文件,創建一個 OpenOffice.org 擴展包文件,然後部署它。根據附件的設置,OpenOffice.org 中可能會出現在一個新的頂層菜單和/或工具欄。在我們的示例中,二者都應當顯示
部署更復雜的附件可能需要大量的調試會話。但是,當附件在 OpenOffice.org 的 JVM 中運行時,NetBeans 的內置調試器將不會運行。我們需要進行遠程調試。
OOo 插件模塊將命令添加到項目的上下文菜單,用於啓動一個遠程調試會話,這意味着不需要對客戶端 JVM 進行手動設置或遠程調試器。要使用此功能,請在 dispatch() 方法內設置端點,然後調用 Debug Extension in Target Office,OpenOffice.org 實例將自動啓動。從附件的菜單中選擇 My Command,調試器將在斷點處停止。
Calc 加載項
現在,我們來了解一下如何創建 Calc 加載項擴展,它可以實現 OpenOffice.org Calc 功能。這些功能與 Calc 應用程序緊密集成,因此用戶將不會識別出標準功能和加載項提供的功能之間的區別;沒有新菜單、工具欄或其他擴展跡象。
Calc Add-In 嚮導也位於 File>New Project 對話框的 StarOffice/OpenOffice.org 類別中。啓動向導並輸入 NetBeans 項目的名稱和位置。我們對兩個名稱都使用“myAddIn”,並再次將“org.openoffice”作爲包的名稱;並確保 Create backward compatible Calc Add-In 未被選中。單擊 Next 輸入Calc 功能的名稱和參數。
Calc 加載項功能的定義需要指定下列參數:
實現 Calc 功能的 Java 方法的名稱。
新功能結果的數據類型。
出現錯誤時,Java 實現拋出的異常。其他對話提供對所有可用異常的訪問。(此屬性是可選的。)
Calc 的 Function Wizard 中列出的功能的類別。
功能的顯示名。它可以不同於相應的 Java 方法的名稱。
有一些額外的參數,它們都是可本地化的。Calc 功能通常被本地化,每種語言有不同的名稱;例如,功能 Sum() 是在英語 Calc 中的稱呼,它在德語 Calc 版本中稱爲 Summe()。
Description 參數指示功能的目的,並顯示在 Calc 的 Function Wizard 中。Compatibility Name 對處理 Microsoft Excel 集成是必要的;而在其他時候是可選且通常是不必要的。最後,我們還有一些 Calc 功能的可選參數。它們需要數據類型規範、實現名稱、顯示名稱和描述。
爲了創建我們的簡單 Calc 加載項,我們將 Name 設置爲“doubleValueImpl”;將 Type 設置爲 double;將 Exceptions 部分保留爲空;將 Category 設置爲“Add-In”、Displayed Name 設置爲“doubleValue”。將 Displayed Description 更改爲“Simple Calc Add-In:Doubles the given value”,並將 Compatibility Name 設置爲“doubleValue”。然後,爲第一個參數設置下列值:
n Name – “doubleValue”
n Type – double
n Displayed Name – “Value”
n Displayed Description – “Value to be doubled”
單擊 Finish,將創建幾個與加載項有關的文件。最重要的文件是加載項實現的 Java 類。還有配置文件 CalcAddin.xcu,它用於保存加載項的參數。加載項導出的功能需要在新界面中定義。此界面中的功能名以及加載項的服務名在內部用於標識加載項功能。myAdd-In.idl 和 XmyAddIn.idl 文件定義此服務和界面。它們由在 OpenOffice.org SDK 中可用的工具和編譯器使用,它構建 Java 源和頁眉文件;但此過程被 OOo 插件模塊隱藏。
大部分初始框架代碼不需要進行更改。我們的 doubleValueImpl() 方法由加載項調用,並提供其功能的實現。實現實際上很簡單;它只是將用戶給出的所有值加倍:
public double doubleValueImpl(double doubleValue) {
return doubleValue * 2;
}
NetBeans 將會提示:XmyAddIn 界面不存在,它到目前爲止是這樣的。原因是界面是在 UNO IDL(界面定義語言)文件中定義的而不是作爲 Java 類定義的。當編譯項目時,插件將根據此 IDL 文件以及其他與加載項有關的服務和界面自動創建 Java 代碼。
UNO(通用網絡對象)是 OpenOffice.org 的組件技術。
大功告成!Calc 加載項已將全面實現,可以用於部署了。部署工作可以通過項目的上下文菜單輕鬆完成:選擇 Deploy Office Extension。NetBeans 將編譯所有與項目有關的文件,構建一個 OXT 擴展包,並將它安裝在 OpenOffice.org 中。
您可以通過啓動 Calc 實例並創建一個新的電子表格文檔來測試新的加載項。然後調用 Calc 的 Function 嚮導,在嚮導中您將看到新功能列在 Add-In 類別下面。爲了驗證我們的新功能是否正常運行,我們在任意單元中輸入公式“=doublevalue(3)”。正如我們所預期的那樣,Calc 生成的結果爲 6。
客戶端應用程序
客戶端應用程序是外部解決方案,通過它可以使用而不是擴展 OpenOffice.org 功能。它可以使用 OOo 轉換或處理 Office 套件所支持的任何文檔。
Client Application 嚮導也可以在 OpenOffice.org New Project 類別中使用。您只需要啓動向導並輸入 NetBeans 項目的名稱和位置;不需要進行進一步的設置。單擊 Finish,嚮導將創建 Java 框架。
由於客戶端應用程序不是 OpenOffice.org 的一個集成部分,所以大多數配置和 IDL 文件是不必要的。NetBeans 項目僅包含一個 Java 類和 OpenOffice.org Java 庫的類路徑設置。
您會注意到,與加載項框架和附件框架相比,客戶端應用程序的代碼框架非常小。它與一般的 Java Class 嚮導所生成的 Java 類代碼沒有本質的區別。main() 方法的實現包含一行代碼(以及一個異常處理):
XComponentContext xContext = Bootstrap.bootstrap();
生成的類作爲 OpenOffice.org 過程的一個客戶端運行,OpenOffice.org 使用其自己的組件上下文作爲一個服務器運行。客戶端程序初始化通用網絡對象技術(UNO),並從 OOo 過程獲取組件上下文。該初始化過程將建立一個到正在運行的 OpenOffice.org 過程的管道連接(如有必要,將啓動一個新流程)並返回遠程組件上下文。
組件上下文中的 getServiceManager() 方法從 service manager from the OpenOffice.org 過程獲取遠程服務管理器,它允許通過 API 訪問完整的可用Office 功能。
XMultiComponentFactory xMCF =
xContext.getServiceManager();
得到服務管理器之後,我們可以獲取 OpenOffice.org Desktop,它將處理應用程序窗口並允許您加載和創建文檔。com.sun.star.frame.Desktop 服務表示此 Desktop:
XDesktop xDesktop = (XDesktop) UnoRuntime.queryInterface(
XDesktop.class, xMCF.createInstanceWithContext(“com.sun.star.frame.Desktop”,xContext));
現在,我們有一個不帶文檔的 Desktop 實例,但要顯示我們的問候,輸入文本文檔是必要的。XComponentLoader 界面導出 loadComponentFromURL() 方法,以加載和創建文檔。在列表3中觀察其應用。private:factory/swriter URL 創建一個新的文本文檔。
列表 3:創建文本文檔。 |
PropertyValue xEmptyArgs[] = new PropertyValue[0]; XComponent xComponent = XTextDocument xTextDocument = |
新文檔將顯示一個等待輸入的光標。此輸入必須來自於客戶端應用程序。OOo API 使用文本光標抽象將文本添加到文檔,用 XTextCursor 界面代表:
XText xText = xTextDocument.getText();
XTextCursor xTextCursor = (XTextCursor) xText.createTextCursor();
文檔中閃爍的光標和 xTextCursor是相互獨立的。Open- Office.org Writer 使用 MVC 將內容/模型從視圖中分離。文本光標是在此上下文中的視圖,而由 createTextCursor() 創建的光標是模型。您可以爲文本光標創建多個模型。
最後,方法 insertString() 將消息添加到文檔:
xText.insertString( xTextCursor, “Hello World”, false );
組件
OpenOffice.org 可以通過 Components 進行擴展。這些是共享庫或 JAR 文件,可以實例化能夠將其本身集成到 UNO 環境的對象。組件可以訪問現有的 OpenOffice.org 功能,並通過 UNO 提供的對象通信機制從 office 套件使用。實際上,前面介紹的附件和加載項只不過是專用的 UNO 組件。
Component 嚮導創建的組件不需要訪問菜單或工具欄,也不需要擴展 Calc 功能庫。它們可用於實現新界面和服務。這種靈活性和能力使其不僅僅能創建簡單的“Hello”組件,不過,創建全面運行的組件不在本文的討論範圍之內。許多介紹新 OpenOffice.org 界面和服務創建過程的文章和文檔都可供我們參考。特別值得一提的是,您可以參考《OpenOffice.org 開發者指南》第四章,它是一個好的示例源。
小結
過去,編寫要與 OpenOffice.org 集成的組件需要許多 NetBeans 基礎架構,學習曲線陡峭。每項內容分別被記錄到不同的某個位置,而將這些信息集中到一起將需要大量的工作。使用我們本文中介紹的新 OpenOffice.org 插件模塊將可以使這種狀況得到改變。該模塊非常注意集成方面的繁瑣細節工作,使開發者可以將精力集中到他們的擴展的實現方面。此外,模塊的遠程調試功能使其能夠更簡單快捷地調試基於 OpenOffice.org 的應用程序。如果您需要與 OpenOffice.org 或 StarOffice 集成,不妨一試!
插件的下一個版本會將 Java 與 OpenOffice.org 腳本框架更加緊密地集成到一起,並允許您將 Java 用於典型的與腳本相關的任務,將集成腳本語言的好處與 NetBeans 和 Java 技術的功能組合到一起。
原文地址:
http://www.netbeans.org/community/magazine/html/03/openoffice/