ユーザーに進捗を見せる
手始めに、ユーザーに進捗を見せる方法を紹介します。GUIアプリケーションでは、処理中であることをユーザーに示すことは非常に大事な機能です。例えばインターネットエクスプローラーなどのブラウザではページを表示する際に画面下のステータスラインに「読み込み中...」といったステータスを表示し、アドレスバーの隣の地球儀がぐるぐる回転することでユーザーに処理中であることを通知します。仮にこれらの通知が無かったとすると、ユーザーはブラウザが正常に動いているのかどうかが判断できず、ブラウザを閉じてしまうかも知れません。
RCPでも同様に、アプリケーションが今何を処理しているのかをユーザーに通知することは非常に大事です。進捗を通知する方法はいくつかありますが、今回はジョブと進捗ビューを使って通知を行ってみます。
Jobクラス
Jobクラスはその名の通り、ジョブを表した抽象クラスです。EclipseではジョブのほかにProgressMonitorDialogなどを利用した進捗表示の方法がありますが、ジョブは次のような特徴を持っています。
- 非モーダルで実行することができる
- スケジュールを設定することができる
- 実行中ジョブを表示するためのコンポーネントが用意されている
ジョブの定義
まずは、Thread.sleep()を使って、しばらく時間のかかる処理を定義してみます。Jobクラスを次のように実装します。
Job job = new Job("お仕事開始") { protected IStatus run(IProgressMonitor monitor) { monitor.beginTask("長時間の仕事", 100); for (int i = 0; i < 20; i++) { monitor.subTask("仕事 : " + i); monitor.worked(5); if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } return Status.OK_STATUS; } };
ジョブの実行
定義したジョブを実行するのは非常に簡単です。scheduleメソッドを実行するだけで、Eclipseフレームワークが自動的にジョブのスケジューリングを行い、実行します。
//1秒後にジョブをスケジュールする。 job.schedule(1000); //即座にジョブをスケジュールする。 job.schedule();
ジョブの種類
ジョブを実行しただけでは何も表示されないので、本当に実行できたかどうか良く分かりません。正しくジョブが実行されていても、ジョブの種別がシステムジョブであるため、画面に表示されないのです。
ジョブの種別は3種類あり、それぞれ次のような特徴があります。
- システムジョブ
- ユーザージョブ
- 自動ジョブ(デフォルト)
job.setUser(true);
job.schedule();
job.setSystem(true);
job.schedule();
job.setSystem(false); job.setUser(false); job.schedule();
ユーザージョブの表示
ユーザージョブの場合、進捗ダイアログが表示され、利用者に進捗を通知することができます。

ジョブの表示
進捗ダイアログ以外の方法でもユーザーにジョブの進捗状況を通知する方法があります。ジョブの通知を行うためには、BusyIndicatorやJobViewを利用する必要があります。
BusyIndicatorの利用
ジョブの実行と同様に、BusyIndicatorの表示も非常に簡単です。RCPにはもともとBusyIndicatorを表示するための画面スペースが設けてあります。ところが、デフォルトで非表示になっています。BusyIndicatorを利用するためにはデフォルト非表示のBusyIndicatorを表示に変更するだけです。
@Override public void preWindowOpen() { IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); configurer.setInitialSize(new Point(400, 300)); configurer.setShowCoolBar(false); configurer.setShowStatusLine(true); configurer.setShowProgressIndicator(true); configurer.setTitle("RCP Application"); }
これで、ステータスラインに進捗が表示されます。

進捗ビューの追加
進捗ビューはEclipseによって提供される進捗表示用コンポーネントです。進捗ビューをRCP上に乗せるためには、通常とは異なる方法でビューの定義を追加する必要があります。それはExtensionFactoryを使って進捗ビュークラスへの参照を定義することです。
・・・ <extension point="org.eclipse.ui.views"> <view class="org.eclipse.ui.ExtensionFactory:progressView" id="rcp.wtih.progress.Progress" name="進捗"/> </extension> ・・・
JobViewというクラスになります。しかし、このJobViewというクラスは「org.eclipse.ui」プラグインの外から見えないように定義されています。実際のクラス名を「plugin.xml」に記述しないでも、こういった内部コンポーネントを利用できるようにするクラスがExtensionFactoryです。View定義を追加したら、それをRCPの上にレイアウトします。
@Override public void createInitialLayout(IPageLayout layout) { String editorArea = layout.getEditorArea(); layout.setEditorAreaVisible(false); layout.setFixed(true); layout.addStandaloneView("rcp.wtih.progress.Progress", true, IPageLayout.LEFT, 1.0f, editorArea); }
進捗ビューによるジョブの表示
進捗ビューを使えば、同時に複数実行されるジョブも表示することができます。

