一个简单的Dataset Joint Example
一般来说,Eclipse插件开发用到GEF的机会并不是很多,大概也就是结构设计,数据管理,流程控制等应用罢了。看了一下网上的例子,大部分都是基于数据库管理的,我想这应该是因为数据库设计的Dataset Joint是程序开发最常见的吧。
GEF的一个简单Example可以参加GEF自带的例子Logic,功能非常强大,了解了Logic,就能够了解相应的GEF开发。在网上这方面的教程并不多,我也基本上没开,我个人始终认为看书不如看代码。当然我以前也没有接触过GEF,毕竟要完全掌握这个东西并非一日之功,要想在上面有所造诣不通过一个大型项目的加强是不可能的。上面的这个小东西也是我花了半个月,还请教了一些人帮忙debug才研究出来的,还是花费了相当功夫。
不过GEF是一套框架,上面的这个小东西,麻雀虽小,五脏俱全,而且基本上可以算一个不依赖于Eclipse平台的小应用程序。不过GEF(Ver 3.3)这个项目依赖于Eclipse OSGI,如果想完全独立于Eclipse,需要自己做一些小小的改变,也不算太麻烦。最后基本上SWT+JFACE+GEF基本上就可以自己做应用了。
独立于Eclipse的GEF简单教程可以参见:
http://www13.plala.or.jp/observe/GEF/GEF_StandAlone.html
http://www13.plala.or.jp/observe/GEF/GEF_Tool_StandAlone.html
日文写的,我看不懂,只看代码。
这里我只说几点:
1、如果面板需要滚动条,并且能够自由伸缩,显示的话,请选择ScrollingGraphicalViewer,相应的RootEditPart请选择ScalableFreeformRootEditPart。
2、GraphicalViewer是通过EditPartFactory拿到子EditPart的,有些类似于JFace TreeViewer的ContentProvider,根据特定的Element拿到对应的EditPart,不同于TreeViewer的是,GEF的getChildren方式是写在EditPart里的,每一个EditPart都要实现 protected List getModelChildren( ) 方法,而TreeViewer的getChilder是在ContentProvider内部实现的。因此EditPart更为灵活,因为EditPart还可以通过EditPartFactory拿到上下文环境,而TreeViewer ContentProvider脱离了Viewer本身,只能通过Model来取,这样当Model和Viewer不一致的时候,GEF游刃有余,而TreeViewer却举步维艰。
3、EditPart的FeedBack Figure的背景颜色是和它的背景取异或操作的,因次再拖动EditPart的时候,如果FeedBack Figure覆盖EditPart的时候,Figure的颜色很难看,解决这个问题的办法就是设置GraphicalViewer的背景颜色为白色。
4、希望EditPart能够拖动,需要实现getDragTracker( )方法:
public DragTracker getDragTracker( Request req )
{
DragEditPartsTracker track = new DragEditPartsTracker( this );
return track;
}
5、刷新EditPart的显示需要覆写protected void refreshVisuals( )方法,当Model的模型改变,需要刷新View的时候可以通过事件监听来显示的调用该方法。
6、设置EditPart在父亲EditPart的位置调用( (GraphicalEditPart) getParent( ) ). setLayoutConstraint(EditPart arg0, IFigure arg1, Object arg2)方法。
7、如果是XYLayoutEditPolicy,内部EditPart位置的改变会调用XYLayoutEditPolicy的protected Command createChangeConstraintCommand( EditPart child,
Object constraint )方法,需要记录EditPart位置可以在这里进行。
8、EditPart的Selection事件需要注册SelectionEditPolicy,你可以针对不同的EditPart实现不同的SelectionEditPolicy。
9、内部有自由布局的EditPart需要注册LayoutEditPolicy的子类。而该EditPart的Figure需要设置对应的LayoutManager。
10、GraphicalViewer监听Key操作需要setKeyHandler(new KeyHandler(viewer))。
11、进行连接操作的源EditPart需要实现protected List getModelSourceConnections( )方法,目标EditPart需要实现protected List getModelTargetConnections( )方法,创建一个连接需要使用ConnectionDragCreationTool。连接图形的EditPart必须继承AbstractConnectionEditPart。实际上每个连接会被创建出2个EditPart,只有这2个EditPart的Model相等的时候,一个连接才会成立。
12、如果需要连接,需要注册GraphicalNodeEditPolicy,并且实现protected org.eclipse.gef.commands.Command getConnectionCompleteCommand(
CreateConnectionRequest request )和protected org.eclipse.gef.commands.Command getConnectionCreateCommand(
CreateConnectionRequest request )方法。注册代码:
installEditPolicy( EditPolicy.GRAPHICAL_NODE_ROLE,
new ConnectionCreationEditPolicy( ) );
先写到这儿,慢慢再补。