アクティビティー

アクティビティーは、特定の種類のタスクを中心とする機能の論理的なグループ化です。 例えば、Java ソフトウェアの開発は、プラットフォームのユーザーによって共通して使用されるアクティビティーであり、JDT は、 このアクティビティーの実行の際にのみ役立つ多数の UI コントリビューション (ビュー、エディター、パースペクティブ、設定、その他) を定義します。 アクティビティーを定義するメカニズムについて説明する前に、 UI を「集約 (declutter)」する際にそれらのメカニズムがどのように役立つのか説明します。

アクティビティーの概念は、新規ユーザーが理解するには難しいと思われますが、ユーザーに対して公開されています。 アクティビティーがプラットフォームで使用可能になっている場合には、そのアクティビティーに関連付けられている UI コントリビューションが表示されます。 アクティビティーがプラットフォームで使用不可になっている場合には、その UI コントリビューションは表示されません。 ユーザーは、「ワークベンチ」>「機能」設定ページを使用して、必要に応じてアクティビティーを使用可能または使用不可にできます。 (アクティビティーは、API でアクティビティーという用語が使用されていますが、 ユーザー・インターフェースでは「機能」と呼ばれています)。

特定のユーザー操作は、アクティビティーを使用可能にするためのトリガー・ポイントとして機能します。 例えば、新規 Java プロジェクトの作成が、Java 開発アクティビティーを使用可能化させるトリガーになる場合があります。 この方法で、ユーザーには必要に応じて新規機能が公開され、 使用可能なアクティビティーおよびそのアクティビティーが UI に及ぼす影響について徐々に理解することになります。 ユーザーが最初にプラットフォームを起動した際に、可能な限り多くのアクティビティーを使用不可にすることが推奨されます。 これによってアプリケーションは可能な限り簡潔なものになります。 ウェルカム・ページで行われた選択は、使用可能にするアクティビティーを決定する際に使用されます。

アクティビティーとパースペクティブ

異なるビューのレイアウトおよびアクション・セットをタスクとして編成するために、パースペクティブがどのように使用されるかについて学習しました (『パースペクティブ』)。 アクティビティーはなぜ必要なのでしょうか。 パースペクティブおよびアクティビティーは、同じような種類のタスクを定義します。主な違いは、 プラグインに対する UI コントリビューションが、それらパースペクティブやアクティビティーにどのように関連付けられているかということです。 UI コントリビューションは、コントリビューションの拡張定義でパースペクティブに関連付けられています。 すなわち、プラグインの役割は、そのビューおよびアクション・セットがどのパースペクティブに属するのかを決定することです。 プラグインは、それ自体のパースペクティブを定義することも可能です。 パースペクティブがアクティブではない場合でも、 ユーザーは、ビューの表示 などのコマンドでパースペクティブに関連付けられているビューおよびアクションにアクセスできます。

アクティビティーは、高水準の編成です。 個々の UI コントリビューションは、アクティビティーを認識せず、拡張定義内のアクティビティーは参照しません。 代わりに、アクティビティーは、プラットフォームの統合/構成、または製品のインストールなどの高いレベルで構成されることが予想されます。 通常個々のプラグインは、そのプラグインがシステム・インテグレーターによってシステム・レベルのプラグインとして定義されていない限り、 新規アクティビティーを定義しません。 標準的なシナリオでは、システム・インテグレーターは、機能がアクティビティーにグループ化される方法、 およびどの機能をデフォルトで使用可能にするかを決定します。 アクティビティーは、アクティビティー・パターン結合を使用して、 プラグインによって作成された UI コントリビューションの ID のパターンに一致する UI コントリビューションに関連付けられています。 これらの概念については例で実際に説明します。

アクティビティーの定義

アクティビティーは、 org.eclipse.ui.activities 拡張ポイントを使用して定義されています。 Eclipse SDK プラグインが 2 つのアクティビティー (Java ソフトウェアの開発用とプラグインの開発用) を定義する方法を単純化したものを以下に示します。

<extension
	point="org.eclipse.ui.activities">
	<activity
		name="Java Activity"
		description="Developing Java Software"
		id="org.eclipse.javaDevelopment">
	</activity>
	
	<activity
		name="Plug-in Activity"
		description="Developing Eclipse Plug-ins"
		id="org.eclipse.plugInDevelopment">
	</activity>
	...

