動作定義是利用 ID 的動作宣告。動作定義用來宣告語意動作,以致於動作集中定義的動作和編輯器可自行建立與特定語意動作定義的關聯。從動作實作分開的動作定義讓多重外掛程式定義實作相同語意動作的動作。動作定義是取得與加速器快速鍵連結的關聯。
工作台定義許多共用的動作定義在 plugin.xml 檔中,並鼓勵外掛程式自行 建立動作與這些有意義的定義的關聯。這樣一來,語意上相似的動作實作在不同 的外掛程式中可能共用相同的快速鍵連結。
動作定義使用 org.eclipse.ui.actionDefinitions 延伸點來定義。下列從工作台標記中而來:
<extension point="org.eclipse.ui.actionDefinitions"> <actionDefinition id="org.eclipse.ui.file.close"> </actionDefinition> <actionDefinition id="org.eclipse.ui.file.closeAll"> </actionDefinition> <actionDefinition id="org.eclipse.ui.file.save"> </actionDefinition> ...
定義本身是簡單的。它僅指定語意動作的 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); ...
這樣一來,實作動作(SaveAction)關聯於動作定義 saveActionDefId。什麼是 saveActionDefId?快速看一下在 WorkbenchActionBuilder 中 static 欄位定義,如下所示:
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 屬性用來宣告動作的動作定義 ID。
使用技術建立動作與動作定義之間的關聯性,為動作定義 org.eclipse.ui.file.save 取得所定義的快速鍵連結來呼叫適當的動作。
現在讓我們看一下如何定義快速鍵連結。