gef创建对象时,弹出一对话框,用以设置创建对象的参数信息
编程技术  /  houtizong 发布于 3年前   73
在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;// 创建对象对应的createCommandString 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的EntityCombinedTemplateCreationEntry 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;}
到这儿,就大功告成了。
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接