首先讲一下eclipse中给Action中添加快捷键的一般方法
要添加快捷键,必须要扩展eclipse的org.eclipse.ui.command和org.eclipse.ui.binding这两个extension.然后Action和command关联,command又和一个binding关联起来,这样就间接的使action和binding有了关联.有人会问,这样做是不是太麻烦了,我直接把action和binding关联起来不就行了?最好是有个方法,比如action.setKeybind("Ctrl+A").其实eclipse这样做是涉及到设计模式的问题.如果用这种"简单"方法,你以后如果想要改actioon的快捷键就要去改action的源码了,是一种紧耦合的关系.而eclipse的处理方式削弱了这种耦合,你如果要改快捷键,改binding就可以了,你还可以让一个action在不同的perspective,甚至是不同的view中使用不同的快捷键.让一个action对应多个快捷键等等.
command和binding的关联在你扩展这两个extension的时候就可以建立了,下面看看怎么让一个action对应一个command
在你的插件中添加Action有两种方法:1.通过plugin.xml扩展extension.2.直接在代码中code. 如果是用第一种方法,在Action的设置中会有definitionId这一项,你把它填上你自己写的command的Id就好了;如果是第二种方法,那需要在你的定义action的代码中加上两句:
yourAction.setActionDefinitionId("commandId");
getViewSite().getKeyBindingService().registerAction(yourAction);
这两种方法是等效的
但要给viewaction添加快捷键以上两种方法都有点问题.viewaction在plugin.xml文件中是没有definitionId这一项的,所以你没办法设置;如果你是program方法,由于viewaction不是继承自Action类的,所以你也不能用setActionDefinitionId这个方法.聪明的你可能会想到了,那我让viewaction继承Action不就行了:
public class ViewAction
extends Action implements IViewActionDelegate //红色部分是自己添加的extends
{ ...
public void init(IViewPart view) {
this.view=view;
this.setActionDefinitionId("ViewAction.command1");
view.getViewSite().getKeyBindingService().registerAction(this);
}
}
这个方法理论上可以,但可惜也仅仅是理论上行得通而已.具体是为什么我也不知道,如果有大牛告知小弟不胜感激.我后来的解决办法是这样的:在viewaction的init方法中加入以下代码段
this.view=view;
IContributionItem item= view.getViewSite().getActionBars().getToolBarManager().find("ViewAction.action1");
IAction action=((ActionContributionItem)item).getAction();
action.setActionDefinitionId("ViewAction.command1");
view.getSite().getKeyBindingService().registerAction(action);
这样就可以给viewaction添加快捷键了