在 Lotus Notes 複合應用中整合 Lotus Symphony

genusBIT發表於2009-04-13

簡介

Lotus Symphony 是可免費使用的具備豐富功能的文件編輯工具, 可以選擇整合在Notes中或者獨立執行。在 Lotus Notes 中可以從 Open 選單開啟該編輯器,也可以在應用程式中以程式設計方式開啟編輯器。而且它們的圖示將出現在計算機桌面及 Start 選單中,因此產品編輯器的使用可以獨立於 Lotus Notes。有三個編輯器可處理文件、電子表格和描述,如圖 1-3 所示。它們具有直觀的使用者介面,以基於 Eclipse 的應用程式為特點,支援開放式文件格式(Open Document Format,簡稱ODF),與各種文件格式相容(Microsoft Office, OpenOffice, Lotus SmartSuite等),可以把編輯的文件直接匯出成Adobe Acrobat (PDF) 格式, 支援多種平臺(Windows, Linux ,Mac ),更重要的是Lotus Symphony具有開放的介面,可以進行靈活的定製和各種業務和協作應用整合。


圖 1. IBM Lotus Documents
圖 1. IBM Lotus Documents

圖 2. IBM Lotus Presentations
圖 2. IBM Lotus Presentations

圖 3. IBM Lotus Spreadsheet
圖 3. IBM Lotus Spreadsheet

本文結合例項,系統而詳細地介紹瞭如在 Notes 複合應用中使用 Lotus Symphony。下面,讓我們通過一個相對簡單的例項如 圖 4 所示,來介紹如何在 Notes 複合應用中使用 Lotus Symphony 應用例項。


圖 4. 複合應用例項
圖 4. 複合應用例項

這是一個用 Notes 8 開啟的應用(TopCustomer.nsf),你一眼能看出它和過去你所見到 Notes 的幀結構、檢視、表單等等這些元素全不相同但又似曾相識。在這個應用中,你看到了左方展示公司客戶列表的 Notes 檢視。看到了右方展示 Lotus Symphony 文件編輯器的 Eclipse 外掛。所有這些東西(當然,它們有個正式的名稱——元件),為了一個業務目的(2007 年的最佳客戶名單)而組裝在一起,這就構成了一個複合應用。不只是組裝,元件之間還可以傳遞訊息。還是看上面這個例子,當我們點選左方客戶列表中的某個客戶時,會把該客戶的公司名稱傳遞給其他元件,這樣右方的 Lotus Symphony 文件編輯器會把傳遞來的公司的名稱插入到當前的游標位置。 圖 5 展示了訊息在 Property Broker 程式設計模型中傳遞的後臺過程。


圖 5. Property Broker 程式設計模型
圖 5. Property Broker 程式設計模型

在這裡我們不過多的講述複合應用的概念,大家可以從文章後面的參考資料裡獲得更多的關於 Notes 複合應用的詳細資訊。

複合應用的建立

在 Notes 8 中建立一個複合應用是非常簡單的一件事情,因為基於 NSF 的複合應用就是一個 NSF 資料庫,在建立時,和一個傳統的 NSF 資料庫沒有什麼區別。所不同的是選擇模板時必須選擇空白組合應用程式模板,如 圖 6 所示。


圖 6. 在 Notes 8 中建立複合應用
圖 6. 在 Notes 8 中建立複合應用

建立之後,你將得到一個空白的複合應用頁面如 圖 7 所示。


圖 7. 空白的複合應用頁面
圖 7. 空白的複合應用頁面

接下來點選 操作(Actions)中的 編輯複合應用(Edit Application),Notes 8 會啟動 CAE(Composite Application Editor)如 圖 8 所示。通過這個工具,你可以把 NSF 元件或者 Eclipse 元件拖拽到這個複合應用的頁面上。此外,通過這個工具,你也可以建立多頁面的複合應用。


圖 8. 複合應用編輯器
圖 8. 複合應用編輯器

建立空白複合應用 NSF,然後填充元件,這就是建立一個複合應用的過程。這個過程本身並不複雜,我們需要面對的非常關鍵的問題是如何開發那些滿足複合應用特性的 NSF 元件和 Eclipse 元件。

NSF 元件的開發

對一個複合應用的元件而言,最基本的部分是屬性和操作。所以對元件的開發而言,最重要的部分也將圍繞著屬性和操作來進行,大體上可以分為三個步驟:定義屬性和操作,屬性的釋出,操作的實現。

