??? 上回說到了如何在OOo之中應(yīng)用其SDK所帶的類庫,這次重點說說OOo應(yīng)用程序的應(yīng)用環(huán)境。桌面環(huán)境由桌面對象和輔助對象組成。它通過框架 API 實現(xiàn)其功能。目前,框架 API 包括兩個組成部分:組件框架和分發(fā)框架。組件框架采用一種特殊的“框架 - 控制器 - 模型”模式來管理OOo 中的可視組件。分發(fā)框架處理來自 GUI 的命令請求。
??? 桌面環(huán)境
??? com.sun.star.frame.Desktop 服務(wù)是 OOo 應(yīng)用程序框架的核心管理實例。所有 OOo 應(yīng)用程序窗口都按框架分層組織,框架中包含可視組件。桌面是該分層的最頂層框架。
??? 通過桌面管理的可視組件包括三種不同的對象:具有文檔模型和控制器的成熟辦公軟件文檔、具有控制器但無模型的組件(例如文獻目錄和數(shù)據(jù)庫瀏覽器)以及不帶啟用了 API 的控制器的簡單窗口(例如預(yù)覽窗口)。這些組件類型的相同點是 com.sun.star.lang.XComponent 接口。帶有控制器的組件也稱作辦公軟件組件,而簡單窗口組件則稱作普通組件。
??? 下面重點說說 OOo 中的“框架 - 控制器 - 模型”模式
??? 著名的“模型 - 視圖 - 控制器 (MVC)”模式有三個應(yīng)用領(lǐng)域:文檔數(shù)據(jù)(模型)、顯示(視圖)和交互(控制器)。OOo 中的“框架 - 控制器 - 模型 (FCM)”模式也是一個類似的抽象概念。FCM 模式與 MVC 模式在某些方面是相同的,但它們的目的不同,所以最好分別處理。MVC 模式和 FCM 模式中的模型和控制器是完全不同的。
??? OOo 中的 FCM 模式有三個應(yīng)用領(lǐng)域:文檔對象(模型)、與模型的屏幕交互(控制器)以及控制器與窗口之間的聯(lián)系紐帶(框架)。
??? *模型包含文檔數(shù)據(jù),還包含多種更改數(shù)據(jù)的方法(不必使用控制器對)。在模型中,可以直接訪問文本、圖形和工作表單元格。
??? *控制器掌握著文檔的當(dāng)前視圖狀態(tài)并控制文檔的屏幕顯示,但是不能控制文檔數(shù)據(jù)。它監(jiān)視模型的變化,并能夠通過復(fù)制使一個模型具有多個控制器。
??? *框架包含模型控制器,并了解與之一起使用的窗口,但沒有窗口功能。
??? FCM 的目的是使系統(tǒng)具備三個與可交換窗口系統(tǒng)配套使用的可交換部件:
??? 框架
??? 在“框架 - 控制器 - 模型”模式中,框架的主要角色是擔(dān)任可視組件和窗口系統(tǒng)之間的聯(lián)系紐帶。框架可以包含一個組件,或者一個組件與一個或多個子框架。構(gòu)造框架時,必須使用容器窗口對框架進行初始化(使用com.sun.star.frame.XFrame:initialize())。這種方法需要具有外圍窗口實例的com.sun.star.awt.XWindow 接口,它將成為框架的容器窗口。傳送給 initialize() 的窗口實例還必須支持 com.sun.star.awt.XTopWindow 才能成為容器窗口。支持com.sun.star.awt.XTopWindow 并不意味著容器窗口獨立于帶有標(biāo)題欄和系統(tǒng)菜單的底層窗口系統(tǒng)。XTopWindow 可在需要時充當(dāng)窗口,但也可以固定或根據(jù)外圍應(yīng)用程序窗口而改變位置。
??? 將框架添加到桌面框架分層中后,桌面就成為框架的父級框架。因此,需要將桌面的com.sun.star.frame.XFramesSupplier 接口傳送給 XFrame 接口中的 setCreator() 方法。在桌面提供的 com.sun.star.frame.XFrames 接口中調(diào)用 append() 方法時,內(nèi)部就會發(fā)生這一過程。
??? 框架中的組件
“桌面環(huán)境”一節(jié)介紹了可以插入到框架中的三種可視組件。如果組件帶有控制器和模型 (例如文檔),或者只有控制器(例如文獻目錄和數(shù)據(jù)庫瀏覽器),該組件就能實現(xiàn)接口com.sun.star.frame.XController 所表示的 com.sun.star.frame.Controller 功能。
??? 控制器
OOo 中的 控制器介于框架和文檔模型之間。這是它的基本作用,它具有 getModel() 和 getFrame() 兩個方法。getFrame() 方法提供控制器所附著的框架。getModel() 方法返回一個文檔模型,但是,如果組件沒有文檔模型,它可能返回一個空引用。
??? 分別從框架、控制器和模型中獲取另外兩方
??? 開發(fā)人員通常需要使用已加載文檔模型的控制器和框架。OOo 文檔模型的com.sun.star.frame.XModel 接口通過其 com.sun.star.frame.XController 接口獲取可以訪問框架的控制器。下圖顯示了從文檔模型中獲取控制器和框架以及從控制器或框架中獲取文檔模型的方法。從框架中獲取相應(yīng)的組件和容器窗口。
本文依據(jù)《創(chuàng)作共用約定》之“署名-禁止派生-非商業(yè)用途”方式發(fā)布,即你可以免費拷貝、分發(fā)、呈現(xiàn)和表演當(dāng)前作品,但是必須基于以下條款:
-
署名:你必須明確標(biāo)明作者的名字。
-
非商業(yè)用途:你不可將當(dāng)前作品用于商業(yè)目的。
-
禁止派生:你不可更改、轉(zhuǎn)變或者基于此作品重新構(gòu)造為新作品。
對于任何二次使用或分發(fā),你必須讓其他人明確當(dāng)前作品的授權(quán)條款。
在得到作者的明確允許下,這里的某些條款可以放棄。