上次说到了菜单 工具条按钮 上下文菜单都已经改为用command的方式去做了,这次稍微详细地说说。
在command的实现拓展点handler上右键,可以看到有enabledWhen,activeWhen,在menu上的command右键,会有visibleWhen的选项,都是一些可以控制command可见,可用的状态,如下图,可以看到一些固定的使用方法已经定义好了在里面了。
具体的使用方法可以参考官方的command core expression
除了这些已经帮我们定义好的,如果还有自己的需求,可以在此基础上添加自己的表达式。
新建一个org.eclipse.core.expressions扩展点,如图这么设置它,意思是在当且只有一个元素被选中的时候。
使用的时候只需要在我们定义好的handler上增加enabledWhen,然后选择我们定义好的表达式,这样的意思就是当且只有一个元素被选中的时候,这个handler为可用,否则不可用。
由于这个表达式是基于selection的,所以我们要在我们的视图上进行注册。
public void createPartControl(Composite parent) { viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); viewer.setContentProvider(new ViewContentProvider()); viewer.setLabelProvider(new ViewLabelProvider()); viewer.setInput(getViewSite()); // 使selection对这个视图起作用 getSite().setSelectionProvider(viewer); }
在eclipse里包含了很多官方已经定义好的command,有些时候我们拿过来就直接可以用,包括功能,图标等等。
比如eclipse中的about菜单。
我们在我们的菜单中添加一个command,ID指向org.eclipse.ui.help.aboutAction,这样便可以使用了。
还有一种通过代码的方式,往ActionFactory中加入它们。使用方法如下:
@Override protected void makeActions(IWorkbenchWindow window) { IWorkbenchAction quickStartAction = ActionFactory.INTRO.create(window); register(quickStartAction); IWorkbenchAction resetView = ActionFactory.RESET_PERSPECTIVE .create(window); register(resetView); }
command也支持直接从代码中调用,方法如下:
IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class); try { handlerService.executeCommand("add.command", null); } catch (Exception ex) { throw new RuntimeException("add.command not found"); // Give message } }
command还能定义命令接受参数,提供自己更为细致的表达式判断,还可以支持在runtime环境中定义command,这和action有点像。余下的部分留在下次说好了。
参考链接:http://www.vogella.com/tutorials/EclipseCommandsAdvanced/article.html