#author("2021-12-14T02:35:58+00:00","","")
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents

**概要 [#z69fd4c1]
さて[[検索結果一覧を表示するビューの作成>Eclipse/プラグイン開発のTIPS集/GooglePlugin/検索結果一覧を表示するビューの作成]]でTableViewerにカラムをセットするところまで行いました。つづいて前回の状態を復元する処理を追加していきます。プロジェクトは引き続き「nu.mine.kino.plugin.google.ui」を使用します。




**前回の状態を保存する場所 org.eclipse.ui.IMemento [#kd268ece]
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内に書き込めばよいわけです。どのように読み書きすればよいかは実際のコードを見てみましょう。

**情報を保存する処理を実装する [#l2822429]
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データとして保存されているのが分かると思います。




**前回の情報を復元する処理を実装する [#o843821c]
さて復元に関してですが、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より取り出して幅としてセットする、ということをやっています。

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















----
この記事は
#vote(おもしろかった[5],そうでもない[1])
#vote(おもしろかった[6],そうでもない[2])

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS