IBM Lotus Symphony 开发人员教程: 构建一个简单的文档工作流插件

当许多人想到 IBM Lotus Symphony 时,他们理所当然地认为这是一组提高办公效率的编辑器,但是它的功能实际上远不只如此。因为 Symphony 基于 OpenOffice.org 技术和 Eclipse/Lotus Expeditor 富客户机平台,所以它是一个可扩展的产品。Lotus 合作伙伴可以利用这种灵活性作为 Symphony 用户界面的自然扩展添加新的特性,增强基本产品的功能。正如在这个实验中将看到的,也可以提供编辑功能之外的与业务相关的功能。无论是增强现有的基本编辑特性,还是添加与业务相关的功能,实现的方法是相同的:开发一个插件并“连接到”Symphony 中。这个实验的目的是,演示如何使用插件以各种方式扩展办公套件的功能。

概述

在这个实验中,我们要创建一个简单的文档工作流插件。文档工作流应用程序可以对文档库中的办公文档应用简单的工作流。在打开一个文档时,这个文档在 Lotus Symphony 窗口中打开并在应用程序中显示工作流信息。可以修改工作流信息并存储在文档中。文档用一个特殊的模板构建并存储在本地。

下图显示 Document Workflow 插件的用户界面。


图 1. Document Workflow 插件的用户界面
图 1. Document Workflow 插件的用户界面

Document Workflow 插件演示关键功能,比如如何执行以下任务:

  • 声明一个扩展,在边架(左边面板)中添加应用程序
  • 用 Lotus Symphony API 打开文档
  • 访问和修改文档的内容

我们将从头创建这个插件并使用预先编写的代码片段,从而加快手工数据输入过程的速度。这个实验的目的是,帮助那些熟悉 Java 编程的开发人员通过开发插件扩展 Symphony。了解 Eclipse 和 OpenOffice.org UNO 编程知识会有帮助,但不是必需的。


大纲

为了创建 Document Workflow 应用程序,需要执行以下步骤:

  1. 检查 Eclipse 开发环境
    • 从 Eclipse 开发环境运行 Lotus Symphony
  2. 为 Document Workflow 应用程序创建 Eclipse 插件
    • 构建一个简单的 Eclipse 插件,为 Lotus Symphony 提供边架
    • 用 Eclipse 的 Standard Widget Toolkit(SWT)创建应用程序的用户界面
  3. 操作库中的文档
    • 打开库中的文档
  4. 访问并修改文档
    • 在装载文档时读取工作流信息
    • 修改工作流信息

检查 Eclipse 开发环境

  1. 使用 c:\Eclipse32 目录中的 Symphony_techfest 快捷方式。选择 Window > Open Perspective > Other...,然后选择 Plug-in Development 并单击 OK,切换到插件开发环境。
  2. 单击工具栏中的 Run 按钮,Lotus Symphony 应该会启动。如果禁用了 Run 选项,那么选择 Run > Run... 打开运行时配置对话框。选择 Eclipse Application > Symphony,然后单击 Run 按钮。如果询问是否希望清空运行时工作空间,那么选择 No

    图 2

    注意:打开 Symphony 之后,关闭欢迎页面。

  3. 当 Lotus Symphony 窗口打开时,单击 File > New > Document,会看到以下窗口:

    图 3

    这是标准的 Symphony 文档编辑器。在下一节中,将在开发环境中添加一个 Eclipse 插件并测试它的效果。在此之前,选择 File > Exit 关闭 Symphony 的运行时实例。

为 Document Workflow 应用程序创建 Eclipse 插件

创建新插件

  1. 启动 Eclipse 开发环境。
  2. 单击 File > New > Project
  3. 选择“Plug-in Project”并单击“Next”。
  4. Project name 框中输入 com.ibm.productivity.tools.sample.DocumentWorkflow。其他选项保持默认设置。
  5. 单击 Next
  6. Plug-in Name 框中输入一个描述性的名称,比如 Document Workflow sample。其他选项保持默认设置。
  7. 单击 Finish

添加插件依赖项

下面的表格列出 Document Workflow 使用的一些插件依赖项(插件名是简写的):

