ご使用のプラグインは、デコレーターを使用して、 ワークベンチ・ビューに表示されるリソースおよび他のオブジェクトのイメージに注釈を付けることができます。 デコレーターは、プラグインが既存のリソース・タイプのために機能性を追加するときに役立ちます。 標準のワークベンチ・ビューの多くは、デコレーションの表示に関係します。
例えば、PDE には、ユーザーがバイナリーおよびソース・プロジェクトを識別できるデコレーターが組み込まれます。
com.example.helloworld プロジェクトは、ナビゲーターで表示される唯一のソース・プロジェクトです。 その他すべてのバイナリー・プロジェクトが、バイナリー・デコレーターを Java プロジェクト・アイコンの左上にどのように表示されるか注意してください。 このデコレーターは、org.eclipse.ui.decorators 拡張ポイントを使用して、PDE によってコントリビュートされます。
<extension point="org.eclipse.ui.decorators"> <decorator lightweight="true" quadrant="TOP_LEFT" adaptable="true" label="%decorator.label" icon="icons/full/ovr16/binary_co.png" state="false" id="org.eclipse.pde.ui.binaryProjectDecorator"> <description> %decorator.desc </description> <enablement> ... </enablement> </decorator> </extension>
デコレーター実装を提供する方法はいくつかあります。 このマークアップは、最も簡単な方法 (宣言型ライト・ウェイト・デコレーターと呼ばれる) を 使用します。 宣言型ライト・ウェイト・デコレーターが定義されている場合、マークアップには、 デコレーターのアイコン、配置、および使用可能化の条件に関する完全な記述が含まれます。 宣言型デコレーターは、ラベルの装飾にアイコンのみが使用されるときに役立ちます。 プラグインは、デコレーターが通常のアイコンとオーバーレイ用のアイコンで オーバーレイされる 4 等分画面 (quadrant) のみを指定する必要があります。 図にあるように、PDE バイナリー・アイコンは、パッケージ・アイコンの左上の 4 等分画面に オーバーレイされます。
プラグインがアイコンの他にラベル・テキストを操作しなければならない場合、またはアイコンのタイプが動的に 決定される場合、非宣言型ライト・ウェイト・デコレーターを使用できます。 この場合、ILightweightLabelDecorator を 実装する実装クラスを定義する必要があります。 指定されたクラスは、ラベルに適用される接頭部、接尾部、およびオーバーレイ・イメージを、 実行時に提供する必要があります。 接頭部と接尾部をラベル・テキストで連結し、オーバーレイを実行するメカニズムは、 バックグラウンド・スレッドでワークベンチ・コードによって扱われます。 このように、プラグインによってその ILightweightLabelDecorator 実装で 行われる作業は、UI スレッド対応でなければなりません。 (詳細については、『非 UI スレッドからのコードの実行』を参照してください。)
次のマークアップは、CVS クライアントが上記の技法を使用してデコレーターを定義する方法を示します。
<extension point="org.eclipse.ui.decorators"> <decorator objectClass="org.eclipse.core.resources.IResource" adaptable="true" label="%DecoratorStandard.name" state="false" lightweight= "true" quadrant = "BOTTOM_RIGHT" class="org.eclipse.team.internal.ccvs.ui.CVSLightweightDecorator" id="org.eclipse.team.cvs.ui.decorator"> <description> %DecoratorStandard.desc </description> </decorator> </extension>
デコレーターは、ワークベンチの「ラベル装飾」設定ページを介して、最終的にユーザーによって制御されます。 デコレーターは、個々にオンおよびオフにできます。 そうであっても、デコレーターが既存のプラットフォーム SDK デコレーターとオーバーラップおよび競合しないように デコレーターを設計することをお勧めします。 複数のプラグインがライト・ウェイト・デコレーターを同じ 4 等分画面に組み込む場合でも、 非確定的に競合は解決されます。
プラグインは、イメージとラベルの管理もすべて自ら行う場合があります。 この場合、lightweight 属性は false に設定され、class 属性は ILabelDecorator を 実装するクラスに名前を付ける必要があります。 このクラスにより、オリジナルのラベルのイメージとテキストを独自の注釈で装飾できます。 また、接頭部、接尾部、および単純な 4 等分画面オーバーレイに制限されないため、 柔軟性が増します。
デコレーターの他の属性は、特定の実装スタイルには関係しません。 label および description 属性は、設定ダイアログでデコレーターに 名前を付けてそのデコレーターを説明するためのテキストを指定します。 objectClass は、デコレーターの適用先となるオブジェクトのクラスに名前を付けます。 enablement 属性は、オブジェクトが装飾されるべき条件を記述できるようにします。 adaptable フラグは、IResource に 適用されるオブジェクトも装飾すべきかどうかを示します。 state フラグは、デコレーターをデフォルトで表示するかどうかを制御します。
計算に多くの時間とリソースを消費し、潜在的に誤解を招くような情報がデコレーターに含まれている場合は、 デコレーターがオンになったらユーザーがさらに微調整できる独自の設定を組み込まなければならない場合があります。 この技法は、CVS クライアントによって使用されます。
デコレーター更新サイクル
装飾は、DecoratorManager を使用して装飾を提供する、更新ラベル・プロバイダーによって開始されます。装飾処理はバックグラウンドで実行されるため、ラベルが要求されてから labelProviderChanged イベントが発生するまで一定の期間がかかりますが、これは文字飾り演算に要する期間です。この時間中に、オブジェクトに対する装飾は、効率性の理由により 1 回のみ計算されます。 この時間中にデコレーターが変更される場合、エレメントを修飾するための 2 番目以降の呼び出しが無視されるため、古くなった結果がブロードキャストされる可能性があります。
デコレーター・コントリビューターは、修飾の処理中にデコレーターを変更しないようにする必要があります。これが不可能な場合、labelProviderChanged の処理後に、エレメントを修飾するための 2 番目の呼び出しが必要になります。