- 浏览: 126286 次
- 性别:
- 来自: 上海
最新评论
-
一叶之源:
总结一下eclipse中的Job机制 -
xinxinlong:
lAnchor.getDy1() 是什么意思
操作excel--稍后整理 -
defrag_sly:
3.7是好用的,只是再mac下面不支持,mac不支持的效果还有 ...
swt下如何做出一个反向展开效果的tree -
defrag_sly:
eclipse3.7不好用了。谁知道给补充一下。
swt下如何做出一个反向展开效果的tree -
hamlzf:
好文!mark!
基于 OSGi 的面向服务的组件编程
创建gef框架。
按照基本习惯定义gef各部分包名:
Gef是一个标准的MVC框架,模型层变化,以EditPart为中枢,驱动界面显示层的改变。这就需要建立EditPart与模型层的关联,和EditPart与显示层的关联。
下面介绍EMF模型如何与EditPart建立基本关联。
创建EMFBaseEditPart。
这里的关联建立主要在内部类Adapter中实现,为了使代码清晰,我创建了一个超类AbstractAdapter,这个类没有任何作用仅仅是将没必要实现的代码隐藏掉。
在EMF中通知机制是通过Notification发送出来的,Notification对象中记录着相应得改变,每种类型的变化都有特有的Feature来指示。这部分不理解的可以在代码运行起来后多调试几次。
通知对象建立好了,下面就需要把这个通知对象与EditPart建立关联。
方法activate与deactivate。是在EditPart创建和移除时分别执行的两个方法。所以在这里加入对模型的监听,是比较恰当的,在deactivate中除去监听器的做法,可以减少整个应用内存中的对象引用,适当的提高效率。
创建EditPartFactory与PaletteFactory并将两个Factory注册在Editor中。
Editor中注册代码:
PaletteFactory中有一个需要注意的地方:我们需要创建自己的CreationFactory,如果大家接触过普通的gef就会发现这个区别。原因是EMF的Model构造与普通javabean情况下的构造稍有不同。有兴趣的可以对比我的CreationFactory与gef.SimpleFactory
以上几个类已经将GEF有EMF的基本关联建立完毕。剩余部分的关联仅在Command中涉及创建,修改,删除具体Model时有所关联。
介绍控制器EditPart的创建:DiagramEditPart,TreeEditPart,TreeContainEditPart,TreeNodeEditPart。一般情况下。模型的数量与part的数量是1对1 的。特殊需求也可以不遵守。每个EditPart都需要继承基类EmfBasePart。
如大家了解的EditPart是负责Figure(表现层)的创建,与具体逻辑操作,EditPolicy的加载。
以DiagramEditPart为例:
但是这里需要讲两个方法getModelChildren(),和policy. createChildEditPolicy()。
方法getModelChildren是在每次刷新子元素时需要访问的方法,我们需要提供相应的子元素集,gef默认提供了一个空list。有些好的设计,会将这个方法设计到BaseEditPart中。如GMF。
方法createChildEditPolicy()是给子Part创建默认Policy。有些人解释是可以做到统一管理,父part就需要管理子part。但是我的理解有些出入。不管怎样,请大家写代码是保持一个统一的风格。不要对代码的维护造成影响。
顺便说一下figure的布局类DiagramLayoutManager,请感兴趣的同学自己阅读吧。这是表现层的一部分。
为了做出tree的效果,我制作了2个figure。TreeNodeContainerFigure和NodeFigure这部分的代码很简单,TreeNodeContainerFigure中提供expand和collapse方法,NodeFigure重写了paintFigure方法。稍稍阅读就可以理解了。为ContainerFigure制作了一个LayoutManager,主要是一些布局算法,有些方法还结合了Editpolicy一起使用。特性的东西不再赘述。
一个包含model,Editpart,figure,editpolicy等基本结构的gef框架便构建好了。
下面说一下Emf的特性,数据的持久化。
在以前的例子中(不是使用emf模型的例子)。我并没有做数据的持久化,也就是说,每一次编辑并没有保存在文件里。使用了emf就可以利用它自身的特性。具体代码见Editor类。
注:我的实现并没有考虑多文件,以解异常等等复杂情况。是简单的例子。如果考虑复杂情况,代码可能会更复杂,可供参考的是GMF的默认实现,这里只是展现一下emf的强大功能。
按照基本习惯定义gef各部分包名:
Gef是一个标准的MVC框架,模型层变化,以EditPart为中枢,驱动界面显示层的改变。这就需要建立EditPart与模型层的关联,和EditPart与显示层的关联。
下面介绍EMF模型如何与EditPart建立基本关联。
创建EMFBaseEditPart。
package org.rufus.gef.emf.examples.tree; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EObject; import org.eclipse.gef.editparts.AbstractGraphicalEditPart; import org.rufus.gef.emf.model.tree.tree.TreePackage; abstract public class EmfBasePart extends AbstractGraphicalEditPart { private org.rufus.gef.emf.examples.tree.EmfBasePart.Adapter adapter; @Override public void activate() { super.activate(); adapter = new Adapter(); (((EObject) getModel()).eAdapters()).add(adapter); } private class Adapter extends AbstractAdapter { public void notifyChanged(Notification notification) { if (TreePackage.eINSTANCE.getTree_Root().equals( notification.getFeature()) || TreePackage.eINSTANCE.getTreeContainer_Node().equals( notification.getFeature()) || TreePackage.eINSTANCE.getDiagram_Trees().equals( notification.getFeature())) { refreshChildren(); } else if (TreePackage.eINSTANCE.getTreeNode_Id().equals( notification.getFeature()) || TreePackage.eINSTANCE.getTreeNode_Name().equals( notification.getFeature())) { refreshVisuals(); } } } @Override public void deactivate() { (((EObject) getModel()).eAdapters()).remove(adapter); super.deactivate(); } }
这里的关联建立主要在内部类Adapter中实现,为了使代码清晰,我创建了一个超类AbstractAdapter,这个类没有任何作用仅仅是将没必要实现的代码隐藏掉。
在EMF中通知机制是通过Notification发送出来的,Notification对象中记录着相应得改变,每种类型的变化都有特有的Feature来指示。这部分不理解的可以在代码运行起来后多调试几次。
通知对象建立好了,下面就需要把这个通知对象与EditPart建立关联。
方法activate与deactivate。是在EditPart创建和移除时分别执行的两个方法。所以在这里加入对模型的监听,是比较恰当的,在deactivate中除去监听器的做法,可以减少整个应用内存中的对象引用,适当的提高效率。
创建EditPartFactory与PaletteFactory并将两个Factory注册在Editor中。
Editor中注册代码:
public class TreeEditor extends GraphicalEditorWithPalette { protected void configureGraphicalViewer() { super.configureGraphicalViewer(); scalableRootEditPart = new ScalableRootEditPart(); getGraphicalViewer().setRootEditPart(scalableRootEditPart); getGraphicalViewer().setEditPartFactory(new TreeEditPartFactory()); …………………… } protected PaletteRoot getPaletteRoot() { if (root == null) root = TreePaletteFactory.createPalette(); return root; } }
PaletteFactory中有一个需要注意的地方:我们需要创建自己的CreationFactory,如果大家接触过普通的gef就会发现这个区别。原因是EMF的Model构造与普通javabean情况下的构造稍有不同。有兴趣的可以对比我的CreationFactory与gef.SimpleFactory
以上几个类已经将GEF有EMF的基本关联建立完毕。剩余部分的关联仅在Command中涉及创建,修改,删除具体Model时有所关联。
介绍控制器EditPart的创建:DiagramEditPart,TreeEditPart,TreeContainEditPart,TreeNodeEditPart。一般情况下。模型的数量与part的数量是1对1 的。特殊需求也可以不遵守。每个EditPart都需要继承基类EmfBasePart。
如大家了解的EditPart是负责Figure(表现层)的创建,与具体逻辑操作,EditPolicy的加载。
以DiagramEditPart为例:
package org.rufus.gef.examples.tree.parts; import java.util.List; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.Request; import org.eclipse.gef.commands.Command; import org.eclipse.gef.editpolicies.ConstrainedLayoutEditPolicy; import org.eclipse.gef.editpolicies.NonResizableEditPolicy; import org.eclipse.gef.requests.CreateRequest; import org.rufus.gef.emf.examples.tree.EmfBasePart; import org.rufus.gef.emf.model.tree.tree.Diagram; import org.rufus.gef.examples.tree.editpolicy.DiagramContainerEditPolicy; import org.rufus.gef.examples.tree.figures.DiagramLayoutManager; /** * @author shily Created on Feb 16, 2009 */ public class DiagramPart extends EmfBasePart { @Override public Command getCommand(Request request) { return super.getCommand(request); } @Override public EditPart getTargetEditPart(Request request) { return super.getTargetEditPart(request); } @Override protected IFigure createFigure() { Figure f = new Figure(); f.setLayoutManager(new DiagramLayoutManager()); return f; } @Override protected List getModelChildren() { return this.getDiagram().getTrees(); } private Diagram getDiagram() { return (Diagram) this.getModel(); } @Override public void performRequest(Request req) { super.performRequest(req); } @Override protected void createEditPolicies() { installEditPolicy(EditPolicy.LAYOUT_ROLE, new ConstrainedLayoutEditPolicy() { @Override protected Command createChangeConstraintCommand( EditPart child, Object constraint) { // cant move return null; } @Override protected Command getCreateCommand(CreateRequest request) { return null; } protected EditPolicy createChildEditPolicy(EditPart child) { // selection able return new NonResizableEditPolicy(); } @Override protected Object getConstraintFor(Point point) { // TODO Auto-generated method stub return null; } @Override protected Object getConstraintFor(Rectangle rect) { // TODO Auto-generated method stub return null; } }); // tree create able installEditPolicy(EditPolicy.CONTAINER_ROLE, new DiagramContainerEditPolicy()); } }
但是这里需要讲两个方法getModelChildren(),和policy. createChildEditPolicy()。
方法getModelChildren是在每次刷新子元素时需要访问的方法,我们需要提供相应的子元素集,gef默认提供了一个空list。有些好的设计,会将这个方法设计到BaseEditPart中。如GMF。
方法createChildEditPolicy()是给子Part创建默认Policy。有些人解释是可以做到统一管理,父part就需要管理子part。但是我的理解有些出入。不管怎样,请大家写代码是保持一个统一的风格。不要对代码的维护造成影响。
顺便说一下figure的布局类DiagramLayoutManager,请感兴趣的同学自己阅读吧。这是表现层的一部分。
为了做出tree的效果,我制作了2个figure。TreeNodeContainerFigure和NodeFigure这部分的代码很简单,TreeNodeContainerFigure中提供expand和collapse方法,NodeFigure重写了paintFigure方法。稍稍阅读就可以理解了。为ContainerFigure制作了一个LayoutManager,主要是一些布局算法,有些方法还结合了Editpolicy一起使用。特性的东西不再赘述。
一个包含model,Editpart,figure,editpolicy等基本结构的gef框架便构建好了。
下面说一下Emf的特性,数据的持久化。
在以前的例子中(不是使用emf模型的例子)。我并没有做数据的持久化,也就是说,每一次编辑并没有保存在文件里。使用了emf就可以利用它自身的特性。具体代码见Editor类。
package org.rufus.gef.examples.tree.editors; /** * @author shily Created on Feb 16, 2009 */ public class TreeEditor extends GraphicalEditorWithPalette { 。。。。。。。。。。。。。。。。。。。。 /** * @see org.eclipse.gef.ui.parts.GraphicalEditor#initializeGraphicalViewer() */ protected void initializeGraphicalViewer() { // emf getresource FileEditorInput ei = (FileEditorInput) this.getEditorInput(); ResourceSet resourceSet = new ResourceSetImpl(); IFile file = (IFile) getEditorInput().getAdapter(IFile.class); URI fileURI = URI.createPlatformResourceURI(file.getFullPath() .toString(), true); EObject object = null; try { Resource resource = resourceSet.getResource(fileURI, true); object = resource.getContents().get(0); } catch (Exception e) { // resource has nothing object = TreeFactory.eINSTANCE.createDiagram(); } // TreeFactory.eINSTANCE.createDiagram() getGraphicalViewer().setContents(object); getGraphicalViewer().addDropTargetListener( new TemplateTransferDropTargetListener(getGraphicalViewer())); 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 } /** * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor) */ public void doSave(IProgressMonitor monitor) { // emf resource save // Save only resources that have actually changed. // final Map<Object, Object> saveOptions = new HashMap<Object, Object>(); saveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER); // Do the work within an operation because this is a long running // activity that modifies the workbench. // WorkspaceModifyOperation operation = new WorkspaceModifyOperation() { // This is the method that gets invoked when the operation runs. // @Override public void execute(IProgressMonitor monitor) { // Save the resources to the file system. // boolean first = true; // Create a resource set // ResourceSet resourceSet = new ResourceSetImpl(); // Get the URI of the model file. // IFile file = (IFile) getEditorInput().getAdapter(IFile.class); URI fileURI = URI.createPlatformResourceURI(file.getFullPath() .toString(), true); // Create a resource for this file. // Resource resource = resourceSet.createResource(fileURI); // Add the initial model object to the contents. // EObject rootObject = (EObject) getGraphicalViewer() .getContents().getModel(); if (rootObject != null) { resource.getContents().add(rootObject); } // Save the contents of the resource to the file system. // try { resource.save(saveOptions); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; try { // This runs the options, and shows progress. // new ProgressMonitorDialog(getSite().getShell()).run(true, false, operation); // fire saved this.getCommandStack().markSaveLocation(); commandStackChanged(null); } catch (Exception exception) { // Something went wrong that shouldn't. // } } }
注:我的实现并没有考虑多文件,以解异常等等复杂情况。是简单的例子。如果考虑复杂情况,代码可能会更复杂,可供参考的是GMF的默认实现,这里只是展现一下emf的强大功能。
发表评论
-
TableEditor 让我郁闷的
2011-12-21 17:25 1290TableItem item = table.getIte ... -
eclipse search
2011-08-09 13:04 908http://www.ibm.com/developerwor ... -
eclipse 中关于字符串匹配的几个类
2009-12-17 12:07 1542在做检索功能时,必然会遇到字符串匹配的问题。eclipse与j ... -
eclipse Drag&Drop机制图解
2009-11-20 15:55 1123工作需要,debug了eclipse的drag&dro ... -
Drag & Drop eclipse Viewer to GMF Editor
2009-10-09 11:21 18781,添加Viewer的Drag support priva ... -
请问,eclipse e4 究竟是什么?愿能集思广益
2009-08-13 16:05 908请问,eclipse e4 究竟是什么?愿能集思广益 -
简单介绍eclipse中的重构
2009-08-13 11:28 2339Eclipse中提供了几个扩展点,方便扩展重构功能。 基本的重 ... -
swt下如何做出一个反向展开效果的tree
2009-08-10 10:59 1774如题,其实很简单,即在tree的构造方法里加入样式参数{SWT ... -
eclipse 开发中的快捷键
2009-05-19 12:15 887Alt+Shift+F1 eclipse 3.4下会打开一个p ... -
将gmfeditor结合到mutipage中
2009-05-04 16:26 1276http://www.eclipse.org/articles ... -
eclipse还有什么不能做???
2009-04-09 15:13 925http://www.vimeo.com/1195398?pg ... -
如何把propertiesView的tab功能移植到EditorPart中
2009-04-01 10:12 2810最近有个调查将上图tab propertiesView的外 ... -
Eclipse中TextEditor常用扩展整理
2009-03-11 14:11 5438总结一下TextEditor,eclips ... -
eclipse中对redo与undo的支持
2009-03-10 16:14 4463大家在使用eclipse时,一定对ctrl+z和ctrl+r使 ... -
总结一下eclipse中的Job机制
2009-03-06 17:38 11556总结一下eclipse中Job,Job可以说是eclipse中 ... -
以GefTree为例解释一下如何结合使用gef+emf(1)
2009-03-05 14:20 1478以GefTree为例解释一下如何结合使用gef+emf。 (1 ... -
gef写的tree例子--模型修改为emf
2009-03-04 16:11 2110模型部分已经修改为emf模型。 使用emf模型最大的好处是: ... -
用gef写的一个tree例子(无移动)
2009-02-26 18:06 1419又整理一下代码,增加了删除。 移动决定不做了,都是坐标之类的算 ... -
用gef写的一个tree例子(无移动,删除)
2009-02-26 11:16 1019计划 1、删除,移动做上去 2、将模型层提供为扩展点,( ... -
关于image,ImageDescriptor,imageRegistry
2009-02-20 17:31 5013相信不需要多说,大家都明白调用本地资源例如(icon)这类的资 ...
相关推荐
VE 1.2 +GEF+EMF 集成包(virtual editor 1.2) emf-sdo-runtime-2.2.0.zip GEF-runtime-3.2.zip VE-runtime-1.2.1.zip VE-SDK-1.2.1.zip 还要继续下载第二个包一起解压 第二个包名称为: VE 1.2 +GEF+EMF 集成包...
VE 1.2 +GEF+EMF 集成包(virtual editor 1.2) 及说明文档.zip.002
eclipse gef,ve,emf图形界面插件下载 emf-sdo-runtime-2.2.0.zip GEF-runtime-3.2.zip VE-SDK-1.2.1.zip 安装方式:在eclipse目录下创建两个子目录myplugins和links,然后在myplugins目录下建三个子目录emf,...
本文件中包含了搭建eclipse+ArcEngine二次开发环境的EMF+GEF+VE这三款插件,配合eclipse-jee-helios-SR2-win32可以搭建成功。
著名的IBM红皮书系列,包含原版和中文版 适合不同人群
安装m2eclipse插件时会依赖gef插件和svn插件,压缩包内包含m2eclipse + gef + svn的全部插件安装包,可以直接离线安装,本人亲测,在Eclipse3.7下安装成功,可以新建Maven项目。 需要注意的是,在离线安装时,切记...
适用于eclipse3.5的VE1.4插件,需配合emf和GEF一起使用。使用link方法先安装emf和GEF,再打开eclipse使用离线安装方法安装VE1.4,具体安装步骤请自行研究。
找了好久终于找到了,我把它们集合在一起供大家下载,我试过了,能用
这里要讲的GEF 例子,还是从任何学习编程的最普通例子HelloWorld 开始。我们要用GEF 这把牛刀来处理HelloWorld 这个小菜。
emf2.4.2+gef3.4.2+ve1.5.0+中文语言包~ 在jdk1.5.0_06+eclipse-SDK-3.4.1-win32下成功实现所见即所得开发~
emf介绍系列和gef入门介绍打包,适合新人快速掌握。
Eclipse的图形编辑框架GEF的参考API,chm格式
详细讲述了emf和gef的用法,和模型开发过程,有很多实例的
GEF Example source code 博文链接:https://jamesblog.iteye.com/blog/148279
ve1.4.0插件 GEF3.2 EMF2.2.0 全套打包
NULL 博文链接:https://zhenghuazhi.iteye.com/blog/661000
3个插件中的features和plugins文件夹种内容都已经放到一块了,下载后只要解压,然后把解压后的2个文件copy倒eclipse文件夹下面去就OK。重启即可看见。。。祝君好运
emf swt runtime gef
介绍使用EMF和GEF,开发eclipse图形编辑插件,例如:流程绘制。