指令

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

工作台在它的 plugin.xml 檔中定義許多常用的動作, 並鼓勵外掛程式建立它們自己的動作與這些因為它們而有意義的指令的關聯性。 這樣一來,在不同外掛程式中實作語意上相似的動作可以共用相同的按鍵連結。

定義指令

指令是使用 org.eclipse.ui.commands 延伸點來定義。下列來自工作台標記:

   <extension
	point="org.eclipse.ui.commands">
	...
	<command
		name="%command.save.name"
		description="%command.save.description"
		categoryId="org.eclipse.ui.category.file"
		id="org.eclipse.ui.file.save">
	</command>
	...

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

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

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

建立動作與指令的關聯性

動作可與程式碼中的指令或動作集的 plugin.xml 中的指令建立關聯性。 您的選項取決於在何處定義動作而定。

在程式碼中建立實例的動作也可使用 IAction 協定來建立與動作定義的關聯。通常在建立動作時會完成這項關聯。當 SaveAction 自我初值設定時會使用這項技術。

public SaveAction(IWorkbenchWindow window) {
	...
	setText...
	setToolTipText...
	setImageDescriptor...
	setActionDefinitionId("org.eclipse.ui.file.save"); 
}

(附註:方法名稱 setActionDefinitionID 可能比具名的 setCommandID 更加適合。 方法名稱會反映按鍵連結的程式實作,並使用過時的專有名詞。)

藉由呼叫 setActionDefinitionID,實作動作 (SaveAction) 可與使用於指令定義標記的指令 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 定義的按鍵連結,會在適當的時候呼叫您的動作。 

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