GEF-自定义Request、Command与Action

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

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

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


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

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

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

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

@Override
	protected void createActions() {
		super.createActions();
		IAction action1 = new SelectionAction(this) {
			
			@Override
			protected boolean calculateEnabled() {
				//为true时候事件触发,为false不触发,可以用来作action拦截,当满足一些条件的时候action才可用
				return true;
			}
			
			
			@Override
			public 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";


	
	@Override
	public 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;
	}
	 
	 @Override
	public 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());
		//自定义的请求类型用来弹出dialog
		installEditPolicy(ShowDialogPolicy.SHOW_DIALOG_ROLE, new ShowDialogPolicy());
	}

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






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值