关于GEF在Editor里响应SelectAll快捷键的问题

GEF 专栏收录该内容
0 篇文章 0 订阅

最近在学习GEF-whole-upload那本书,在模仿书上例子的过程中,想给里面的图形编辑器增加一些快捷键,比如Ctrl+A(全选图
形),Ctrl+S(保存)等等。

最初的想法是再Editor的setKeyHandler方法里面,使用KeyStroke类,注册Ctrl+A,Ctrl+S等键盘事件:
private void setKeyHandler() {
        KeyHandler keyHandler = new KeyHandler();
                ...
        keyHandler.put(KeyStroke.getPressed('a', 0x1, SWT.CTRL),

getActionRegistry().getAction(ActionFactory.SELECT_ALL.getId()));
        getGraphicalViewer().setKeyHandler(
                        new GraphicalViewerKeyHandler(getGraphicalViewer())
                                        .setParent(keyHandler));

 

}

但是经过试验,这种方法无法响应Ctrl+A事件。具体原因不清楚,上网查了很多资料得不到解答。后来和傻鸟大哥讨论了一下这个问题,他认为是有更高级
的注册机制存在,屏蔽了以这种形式注册的Ctrl+A事件的响应。

今天咖啡老大刚好有空,向他请教了这个问题,终于得到解决的方法。(老大果然厉害!万分感谢!)

具体的解决方法如下:

1. 修改ApplicationActionBarAdvisor.java:在makeActions方法里面添加:
selectAll = ActionFactory.SELECT_ALL.create(window);
register(selectAll);

2. 给Editor增加一个getAction的方法:
public IAction getAction(String key) {
        return getActionRegistry().getAction(key);

 

}

3. 再在DiagramActionBarContributor.java里面的setActiveEditor方法中添加:
actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
action);
actionBars.updateActionBars();

注意:actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
action) 的第二个参数action是需要通过Editor来获取的。因此,最后
DiagramActionBarContributor.java文件的修改为:

protected IAction getAction(IEditorPart editor, String actionID) {
        if (editor instanceof DiagramEditor) {
            return ((DiagramEditor) editor).getAction(actionID);
        }

        return null;

 

}

public void setActiveEditor(IEditorPart activeEditor) {
        IActionBars actionBars = this.getActionBars();
        actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
getAction(activeEditor, ActionFactory.SELECT_ALL.getId()));
        actionBars.updateActionBars();

 

}

到此为止,图形编辑器可以响应Ctrl+A实现全选。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值