目標:建立連線
gef的連線:
gef中的連線也被當成模型來看待。連線這種模型擁有起點source和終點target,它們都被稱為節點node。
建立連線的步驟:
1. 建立連線模型connectionmodel及其控制器editpart
連線的控制器一般由org.eclipse.gef.editparts.abstractconnectioneditpart派生。
不要忘記在partfactory這個負責建立editparts的工廠裡把連線模型與控制器聯絡起來。
2. 修改節點模型及其editpart
本例中連線的節點是hellomodel,所以hellomodel要增加兩個list:sourceconnections與targetconnections。注意sourceconnections指當前model為起點(source)的所有連線,也就是出去的連線outgoingconnections,更標準的寫法是modelsourceconnections,可以記為「以當前model為source的connections」。targetconnections正好相反。
節點模型的editpart要實現nodeeditpart介面。簡單理解的話,這個介面定義了連線的錨點anchor。連線模型不是直接與節點相連,而是通過錨點與節點聯絡起來的。
一般使用org.eclipse.draw2d.chopboxanchor,如本例:
public connectionanchor getsourceconnectionanchor(connectioneditpart connection)
chopboxanchor定位在figure(傳入引數)的邊界上,其延長線與figure的中心相交。
此外,還有labelanchor(指向label的圖示icon的中心),ellipseanchor(處理橢圓形邊界的figure)和xyanchor(可以自由定義anchor的位置)。
nodeeditpart介面定義的錨點用於三個地方:a. 正常顯示;b. 建立連線中途(此時還沒有connectioneditpart)用來顯示feedback;c. 重定向連線時用來顯示feedback。b對應的request是createconnectionrequest,c對應的是reconnectrequest,可以由此在下面的方法中區別處理。《這增進了一種思路,雖然不一定有實際用途》
public connectionanchor getsourceconnectionanchor(request request)
最後要使connectioneditpart能夠處理節點增刪連線的事件,更新檢視。
refreshsourceconnections()方法用來更新出去的連線,它需要呼叫getmodelsourceconnections()方法,我們需要過載它,讓它返回節點的所有source connections模型。(可模擬getmodelchildren方法對contentseditpart的作用)
refreshtargetconnections()方法用來處理進入的連線incoming connections。
protected list getmodeltargetconnections()
3. 在palette上加上「連線」工具
4. 修改連線模型
在連線模型中增加起點source與終點target物件,並新增attachsource,detachsource,attachtarget與detachtarget方法。
5. 建立連線命令
過載了canexecute方法,限制自身連線。
6. 實現連線相關的policy並安裝
負責連線建立的policy是org.eclipse.gef.editpolicies.graphicalnodeeditpolicy。需要過載如下方法:
// 建立連線。是source節點的控制器呼叫的該方法。
protected command getconnectioncreatecommand(createconnectionrequest request)
// 完成連線。是target節點的控制器呼叫的該方法。
protected command getconnectioncompletecommand(createconnectionrequest request)
生成建立連線命令與前面的例子不一樣,因為這個操作涉及到了兩個節點的控制器。
很明顯,這個policy要安裝在節點控制器上(helloeditpart),使用的role是editpolicy.graphical_node_role。
7. 修改deletecommand使得刪除節點時相關連線也自動刪除
8. 建立帶箭頭的連線
連線預設使用polylineconnection作為figure(繼承自abstractconnectioneditpart)。我們可以給polylineconnection加上裝飾 polygondecoration——實心的三角箭頭。
polylineconnection.settargetdecoration(new polygondecoration());
也可以使用polylinedecoration——三角箭頭。
這兩種裝飾都可以通過setscale方法設定大小。
GEF自學筆記
gef模型 控制器完美分離模型跟檢視。但是控制器負擔重。於是gef通過請求和編輯策略及命令模式很好的解決了控制器的負擔。使每一部分保持最小的依賴。gef命令請求及響應流程如下。1.接收使用者操作,轉換成相應請求 2.控制器接收請求並把請求交由相應的編輯策略管理器處理 3.編輯策略管理器根據請求的請求...
Spring AOP中文教程
僅僅用配置檔案便可把程式的每一部分組裝起來。四個bean定義的次序並不重要。我們現在有了乙個advice,乙個包含了正規表示式pointcut的advisor,乙個主程式類和乙個配置好的介面,通過工廠ctx,這個介面返回自己本身實現的乙個引用。beanimpl和testbeforeadvice都是直...
Beautiful Soup 中文教程
beautiful soup 是乙個處理python html xml的模組,功能相當強勁,最近仔細的看了一下他的幫助文件,終於看明白了一些。準備好好研究一下,順便將beautiful soup的一些用法整理一下,放到這個wiki上面,那個文件確實不咋地。beautiful soup 中文教程 的官...