// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents

***概要 [#l6465af6]
さて[[前回>Eclipse/プラグイン開発のTIPS集/GooglePlugin/検索結果一覧を表示するビューの作成]]、検索結果を表示するビュークラス(nu.mine.kino.plugin.google.ui.views.GoogleResultView)に検索メソッド
 public void search(String text) ;
をテスト実装したところまで行いました。今回はいよいよそのメソッドに実際の検索処理を実装していきます。

この検索メソッドはエディタのポップアップメニューなどから呼び出され、選択中の文字列を引数にもらって、その文字列でGoogleを検索しTableViewerウィジェットに検索結果を渡す、といった処理を行います。

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

***スクリーンショット [#n39eed60]
#ref(job.png)


***バックグラウンドで処理を行うクラス org.eclipse.core.runtime.jobs.Job [#o357f83d]
さてEclipseを使っているとよく出てくる、先のようなバックグラウンド処理可能なダイアログですが、 org.eclipse.core.runtime.jobs.Job クラスを拡張することで実装することができます。このクラスの
 protected abstract IStatus run(IProgressMonitor monitor);
を実装すればOKです。このメソッドにはバックグラウンドで実際に行いたい処理を記述します。戻り値にはIStatusという形式で実行した結果を返すようにします。

***検索メソッドの実装 [#ya55418f]
さて、検索メソッドは以下のようにしました。
 /**
  * 引数の文字列で検索を行うメソッドです。 検索結果をビューに配置します。
  * 
  * @param text  検索文字列
  */
 public void search(final String text) {
   Job job = new SearchJob("Google Search", text, viewer)
   // ダイアログを出す
   job.setUser(true);
   job.schedule();
 }

searchメソッド内でJobクラス(のサブクラス)を作成し、job.schedule() でジョブをEclipseに登録しておきます。あとはEclipseが適切にrunを実行し、処理してくれるわけですね。


Jobの実装方法については[[バックグラウンドで処理を実行する>Eclipse/プラグイン開発のTIPS集/バックグラウンドで実行する]]にまとめておきました。

結果的にSearchJobのソースはこんな感じになっています。

***ソースコード [#ecb57aa1]
 class SearchJob extends Job {
   private final Logger logger = Logger.getLogger(SearchJob.class);
   private String text;
   private ResultElement[] elements;
   private final TableViewer viewer;
 
   /**
    * @param name
    */
   public SearchJob(String name, String text, TableViewer viewer) {
     super(name);
     this.text = text;
     this.viewer = viewer;
   }
 
   public IStatus run(IProgressMonitor monitor) {
     logger.debug("run(IProgressMonitor) - start");
 
     // タスクは全体で10単位
     monitor.beginTask("「" + text + "」でGoogleを検索中...", 10);
 
     try {
       String searchText = null;
 
       // スペルチェック開始
       monitor.subTask("スペルチェック");
       monitor.worked(1); // ちょっと終わったので+1
       searchText = GooglePlugin.getDefault().getSpellingSuggestion(text,
           monitor);
       monitor.worked(3); // ちょっと終わったので+3
       // スペルチェック終了
 
       if (monitor.isCanceled()) {
         logger.debug("run(IProgressMonitor) - end");
         return Status.CANCEL_STATUS;
       }
 
       // 検索開始
       monitor.subTask("検索中");
       monitor.worked(1); // ちょっと終わったので+1
       // 設定画面より、Google Keyを取得
 
       String myGoogleKey = GooglePlugin.getDefault().getPreferenceStore()
           .getString(PreferenceConstants.GOOGLE_KEY);
       GoogleSearchResult result = GoogleCorePlugin.getDefault().search(
           myGoogleKey, searchText);
 
       monitor.worked(3); // ちょっと終わったので+3
       // 検索終了
       logger.debug("run(IProgressMonitor) - 検索終了");
 
       if (monitor.isCanceled()) {
         logger.debug("run(IProgressMonitor) - end");
         return Status.CANCEL_STATUS;
       }
 
       elements = result.getResultElements();
 
       logger.debug("run(IProgressMonitor) - Elementsの取得完了");
 
     } catch (CoreException e) {
       logger.error("run(IProgressMonitor)", e);
       return e.getStatus();
     }
 
     // ////////////////////////
     // 結果が0件でない場合は描画する。
     // 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 {
       // 結果が0件の場合はエラーダイアログ。
       checkAsyncExec(informationThread("検索結果は0件でした"));
     }
 
     // ////////////////////////
     monitor.worked(2); // ちょっと終わったので+2
     monitor.done(); // 全部終わった
 
     logger.debug("run(IProgressMonitor) - end");
     return Status.OK_STATUS;
   }
 
   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);
       }
     };
 
   }
 


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


***タスクの開始 monitor.beginTask() メソッド [#m1c6c010]
 monitor.beginTask("「" + text + "」でGoogleを検索中...", 10);


***タスクが進行すると monitor.worked() メソッド [#k50e51ba]
 monitor.worked(1); // ちょっと終わったので+1
 
 
***タスクが完了すると monitor.done() メソッド [#s14e2dc1]
 monitor.worked(1); // ちょっと終わったので+1

***サブタスク monitor.subTask() メソッド [#m79be349]
 monitor.done(); // 全部終わった



***キャンセルしたときの処理 [#e95c36b2]


***メソッドの戻り値について [#w6d6eb4d]
 return Status.OK_STATUS;
 return Status.CANCEL_STATUS;
 return e.getStatus();


***スペルチェックする [#qeefa8ff]


***Google検索する [#xe74f0ba]



***検索結果をGUIにセットする [#g38bc6fd]






次はこのビューのメソッドを実行する、[[ポップアップメニューをエディタに実装>Eclipse/プラグイン開発のTIPS集/GooglePlugin/ポップアップメニューをエディタに実装]]します。



----
この記事は
#vote(おもしろかった[2],そうでもない[1])
#vote(おもしろかった[2],そうでもない[2])

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS