SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Eclipse RCPプログラミング

Eclipse RCPプログラミング 2:用意されたコンポーネントの利用

イントロ、ヘルプ、進捗、更新の実現


ユーザーに進捗を見せる

 手始めに、ユーザーに進捗を見せる方法を紹介します。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種類あり、それぞれ次のような特徴があります。

  • システムジョブ
  • 「システムジョブ」は、実行されてもユーザーに実行が通知されません。
  • ユーザージョブ
  • 「ユーザージョブ」は、ユーザーが明示的に実行するジョブで、CVSからのチェックアウト処理などが代表的です。ユーザーに進捗状況がダイアログで通知されます。
  • 自動ジョブ(デフォルト)
  • 定時処理や起動終了時の定型処理が「自動ジョブ」にあたります。進捗状況はダイアログでは表示されませんが、進捗ビューやステータスラインに表示されます。
ユーザージョブの指定
job.setUser(true);
job.schedule();
システムジョブの指定
job.setSystem(true);
job.schedule();
自動ジョブの指定
job.setSystem(false);
job.setUser(false);
job.schedule();

ユーザージョブの表示

 ユーザージョブの場合、進捗ダイアログが表示され、利用者に進捗を通知することができます。

進捗ダイアログの表示
進捗ダイアログの表示

ジョブの表示

 進捗ダイアログ以外の方法でもユーザーにジョブの進捗状況を通知する方法があります。ジョブの通知を行うためには、BusyIndicatorJobViewを利用する必要があります。

BusyIndicatorの利用

 ジョブの実行と同様に、BusyIndicatorの表示も非常に簡単です。RCPにはもともとBusyIndicatorを表示するための画面スペースが設けてあります。ところが、デフォルトで非表示になっています。BusyIndicatorを利用するためにはデフォルト非表示のBusyIndicatorを表示に変更するだけです。

BusyIndicatorの利用(WorkbenchWindowAdvisor#preWindowOpen)
@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>
・・・
ExtensionFactoryとは
 進捗ビューを表示するクラスは本来JobViewというクラスになります。しかし、このJobViewというクラスは「org.eclipse.ui」プラグインの外から見えないように定義されています。実際のクラス名を「plugin.xml」に記述しないでも、こういった内部コンポーネントを利用できるようにするクラスがExtensionFactoryです。

 View定義を追加したら、それをRCPの上にレイアウトします。

進捗ビューのレイアウト設定(Perspectiveクラス)
@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);
}

進捗ビューによるジョブの表示

 進捗ビューを使えば、同時に複数実行されるジョブも表示することができます。

進捗ビューによる進捗表示
進捗ビューによる進捗表示

次のページ
ヘルプシステムの利用

この記事は参考になりましたか?

Eclipse RCPプログラミング連載記事一覧
この記事の著者

NTTデータ先端技術株式会社 志田 隆弘(シダ タカヒロ)

<NTTデータ先端技術株式会社について>データベース、ネットワーク、OS、ミドルウェアの基盤技術を武器にシステムの技術面でのコンサルテーションや最新製品の調査を行う専門家集団。<筆者について>Ja-Jakartaプロジェクトの末席にこっそりと参加しています。たまにJavaなイベントに出没します。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/353 2006/07/12 17:38

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー