?
在gef項目中連線一直扮演這個不可或缺的角色。碰巧前段時間有個機會好好的看了這個部分的內容。下面就把我的一點點認識和大家分享。
首先要在模型上支持,能夠保存連接的信息。對于不同的項目有不同的要求。我們通過兩個例子就可以看出這一點來。
1、http://www13.plala.or.jp/observe/GEF/示例中的GEF6.zip (下面稱這個例子為HelloWold)
運行的結果入下圖所示:

它的模型可以使用如下的類圖來表示:

用來描述Connection的分別是LineConnectionModel和ArrowConnectionModel這兩個類。這兩個類的父類和圖形模型(HellowModel)相關。
2、IBM紅皮書中的GEF范例(下面稱這個例子為workflow)
運行效果如下圖:

他的模型可用下面的類圖描述:

其實連接的模型應該很簡單,他只要能保存他的兩端的對象就好了。圖形模型(如HelloWold中的HelloModel)能夠保持與他相關連的連接(HelloWold中的LineConnectionModel或ArrowConnectionModel)。
看完了Model,我們下面就可以看看EditPart部分了。
要看EditPart當然是要看最關鍵的了。也就是和連接直接關聯的EditPart了。分別察看了和連接相關的EditPart,發現他們都會實現一個叫org.eclipse.gef.NodeEditPart的接口。如下圖所示:

在nodeEditPart中有四個方法需要實現。通過這個四個方法的名字就可以看出他們和Anchor2密切相關。下面就來看看這幾個方法的具體功能:
ConnectionAnchor
getSourceConnectionAnchor(ConnectionEditPart connection);
當需要畫連接的時候,通過這個方法獲取連接的源錨點。不管這個錨點在什么位置,他取得以后直接就用它作為源點了。
ConnectionAnchor
getSourceConnectionAnchor(Request request);
當在準備創建連接的時候,通過Request來獲取新連接的源錨點。
另外的兩個就不再啰嗦了。是為了獲得目標的錨點。
但是我們肯定看到了HelloWold和Workflow中的連接有點不一樣。HelloWold中直接是圖元上的,而workflow是通過連接基本圖元上面的一個子圖元而連接的。簡單來說就是他們連接的anchor有點不一樣,這樣就會出現執行結果的不同。
下面來看看他們到底是怎么實現的。根據上面提到的。錨點的獲取是通過getSourceConnectionAnchor和getTargetConnectionAnchor方法來獲取的。我們只需要好好比對一下他們這幾個方法的不同就可以了。
HelloWold中的getSourceConnectionAnchor
public
ConnectionAnchor getSourceConnectionAnchor(Request request) {
returnnew
ChopboxAnchor(getFigure());
}
這里就簡單的創建一個
ChopboxAnchor
就好了。這個就可以直接連到該Figure上了。
在workflow中這個情況稍微有一點復雜了。先不說,還是看看他的
getSourceConnectionAnchor
是怎么實現的。
public
ConnectionAnchor getSourceConnectionAnchor(
ConnectionEditPart connection)
{
Connection edge = (Connection)
connection.getModel();
return
getNodeFigure().getConnectionAnchor(edge.getSource().getName());
}
/**
*returnsananchorgivenitsname
*
*@paramportNamenameoftheanchor
*@returntheanchorwiththename<code>portName</code>
*/
public
ConnectionAnchor getConnectionAnchor(String portName) {
return
(ConnectionAnchor)connectionAnchors.get(
portName );
}
protected
Hashtable connectionAnchors
= new
Hashtable(7);
/**
*Addaninputportanditsanchor
*
*@paramportName
*uniquenametorefertotheport
*/
publicvoid
addInput(String portName) {
InputPortFigure inputPort = new
InputPortFigure();
add(inputPort);
PortConnectionAnchor anchor = new
PortConnectionAnchor(inputPort);
getTargetConnectionAnchors().add(anchor);
connectionAnchors.put(portName,
anchor);
}
通過這幾個方法可以看出它是在添加Input時候就創建好了一個和PortFigure
相關Anchor并把它保存起來。在要用的時候就把它取出來。這樣就搞定了。
具體的可以參考這兩個例子的代碼。好了,打完收工。
參考文檔
IBM
紅皮書
1、荒野困獸(老臉歸來)’blog
2、GEF
進階,第一部分:
Anchor