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

GEF理解系列七(1)

    博客分类:
  • GEF
阅读更多

到现在为止,我们已经完成了很多工作了:图形的缩放,移动;增加,删除;连线的增加删除,重定向。

不过我们还没有办法修改我们HelloWorld上的文字。这一节我们就来实现对文字的修改。

一、直接编辑的支持

要想支持编辑功能。显示我们也需要安装Policy,写command。那好,我们先做好这部分工作。

EditPolicy里有一个直接编辑Policy:DirectEditPolicy。我们写一个子类继承这个Policy,然后显然应该把它安放在HelloWorldEditPart上。OK,先完成这些。

在HelloWorldEditPart里安装Policy:

installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new HelloWorldDirectEditPolicy());

实现HelloWorldDirectEditPolicy:

public class HelloWorldDirectEditPolicy extends DirectEditPolicy {

 

      @Override

      protected Command getDirectEditCommand(DirectEditRequest request) {

            return null;

      }

 

      @Override

      protected void showCurrentEditValue(DirectEditRequest request) {

 

      }

}

下面我们先完成编辑命令。显示要完成这个编辑,我们至少需要两个东西:当前编辑的HelloWorld对象、修改后的值。所以我们的command可以实现如下:

public class DirectEditHelloWorldCommand extends Command {

 

      private HelloWorldModel model;

      private String text;

      private String old;

 

      public DirectEditHelloWorldCommand(HelloWorldModel model, String text) {

            super();

            this.model = model;

            this.text = text;

      }

 

      @Override

      public void execute() {

            old = model.getText();

            model.setText(text);

      }

 

      @Override

      public void undo() {

            text = model.getText();

            model.setText(old);

      }

 

}

再回过头来完成我们的Policy:

public class HelloWorldDirectEditPolicy extends DirectEditPolicy {

 

      @Override

      protected Command getDirectEditCommand(DirectEditRequest request) {

            Text text = (Text) request.getCellEditor().getControl();

            DirectEditHelloWorldCommand command = new DirectEditHelloWorldCommand(

                        (HelloWorldModel) getHost().getModel(), text.getText().trim());

            return command;

      }

 

      @Override

      protected void showCurrentEditValue(DirectEditRequest request) {

      }

}

方法showCurrentEditValue后面我们再讲。这里我们还有一个假设:假设编辑控件是一个text框,至于具体是什么,应该由你选择的CellEditor的类型决定,所以可以肯定在这里我们将选择TextCellEditor。在做树和表的编辑时我们也会用到这个。

我们已经完成了一个完整的过程。按理说我们可以操作了。一般来说GEF上的编辑都是单击鼠标就可以显示出来了。但是现在如果我们单击鼠标,什么也不会出现。为什么呢?

上面我们也提到了,我们选择了TextCellEditor,所以我们在Policy里就把CellEditor的Control强制为Text。我们是这样做的。不过想一想,好像我们还没有在哪个地方告诉GEF我们的选择吧?没有,绝对的没有。

而且除此之外,还有一个问题:假如GEF知道我们是要用TextCellEditor。它又怎么知道这个Text放在什么位置、大小如何呢?这些都是要考虑的问题。所以我们必须有一个地方告诉它这些问题的答案。

这里就要提到另一个类:DirectEditManager。要想实现直接编辑功能,我们需要提供一个DirectEditManager类,用来给出上面问题的答案。DirectEditManager是一个抽象类,我们必须给出一个具体的实现。那我们就首先实现我们的DirectEditManager类。首先看一下DirectEditManager的构造方法(选其中一个):

 

 

public DirectEditManager(GraphicalEditPart source, Class editorType, CellEditorLocator locator)

基中:

   @param source the source edit part:要编辑的模型的EditPart

   @param editorType the cell editor type:编辑单元类,如TextCellEditor.class

   @param locator the locator:决定编辑控件的大小和位置,需要自己实现

OK,那现在我们需要实现的类有两个:一个DirectEditManager的实现类;一个CellEditorLocator的实现类。

我们首先来实现CellEditorLocator的实现类:

public class HelloWorldCellEditorLocator implements CellEditorLocator {

 

      private HelloWorldModel model;

 

      public HelloWorldCellEditorLocator(HelloWorldModel model) {

            super();

            this.model = model;

      }

 

      public void relocate(CellEditor celleditor) {

            Text text = (Text) celleditor.getControl();

            Rectangle constraints = model.getConstraints();

            text.setBounds(constraints.x, constraints.y, constraints.width,

                        constraints.height);

      }

}

这里我们增加了一个构造方法,传入编辑的模型,让编辑控件的大小刚好等于编辑模型的图形大小。

下面实现DirectEditManager:

public class HelloWorldDirectEditManager extends DirectEditManager{

 

      public HelloWorldDirectEditManager(GraphicalEditPart source,

                  Class editorType, CellEditorLocator locator) {

            super(source, editorType, locator);

      }

 

      @Override

      protected void initCellEditor() {

            Text text = (Text) getCellEditor().getControl();

            HelloWorldModel model = (HelloWorldModel) getEditPart().getModel();

            text.setText(model.getText());

      }

}

这里我们让编辑控件的初始值为模型的text值。

完了,完成了两个类的实现。下面就是要想把它放哪了。

 

分享到:
评论

相关推荐

    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-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...

    GEF入门实例代码2《Eclipse插件开发》中实例

    GEF包含了一系列的类和接口,如Command、Model、View、EditPart、Figure等,它们共同构成了图形编辑的基础架构。Command代表可撤销/重做的操作,Model表示数据模型,View负责显示图形,EditPart作为模型和视图之间...

Global site tag (gtag.js) - Google Analytics