// 下階層用テンプレート #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;}