Skip to content
2009年09月29日 / jumpergo

Commands Part 1: Actions Vs Commands

e文原文戳我,作者Prakash G.R。

大家知道,有两种方法可以contributing到Workbench:Actions和Commands。尽管Commands更新更先进,我却依然爱用Actions,仅仅因为我觉得用Actions更舒服。眼下,我开始改Command架构的一些bug了,所以被迫要深入Commands的细节了。越了解Commands,我就越爱它。于是,我打算给Commands写一个系列blog,本篇是第一篇。这里的大量内容都来自于看以前的bugwiki和研究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

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Connecting to %s

加关注

Get every new post delivered to your Inbox.