插件说明
org.eclipse.core.runtime,org.eclipse.uiEclipse 核心插件
com.ibm.productivity.tools.ui.views
com.ibm.productivity.tools.core
Lotus Symphony API 插件
com.ibm.rcp.ui,
com.ibm.rcp.jfaceex,
com.ibm.rcp. swtex
RCP 用户界面 API

按照以下步骤添加插件依赖项:

  1. 单击 Document Workflow 插件清单的 Dependencies 附签。
  2. 单击 Add。
  3. 添加以下插件:
    • com.ibm.productivity.tools.ui.views
    • com.ibm.productivity.tools.core
    • com.ibm.rcp.ui
    • com.ibm.rcp.jfaceex
    • com.ibm.rcp.swtex

    结果:屏幕应该像下图这样(插件的次序并不重要)。



    图 4

注意:添加这些插件依赖项会在定义这个插件的 MANIFEST.MF 文件中添加以下代码。切换到 Plug-in Manifest Editor 的 MANIFEST.MF 附签就可以看到这个文件的内容:

RequireBundle: org.eclipse.ui,
org.eclipse.core.runtime,
com.ibm.productivity.tools.ui.views,
com.ibm.productivity.tools.core,
com.ibm.rcp.jfaceex,
com.ibm.rcp.ui,
com.ibm.rcp.swtex

提供边架

  1. 单击 Extensions 附签。
  2. 单击 Add。
  3. 添加以下扩展 com.ibm.rcp.ui.shelfViews。
  4. 单击 Finish。
  5. 右键单击添加的扩展并选择 New > shelfView。

    图 5

    选择这个菜单项将在扩展声明中添加一个 shelfview 元素。选择新添加的元素,Extension Element Details 应该已经更新了,显示元素的属性。按照下图填写属性。



    图 6

    星号(*)表示必需的属性。这里最重要的属性是 class 属性;这个属性表示实现 shelfview 的行为的 Java 类(也就是说,这个类定义边架区域将包含什么内容,它如何响应用户事件,等等)。这个文档中使用的 id 是 com .ibm.productivity.tools.sample.documentworkflow.ShelfView。可以复制并粘贴它。

  6. 单击 plugin.xml 附签。
  7. 把以下代码复制并粘贴到 plugin.xml 中:
    	

    要点:com.ibm.rcp.ui.shelfViews 扩展中 标记的 view 属性必需与 org.eclipse.ui.views 扩展中 标记的 id 属性匹配。也就是说,边架内容由扩展的 / 对定义。

    上面这个步骤在平台上提供了一个新的 Eclipse ViewPart。可以用 Manifest Editor 创建自己的插件扩展,也可以直接在 plugin.xml 中指定扩展。

  8. 在 Package Explorer 中右键单击包“com.ibm.productivity.tools.sample.documentworkflow”,选择 New > Class。

    图 7

  9. 输入以下类信息,可以单击“Browse…”按钮搜索超类 org.eclipse.ui.part.ViewPart。

    图 8

    结果:在 com.ibm.productivity.tools.samples.documentworkflow 包中创建一个新的 Eclipse ViewPart,ShelfView。

运行应用程序

  1. 检查插件。

    在运行应用程序之前,先看一下 plugin.xml 和刚才创建的类:

    plugin.xml 的内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <?eclipse version="3.2"?>
    

    在 Package Explorer 中双击 ShelfView.java,ShelfView.java 的内容如下:

    package com.ibm.productivity.tools.sample.documentworkflow;
    
    import org.eclipse.swt.widgets.Composite; 
    import org.eclipse.ui.part.ViewPart;
    
    public class ShelfView extends ViewPart{
        public void createPartControl(Composite arg0){ 
            //TODO Auto-generated method stub
        }
    
        public void setFocus(){
            //TODO Auto-generated method stub
        } 
    }
    

  2. 单击工具栏中的“Run”按钮。

    图 8

  3. Lotus Symphony 将会启动;单击 File > New > Document,屏幕应该像下图这样:

    图 9

    提示:如果没有显示刚才创建的视图,那么检查控制台中“org.eclipse.ui.PartInitException: Could not create view: XXX”这样的消息,并确认 XXX 是视图 id。com.ibm.rcp.ui.shelfViews 扩展中 标记的 view 属性必需与 org.eclipse.ui.views 扩展中 标记的 id 属性匹配。

    祝贺您!您已经在 Lotus Symphony 边架中为您的应用程序留出了空间。接下来,我们将打开、访问并修改文档库中的文档。

