GEF-自定义Request、Command与Action

来源:互联网 发布:python dom 修改xml 编辑:程序博客网 时间:2024/06/05 00:27

本文中涉及到的例子可以在以下URL下载。导入eclipse项目即可,我的环境的Eclipse4.3.1

http://download.csdn.net/detail/hoslay1/6925761

如果有问题请联系我QQ:195307039说明来意即可。


GEF中如果需要自定义Request或者Action可以参考以下方式 。

假如我希望在键盘按下F3时,弹出一个Dialog

并且希望通过自定义的一个Action以及Request来实现它

1.自定义Action并注册到Editor中

@Overrideprotected void createActions() {super.createActions();IAction action1 = new SelectionAction(this) {@Overrideprotected boolean calculateEnabled() {//为true时候事件触发,为false不触发,可以用来作action拦截,当满足一些条件的时候action才可用return true;}@Overridepublic void run() {//创建一个新的请求,弹出dialog的请求List<EditPart> editorParts = viewer.getSelectedEditParts();if(editorParts != null && !editorParts.isEmpty() && editorParts.get(0) instanceof GTableEditPart){GTableEditPart table = (GTableEditPart)editorParts.get(0);ShowDialogRequest request = new ShowDialogRequest((AbstractModel)table.getModel());Command command = table.getCommand(request);getEditDomain().getCommandStack().execute(command);}}};action1.setId("TestDialog");registry.registerAction(action1);getSelectionActions().add(action.getId());}
我通过实现了一个匿名内部类的方式来自定义一个Action,注意里面的setId方法,它是设置Action的ID,这个ID很重要,它是获取这个action对象的KEY

registry.registerAction方法用来将这个action注册到Editor中

因为我是希望在选中控件时按下F3才触发,所以用getSelectionActions().add方法将它加入到选择的actions中,以让它在选择事件中生效

configureGraphicalViewer的keyHandler.put(KeyStroke.getPressed(SWT.F3, 0), getActionRegistry().getAction("TestDialog"));就能够将这个action与F3进行绑定。

关于与键盘绑定可以参考本人的这个Blog

http://blog.csdn.net/hoslay1/article/details/19265257


2.action创建Request,Policy接收Request产生Command,Command弹出Dialog的标准做法

在action的run方法中,我产生了一个新的Request,这个Request就是我自己定义的

ShowDialogRequest request = new ShowDialogRequest((AbstractModel)table.getModel());
具体代码如下:

public class ShowDialogRequest extends Request{final static public String REQ_SHOW_DIALOG="REQ_SHOW_DIALOG";    private AbstractModel model;       public ShowDialogRequest(AbstractModel model) {    super();        this.model = model;        setType(REQ_SHOW_DIALOG);}public AbstractModel getModel() {return model;}        }
其实非常简单,它的作用就是为了标示,这个action产生的请求是一个ShowDialog

public class ShowDialogPolicy extends AbstractEditPolicy {final static public String SHOW_DIALOG_ROLE = "SHOW_DIALOG_ROLE";@Overridepublic Command getCommand(Request request) {//Judge whether this request is intersting by its type        if (request.getType() == ShowDialogRequest.REQ_SHOW_DIALOG) {            ShowDialogRequest theRequest = (ShowDialogRequest) request;                                          ShowDialogCommand command = new ShowDialogCommand( theRequest.getModel());            return command;        }        return null;}}

getCommand中就对Request进行了过滤,必须是ShowDialog的请求才会处理,并且生成ShowDialog的Command

public class ShowDialogCommand extends Command{ private AbstractModel model;  public ShowDialogCommand(AbstractModel model) { super();     this.model = model;}  @Overridepublic void execute() {MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "自定义Dialog", model.getText());}}
Command的处理中,我弹出了一个MessageDialog作为例子。


最后我们需要对EditPart进行安装policy,以便能识别ShowDialogRequest做出正确相应

GTableEditPart中

protected void createEditPolicies() {super.createEditPolicies();installEditPolicy(EditPolicy.COMPONENT_ROLE, new CustomComponentEditPolicy());installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new CustomDirectEditPolicy());//创建在这个下的规则,一个EditPart可以安装多个Policies,第一个参数用来指定类型installEditPolicy(EditPolicy.LAYOUT_ROLE, new GTableLayoutEditorPolicy());//自定义的请求类型用来弹出dialoginstallEditPolicy(ShowDialogPolicy.SHOW_DIALOG_ROLE, new ShowDialogPolicy());}

最后一个安装的策略就是,所有类型为Show_DIALOG_ROLE的请求,都会给ShowDialogPolicy进行处理,然后就进入上面所说的那个流程了。






0 0
原创粉丝点击