Top / Eclipse / プラグイン開発のTIPS集 / GooglePlugin / 前回の状態を復元する処理

概要

さて検索結果一覧を表示するビューの作成TableViewer?にカラムをセットするところまで行いました。つづいて前回の状態を復元する処理を追加していきます。プロジェクトは引き続き「nu.mine.kino.plugin.google.ui」を使用します。

前回の状態を保存する場所 org.eclipse.ui.IMemento

Eclipseのビューにはあらかじめ前回の状態を保存したり復元したりする機能が備わっています。org.eclipse.ui.IMemento インタフェースがその役目を果たします。このインタフェースはビューの状態をストア・リストアできるようなになっていて、ビューの初期化時や、状態を保存しなくてはいけないときに IMemento に状態を読み書きできるようになっています。状態を保存しなくてはいけないときとはたとえばそのビューを開いたままEclipseを終了したときなどですね。

ビューの初期化時は

public void init(IViewSite site, IMemento memento) throws PartInitException ;

が呼び出されます。このメソッドの引数のmementoは前回書き込んだ内容が保存されているので、init内やcreatePartControl?でこのmementoから値を取り出してリストアすればよいということです。

また状態を保存しなくてはいけないときは、

public void saveState(IMemento memento);

が呼び出されるので、このメソッド内でたとえばカラム幅などをmemento内に書き込めばよいわけです。どのように読み書きすればよいかは実際のコードを見てみましょう。

情報を保存する処理を実装する

GoogleResultView?

public void init(IViewSite site, IMemento memento) throws PartInitException ;
public void saveState(IMemento memento);

をOverrideします。

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

ここではとりあえず初期化時にmementoをフィールドに保持しておきます。繰り返しますがこのmementoには前回終了時の状態が保存されています。

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

private void saveColumnWidth(IMemento memento) {
    TableColumn[] columns = viewer.getTable().getColumns();
    for (int i = 0; i < columns.length; i++) {
        memento.putInteger(TAG_COLUMN_WIDTH + i, columns[i].getWidth());
    }
}

saveStateはTableViewer?内の各カラムのインスタンスを取り出し、

memento.putInteger(TAG_COLUMN_WIDTH + i, columns[i].getWidth());

と一定のPrefixでカラム幅をputIntegerしています。このputIntegerを行うことで情報がmementoに保存されていきます。実際に保存されているファイルを見てみると

  • /.metadata/.plugins/org.eclipse.ui.workbench/workbench.xmlの内容抜粋
    <view id="nu.mine.kino.plugin.google.ui.views.GoogleResultView" partName="Google検索結果">
      <viewState columnWidth0="328" columnWidth1="200" columnWidth2="200"/>
    </view>
    というようにxmlデータとして保存されているのが分かると思います。

前回の情報を復元する処理を実装する

さて復元に関してですが、createPartControl?内でinitTableというメソッドが呼ばれていました。このメソッド内で

ColumnLayoutData[] columnLayouts = getColumnLayouts();

という処理がありましたが、このメソッドを以下のように変更します。

private ColumnLayoutData[] getColumnLayouts() {
    ColumnPixelData[] result = new ColumnPixelData[DEFAULT_COLUMN_LAYOUTS.length];
    for (int i = 0; i < DEFAULT_COLUMN_LAYOUTS.length; i++) {
        int width = DEFAULT_COLUMN_LAYOUTS[i].width;
        if (memento != null) {
            // メメントから、前回の幅を取得している
            Integer widthInt = memento.getInteger(TAG_COLUMN_WIDTH + i);
            if (widthInt != null && widthInt.intValue() > 0) {
                width = widthInt.intValue();
            }
        }
        result[i] = new ColumnPixelData(width);
    }
    return result;
    // return DEFAULT_COLUMN_LAYOUTS;
}

このようにフィールドのmementoがnullでなかったら、前回の幅をmementoより取り出して幅としてセットする、ということをやっています。

以上で前回の状態をリストアするということができるようになりました。


この記事は

選択肢 投票
おもしろかった 6  
そうでもない 2  

Top / Eclipse / プラグイン開発のTIPS集 / GooglePlugin / 前回の状態を復元する処理

現在のアクセス:11078


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-14 (火) 11:35:58 (856d)