サイト・インターフェース

パーツ・コンストラクターの引数は、依存関係と呼ばれます。パーツ依存関係は、さまざまなアダプターおよび get メソッドを置き換えます。例えば、サイトの IActionBars にアクセスするためには、コンポーネント・ベースのパーツは、コンストラクターに IActionBars インスタンスを取り込みます。

新しいスタイルのサイトは、開放型インターフェースを提供します。どのプラグインも、org.eclipse.core.component.types 拡張ポイントを使用してサイト・インターフェースのセットを拡張できます。サイト・インターフェースのセットは拡張可能ですが、任意のパーツを任意のサイトにプラグインできるよう、すべてのサイトが同じセットをサポートします。サイト・インターフェースの完全なセットは、PDE プラグイン・レジストリー・ビューを使用して表示可能です。

ワークベンチは、以下のサイト・インターフェースを提供します。

インターフェース
説明
IErrorContext
IStatus メッセージを構成してプラグイン・ログに記録します。
Bundle
パーツの実装を含むプラグイン・バンドル。これは、プラグインについて他のコンポーネント (IErrorContext の実装など) に自動的に通知します。
IContainer
サイトのコンテナー。このオブジェクトは、他の任意のサイト・インターフェースを対象として照会できます。これは、パーツが、サイトから子にすべてをリダイレクトまたは多重化する場合に役立ちます。
INameable
パーツが、名前、アイコン、ツールチップ、およびコンテンツ記述を設定できるようにします。IWorkbenchPart 上のさまざまな get メソッドおよびリスナーを置き換えます。
Composite
パーツの親コンポジット。このコンポジットは、他のパーツと共用されることはなく、パーツと一緒に廃棄されます。パーツは、レイアウトを設定し、このコンポジットにリスナーを接続できます。
ISecondaryId
マルチインスタンス・ビューとして使用される場合にパーツの 2 次 ID を戻すインターフェース。
ResourceManager
イメージ、フォント、色、および他の SWT リソースを安全に割り振り/割り振り解除します。パーツ間で同じリソースが共用されるようにし、パーツのクローズ時にリークがクリーンアップされるようにします。
IDirtyHandler
パーツがダーティー状態を設定またはクリアできるようにします。
IMessageDialogs
エラー、警告、および通知ダイアログをユーザーに対して表示します。
IActionBars
Eclipse 3.0 API での getViewSite().getActionBars() と同じ目的で使用されます。
IMultiplexer
多重化コンポーネントがマルチプレクサーおよび任意の共用インターフェースにアクセスできるようにします。
.
ISavedState
パーツの以前の永続状態を保持します。
IPartFactory
パーツがネストされたビューおよびエディターを作成できるようにします。
IPartDescriptor
パーツに関するメタ情報 (ID、タイトル、デフォルト・イメージなど) を保持します。
IEditorInput
エディターのためのエディター入力を保持します。ビュー用の空のエディター入力を指します。
ISelectionHandler
選択の変更を処理します。パーツはこれを使用して、ワークベンチに提供する選択を変更します。

パーツがインターフェースごとに固有のインスタンスを用意するのか、複数のパーツ間で 1 つのオブジェクトを共用するのかは、パーツを含むコンテキストによって決まります。 パーツのコンストラクターが、null 引数を受け取ることは決してありません。

 

既存のパーツを用いた新規サイト・インターフェースの使用

コンストラクター・インジェクションは便利ですが、新規サイト・インターフェースを利用する目的で、コンストラクター・インジェクションを使用するように既存のすべてのエディターおよびビューを再作成するのは実際的ではありません。このため、すべての新規インターフェースは、IWorkbenchPartSite 上のアダプターとして既存のビューでも使用可能です。

メッセージ・ダイアログを開く単一ボタンを含むビューを以下に示します。

DependenciesViewOld のイメージ

以下の例は、新しい IMessageDialogs インターフェースを使用してダイアログを開く新しいスタイルのビューのソースを示しています。

/**
 * Demonstrates how to use component dependencies in a new-style part.
 *
 * @since 3.1
 */
public class DependenciesViewNew {
    // Dependencies
    private IMessageDialogs dialogs;
   
    /**
     * Component constructor. Do not invoke directly.
     */
    public DependenciesViewNew(Composite parent, IMessageDialogs dialogs) {
        this.dialogs = dialogs;
       
        Button testButton = new Button(parent, SWT.PUSH);
        testButton.setText("Open a dialog");
        testButton.addSelectionListener(new SelectionAdapter() {
        /* (non-Javadoc)
         * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
         */
        public void widgetSelected(SelectionEvent e) {
            openADialog();
        }
        });
    }
   
    private void openADialog() {
        dialogs.open(IStatus.INFO, "This is a message");
    }
}

以下の例は、IMessageDialogs を使用してダイアログを開く従来のビューを示していますが、従来のワークベンチ・パーツを使用してもこれが可能であることを示しています。 赤いフォントの行は、IMessageDialogs インターフェースが初期化される方法と、それぞれの場合の使用方法を示しています。

/**
 * Demonstrates how to use component dependencies in an old-style view
 *
 * @since 3.1
 */
public class DependenciesViewOld extends ViewPart {
    // Dependencies
    private IMessageDialogs dialogs;
    
    // Main widget
    private Composite parent;
    
    /* (non-Javadoc)
     * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     */
    public void createPartControl(Composite parent) {
        this.parent = parent;
        this.dialogs = (IMessageDialogs)getSite().getAdapter(IMessageDialogs.class);
        
        Button testButton = new Button(parent, SWT.PUSH);
        testButton.setText("Open a dialog");
        testButton.addSelectionListener(new SelectionAdapter() {
        /* (non-Javadoc)
         * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
         */
        public void widgetSelected(SelectionEvent e) {
            openADialog();
        }
        });
    }
    
    private void openADialog() {
        if (dialogs != null) {
            dialogs.open(IStatus.INFO, "This is a message");
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.IWorkbenchPart#setFocus()
     */
    public void setFocus() {
        parent.setFocus();
    }
}