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