Top / Eclipse / プラグイン開発のTIPS集 / GooglePlugin / 検索結果一覧を表示するビューの作成

概要

さて前回はGoogleの検索機能を呼び出したり、スペルミスを変更するダイアログだったりを作成しました。今回はその検索結果を表示するためのビューを作成していきたいと思います。プロジェクトは引き続き「nu.mine.kino.plugin.google.ui」を使用します。

plugin.xml、MANIFEST.MFを記述する

「META-INF/MANIFEST.MF」をマニフェストエディタで開き、[拡張]タブを選択して[追加]をクリックします。すると、拡張ポイントを選択するダイアログが開くので、「org.eclipse.ui.views」を選択し[終了]をクリックします。

view.gif

次に、この「org.eclipse.ui.views」を右クリックして[新規]−[view]を選択します。下に要素が追加されました。右側にはidやクラス名を指定する画面が表示されているので、以下のように指定します。

idnu.mine.kino.plugin.google.ui.views.GoogleResultView?
nameGoogle検索結果
classnu.mine.kino.plugin.google.ui.views.GoogleResultView?
categorynu.mine.kino.plugin.google
iconicons/icon.png

カテゴリーなども追加して結局plugin.xmlには以下のコードが追加されました。

  <extension
        point="org.eclipse.ui.views">
     <view
           category="nu.mine.kino.plugin.google"
           class="nu.mine.kino.plugin.google.ui.views.GoogleResultView"
           icon="icons/icon.png"
           id="nu.mine.kino.plugin.google.ui.views.GoogleResultView"
           name="Google検索結果"/>
     <category
           id="nu.mine.kino.plugin.google"
           name="Googleプラグイン"/>
  </extension>

ビューのクラスを追加する

先のマニフェストエディタでidやクラス名を指定しましたが、classのラベルはクリックできるようになっています。

label.gif

これをクリックするとビューのクラスを作成するウィザードが起動します。そのまま終了をクリックすると「GoogleResultView?」のソースコードが作成されます。

では、そのソースコードに色々追加していこうと思います。

ビューの本体にテーブルビューワを配置する

まずはビューの本体を構築していきます。ビューの構築は

public void createPartControl(Composite parent);

をOverrideすることで行います。引数のCompositeに色々ウィジェットを配置していくわけですね。

さて今回は下記のとおりビュー全体にTableViewer?を配置することにしました。ここで出てくるTableViewer?とはEclipseの「問題ビュー」のようにヘッダとデータ部分を持った表形式のビューワーです。

public void createPartControl(Composite parent) {
    // ビューワを追加。
    Composite container = new Composite(parent, SWT.NONE);
    container.setLayout(new FillLayout());

    viewer = new TableViewer(container, SWT.FULL_SELECTION | SWT.BORDER);
    viewer.setContentProvider(new ArrayContentProvider());
    viewer.setInput(getViewSite());
    initTable(viewer);

    createActions();
    initializeToolBar();
    initializeMenu();
}

TableViewer?にカラムを追加する処理は initTable(viewer); で行っています。具体的なソースは以下の通りです。

private void initTable(final TableViewer viewer) {
    table = viewer.getTable();
    TableLayout layout = new TableLayout();
    table.setLayout(layout);
    table.setHeaderVisible(true); //ヘッダを表示する 
    table.setLinesVisible(true);  //ラインを表示する

    ColumnLayoutData[] columnLayouts = getColumnLayouts();

    for (int i = 0; i < columnLayouts.length; i++) {
        layout.addColumnData(columnLayouts[i]);
        TableColumn tc = new TableColumn(table, SWT.NONE, i);
        tc.setText(VISIBLE_FIELDS[i].getColumnHeaderText());
        tc.setImage(VISIBLE_FIELDS[i].getColumnHeaderImage());
    }
}

ColumnLayoutData?はフィールドの幅などレイアウト情報を管理するクラスです*1

このColumnLayoutData?クラスは

table = viewer.getTable();
TableLayout layout = new TableLayout();
table.setLayout(layout);

というようにTableViewer?TableLayout?が関連づけられており、TableLayout?

layout.addColumnData(columnLayouts[i]);

とすることでTableViewer?に関連づいています。

さて

ColumnLayoutData[] columnLayouts = getColumnLayouts();

で、各カラムのレイアウト情報を配列で取得していますが、現段階ではgetColumnLayouts?();は

private ColumnLayoutData[] getColumnLayouts() {
  return DEFAULT_COLUMN_LAYOUTS;
}

とフィールドに定義されている配列をそのまま返すようになっています。ここはあとで「すでに前回の情報が保存されていたらその情報を復元する」という処理に変更します。たとえば前回使用していたときにフィールドの幅などを変更していたとして、その幅を次回に復元する、といったことをできるようにするわけですね。

実際にカラムを追加する

実際にカラムを追加する処理は

for (int i = 0; i < columnLayouts.length; i++) {
  layout.addColumnData(columnLayouts[i]);
  TableColumn tc = new TableColumn(table, SWT.NONE, i);
  tc.setText(VISIBLE_FIELDS[i].getColumnHeaderText());
  tc.setImage(VISIBLE_FIELDS[i].getColumnHeaderImage());
}

の箇所です。先のレイアウト情報をセットするのと、ヘッダの文言やイメージデータをカラムごとにセットしています。ここで出てくる VISIBLE_FIELDS[] のインスタンスはあらかじめ