我們已經把在本應用例項中要使用的 NSF 元件開發好了,具體開發過程請參照其他 Notes 複合應用例項的文章。這個 NSF 元件是一個 Notes 檢視(All by Company),用於展示所有客戶列表如 圖 9 所示。作為一個 Notes 檢視,它本身提供了將所有客戶按公司名列舉的功能,我們希望它能夠在單擊檢視中的每個客戶文件時,對外傳送一個屬性:該客戶的公司名稱,該屬性的型別為字串(String)。同時我們希望它能夠在單擊檢視中一個按鈕時, 對外傳送一個屬性:最佳客戶列表的模板的路徑,該屬性的型別為統一資源定位符(URL)。


圖 9. All by Company Notes View
圖 9. All by Company Notes View

為此,我們給這個檢視所在的 NSF 資料庫定義一個 WSDL,在這個 WSDL 中我們將描述可對外發布的屬性 CustomerName 和 IdTable。作為一個 XML 檔案,WSDL 可以通過文字編輯器直接編寫(複合應用的熟練開發者一般青睞這種方式),也可以利用 Domino Designer 8 裡附帶的 WSDL 視覺化編輯器 Property Broker Editor 進行編輯,後者會自動生成 XML 程式碼。當我們在 Property Broker Editor 裡把定義屬性中 准許釋出(Allow publishing)選項選中時如 圖 10 所示,一個名為 publish_[屬性名稱] 的操作就會自動生成。在這裡我們釋出了兩個屬性,所以有兩個操作在 XML 檔案中被定義,如 清單 1 所示。


圖 10. Property Broker Editor——定義屬性
圖 10. Property Broker Editor——定義屬性

清單 1. WSDL 中對操作的定義

                

      
      
        
      



      
      
        
      


在 WSDL 中定義好屬性和操作之後,接下來的問題就是如何在 Notes 元素中實現屬性的釋出和操作的執行。對 All by Company 這個 Note 檢視元件而言,我們使用了兩種方式實現屬性的釋出。一種最簡單的做法是通過位於列的屬性裡的程式設計欄如 圖 11 所示釋出了 CustomerName 屬性,另一種方式是通過 LotusScript. 如 清單 2 所示釋出了 IdTable 屬性。


圖 11. 在編寫設定中指定所要釋出的屬性
圖 11. 在編寫設定中指定所要釋出的屬性

清單 2. 釋出屬性的 Lotusscript. 樣例程式碼

                
Sub Click(Source As Button)
	Dim s As New NotesSession, ws As New NotesUIWorkspace
	Dim uidb As NotesUIDatabase, db As NotesDatabase, doc As NotesDocument
	Set uidb = ws.CurrentDatabase 
	Set db = s.CurrentDatabase
'Handle error 4719, when script. is run without a property broker context
	On Error 4719 Goto err4719
	
'NotesPropertyBroker code 
	Dim pb As NotesPropertyBroker 'create new NotesPropertyBroker object
	Dim prop As NotesProperty
	Set pb = s.GetPropertyBroker
	If Not pb Is Nothing Then
		Set	prop = pb.getProperty("IdTable")
		Call	pb.setPropertyValue("Idtable","file:\\\C:\IdTable.odt")
		Call   prop.Publish()
		'Messagebox( prop.Values )
	End If
SkipPropertyBroker:
	If cContractPath$ = "" Then Exit Sub
err4719:
	Print "Error " & Str(Err) & ": " & Error$
	Resume skipPropertyBroker
End Sub

在程式碼中我們看到,Notes 8 中新增了一個 Notes 類 NotesPropertyBroker,通過該類,我們可以在 LotusScript. 中獲得當前 Notes 8 客戶端中的 Property Broker 物件,並執行相應的操作。在釋出屬性的時候,只要呼叫 propertyBroker 的 setPropertyValue 方法寫入屬性名和屬性值,再呼叫 propertyBroker 的 publish 方法即可完成屬性的釋出。同樣非常簡便!

對廣大 Notes 使用者而言,將 Notes 元素封裝成元件的好處在於:使用者可以充分利用現有的 Notes 資料庫,以模組化,元件化的 SOA 思想對它們加以改造。


Notes 8 中的 Symphony 元件

當然很多情況下,只依靠 NSF 元件構建 Notes 8 複合應用是不夠的。在做報表展現,圖形處理,以及一些其他業務應用的時候,傳統 Notes 開發會遇到一些瓶頸。在 Notes 8 中,我們可以通過 Eclipse 元件來彌補 NSF 元件功能上的不足。Notes 8 中新加入的文件編輯工具 Lotus Symphony 源自 Open Office 1.1 ,是基於 Lotus Expeditor 平臺的一個 Eclipse 的外掛應用。換句話說,本質上 Lotus Symphony 就是一個大的 Eclipse 外掛包。因為 Lotus Symphony 是基於 Eclipse 外掛結構 ,所以我們可以把它做成一個 Eclipse 元件來豐富複合應用的功能。開發複合應用的 Eclipse 元件需要具有 Eclipse 的外掛(plug-in)開發技能。關於 Eclipse 外掛開發細則以及 Eclipse 元件開發環境的配置,請參考 http://www.eclipse.org 上的相關文件,此處不再贅述。

與 NSF 元件一樣,Eclipse 元件的開發同樣遵循著 定義屬性和操作,屬性的釋出,操作的實現 三個步驟。在最新版本的 Notes 8 中 Lotus Symphony 已經為複合應用提供了一個預設的 Symphony 元件 Symphony View 如 圖 12 所示。


圖 12. 預設的 Symphony 元件 Symphony View
圖 12. 預設的 Symphony 元件 Symphony View

如果你所得到的 Notes 8 不是最新版,你所看到的元件選用板會和上圖不一樣,不過那也沒有關係,預設的 Symphony View 還是存在的,大家可以參照下面的複合應用組裝章節,來新增預設的 Symphony 元件到我們的複合應用中去。

Eclipse 元件中同樣使用 WSDL 來描述元件的屬性和操作,並且其格式與 NSF 元件的完全一致。預設的 Symphony 元件屬性和操作的定義檔案位於 \framework\shared\eclipse\plugins\ com.ibm.productivity.tools.ui.views_1.0.0.20071130-2008\views.wsdl 這裡我們定義了四個屬性,其中兩個屬性為對外發布,另外兩個屬性為接收其他元件傳來的訊息。

當我們儲存當前編輯文件時對外傳送一個屬性:文件儲存的路徑(FileSaved_Message),該屬性的型別為統一資源定位符(URL),對應操作 FileSaved_Operation;當我們對文件裡的文字物件做選擇時對外傳送一個屬性:當前選擇的文字(SelectionChanged_Message),該屬性型別為字串(String)對應操作 SelectionChanged_Operation;當我們要開啟其它元件指定的文件時要接收一個屬性:指定文件的路徑(LoadFile_Message),該屬性的型別為統一資源定位符(URL),對應操作 LoadFile_Operation;當我們要往當前文件游標位置插入指定字串時要接收一個屬性:指定的字串(Insert_Message),該屬性型別為字串(String)對應操作Insert_Operation。

作為一個 Notes 檢視,它本身提供了將所有客戶按公司名列舉的功能,我們希望它能夠在單擊檢視中的每個客戶文件時,對外傳送一個屬性:該客戶的公司名稱,該屬性的型別為字串(String)。同時我們希望它能夠在單擊檢視中一個按鈕時, 對外傳送一個屬性:最佳客戶列表的模板的路徑,該屬性的型別為統一資源定位符(URL)。Symphony 元件定義的屬性如 清單 3 所示。Symphony 元件定義的操作如 清單 4 所示。


清單 3. Symphony 元件定義的屬性

                

    


    


    


    



清單 4. Symphony 元件定義的操作
                

    
    
        
    


    
    
        
    
		

    
    
        
    


    
    
        
    
 

相應的操作實現程式碼都已經封裝在了 Lotus Symphony 外掛包裡。Lotus Symphony 通過這些屬性和操作為複合應用提供了簡單介面,給複合應用提供了簡單的文件編輯能力:開啟,儲存文件,插入字串,獲取當前選擇文字。當我們要更加緊密地實現 NSF 元件和 Lotus Symphony 元件之間的整合時我們就需要通過 Lotus Symphony API 來編寫 Eclipse 元件定製 Lotus Symphony,從而提供更多的介面與功能給其他複合應用的元件。我們會在另一篇文章裡介紹如何使用 Lotus Symphony API 來開發定製 Lotus Symphony。

TopCustomer 模板製作

