多重化コンポーネントの実装
マルチプレクサーで使用するためには、サイト・インターフェースは、org.eclipse.ui.part.SiteMultiplexerInitializer のスコープで代替のデフォルト実装を登録する必要があります。
これによりサイトのスコープが拡張されるため、マルチプレクサーで使用される場合には、より特定のマルチプレクサー・バージョンがデフォルトのバージョンよりも優先されます。
多重化コンポーネントは、ほとんど常時、以下のパターンを使用します。
- INestedComponent ライフ・サイクル・インターフェースを実装する。
- そのコンストラクターに IMultiplexer を取り込み、それを使用してそのインターフェースの共用バージョンにアクセスする。
- パーツの状態を保管する。
- 子の状態変更を listen して、保管された状態を適切に更新する。
- コンポーネントが活動化されるたびに、保管された状態をマルチプレクサーの共用インターフェースに転送する。
- コンポーネントがアクティブである間は、直接、状態変更を共用インターフェースに転送する。
以下の例は、ChildSelectionHandler で ISelectionHandler インターフェースを多重化するワークベンチにより使用されるコードを示しています。
/**
* ISelectionHandler インターフェースの多重化
バージョン
*
* @since 3.1
*/
public class ChildSelectionHandler implements ISelectionHandler, INestedComponent {
private ISelectionHandler parent;
private ISelection selection;
private boolean isActive = false;
private IMultiplexer multiplexer;
public ChildSelectionHandler(IMultiplexer mplex) throws DependencyException {
this.multiplexer = mplex;
//多重化された共用の ISelectionHandler
にアクセスします
// (アクティブな子の場合にのみ変更する必要が
あります)
this.parent = (ISelectionHandler)
mplex.getSharedComponents().getComponent(ISelectionHandler.class);
// 初期状態を設定します (パーツの初期選択
は、明示的に
// 設定されるまでヌルです)。 }
public IMultiplexer getMultiplexer() {
// 作成したマルチプレクサーを戻します
return multiplexer;
}
public void activate() {
// 保管された選択を共用インターフェースに
転送します
parent.setSelection(selection);
isActive = true;
}
public void deactivate() {
isActive = false;
}
public void setSelection(ISelection newSelection) {
// 子の新規選択を記憶します
selection = newSelection;
if (isActive) {
// アクティブの場合、選択を直接共用
インターフェースに
// 転送します
parent.setSelection(newSelection);
}
}
}
以下は、ChildSelectionHandler 用の関連した拡張ポイント・マークアップです。
<extension point="org.eclipse.core.component.types">
<component
implementation="org.eclipse.ui.internal.part.services.ChildSelectionHandler"
interface="org.eclipse.ui.part.services.ISelectionHandler"
singleton="false"
initializer="org.eclipse.ui.part.SiteMultiplexerInitializer"/>
</extension>