private final IField[] VISIBLE_FIELDS = 
   { new TitleField(),new SummaryField(), new URLField() };

とフィールドに定義されているインスタンスです。

IFieldの役割

IFieldとは

public interface IField {
    String getColumnHeaderText();
    Image getColumnHeaderImage();
    String getValue(Object obj);
    Image getImage(Object obj);
    int compare(Object obj1, Object obj2);
}

というように、ヘッダ名やヘッダに表示するアイコンの情報、またビューワの各カラムにオブジェクトが渡されたときにオブジェクトを文字列に変換する変換処理、などを備えたインタフェースです。実装しているクラスTitleField?, SummaryField?, URLField はそれぞれ

public class TitleField implements IField {
  public String getColumnHeaderText() {return "Title";}
  -- 以下省略 --
}
public class SummaryField implements IField {
  public String getColumnHeaderText() {return "Summary";}
  -- 以下省略 --
}
public class URLField implements IField {
  public String getColumnHeaderText() {return "URL";}
  -- 以下省略 --
}

というようにヘッダ部分の文言が定義されています。

さて上記のIFieldとその実装クラスですが、先のソースで

for (int i = 0; i < columnLayouts.length; i++) {
  layout.addColumnData(columnLayouts[i]);
  TableColumn tc = new TableColumn(table, SWT.NONE, i);
  tc.setText(VISIBLE_FIELDS[i].getColumnHeaderText());
  tc.setImage(VISIBLE_FIELDS[i].getColumnHeaderImage());
}

TableColumn?のsetTextを呼び出して、各カラムにヘッダ名をセットしているわけです。IFieldはこのようにヘッダ名をセットするだけではなくTableViewer?へのデータ表示時にも使用されるのですが、それについては後述します。

検索メソッドを定義する

続いてこのメソッドに検索メソッドを定義します。メソッド名は

public void search(String text);

というメソッドにしました。ただ、中身については後に実装しますので、とりあえず以下のようなテスト実装としておきました。

public void search(String text) {
    logger.debug("search(String) - start");
    try {
        String key = GooglePlugin.getDefault().getPreferenceStore()
                .getString(PreferenceConstants.GOOGLE_KEY);
        GoogleSearchResult result = GoogleCorePlugin.getDefault().search(key, text);
        ResultElement[] resultElements = result.getResultElements();
        logger.debug("search(String)の検索結果件数は "
                      + resultElements.length + " 件でした。");
        viewer.setInput(resultElements);
    } catch (CoreException e) {
        logger.error("search(String)", e);
    }
    logger.debug("search(String) - end");
}

ここまででビューにはTableViewer?が配置されていて、そのTableViewer?にはTitle,Summary,URLという3つのカラムがあり、検索メソッドがテスト実装されている、ということになりました。

スクリーンショット

実際にビューを表示してみると、こんな感じです。

result.gif

まだTitleのカラムにオブジェクトのハッシュコードが表示されるのみですが、これは後に修正していきます。

さて実際にビューを生成して検索メソッドを呼び出す方法ですが、例によってJUnitを用いることができます。

JUnitを使ってビューを生成する

テスト用のプロジェクトは前回の「nu.mine.kino.plugin.google.ui.test」を用います。今回も外部のテストプラグインからクラスを呼び出すので、「nu.mine.kino.plugin.google.ui」プラグインの外部に公開するパッケージに

  • nu.mine.kino.plugin.google.ui.views

を追加しました。

export.gif

前回と同様、nu.mine.kino.plugin.google.ui.views.GoogleResultView? クラスを選択してJUnitのテストクラスを「nu.mine.kino.plugin.google.ui.test」プロジェクトに生成します。JUnitのテストクラスはnu.mine.kino.plugin.google.ui.views.GoogleResultViewTest? です。テストクラスには以下のメソッドを実装しました。

public void testGoogleResultView() {
  try {
    GooglePlugin.getDefault().getPreferenceStore().setValue(
        PreferenceConstants.GOOGLE_KEY, "xxxxxxxxxx");
    IWorkbenchPage page = PlatformUI.getWorkbench()
        .getActiveWorkbenchWindow().getActivePage();
    GoogleResultView view = (GoogleResultView) page
        .showView(GoogleResultView.ID);
    view.search("eclipse");
  } catch (PartInitException e) {
    e.printStackTrace();
  }
}

パッケージ・エクスプローラで[GoogleResultViewTest?]を選択し、Eclipseのツールバーから[実行]−[JUnitプラグイン・テスト]を選択します。Eclipseが起動して上のメソッドが実行され、一瞬で消えてしまうのですがビューが表示され、検索結果が一覧されます。

さて引き続き、前回の状態を復元する処理を追加したいと思います。


この記事は

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

Top / Eclipse / プラグイン開発のTIPS集 / GooglePlugin / 検索結果一覧を表示するビューの作成

現在のアクセス:11238


*1 Eclipseでテーブルビューワを使うときはカラムの制御はColumnLayoutDataでやるのがよいみたいです*2ColumnLayoutDataはフィールドの幅などの情報を表現するクラスです。
*2 とりあえずEclipseのMarkerView?などの実装はそうなってた

添付ファイル: fileexport.gif 500件 [詳細] fileresult.gif 522件 [詳細] fileview2.gif 293件 [詳細] filelabel.gif 515件 [詳細] fileview.gif 540件 [詳細] fileview.png 294件 [詳細] fileprototype.png 311件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-03-21 (木) 12:18:58 (2430d)