Eclipse RCP アプリケーションでの JViews 製品の使用

JViews ランタイム・プラグインのインストール

Rogue Wave® JViews Maps は、jar ファイルを、あらかじめパッケージ化された Eclipse プラグインの形で提供します。 このパッケージの名前は ilog.views.eclipse.maps.runtime です。
Rogue Wave® JViews Eclipse プラグインをインストールするには、次に示すように、ローカル・サイトからインストールする必要があります。
Eclipse 3.7 以降の場合:
  1. Eclipse を起動します。
  2. 「ヘルプ」>「新規ソフトウェアのインストール」を選択します。
  3. 新規ローカル・サイトの追加: 「追加」、次いで「ローカル」をクリックし、ディレクトリー <installdir>/jviews-framework89/tools/ilog.views.eclipse.update.site を指定します。
  4. インストールする機能を選択して、「次へ」をクリックします。
アプリケーションで、ilog.views.eclipse.maps.runtime プラグインと、このプラグインに必要な以下のプラグインが必要です。
  • ilog.views.eclipse.maps.runtime
  • ilog.views.eclipse.diagrammer.runtime (オプション)
  • ilog.views.eclipse.framework.runtime
  • ilog.views.eclipse.utilities.runtime

クラス・ローダーへのアクセスの提供

JViews のサービスの多くはリソースを参照する必要があります。 リソースへのアクセスを可能にする標準的な方法はクラス・ローダーであるため、JViews はこの目的のためにクラス・ローダーを使用します。 ただし、Eclipse/RCP アプリケーションでは、各プラグインが 1 つのクラス・ローダーに対応し、JViews クラス・ローダーは、アプリケーション・リソースではなく、独自のリソースのみを参照します。 この問題を解決するため、IlvClassLoaderUtil.registerClassLoader 関数を介して、プラグイン・クラス・ローダーを JViews に登録することができます。 各リソース・ルックアップは登録されたクラス・ローダーを考慮するようになり、プラグインが適切に構成されている場合は、登録されたクラス・ローダーの依存関係も考慮します。
これを実行するコードは、通常プラグイン・アクティベーター・クラス内にあります。次に例を示します。
public class MyPluginActivator extends AbstractUIPlugin 
{
    /**
     * This method is called upon plugin activation
     */
    public void start(BundleContext context) throws Exception {
      super.start(context);
      IlvClassLoaderUtil.registerClassLoader(getClass().getClassLoader());
    }

    /**
     * This method is called when the plugin is stopped
     */
    public void stop(BundleContext context) throws Exception {
      super.stop(context);
      IlvClassLoaderUtil.unregisterClassLoader(getClass().getClassLoader());
    }

  }
stop() のオーバーライドは必要です。プラグインがアンロードされるときに、停止するプラグインについて JViews は通知を受け、そのリソースまたはそのクラスのインスタンスへの参照をドロップすることができるからです。アクティベーター・プラグインは、通常 IlvProductUtil.registerApplication が呼び出される場所にあります。

AWT/Swing と SWT 間のブリッジ

