いよいよ先のクラス
nu.mine.kino.plugin.google.ui.views.GoogleResultView
に検索メソッドを実装します。この検索メソッドは、エディタのポップアップメニューなどから呼び出され、テキストをもらってそのテキスト文字列でGoogleを検索し、TableViewer?ウィジェットに検索結果を流し込む、みたいなことを行います。
さらに、このメソッドは処理時間が長いことが予想されるので、バックグラウンドで処理ができるようにしようと思います。
検索メソッドは以下のようにしました。
/** * 引数の文字列で検索を行うメソッドです。 検索結果をビューに配置します。 * * @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; } }
次はこのビューのメソッドを実行する、ポップアップメニューをエディタに実装します。
この記事は
現在のアクセス:9643