操作库中的文档

在开始使用 Lotus Symphony API 之前,我们先要添加 Document Workflow 应用程序所需的所有变量和方法,还有并非 Lotus Symphony 专用的一些 helper 方法。然后,就可以转到与扩展 Lotus Symphony 相关的代码。在 ShelfView.java 中添加以下代码。

定义变量

定义以下变量。把这些代码复制并粘贴到 ShelfView.java 的开头。

private Text ownerTxt;
private Text statusTxt;
private RichDocumentView selectedView = null; 
privateTableViewer viewer;

注意:在粘贴代码片段之后,使用菜单项 Source > Organize Imports(Ctrl+Shift+O)添加所需的导入语句。例如,在以上片段中,需要导入 com.ibm .productivity.tools.ui.views.RichDocumentView 包。


图 10

要点:有几个包定义了 TableViewer 和 Text。一定要选择 org.eclipse.jface.viewers.TableViewer 和 org.eclipse.swt.widgets.Text。

完成 createPartControl 方法

Document Workflow 在 Lotus Symphony 的边架上提供一个可见区域。这个区域是使用 Eclipse 的标准部件集 SWT(Standard Widget Toolkit)在 createPartControl 方法中定义的。

SWT API 用来在 Eclipse 平台中创建用户界面元素。复制以下代码并替换 ShelfView.java 中的 createPartControl 方法。

以下代码片段在边架中创建一个 Document Library 组和 Workflow 组以及其他 SWT 控件。

public void createPartControl(Composite parent){
    parent.setLayout(new RowLayout());
    //Group of Document Library
    int y = 10;
    Group doclibGrp = new Group(parent, SWT.NULL); 
	doclibGrp. setText( "Document Library"); 
	doclibGrp.setSize(390, 72);
    doclibGrp.setLocation(10, y);
    viewer = newTableViewer(doclibGrp, SWT.MULTI |SWT.H_SCROLL |SWT.V_SCROLL);
    viewer.getTable( ) .setSize(120, 60);
    viewer.getTable().setLocation(30, y + 20);
    viewer.setContentProvider(new LibraryContentProvider()); 
    viewer.setLabelProvider(new LibraryLabelProvider()); 
    viewer.setInput(this );
    hookDoubleClickAction();
    //Group of user information
    y = 10+ doclibGrp.getBounds().height + 7;
    Group workflowGrp = new Group(parent, SWT.NULL);
    workflowGrp. setText ( "Workflow"); 
    workflowGrp.setSize(390, 72); 
    workflowGrp.setLocation(10, y);
    Label wnerLbl = new Label(workflowGrp, SWT.SHADOW_NONE |SWT.RIGHT);
    ownerLbl.setText ( "Owner");
    ownerLbl.setSize(40, 22);
    ownerLbl.setLocation(10, 22);
    Label statusLbl = new Label(workflowGrp, SWT.SHADOW_NONE |SWT.RIGHT);
    statusLbl.setText( "Status");
    statusLbl.setSize(40, 22);
    statusLbl.setLocation(10, 46);
    wnerTxt = new Text(workflowGrp, SWT.BORDER |SWT.LEFT); 
    ownerTxt.setBackground(new Color(this.getSite().
    getShell().getDisplay(), 255, 255, 255));
    ownerTxt.setSize(80,16);
    ownerTxt.setLocation(100, 21);
    statusTxt = new Text(workflowGrp, SWT.BORDER |SWT.LEFT); 
    statusTxt.setBackground(new Color(this.getSite().getShell().getDisplay( ) , 
        255, 255, 255));
    statusTxt.setSize(80,16);
    statusTxt.setLocation(100, 46);
    Button commitBtn = new Button( workflowGrp, SWT.BORDER |SWT.PUSH );
    commitBtn. setText ("Commit"); 
    commitBtn.setSize(80, 20); 
    commitBtn.setLocation(50, 67); 
    commitBtn.addSelectionListener(new SelectionListener(){
        public void widgetDefaultSelected( SelectionEvent arg0){
        //TODO Auto-generated method stub
    }
    public void widgetSelected(SelectionEvent arg0){
    } });
}

