工具栏或菜单栏的子元素(就是各种工具按钮或者菜单项)有多种实现方式,比如通过最传统的Action等,但是,
问题:
如何在图形配置Command实现工具栏或菜单栏子元素的情况下,控制Command的可用不可用能?
1.首先是对org.eclipse.ui.menus插件进行扩展:
(1)创建菜单栏
右键-->new-->menuContribution:
-----locationURI*: menu:org.eclipse.ui.main.menu
-----class: (可以不填)
-----allPopups: false
然后,创建菜单项:(可用创建多个,这里就创建一个File菜单项为例)
在menuContributions上 右键--->new--->menu
------label*: File
------id: (可以不填)
------mnemonic: F(这个是表示Ctrl+F快捷键)
------(其他的可以不填)
然后,创建File菜单的子菜单项,用Command的形式(比如new、exit等)
在File(menu)上右键--->new--->command
------commandId*: org.xxx.xxx.NewCommand(需要自定义Command,扩展org.eclipse.ui.commands插件,稍后说明)
------label: new
------(其他可选填)
(2)创建工具栏
步骤和创建菜单类似,不过有几个地方要改动:
在org.eclipse.ui.menus上右键--->new ---->menuContribution
-----locationURI*: toolbar:org.eclipse.ui.main.toolbar
-----class: (可以不填)
-----allPopups: false
然后,创建工具栏项
在menuContributions上 右键--->new--->toolbar
在toolbar上创建Command就和Menu时的一样了
(于是菜单栏和工具栏都建好了)
(同样,可用创建多个command,不过这个Command只是个引用,还需要有真正的对象可调:于是应该扩展org.eclipse.ui.commands插件)
2.对org.eclipse.ui.commands插件进行扩展:
----new---->command
--------id*:org.xxx.xxx.NewCommand(和前面指定的commandID对应)
--------defaultHandler:这里就是Command的具体实现,继承org.eclipse.core.commands.AbstractHandler实现自己的handler
===================================
现在菜单栏和工具栏都创建好了,如果再加入了各子的defaultHandler就可以促发事件正常使用了,但是,如果想控制command的可用不可用该怎么办呢,就回到了开始的问题上?
-------------------
看看各个扩展点的情况可以得知:org.eclipse.ui.menus的menu和toolbar中只能控制其visibleWhen(显示与否,而不是可用与否---注意:这两点是不同的)---行不通
--------------------
那么解决办法呢?
======================
就是扩展org.eclipse.ui.handlers对自定义实现的handler进行操作,进而控制command的可用与否。
--------------
扩展 org.eclipse.ui.handlers
----new ---->handler(填写commandID--即该handler所关联的command的id;class就是该handler的具体实现类)
----->enabledWhen/activeWhen-----------这里就可以控制handler的状态了
可用通过ISourse的一些状态,比如某个view、Editor或者透视图活动的时候才使该handler可用。(具体可参考org.eclipse.ui.handlers扩展点的Eclipse帮助文档)。
在这里我举个例子:
eg.: handler----enabledWhen-----with
Variable*: activeWorkbenchWindow.activePerspective-----value*: org.xxx.xxx.YourRCPPerspective
代表的意思就是:该handler在YourRCPPerspective透视图活动的时候 可用。activeWorkbenchWindow.activePerspective是org.eclipse.ui.ISources的变量,可用直接看其源码。
//ISources部分源码
public interface ISources {
public static final String ACTIVE_CONTEXT_NAME = "activeContexts";
public static final String ACTIVE_ACTION_SETS_NAME = "activeActionSets";
public static final String ACTIVE_SHELL_NAME = "activeShell";
public static final String ACTIVE_WORKBENCH_WINDOW_SHELL_NAME = "activeWorkbenchWindowShell";
public static final String ACTIVE_WORKBENCH_WINDOW_IS_COOLBAR_VISIBLE_NAME = ACTIVE_WORKBENCH_WINDOW_NAME
+ ".isCoolbarVisible";
public static final String ACTIVE_WORKBENCH_WINDOW_IS_PERSPECTIVEBAR_VISIBLE_NAME = ACTIVE_WORKBENCH_WINDOW_NAME
+ ".isPerspectiveBarVisible";
public static final String ACTIVE_MENU_SELECTION_NAME = "activeMenuSelection";
public static final String ACTIVE_MENU_EDITOR_INPUT_NAME = "activeMenuEditorInput";
public static final String ACTIVE_FOCUS_CONTROL_NAME = "activeFocusControl";
public static final String ACTIVE_FOCUS_CONTROL_ID_NAME = "activeFocusControlId";
//....
}
你可以根据编程实际需要,选择合适的variable,当然也可以定义自己的:
//1.设置自己的AbleMark
IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class);
IEvaluationContext context = handlerService.getCurrentState();
context.addVariable(“AbleMark”, xxxValue);
//2.请求该mark(使该mark处于被激活状态)
IEvaluationService service = (IEvaluationService)getSite().getService(IEvaluationService.class);
service.requestEvaluation(“AbleMark”);
-----这时,"AbleMark"就是自定义的variable,从而实现对handler的更个性化的控制。