アクティビティーには、名前および記述が割り当てられています。この名前と記述は、ユーザーがアクティビティーを使用可能にしたり 使用不可にしたときに、ユーザーに表示されます。割り当てられていない場合には、アクティビティーに関する情報が表示されます。 アクティビティーの ID は、パターン結合、または複数のアクティビティー間のその他の関係を定義する際に使用されます。 例えば、あるアクティビティーが別のアクティビティーを必要とするということを決定できます。

<activityRequirementBinding
	activityId="org.eclipse.plugInDevelopment"
	requiredActivityId="org.eclipse.javaDevelopment">
</activityRequirementBinding>

要求結合は、プラグイン開発アクティビティーが、Java 開発アクティビティーが使用可能になっている場合のみ使用可能にできることを指定します。 関連するアクティビティーはカテゴリーにも結合でき、ユーザーがアクティビティーの作業を行う際にユーザーに表示されます。

<category
	name="Development"
	description="Software Development"
	id="org.eclipse.categories.developmentCategory">
</category>

<categoryActivityBinding
	activityId="org.eclipse.javaDevelopment"
	categoryId="org.eclipse.categories.developmentCategory">
</categoryActivityBinding>
      
<categoryActivityBinding
	activityId="org.eclipse.plugInDevelopment"
	categoryId="org.eclipse.categories.developmentCategory">
</categoryActivityBinding>

カテゴリーは、関連する開発アクティビティーを一緒にグループ化します。 このカテゴリーは、ユーザーが手動でアクティビティーを構成する際に表示されます。

アクティビティーの UI コントリビューションとの結合

アクティビティーは、パターン・マッチングを使用して UI コントリビューションと関連付けられます。 アクティビティー・パターン結合で使用されるパターン・マッチングは、 正規表現の java.util.regex パッケージに記述されている規則に従います。 ワークベンチによって使用されるパターンは、2 つの部分から構成されています。 最初の部分は、UI 拡張にコントリビュートされているプラグインの識別子を使用します。 2 番目の部分は、コントリビューションの定義でプラグイン自体によって使用される ID です (識別子の一部としてプラグイン ID が組み込まれている場合も組み込まれていない場合もあります)。 次の形式が使用されます。

plug-in-identifier + "/" + local-identifier
例えば、次のアクティビティー・パターン結合は、任意の JDT プラグイン ID (org.eclipse.jdt.*) からの UI コントリビューションが、そのローカル ID (.*) とは無関係に、Java 開発アクティビティーに関連付けられていることを示しています。
<activityPatternBinding
	activityId="org.eclipse.javaDevelopment"
	pattern="org¥.eclipse¥.jdt¥..*/.*">
</activityPatternBinding>
次の結合は、さらに細かくなっています。 この結合は、JDT コア (org.eclipse.jdt.core) で定義されている javanature という名前のコントリビューションが、Java 開発アクティビティーに関連付けられていることを示しています。
<activityPatternBinding
	activityId="org.eclipse.javaDevelopment"
	pattern="org¥.eclipse¥.jdt¥.core/javanature">
</activityPatternBinding>
このように、アクティビティー・パターン結合は、大きなコントリビューションのグループを特定のアクティビティーに関連付けしたり、 非常に細かいコントリビューションをアクティビティーに関連付けるために使用できます。 以下のコントリビューションは、アクティビティーによって影響されます。

ワークベンチによって使用される規則 (plug-in id + local id) によって、プラグインに簡単に結合できます。 この結合では、プラグイン ID を使用して UI コントリビューション識別子をプレフィックス変換する命名慣習に必ずしも従う必要はありません。 アクティビティー API と直接対話するプラグインは、コントリビューションを識別し、 これらの名前のパターン・マッチングを行うための固有のフォーマットを自由に使用します。

アクティビティーのヘルプ・コントリビューションとの結合

