这两天在配置一个CNF导航视图时候发现快捷键delete、past、copy等都失效了,折腾良久,搞清楚了;
1.快捷键要想能在菜单右边显示出来:
deleteAction.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_DELETE);
2.要想生效必须绑定handler:
@Override
public void fillActionBars(final IActionBars actionBars) {
if (textActionHandler == null) {
textActionHandler = new TextActionHandler(actionBars); // hook
// handlers
}
textActionHandler.setCopyAction(copyAction);
textActionHandler.setPasteAction(pasteAction);
textActionHandler.setDeleteAction(deleteAction);
// renameAction.setTextActionHandler(textActionHandler);
updateActionBars();
textActionHandler.updateActionBars();
}
public void updateActionBars() {
actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(),
textCutAction);
actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
textCopyAction);
actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
textPasteAction);
actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
textSelectAllAction);
actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
textDeleteAction);
}
setGlobalActionHandler把id和action绑定到一块;
这里你发现绑定的action并不是自己那个action,是texthandler中的action;
如果想强制生效可以直接把这个action换成我们那个action;
3.推荐的解决方法:
之所以不生效,是因为系统找不到action对应的commandid,我们可以绑定:
protected void makeActions() {
clipboard = new Clipboard(shell.getDisplay());
...
deleteAction.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_DELETE);
initActionCommandMappingService();
}
/**
* 快捷键绑定actionBars.setGlobalActionHandler();
* 这里使用了textActionHandler.updateActionBars();所以绑定的是textActionHandler中text*Action,而不是这里的action;
* 方法一:重新设置setGlobalActionHandler为这里的action;
* 方法二:ActionCommandMappingService中添加这里的action映射WorkbenchCommandConstants.EDIT_*
*/
private void initActionCommandMappingService() {
final IActionCommandMappingService actionCommandMappingService = (IActionCommandMappingService) CommonUIPlugin.getDefault().getWorkbench()
.getActiveWorkbenchWindow().getService(IActionCommandMappingService.class);
final String idDelete = actionCommandMappingService.getCommandId(ActionFactory.DELETE.getId());
if (idDelete == null) {
actionCommandMappingService.map(ActionFactory.DELETE.getId(), IWorkbenchCommandConstants.EDIT_DELETE);
}
final String idCopy = actionCommandMappingService.getCommandId(ActionFactory.COPY.getId());
if (idCopy == null) {
actionCommandMappingService.map(ActionFactory.COPY.getId(), IWorkbenchCommandConstants.EDIT_COPY);
}
final String idPast = actionCommandMappingService.getCommandId(ActionFactory.PASTE.getId());
if (idPast == null) {
actionCommandMappingService.map(ActionFactory.PASTE.getId(), IWorkbenchCommandConstants.EDIT_PASTE);
}
}
这样问题就解决了