韓菲帆
摘 要:通過對Eclipse平臺和GEF框架的介紹,分析了Eclipse平臺在圖形編輯方面的優(yōu)越性。結合本體編輯,設計并實現(xiàn)了基于Eclipse 平臺下的本體編輯器,對編輯器的系統(tǒng)結構做了詳細地分析。編輯器由模型、視圖、控制器三部分組成,由于采用基于MVC 模式的GEF 框架,使得軟件結構清晰,明顯縮短了軟件的開發(fā)周期,提高了軟件的可維護性和代碼的重用性。
關鍵詞:Eclipse;本體論;圖形編輯框架;模型——視圖——控制器
1 MVC設計模式
MVC 是一種設計模式,它強制性地把應用程序的輸入、處理和輸出分開。 MVC 把應用程序分成3 個核心模塊:模型、視圖和控制器。
模型:軟件所處理問題邏輯在獨立于外在顯示內(nèi)容和形式情況下的內(nèi)在抽象,封裝了問題的核心數(shù)據(jù)、邏輯和功能的計算關系,它獨立于具體的界面表達和I/ O操作。
視圖:把表示模型數(shù)據(jù)及邏輯關系和狀態(tài)的信息及特定形式展示給用戶。 它從模型獲得顯示信息,對于相同的信息可以有多個不同的顯示形式或視圖。
控制器:處理用戶與軟件的交互操作的,其職責是控制提供模型中任何變化的傳播,確保用戶界面于模型間的對應聯(lián)系;它接受用戶的輸入,將輸入反饋給模型,進而實現(xiàn)對模型的計算控制,是使模型和視圖協(xié)調(diào)工作的部件。通常一個視圖具有一個控制器。
2 GEF 圖形編輯框架
GEF ( Graphical Editing Framework) 是Eclipse平臺下的圖形編輯插件,可用于為已有的應用創(chuàng)建一個圖形編輯器界面。GEF運用基于SWT 繪圖插件Draw2d 在Eclipse 中創(chuàng)建圖形環(huán)境。利用GEF提供的公共方法或者在特殊的領域下可以擴展它們GEF 使用能簡潔地改變應用于視圖1 GEF結構圖圖模型的MVC 架構。 GEF 是一個能為大多數(shù)程序提供鏈接和構造基礎的完整應用。包括:流程構造器、圖形界面構造器、UML 圖表編輯器(例如流程圖和類圖) ,及類似于HTML 的所見即所得的文本編輯器。
圖1給出了GEF結構圖。
3 本體圖形編輯器的設計與實現(xiàn)
3.1 數(shù)據(jù)模型的設計
數(shù)據(jù)模型對象負責存儲顯示內(nèi)容的抽象,所有的核心數(shù)據(jù)都存儲在model 對象中。數(shù)據(jù)模型主要包括兩大部份:代表節(jié)點的node 模型和代表連接的connection 模型,每一個節(jié)點模型和每一個連接模型都代表一個本體語言中的一個語法元素。 數(shù)據(jù)模型代表了本體語言中的元素,各種模型之間的關系必須符合本體語言的語法關系,節(jié)點模型主要是表示本體語言中的各種基本元素,如類、屬性、實例等。連接模型:連接模型主要是表示本體語言中的各種關系,如子類父類的繼承關系、子屬性父屬性的繼承關系、類與實例的關系等。node模型示意代碼如下:
public class Node extends Element {
…………………..
//模型位置和尺寸的確定
protected Point location = new Point(0,0);
protected Dimension size = new Dimension(100,150);
//連接起點和終點集合的定義
private List souceConnection=new ArrayList();
private List targetConnection=new ArrayList();
public void addtargetConnection(Object connection){
this.targetConnection.add(connection);
firePropertyChange(PROP_INPUTS,null,null);
}
public void addsourceConnection(Object connection){
this.soouceConnection.add(connection);
firePropertyChange(PROP_OUTPUTS,null,null);
}
public void setLocation(Point p) {
if (this.location.equals(p)) {
return;
}
this.location = p;
firePropertyChange(PROP_LOCATION,null,p);
}
public void setSize(Dimension d) {
if (this.size.equals(d)) {
return;
}
this.size = d;
firePropertyChange(PROP_SIZE,null,d);
}
…………………
}
圖2 View的實現(xiàn)圖
圖3 Draw2D結構圖
3.2 視圖的設計
如圖2所示:視圖是應用軟件的表示部分,用于展現(xiàn)數(shù)據(jù)模型的內(nèi)容,是用戶與編輯器交互的窗口。 它向用戶提供一個友好界面,使得用戶能夠使用圖形化的方式方便地查看、編寫指定的文件。編輯器的視圖部分主要包括主菜單區(qū)、工具區(qū)、編輯區(qū)。主菜單區(qū)主要是顯示整個編輯器的所有文件;工具區(qū)則是顯示各種基本圖形模型,主要圖形的編輯就是將工具區(qū)的圖形模型拖放到編輯區(qū),以實現(xiàn)基本本體圖形的編輯;編輯區(qū)是整個編輯器的核心部分,它是一個大視圖,整個本體的圖形展示都在編輯區(qū),各種基本圖形的屬性及它們之間的關系都在編輯區(qū)中實現(xiàn)。雖然GEF可以使用任何圖形包作為View層,但實際上GEF對Draw2D的依賴是很強的。圖3是Draw2D結構圖,Draw2D是基于SWT的圖形處理包。如果一個應用僅需要顯示圖形,只用Draw2D就足夠了;若該應用的模型要求以圖形化的方式被編輯,那么最好使用GEF。
舉例來說:EditPart(org.eclipse.gef.EditPart)接口并不要求引入任何Draw2D的類,但最常使用的AbstractGraphicalEditPart類的CreateFigure()方法就需要返回IFigure類型。由于這個原因,在GEF的SDK中索性包含Draw2D包就不奇怪了。
3.3 控制器的設計
GEF框架的控制器稱為EditPart 。每一個模型都對應著一個EditPart ,主要作用是將模型和視圖聯(lián)接起來,實現(xiàn)模型與視圖之間的同步操作。 為了實現(xiàn)代碼的重用,EditPart被分為Command 和EditPolicy 兩部分。同一個EditPolicy 可以被安裝到多個EditPart中,同一個Command 也可以被多個EditPolicy 所使用。當圖形模型發(fā)生改變的時候,圖形模型對應的EditPart 中的EditPolicy 通過傳遞過來的參數(shù),產(chǎn)生相應的命令對象,從而通過命令對象來實現(xiàn)對模型的更新修改。
當用戶有請求時,Editpart 獲得該請求,通過已有的各種策略來判斷應發(fā)出的命令,并向數(shù)據(jù)模型發(fā)出與該請求對應的命令,使得數(shù)據(jù)模型發(fā)生改變,而對模型的改變會即時獲得語法檢查,以決定該請求是否合法。若合法,則向Editpart 發(fā)出屬性改變的消息,最后由Editpart 將對模型的修改結果返回給視圖,成為用戶可見的結果??刂破魇疽獯a如下:
public abstract class NodePart extends AbstractGraphicalEditPart implements PropertyChangeListener,NodeEditPart {
…………………
//對不同的請求刷新視圖
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(Node.PROP_LOCATION))
refreshVisuals();
else if (evt.getPropertyName().equals(Node.PROP_SIZE))
refreshVisuals();
else if (evt.getPropertyName().equals(Node.PROP_INPUTS))
refreshTargetConnections();
else if (evt.getPropertyName().equals(Node.PROP_OUTPUTS))
refreshSourceConnections();
}
//安裝Policy
protected void createEditPolicies() {
installEditPolicy(EditPolicy.COMPONENT_ROLE,new NodeEditPolicy());
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,new
NodeGraphicalNodeEditPolicy());
installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,new
NodeDirectEditPolicy());