前回の状態を保存する場所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内に書き込めばよいわけです。mementoへどのように読み書きすればよいかを次に見ていきます。
情報を保存する処理を実装する
まずはGoogleResultViewで、
public void init(IViewSite site, IMemento memento) throws PartInitException ; public void saveState(IMemento memento);
をオーバーライドします。
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());
とTAG_COLUMN_WIDTHという「一定のPrefix+インデックス番号」をKey、カラム幅をValueにしてputIntegerというメソッドを呼び出しています。このputIntegerを呼び出すと情報がmementoに保存されます。保存先のファイルは、
- {ワークスペース}/.metadata/.plugins/org.eclipse.ui.workbench/workbench.xml
というXMLファイルなのですが、実際に「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より取り出して、今回の起動時の幅としてセットする、ということをやっています。
以上で前回の状態を復元できるようになりました。
おわりに
今回はビューを「plugin.xml」で定義することや、TableViewerなどのウィジェットを配置すること、IFieldインターフェースを用いてカラムの情報を定義すること、などを学びました。またEclipseとJUnitを用いてビューのテストなども行えることがご理解いただけたのではないかと思います。後はEclipseのビューがもっているIMementoの機能を用いた、前回使用時の情報の保存・復元の方法なども説明しました。
次回は、今回テスト実装した検索メソッドを実際に実装してみたいと思います。
