コンテキスト

コンテキストは、どのコマンドをいつユーザーが使用できるかを決定するために使用できます。コンテキストは、アクティビティーよりもより動的です。アクティビティーが、ほとんどの状況でユーザーが使用可能な広範囲な機能セットを表すのに対して、コンテキストは、特定の状況におけるユーザーのフォーカスを記述します。例えば、テキストの編集中にユーザーが使用可能なコマンドは、Java テキストの編集中、またはパッケージ・エクスプローラーでパッケージをブラウズ中にユーザーが使用可能なコマンドとは異なるかもしれません。

コンテキストの定義

コンテキストは、org.eclipse.ui.contexts 拡張ポイントで宣言されます。テキストの編集用に定義されている次のコンテキストについて考えてみます。

<extension
	point="org.eclipse.ui.contexts">
	<context
		name="%context.editingText.name"
		description="%context.editingText.description"
		id="org.eclipse.ui.textEditorScope"
		parentId="org.eclipse.ui.contexts.window">
	</context>
コンテキストには、コンテキストに関する情報をユーザーに表示する際に使用される名前および記述が割り当てられています。コンテキストの ID は、コマンドなどの UI コントリビューションを特定のコンテキストに結合する際に使用されます。

コンテキストの階層

コンテキストは、階層の性質を持っています。コンテキストがアクティブな場合には、そのコンテキストとその親のコンテキストで使用可能なコマンドも使用可能です。これは、非常に一般的な状況からより特定のコンテキストに移動するコンテキストのレベルを定義する際に役立ちます。上記のコンテキスト定義では、以下のように、そのコンテキストに割り当てられた親の ID が存在することに注意してください。

	<context
		name="%context.editingText.name"
		description="%context.editingText.description"
		id="org.eclipse.ui.textEditorScope"
		parentId="org.eclipse.ui.contexts.window">
	</context>
親コンテキストは、ウィンドウ内で機能する、より一般的なコンテキストを定義します。その親は、ウィンドウまたはダイアログ内で機能するさらに一般的なコンテキストを定義します。
<context
	name="%context.window.name"
	description="%context.window.description"
	id="org.eclipse.ui.contexts.window"
	parentId="org.eclipse.ui.contexts.dialogAndWindow">
	</context>
<context
	name="%context.dialogAndWindow.name"
	description="%context.dialogAndWindow.description"
	id="org.eclipse.ui.contexts.dialogAndWindow">
	</context>

コントリビューションのコンテキストとの関連付け

ここまで、コンテキストの階層の定義について見てきました。コンテキストは、他の UI コントリビューションの記述の中で参照される場合に役立ちます。コンテキストは、キー・バインディングで使用するのが最も一般的です。コンテキストがキー・バインディングに関連付けられている場合、そのキー・バインディングはユーザーがそのコンテキスト内にいる場合にのみアクティブになります。例えば、次のマークアップは、ルート・ダイアログおよびウィンドウ・コンテキストをキー・バインディング用のコンテキストとして指定します。

<extension
         point="org.eclipse.ui.bindings">
<key
            sequence="M1+X"
	contextId="org.eclipse.ui.contexts.dialogAndWindow"
	commandId="org.eclipse.ui.edit.cut"
            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
 </extension>

コンテキスト API の使用

ワークベンチ・コンテキスト・サポートには、定義済みコンテキストを操作するための API、および特定のコンテキストを使用可能にする基準を定義するための API が含まれています。ほとんどのプラグインの場合には、この API について考慮する必要はありません。ただし、特殊なビューや新規コンテキストを定義するエディターを定義する場合には有用です。

ワークベンチにおけるコンテキストの操作は、IContextService から開始します。プラグインは、ワークベンチからグローバル・コンテキスト・サポート・インスタンスを取得できます。

IContextService contextService = (IContextService)PlatformUI.getWorkbench()
	.getService(IContextService.class);

IContextServiceIHandlerService、および IBindingService のようなサービスは、 IServiceLocator を使用して取得できます。 IWorkbenchIWorkbenchWindow、および IWorkbenchSite は、すべて IServiceLocator です。

IContextService は、すべての定義済みコンテキスト ID または使用可能になっているコンテキスト ID を取得し、特定の ID に関連付けられた Context を取得するプロトコルを定義します。これらのオブジェクトは、ID、名前、または親コンテキストの ID の取得など、API のコンテキストの定義を全探索するために使用できます。リスナーは、コンテキスト・マネージャーまたはコンテキスト自体に登録して、特定のコンテキストの定義またはコンテキスト・マネージャー自体の変更を検出できます。詳しくは、パッケージ org.eclipse.core.commands.contexts を参照してください。

コンテキスト は、以下のようにプログラマチックに有効にすることができます。

IContextActivation activation = contextService.activateContext("org.eclipse.ui.textEditorScope");

IContextActivation は、アクティブ・コンテキストを非アクティブにする際に使用できるトークンです。定義済みコンテキストのみをアクティブにするようにしてください。

パーツ (ビューまたはエディターのいずれか) 内でより特殊なコンテキストをアクティブにする場合は、パーツ・サイトのサービス・ロケーターを使用して、コンテキストをアクティブにすることができます。パーツの IContextService は、パーツがアクティブ化または非アクティブ化される際に、コンテキストのアクティブ化と非アクティブ化を処理します。また、パーツが破棄される際のコンテキストの破棄も行います。