??? 上回說到了如何在OOo之中應用其SDK所帶的類庫,這次重點說說OOo應用程序的應用環境。桌面環境由桌面對象和輔助對象組成。它通過框架 API 實現其功能。目前,框架 API 包括兩個組成部分:組件框架和分發框架。組件框架采用一種特殊的“框架 - 控制器 - 模型”模式來管理OOo 中的可視組件。分發框架處理來自 GUI 的命令請求。


??? 桌面環境
??? com.sun.star.frame.Desktop 服務是 OOo 應用程序框架的核心管理實例。所有 OOo 應用程序窗口都按框架分層組織,框架中包含可視組件。桌面是該分層的最頂層框架。

??? 通過桌面管理的可視組件包括三種不同的對象:具有文檔模型和控制器的成熟辦公軟件文檔、具有控制器但無模型的組件(例如文獻目錄和數據庫瀏覽器)以及不帶啟用了 API 的控制器的簡單窗口(例如預覽窗口)。這些組件類型的相同點是 com.sun.star.lang.XComponent 接口。帶有控制器的組件也稱作辦公軟件組件,而簡單窗口組件則稱作普通組件。

??? 下面重點說說 OOo 中的“框架 - 控制器 - 模型”模式

??? 著名的“模型 - 視圖 - 控制器 (MVC)”模式有三個應用領域:文檔數據(模型)、顯示(視圖)和交互(控制器)。OOo 中的“框架 - 控制器 - 模型 (FCM)”模式也是一個類似的抽象概念。FCM 模式與 MVC 模式在某些方面是相同的,但它們的目的不同,所以最好分別處理。MVC 模式和 FCM 模式中的模型和控制器是完全不同的。

??? OOo 中的 FCM 模式有三個應用領域:文檔對象(模型)、與模型的屏幕交互(控制器)以及控制器與窗口之間的聯系紐帶(框架)。

??? *模型包含文檔數據,還包含多種更改數據的方法(不必使用控制器對)。在模型中,可以直接訪問文本、圖形和工作表單元格。

??? *控制器掌握著文檔的當前視圖狀態并控制文檔的屏幕顯示,但是不能控制文檔數據。它監視模型的變化,并能夠通過復制使一個模型具有多個控制器。

??? *框架包含模型控制器,并了解與之一起使用的窗口,但沒有窗口功能。
??? FCM 的目的是使系統具備三個與可交換窗口系統配套使用的可交換部件:

??? 框架
??? 在“框架 - 控制器 - 模型”模式中,框架的主要角色是擔任可視組件和窗口系統之間的聯系紐帶。框架可以包含一個組件,或者一個組件與一個或多個子框架。構造框架時,必須使用容器窗口對框架進行初始化(使用com.sun.star.frame.XFrame:initialize())。這種方法需要具有外圍窗口實例的com.sun.star.awt.XWindow 接口,它將成為框架的容器窗口。傳送給 initialize() 的窗口實例還必須支持 com.sun.star.awt.XTopWindow 才能成為容器窗口。支持com.sun.star.awt.XTopWindow 并不意味著容器窗口獨立于帶有標題欄和系統菜單的底層窗口系統。XTopWindow 可在需要時充當窗口,但也可以固定或根據外圍應用程序窗口而改變位置。

??? 將框架添加到桌面框架分層中后,桌面就成為框架的父級框架。因此,需要將桌面的com.sun.star.frame.XFramesSupplier 接口傳送給 XFrame 接口中的 setCreator() 方法。在桌面提供的 com.sun.star.frame.XFrames 接口中調用 append() 方法時,內部就會發生這一過程。

??? 框架中的組件
“桌面環境”一節介紹了可以插入到框架中的三種可視組件。如果組件帶有控制器和模型 (例如文檔),或者只有控制器(例如文獻目錄和數據庫瀏覽器),該組件就能實現接口com.sun.star.frame.XController 所表示的 com.sun.star.frame.Controller 功能。

??? 控制器
OOo 中的 控制器介于框架和文檔模型之間。這是它的基本作用,它具有 getModel() 和 getFrame() 兩個方法。getFrame() 方法提供控制器所附著的框架。getModel() 方法返回一個文檔模型,但是,如果組件沒有文檔模型,它可能返回一個空引用。

??? 分別從框架、控制器和模型中獲取另外兩方
??? 開發人員通常需要使用已加載文檔模型的控制器和框架。OOo 文檔模型的com.sun.star.frame.XModel 接口通過其 com.sun.star.frame.XController 接口獲取可以訪問框架的控制器。下圖顯示了從文檔模型中獲取控制器和框架以及從控制器或框架中獲取文檔模型的方法。從框架中獲取相應的組件和容器窗口。

OOo.JPG




本文依據《創作共用約定》之“署名-禁止派生-非商業用途”方式發布,即你可以免費拷貝、分發、呈現和表演當前作品,但是必須基于以下條款:

  • 署名:你必須明確標明作者的名字。

  • 非商業用途:你不可將當前作品用于商業目的。

  • 禁止派生:你不可更改、轉變或者基于此作品重新構造為新作品。

對于任何二次使用或分發,你必須讓其他人明確當前作品的授權條款。

在得到作者的明確允許下,這里的某些條款可以放棄。