我們這個應用例項是為了完成一個業務目的:建立 2007 年的最佳客戶名單。為此我們需要製作一個客戶名單的模板。請大家檢視我們在前面的 LotusScript. 程式碼中用到的一行程式碼:pb.setPropertyValue("Idtable","file:\\\C:\IdTable.odt")。其中 file:\\\C:\IdTable.odt 就是模板的存放地址。如 圖 13 所示模板中包含一個大標題和一個存放客戶名稱的表格。大家可以自行建立自己需要的模板格式,新增新的元素。


圖 13. TopCustomer 的模板
圖 13. TopCustomer 的模板 

複合應用的組裝

建立好了複合應用,開發好了元件,接下來就可以將這些元件加入到複合應用中,並進行組裝了。回到複合應用的編輯介面 CAE(Composite Application Editor)中,右邊的 sidebar 是元件選用板如 圖 14 所示。PIM 欄中列舉出了 Notes 8 中提供的開箱即用的元件,主要是郵件,日曆,待辦等內容,常規欄中則是使用者自定義的元件。右鍵選單中點選 新增元件,可以選擇 新增 NSF 元件 還是 Eclipse 元件。其中 Eclipse 元件又分為了 來自更新站點的,或者是 來自於本地的 兩種。後者在 Eclipse 元件的開發除錯過程中使用的比較多,正式使用時,一般會將 Eclipse 元件打包放到一個更新站點上,客戶端可以自動下載安裝。


圖 14. 元件選用板
圖 14. 元件選用板

新增 NSF 元件時需要指定元件的名稱,描述,以及 Notes URL 如 圖 15 所示。如果不熟悉 Notes URL 的寫法,可以通過瀏覽的方式獲取物件的 Notes URL 如 圖 16 所示。


圖 15. 加入 NSF 元件
圖 15. 加入 NSF 元件

在我們的應用例項中,All by Company 檢視是帶有導航欄的我們可以通過在 Notes URL 後面新增引數 &HideNavigator 來隱藏導航欄。


圖 16. 尋找元件物件
圖 16. 尋找元件物件

因為預設的 Lotus Symphony 元件已經被安裝到了本地,所以我們通過 來自本地 選項來新增 Lotus Symphony 元件如 圖 17 所示,其中 DefaultRichDocumentView 就是預設的 Lotus Symphony 元件(它和我們前面提到的最新 Notes 8 版本里的 Symphony View 是同一個元件,只是新老版本的名稱不一樣而已)。


圖 17. 加入 Eclipse 元件(從本地已安裝元件)
圖 17. 加入 Eclipse 元件(從本地已安裝元件)

現在我們就可以通過拖拽的方式將元件選用板上的元件新增到複合應用中去了。各個元件的位置也可以通過拖拽的方式進行調整。


圖 18. 調整元件位置
圖 18.  調整元件位置

在確定好元件的佈局之後,接下來的工作是非常關鍵的一步:連線。前文我們說到了 Property Broker 程式設計模式,其中一個基本的設計理念是:元件之間需要進行連線(Wiring)以匹配屬性和操作。而 CAE 中提供了視覺化的介面幫助開發者快速進行元件之間的連線如 圖 19 所示。


圖 19. 連線(Wiring)
圖 19. 連線(Wiring)

在複合應用的元件名稱處右鍵點選選單進入連線介面。在這個圖形介面中,使用者可以直接在型別匹配(屬性名稱可以不一致)的屬性和操作之間連線,從而將各個元件有機的聯絡在一起,實現應用的複合。複合,但絕不復雜,大部分的時候,它就是這麼簡單!


Lotus Symphony 的 LotusScript. 支援

Lotus Notes 是一個強大的協作、工作流平臺,很多廠商都把自己的業務建立在它的基礎之上。一直以來 Notes 與 文件編輯軟體的整合都是很多廠商所關注的問題。大家所熟悉的 Lotus Notes 與 Microsoft Office 或者 OpenOffice 在 Windows 作業系統中的整合都是通過 COM 呼叫來實現的。這些整合提高了使用者的工作效率,增加了各個軟體的可用性。在 Notes 8 中 IBM 的免費文件編輯器 Lotus Symphony 被作為一個元件緊密整合到了 Notes 中,給軟體開發商和客戶們提供了一種全新的更好的 Notes-office 整合方案。雖然我們有很多種方式來實現 Lotus Notes 與 Lotus Symphony 的整合。但是 LotusScript. 始終是關鍵的一種:

  • LotusScript. 是 Notes 中最重要的程式語言,它已經被 Notes 開發人員廣泛的使用。
  • Lotus Symphony 通過 StartBasic 的方式提供對 LotusScript. 的支援。StartBasic 是 OpenOffice 的指令碼語言,通過它可以訪問幾乎所有的 LotusSymphony 提供的功能。
  • StartBasic 的程式碼可以直接在 LotusScript. 環境中執行。這是因為 LotusScript. 可以直接訪問 COM 物件,並且 Lotus Symphony 提供了 UNO 物件和 COM 物件的對映。

