コマンドとは、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> ...
コマンド定義は、アクションの名前、説明、および 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 プロトコルを使用して、アクション定義と関連付けることもできます。 一般的にこれは、アクションが作成されるときに行われます。 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 内の静的フィールド定義を簡単に見てみると、以下のようになります。
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 を定義する任意のキー・バインディングに、 適宜にアクションを呼び出させることができます。
これらのキー・バインディングが定義される方法を見てみましょう。