ユニバーサル・イントロの拡張

上述のように構成されたユニバーサルようこそを起動すると、ルート・ページから分岐した第 2 レベルのページのすべてには、空のコンテンツ領域があることに気付きます。これは、共用のようこそに独自のコンテンツがないためです。これらの領域には、イントロ構成拡張機能を使用してデータが取り込まれます。

構成拡張機能をコントリビュートする従来の方法は、ターゲット・ページのアンカー要素の絶対パスを指定することです。この方法は、今もサポートされていますが、いくぶん脆弱であることが判明しています。前述のように、拡張機能が最後にターゲットで終了する正確な場所を指定することは、拡張機能の作成者には予想の範囲に留まります。作成者は拡張機能が終了するすべての製品を知っているわけではありません。したがって、各製品のフォーカスに従って現れてくる場所を知りません。ユニバーサルようこそでは、この決定は製品の作成者に回されます。拡張機能の作成者は、現在では、不完全なターゲット・パスを指定することも、製品の作成者に空欄に入力させることもできます。

遅延ターゲット・パスの解決に使用する構成拡張機能は、以下の 3 条件を満たす必要があります。

  1. 構成拡張機能は、「ID」属性を使用して固有 ID を指定する必要があります。 ID のない拡張機能は無視されます。これは重要です。ID は、製品作成者によって拡張機能の参照に使用されるからです。
  2. 構成拡張機能は、「name」属性を使用して分かりやすい名前を指定する必要があります。これは、カスタマイズ設定ページが使用される場合は重要です。拡張機能が UI に表示されるためです。
  3. ターゲット・パスは、「page_id/@」という書式にする必要があります。ここで、「page_id」はターゲット・ページの ID です。「/@」がターゲット・パスで検出されると、予期されるフル書式へのパスの動的な解決が実行されます。

拡張機能のターゲット・パスを解決する機能は、ユニバーサルようこそを一層強力にするために追加された、Eclipse 3.2 の新しいイントロ・サポート・フィーチャーです。このフィーチャー自体は、ユニバーサルだけでなく、他のようこそ実装に使用できるという点で汎用です。 Eclipse 3.2 の CustomizableIntroPart では、オプションのイントロ・カスタマイザー・クラス (複数の方法でイントロの動作に影響を与える) を受け入れることができます。カスタマイザーのロールの 1 つは、遅延ターゲット・パスの解決を実行することです。もちろん、製品作成者に関する限り、これはすべて実装の詳細に過ぎません。ユニバーサルようこそ実装では、遅延ターゲット・パスの解決は、前述のデータ・ファイルを使用して実行されるからです。このファイルは、org.eclipse.ui.intro/INTRO_DATA 設定を使用して保管されます。

「INTRO_DATA」ファイルは XML フォーマットを使用しています。このファイルにより、製品作成者はメインのようこそページのコンテンツを管理することができます。ようこそのコントリビューション作成者は、ターゲット・パスにページ ID のみを指定することが必要です。残りは、このファイルに定義されます。このファイルは、一連の「ページ」要素を含み、それぞれは、いくつかの「グループ」要素を含んでいます。 group 要素にはページ関連のパスを指定し、子に対するコントリビューションが入っています。コントリビューション要素は、2 つの外観の指定に使用されます。

   <extensions>
      <page id="overview">
         <group path="page-content/top-left">
            <extension id="foo1" importance="high"/>
            <extension id="bar"  importance="high"/>
            <extension id="foo2" importance="medium"/>
</group>
         <group path="page-content/top-right">
            <extension id="foo3" importance="low"/>
            <extension id="foo4" importance="low"/>
            <extension id="foo5" importance="callout"/>
</group>
         <hidden>
            <extension id="foo6"/>
            <extension id="foo7"/>
         </hidden>
     </page>
      <page id="whatsnew">
      ...
     </page>
   </extensions>

上の例では、コントリビューションの「foo1」、「bar」、および「foo2」は左側にあり、「foo3」、「foo4」、および「foo5」はページの右の列にあります。コントリビューションの相対順序もこのファイルから抽出されます。加えて、コントリビューションは、 importance 属性を基にして分類されています。この属性は、highmediumlow、および callout という 4 つの有効な値を持ち、デフォルトは low です。各値には、ページ上で目立たせるマッチング・プレゼンテーションがあります。最初の 3 つまでは、製品作成者による重要度のレベルが異なるだけです (同一コントリビューションが 2 つの別製品で異なる重要度の分類を受け取る場合があることに注意してください)。最後の 1 つ (callout) は、完全に異なる性質のコントリビューションを選出する目的に使用されます (例えば、ビデオやアニメーションへのリンクを提供するコントリビューションなど)。

リストされていないコントリビューションは、リスト済みコントリビューションの後に追加され、重要度「low」の値が割り当てられます。これは、製品の出荷後に追加されるコントリビューションには重要です。引き続き見えるようにする必要があるからです。

プロジェクトに関係のないコントリビューションは、「hidden」要素の子として明示的にリストすることで、非表示にすることができます。

拡張機能へのコントリビュート

ルート・ページの 1 つにコントリビュートされた拡張機能は、それ自体にアンカーが含まれており、コンテンツを追加する他のものに提供されます。これが原因で問題が起こります。拡張機能内のコンテンツの解決済み最終パスは、前もって知らされないためです。このために、遅延パス解決を使用する、拡張機能内のコンテンツに対するターゲット・パスは、それ自体で解決する必要があります。

<?xml version="1.0" encoding="utf-8" ?>
<introContent>
   <extensionContent id="extra" name="Extra" alt-style="css/swt.properties" style="css/overview.css" path="overview/@">
      <group id="extra-group" style-id="content-group">
         <link label="Extra Overview link" url="http://org.eclipse.ui.intro/showPage?id=extraOverview" 
					  id="extra-overview">
      	    <text>Showing the third-level extra page for overview</text>

        </link>
         <anchor id="additions"/>
</group>
	</extensionContent>
</introContent>

上記の拡張内のアンカー「additions」にコントリビュートするには、「overview/@extra/extra-group/additions」というパスを使用する必要があります。セグメント「@extra」は、「概要」ページの ID「extra」を持つ拡張機能の解決済みパスで置換されます。例えば、拡張機能がページの左上セグメントに配置されている場合、解決済みパスは、「overview/page-content/upper-left/extra-group/additions」になります。