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

GEF理解系列六(1)

    博客分类:
  • GEF
 
阅读更多

这一节我们主要讲结点和连接的删除,另外就是连接的重定向。

一、连接线的选中与重定向

因为和系列五还有点扯,所以先讲一下连接的重定向。

在上一节中,我们创建了一个用来新建连接的Policy:HelloWorldGraphicalNodeEditPolicy,它还有两个方法在上一节中一直没有提到:

      @Override

      protected Command getReconnectSourceCommand(ReconnectRequest request) {

            // TODO Auto-generated method stub

            return null;

      }

 

      @Override

      protected Command getReconnectTargetCommand(ReconnectRequest request) {

            // TODO Auto-generated method stub

            return null;

      }

看方法名就可以知道这两个方法就是用来返回重定向源和重定向目标的了。所以要完成重定向其实很简单,就是写两个command了。回想一下我们新建一个连接的过程:首先是有一个连接对象,然后给这个对象设置源和目标,最后把它附着到这个源和目标上的。这就完成了一个连接的创建。

 

以重定向源举例。如果要重定向源,那么首先应该是先离开原来的源,把目标源设置为新的源,最后附着到这个新的源的。代码大约就是:

connection.deattachSource();

connection.setSrc(newSrc);

connection.attachSource();

重定向目标结点过程也一样。这里就不复述了。最后完成上面的两个方法即可。列举代码如下:

 

ReconnectSourceCommand:  

public class ReconnectSourceCommand extends Command {

 

      private AbstractConnectionModel connection;

 

      private HelloWorldModel src;

 

      private HelloWorldModel old;

 

      public ReconnectSourceCommand(AbstractConnectionModel connection,

                  HelloWorldModel newSource) {

            super();

            this.connection = connection;

            this.src = newSource;

      }

 

      @Override

      public void execute() {

            old = connection.getSrc();

            connection.deattachSource();

            connection.setSrc(src);

            connection.attachSource();

      }

 

      @Override

      public void undo() {

            src = connection.getSrc();

            connection.deattachSource();

            connection.setSrc(old);

            connection.attachSource();

      }

}

重连方法:

      @Override

      protected Command getReconnectSourceCommand(ReconnectRequest request) {

            ReconnectSourceCommand command = new ReconnectSourceCommand(

                        (AbstractConnectionModel) request.getConnectionEditPart()

                                    .getModel(), (HelloWorldModel) getHost().getModel());

            return command;

      }

 

      @Override

      protected Command getReconnectTargetCommand(ReconnectRequest request) {

            ReconnectTargetCommand command = new ReconnectTargetCommand(

                        (AbstractConnectionModel) request.getConnectionEditPart()

                                    .getModel(), (HelloWorldModel) getHost().getModel());

            return command;

      }

这样就完成了重连了。

 

这里有一个失误,我还没讲怎么选中一条连接线呢。到目前为止,连接线都是不能选中的。呵呵,所以现在重定向命令已经完成,但是重定向操作还是不能做。那这里就顺便讲一下怎么选中一个连接线。

 

有点明白的观众一般此时会心里大喊:那是不是还是装Policy啊?对的,GEF中要想做点事,您都得做这个。那Policy安在哪呢?这个也很简单,因为是要选择Connection,和其他人无关,所以这个Policy肯定是要安在Connection的模型上。

 

这里因为我觉得所有的连接线都需要能够被选中。所以我就把这个Policy安装在:AbstractConnectionModel对应的EditPart上。不过因为我们还没有给AbstractConnectionModel定义EditPart。所以我们顺便定义一个。然后让所以其他connection的EditPart继承它就行了。代码就不举了。最后安装Policy。要支持连接线的选中,我们需要安装一个EditPolicy.CONNECTION_ENDPOINTS_ROLE,这里我们不需要写继承类,如下:

installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new ConnectionEndpointEditPolicy());

 

好了,连接线可以被选中了。因为我们已经完成了重定向功能,所以应该也可以被重定向了。试一下:

reconnection

图一

 

 

二、结点的删除

