さて検索結果一覧を表示するビューの作成でTableViewer?にカラムをセットするところまで行いました。つづいて前回の状態を復元する処理を追加していきます。プロジェクトは引き続き「nu.mine.kino.plugin.google.ui」を使用します。
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に保存されていきます。実際に保存されているファイルを見てみると
<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より取り出して幅としてセットする、ということをやっています。
以上で前回の状態をリストアするということができるようになりました。
この記事は
現在のアクセス:11068