概要 †さて前回、検索結果を表示するビュークラス(nu.mine.kino.plugin.google.ui.views.GoogleResultView?)に検索メソッド public void search(String text) ; をテスト実装したところまで行いました。今回はいよいよそのメソッドに実際の検索処理を実装していきます。 この検索メソッドはエディタのポップアップメニューなどから呼び出され、選択中の文字列を引数にもらって、その文字列でGoogleを検索しTableViewer?ウィジェットに検索結果を渡す、といった処理を行います。 またこのメソッドは処理時間が長いことが予想されるので、バックグラウンド処理を選択できるようにします。 スクリーンショット †バックグラウンドで処理を行うクラス org.eclipse.core.runtime.jobs.Job †さてEclipseを使っているとよく出てくる、先のようなバックグラウンド処理可能なダイアログですが、 org.eclipse.core.runtime.jobs.Job クラスを拡張することで実装することができます。このクラスの protected abstract IStatus run(IProgressMonitor monitor); を実装すればOKです。このメソッドにはバックグラウンドで実際に行いたい処理を記述します。戻り値にはIStatusという形式で実行した結果を返すようにします。 検索メソッドの実装 †さて、検索メソッドは以下のようにしました。 /** * 引数の文字列で検索を行うメソッドです。 検索結果をビューに配置します。 * * @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の実装方法についてはバックグラウンドで処理を実行するにまとめておきました。 結果的にSearchJob?のソースはこんな感じになっています。 ソースコード †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); } }; } private boolean checkAsyncExec(Runnable thread) { if (!Display.getDefault().isDisposed()) { Display.getDefault().asyncExec(thread); return true; } else { return false; } } } タスクの開始 monitor.beginTask() メソッド †monitor.beginTask("「" + text + "」でGoogleを検索中...", 10); タスクが進行すると monitor.worked() メソッド †monitor.worked(1); // ちょっと終わったので+1 タスクが完了すると monitor.done() メソッド †monitor.worked(1); // ちょっと終わったので+1 サブタスク monitor.subTask() メソッド †monitor.done(); // 全部終わった キャンセルしたときの処理 †メソッドの戻り値について †return Status.OK_STATUS; return Status.CANCEL_STATUS; return e.getStatus(); スペルチェックする †Google検索する †検索結果をGUIにセットする †次はこのビューのメソッドを実行する、ポップアップメニューをエディタに実装します。 この記事は 現在のアクセス:9816 |