注意:在粘贴代码片段之后,使用菜单项 Source > Organize Imports(Ctrl+Shift+O)添加所需的导入语句。如果缺少方法和类,只需继续复制并粘贴以下代码。

要点:有几个包定义了 Label 和 SelectionEvent。一定要选择 SWT 包中定义的。

需要导入以下这些包,可以检查这个列表或者在导入部分中复制并粘贴以下代码。

import java.io.IOException;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.part.ViewPart;
import org.osgi.framework.Bundle;
import com.ibm.productivity.tools.ui.views.RichDocumentView;

helper 方法和类

SWT 是一个跨不同平台通用的低层部件集,包括标签、文本输入框、按钮等等。Eclipse 开发人员可以使用另一个称为 JFace 的框架简化部件代码,这会把“部件友好的”数据类型(比如字符串)映射为“应用程序友好的”对象(比如 Clients、Documents 和相似的高级类)。例如,TableViewer 使用“helper”对象处理 Documents 等高级对象到部件需要的低级数据类型(比如字符串)的映射。下面两个类定义这些 helper 类。

需要以下方法和类;把它们复制并粘贴到 ShelfView.java 的末尾。

LibraryContentProvider

LibraryContentProvider 提供 Document Library 中列出的文档的文件名。

 class LibraryContentProvider implements IStructuredContentProvider{
    public void inputChanged(Viewerv,Object oldInput, Object newInput){
    }
    public void dispose(){
    }
    public Object[] getElements(Object parent){
        return new String[] { "Document 1", "Document 2", "Document 3" };
    } 
}
 

LibraryLabelProvider

LibraryLabelProvider 为 Document Library 中列出的每个文档的文件名提供可见文本。

class LibraryLabelProvider extends LabelProvider implements ITableLabelProvider{
    public String getColumnText(Object obj, int index){ return getText ( obj);
    }
    public Image getColumnImage(Object obj, int index){ return getImage(obj);
    }
    public Image getImage(Object obj){
        return null;
    }
}

要点:有多个包定义了 Image。一定要选择 SWT 包中定义的 Image。

hookDoubleClickAction

这个方法处理 Document Library 中发生的双击操作。

private void hookDoubleClickAction(){
    viewer.addDoubleClickListener(new IDoubleClickListener(){
    public void doubleClick(DoubleClickEvent event){ 
        ISelection selection = viewer.getSelection(); 
        Object bj = ((IStructuredSelection)selection).getFirstElement();
        String displayName = obj.toString();
        String url = getDocumentURL( displayName );
    } 
    });
}

getDocumentURL

这个方法把 Document Library 中列出的每个文档的显示名转换为绝对 URL。