注:要使用此功能請使用 Notes 8.0.1 以上的版本

在 清單 5 中所列的 LotusScript. 程式碼實現了,在當前編輯文件中插入一個帶有資料的表格的操作。


清單 5. Symphony 元件定義的操作

                
Sub Click(Source As Button)
    
    Set bjServiceManager = CreateObject("com.sun.star.ServiceManager")
    Set bjCoreReflection= 
        objServiceManager.createInstance("com.sun.star.reflection.CoreReflection")
    Set bjDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")
    Dim args()
    Set bjFrame=objDesktop.getCurrentFrame()
    Set bjDocument=objDesktop.getCurrentComponent ()
    Set bjText = objDocument.getText()
    Set bjCursor = objText.createTextCursor()
    objText.insertString objCursor, "The Sales History Of This company", False
    Set bjTable= objDocument.createInstance( "com.sun.star.text.TextTable")
    objTable.initialize 4, 4
    'Insert the table
    objText.insertTextContent objCursor, objTable, False
    'Get first row
    Set bjRows= objTable.getRows()
    Set bjRow= objRows.getByIndex(0)
    'Set the table background color
    objTable.setPropertyValue "BackTransparent", False
    objTable.setPropertyValue "BackColor", 13421823
    
'Set a different background color for the first row
    objRow.setPropertyValue "BackTransparent", False
    objRow.setPropertyValue "BackColor", 6710932
    'Fill the first table row
    
    objTable.getCellByName("A2").setValue 22.5
    objTable.getCellByName("B2").setValue 5615.3
    objTable.getCellByName("C2").setValue -2315.7
    objTable.getCellByName("D2").setFormula"sum "
    
    objTable.getCellByName("A3").setValue 21.5
    objTable.getCellByName("B3").setValue 615.3
    objTable.getCellByName("C3").setValue -315.7
    objTable.getCellByName("D3").setFormula "sum "
    
    objTable.getCellByName("A4").setValue 121.5
    objTable.getCellByName("B4").setValue -615.3
    objTable.getCellByName("C4").setValue 415.7
    objTable.getCellByName("D4").setFormula "sum "
    
'Create a paragraph break ( ControlCharacter::PARAGRAPH_BREAK).
    'objText.insertControlCharacter objCursor, 0, False 
    
    On Error Resume Next
    If Err Then
        Msgbox "An error occurred"
    End If 
End Sub

在程式碼中我們看到,我們通過 CreateObject("com.sun.star.ServiceManager") 方法獲得 LotusSymphony 的一個例項。通過 objDocument.createInstance( "com.sun.star.text.TextTable") 來建立一個表格,然後把一些資料填充進這個表格中。這裡不對 StartBasic 做更多的解釋了,請大家參看 OpenOffice SDK。對廣大 Notes 開發人員而言,用 LotusScript. 來訪問 Lotus Symphony 的方式實現起來更容易上手。

結束語

現在你就可以感受一下你剛剛組裝完成的這個 2007 最佳客戶名單複合應用了:點選 OpenIdTable 按鈕開啟我們製做的模板,把游標放到表格中 Name 欄下,在客戶列表中選擇一個客戶,這個客戶的公司名稱就會被插入到當前游標位置。你會感受到, 原來製作公文也可以這麼簡單,以前煩瑣的操作查詢、複製、貼上不見了,各個系統和文件編輯器之間的頻繁切換不見了,你只需點幾下滑鼠以前花費幾分鐘甚至幾個小時的工作頃刻間便完成了。這就是 Lotus Symphony 和複合應用共同給大家帶來的全新體驗。還在等什麼?趕緊開啟你的 Notes 8 開始你自己的複合應用,開始你自己的 Lotus Symphony 之旅吧!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14751907/viewspace-588819/,如需轉載,請註明出處,否則將追究法律責任。

相關文章