命令是根据标识进行的用户操作的声明。命令用来声明语义操作,以便在操作集和编辑器中定义的操作实现可以将它们自身与特定语义命令相关联。将命令从操作实现中分离出来允许多个插件定义实现相同语义命令的操作。命令就是与特定键绑定相关联的内容。
工作台在它的 plugin.xml 文件中定义许多常见命令,并鼓励插件将它们自已的操作与这些命令(在这些命令有意义的地方)相关联。通过这种方法,在不同的插件中实现的语义上相似的操作就可共享同一键绑定。
命令是使用 org.eclipse.ui.commands 扩展点定义的。以下内容来自工作台标记:
<extension point="org.eclipse.ui.commands"> ... <command category="org.eclipse.ui.category.file" name="%command.close.name" description="%command.close.description" id="org.eclipse.ui.file.close"> </command> <command category="org.eclipse.ui.category.file" name="%command.closeAll.name" description="%command.closeAll.description" id="org.eclipse.ui.file.closeAll"> </command> <command category="org.eclipse.ui.category.file" name="%command.save.name" icon="icons/full/ctool16/save_edit.gif" description="%command.save.description" id="org.eclipse.ui.file.save"> </command> ...
命令定义指定操作的 name、description 和 id。它还指定命令的类别,类别用来在首选项对话框中对各命令进行分组。还在 org.eclipse.ui.commands 扩展点中定义了这些类别:
... <category name="%category.file.name" description="%category.file.description" id="org.eclipse.ui.category.file"> </category> ...
注意,没有为命令指定任何实现。仅当插件将其操作与命令标识相关联时,命令才变成实实在在的命令。
可以使用代码或在操作集的 plugin.xml 中将操作与命令相关联。您的选择取决于操作是在何处定义的。
使用代码实现的操作也可以使用 IAction 协议与操作定义相关联。这通常是在创建该操作时完成的。WorkbenchActionBuilder 使用此技术来初始化其操作。
private void makeActions() { ... saveAction = new SaveAction(window); saveAction.setImageDescriptor(WorkbenchImages.getImageDescriptor(IWorkbenchGraphicConstants.IMG_CTOOL_SAVE_EDIT)); saveAction.setHoverImageDescriptor(WorkbenchImages.getImageDescriptor(IWorkbenchGraphicConstants.IMG_CTOOL_SAVE_EDIT_HOVER)); saveAction.setDisabledImageDescriptor(WorkbenchImages.getImageDescriptor(IWorkbenchGraphicConstants.IMG_CTOOL_SAVE_EDIT_DISABLED)); partService.addPartListener(saveAction); saveAction.setActionDefinitionId(saveActionDefId); ...
(注意:方法名 setActionDefinitionID 可以更适当地命名为 setCommandID。前一方法名反映键绑定原来的实现,使用的是过时的术语。)
通过调用 setActionDefinitionID,实现操作(SaveAction)就与命令标识 saveActionDefId 相关联。什么是 saveActionDefId?快速查看 WorkbenchActionBuilder 中的静态字段定义就会看到下列内容:
private static final String saveActionDefId = "org.eclipse.ui.file.save";
此常量定义在命令定义标记中使用的字符串标识。为操作定义定义常量以便于在代码中引用它们是一个很好的做法。
如果在操作集中定义操作,则通常不需要您自己来实例化操作。当用户从菜单或键盘调用操作时,工作台将为您完成此任务。在这种情况下,可以在 XML 标记中将操作与命令标识相关联。以下内容显示操作集的理想标记:
<extension point = "org.eclipse.ui.actionSets"> <actionSet id="com.example.actions.actionSet" label="Example Actions" visible="true"> <action id="com.example.actions.action1" menubarPath="additions" label="Example Save Action" class="org.example.actions.ExampleActionDelegate" definitionID="org.eclipse.ui.file.save"> </action> ... </actionSet> </extension>
definitionID 属性用来为操作声明命令标识。
不论使用以上任何一种技术,将操作与命令标识相关联都将导致为命令 org.eclipse.ui.file.save 定义的任何键绑定在适当的时候调用操作。
现在让我们考察如何定义这些键绑定。