README ツール・アクション・セットは、 再ターゲット可能なアクションを定義することもできます。 README アクション・セットが可視である限りは、アクションは可視のままですが、 アクションを実装するビューまたはエディターがアクティブな場合だけ、有効になります。 再ターゲット可能なアクションを定義するためにアクションを使用するときは、コード内ではなく、 アクション・セット・マークアップ内にアクションが作成されます。 以下は、README ツールのアクション・セット定義からのものです。
<extension point = "org.eclipse.ui.actionSets"> <actionSet id="org_eclipse_ui_examples_readmetool_actionSet" label="%ActionSet.name" visible="true"> ... <action id="org_eclipse_ui_examples_readmetool_readmeRetargetAction" menubarPath="window/org_eclipse_ui_examples_readmetool/slot1" toolbarPath="readme" label="%ReadmeRetargetAction.label" tooltip="%ReadmeRetargetAction.tooltip" helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context" icon="icons/ctool16/openbrwsr.png" retarget="true"> </action> <action id="org_eclipse_ui_examples_readmetool_readmeRelabelRetargetAction" menubarPath="window/org_eclipse_ui_examples_readmetool/slot1" toolbarPath="readme" label="%ReadmeRelabelRetargetAction.label" tooltip="%ReadmeRelabelRetargetAction.tooltip" helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context" icon="icons/ctool16/openbrwsr.png" retarget="true" allowLabelUpdate="true"> </action> ...
再ターゲットされたアクションは、retarget="true" 属性を使用して指定されます。 これは、RetargetAction がアクション・セット内に作成されるようにします。 各アクションを実装するハンドラーをセットアップするかどうかは、プラグイン内の各ビューまたはエディターの責任で行うため、 再ターゲット可能なアクションは、class の実装を指定しないことに注意してください。 allowLabelUpdate が true の場合、 LabelRetargetAction が代わりに作成されます。
再ターゲットされたアクションは、README アクション・セットが可視のときに、ウィンドウ・メニューで可視になります。 ただし、README ツールのエディターまたは「アウトライン」ビューがアクティブでない場合、それらは使用可能になりません。
エディターとビューが行う必要のあることは何でしょうか? 繰り返しますが、クライアント側は、ワークベンチまたはエディターの再ターゲット可能なアクションのハンドラーの登録と同じです。 マークアップに指定されたアクション ID は、グローバル・アクション・ハンドラーを登録する際に使用する必要があります。
ReadmeEditorActionBarContributor タスクは、エディターのため、これを配慮します。 最初に、アクションのためにハンドラーを定義します。
public ReadmeEditorActionBarContributor() { ... handler4 = new EditorAction(MessageUtil.getString("Editor_Action4")); handler5 = new EditorAction(MessageUtil.getString("Editor_Action5")); handler5.setToolTipText(MessageUtil.getString("Readme_Editor_Action5")); ... }
エディター再ターゲット可能なアクションのハンドラーが登録されたとき、同時にハンドラーが登録されます。
public void init(IActionBars bars, IWorkbenchPage page) { ... bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_RETARGET4, handler4); bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_LABELRETARGET5, handler5); ... }
アクション・バー・コントリビューターは、同じエディターの異なるインスタンス間で共有されることを思い出してください。 これは、ReadmeEditorActionBarContributor のアクティブなエディターを変更する場合、ハンドラーに通知する必要があることを意味します。
public void setActiveEditor(IEditorPart editor) { ... handler4.setActiveEditor(editor); handler5.setActiveEditor(editor); ... }
エディターについては、これで終わりです。 エディターが活動化されたとき、これらのアクションが使用可能になることが分かります。
最初の再ターゲット可能なアクション ("Editor Action 4") のラベルが使用されなかったことに注意してください。 これは、アクション・セット XML マークアップが allowLabelUpdate を設定しなかったためです。
ReadmeContentOutlinePage は、エディターの再ターゲット可能なアクションのハンドラーを定義した同じ場所に、所有するハンドラーを定義します。
public void createControl(Composite parent) { ... action = new OutlineAction(MessageUtil.getString("Outline_Action4")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.ACTION_SET_RETARGET4, action); action = new OutlineAction(MessageUtil.getString("Outline_Action5")); action.setToolTipText(MessageUtil.getString("Readme_Outline_Action5")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.ACTION_SET_LABELRETARGET5, action); }
コンテンツ・アウトライナーがアクティブであるときに、再ラベル化されたアクションを調べなければなりません。