Eclipse 插件开发 快捷键冲突(A conflict occurred for xxx)
问题:
?
Binding(CTRL+S,
ParameterizedCommand(Command(org.eclipse.ui.file.save,Save,
Save the current contents,
Category(org.eclipse.ui.category.file,File,null,true),
org.eclipse.ui.internal.handlers.SaveHandler@fbd1fc,
,,true),null),
org.eclipse.ui.defaultAcceleratorConfiguration,
org.eclipse.ui.contexts.window,,,system)
Binding(CTRL+S,
ParameterizedCommand(Command(cn.com.bankit.ide.bsp.navigator.command.shield,屏蔽 F2,
,
Category(org.eclipse.core.commands.categories.autogenerated,Uncategorized,Commands that were either auto-generated or have no category,true),
,
,,true),null),
org.eclipse.ui.defaultAcceleratorConfiguration,
org.eclipse.ui.contexts.window,,,system)
?
?
?
如何屏蔽掉Eclipse插件本身的快捷键,使自定义的快捷键功能有效。
1. 屏蔽所有快捷键 (这个方法显然是杀鸡取卵)
((IBindingService)PlatformUI.getWorkbench().getAdapter(IBindingService.class)).setKeyFilterEnabled(false);
PS.:这个能屏蔽所有的Binding 包括自定义的,这显然不合适。
2. 采用默认的ContextID:org.eclipse.ui.contexts.window。 这里有一个缺点,输入快捷键时,同时出现两个快捷键。
? 在plugin.xml中实现:
? ?<extension
? ? ? ? ?point="org.eclipse.ui.bindings">
? ? ? <key
? ? ? ? ? ? commandId="org.xxx.SaveConfigHandler"
? ? ? ? ? ? contextId="org.eclipse.ui.contexts.window"
? ? ? ? ? ? schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
? ? ? ? ? ? sequence="CTRL+S">
? ? ? </key>
? ?</extension>
3. 屏蔽eclipse的快捷键,使自己的快捷键生效。(这就是所谓的走别人的路,让别人无路可走)
指定自定义ContextID,只有在该ContextID下快捷键才有效。
在plugin.xml中实现扩展点org.eclipse.ui.bindings
?<extension
? ? ? ? ?point="org.eclipse.ui.bindings">
? ? ? <key
? ? ? ? ? ? commandId="org.xxxx.SaveConfigHandler"
? ? ? ? ? ? contextId="cn.com.xxx.Context"
? ? ? ? ? ? schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
? ? ? ? ? ? sequence="F2">
? ? ? </key>
? ?</extension>
同时扩展:
? ?<extension
? ? ? ? ?point="org.eclipse.ui.contexts">
? ? ? <context
? ? ? ? ? ? id="cn.com.xxx.Context"
? ? ? ? ? ? name="MY Context"
? ? ? ? ? ? parentId="org.eclipse.ui.contexts.window">
? ? ? </context>
? ?</extension>
(以 CommonNavigatorView的F2为例,editor也是一样的道理。
重写起init方法如下:
? ? public void init(IViewSite site, IMemento memento) throws PartInitException
? ? {
? ? ? ? super.init(site, memento);
? ? ? ? ....
....
? ? ? ? IContextService contextService = (IContextService) getSite()
? ? ? ? ? ? ? ? .getService(IContextService.class);
? ? ? ? contextService.activateContext("cn.com.xxx.Context");
? ? }