
一個(gè)簡單的Dataset Joint Example
一般來說,Eclipse插件開發(fā)用到GEF的機(jī)會(huì)并不是很多,大概也就是結(jié)構(gòu)設(shè)計(jì),數(shù)據(jù)管理,流程控制等應(yīng)用罷了。看了一下網(wǎng)上的例子,大部分都是基于數(shù)據(jù)庫管理的,我想這應(yīng)該是因?yàn)閿?shù)據(jù)庫設(shè)計(jì)的Dataset Joint是程序開發(fā)最常見的吧。
GEF的一個(gè)簡單Example可以參加GEF自帶的例子Logic,功能非常強(qiáng)大,了解了Logic,就能夠了解相應(yīng)的GEF開發(fā)。在網(wǎng)上這方面的教程并不多,我也基本上沒開,我個(gè)人始終認(rèn)為看書不如看代碼。當(dāng)然我以前也沒有接觸過GEF,畢竟要完全掌握這個(gè)東西并非一日之功,要想在上面有所造詣不通過一個(gè)大型項(xiàng)目的加強(qiáng)是不可能的。上面的這個(gè)小東西也是我花了半個(gè)月,還請(qǐng)教了一些人幫忙debug才研究出來的,還是花費(fèi)了相當(dāng)功夫。
不過GEF是一套框架,上面的這個(gè)小東西,麻雀雖小,五臟俱全,而且基本上可以算一個(gè)不依賴于Eclipse平臺(tái)的小應(yīng)用程序。不過GEF(Ver 3.3)這個(gè)項(xiàng)目依賴于Eclipse OSGI,如果想完全獨(dú)立于Eclipse,需要自己做一些小小的改變,也不算太麻煩。最后基本上SWT+JFACE+GEF基本上就可以自己做應(yīng)用了。
獨(dú)立于Eclipse的GEF簡單教程可以參見:
http://www13.plala.or.jp/observe/GEF/GEF_StandAlone.html
http://www13.plala.or.jp/observe/GEF/GEF_Tool_StandAlone.html
日文寫的,我看不懂,只看代碼。
這里我只說幾點(diǎn):
1、如果面板需要滾動(dòng)條,并且能夠自由伸縮,顯示的話,請(qǐng)選擇ScrollingGraphicalViewer,相應(yīng)的RootEditPart請(qǐng)選擇ScalableFreeformRootEditPart。
2、GraphicalViewer是通過EditPartFactory拿到子EditPart的,有些類似于JFace TreeViewer的ContentProvider,根據(jù)特定的Element拿到對(duì)應(yīng)的EditPart,不同于TreeViewer的是,GEF的getChildren方式是寫在EditPart里的,每一個(gè)EditPart都要實(shí)現(xiàn) protected List getModelChildren( ) 方法,而TreeViewer的getChilder是在ContentProvider內(nèi)部實(shí)現(xiàn)的。因此EditPart更為靈活,因?yàn)镋ditPart還可以通過EditPartFactory拿到上下文環(huán)境,而TreeViewer ContentProvider脫離了Viewer本身,只能通過Model來取,這樣當(dāng)Model和Viewer不一致的時(shí)候,GEF游刃有余,而TreeViewer卻舉步維艱。
3、EditPart的FeedBack Figure的背景顏色是和它的背景取異或操作的,因次再拖動(dòng)EditPart的時(shí)候,如果FeedBack Figure覆蓋EditPart的時(shí)候,F(xiàn)igure的顏色很難看,解決這個(gè)問題的辦法就是設(shè)置GraphicalViewer的背景顏色為白色。
4、希望EditPart能夠拖動(dòng),需要實(shí)現(xiàn)getDragTracker( )方法:
{
DragEditPartsTracker track = new DragEditPartsTracker( this );
return track;
}
5、刷新EditPart的顯示需要覆寫protected void refreshVisuals( )方法,當(dāng)Model的模型改變,需要刷新View的時(shí)候可以通過事件監(jiān)聽來顯示的調(diào)用該方法。
6、設(shè)置EditPart在父親EditPart的位置調(diào)用( (GraphicalEditPart) getParent( ) ). setLayoutConstraint(EditPart arg0, IFigure arg1, Object arg2)方法。
7、如果是XYLayoutEditPolicy,內(nèi)部EditPart位置的改變會(huì)調(diào)用XYLayoutEditPolicy的protected Command createChangeConstraintCommand( EditPart child,
Object constraint )方法,需要記錄EditPart位置可以在這里進(jìn)行。
8、EditPart的Selection事件需要注冊(cè)SelectionEditPolicy,你可以針對(duì)不同的EditPart實(shí)現(xiàn)不同的SelectionEditPolicy。
9、內(nèi)部有自由布局的EditPart需要注冊(cè)LayoutEditPolicy的子類。而該EditPart的Figure需要設(shè)置對(duì)應(yīng)的LayoutManager。
10、GraphicalViewer監(jiān)聽Key操作需要setKeyHandler(new KeyHandler(viewer))。
11、進(jìn)行連接操作的源EditPart需要實(shí)現(xiàn)protected List getModelSourceConnections( )方法,目標(biāo)EditPart需要實(shí)現(xiàn)protected List getModelTargetConnections( )方法,創(chuàng)建一個(gè)連接需要使用ConnectionDragCreationTool。連接圖形的EditPart必須繼承AbstractConnectionEditPart。實(shí)際上每個(gè)連接會(huì)被創(chuàng)建出2個(gè)EditPart,只有這2個(gè)EditPart的Model相等的時(shí)候,一個(gè)連接才會(huì)成立。
12、如果需要連接,需要注冊(cè)GraphicalNodeEditPolicy,并且實(shí)現(xiàn)protected org.eclipse.gef.commands.Command getConnectionCompleteCommand(
CreateConnectionRequest request )和protected org.eclipse.gef.commands.Command getConnectionCreateCommand(
CreateConnectionRequest request )方法。注冊(cè)代碼:
new ConnectionCreationEditPolicy( ) );
先寫到這兒,慢慢再補(bǔ)。