private String getDocumentURL( String displayName)
{
    String url ="";
    String res = "docs/" + displayName + ".odt";
    url = getResolvedPath( res );
    return url;
}
private String getResolvedPath(String file){
    String resolvedPath = null;
    Bundle bundle = Platform.getBundle
        ("com. ibm. productivity.tools . sample. DocumentWorkflow" ); 
    if (bundle != null){
        java.net.URL bundleURL = bundle.getEntry( "/" ); 
        if (bundleURL != null){
            try{
            resolvedPath = FileLocator.resolve(
            bundleURL ).getFile();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
    String ret = resolvedPath+file;
    ret = ret.substring(1);
    ret = ret.replace('/', '\\');
    return ret;
}

要点:有多个包定义了 IOException 和 Platform。一定要选择 Java 和 Eclipse 包中定义的内容。

创建库

我们在本教程中使用一个虚构的文档库,所有文件都是本地文件。按照以下步骤创建这个库:

  1. 切换到 Windows Explorer,找到教程的目录,比如 c:\ls 08_TechFest,右键单击 docs 目录并选择 Copy。
  2. 切换到 Eclipse 环境,右键单击 com.ibm.productivity.tools.sample.DocumentWorkflow 插件并选择 Paste。

    图 11

    结果:创建以下的 docs 目录:



    图 12

运行应用程序

  1. 确认以上操作是正确的,单击 File > Save All。
  2. 单击工具栏中的 Run 按钮。

    图 13

    结果:应用程序启动;单击 File > New > Document,屏幕应该与下图相似。



    图 14


访问并修改文档

打开库中的文档

找到 ShelfView.java 中的 hookDoubleClickAction 方法,在这个函数末尾添加以下代码行。当双击文档库中的一个文件项时,以下代码会自动打开这个文档。

RichDocumentView view = RichDocumentViewFactory. openView( url, false);

注意:在粘贴代码片段之后,使用菜单项 Source > Organize Imports(Ctrl+Shift+O)添加所需的导入语句。需要导入 com.ibm.productivity.tools.ui.views.RichDOcumentViewFactory 包。屏幕应该像下面这样:


图 15

使用 SelectionService 并访问文档的内容

在 Eclipse 中,Eclipse 工作台提供的选择服务(selection service)可以高效地链接工作台窗口中的不同部分。每个工作台窗口有自己的选择服务实例。这个服务会跟踪当前激活的部分中选择的内容,并把选择的更改传播给注册的所有监听器。在当前部分中选择的内容发生变化时,或者在激活另一个部分时,会引发选择事件。这两种情况可以通过用户交互或程序触发。

每个 Lotus Symphony 视图都注册选择提供器,这样就可以监视 Lotus Symphony 中发生的选择更改事件。

以下代码演示如何在 Lotus Symphony 中使用选择提供器。请执行以下步骤:

创建 ISelectionListener 的实例

当用户在打开的视图之间切换时,调用选择监听器。把代码复制并粘贴到 ShelfView.java 中。它在运行时执行以下任务:

  1. 获得选择的 RichDocumentView。
  2. 获得当前选择的视图的 UNO 模型。
  3. 用 UNO API 查询文档中的工作流信息。
  4. 更新 Document Workflow 应用程序的用户界面。
private ISelectionListener selectionListener = new ISelectionListener()
{	
    public void selectionChanged(IWorkbenchPart arg0, ISelection arg1){
      IAdaptable adaptable = ( IAdaptable ) arg1;
      RichDocumentViewSelection selection = 
      ( RichDocumentViewSelection) adaptable.getAdapter(RichDocumentViewSelection.class);
      selectedView = selection.getView(); 
      Object model = selectedView.getUNOModel();
      XTextTablesSupplier tableSupplier = ( XTextTablesSupplier) 
          UnoRuntime.queryInterface( XTextTablesSupplier.class, model );
      XNameAccess nameAccess = tableSupplier.getTextTables();
      try{ 
         XTextTable table =( XTextTable )
         UnoRuntime.queryInterface (XTextTable.class,nameAccess.getByName("Workflow")); 
         XCell cell = table.getCellByName( "B2" );
         XText text = ( XText ) UnoRuntime.queryInterface(XText.class, cell);
         String wner = text.getString();
         cell = table.getCellByName("B3");
         text = ( XText ) UnoRuntime.queryInterface(XText.class, cell); 
         String reviewer = text.getString();
         updateWorkflowInfo( owner,reviewer );
      } catch (NoSuchElementException e){ 
         //TODO Auto-generated catch block e.printStackTrace();
   } catch (WrappedTargetException e){ 
       //TODO Auto-generated catch block e.printStackTrace();
   }
} };

要点:有多个包定义了 NoSuchElementException 和 XText。一定要选择 Sun 包(而不是 Java 包)中定义的内容。

要点:请注意以下行;它用来获得当前文档的 UNO 文档模型。UNO 文档模型是访问和修改文档内容的入口点。可以获得文档中的几乎所有对象。在这个实验中,您将学习如何访问文档中一个预定义的表“workflow”。

Object model = selected View.getUNOModel();

注意:在粘贴代码片段之后,使用菜单项 Source > Organize Imports(Ctrl+Shift+O)添加所需的导入语句。需要导入多个包。请对照以下代码检查屏幕。

import org.eclipse.core.runtime. IAdaptable;
import com.sun.star.container.NoSuchElementException;
import com.sun.star.container.XNameAccess;
import com.sun.star.lang.WrappedTargetException;
import com.sun.star.table.XCell;
import com.sun.star.text.XText;
import com.sun.star.text.XTextTable;
import com.sun.star.text.XTextTablesSupplier;
import com.sun.star.uno.UnoRuntime;
import com.ibm.productivity.tools.ui.views.RichDocumentViewSelection;
import org.eclipse.ui.ISelectionListener; 
import org.eclipse.ui.IWorkbenchPart;
updateWorkflowInfomethod
The following code updates the User Interface of Document Workflow application. 
    private void updateWorkflowInfo(String owner,String reviewer){
        ownerTxt .setText (owner); statusTxt.setText (reviewer);
    }

注册选择监听器

为了让选择监听器起作用,需要向选择服务注册监听器。把以下代码复制并粘贴到 createPartControl() 方法的末尾。

IWorkbenchWindow window = PlatformUI.getWorkbench().
    getActiveWorkbenchWindow();
ISelectionService service = window.getSelectionService(); 
service.addSelectionListener(selectionListener);

注意:在粘贴代码片段之后,使用菜单项 Source > Organize Imports(Ctrl+Shift+O)添加所需的导入语句。需要导入多个包。请对照以下代码检查屏幕。

import org.eclipse.ui.ISelectionService; 
import org.eclipse.ui.IWorkbenchWindow; 
import org.eclipse.ui.PlatformUI;

修改当前文档

到目前为止,已经从文档中读取了插件信息。现在,学习如何用 Document Workflow 应用程序的内容修改当前的 Lotus Symphony 文档。按照以下步骤把工作流信息提交到 Lotus Symphony 文档中。

在提交按钮上添加函数

找到 createPartControl 中的 commitBtn,按照以下代码进行修改。当选择部件时,调用 commitWorkflowInfo 方法。

commitBtn.addSelectionListener(new SelectionListener(){
    public void widgetDefaultSelected(SelectionEvent arg0) {
        // TODO Autogenerated method stub
    }
    public void widgetSelected(SelectionEvent arg0) {
        commitWorkflowInfo();
    }
});

commitWorkflowInfo 方法

这个方法从 Document Workflow 应用程序中读取内容,并调用函数把数据写入当前文档。把以下代码复制并粘贴到 ShelfView.java 中。

private void commitWorkflowInfo( )
{
    String wner = ownerTxt.getText();
    String reviewer = statusTxt.getText();
    
    writeWorkflowInfo( owner, reviewer );
}

writeWorkflowInfo

这个方法把工作流数据提交到当前文档中。把以下代码复制并粘贴到 ShelfView.java 中。

private void writeWorkflowInfo(String owner, String reviewer) {
    Object model = selectedView.getUNOModel();

    XTextTablesSupplier tableSupplier = ( XTextTablesSupplier )
        UnoRuntime.queryInterface( XTextTablesSupplier.class, model );

    XNameAccess nameAccess = tableSupplier.getTextTables();

    try {
        XTextTable table = ( XTextTable )UnoRuntime.queryInterface
            ( XTextTable.class,nameAccess.getByName("Workflow"));
        XCell cell = table.getCellByName( "B2" );
        XText text = ( XText ) UnoRuntime.queryInterface(XText.class, cell);
        text.setString(owner);
        cell = table.getCellByName("B3");
        text = ( XText ) UnoRuntime.queryInterface(XText.class, cell);

        text.setString(reviewer);

    } catch (NoSuchElementException e) {
        // TODO Autogenerated catch block
        e.printStackTrace();
    } catch (WrappedTargetException e) {
        // TODO Autogenerated catch block
        e.printStackTrace();
    }
}

运行应用程序

  1. 确认以上操作是正确的,单击 File > Save All。
  2. 单击工具栏中的 Run 按钮。

    图 16

    结果:应用程序启动;单击 File > New> Document,屏幕应该与下图相似。



    图 17

  3. 双击 Document Library 中的每个文档。

    结果:文档会在新的附签窗口中自动打开。

  4. 在“Document 1”、“Document 2”和“Document 3”之间切换。

    结果:Workflow 组中的所有者和状态会自动更新。

  5. 修改所有者和状态,单击 Commit 按钮。

    结果:修改的内容在 Lotus Symphony 文档中自动更新。

结束语

本教程带领您创建了 Lotus Symphony 边架扩展。学习了如何创建插件和插件扩展,以及如何使用 Lotus Symphony 支持的 Java API 读取和更新 Lotus Symphony 文档的内容。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14751907/viewspace-406613/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/14751907/viewspace-406613/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值