Standard Widget Toolkit (SWT) は、Eclipse 開発環境および Eclipse Rich Client Platform (RCP) のウィンドウ・ツールキットです。
JViews コンポーネントは Swing コンポーネントであり、下記の 3 つの方法で、他の SWT または JFace コントロールと一緒に SWT ウィンドウに組み込むことができます。 各方法は、AWT/Swing ウィンドウ・システムと SWT ウィンドウ・システム間のブリッジを提供します。
この 3 つのブリッジは、次に示すような利点と欠点をそれぞれ持っています。
  • SWT_AWT は低レベルであり、回避策を必要とするバグをいくつも持っています。 したがって、サイズ管理 (SWT と AWT ではレイアウトの概念が異なるため)、ルック・アンド・フィール、フォーカス、カーソル、ポップアップ・メニューなどの機能を正しく実装するためには大量のコーディングを必要とします。
  • JViews IlvSwingControl はサイズ管理を扱い、フォーカス、カーソル、ポップアップ・メニューに関する問題の一部を解決します。 また、Linux/gtk 上では、コンポーネントのサイズが変更されたときのちらつきを減らす (ただしコンポーネントのパーツが再描画されるとちらつきが増えますが) エミュレートされたブリッジ・モードを提供します。
  • Albireo SwingControl もサイズ管理を扱いますが、フォーカス、カーソル、ポップアップ・メニューに関する問題の解決については IlvSwingControl より優れています。 また、ルック・アンド・フィールに関する問題も解決します。 ただし、ちらつきを減らすことはありません。
    Albireo SwingControl はまた、入力メソッドおよびより新しい JDK をサポートする点で、IlvSwingControl を上回っています。 JViews に同梱されている例では IlvSwingControl を使用していますが、今後は Albireo SwingControl を使用する傾向が増えることが予想されます。
IlvScrollManagerView または IlvManagerViewPanel オブジェクトから SWT コントロールを作成するには、IlvSwingControl と一緒に次のコードを使用することができます。
Composite parent = ...;
IlvJManagerViewPanel mapView = new IlvJManagerViewPanel();
Control SWTmapView = new IlvSwingControl(parent, SWT.NONE, chart);
あるいは、Albireo SwingControl と一緒に次のコードを使用することができます。
Composite parent = ...;
Control SWTmapView =
    new SwingControl(parent, SWT.NONE) {
      protected JComponent createSwingComponent() {
        return new IlvJManagerViewPanel();
      }
      public Composite getLayoutAncestor() {
        return parent;
      }
    };
メモ
IlvSwingControl ブリッジは、すべてのプラットフォームでサポートされているわけではありません。Windows、X11 を備えた UNIX® (Linux、Solaris™、AIX®、HP-UX®)、および JDK 1.5 を備えた MacOS X 10.54 以降でのみサポートされます。
IlvSwingControl ブリッジは、任意の JComponents をサポートしません。基本的に、テキスト編集を提供するコンポーネントはサポートされていません。制限に関する詳細については、「IlvSwingControl」を参照してください。

スレッド・モード

SWT-Swing ユーザー・インターフェース・イベントは 1 スレッドまたは 2 スレッドで処理できます。
メモ
シングル・スレッド・モードは AWT/Swing Dialogs に準拠していません。 シングル・スレッド・モードを使用する場合は、アプリケーションで AWT Dialogs、Swing JDialogs、またはモーダル JInternalFrames は使用できません。その他にもいくつかの制限があります。制限に関する詳細については、クラス IlvEventThreadUtil を参照してください。
  • 2 スレッド・モード
    SWT イベントは SWT イベント・スレッドで処理され、AWT/Swing イベントは AWT/Swing イベント・スレッドで処理されます。これはデフォルト・モードです。
    SWT メソッド Display.asyncExec() と AWT メソッド EventQueue.invokeLater() を使用して 2 つのスレッド間の切り替えが可能です。
    アプリケーションでこのモードを使用する場合は、次の事項に注意してください。
    • SWT イベント・スレッドのみで、SWT ウィジェット上の API 呼び出しを行います。そうしないと、タイプ ERROR_THREAD_INVALID_ACCESSSWTExceptions を取得します。
  • シングル・スレッド・モード
    シングル・スレッド・モードでは、SWT および AWT/Swing イベントは、同じスレッドで処理されます。
    シングル・スレッド・モードはデッドロックを引き起こすリスクを削減します。
    初期化の早い段階で setAWTThreadRedirect or enableAWTThreadRedirect を呼び出して、このモードを有効にします。
    次の例では、シングル・スレッド・モードを有効にする方法を示します。
    // Switch single-event-thread mode during a static initialization.
          static {
              IlvEventThreadUtil.enableAWTThreadRedirect();
          }