以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 Java/Eclipse 』  (http://bbs.xml.org.cn/list.asp?boardid=41)
----  [转帖]GEF实践总结(一)简洁的基础框架  (http://bbs.xml.org.cn/dispbbs.asp?boardid=41&rootid=&id=76630)


--  作者:hongjunli
--  发布时间:9/8/2009 12:14:00 PM

--  [转帖]GEF实践总结(一)简洁的基础框架

关键字: gef实践 基础框架
一. 创建一个插件项目
通过从RCP application with a view 模板创建一个含ViewPart的Eclipse RCP项目。


此主题相关图片如下:
按此在新窗口浏览图片


二. 在MANIFEST.MF 添加对org.eclipse.gef插件的依赖。

此主题相关图片如下:
按此在新窗口浏览图片

三. 创建model
为了方便使用,我们了创建BaseModel和BaseContainerModel这两种基类。


此主题相关图片如下:
按此在新窗口浏览图片
BaseModel :所有模型的最基础类。一定要能够明白里面的PropertyChangeSupport和firePropertyChange的意义。
BaseContainerModel :父模型。
DiagramModel :最底层的模型,就跟jface.TreeViewer中,最底层的模型总是不显示的,从界面上无法直接看到,但却又真实存在。
RectModel :最简单的一个图形相关的模型,用来表示一个矩形。

注意: 我偷了一个懒,一般属性我fire的propertyName都是IPropertyConst.COMMON,只有添加、删除children的时候,对外fire的是IPropertyConst.CHILDREN。


四. 创建model对应的EditPart
同样的,我也创建了BaseEditPart和BaseContainerEditPart两个基础类型。

此主题相关图片如下:
按此在新窗口浏览图片

BaseEditPart :所有EditPart的基础类。extends于AbstractGraphicalEditPart,同时实现了PropertyChangeListener接口。
注意: propertyChange中对于IPropertyConst. CHILDREN 和IPropertyConst.COMMON 的不同属性改变的不同处理。

BaseContainerEditPart :所有父模型的基础类。作用和BaseContainerModel类似,都是为了处理父子结构。
注意:覆盖了getModelChildren()方法。

DiagramEditPart :DiagramModel对应的EditPart。
RectEditPart :RectModel对应的EditPart。

DiagramEditPartFactory :通过model得知应该创建哪种对应的EditPart。就和jface.TableView一样,知道通过model得到TableItem。和jface.TreeViewer一样,通过model知道生成TreeItem一样的功效。只是在GEF中model和EditPart过多,需要一个工厂类专门处理,而TableViewer和TreeViewer则不需要。

五. 创建EditPart对应的Figure


此主题相关图片如下:
按此在新窗口浏览图片

IBaseFigure :为了后面能方便获得模型而做的接口。
DiagramFigure :与DiagramEditPart对应。
RectFigure :与RectEditPart对应。


六. 在ViewPart中创建GraphicalViewer

Java代码
graphicalViewer = new ScrollingGraphicalViewer();   
graphicalViewer.createControl(bottomComposite);   
  
graphicalViewer.setRootEditPart(new ScalableRootEditPart());   
graphicalViewer.setEditPartFactory(new DiagramEditPartFactory());   
  
graphicalViewer.setContents(this.buildModel());  

graphicalViewer = new ScrollingGraphicalViewer();
graphicalViewer.createControl(bottomComposite);

graphicalViewer.setRootEditPart(new ScalableRootEditPart());
graphicalViewer.setEditPartFactory(new DiagramEditPartFactory());

graphicalViewer.setContents(this.buildModel());

代码很简洁,没有做任何多余的事情,先create一个GraphicalViewer,在赋予一个Root的EditPart,再指定EditPartFactory,最后,将构建的模型放入GraphicalViewer中。

七. 启动,查看运行效果


此主题相关图片如下:
按此在新窗口浏览图片

注意:

第一个灰边框:ViewPart的。
第二个黑边框:DiagramModel对应的DiagramFigure的。
第三个小框:RestModel对应的RestFigure的。

八. 总结
1. 写的非常简洁,没有Command,没有EditPolicy,没有多余的属性和方法,就基本将一个GEF的项目搭建出来了,完全可以作为通用的GEF框架。当然,前提是纯粹的GEF,而不是EMF,GMF等。
2. GEF中有些概念一定要搞清楚:

PropertyChangeSupport和PropertyChangeListener
Model与EditPart与Figure的一对一
Model、EditPart与EditPartFactory
EditPart与Figure
Root的model(本文中的DiagramModel)
RootEditPart
3. 本文基于Eclipse3.4
4. 后续文章会跟进的,尽量做成一个入门的系列。但是还是需要你能够预先知晓一些GEF的基本概念。并要明白model的变化是如果传递,并最终显示到UI界面的Figure上的。

源代码如下附件所示:


原文地址:http://lggege.javaeye.com/blog/462889


--  作者:Humphrey
--  发布时间:9/23/2009 4:39:00 PM

--  
刚看到GEF的时候还觉得十分陌生,但是看了图就有了似曾相识的感觉了。
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
39.063ms