- 追加された行はこの色です。
- 削除された行はこの色です。
// 下階層用テンプレート
#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(おもしろかった,そうでもない)
#vote(おもしろかった[1],そうでもない[0])
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}