`
liugang594
  • 浏览: 990751 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

GEF功能增强之创建助手

    博客分类:
  • GEF
UML 
阅读更多

用过GMF就知道,GMF默认生成的editor有一个悬浮的创建助手功能:当把鼠标移动到某个editpart上,稍停,则会出现一个提示条,上面列出当前位置的editpart上可以新建的子元素,直接选择某项进行新建而无需Palette的参与。

 

就像之前那篇连接助手一样,使用此功能可以大大方便新建过程。所以这里就和大家讨论一下这个功能的自我实现。

 

没有详细的研究过GMF中这个功能的实现代码,大家有兴趣的可以去参考GMF的实现,这里我只聊聊我自己的想法。

 

这里我以实现一个很简单的UML图为例,假设只能有以下模型:

  • 工程:作为根,可以含有包
  • 包:可以含有子包和类
  • 类:可以含有变量和方法
  • 变量
  • 方法

OK,这样模型结构就定义完了,最后我希望出现以下图样:

 

                         Figure 1: Project Creation Helper

                       Figure 2: Package Creation Helper

                Figure 3: Class Method Creation Helper

              Figure 4: Class Field Creation Helper

 

当鼠标悬停在某个Editpart之上时,对应的创建助手条就会出现,当鼠标在某个项上滑过的时候,该项会高亮,且有虚线围绕。如果此时点击,则在对应位置就会创建出一个新对象。

 

要实现创建助手条,不用说,大家都能想到:

  1. 需要知道当前对象上可创建的子项
  2. 需要知道每个子项的图标
  3. 需要知道创建坐标
  4. 最后当然就是画单个项目和画整条提示条了

为了知道每个对象上可创建的子项,我定义了一个接口:IHoverHelper,它只有一个方法:getHoverChildren(),为简单起,我让这方法只要返回一个Class对象数组即可。然后,显然每个需要助手功能的模型都需要实现这个接口。

 

除此之外,为了知道每个对象对应的图标,我也定义了一个工厂,用来定义模型-图标对,当需要某个对象的图标时,就从这个工厂取。

 

下面就是在适当的时候让助手条显示出来了。

 

之前已经说过,悬停的时候出现,所在我让模型的editpart实现MouseMouseListner,然后把这个Listener安装在模型对应的figure上。这样,一个事件触器就定义好了。

 

假设我们有一个类CreationPopupBarFigure就是用来显示这个助手条。那么,我们就需要在mouseHover()方法里把它显示出来;显然,我们不能让它一直呆在那,所以还需要在mouseMoved()方法里让它消失。

 

这里有几点需要考虑的:

 

         1.助手条显示图加在谁上的问题

            我们知道,一个Figure需要加在某个已经显示出来的Figure上,才能被看到。那我这个提示条加在谁上呢?我就想到RootEditPart的那几个层,有一点可以肯定的就是这个提示条一旦出现,就不应该被什么东西挡住对吧?那它的层次应该比较高。一开始我是想加在FeedBack层,但是发现它对鼠标滑过没反应,最后就加在了Handle层了。

 

         2.对象声明的问题

            应该可以肯定,同一时间不可能出现多个提示条对吧?如果是的放,那就是思路出问题了。所以整个程序中应该只有一个提示条出现才对。所以我们可以声明一个static的提示条变量来避免创建多个提示条。

 

          3.消失的问题

             之前已经说过了,在mouseHover()方法里显示,在mouseMoved()方法里消失。所以我们首先要让提示条出现的位置在紧挨着鼠标悬停的位置;其次,我们还要空许一些额外的空间,就像一条连接线,也会有一些额外的空间来表示在线的范围内。这样做的目的是避免用户一移动,提示条就消失。

 

OK,大致实现过程就结束了。最后就到了CreationPopupBarFigure。

 

大致创建已经讲了,就是显示在handle层上,显示在挨着鼠标的当前位置上。

 

还有一些需要补充的:

 

1.自动消失的问题

如果鼠标不动,让它一直显示在那也是不好的。所以我加了一个两秒的消失时间。

 

2.不自动消失的情况

上面已经说了两种消失情况:鼠标移动、定时消失。想像这样一种情形,我们鼠标正在提示条上滑动以进行选择,结果消失了。这肯定让人很气愤,对吧?

所以还要有一种不消失的情况,那就是在鼠标在条上滑动进行选择的时候。因此我们的提示条和它上面的子项都需要加一个鼠标监听,来确保当鼠标在它们之上移动时,就让提示条一直显示。

 

 

OK,最后当鼠标在某项上点击时,创建出一个新对象,大致可以如下写:

		CreateRequest createRequest = new CreateRequest(modelClass);
		createRequest.setLocation(new Point(x, y));
		createRequest.setFactory(new SimpleFactory(modelClass));
		createRequest.setType(RequestConstants.REQ_CREATE);
		Command command = host.getCommand(createRequest);
		host.getViewer().getEditDomain().getCommandStack().execute(command);

 

试试新功能,我觉得挺好的,不用再点palette了。

 

 

 

 

 

 

 

 

  • 大小: 5.2 KB
  • 大小: 7.3 KB
  • 大小: 8.6 KB
  • 大小: 8.5 KB
分享到:
评论
4 楼 liugang594 2014-08-08  
这些图是我自己画的。这个美工方面我不擅长
3 楼 powerxyh 2014-08-08  
哦,这样啊,还是非常感谢!另外想请假下,GEF怎么实现UML中的包图和类图啊?谢谢!
2 楼 liugang594 2014-08-08  
这个已经好多年了。没有代码了
1 楼 powerxyh 2014-08-07  
大侠,您这个Demo程序的源代码能提供给我一份么?想学习下,刚接触RCP,万分感谢!

相关推荐

    gef, GEF &增强开发开发者reversers的功能.zip

    gef, GEF &增强开发开发者reversers的功能 GEF - GDB增强功能 GEF 是用于 X86.ARM 。MIPS 。PowerPC和SPARC的一系列命令,让GDB再次冷却开发开发。 它主要由挖掘者和反向工程师使用,使用 python API为动态分析和...

    GEF入门必读 GEF入门系列 GEF-whole-upload

    GEF的核心功能是提供了一套强大的组件和API,用于创建可交互的、图形式的用户界面。通过使用GEF,开发者可以轻松地创建出具有拖放、连接线、节点和图形编辑功能的应用。在Java编程中,GEF是一个非常有价值的工具,...

    GEF Example Source Code

    **GEF(Graphical Editing Framework)** 是一个用于构建图形编辑工具的开源框架,它为开发人员提供了一套全面的库和工具,用于创建基于Eclipse的富客户端平台(RCP)的应用程序,特别是那些涉及图形用户界面(GUI)...

    GEF-SDK-3.7.0

    Eclipse的插件体系结构允许开发者通过安装插件来扩展其功能,GEF就是这样的插件之一,专注于图形编辑领域。 **使用GEF-SDK-3.7.0开发步骤**: 1. **环境准备**:首先需要安装Eclipse IDE,并确保它包含PDE(Plug-in...

    GEF简易教程-学习GEF的入门教程

    **GEF**,全称为**Graphical Editing Framework**,是Eclipse平台上用于创建复杂图形编辑器的框架。它提供了一套完整的工具集,使开发者能够构建具有图形化用户界面的应用程序,特别适用于创建基于模型的编辑器。 ...

    自己下的GEF资源打包

    用户可以通过阅读这个教程来了解如何在Eclipse环境中搭建GEF项目,并进行基本的图形编辑功能开发。 "GEF教程.pdf"可能更加深入,除了基础内容外,可能会涉及到更高级的主题,如自定义手势识别、动态模型更新、图层...

    GEF-SDK-3.6.2 jar

    《GEF-SDK-3.6.2 jar:Eclipse GEF框架详解及在Android ADT中的应用》 GEF(Graphical Editing Framework)是...通过理解并熟练运用GEF,开发者能够创建出功能强大、用户体验优良的图形化编辑器,提升开发效率。

    gef 转折线的相关方法实现和 GEF的API chm 格式

    Gef,全称Graphical Editing Framework,是Eclipse项目的一部分,是一个用于构建图形编辑框架的开源库,主要用于开发基于Swing或SWT的...通过熟练掌握这些知识,开发者可以轻松创建出具有复杂图形交互功能的应用程序。

    GEF-Update-5.3.3.zip

    `GEF-Update-5.3.3.zip`是针对Eclipse 4.18版本的一个离线更新包,用于增强Eclipse内置的GEF功能。 Eclipse本身已经内建了GEF库,但`GEF-Update-5.3.3`是一个增强版,包含了更多的特性和改进。这个更新包可以为...

    基于gef框架Demo

    6. **适配器和扩展点**:Gef通过适配器机制支持与其他Eclipse组件(如Papyrus或EMF)的集成,同时提供多个扩展点以增强框架功能。 在“基于gef框架Demo”中,你可以期待看到如何使用Gef来创建基本的图形元素,如...

    eclipse gef ve gmf

    而GMF则是对GEF的增强,专门用于创建复杂的模型驱动的图形编辑器。在Eclipse 3.2这个版本中,这些工具集成了良好的图形建模和可视化编辑能力,对于开发人员来说,它们是构建图形化应用程序和模型的重要工具箱。 ...

    GEF 可用的6个demo

    通过DEMO,你可以了解适配器如何在GEF中工作,以及如何使用它们来增强功能。 12. **可扩展性与插件系统**:作为Eclipse的一部分,GEF支持插件扩展。DEMO可能展示如何创建和使用插件来扩展图形编辑器的功能。 通过...

    GEF-Update-3.7.1.zip

    总之,"GEF-Update-3.7.1.zip"是Eclipse开发者的一个重要资源,它提供了最新的GEF框架,可以帮助他们创建功能丰富的图形编辑工具。通过理解并应用其中的组件和功能,开发者可以提高他们的工作效率,为用户提供更加...

    GEF实现拷贝粘贴

    标题“GEF实现拷贝粘贴”涉及到的是在软件开发中使用Graphical Editing Framework(GEF)进行图形界面编辑时,如何实现复制和粘贴功能的技术。GEF是Eclipse平台下用于构建图形化编辑器的框架,它提供了一套完整的...

    GEF-ALL-3.10.1.zip

    GEF是Eclipse框架下用于创建图形化用户界面(GUI)的开源库,特别适用于开发基于模型的可视化编辑器。这个版本3.10.1可能是该框架的一个稳定版本,包含了所有必要的组件和库。 描述中提到的“eclipse编辑html文件...

    GEF入门学习例子

    这个入门学习例子旨在帮助初学者理解GEF的基本用法和核心概念,通过实例展示如何利用GEF实现工具栏、菜单栏、属性栏以及图形的交互功能,如移动、删除、撤销、连线等,并涵盖了大纲视图和鹰眼功能的实现。...

    Eclipse的GEF学习

    GEF的设计理念在于减少模型与视图之间的依赖,这不仅提升了代码的复用性,还增强了系统的可扩展性。通过将复杂的编辑操作抽象为请求(Request)、角色(Role)、策略(EditPolicy)和命令(Command),GEF提供了一套灵活且...

    GEF_Demo_Code20170307

    它的核心功能包括图形绘制、手势识别、对象编辑等,为开发者提供了丰富的API和设计模式,使得创建复杂的图形编辑应用变得简单。 1. **适配器(Adapter)扩展点**:在Eclipse插件开发中,适配器是一种常见的设计模式...

    GEF实例教程PDF

    - **GEF (Graphical Editing Framework)**:GEF是Eclipse平台提供的一个用于构建图形编辑器的框架,能够帮助开发者快速构建功能丰富的图形用户界面。适用于创建各种类型的图形编辑器,如流程图编辑器、UML建模工具等...

Global site tag (gtag.js) - Google Analytics