SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Webサービスを利用したEclipseプラグインの作成

Google Web APIsを使用したEclipseのプラグインの作成

Webサービスを利用したEclipseプラグインの作成 第3回


前回の状態を保存する場所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);

 をオーバーライドします。

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

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

saveStateのソース
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」を見てみると

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の機能を用いた、前回使用時の情報の保存・復元の方法なども説明しました。

 次回は、今回テスト実装した検索メソッドを実際に実装してみたいと思います。

参考資料

  1. Google Code-Google's Developer Network
  2. Eclipse/プラグイン開発のTIPS集

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Webサービスを利用したEclipseプラグインの作成連載記事一覧

もっと読む

この記事の著者

木野 雅富(キノ マサトミ)

2000年にシンクタンク系のSIerに入社後、サーバサイドJava開発やWEBサービスを利用したリッチクライアント開発など、さまざまな開発プロジェクトに携わる。2008年より株式会社プライムブレインズにて、システムコンサルタントとして従事。現在は会社作りも楽しんでいます!専門はJ2EEと最近はEcl...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1541 2008/08/22 19:07

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー