基於Eclipse GEF關鍵技術的分析與研究

基於Eclipse GEF關鍵技術的分析與研究(2007-03-31 16:54:28)java

2.Draw2D技術程序員

輕量級框架:輕量級框架[LightweightSystem]SWTDraw2D 鏈接起來,它把鼠標事件和畫圖事件從SWT 轉發給Draw2D的圖形上。它是Draw2D的核心類。canvas

LightweightSystem 主要包含三個組成部件:架構

1.根圖形[The root figure]: 根圖形是RootFigure類的實例,應用程序的根圖形必須創建在它之上。它繼承了一些SWT Canvas的圖形環境,如顏色,字體等。框架

2.事件轉發器[The event dispatcher]: 事件轉發器把SWT事件轉換成相應Draw2D事件。它能夠跟蹤那個圖形被聚焦,那個圖形是被鼠標點擊的目標圖形。它還控制tooltip的激活。它爲想捕捉鼠標的圖形提供支持。eclipse

3.更新管理器[The update manager]:更新管理器是負責畫和更新Draw2D圖形。當一個畫的請求被事件轉發器從SWT canvas發送到LightweightSystem上時,LightweightSystem調用更新管理器performUpdate()方法。通常管理器維持着一個List列表,該列表包含無效的或須要重畫的圖形。編輯器

圖形:[Figure]是全部在Draw2D用戶界面中看到的都是圖形。它在一個重量級的窗口中模擬一個重量級圖形系統。在不消耗太多系統資源狀況下,他們容許你建立一個複雜的圖形展現。圖形都應該創建在根圖形之上。ide

圖形的生命週期中,主要的過程是繪製和驗證。工具

繪製:Draw2D要求圖形負責本身的繪製,經過調用paint()完成,其繪製過程是:佈局

1.paintfigure() 圖形繪製自己

2.paintclientarea() 繪製該圖形的子圖形

3.paintborder() 繪製該圖形的修飾邊框

驗證:當圖形的大小或位置須要被計算時(如圖形的位置發生變化時)Draw2D將使用驗證。

1.validate( ) 要求圖形的佈局管理器從新佈局它的子圖形。

2.revalidate( ) 首先調用invalidate( )方法(該方法會使該圖形及其父鏈上的圖形無效),其次,添加該圖形及其父鏈到更新管理器的無效List上。

3.MVC

GEF的優點是提供了標準的MVC(Model-View-Control)結構。與其餘的一些MVC框架相比,GEF的一個主要設計目標是儘可能減小模型和視圖之間的依賴,好處是能夠根據須要選擇任意模型和視圖的組合,而沒必要受開發框架的限制。

GEFMVC框架的實現:

1.控制器[EditParts]:控制器是GEF中的核心元素,至關於MVC框架中的Controler,它們具體控制着模型元素到圖形的映射,即把模型與相應得圖形對應起來,並實現模型與圖形的相互做用。通常應該爲每一個模型元素建立對應的控制器,所以它們將有和模型元素相對應的類層次結構。

程序員能夠繼承三種EditPart,分別是

 org.eclipse.gef.editparts.AbstractGraphicalEditPart

 org.eclipse.gef.editparts.AbstractConnectionEditPart

 org.eclipse.gef.editparts.AbstractTreeEditPart

前兩個是爲了在編輯器[EditorPart]中用到,分別表示圖形和圖形之間的連線用。最後一個是在大綱[Outline]中用到。

下面咱們將關注一下控制器的生命週期:

控制器是在編輯器中經過工廠類建立的,該工廠根據不一樣的模型元素建立相應的控制器。控制器建立後並非馬上可見或處在激活狀態。當GEF框架得知控制器須要被激活時,控制器將處在激活的狀態。若是某個控制器不被須要時(如編輯器被關掉或用戶刪除控制器對應的模型),控制器將處在不激活的狀態。兩個方法EditPart#activateEditPart#deactivate分別對應上述過程。還有一個方法EditPart#isActive,將老是返回控制器的當前狀態。

2.模型[Model]:模型保存着業務邏輯,是GEF這中惟一能夠持久化的部分。爲了能讓控制器知道模型的變化,應該把控制器做爲事件監聽者註冊在模型中,當模型發生變化時,就出發相應的事件給控制器,後者負責通知各個視圖更新。

3.視圖[Figure]GEF提供了在EclipseWorkbench中使用Viewer,稱爲EditPartViewer。它的做用和jface中的 Viewer很相,不過這時候它的ContentProviderLabelProviderEditPart,經過setContents設置模型對象的根。EditPartViewer能夠適配到任何一個SWT控件,由於它要求有createControl方法,接受一個父SWT控件做爲適配對象,從而將 GEF生成的Figure對象顯示在這個SWT控件上,所以GEF可使用任何圖形包,不過GEF提供了對Draw2D的默認實現。

4.編輯器[EditorPart]:在這裏不得不介紹一下編輯器,由於通常都是由編輯器來組裝GEFMVCGEF的編輯器類是Eclipse編輯器的一個子類。在介紹編輯器以前先介紹幾個GEF中的概念:

編輯域[EditDomain] :編輯域是一個起到管理做用的類,它綁定了一個編輯器、若干個查看器和若干個工具。所以它定義了真實的編輯器。編輯域還提供一個命令堆棧,用來保存全部執行過的命令,有兩點好處:1.可實現重作和不作的操做2.可查看模型是否被改動。

工具[Tool] :狀態對象,根據當前的狀態和它所接受的事件來產生相應的請求並傳遞給控制器。

