再ターゲット可能なエディター・アクション

README ツール は、 その ReadmeEditorActionBarContributor を使用してアクションをワークベンチ・メニュー・バーにコントリビュートする、独自のエディターを定義します。   

<extension
    point = "org.eclipse.ui.editors">
	<editor
  	   id = "org.eclipse.ui.examples.readmetool.ReadmeEditor"
  	   name="%Editors.ReadmeEditor"
      	   icon="icons/obj16/editor.png"
      	   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 によって定義されたハンドラー (およびそれらのラベル) がワークベンチ・メニュー・バーに表示されます。

ワークベンチ・メニュー・バーに 3 つのエディター・アクションが表示された README メニュー

エディターの組み込みが正しく行われた後、ハンドラーを登録するためにビューは何をしますか?  クライアント側のコードは、アクション 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 アウトライナー・ビューがアクティブであるときは、そのハンドラー (およびそのラベル) がワークベンチ・メニュー・バーに表示されます。

1 つのエディター・アクションが名前変更された README メニュー

再ラベルされたアクションは、新規ラベルを表示することに注意してください。