|
IBM Lotus Notes V8的新架构为扩展和定制用户体验提供了很多新方法。本文着眼于该环境中的两个位置,侧栏和工具栏,并讨论如何通过使用Eclipse插件来添加功能。
IBM Lotus Notes V8有了一个全新的面目,在很多方面都有所更新。其中用户体验的更新也许是最值得注意的更新。Lotus Notes V8使用户使用起来非常方便。如果您是一名应用程序开发人员或管理员,并且有兴趣帮助用户提高生产率,那么可以利用Lotus Notes中这些巧妙变化中的一项变化:用以前从未有过的方法定制用户体验。
由于Lotus Notes采用了新的架构,这些变化得以实现。尤其是,Lotus Notes现在构建在一些被设计为可扩展的平台之上,并从中受益。其中的核心则是开源的Eclipse平台。Eclipse充当一种黏合剂,使得很多组件可以无缝地协作,同时又相互独立,便于定制。
IBM Lotus Expeditor V6.1是一种新的平台,使用它可以方便、轻松地将应用程序交付到用户桌面。Lotus Expeditor扩展了Eclipse,同时又为Eclipse技术增添了很多特性。这些特性包括智能供应(intelligent provisioning)和可配置用户界面(configurable user interface)。此外,Lotus Expeditor还是IBM Lotus Sametime V7.5和即将到来的Lotus Notes V8客户机的基础,如图1 所示。
图 1. IBM Lotus 客户机架构
这种结构使您可以将开发对准Lotus Expeditor平台,这个平台可以在已有的IBM Lotus Notes V8 Beta中和今年晚些时候将发布的Lotus Notes V8中使用。今后,这些组件可以在Lotus Sametime和 Lotus Expeditor独立产品中不加修改地重用。此外,企业只需创建一次应用程序和工具,然后可以在很多环境中轻松地供应这些应用程序和工具。
本文着眼于被添加到Lotus Notes客户机中的两个用户界面组件:SideNote和 QuickNote。这两个应用程序都允许用户在客户机的侧栏或工具栏中添写注释。本文解释如何通过Eclipse插件向这些位置构建您自己的组件。
设置
首先,需要安装Lotus Notes V8 beta软件。
然后,还需要设置Eclipse,Eclipse也是可以免费下载的。这里需要设置Eclipse,以便使用Lotus Notes环境。教程“How to develop Eclipse Components in an Eclipse IDE for Composite Applications in Lotus Notes”提供了这方面的说明。
启动Eclipse IDE,并通过以下步骤设置目标平台:
选择Window - Preferences。
展开Plug-in Development。
选择Target Platform。
在Location edit control控件中,输入c:\notes\framework\eclipse。
单击Reload按钮,然后单击OK。
接着,创建一个附加安装的JRE:
选择Window - Preferences。
展开Java。
选择Installed JREs。
单击Add。
对于JRE name,输入Notes JRE作为名称。
输入c:\notes\framework\rcp\eclipse\plugins\com.ibm.rcp.j2se.win32.x86_1.5.0.作为JRE Home Directory。(注意:这一步会将JAR文件填充到弹出框中较低的部位。)
接下来,通过以下步骤创建一个新的运行时配置:
选择Run - Run,然后选择Eclipse Application。
单击右键,选择New。
输入一个名称(例如Notes)。
在Program to Run下,选择Run a product,然后选择com.ibm.notes.branding.notes。
在Runtime JRE中,选择Notes JRE。
在Arguments附签中,在Program arguments文本框中输入以下内容:
-personality com.ibm.rcp.platform.personality
-product com.ibm.notes.branding.notes
-debug
-console
在VM arguments文本框中输入以下参数(注意:这些参数都来自\rcp\eclipse\plugins\com.ibm.rcp.base_\rcpinstall.properties。)
-Xshareclasses
-Drcp.home=
-Dcom.ibm.rcp.install.id=
-Drcp.install.config=user
-Dosgi.install.area=\eclipse
-Dcom.ibm.pvc.osgiagent.core.logfileloc=\rcp
-Dcom.ibm.pvc.webcontainer.port=0
-Declipse.pluginCustomization=\rcp\plugin_customization.ini
-Declipse.registry.nulltoken=true
-Djava.protocol.handler.pkgs=com.ibm.net.ssl.www.protocol
-Djava.util.logging.config.class=com.ibm.rcp.core.internal.logger.boot.LoggerConfig
-Dosgi.hook.configurators.exclude=org.eclipse.core.runtime.internal.adaptor.EclipseLogHook
-Dosgi.framework.extensions=com.ibm.rcp.core.logger.frameworkhook
-Xbootclasspath/a:\rcp\eclipse\plugins\com.ibm.rcp.base_\rcpbootcp.jar;
接下来,通过以下步骤完成运行时配置:
单击Variables,单击Edit Variables,然后单击New。
输入rcp.home作为名称。
在value栏输入Notes的安装路径(即c:\notes\Framework),然后单击OK。
单击Variables,单击Edit Variables,然后单击New。
输入rcp.base_version作为名称。
在value栏输入com.ibm.rcp.base插件的版本(即6.1.0.0-20061004),然后单击OK。
单击Variables,单击Edit Variables,然后单击New。
输入install_id作为名称。
在value栏输入随机数(即1149682348828),然后单击OK。例如,如果Notes的路径为C:\Documents and Settings\bleonard\IBM\RCP\1149682348828,那么随机数为1149682348828。
单击OK,然后单击Cancel,以选择变量对话框(如果单击OK来选择变量,那么它将把变量添加到插入点)。
为了从IDE中启用Notes安全性,需要对两行代码解除注释。在\framework\shared\eclipse\plugins\com.ibm.notes.branding_3.0.0.\notes_plugin_customization.ini中,通过去掉前面的# 字符,对以下两行代码解除注释:
#com.ibm.rcp.security.auth/loginEnabled=true
#com.ibm.rcp.security.auth/loginConfigName=NOTES
现在,选择Run/Debug,启动Lotus Notes。选择Run - Run或者Debug - Debug。
最后,下载本文附带的代码,并将它解压到一个新文件夹中。为了将它导入到Eclipse中,需要导入已有的项目。
选择File - Import。
选择General - Existing Projects into Workplace,单击Next。
浏览并选择之前将代码解压到的那个文件夹,单击OK。界面应该类似于图2。
单击Finish完成导入过程。
图 2. 将项目导入到 Eclipse 中
扩展 IBM Lotus Notes
Lotus Notes构建在Eclipse Rich Client Platform (RCP)和 IBM Lotus Expeditor基础上。通过创建Eclipse插件,并使用Lotus Expeditor中的供应功能部署创建的插件,可以扩展Lotus Expeditor。
插件是提供一块功能的组件。任何给定的插件都可以定义它所依赖的其它插件,从而允许粒度组件化和代码重用。通过扩展点(extension point),一个插件还可以为它所依赖的其它插件添加新的功能。
扩展点的概念是理解Eclipse工作原理的关键。组件可以通过扩展点定义用于其它插件的约定,以构成功能。构成功能的插件通过XML定义特定的值,从而履行这个约定。这些值可以是字符串格式的关键数据,也可以是实现关键接口的Java类文件的名称。例如,Eclipse平台可以定义一个用于将菜单项添加到菜单中的扩展点。构成该功能的插件提供顶级菜单的ID,显示给用户的名称,以及定义当用户单击菜单项时执行的动作的Java类的名称。要了解关于扩展点和Eclipse框架的更多信息,请访问Eclipse Web站点。
为了扩展Lotus Notes,可以使用相同的机制。在以下小节中,我们描述用于为侧栏和工具栏提供功能的扩展点。侧栏和工具栏只是可以使用这种方法进行扩展的很多组件中的两种组件,这里通过它们来阐释一下概念,并为向Lotus Notes客户机中更有趣的两个位置添加功能提供模板。
应用程序用例
在工作过程中,您很可能需要临时存放一些零碎的文本。有很多方法可以解决这一需求。例如,可以在桌面创建文本文件,然后在其中粘贴要存储的信息。但是,您可能会忘记删除这些文件,无意中多出一些随意命名的文本文件,把桌面搞得很乱。
接下来讨论的应用程序采用两种不同的方法来解决这个问题。
SideNote位于侧栏中,完全由一个大的文本区组成。通过它可以粘贴或输入文本,如果不删除的话,这些文本将一直存在。而且,这种数据可以跨客户机会话保存,所以总是可用的。当需要在某个地方粘贴很快要引用到的零碎信息时,SideNote是理想的工具。
QuickNote可以从工具栏中执行类似的功能。单击QuickNote按钮会显示一个文本小窗口,可以在其中输入文本。这种文本可以保存到硬盘上的一个文件夹中。之后,可以将此文件夹中的这个文本文档和其它文本文档重新装载到这个窗口中。QuickNote可以充当经常需要快速访问的更长久的文本或信息的剪贴簿。
SideNote 侧栏应用程序
Lotus Notes侧栏为应用程序贡献了一个令人激动的方法。如图3 所示,它提供了大量的屏幕操作区域以及持续的可用性。
图 3. SideNote 应用程序
您可以放大、缩小和悬浮侧栏应用程序,还可以同时使用多个侧栏。例如,IBM Lotus Notes V8提供了用于Lotus Sametime联系人、当天日程安排、提要阅读器应用程序和查看活动安排的侧栏组件。通过实现扩展点约定,可以将自己的组件添加到这个位置。
SideNote实现了这个约定,它将一个文本框添加到侧栏。当用户关闭SideNote时,这个应用程序还会收到通知。SideNote利用这个时机将文本保存到硬盘上的文件中。当再次创建SideNote时,它重新显示该文本。
最后,通过一组扩展点,Eclipse开发人员可以将菜单选项添加到任何侧栏应用程序中。SideNote包括两个菜单选项,一个是Save as file,另一个是Load from file,如图4 所示。
图 4. SideNote 菜单选项
侧栏扩展点
让我们看看如何将SideNote添加到Lotus Notes侧边栏。如果查看Eclipse集成开发环境(IDE)中的com.ibm.lotuslabs.ui.sidenote插件,就可以看到它的关键组件。这些组件有:
Plugin.xml,定义它所实现的扩展点
MANIFEST.MF,定义依赖关系
Java源文件,实现应用程序和动作
首先要理解的是IViewPart的概念,IViewPart是由Eclipse定义的一个界面,大致相当于屏幕上的一个矩形。在Eclipse中,IViewParts占据了您所能看到的界面的很大一部分。例如,图5 中标出的区域都是IViewParts。
图 5. Eclipse 客户机中的 IViewParts
在Lotus Notes中,也使用这些部分。虽然我们将SideNote称作侧栏中的一个应用程序,但它实际上是一个IViewPart。具体地说,我们创建了如图6 所示的SideNoteViewPart。
图 6. SideNote 插件代码
这个Java类知道如何构建应用程序。其中定义了一个约定,即当该部件被创建时,会调用createPartControl方法。在本例中,可以使用一个文本控件填充可用区域。通过传入标志,创建滚动条,并告诉文本换行。在Eclipse中,很多可视化组件都是使用一种称作Standard Widget Toolkit (SWT)的技术创建的。正是SWT使得这一切来得如此容易,并且是跨平台的。还可以侦听特殊的组合键。例如,当用户按下Ctrl + A时,可以选择所有文本。最后,当执行dispose操作时,告诉文本控件保存其状态。在Eclipse中,当需要去掉或关闭一个可视元素时,就调用dispose。
创建一个应用程序之后,需要告诉平台关于该应用程序的一些信息。这可以通过plugin.xml中的org.eclipse.ui.views扩展点来实现,如图7 所示。
图 7. SideNote 视图扩展点
为视图提供一个ID,这里可以使用类名,因为它通常是惟一的。
现在,您已经声明了功能,接下来可以使用另一个扩展点将它放入到用户体验中。将功能单元与UI布局分开,这是Eclipse中的普遍风格。Lotus Expeditor平台定义用于将视图放入侧栏的扩展点。实现com.ibm.rcp.ui.shelfViews扩展点,并将它指向SideNote视图,如图8 所示。shelfViews扩展点中包括以下字段和值:
id: com.ibm.lotuslabs.sidenote.SideNoteViewPart
view: com.ibm.lotuslabs.sidenote.SideNoteViewPart
region: TOP
showTitle: true
图 8. SideNote
该工具现在已经在Lotus Notes侧栏中。
SideNote 动作
接下来,我们来看看添加到SideNote菜单中的动作:将当前文本保存到文件中,以及从一个文件中装载文本。
在plugin.xml中,您实现了一个final扩展点。这一次,可以使用org.eclipse.ui.viewActions扩展点将某些动作与特定视图部件相关联。这个扩展点不仅允许扩展您所创建的视图,而且允许扩展对您所添加的东西毫不知情的视图。也就是说,可以为Lotus Notes中已有的侧栏添加动作,以扩展那些组件的功能。图9 展示了SideNote插件如何添加这些动作。在viewActions扩展点中包括以下字段和值:
id: com.ibm.lotuslabs.ui.sidenote.actions
targetID: com.ibm.lotuslabs.ui.sidenote.SideNoteViewPart
图 9. SideNote viewActions 扩展点
通过将targetID设置为另一个视图的ID,可以为那个应用程序添加动作。例如,使用来自Lotus Notes中的Lotus Sametime视图的ID可以随意扩展那个组件。
现在它们已经建立了关联,接下来定义动作,如图10所示。在viewActions扩展点中包括以下字段和值:
class: com.ibm.lotuslabs.ui.sidenote.internal.actions.SaveAsFile
enablesFor: *
id: com.ibm.lotuslabs.ui.sidenote.internal.actions.1.SaveAsFile
label: Save As File
menubarPath: additions
tooltip: Save Side Note text as file
图 10. SideNote 新增的动作
这些扩展点定义动作的标签,并将平台指向当从菜单中选择动作时所运行的代码。在这个例子中,扩展点的约定要求类为一个IViewActionDelegate。这个接口中最重要的部分是run()方法,该方法执行动作。实现这些动作的关键是SideNoteViewPart中的getText()和 setText()方法。用于保存和装载的run()方法使用这两个方法来执行被请求的动作。
例如,SaveAsFile类获取文本,让用户选择一个文件,并将文本写到那个文件中,如清单1 所示。
清单1.将文本写到文件中
SideNoteViewPart part;
public void run(IAction arg0) {
if(part!=null) {
final String text = part.getText();
FileDialog dialog = new FileDialog(PlatformUI.getWorkbench().
getDisplay().getActiveShell(), SWT.SAVE);
dialog.setText("Save Side Note as:");
dialog.setFilterExtensions(new String[] { "*.txt", "*.*" });
final String path = dialog.open();
if(path!=null) {
// new job to write to file
Job write = new Job("Saving Side Note") {
protected IStatus run(IProgressMonitor arg0) {
writeToFile(path, text);
return Status.OK_STATUS;
}
};
write.schedule();
}
part.setFocus();
}
}
QuickNote 工具栏应用程序
工具栏是另一个可以扩展Lotus Notes的地方。QuickNote工具栏有一个按钮用于显示一个小型文本框,在这个文本框中可以编写注释,如图11所示。
图 11. QuickNote 工具栏
输入文本之后,可以将文本保存到指定用于注释的一个文件夹中。然后,通过单击图12所示的下拉图标,可以重新装载这些文本。
图 12. QuickNote 菜单
com.ibm.lotuslabs.ui.toolbars.quicknote插件扩展QuickNote应用程序。注意,这依赖于com.ibm.lotuslabs.ui插件,所以两者都应该在Eclipse工作区中。基本UI插件被独立出来,以便可以为多个特性提供功能。在这个例子中,QuickNote使用这个插件中的简单的文本框。
工具栏扩展点
和侧栏应用程序一样,这里还是通过扩展点将工具栏应用程序添加到用户界面中。这一次是使用com.ibm.rcp.ui.controlSets扩展点。如图13中的菜单所示,这个扩展点允许插件为多个地方添加功能—— Lotus Notes客户机中的工具栏、状态栏和控件。
图 13. QuickNote controlSets 扩展点
为了在客户机靠近顶端的工具栏中或者在靠近底端的状态栏中留出空间,添加一个toolBar项或statusLine项。在这个例子中,创建一个toolBar组件。为了填充那个空间,创建一个控件,并将它与工具栏的ID相关联,如图14所示。具体来说,控件元素中的toolbarPath(com.ibm.lotuslabs.quicknote.bar)与toolBar元素中的ID相匹配。
图 14. QuickNote 控件扩展点
类值将它指向用于构建工具栏的Java代码。该扩展点定义的约定是,这个类实现ISContributionItem接口。QuickNoteContribution类履行这一约定。
ISContributionItem的关键是fill()方法。在这个例子中,需要用按钮填充工具栏。这里添加两个按钮。第一个按钮标签为QuickNote,用于显示来自com.ibm.lotuslabs.ui插件的弹出式文本框。第二个按钮用于展示如何创建图像按钮。所用的图像是一个下拉图标。当单击该按钮时,显示一个菜单。
这个菜单是通过读取QuickNote文件夹中的内容来填充菜单项的。这个文件夹还用于保存弹出式文本框中的注释。
结束语
这些例子应该足以让您学会如何将有用的组件放入Lotus Notes用户环境中。Eclipse的灵活性使您可以在这些位置中随意添加功能,以改善用户体验。而且,请记住,虽然这里我们是构建用于Lotus Notes的 SideNote和 QuickNote,实际上构建在Lotus Expeditor平台上的任何应用程序都可以在多个客户机中重用。
|