在gef的mvc框架中,我们用EditDomain来负责保存、载入缺省工具,维护当前激活的工具,并将鼠标和键盘等事件转发给当前活动工具,以及处理命令栈堆栈,从而我们可以方便实现dosave、redo、undo等常用操作。Command通常是“原子”性的单元,而不对其分割。但是,有时候我们会碰到一下场景:
场景:在创建对象时,我们从PaetteRoot中选择一个CreationEntry,然后在Viewer上点击,就产生一个request,editpoly根据request的类型返回一个createCommand,就创建出了一个对象。客户要求的是在Command执行前,要对所创建对象进行参数设置。即:弹出一参数设置对话框。
问题:这个对话框在何处实现??我们通常会先想到在command中来实现它,这时就有个问题,如果用户选择了“Cancel”,这个Command已经放入EditDomain堆栈中,这时会给我们造成undo、redo等实现的复杂性(得判断Command中对话框中是否选择了ok)。在policy处处理肯定不合适,因为在鼠标移动过程中,它会一直触发policy事件。
正确的处理方法:分为两步:
1.第一步:extends CreationTool,重载performCreation(int button)方法。代码示例:
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.requests.CreationFactory;
import org.eclipse.gef.tools.CreationTool;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.swt.widgets.Display;
import tutogef.commands.EmployeCreateCommand;
import tutogef.model.Employe;
/**
* @author zhu_qhua
*/
public class CreationToolEx extends CreationTool {
private Employe emp;// 要创建的对象
public CreationToolEx() {
}
public CreationToolEx(CreationFactory factory) {
super(factory);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.tools.CreationTool#performCreation(int)
*/
protected void performCreation(int button) {
EmployeCreateCommand createCommand;// 创建对象对应的createCommand
String value;
Command command = getCurrentCommand();
boolean hasCommand = command != null && command.canExecute();
if (!hasCommand)
return;
if (command instanceof EmployeCreateCommand) {
createCommand = (EmployeCreateCommand) command;
emp = createCommand.getEmploye();
} else {
return;
}
if (getTargetEditPart() != null) {
InputDialog inputDialog = new InputDialog(Display.getDefault()
.getActiveShell(), "提示框", "请输入名字", emp.getName(), null);
if (inputDialog.open() == InputDialog.OK) {
value = inputDialog.getValue();
emp.setName(value);
if (command instanceof EmployeCreateCommand) {
createCommand.setEmploye(emp);
}
} else {
return;
}
}
super.performCreation(button);
}
}
2.第二步:然后再EditorView的protected PaletteRoot getPaletteRoot()中调用TemplateEntry.setToolClass(CreationToolEx.class)就可以了。
protected PaletteRoot getPaletteRoot() {
PaletteRoot root = new PaletteRoot();
PaletteGroup manipGroup = new PaletteGroup("操作对象");
root.add(manipGroup);
// 添加该工具的选择和工具选择组
SelectionToolEntry selectionToolEntry = new SelectionToolEntry();
manipGroup.add(selectionToolEntry);
manipGroup.add(new MarqueeToolEntry());
PaletteSeparator sep2 = new PaletteSeparator();
root.add(sep2);
PaletteGroup instGroup = new PaletteGroup("创建对象");
root.add(instGroup);
instGroup.add(new CombinedTemplateCreationEntry("Service",
"Creation d'un service type", Service.class,
new NodeCreationFactory(Service.class), AbstractUIPlugin
.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
"icons/services-low.png"), AbstractUIPlugin
.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
"icons/services-high.png")));
// 要实现dialog的Entity
CombinedTemplateCreationEntry newTemplateEntry = new CombinedTemplateCreationEntry("Employe",
"Creation d'un employe model", Employe.class,
new NodeCreationFactory(Employe.class), AbstractUIPlugin
.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
"icons/employe-low.png"), AbstractUIPlugin
.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
"icons/employe-high.png")) ;
newTemplateEntry.setToolClass(CreationToolEx.class);
instGroup.add(newTemplateEntry);
// 定义进入调色板将使用默认值:
root.setDefaultEntry(selectionToolEntry);
return root;
}
到这儿,就大功告成了。
分享到:
相关推荐
Gef,全称Graphical Editing Framework,是Eclipse项目的一部分,是一个用于构建图形编辑框架的开源库,主要用于开发基于Swing或SWT的图形用户界面应用。这个框架支持模型驱动的编辑环境,允许开发者创建复杂的图形...
2. **模型创建**:"test.gef.hello"可能包含一个简单的数据模型,用于存储图形元素的信息。 3. **EditPart实现**:为了将模型数据映射到图形视图,你需要创建自定义的EditPart类。这里可能有一个代表“Hello”文本...
【GEF_Demo_Code20170307】是一个关于图形编辑框架(Graphical Editing Framework,简称GEF)的示例代码集合,发布于2017年3月7日。这个项目旨在演示如何利用GEF进行图形界面开发,并且特别关注了通过适配器...
【用RCP构建GEF程序】的PPT教程主要涵盖了Eclipse Rich Client Platform (RCP)和Graphical Editing Framework (GEF)的应用。Eclipse RCP是一个强大的开发平台,广泛应用于构建桌面应用程序,如GIS系统、高级项目管理...
**GEF(Graphical Editing Framework)** 是一个用于构建图形化编辑器的开源框架,它在Eclipse平台上广泛使用,特别是在开发复杂的图形用户界面和工具时。本资料集旨在为初学者提供一个全面的入门指南,帮助理解GEF...
GEF(Graphical Editing Framework)是Eclipse平台下的一个开源图形编辑框架,用于构建可视化的图形编辑工具。它提供了一套强大的API和设计模式,使得开发者能够轻松创建复杂的图形用户界面,特别是那些需要进行图形...
"GEFApp"这个例子可能是通过创建一个简单的图形编辑场景来展示GEF的基本用法。比如,它可能包含一个画布,用户可以在上面绘制和编辑一些基本形状,如圆形、矩形,并能进行拖拽、缩放、旋转等操作。源码中会展示如何...
Java GEF(Graphical Editing Framework)开发实例是一个深入理解并应用GEF框架的优秀实践案例。GEF是Eclipse平台上用于构建图形编辑器的库,它提供了构建图形用户界面(GUI)所需的基础结构,尤其适合创建复杂的...
- **流程图编辑器**:设计工作流或业务流程时,GEF可以帮助构建图形化的流程表示。 - **UML建模工具**:支持创建和编辑类图、序列图等多种UML模型。 5. **扩展与自定义** - **Zest图表库**:作为GEF的一个扩展,...
GEF-II地电场仪是一种专门用于测量地球表面地电场的设备,主要观测地球内部自然电场以及外部非人工电流体系与地球介质相互作用产生的电场。本手册详细介绍了该仪器的使用方法、技术指标、组成部分以及故障排除等,为...
标题中的“GEF资源打包”指的是一个集合了关于GEF(Graph Edit Framework)的各种学习资料的压缩文件。这个资源包可能包含了对理解、学习和使用GEF非常有帮助的材料。描述进一步说明了这个包中包含的具体内容,如...
#### 一、GEF简介与环境配置 **GEF**,全称为**Graphical Editing Framework**,是Eclipse平台上用于创建复杂图形编辑器的框架。它提供了一套完整的工具集,使开发者能够构建具有图形化用户界面的应用程序,特别...
根据给定的信息,本文将详细解释“GEF-whole-upload”这一主题,主要涉及GEF的基本结构及其在RCP项目中的应用。 ### GEF的基本结构理解 #### GEF简介 GEF (Graphical Editing Framework) 是Eclipse平台提供的一个...
**GEF(Graphical Editing Framework)** 是一个用于构建图形编辑工具的开源框架,它为开发人员提供了一套全面的库和工具,用于创建基于Eclipse的富客户端平台(RCP)的应用程序,特别是那些涉及图形用户界面(GUI)...
接下来,我们将创建一个Editor,这是GEF应用中最核心的部分之一。通常情况下,GEF会集成到Editor中而非View中,这是因为Editor提供了文件保存机制,这对于图形编辑来说非常关键。 1. **创建Editor**: - 在`plugin....
在执行这些命令时,GEF框架会确保模型的同步更新,同时更新图形视图,以反映这些操作。 此外,`XYLayoutEditPolicy`还可能涉及其他的布局相关方法,如`layout()`,用于在需要时自动调整图形元素的布局,确保图形...
2. **创建视图**:使用GEF创建一个图形化的视图来显示模型。 3. **实现交互**:通过GEF提供的工具实现实时的编辑功能。 #### 四、总结 Eclipse EMF与GEF是两个非常强大的工具,它们分别解决了模型定义和图形化编辑...
学习这个例子,开发者可以了解如何使用GEF创建一个完整的图形编辑环境,包括用户交互、图形绘制和模型管理。这将为开发复杂的图形编辑应用打下坚实的基础。在实践中,可以进一步扩展GEF,例如添加自定义图形元素、...
8. **适配器(Adapters)**:适配器用于在不同组件之间传递信息,使得非GEF的对象也能参与到图形编辑中。 9. **事件处理(Event Handling)**:DRAW2D和GEF都提供了丰富的事件处理机制,允许监听和响应用户操作,如...