調色板[palette] :調色板是位於編輯器中的一個特定的查看器[Viewer],工具放在它上面。

編輯器主要實現如下功能 :

1.須要建立EditDomain

2.經過EditDomain,訪問命令堆棧,爲編輯器提供參考[如參考命令堆棧,編輯器決定是否容許存儲操做]

3.實現存儲功能。

4.裝配圖形查看器[GraphicalViewer]

5.裝配調色板[palette]

6.實現大綱[Outline]的掛接等等。

總結:編輯器利用工廠[EditPart Factory]根據模型建立對應的控制器[EditParts]。在控制器中經過它的設置圖形方法來把EditPart與圖形對應起來,這樣模型、控制器和圖形就一一對應了。

4.反饋技術

視覺反饋是一個圖形化編輯器用戶界面重要的組成部分。GEF用不少方法爲用戶提供反饋。

1.改變光標。當在圖形化編輯器上選定目標時,改變光標來顯示所選的目標是否支持該工具的操做。

2.區別被選的和被聚焦的部分。通常的,在相同類型的部分中,一個被選擇的部分應該和沒有被選擇的部分明顯的區分。這個能夠經過在部分外增長一個被選擇圖形或改變部分的顏色或形狀。

3.展現操做柄[handle]:操做柄也是一個圖形元素,通常出如今部分的四周,它表示圖形能夠被移動或是改變大小。

通常反饋技術是由編輯策略[EditPolicy]實現的。具體實現的是EditPolicy的子類GraphicalEditPolicyGEF提供一個反饋層,全部的反饋都在該層上顯示。層自己就是一個圖形,只不過對用戶來講是透明的。

下面介紹一下支持反饋的EditPolicy

1.SelectionEditPolicy :一個抽象類,它是提供控制器被選擇的反饋基礎。即當用戶在編輯器上選中圖形時,相應的圖形給以相應的反應以區分選中的和未選中的。要注意的反饋圖形被畫在反饋層上[LayerConstants.FEEDBACK_LAYER]。有以下方法包括在該類中:

 Protected void showFocus()

 Protected abstract void showSelection()

 protected void showPrimarySelection()

 protected void showFocus()

 protected abstract void hideSelection()

這幾個方法的英文名字表示了它們的含義,這裏就再也不一一介紹。

2.SelectionHandlesEditPolicy :這個類繼承了SelectionEditPolicy,它提供個帶控制點[handle]的選擇反饋。子類提供了一個控制點的List,該List將修飾被選擇的[控制器對應的]圖形。GEF中提供了以下繼承SelectionHandlesEditPolicy的子類:

1.BendpointEditPolicy :這個類在實現帶彎點的鏈接時,被鏈接的控制器調用。

2.ConnectionEndpointEditPolicy :在鏈接的兩端展現控制點。

3.NonResizableEditPolicy :阻止用戶改變圖形大小,並在被選圖形上添加一格簡單的黑框和在四個邊角處設置四個黑色小方框。如圖1所示。用戶能夠改變圖形的位置。

       

   1                             2

4.ResizableEditPolicy :這個類繼承NonResizableEditPolicy,在圖形的四周添加八個黑色小方框,用來增長改變圖形大小功能。如圖2所示。

2.GraphicalNodeEditPolicy :這個類提供關於鏈接的反饋。當用戶創建鏈接,從一個端點拖向另外一個端點,GEF經過該類模擬一個鏈接。這模擬的鏈接被畫在反饋層,它將鏈接到控制器提供的錨點[Anchor]

3.LayoutEditPolicy :這是一個抽象類,它用佈局管理器[LayoutManager]來放置它的子控制器圖形。該類應該提供反饋,一個新元素放到該類對應的圖形中的反饋。注意,這裏該類對應的圖形應該是一個容器圖形,即該圖形包含子圖形。關鍵方法以下:

1.showLayoutTargetFeedback :這個方法展現當前的操做將放圖形在什麼位置的反饋。

2.getSizeOnDropFeedback :展現將新建圖形的大小。

 

5.拖拽技術

在現代的應用程序中,程序要實現的一個最重要功能就是拖拽。該部分將討論GEF中的拖拽技術。

爲了使用戶在GEF應用中實現拖拽更加容易,GEF自己提供了一些類和概念。例如,你不須要處理SWT的拖拽源對象[DragSource]和其餘低級別的對象。

GEF中,用戶須要實現的就是向編輯查看器[EditPartViewwe]添加拖拽源監聽者[TransferDragSourceListener]和拖拽目標監聽者[TransferDrogTargetListener]。前者的可使編輯查看器成爲拖拽源,即支持用戶從該編輯查看器中往出拽,然後者可使編輯查看器成爲拖拽目標,即支持用戶向該編輯查看器裏拖。

當在GEF應用中爲查看器實現拖拽監聽者時,要確保該類繼承的父類來自於GEF框架。

拖拽原理:當用戶在支持拖拽源的查看器上拽出時,GEF框架產生一個相應的模版對象,該對象將從框架中得到用戶想要建立對象的類信息。當用戶在支持拖拽目標的查看器上鬆開鼠標時,拖放結束的事件將產生,TemplateTransferDropTargetListener對象將根據模版對象建立相應的實例。

用戶通常須要實現3個類 :

 TemplateTransferDropTargetListener :是TransferDrogTargetListener的子類。

 TemplateTransferDragSourceListener :是TransferDragSourceListener的子類。

CreationFactory :用來根據Template返回相應的對象

 



已有 0 人發表留言,猛擊->>這裏<<-參與討論


JavaEye推薦
相關文章
相關標籤/搜索