Top / Eclipse / プラグイン開発のTIPS集 / org.eclipse.ui.IViewPart(ビュー)

org.eclipse.ui.IViewPart? はパースペクティブ内のひとつのビュー(コンソールとか、パッケージエクスプローラとかの)を表すインターフェースです。このインターフェースを実装することによって、自作のビューを作成することが出来ます。

拡張ポイント

org.eclipse.ui.views

plugin.xmlのサンプル

<extension point="org.eclipse.ui.views">
  <category
    name="サンプルMyView"   <- viewが属するカテゴリ名
    id="com.samples.myview"> <- カテゴリのID
  </category>
  <view
    name="シンプルView"   <- viewのバーのタイトル
    category="com.samples.myview"   <- viewが属するカテゴリID
    class="com.samples.myview.SimpleView"    <- viewを実装するクラス名
    id="com.samples.myview.simpleview">      <- viewのID
  </view>
</extension>

ポイント

plugin.xmlを開いているときのプロパティビューより、classを選択すると対応するクラス(ここではcom.samples.myview.SimpleView?)のスケルトンをウィザードが作ってくれます。

ビューを画面に描画するとき*1createPartControl?が呼ばれるので、このメソッド内でウィジェットを配置していきます。

TIPS

選択されたときに起動するメソッドsetFocus

自分が選択されたときに、ビュー内を更新したいときなどに使用します。

public void setFocus() {
 ウィジェットの更新処理
}

など

ISelectionListener?を実装する

ビューは選択しているオブジェクトの情報を表示することが多いので、選択しているものが変わったときにウィジェットを更新する、というアルゴリズムにしたいことが多いと思います。その場合はISelectionListener?を実装します。

public void selectionChanged(IWorkbenchPart part,ISelection selection){
  ウィジェットの更新処理
}

この場合、自分(this)を IWorkbenchPage?インターフェースにattachする必要がありますが、createPartControl?メソッド内で

getViewSite().getPage().addSelectionListener(this);

とすればよいでしょう。もしくはinit(IViewSite? site)で

site.getPage().addSelectionListener(this);

ですね。

このリスナですが、呼ばれるタイミングは、

  • パッケージエクスプローラ内でなんかを選択した
  • テキストエディタ内でドラッグした

などみたいですが、

  • テキストエディタ内で文字列を入力とかした場合

は呼ばれないんですね。ようわからんです。

ちなみに引数のメソッドは

IWorkbenchPart part  :選択されたビュー
ISelection selection :そのビューの中で、選択されたオブジェクト

となっています。

設定の保存とリストア

設定の保存とリストアにはMementoパタンを用いています。たとえば

org.eclipse.ui.views.markers.internal.TableView

の例だと

ビューの初期化時に

public void init(IViewSite site, IMemento memento) throws PartInitException {
    super.init(site, memento);
    this.memento = memento;
}

として、createPartControl?メソッドで

private void restoreColumnWidths(IMemento memento) {
    if (memento == null) {
        return;
    }
    columnLayouts = new ColumnLayoutData[getFields().length];
    for (int i = 0; i < columnLayouts.length; i++) {
        Integer width = memento.getInteger(TAG_COLUMN_WIDTH + i);
        if (width == null) {
            columnLayouts = null;
            break;
        } else {
            columnLayouts[i] = new ColumnPixelData(width.intValue(), true);
        }
    }
}

とメソッドが呼ばれ、カラムの幅などが前回の値がリストアされます。

initメソッドでフィールドにセットされるmementoには、以前ビューを閉じたとき、以下のメソッドで内容が保存されます。*2

public void saveState(IMemento memento) {
    super.saveState(memento);

    //save column widths
    TableColumn[] columns = viewer.getTable().getColumns();
    for (int i = 0; i < columns.length; i++) {
        memento.putInteger(TAG_COLUMN_WIDTH + i, columns[i].getWidth());
    }

    saveSelection(memento);

    //save vertical position
    Scrollable scrollable = (Scrollable) viewer.getControl();
    ScrollBar bar = scrollable.getVerticalBar();
    int position = (bar != null) ? bar.getSelection() : 0;
    memento.putInteger(TAG_VERTICAL_POSITION, position);
    //save horizontal position
    bar = scrollable.getHorizontalBar();
    position = (bar != null) ? bar.getSelection() : 0;
    memento.putInteger(TAG_HORIZONTAL_POSITION, position);
}

この記事は

選択肢 投票
おもしろかった 8  
そうでもない 0  
  • 保存とリストアについてですが、IMementoとorg.eclipse.jface.dialogs.IDialogSettings? との使い分けが...ようわからんですね。 -- きの? 2005-05-12 11:41:07 (木)
  • RCPやってて気づいたのですが、デフォルトではこの機構はOFFになってるみたいです。自分でRCP作るときはWorkbenchAdvisor?#initialize(IWorkbenchConfigurer? configurer)内でconfigurer.setSaveAndRestore?(true);をしないとダメです。 -- きの? 2006-03-22 23:31:25 (水)
  • IMementoはView用、DialogSettings?はDialog用 と理解してます。それぞれ、必要なデータ(ダイアログなら位置とサイズとか)を保持してリストアする機構が内部に組み込まれていたので。。。 -- YOU? 2007-03-22 (木) 11:17:37
  • ところで、このinitとsaveStateをオーバーライドしても×ボタンでViewを閉じたときなどは呼ばれないのですが何か必要なのでしょうか?Eclipse終了保存のタイミングでしか動作しないです。。。 -- YOU? 2007-03-22 (木) 11:19:04
  • saveStateはあくまで状態を保存するメソッドなので、Viewを閉じたときなどは(状態を保存する必要がないから)呼ばれないのではないでしょうか。再度ビューを開いたときは初期状態になるわけなので。 -- きの? 2007-07-16 (月) 01:42:25

Top / Eclipse / プラグイン開発のTIPS集 / org.eclipse.ui.IViewPart(ビュー)

現在のアクセス:17867


*1 ウィンドウ >> ビューでこのビューを選ぶ時
*2 でそのメメントの状態が次回開くときに再現される

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-06-24 (火) 17:54:01 (3592d)