アクティビティーは、UI コントリビューションで使用されるのと同じパターン・マッチングを使用して、ヘルプ・コントリビューションに関連付けられます。 識別子 (ローカル識別子) の 2 番目の部分は、目次 (TOC) ファイルの名前を示しています。 例えば、次のアクティビティー・パターン結合は、JDT プラグイン (org.eclipse.jdt.*) によってコントリビュートされているすべての TOC ファイルを Java 開発アクティビティーに関連付けるものです。

<activityPatternBinding
	activityId="org.eclipse.javaDevelopment"
	pattern="org¥.eclipse¥.jdt¥..*/.*">
</activityPatternBinding>
Java 開発アクティビティーが使用不可になっている場合には、JDT プラグインによってコントリビュートされているヘルプ・ブック、 または任意のサブブック (JDT ブックにリンクされている、または JDT ブックによってリンクされている TOC) は、別のプラグインによってコントリビュートされている場合でも、ヘルプ UI には表示されません。 これらのブックに定義されているトピックは、検索結果にも表示されません。 JDT TOC が 1 次 TOC として表示されず、代わりに他の TOC からリンクされてブックのサブツリーとして表示されている場合、 JDT アクティビティーを使用不可にすると、サブツリーが非表示になります。 UI 定義するトピックを少なくするための収容ブックが表示されます。

より細かい結合を使用して、複数の TOC をヘルプ・システムにコントリビュートするプラグインから選択した TOC に、 アクティビティーを関連付けることができます。 例えば、次のアクティビティー・パターン結合は、「Examples」TOC を Java 開発例アクティビティーに関連付けます。

<activityPatternBinding
	activityId="org.eclipse.javaDevelopmentExamples"
	pattern="org¥.eclipse¥.jdt¥.doc¥.isv¥.topics_Samples.xml">
</activityPatternBinding>
このようなパターン結合を使用して、Java 開発例アクティビティーを使用不可にすると、 「JDT プラグイン・デベロッパー・ガイド」ブックの『例』セクションが非表示になります。

アクティビティー API の使用

ワークベンチ・アクティビティー・サポートには、定義済みアクティビティーの操作、 およびそれらの使用可能状態の変更のための API が含まれています。 ほとんどのプラグインの場合には、この API について考慮する必要はありません。ただし、 ユーザーがアクティビティーを操作できるようにする機能を実装する場合、 または特定のアクティビティーを使用可能にするトリガー・ポイントを実装する場合には有用です。 API によってアクティビティーを操作するプラグインは、 アクティビティーが特定の製品用に構成される方法について十分認識していることが前提になっています。 例えば、ワークベンチ自体は、API を使用して、Java 開発などのアクティビティーの使用可能化をトリガーします。 ここで、ワークベンチが汎用アクティビティー API を使用してトリガーを実装する方法について説明します。

ワークベンチのすべてのアクティビティーのハブは、IWorkbenchActivitySupport です。 アクティビティー・サポートは、IActivityManager と組み合わせて使用します。 プラグインは、ワークベンチからアクティビティー・サポート・インスタンス、およびそのインスタンスからアクティビティー・マネージャーを取得します。

IWorkbenchActivitySupport workbenchActivitySupport = PlatformUI.getWorkbench().getActivitySupport();
IActivityManager activityManager = workbenchActivitySupport.getActivityManager();
次のコードの断片は、Java 開発アクティビティーを使用可能にするものです (まだ使用可能になっていない場合)。 このコードの断片では、単純化されたトリガーが示されています。
...
//the user did something Java related.  Enable the Java activity.
Set enabledActivityIds = new HashSet(activityManager.getEnabledActivityIds());
if (enabledIds.add("org.eclipse.javaDevelopment"))
	workbenchActivitySupport.setEnabledActivityIds(enabledActivityIds);

IActivityManager は、 すべての定義済みアクティビティーおよびカテゴリー ID を取得するプロトコル、 および特定の ID に関連付けられた IActivity または ICategory を取得するプロトコルも定義します。 これらのオブジェクトは、パターン結合または要求結合の取得などの、API のアクティビティーまたはカテゴリーの定義を全探索するために使用できます。 リスナーは、アクティビティー・マネージャーまたはアクティビティーおよびカテゴリー自体に登録して、 特定のアクティビティーの定義またはアクティビティー・マネージャー自体の変更を検出できます。 詳しくは、パッケージ org.eclipse.ui.activities を参照してください。