实 现撤消/重做的功能,一般Action执行的时候要建立一个Command,将后者加入CommandStack 里,然后执行这个Command对象,而不是直接把执行代码写在Action的run()方法里。下面是 我们的设置优先级PriorityAction的部分代码,该类继承自SelectionAction:
public void run() {
execute(createCommand());
}
private Command createCommand() {
List objects = getSelectedObjects();
if (objects.isEmpty())
return null;
for (Iterator iter = objects.iterator(); iter.hasNext();) {
Object obj = iter.next();
if ((!(obj instanceof NodePart)) && (!(obj instanceof NodeTreeEditPart)))
return null;
}
CompoundCommand compoundCmd = new CompoundCommand (GEFMessages.DeleteAction_ActionDeleteCommandName);
for (int i = 0; i < objects.size(); i++) {
EditPart object = (EditPart) objects.get(i);
ChangePriorityCommand cmd = new ChangePriorityCommand();
cmd.setNode((Node) object.getModel());
cmd.setNewPriority(priority);
compoundCmd.add(cmd);
}
return compoundCmd;
}
protected boolean calculateEnabled() {
Command cmd = createCommand();
if (cmd == null)
return false;
return cmd.canExecute();
}
因为允许用户一次对多个选中的节点设置优先级,所以在这个Action里我们创建了多个 Command对象,并把它们加到一个CompoundCommand对象里,好处是在撤消/重做的时候也可以 一次性完成,而不是一个节点一个节点的来。
[Eclipse]GEF入门系列(六、添加菜单和工具条)(5)
时间:2011-04-19 cnblogs bjzhanghao
上下文菜单
在GEF里实现右键弹出的上下文菜单是很方便的,只要写一个继承org.eclipse.gef. ContextMenuProvider的自定义类,在它的buildContextMenu()方法里编写添加菜单项的代码 ,然后在编辑器里调用GraphicalViewer. SetContextMenu()即可。GEF为我们预先定义了一 些菜单组(Group)用来区分不同用途的菜单项,每个组在外观上表现为一条分隔线,例如有 UNDO组、COPY组和PRINT组等等。如果你的菜单项不适合放在任何一个组中,可以放在OTHERS 组里,当然如果你的菜单项很多,也可以定义新的组用来分类。
图3 上下文菜单
假设我们要实现如上图所示的上下文菜单,并且已经创建并在ActionRegistry里了这些 Action(在Editor的createActions()方法里完成),ContextMenuProvider应该像下面这样 写:
public class CbmEditorContextMenuProvider extends ContextMenuProvider {
private ActionRegistry actionRegistry;
public CbmEditorContextMenuProvider(EditPartViewer viewer, ActionRegistry registry) {
super(viewer);
actionRegistry = registry;
}
public void buildContextMenu(IMenuManager menu) {
// Add standard action groups to the menu
GEFActionConstants.addStandardActionGroups(menu);
// Add actions to the menu
menu.appendToGroup(GEFActionConstants.GROUP_UNDO,getAction (ActionFactory.UNDO.getId()));
menu.appendToGroup(GEFActionConstants.GROUP_UNDO, getAction (ActionFactory.REDO.getId()));
menu.appendToGroup(GEFActionConstants.GROUP_EDIT, getAction (ActionFactory.DELETE.getId()));
menu.appendToGroup(GEFActionConstants.GROUP_REST
|