ここ何年も、Javaはサーバーベースのアプリケーション開発分野を支配してきました。Javaが、開発された初期、クロス・プラットフォームのデスクトップ・アプリケーションを開発するためのソリューションとして大きく宣伝されていました。しかし、残念ながら実際にはその誇大広告に応えられてはいませんでした。エンドユーザーおよび開発者コミュニティーがAbstract Window Toolkit(AWT)を超える機能の要求に関して、GUIアプリケーション開発においてJavaを見直してもらえるように、Sun MicrosystemsはSwingとして知られるJava Foundation Classes(JFC)を発表しました。Swingはクライアント・サイドのアプリケーション開発においては成熟したモデルを提供しているものの、ネイティブ・アプリケーションの視覚的なアピールおよびオペレーションに関してはまだまだ物足りないものでした。
Standard Widget Toolkit(SWT)の開発および発表以前には、業界の専門家や開発者は一様にJavaはデスクトップ・アプリケーションの開発としては役に立たないと言明していました。SWTは、ネイティブ・アプリケーションを忠実に模倣したアプリケーションを作成するために、開発者にフレームワークを提供することで、クライアント・サイドJavaに新しい生命を吹きこみ始めています。その前任者(例えばAWTやJFC)とは異なり、SWTはオペレーティング・システムに固有のウィンドウ操作環境と密接に統合され、プラットフォームに依存しないAPIを開発者に提供しています。Eclipseプロジェクトは、Java用のオープンソースの統合開発環境(IDE)として考えられてきた一方で、そのプロジェクトの目的ははるかに広範囲です。EclipseのWebサイトのフロントページにおいては、Eclipseは次のように記述されています。「ある種の汎用的なツールの基盤-誰にとっても拡張可能なIDE」であると。
今回のサンプルアプリケーション開発においては、Eclipseを使用し、スタンドアロンのアプリケーション・コンテキスト内でActiveXコントロールを使用する方法の実証に焦点をあてていきます。Eclipseプロジェクトについての詳細および背景に関しては、この記事の最後にある参考文献を参照してください。
SWTアプリケーションへActiveXコントロールを統合する方法のコードと実装の詳細について概説する前に、サンプルアプリケーションの目的および構造について説明をしておきましょう。このアプリケーションはユーザーがAdobeのAcrobat Readerコントロールを使用して、PDFファイルを参照したり、やりとりをすることができる単純なPDF viewerです。ユーザーはハードディスク内に配置されたファイルや、図1のようなSWTアプリケーション内でPDFドキュメントを参照することができます。
図1.サンプルアプリケーション:Microsoft Windows XP上で動作しているPDF viewer
参考文献のリンクから、サンプルのPDF viewerアプリケーションをダウンロードすることができます。PDF viewerアプリケーションを試すには、最低限以下のような環境を満たしていなければなりません。
- Microsoft Windows のオペレーティング・システム
- Java 2 SDK,Standard Edition 1.4以降のバージョンがインストールされていること(ダウンロード・リンクに関しては参考文献を参照してください)。
- Apache Ant 1.5.2 以降のバージョンがインストールされていること(ダウンロード・リンクに関しては参考文献を参照してください)。
- Adobe Acrobat Reader 5.0 がインストールされていること
Antビルドスクリプトはクロス・プラットフォームで構築できるように配慮されていますが、PDF viewerアプリケーションはMicrosoft Windows XP上のみでテスト確認されています。では、サンプル・アプリケーションをインストール/セットアップをすることから始めましょう。
PDF viewerアプリケーションのインストールおよびビルドは、以下のステップで行います。
- 参考文献のリンクからソースコードのパッケージをダウンロードしてください。
-
pdfviewer.zipファイルを一時ディレクトリーに解凍してください。 - 新しく作成したディレクトリーで以下のコマンドを実行してください。
ant clean - 新しく作成したディレクトリーで以下のコマンドを実行してください。
ant
環境条件を満たし適切に設定が出来ていれば、以下のように出力されるはずです。
Buildfile: build.xml
init:
[mkdir] Created dir: D:\PDFViewer\dist
compile-common:
compile-module:
[echo] Compiling ...
[mkdir] Created dir: D:\PDFViewer\build
[mkdir] Created dir: D:\PDFViewer\build\classes
[javac] Compiling 5 source files to D:\PDFViewer\build\classes
package-common:
[jar] Building jar: D:\PDFViewer\dist\pdfviewer.jar
default:
BUILD SUCCESSFUL
|
PDF viewerアプリケーションの基本を説明しましたので、ここからはSWTアプリケーション内にActiveXコントロールを統合して使用する方法を検討してみましょう。ここでの目的はActiveXの統合を対象としているので、スタンドアロンのSWTアプリケーションを作成する方法や、Microsoft WindowsでActiveXコントロールを使用する方法などは対象外です。Eclipseのワークベンチ以外でのSWTコンポーネントの使用方法についての詳細や背景に関しては、この記事の最後にある参考文献から、Adrian Van Emmenis氏による3部シリーズの記事を参照してください。
リスト1は、PDFViewerクラスの基本的な構造を概説し、ActiveXコントロールがSWTアプリケーションへどのように統合されるのかを示しています。
リスト1.PDFViewerクラス
1 public class PDFViewer extendsApplicationWindow
2 {
3 private OleControlSite site;
4 private OleAutomation auto;
5
6 public PDFViewer()
7 {
8 super(null);
9 this.addMenuBar();
10 }
11
12 protected ControlcreateContents(Composite parent)
13 {
14 Shell shell = this.getShell();
15 shell.setText("PDFViewer");
16 shell.setSize(500, 450);
17
18 OleFrame frame = new OleFrame(shell, SWT.NONE);
19
20 try
21 {
22 site = new OleControlSite(frame,SWT.NONE, "PDF.PdfCtrl.5");
23 auto = new OleAutomation(site);
24
25 ... |
コードを少しずつ見ていきましょう。
- アプリケーションが起動する時は常に
PDFViewerクラスの新しいインスタンスが作成されます。 - 3行目と4行目のように、
OleControlSiteとOleAutomationの2つのオブジェクトを定義する必要があります。OleControlSiteオブジェクト変数は、ActiveXコントロールとのやりとりを処理します。OleAutomationオブジェクトは、開発者がプロパティにアクセスし、ActiveXコントロールで提供されているコマンドを実行できるようにします。 - 18行目では、
OleFrameオブジェクトが定義されています。このオブジェクトはActiveXコントロール用のコンテナーで、コントロールのライフ・サイクルを管理しています。 - 22行目は2つの引数を使用したサイト変数の事例です。最初の引数は、
OleFrameへの参照で、2番目の引数は、ActiveXコントロールを識別する文字列です。Windowsのレジストリー内にあるプログラム識別子では、Microsoft Windows内のコントロールをユニークに識別しています。 - 23行目は
OleControlSite変数への参照を使用したサイト変数の事例です。
ユーザーはワークステーションからPDFドキュメントを選択することで、PDFドキュメントを参照することができます。リスト2のコードは、エンドユーザーにファイル・ダイアログを見せるために必要なオブジェクトおよびメソッドを示しています。
リスト2.OpenActionクラス
0 ?
1 public class OpenAction extends Action
2 {
3 ApplicationWindow window;
4
5 public OpenAction(ApplicationWindow w)
6 {
7 window = w;
8 this.setText("&Open...");
9
10 this.setToolTipText("Open a PDF document.");
11 }
12
13 public void run()
14 {
15 FileDialog dialog = new FileDialog(window.getShell());
16 dialog.open();
17
18 String file = dialog.getFilterPath()+"\\"+dialog.getFileName();
19
20 PDFViewer viewer = ((PDFViewer)window);
21
22 viewer.loadFile(file);
23
24 }
25 }
|
このコードを簡単に見ていきましょう。
- ユーザーがメニューバーから「Open...」を選択すると、13行目の
runメソッドが実行されます。 - 15行目と16行目では、
FileDialogオブジェクトが作成されています。図2のように、このオブジェクトはユーザーへネイティブなファイル・ダイアログ・ボックスを表示します。 - 18行目では、ユーザーのワークステーション上にあるPDFドキュメントの位置を含んだ文字列を作成しています。
- 20行目では、
PDFViewerオブジェクトにwindowオブジェクトを割り当てています。 - 22行目では、
loadFileメソッドを実行し、選択されたPDFドキュメントのロケーションを渡しています。loadFileメソッドについては次の2つのセクションで詳細に検討します。
図2.オープン・ファイル・ダイアログ
PDFドキュメントがどのようにviewerアプリケーションで表示されるのかを説明する前に、Adobe Acrobat Reader Active X (PDF.PdfCtrl.5)コンポーネントにおいて、実際にどんなコマンドが利用できるのかを理解しておくことが役に立ちます。サンプル・コードのパッケージは、IBMで開発したクラスを含んでいます。このクラスは、ActiveXコントロールが公開している公式コマンドを全て列挙しています。
PDF.PdfCtrl.5コントロールのコマンドを列挙するには、PDFViewerディレクトリーで以下のコマンドを実行してください。:ant activex
環境が適切に設定されていれば、次のような出力となるはずです。
...
[java]Functions for PDF.PdfCtrl.5 :
[java]METHOD (id = 2) :
[java] Signature : boolean LoadFile([] String fileName)
[java] Description : null
[java] Help File : null
[java]METHOD (id = 3) :
[java] Signature : void setShowToolbar([] boolean On)
[java] Description : null
[java] Help File : null
[java]METHOD (id = 4) :
[java] Signature : void gotoFirstPage()
[java] Description : null
[java] Help File : null
...
|
ActiveXコントロールの他のコマンドを参照するためには、ソースコードと共に含まれているbuild.xmlファイルを簡単に編集して、クラスの引数を他のActiveXのプログラム識別子と交換してください。リスト3のAnt targetは、コントロールのプログラム識別子を挿入する位置を示しています。
リスト3.build.xmlファイルの編集
...
<target name="activex" depends="package-common">
<java classname="Main" fork="true">
<jvmarg value="-Djava.library.path=${eclipse.dir}windows"/> <classpath>
<pathelement location="${dist.dir}/pdfviewer.jar"/>
<fileset dir="${eclipse.dir}" includes="*.jar"/>
<fileset dir="${eclipse.dir}windows" includes="*.jar"/>
</classpath>
<arg value="<insert some program identifier>"/> </java>
</target>
...
|
クラスから出力された最初のコマンドはLoadFileでした。PDF viewerアプリケーションにおけるこのコマンドの利用方法を調べてみましょう。
ユーザーがPDFドキュメントを選択すれば、PDFViewerクラスはActiveXコントロールに公開してあるコマンドを実行する必要があります。以下のリスト4は、ユーザーの選択したPDFドキュメントに、ActiveXコントロールをロードさせるために必要なオブジェクトおよびメソッドを示しています。
リスト4.PDFViewerクラス
0 ...
1 public void showPdfControl()
2 {
3 site.doVerb(OLE.OLEIVERB_SHOW);
4 }
5
6 public void loadFile(String file)
7 {
8 showPdfControl();
9
10 int[] rgdispid = auto.getIDsOfNames(newString[]{"LoadFile"});
11 int dispIdMember = rgdispid[0];
12
13 Variant[] rgvarg = new Variant[1];
14 rgvarg[0] = new Variant(file);
15
16 Variant pVarResult =auto.invoke(dispIdMember,rgvarg);
17 }
18...
|
少しずつコードを検証してみましょう。
- ユーザーがPDFファイルを選択すると、6行目の
loadFileメソッドが実行されます。 - 8行目では、
showPdfControlメソッドをコールしています。ActiveXコントロールは、アプリケーション上に現れる前にdoVerbコマンドを使用して活性化させなければなりません。verbsの完全なリストおよび概要は、EclipseのWebサイト上の「ActiveX Support In SWT」という記事で参照することができます(この記事へのリンクに関しては参考文献を参照してください)。 - 10~16行目では、ActiveXコントロール内で
LoadFileコマンドを呼び出しています。ここで使用されている各オブジェクトの詳細な使用方法については、参考文献のorg.eclipse.swt.ole.win32 JavaDocのリンクを参照してください。
PDF viewerアプリケーションの実行は、以下のステップで行います。
- ソースコードを解凍したディレクトリーで以下のコマンドを実行してください。
ant run - Antスクリプトの実行により、PDF viewerアプリケーションが表示されます。
- ワークステーションからPDFファイルを選択するために、ファイルメニューから「Open...」を選択します。これで、選択したPDFドキュメントが表示されます。
SWTライブラリーは、Java開発者に、高度な対話形式のクライアント・サイド・アプリケーションへMicrosoft Windows ActiveXコントロールを統合するための強力なメカニズムを提供します。ActiveXコントロールやOLEドキュメントに関するSWTのサポートを利用して、ネイティブのウィジェットとコンポーネントを統合する見た目の良いアプリケーションを作成する方法を考えることはとても面白いことです。
| ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|
| os-activex/pdfviewer.zip | HTTP |
- Sun MicrosystemsからJava 2 SDK, Standard Edition 1.4.1をダウンロードできます。
- Apache Software FoundationからAnt 1.5.3 をダウンロードできます。
- Eclipseワークベンチ以外でJFaceとSWTコンポーネントを使用することについては、Adrian Van Emmenis氏の3部シリーズの記事を参照してください。
- 第1回:「スタンドアロン・モードでJFaceおよびSWTを使用する」 (developerWorks、2003年1月)
- 第2回:「JFaceイメージ・レジストリーを使用する」 (developerWorks、2003年2月)
- 第3回:「アクション、メニュー、およびツールバーを追加する」(developerWorks、2003年3月)
- developerWorksには、他にも Eclipseユーザー向けの参考文献が掲載されています。
- Eclipseプラグインの開発 (developerWorks、2002年12月)
- JFaceウィザードの開発 (developerWorks、2003年5月)
- Eclipse Platformを使用したC/C++ 開発 (developerWorks、2003年4月)
- EclipseによるXML開発 (developerWorks、2003年4月)
Jeff Gunther (Studio B著者)は、Java 2 Enterprise EditionおよびLotus Notes/Dominoを使用するソフトウェア製品とソリューションの新興プロバイダーである、Intalgent Technologiesのゼネラルマネージャーおよび創設者です。Jeffは複雑なソフトウェア・システムを分析、設計、開発、展開、保守した経験を持つ、アプリケーションとインフラストラクチュアの設計者です。彼の多種多様な経験は、ウェブサーバーからエンベディッドデバイスまで、マルチプラットフォームで動作するソフトウェアの完全なライフ・サイクル開発を含んでいます。彼はその初期の、「pre-Mosaic」の時代からインターネット業界に携わっています。Jeffの連絡先はjeff.gunther@intalgent.com です。