结点要被删除,还写Policy和command。这点跑不掉。看看现在已有的Policy里,都没有要返回一个删除命令的。所以肯定还得再写一个新Policy,然后把它安装到某个EditPart上去。

 

不过这里我有一点困惑的是:ContainerEditPolicy可以返回一个创建命令,怎么没有一个删除命令吗?我总觉得他们是一对的。可能是因为理解的还不深吧(后来理解,还是跟文件系统一样,删除是选中文件删除,不在是文件夹下操作)。不管怎么样,我们还是不得不去找一个支持删除的Policy,然后把它安装在一个EditPart上。

 

我们可以找到这个删除Policy为:ComponentEditPolicy。还有一个疑问就是:这个Policy应该安装在将被删除的模型EditPart上。这也很令我困惑(还是参考Windows文件系统:增加的时候是由父管理,这很好理解;删除的时候就变了自己删除自己呢!反正记住就行了)。

 

好了,我们写了一个ComponentEditPolicy类:HelloWorldComponentEditPolicy。然后把它安装到HelloWorldEditPart上去:

installEditPolicy(EditPolicy.COMPONENT_ROLE, new HelloWorldComponentEditPolicy());

还是和之前一样,先完成命令,再回过头来完成Policy。

 

早先我们讲增加的时候就讲了:一个HelloWorld要想被显示,它就得被加到content上去。那么我就想了,那要不想显示呢?它是不是就从content上移除啊?先试一下。

 

依据上面的想法,我们就猜想Command里至少应该有两个对象:一个将要被删除的,另一个就是content对象了。

command代码如下:

public class DeleteHelloWorldCommand extends Command {

 

      private DiagramRootContent content;

      private HelloWorldModel model;

      public DeleteHelloWorldCommand(DiagramRootContent content,

                  HelloWorldModel model) {

            super();

            this.content = content;

            this.model = model;

      }

      @Override

      public void execute() {

            content.removeChild(model);

      }

      @Override

      public void undo() {

            content.addChild(model);

      }

}

最后再完成Policy,如下:

      @Override

      protected Command getDeleteCommand(GroupRequest request) {

            DeleteHelloWorldCommand command = new DeleteHelloWorldCommand(

                        (DiagramRootContent) getHost().getParent().getModel(),

                        (HelloWorldModel) getHost().getModel());

            return command;

      }

我们前面提到过:getHost()代表Policy所安装在的对象,所以这里就是HelloWorldEditPart。因此要得到helloworld模型和它的父模型,像上面这样写就行了。

试一下,成功了。呵呵。这里我们不用写监听事件,因为在前面写增加子节点时已经完成了。

preDeleteafterDelete

              图:删除前                              图:删除后  

 

 

分享到:
评论

