OpenOffice.org NetBeans集成

使用新的 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 類。

列表2Dispatch() 方法示例。


public void dispatch( URL aURL, PropertyValue[] aArguments )
{
if ( aURL.Protocol.compareTo(“org.openoffice.myaddon:”)== 0 ) {
if ( aURL.Path.compareTo(“myAddOn”) == 0 ) {
XTextDocument xDoc = (XTextDocument) UnoRuntime.queryInterface(
XTextDocument.class, m_xFrame.getController().getModel());
xDoc.getText().setString(“Hello World”);
return;
}
}
}

 

 

因爲由用戶界面激活的所有命令都通過 dispatch() 方法傳遞,因此,有必要對名稱空間 org.openoffice.myaddon 進行顯式過濾,該名稱空間表示我們附件的命令。最後,myAddOn 是在用戶通過工具欄或菜單調用附件時被激活的命令。

現在,我們的附件已經準備好了,可以對其進行部署。右鍵單擊項目名稱並從上下文菜單中選擇 Deploy Office ExtensionNetBeans 將編譯所有必要的文件,創建一個 OpenOffice.org 擴展包文件,然後部署它。根據附件的設置,OpenOffice.org 中可能會出現在一個新的頂層菜單和/或工具欄。在我們的示例中,二者都應當顯示

 

部署更復雜的附件可能需要大量的調試會話。但是,當附件在 OpenOffice.org 的 JVM 中運行時,NetBeans 的內置調試器將不會運行。我們需要進行遠程調試。

OOo 插件模塊將命令添加到項目的上下文菜單,用於啓動一個遠程調試會話,這意味着不需要對客戶端 JVM 進行手動設置或遠程調試器。要使用此功能,請在 dispatch() 方法內設置端點,然後調用 Debug Extension in Target OfficeOpenOffice.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-InDisplayed 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創建文本文檔。


XComponentLoader xComponentLoader =
(XComponentLoader) UnoRuntime.queryInterface(
XComponentLoader.class, xDesktop);

PropertyValue xEmptyArgs[] = new PropertyValue[0];

XComponent xComponent =
xComponentLoader.loadComponentFromURL(
“private:factory/swriter”,
“_blank”, 0, xEmptyArgs);

XTextDocument xTextDocument =
(XTextDocument) UnoRuntime.queryInterface(
XTextDocument.class, xComponent);

 

 

新文檔將顯示一個等待輸入的光標。此輸入必須來自於客戶端應用程序。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/

 




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章