菜单和工具栏路径

我们已经了解了许多操作添加项,它们指定它们的操作位置的路径。让我们仔细地了解这些路径的含义。  

菜单路径

我们将通过查看工作台帮助菜单来首先查看菜单路径。

工作台中的命名组

插入新菜单和菜单项的位置是使用命名组来定义的。可以将命名组看作是槽或占位符,它允许您在菜单栏或下拉菜单中的某些点插入菜单项。

工作台在类 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” 。

使用户界面标号外部化

以上示例演示了使出现在用户界面中的字符串外部化的技术。 外部化字符串用来简化将插件的用户界面翻译成其它语言的过程。可以通过将字符串替换为键(例如,%help, %helpcontents), 并在 plugin.properties 文件中以如下形式创建条目来外部化 plugin.xml 文件中的字符串:

   help = "Help"
   helpContents = "Help Contents"

可以将 plugin.properties 文件翻译成不同的语言, 并且将不需要修改 plugin.xml

添加新菜单和组

在目前为止所看到的许多示例中,样本插件添加的操作已被添加到菜单中的现有命名组中。

actionSetsviewActionseditorActionspopupMenus 扩展点还允许您在添加项中定义新菜单和组。这就意味着您可以定义新的子菜单或新的下拉菜单,并将您的操作添加到这些新菜单。在此情况下,新操作的路径将包含最新定义的菜单的名称。

在自述文件工具为其操作集定义新菜单时,我们就可以了解此技术。既然已经详细考察了菜单路径,现在就再一次考察标记。

   <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”来将操作添加到新定义的菜单中。

通过使用此相同路径(或者也许是其它槽之一)来添加它们自己的其中一个菜单,就可以将其它插件添加到我们的菜单中。

在自述文件工具示例中,我们使用 separator 属性来标识组名。这将导致分隔线出现在这些组(当它们包含项时)之间。如果想要定义命名组而不在菜单中显示任何分隔符来区别这些组,则也可使用 groupMarker 属性。

工具栏路径

工具栏路径的工作方式类似于菜单路径。  

工作台中的命名工具栏

工作台工具栏由不同插件(包括工作台本身)添加的工具栏组成。在任何特定工具栏中,都有一些可以用于插入新工具栏项的命名组或槽。   

工作台工具栏的下列描述取自 IWorkbenchActionConstants 类定义。

// Workbench toolbar ids
public static final String TOOLBAR_FILE = "org.eclipse.ui.workbench.file"
public static final String TOOLBAR_NAVIGATE = "org.eclipse.ui.workbench.navigate";

// Workbench toolbar group ids.  To add an item at the beginning of the group,
// use the GROUP id.  To add an item at the end of the group, use the EXT id.
public static final String PIN_GROUP = "pin.group";
public static final String HISTORY_GROUP = "history.group";
public static final String NEW_GROUP = "new.group";
public static final String SAVE_GROUP = "save.group";
public static final String BUILD_GROUP = "build.group"; 

在最简单的情况下,插件可以在其自己的工具栏中添加工具栏项。例如,还向添加至菜单的自述文件工具操作提供了工具栏路径:

...
<action id="org_eclipse_ui_examples_readmetool_readmeAction"  
   menubarPath="window/org_eclipse_ui_examples_readmetool/slot1"
   toolbarPath="readme"
...

因为不存在对工作台工具栏路径或组的任何引用,所以自述文件操作出现在工具栏上它们自己的组中。而指定以下路径会把文件工具栏中的项放置在保存组中:

...
<action id="org_eclipse_ui_examples_readmetool_readmeAction"  
            menubarPath="window/org_eclipse_ui_examples_readmetool/slot1"
   toolbarPath="org.eclipse.ui.workbench.file/save.group"
...

可在其它插件的工具栏路径中引用在 IWorkbenchActionConstants 中定义的路径。

添加至另一插件的操作集

假定插件希望其工具栏项更好地与另一插件的操作集成?让我们来看看外部工具插件(org.eclipse.ui.externaltools)是如何将其操作与调试器工具栏集成的。调试器(org.eclipse.debug.ui)按如下所示定义其工具栏操作:

   <extension
      point="org.eclipse.ui.actionSets">
      <actionSet
         label="%LaunchActionSet.label"
   visible="false"
         id="org.eclipse.debug.ui.launchActionSet">
   ...
         <action
         toolbarPath="debug"
         id="org.eclipse.debug.internal.ui.actions.RunDropDownAction"
         hoverIcon="icons/full/ctool16/run_exc.gif"
         class="org.eclipse.debug.internal.ui.actions.RunToolbarAction"
         disabledIcon="icons/full/dtool16/run_exc.gif"
         icon="icons/full/etool16/run_exc.gif"
         helpContextId="run_action_context"
         label="%RunDropDownAction.label"
         pulldown="true">
        </action>
   ...

与自述文件工具相似,调试器插件定义其自己的工具栏路径,这意味着其工具栏项将处于工作台上它们自己的工具栏中。外部工具插件进行什么操作?

<extension point="org.eclipse.ui.actionSets">
<actionSet
		id="org.eclipse.ui.externaltools.ExternalToolsSet"
		label="%ActionSet.externalTools"
visible="true">
		...
		<action
			id="org.eclipse.ui.externaltools.ExternalToolMenuDelegateToolbar"
			definitionId= "org.eclipse.ui.externaltools.ExternalToolMenuDelegateToolbar"
			label="%Action.externalTools"
			toolbarPath="org.eclipse.debug.ui.launchActionSet/debug"
			disabledIcon="icons/full/dtool16/external_tools.gif"
			icon="icons/full/etool16/external_tools.gif"
			hoverIcon="icons/full/ctool16/external_tools.gif"
			tooltip="%Action.externalToolsTip"
			pulldown="true"
			class="org.eclipse.ui.externaltools.internal.menu.ExternalToolMenuDelegate">
   </action>
   </actionSet>
   </extension>

请注意调试器的操作集标识在工具栏路径中的使用。在路径中使用操作集标识表示应该将工具栏项放置在由被引用操作集使用的工具栏中。在工具栏组内,各个项是按操作集标识排序的,因此对于我们的示例,外部工具操作将在调试器操作之后出现。 

当添加至操作集的工具栏时,还可以定义新组。如果外部工具插件将其 toolbarpath 定义为 "org.eclipse.debug.ui.launchActionSet/external",则将为工具栏上的操作创建新组。至于菜单,工具栏组是使用分隔符来标出的。 

使用另一个插件的路径

通常,通过从 plugin.xml 派生路径名来添加至另一个插件的菜单或工具栏不是很好(除非该路径名已特别标记为可用于客户机)。插件的将来版本有可能会更改路径的名称。用来将插件的操作集标识和路径标记为适当对象的两种常用方法是:

Copyright IBM Corporation and others 2000, 2003.