本文中涉及到的例子可以在以下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进行处理,然后就进入上面所说的那个流程了。