README ツール は、 その ReadmeEditorActionBarContributor を使用してアクションをワークベンチ・メニュー・バーに組み込む、 独自のエディターを定義していることを思い出してください。
<extension point = "org.eclipse.ui.editors"> <editor id = "org.eclipse.ui.examples.readmetool.ReadmeEditor" name="%Editors.ReadmeEditor" icon="icons/obj16/editor.gif" class="org.eclipse.ui.examples.readmetool.ReadmeEditor" extensions="readme" contributorClass="org.eclipse.ui.examples.readmetool.ReadmeEditorActionBarContributor"> </editor> </extension>
コントリビューター・クラスで何か起こっているか詳しく見てみましょう。
public ReadmeEditorActionBarContributor() { ... action2 = new RetargetAction(IReadmeConstants.RETARGET2, MessageUtil.getString("Editor_Action2")); action2.setToolTipText(MessageUtil.getString("Readme_Editor_Action2")); action2.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_DISABLE); action2.setImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_ENABLE); ... action3 = new LabelRetargetAction(IReadmeConstants.LABELRETARGET3, MessageUtil.getString("Editor_Action3")); action3.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_DISABLE); action3.setImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_ENABLE); ... handler2 = new EditorAction(MessageUtil.getString("Editor_Action2")); ... handler3 = new EditorAction(MessageUtil.getString("Editor_Action3")); ...
コントリビューターが作成されるときは、2 つの再ターゲット可能なアクションを作成します (1 つはラベルの更新が可能ですが、もう一方は不可能です)。 アクションを作成するには、ワークベンチが使用するものと同じ技法を使用します。 それはさらに、エディターがアクティブ・パーツのときにアクション用に使用される、2 つのハンドラーも作成します。
しかし、アクションのハンドラーはどこに登録されるのでしょう? グローバル・ハンドラーの設定は、エディターが再ターゲット可能なアクションを定義するときに、少し違った方法で行われます。 なぜでしょうか? それは、異なるビューまたはエディター自体がアクティブになるため、アクティブなビューのトラッキングと、 異なるハンドラーのフックをコントリビューターが担当するためです。 (グローバル・アクションのいずれかにハンドラーを設定したときに、ワークベンチはこれを行います)。 以下に、ReadmeEditorActionBarContributor が設定する方法を示します。
public void init(IActionBars bars, IWorkbenchPage page) { super.init(bars, page); bars.setGlobalActionHandler(IReadmeConstants.RETARGET2, handler2); bars.setGlobalActionHandler(IReadmeConstants.LABELRETARGET3, handler3); ...
最初に、コントリビューターは、再ターゲットされたアクションのために所有するハンドラーを登録します。 これは、エディター自体がアクティブであるときに、コントリビューターのアクションが確実に実行されるようにします。 次のステップは、ページ上のパーツ・リスナーとして、 各 RetargetAction を登録することです。
... // Hook retarget actions as page listeners page.addPartListener(action2); page.addPartListener(action3); IWorkbenchPart activePart = page.getActivePart(); if (activePart != null) { action2.partActivated(activePart); action3.partActivated(activePart); } }
各 RetargetAction をパーツ・リスナーとして登録することは、 アクティブ・パーツを変更するときに、通知を受けることを意味します。 アクションは、新規に活動化されたパーツから、正しいグローバル・ハンドラーを入手できます。 (すべての詳細については、RetargetAction のインプリメンテーションを 参照してください。) アクションは現在のアクティブ・パーツから始まることに注意してください。
エディター・コントリビューターが配置される場合、再ターゲット可能なアクションをページ・リスナーとして、フック解除する必要があります。
public void dispose() { // Remove retarget actions as page listeners getPage().removePartListener(action2); getPage().removePartListener(action3); }
最後に、アクション・バー・コントリビューターは、同じエディター・クラスのインスタンス間で共用されることを思い出してください。 この理由から、アクティブなエディターを変更するときは、正しいエディター・インスタンスと接続できるよう、ハンドラーは通知される必要があります。
public void setActiveEditor(IEditorPart editor) { ... handler2.setActiveEditor(editor); handler3.setActiveEditor(editor); ... }
エディター側のセットアップは完了です。 エディターが開いていてアクティブであるときは、ReadmeEditorActionBarContributor によって定義されたハンドラー (およびそれらのラベル) がワークベンチ・メニュー・バーに表示されます。
エディターの組み込みが正しく行われた後、ハンドラーを登録するためにビューは何をしますか? クライアント側のコードは、アクション ID がプラグインのエディターによって定義されるものの 1 つであることを除いて、 ワークベンチ・アクションのハンドラーの登録と同じです。 ReadmeContentOutlinePage は、これらのアクションのためにハンドラーを登録します。
public void createControl(Composite parent) { super.createControl(parent); ... getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.RETARGET2, new OutlineAction(MessageUtil.getString("Outline_Action2"))); OutlineAction action = new OutlineAction(MessageUtil.getString("Outline_Action3")); action.setToolTipText(MessageUtil.getString("Readme_Outline_Action3")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.LABELRETARGET3, action); ...
アウトライナーは再ラベルを許可しているため、ツール・ヒント・テキストおよびラベルを 2 番目のアクションに設定することに注意してください。 README アウトライナー・ビューがアクティブであるときは、そのハンドラー (およびそのラベル) がワークベンチ・メニュー・バーに表示されます。
再ラベルされたアクションは、新規ラベルを表示することに注意してください。