本文介绍了 IBM Workplace Documents 对自定义编辑器的支持,详细讲解了如何创建自定义编辑器,并集成到 IBM Workplace Managed Client 当中。
文档管理中的编辑器
IBM Workplace Documents 是 IBM Workplace 协同工作产品的重要组成部分。它在一个安全的环境中,提供文档的创建、管理、共享、工作流、版本控制等功能。文档编辑器在这些功能中扮演了重要的角色。在 IBM Workplace Documents(指 IBM Workplace Documents 富客户端,下同)中,使用IBM生产力工具(一套富文本编辑器,下文简称IBM编辑器)实现文档的创建和编辑功能。IBM 编辑器是IBM Workplace Documents内建的文档编辑器,它支持的文档类型包括字处理文档、电子表格、演示文稿、项目计划等。这些类型能满足大多数办公需要。除此之外的文档类型,将调用操作系统中装有的相关应用程序来编辑。比如用户试图编辑文档库中某个Zip文档,IBM Workplace Documents判断出该文档不能由IBM编辑器打开,于是就转而调用操作系统中相关的程序来处理。
图 1:IBM Workplace Documents用外部编辑器打开不支持的格式
对于集成性要求更高的系统来说,外部编辑器可能带来互操作性方面的损失,并且在安全性上也不如内建的编辑器高。因此有没有可能扩展IBM Workplace Documents,让它支持更多的文档类型呢?答案是肯定的。IBM Workplace Documents富客户端从2.6版本开始,新增了对自定义编辑器的支持,允许用户或者第三方开发自己的编辑器,集成到IBM Workplace Documents当中。接下来本文将介绍这一新增功能。
自定义编辑器扩展介绍
编辑器分类
IBM Workplace Documents处理文档时,主要参考文档的类型来调用不同的编辑器。总体来讲,一共有四类编辑器。首先是IBM编辑器,它支持字处理文档、演示文稿、电子表格及项目文档等多种常见的办公文档类型。其次,IBM Workplace Documents还内建一个简单图像的查看器,支持jpeg和gif格式图像文档的预览。除此之外,就是操作系统安装的关联程序。当某种文档类型不能由IBM Workplace Documents识别时,将调用系统程序来处理。如果客户或者第三方软件开发者创建并注册了某种特定文档的编辑器,那么IBM Workplace Documents在处理这类文档时,将使用这个编辑器。这就是自定义编辑器。
自定义编辑器
自定义编辑器是最灵活的一种编辑器,由用户或第三方开发,提供对特定文档类型的处理能力。它的编辑区域有自己的用户界面,同时又被嵌入到IBM Workplace Documents的界面框架中,就跟IBM编辑器和简单图像查看器的效果一样。图 2中的Zip Viewer是自定义编辑器,它显示Zip文档的内容。Zip Viewer负责创建编辑器窗口,在图中为下半部列表部分。而IBM Workplace Documents则创建整个页面,提供文档的属性信息,并将Zip Viewer的窗口包含进来。
图 2:嵌入IBM Workplace Documents中的Zip Viewer
IBM Workplace Documents对自定义编辑器的支持包括:
- 集成嵌入式编辑器
- 支持自定义菜单
大多数情况下,编辑器仅仅拥有一个窗口是不够用的。自定义菜单是对简单的嵌入式编辑器的补充。允许编辑器提供一组菜单选项,用于显示在主窗口中,如图 3。
图 3:Zip Viewer提供的菜单项出现在主窗口中
系统结构
在进一步了解自定义的创建方法前,需要介绍IBM Workplace Documents对自定义编辑器扩展的体系结构。如图 4所示,除了IBM Workplace Documents和Custom Editor之外,还有一个重要的部分叫做File Type Registry。它是IBM Workplace Documents和自定义编辑器之间交互的桥梁。首先,自定义编辑器通过File Type Registry注册编辑器的基本信息,如文档类型,编辑器的实现类等。其次,IBM Workplace Documents作为编辑器的使用者,通过File Type Registry获得编辑器的信息。接下来,IBM Workplace Documents就按照事先规定好的接口与自定义编辑器交互,包括创建编辑器的实例、将编辑器窗口纳入页面中以及提供给编辑器文档的数据等。
图 4:IBM Workplace Documents自定义编辑器系统结构
创建自定义编辑器
这里介绍自定义编辑器的几个基本概念:
文档类型:说明编辑器能处理的文档格式,以扩展名为标识。
嵌入式:指自定义编辑器是IBM Workplace Documents编辑窗口的一部分。在Eclipse的术语中IBM Workplace Documents是一个View Part,而自定义编辑器是一个Composite对象。
操作模式:指IBM Workplace Documents调用编辑器的模式,有view和edit两种操作模式,其对应的实体也通常叫做查看器和编辑器(在本文不刻意区分的时候,统称为编辑器)。
正如在前面系统结构中介绍的,IBM Workplace Documents提供自定义编辑器扩展点和编辑器API。创建自定义编辑器,要在扩展点注册自身的信息,并实现编辑器API。下面就分别这两部分。
关联文档类型
关联文档类型即是注册自定义编辑器的信息,提供文档类型和自身的实现类。文档类型关联扩展点定义在com.ibm.rcp.registry.filetype插件中,即图 4中的File Type Registry部分。其扩展点定义包含如下属性:
- typeName文档类型的描述性文字,比如“文本文档”、“电子表格”。
- extension文件扩展名,比如“txt”。
- handlerName自定义编辑器名称,比如“Zip Viewer”。
- action自定义编辑器支持的功能,可选的值有“view”和“edit”。分别表示该自定义编辑器可以对文档进行“查看”和“编辑”操作。
- class实现自定义编辑器的Java类名。
进入Eclipse开发环境,创建一个新的插件,取名为com.ibm.pdm.samples.zipviewer。由于我们要从上面提到的扩展点关联文档类型,所以需要先把com.ibm.rcp.registry.filetype插件添加到新插件的依赖列表中。编辑其plugin.xml文件,在Dependencies页面加入com.ibm.rcp.registry.filetype。
图 5:添加com.ibm.rcp.registry.filetype为关联的插件
接下来,从扩展点关联文档类型。由于我们要处理Zip文件,所以在“extension”属性中填入“zip”作为扩展名。同时,为“typeName”属性设置“Zip File”作为类型描述,以及设置“handlerName”属性的名字为“Zip Viewer”。我们这个Zip Viewer只能浏览而不能编辑,因此“action”属性的值选为“view”。最后,在“class”属性中填入“com.ibm.pdm.samples.zipviewer.ZipViewer”作为类名,因为我们的Zip Viewer将在这个类中实现。“viewId”属性是为今后预留的,暂时不需要填。
图 6:从扩展点定义文档类型关联
实现自定义编辑器接口
在com.ibm.rcp.registry.filetype插件中,定义了四个编辑器接口:
- IFileViewer 定义查看器必须实现的方法
- IFileEditor 定义编辑器必须实现的方法
- IActionContributor 定义集成自定义菜单需要实现的方法
- IPartAwareness 定义与容器交互需要实现的方法
图 7:自定义编辑器接口类图
IBM Workplace Documents将通过这些接口调用自定义编辑器。一般来讲,这些接口可以由同一个类来实现。而这个类的名字在注册扩展点是写在“class”一项中。在前面定义文档类型关联时,我们举例使用class名字为com.ibm.pdm.samples.zipviewer.ZipViewer。因此,在Eclipse开发环境中创建这个类,并且指定实现IFileViewer接口。
这些接口定义的方法在SDK中有详细介绍。这里我们将用顺序图的方式了解IBM Workplace Documents怎样通过这些接口与自定义编辑器交互。这也能帮助我们理解接口的实现方法。
打开查看器
查看器是最简单的自定义编辑器。只要实现了IFileViewer,就满足了查看器的要求。IBM Workplace Documents在打开查看器时,将按照下面的顺序调用方法。
图 8:IFileViewer调用序列图
- 首先调用init()进行编辑器的初始化。这个方法返回一个布尔值。若为真,IBM Workplace Documents继续进行下面的调用。否则,结束这个过程,编辑器打开失败。在这个方法中,自定义编辑器可以进行资源的申请等操作。并根据情况,返回相应的结果。
- 接下来,调用createRenderingControl()创建编辑窗口。正如前面所说,编辑窗口是Eclipse的一个Composite对象。自定义编辑器将自己所有的界面都放在里面。
- 窗口创建好之后,调用setInput(),将IBM Workplace Documents的数据传送给编辑器。在这里用到InputStream来传送。编辑器需要从该输入流读出数据。有必要时,可以进行缓冲处理。
- 数据读取完毕,自定义编辑器就可以显示其内容了。这也是自定义编辑器核心的功能。
- 当用户关闭编辑器窗口时,先由IBM Workplace Documents响应到这个事件。从而进一步调用自定义编辑器的dispose()方法来通知其关闭。这里自定义编辑器可以释放掉之前申请的资源。
编辑并保存内容
很多时候我们需要的是一个完整的编辑器,不光是查看文档,而应该能编辑和保存。这些功能被定义在IFileEditor接口中。下面我们来看看IBM Workplace Documents怎样通过这个接口来编辑和保存数据。
图 9:编辑器接口调用序列图
- 首先还是调用init()。那么在这里要强调的是,该方法有一个整型参数,如果该数值等于常量ACTION_EDIT,表明了该次调用是需要进行编辑操作。
- 接下来创建窗口和读取数据都跟查看器的步骤一样。
- 自定义编辑器对文档进行显示,并且允许用户在界面中编辑。
- 当用户选择保存时,IBM Workplace Documents获得该事件,并进一步调用isModified()来询问自定义编辑器是否有修改。在确认有修改后,继续调用save()方法来获得修改的数据。该方法用到OutputStream,自定义编辑器通过它把修改后的内容传回去。
- 保存完毕,调用resetModified来清楚修改标记,避免多次写入。
- 在关闭窗口时,同样调用dispose()进行收尾工作。
创建新文档
前面讲的是如何打开已有文档进行编辑。这里来看看怎样实现创建新文档的功能。
图 10:创建新文档序列图
- 在创建编辑器窗口之后,并非调用setInput(),而是调用createNewFile()。这是告诉自定义编辑器去创建新的文档。在这个环节中,已经给出了OutputStream。为得是让自定义编辑器能够在用户编辑新文档前可以存回初始的数据,比如模板。
- 接下来,用户在新创建文档中进行编辑。
- 之后的保存过程同前面小节相同。
创建自定义菜单
嵌入式的自定义编辑器没有完整的主菜单栏。但是可以通过接口IActionContributor在主菜单上创建自己的菜单组。主要原理是IBM Workplace Documents通过该接口获得自定义编辑器的菜单项,把它们放到一个菜单组中。并跟踪管理这些菜单的状态。这个接口是可选的,如果自定义编辑器实现该接口,那么在createRenderingControl()被调用后,IBM Workplace Documents会调用该接口的getActions()方法。该方法返回IAction对象的数组,每个对象讲被创建为一个菜单项。
图 11:创建自定义菜单序列图
结束语
通过上面的介绍,相信大家都对IBM Workplace Documents如何扩展编辑器有了全面的认识。它利用Eclipse的插件机制,将用户的自定义编辑器整合到系统中。作为IBM Workplace家族中重要的应用,文档管理程序面向多种不同的用户群体。只有提供自定义编辑器的支持,才能允许用户更灵活的运用该产品,发挥客户的更大价值。 |