OpenOffice.org NetBeans集成

来源:互联网 发布:mac最新迅雷下载不了 编辑:程序博客网 时间:2024/04/28 03:24

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

 




原创粉丝点击