如何给Action设置快捷键,可参考这里: http://www.mytju.com/classcode/news_readNews.asp?newsID=318
给Action绑定快捷键的时候,是用的activateHandler方法。 解除关系的话,用deactivateHandler方法就行了。
以前是上来就给绑定上了,这样处理是不正确的。 以粘贴的快捷键为例,应该在有东西可粘贴的时候,来active它,没东西粘贴的时候,就马上调用deactivate。 可以在SelectionChanged等一些事件处理中做这些事情。
整理的代码如下,仅供参考:
/** 处理者Map. */ private Map<String, IHandlerActivation> handlerMap = new HashMap<String, IHandlerActivation>();
/** * 激活动作处理者. * * @param commandId * 命令ID * @param handler * 动作处理者 */ public void activateHandler(String commandId, ActionHandler handler) {
if (handlerMap.containsKey(commandId)) { return; }
// 取得Handler服务 IHandlerService handlerService = (IHandlerService) editor.getSite() .getService(IHandlerService.class);
// 激活handler IHandlerActivation activation = handlerService.activateHandler( commandId, handler);
// 保存到Map,以便之后使用 handlerMap.put(commandId, activation); }
/** * 停用动作处理者. * * @param commandId * 命令ID */ public void deactivateHandler(String commandId) {
if (!handlerMap.containsKey(commandId)) { return; }
// 取得Handler服务 IHandlerService handlerService = (IHandlerService) editor.getSite() .getService(IHandlerService.class);
// 停用handler IHandlerActivation activation = handlerMap.get(commandId); handlerService.deactivateHandler(activation);
// 从Map中移除 handlerMap.remove(commandId); }
/** * 设置“剪切”快捷键是否可用. * * @param enabled * 是否可用 */ public void setCutEnabled(boolean enabled) { if (enabled) { activateHandler(IWorkbenchCommandConstants.EDIT_CUT, new ActionHandler(cutAction)); } else { deactivateHandler(IWorkbenchCommandConstants.EDIT_CUT); } }
/** * 设置“复制”快捷键是否可用. * * @param enabled * 是否可用 */ public void setCopyEnabled(boolean enabled) { if (enabled) { activateHandler(IWorkbenchCommandConstants.EDIT_COPY, new ActionHandler(copyAction)); } else { deactivateHandler(IWorkbenchCommandConstants.EDIT_COPY); } }
/** * 设置“粘贴”快捷键是否可用. * * @param enabled * 是否可用 */ public void setPasteEnabled(boolean enabled) { if (enabled) { activateHandler(IWorkbenchCommandConstants.EDIT_PASTE, new ActionHandler(pasteAction)); } else { deactivateHandler(IWorkbenchCommandConstants.EDIT_PASTE); } }
/** * 设置“删除”快捷键是否可用. * * @param enabled * 是否可用 */ public void setDeleteEnabled(boolean enabled) { if (enabled) { activateHandler(IWorkbenchCommandConstants.EDIT_DELETE, new ActionHandler(deleteAction)); } else { deactivateHandler(IWorkbenchCommandConstants.EDIT_DELETE); } }
/** * 设置“全选”快捷键是否可用. * * @param enabled * 是否可用 */ public void setSelectAllEnabled(boolean enabled) { if (enabled) { activateHandler(IWorkbenchCommandConstants.EDIT_SELECT_ALL, new ActionHandler(selectAllAction)); } else { deactivateHandler(IWorkbenchCommandConstants.EDIT_SELECT_ALL); } }
里面的cutAction,copyAction之类的,是我自己写的处理类。
只要在适当的时机,调用setCutEnabled()、setCopyEnabled这些方法就OK了。 快捷键直接就不可用了,Edit菜单的Cut、Copy等项目也自动灰掉了。 当然,你界面中的一些按钮、右键菜单之类的状态还得设置一下。
|