相关推荐

    GEF理解系列三

    在GEF(Graphical Editing Framework)中,理解其工作流程对于开发图形编辑工具至关重要。GEF主要用于构建基于SWT和JFace的图形用户界面,它提供了丰富的功能来处理图形元素的绘制、操作和交互。本篇文章将深入探讨...

    GEF理解系列二

    【GEF理解系列二】是深入学习GEF框架的第二部分,主要讲解如何配置和初始化Editor,以及如何创建多层结构以支持添加多个图形。GEF(Graphical Editing Framework)是一个用于构建图形编辑器的开源框架,常用于开发...

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

    1. **基本概念**:介绍GEF的关键概念,如Figure、EditPart、Command、Model等,以及它们在图形编辑中的角色。 2. **图形组件**:讲解如何创建和操作图形元素,如矩形、圆形、文本等,以及如何添加连接线和组合图形。...

    Eclipse插件开发:GEF入门系列宝典

    在"GEF入门系列宝典"中,我们将深入探讨如何使用GEF进行Eclipse插件开发,以创建自定义的图形编辑器。以下是一些关键知识点: 1. **Eclipse插件体系结构**: - 插件是Eclipse的核心组成部分,它们通过OSGi模块系统...

    GEF入门系列 pdf 格式资料

    **GEF入门系列 PDF 格式资料** GEF(Graphical Editing Framework)是Eclipse开源组织推出的一个图形编辑框架,主要用于构建可视化的图形编辑...在阅读过程中,建议结合实际编程实践,以便更好地理解和掌握GEF的精髓。

    GEF入门系列

    - 示例代码:Eclipse项目中包含多个GEF示例,是学习和理解GEF的好资料。 - 在线教程:互联网上有许多博客和教程,针对不同水平的学习者提供了丰富的教学内容。 通过这个GEF入门系列,你可以逐步掌握如何利用GEF...

    EMF_GEF_入门系列

    本入门系列旨在帮助初学者快速理解并掌握这两个强大的工具。 EMF是Eclipse项目的一部分,它提供了一种模型驱动的开发方式。EMF允许开发者创建、存储和操作数据模型,这些模型可以用来表示复杂的数据结构或业务逻辑...

    Eclipse插件开发--gef开发指南与入门系列宝典

    "GEF入门系列宝典.doc"可能更侧重于实践,提供逐步的教程和实例,帮助初学者快速上手。它可能包含一些实际的代码示例,教你如何构建一个简单的图形编辑器,例如绘制流程图或网络拓扑图。 通过学习这两份资料,你将...

    GEF-ALL-3.7+GEF-ALL-3.8+GEF_Draw2d学习资料

    2. "GEF入门系列(一、Draw2D).doc" 可能是一个逐步的教学系列,从基础的Draw2D开始,逐步引入GEF的概念和应用。 3. "如何在Eclipse3.3.1.1中安装VE,emf,GEF插件.doc" 提供了在特定版本的Eclipse中安装相关插件的步骤...

    GEF教程

    为了帮助读者更好地理解GEF框架的实际应用,作者提供了由简至繁的一系列示例项目。这些项目按序排列,从最简单的pt1开始,逐步添加新功能,最终形成一个具备DirectEdit、Palette等功能的图形编辑器。这种逐步递进的...

    GEF入门学习例子

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

    GEF-ALL-3.4.2(1).zip

    GEF的核心设计理念是将图形编辑器的实现分解为一系列可重用的组件,这些组件可以组合起来创建各种定制化的图形编辑环境。这个框架的主要组成部分包括: 1. **Model**:模型是编辑器的数据基础,定义了图形元素的...

    简单gef框架

    4. **流程设计基础**:在gef框架下进行流程设计,首先要明确流程的目标和步骤,这可能涉及到对程序逻辑的理解和拆解,将复杂的任务分解为一系列可执行的子任务。这通常需要扎实的编程基础和问题解决能力。 5. **gef...

    GEF 入门教程 中文版

    ### GEF(Graphical Editing Framework)入门教程知识点详解 #### 一、简介 GEF(Graphical Editing Framework),即图形编辑框架,是一种基于...希望您能够通过实践加深对GEF的理解,并成功地应用于自己的项目中。

    界面设计GEF应用实例

    【描述】中的"六个小例子"是指通过一系列逐步进阶的教程,帮助开发者从基础到高级理解并掌握GEF的使用。这些例子旨在帮助初学者逐步理解GEF的工作原理,以及如何利用其功能构建复杂的图形用户界面。每个例子都增加了...

    gef-step3.zip_3gef_GEF eclipse_GEF-step2_gef_gef-st

    **3gef**可能是这个系列教程的一个特定版本或者阶段,强调了对GEF的三次迭代改进或深化理解。这可能涉及到更高级的功能,如图形的动态更新、自定义手势识别或者与其他Eclipse插件的集成。 **gef_eclipse**标签表明...

    eclipse_gef_example.rar

    这个"eclipse_gef_example.rar"压缩包提供了一系列的例子,帮助开发者更好地理解和掌握GEF框架。以下是对每个部分的详细解释: 1. **org.eclipse.gef.examples.text** 这个部分主要展示了如何在GEF环境中处理文本...

    gef工程代码

    1. **内存分析**:gef提供了查看和分析内存块、跟踪内存分配和释放、查找内存泄漏的命令。 2. **反汇编和指令分析**:gef可以展示程序的反汇编代码,帮助理解执行流程,并能解析和操作寄存器。 3. **调试信息**:gef...

Global site tag (gtag.js) - Google Analytics