我们已经了解了添加到工作台中的各种菜单和工具栏的几个不同的扩展点。如何知道要使用哪一个?下表总结了各种菜单添加项以及它们的用途。
扩展点名称 |
操作的位置 |
详细信息 |
---|---|---|
viewActions |
操作出现在特定视图的本地工具栏和本地下拉菜单中。 |
添加用来实现 IViewActionDelegate 的操作类。指定添加项的标识以及应该显示操作的目标视图的标识。标号和图像决定了操作在 UI 中的外观。路径指定相对于视图的菜单项和工具栏项的位置。 |
editorActions |
操作与编辑器相关联,并且出现在工作台菜单和/或工具栏中。 |
添加用来实现 IEditorActionDelegate 的操作类。指定添加项的标识以及导致显示操作的目标编辑器的标识。标号和图像指定操作在 UI 中的外观。单独的菜单和工具栏路径指定该添加项项在工作台菜单和工具栏中是否存在及其位置。 |
popupMenu |
操作出现在编辑器或视图的弹出菜单中。与某种对象类型相关联的操作显示在显示该对象类型的视图和编辑器的所有弹出菜单中。与特定弹出菜单相关联的操作只出现在该弹出菜单中。 |
对象添加项指定操作应该出现在弹出菜单中的对象的类型。操作将显示在包含该对象类型的所有视图和编辑器弹出菜单中。提供用来实现 IObjectActionDelegate 的操作类。 |
actionSets |
操作出现在工作台主菜单和工具栏中。将操作分组成操作集。操作集中的所有操作都将根据用户对操作集的选择和工作台中当前显示的透视图来显示在工作台菜单和工具栏中。 |
添加用来实现 IWorkbenchWindowActionDelegate 或 IWorkbenchWindowPulldownDelegate 的操作类。指定操作集的名称和标识。枚举为该操作集定义的所有操作。对于每个操作,单独的菜单和工具栏路径指定该添加项项在工作台菜单和工具栏中是否存在及其位置。 |
我们已经了解了许多操作添加项,它们指定它们的操作位置的路径。让我们仔细地了解这些路径的含义。我们将通过查看工作台帮助菜单来查看路径。
用于插入新菜单、菜单项或工具栏项的位置是使用命名组来定义的。可以将命名组看作是槽或占位符, 它允许您将菜单和工具栏添加项插入到菜单或工具栏中的特定点。
工作台在类 IWorkbenchActionConstants 中定义它的所有组槽名。对于每个工作台菜单,命名组都放置在菜单中期望插件将插入新操作的那些位置。
对帮助菜单的下列描述改编自 IWorkbenchActionConstants 类定义。
Standard Help menu actions
Start group HELP_START "start"
End group HELP_END "end"
About action ABOUT "About"
标准的工作台帮助菜单由称为“start”的命名组,接着是称为“end”的命名组和最后是“About”的操作添加项。为什么有两个组?这是为了对插件将出现在帮助菜单的下面的深度提供了一些控制。当定义菜单时,可以定义尽量多的槽。添加更多的槽可以使其他插件更好控制它们的添加项出现在相对于现有添加项的位置。
但是等一下!我们知道“帮助”菜单上还有其他菜单项。这些菜单项是由插件添加的。例如,帮助插件将包含“帮助内容”菜单的操作集添加到工作台中。以下是 org.eclipse.help.ui 插件的 plugin.xml 中的标记。
<extension
point="org.eclipse.ui.actionSets">
<actionSet
id="org.eclipse.help.internal.ui.HelpActionSet"
label="%help"
visible="true">
<action id="org.eclipse.help.internal.ui.HelpAction"
menubarPath="help/helpEnd"
label="%helpcontents"
class="org.eclipse.help.internal.ui.ShowHelp"/>
</actionSet>
</extension>
将把新帮助操作放置在帮助菜单的 helpEnd 组中。如果没有为帮助菜单添加其他插件,这意味着“帮助内容”菜单项将作为菜单中的第一项出现在“关于”项上面。如果另一个插件想添加一项,使它始终出现在“帮助内容”项上面, 则可以在它的路径上指定 helpStart 组。
工具栏路径的工作方式相似。每当指定路径时,它必须以工具栏中的组名结尾。
完整的菜单或工具栏路径实际上是菜单名和命名组对的列表。工作台的菜单名也是在 IWorkbenchActionConstants 中定义的。这就是我们如何知道帮助操作的全限定路径名是“help/helpEnd”的原因。
某些菜单具有嵌套的子菜单。此时较长的路径就开始起作用了。如果帮助菜单已经定义了一个称为“submenu”的子菜单, 并且该子菜单具有称为“submenuStart”的命名组, 则在新子菜单中的操作的全限定菜单路径将为“help/submenu/submenuStart” 。
以上示例还演示了一种使出现在 UI 中的字符串外部化的技术。这对于将插件的 UI 转换成其他语言是很有用的。可以通过将 plugin.xml 文件中的字符串替换为键(例如,%help, %helpcontents), 并在表单的 plugin.properties 文件中创建条目的方法来使字符串外部化:
help = "Help"
helpContents = "Help Contents"
这样,就可以将 plugin.properties 文件转换成不同的语言, 并且将不需要修改 plugin.xml。
在我们到目前为止所看到的许多示例中, 已经将样本插件添加的操作添加到菜单和工具栏中的现有命名组中。
actionSets、viewActions、editorActions 和 popupMenus 扩展点还允许您在添加项中定义新菜单和组。这就意味着您可以定义新的子菜单或新的下拉菜单,并将您的操作添加到这些新菜单。在此情况下,新操作的路径将包含最新定义的菜单的名称。
在自述文件工具为其操作集定义新菜单时,我们就可以了解此技术。既然已经详细考察了菜单路径,现在就再一次考察标记。
<extension
point = "org.eclipse.ui.actionSets">
<actionSet id="org_eclipse_ui_examples_readmetool_actionSet"
label="ReadMe Actions"
visible="true">
<menu id="org_eclipse_ui_examples_readmetool"
label="Readme &File Editor"
path="window/additions">
<separator
name="slot1"/>
<separator
name="slot2"/>
<separator
name="slot3"/>
</menu>
<action id="org_eclipse_ui_examples_readmetool_readmeAction"
menubarPath="window/org_eclipse_ui_examples_readmetool/slot1"
toolbarPath="readme"
label="&Open Readme Browser@Ctrl+R"
tooltip="Open
Readme Browser"
helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context"
icon="icons/basic/ctool16/openbrwsr.gif"
class="org.eclipse.ui.examples.readmetool.WindowActionDelegate"
enablesFor="1">
<selection
class="org.eclipse.core.resources.IFile"
name="*.readme">
</selection>
</action>
</actionSet>
</extension>
我们添加了一个称为“org_eclipse_ui_examples_readmetool”的新菜单。其标号是字符串“Readme &File Editor”。在此菜单中,我们定义了三个命名组: “slot1”、“slot2”和“slot3”。将此新菜单添加至路径“window/additions”。
如果返回到 IWorkbenchActionConstants, 我们将在 javadoc 中看到此窗口菜单的定义:
* <h3>Standard Window menu actions</h3>
* <ul>
* <li>Extra Window-like action group (<code>WINDOW_EXT</code>)</li>
如果进一步查看类定义,我们将看到下列相关定义:
public static final String MENU_PREFIX = "";
...
public static final String M_WINDOW = MENU_PREFIX+"window";
...
public static final String MB_ADDITIONS = "additions"; // 组。
...
public static final String WINDOW_EXT = MB_ADDITIONS; // 组。
根据此信息,我们可以拼凑出用于将某些内容添加到工作台“窗口”菜单的路径。菜单本身称为“window”,并且它定义一个称为“additions”的槽。我们使用路径“window/additions”来添加新菜单。
在操作集声明中,我们使用路径“window/org_eclipse_ui_examples_readmetool/slot1”来将操作添加到新定义的菜单中。
通过使用此相同路径(或者也许是其他槽之一)来添加它们自己的其中一个菜单, 就可以将其他插件添加到我们的菜单中。
通常,最好不要通过从 plugin.xml 中派生路径名来向另一插件的菜单或工具栏作添加。插件的将来版本可能会更改路径的名称。建议定义公用接口(很象 IWorkbenchActionConstants), 它精确地指定哪些菜单、工具栏组和槽是可供其他插件使用的适当对象。