Top / Eclipse / プラグイン開発のTIPS集 / GooglePlugin / 実際の検索ロジックをビューに実装

実装案

いよいよ先のクラス

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

に検索メソッドを実装します。この検索メソッドは、エディタのポップアップメニューなどから呼び出され、テキストをもらってそのテキスト文字列でGoogleを検索し、TableViewer?ウィジェットに検索結果を流し込む、みたいなことを行います。

さらに、このメソッドは処理時間が長いことが予想されるので、バックグラウンドで処理ができるようにしようと思います。

スクリーンショット

job.png

検索メソッドの実装

検索メソッドは以下のようにしました。

/**
 * 引数の文字列で検索を行うメソッドです。 検索結果をビューに配置します。
 * 
 * @param text  検索文字列
 */
public void search(final String text) {

    SearchJob job = new SearchJob("Google Search", text);
    // ダイアログを出す
    job.setUser(true);
    job.schedule();
}

このSearchJob? (Jobを拡張)が、ダイアログを表示し、バックグラウンドで検索を行うクラス(まさにジョブ)になります。Jobの実装方法についてはバックグラウンドで処理を実行するにまとめておきました。

けっこうまえに作ったので詳細を書く元気がないのですが、結果的にSearchJob?のソースはこんな感じになっています。

ソースコード

private class SearchJob extends Job {
    /**
     * Logger for this class
     */
    private final Logger logger = Logger.getLogger(SearchJob.class);

    private String text;

    private ResultElement[] elements;

    /**
     * @param name
     */
    public SearchJob(String name, String text) {
      super(name);
      this.text = text;
    }

    public IStatus run(IProgressMonitor monitor) {
      logger.debug("run(IProgressMonitor) - start");

      monitor.beginTask("「" + text + "」でGoogleを検索中...", 10);

      try {
        String searchText = null;

        // スペルチェック開始
        monitor.subTask("スペルチェック");
        monitor.worked(1);
        searchText = GooglePlugin.getDefault().getSplellingSuggestion(
            text, monitor);
        monitor.worked(3);
        // スペルチェック終了

        if (monitor.isCanceled()) {
          logger.debug("run(IProgressMonitor) - end");
          return Status.CANCEL_STATUS;
        }

        // 検索開始
        monitor.subTask("検索中");
        // 設定画面より、Google Keyを取得

        String myGoogleKey = GooglePlugin.getDefault()
            .getPreferenceStore().getString(
                PreferenceConstants.GOOGLE_KEY);
        GoogleSearchResult result = GoogleCorePlugin.getDefault()
            .search(myGoogleKey, searchText);

        monitor.worked(3);
        // 検索終了
        logger.debug("run(IProgressMonitor) - 検索終了");

        if (monitor.isCanceled()) {
          logger.debug("run(IProgressMonitor) - end");
          return Status.CANCEL_STATUS;
        }

        // ResultElement[] elementsTmp = result.getResultElements();
        // elements = new ResultElement[elementsTmp.length];
        // for (int i = 0; i < elementsTmp.length; i++) {
        // elements[i] = new ResultElementAdapter(elementsTmp[i]);
        // }

        elements = result.getResultElements();

        logger.debug("run(IProgressMonitor) - Elementsの取得完了");

      } catch (CoreException e) {
        logger.error("run(IProgressMonitor)", e);
        return e.getStatus();
      }

      // ////////////////////////

      // 結果が00件でない場合は描画する。
      // UIスレッドに委譲
      if (elements.length != 0) {
        checkAsyncExec(new Runnable() {
          public void run() {
            logger.debug("run() - start");
            // Viewerがユーザによって消されたしまった場合

            if (!viewer.getTable().isDisposed()) {
              viewer.setInput(elements);
            }
            logger.debug("run() - end");
          }
        });
      } else {
        // 結果が00件の場合はエラーダイアログ。
        checkAsyncExec(informationThread("検索結果は0件でした"));
      }

      // ////////////////////////
      monitor.worked(10);
      monitor.done();

      logger.debug("run(IProgressMonitor) - end");
      return Status.OK_STATUS;
    }
  }

  private Runnable errorThread(final String message) {
    return new Runnable() {
      public void run() {
        IWorkbench workbench = PlatformUI.getWorkbench();
        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
        MessageDialog.openError(window.getShell(), "Google検索", message);
      }
    };

  }

  private Runnable informationThread(final String message) {
    return new Runnable() {
      public void run() {
        IWorkbench workbench = PlatformUI.getWorkbench();
        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
        MessageDialog.openInformation(window.getShell(), "Google検索",
            message);
      }
    };

  }

  private boolean checkAsyncExec(Runnable thread) {
    if (!Display.getDefault().isDisposed()) {
      Display.getDefault().asyncExec(thread);
      return true;
    } else {
      return false;
    }
  }

次はこのビューのメソッドを実行する、ポップアップメニューをエディタに実装します。


この記事は

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

Top / Eclipse / プラグイン開発のTIPS集 / GooglePlugin / 実際の検索ロジックをビューに実装

現在のアクセス:9643


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