Commands Part 1: Actions Vs Commands
e文原文戳我,作者Prakash G.R。
大家知道,有两种方法可以contributing到Workbench:Actions和Commands。尽管Commands更新更先进,我却依然爱用Actions,仅仅因为我觉得用Actions更舒服。眼下,我开始改Command架构的一些bug了,所以被迫要深入Commands的细节了。越了解Commands,我就越爱它。于是,我打算给Commands写一个系列blog,本篇是第一篇。这里的大量内容都来自于看以前的bug,wiki和研究CVS中的历史记录。如果我弄错了什么东西,或者少了什么东西,跟我说一声。
我们从Actions开始。我们可以contribute东西到菜单,工具条,下拉菜单等等。我们能在plugin.xml中指定界面的细节,比如label或者tooltip。这会给lazy loading带来帮助。那么有什么问题么?
- 界面和界面处理通常被绑在一起了,你没办法让它们分开来
- Actions可以contribute到workbench的不同地方(右键菜单/工具条),但是这些地方是不同的扩展点(extension point)。所以你要在多个地方重复XML配置。最糟的是,不是所有的扩展点都有一样的配置。
- 在不同的地方指定Actions,是维护时的噩梦。如果你要给一个action改图标,你要把用到的所有地方都改到才行
- 还有一个问题是,在plugin.xml中重复的actions,会使得同样的actions在内存中拥有多个实例(instance)
那么来看看Commands架构是如何消除这些问题的。Commands定义在扩展点org.eclipse.ui.commands中。一个典型的command例子:
<command
id="com.eclipse-tips.commands.someCommand"
name="Some Command">
</command>
搞定。一个Command定义好了。如果你打算把它放到工具条中,就要用扩展点org.eclipse.ui.menus:
<menuContribution
locationURI="toolbar:org.eclipse.ui.main.toolbar">
<toolbar
id="com.eclipse-tips.commands.toolbar1">
<command
commandId="com.eclipse-tips.commands.someCommand"
id="com.eclipse-tips.commands.someCommandInToolBar">
</command>
</toolbar>
</menuContribution>
现在它在UI中找到位置了。但用来执行的代码在哪里呢?在另一个扩展点中:org.eclipse.ui.handlers
<handler
class="com.eclipse_tips.commads.SomeCommandHandler"
commandId="com.eclipse-tips.commands.someCommand">
</handler>
最后一块拼图是给command加上图标。随便猜猜就知道,你要用个扩展点,org.eclipse.ui.commandImages:
<image
commandId="com.eclipse-tips.commands.someCommand"
icon="icons/sample.gif">
</image>
收工。来看看Command的效果
你也发现了,本来用action只要一个扩展点,而不是现在的四个扩展点。这个是不是听起来像是在绕远路?也许当我们了解到command可以具有多重handler,并且这些handler可以基于上下文关联和决定使用哪个handler的时候,我们才能领悟这个架构的优美之处。欲知详情,且听下回分解。
参见:
Part 2: Handlers的选择和使用
Part 3: Commands的参数
Part 4: 杂项……
Part 5: ISourceProvider和动态更新Commands
Part 6: “toggle & radio”风格的菜单contribution
