我们已经了解了许多操作添加项,它们指定它们的操作位置的路径。让我们仔细地了解这些路径的含义。我们将通过查看工作台帮助菜单来查看路径。
用于插入新菜单、菜单项或工具栏项的位置是使用命名组来定义的。可以将命名组看作是槽或占位符, 它允许您将菜单和工具栏添加项插入到菜单或工具栏中的特定点。
工作台在类 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.ui.internal.HelpContentsAction" icon="icons/view.gif" helpContextId="org.eclipse.help.ui.helpContentsMenu" tooltip="%openhelpcontents"/> ...
将把新帮助操作放置在帮助菜单的 helpEnd 组中。如果没有为帮助菜单添加其它插件,这意味着“帮助内容”菜单项将作为菜单中的第一项出现在“关于”项上面。如果另一个插件想添加一项, 使它总是出现在“帮助内容”项之上, 则可以在其路径上指定 helpStart 组。
工具栏路径的工作方式相似。每当指定路径时,它必须以工具栏中的组名结尾。
完整的菜单或工具栏路径只是“菜单名/组名”。 工作台的菜单名在 IWorkbenchActionConstants 中定义。使用此类将会发现帮助操作的全限定路径名为“help/helpEnd”。
某些菜单具有嵌套的子菜单。此时较长的路径就开始起作用了。如果帮助菜单已经定义了一个称为“submenu”的子菜单, 并且该子菜单具有称为“submenuStart”的命名组, 则在新子菜单中的操作的全限定菜单路径将为“help/submenu/submenuStart” 。
以上示例演示了使出现在 UI 中的字符串外部化的技术。 外部化字符串用来简化将插件的 UI 转换成其它语言的过程。可以通过将字符串替换为键(例如,%help, %helpcontents), 并在 plugin.properties 文件中以如下形式创建条目来外部化 plugin.xml 文件中的字符串:
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="%ActionSet.name" visible="true"> <menu id="org_eclipse_ui_examples_readmetool" label="%ActionSet.menu" 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="%ReadmeAction.label" tooltip="%ReadmeAction.tooltip" helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context" icon="icons/ctool16/openbrwsr.gif" class="org.eclipse.ui.examples.readmetool.WindowActionDelegate" enablesFor="1"> <selection class="org.eclipse.core.resources.IFile" name="*.readme"> </selection> </action> ...
我们添加了称为“org_eclipse_ui_examples_readmetool”的新菜单, 它的标号由键“%ActionSet.name”在特性文件内定义。在此菜单内部, 我们定义三个命名组:“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"; // Group. ... public static final String WINDOW_EXT = MB_ADDITIONS; // Group.
根据此信息,我们可以拼凑出用于将某些内容添加到工作台“窗口”菜单的路径。菜单本身称为“window”,并且它定义一个称为“additions”的槽。我们使用路径“window/additions”来添加新菜单。
在操作集声明中,我们使用路径“window/org_eclipse_ui_examples_readmetool/slot1”来将操作添加到新定义的菜单中。
通过使用此相同路径(或者也许是其它槽之一)来添加它们自己的其中一个菜单,就可以将其它插件添加到我们的菜单中。
通常,最好不要通过从 plugin.xml 中派生路径名来向另一插件的菜单或工具栏作添加。插件的将来版本可能会更改路径的名称。建议定义公用接口(很象 IWorkbenchActionConstants),它精确地指定哪些菜单、工具栏组和槽是可供其它插件使用的适当对象。