指令

指令是按 id 的使用者動作宣告。 指令是用來宣告語意動作,以便動作集和編輯器中定義的動作實作方式可以建立它們自己與特殊語意指令的關聯性。 隔開指令與動作實作方式可讓多個外掛程式定義若干實作相同語意指令的動作。 指令就是與特殊快速鍵連結建立關聯性。

工作台在它的 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>
      ...     

指令定義指定動作的 namedescriptionid。 它同時也指定指令的種類,種類是將分組喜好設定對話框中的指令分組。 種類也定義在 org.eclipse.ui.commands 延伸點中:


      ...
      <category             name="%category.file.name"
            description="%category.file.description"
            id="org.eclipse.ui.category.file">
      </category>
      ...

請注意,沒有指定給指令的實作方式。 僅在外掛程式建立其動作與指令 ID 的關聯性時,指令才會變成具體。

建立動作與指令的關聯性

動作可與程式碼中的指令或動作集的 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) 可與指令 ID saveActionDefId 建立關聯性。何謂 saveActionDefId?  快速查看 WorkbenchActionBuilder 中的 static 欄位定義,如下所示:

private static final String saveActionDefId = "org.eclipse.ui.file.save";

這個常數定義已用在指令定義標記中的字串 ID。 定義您的動作定義常數,以便可以輕易地在程式碼中參照它們,是不錯的做法。 

如果您在動作集中定義一個動作,則您通常不需要自行建立動作的實例。 當使用者從功能表或鍵盤呼叫您的動作時,工作台將替您執行它。 在這種情況中,您可以建立動作與 XML 標記中的指令 ID 的關聯性。 下列顯示動作集的假設標記:

<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 屬性是用來宣告動作的指令 ID。

使用技術建立您的動作與指令 ID 的關聯性,將使任何為指令 org.eclipse.ui.file.save 定義的快速鍵連結,會在適當的時候呼叫您的動作。 

現在讓我們看一下如何定義快速鍵連結。

 

Copyright IBM Corporation and others 2000, 2003.