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

***実装案 [#bfdecdae]
いよいよ先のクラス
 nu.mine.kino.plugin.google.ui.views.GoogleResultView
に検索メソッドを実装します。この検索メソッドは、エディタのポップアップメニューなどから呼び出され、テキストをもらってそのテキスト文字列でGoogleを検索し、TableViewerウィジェットに検索結果を流し込む、みたいなことを行います。

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

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

***検索メソッドの実装 [#ya55418f]
検索メソッドは以下のようにしました。
 /**
  * 引数の文字列で検索を行うメソッドです。 検索結果をビューに配置します。
  * 
  * @param text  検索文字列
  */
 public void search(final String text) {
 
     SearchJob job = new SearchJob("Google Search", text);
     // ダイアログを出す
     job.setUser(true);
     job.schedule();
 }
このSearchJob (Jobを拡張)が、ダイアログを表示し、バックグラウンドで検索を行うクラス(まさにジョブ)になります。Jobの実装方法については[[バックグラウンドで処理を実行する>Eclipse/プラグイン開発のTIPS集/バックグラウンドで実行する]]にまとめておきました。

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

***ソースコード [#ecb57aa1]
 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;
     }
   }

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



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

#comment
#topicpath


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

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