Webブラウザコンポーネントの利用
「〜clipseな技術」の第1段として,Webブラウザコンポーネントの利用方法について紹介する。
近年,Web2.0的なアプリケーションが数多く登場している。これを支えているのは,RESTなどによる軽量なWebサービスが次々と公開されているという事実であることについては,誰もが認めるところだろう。多くのWebサービスがWebブラウザ上で利用あるいはマッシュアップされることを前提として提供されている。つまり,Webブラウザ上,しかもJavaScriptとの親和性という点が重要である。
何らかのWebサービスを利用したEclipseプラグインを開発したいと思った時,やはり最も手軽で効果的な手段は,Webブラウザを利用してしまうことだ。Webサービスとの親和性だけでなく,HTML&CSSによる高い表現力も魅力である。Webブラウザアプリケーションとして完成されたものではなく,Webブラウザの(コンテンツの受信なども含めた)レンダリングエンジンをEclipseプラグインに組み込む。多くの場合,Eclipseプラグインの利用者にとってレンダリングエンジンを利用していることには気がつかない。
EclipseプラグインでWebブラウザのレンダリングエンジンを利用することは,非常に簡単である。SWTに含まれるBrowserコンポーネントを配置する,ただそれだけだ。
Composite parent = …; Browser browser = new Browser(parent, SWT.NONE);
上記のコードだけで,parentコンテナにBrowserコンポーネントが配置される。もちろん何も指定していないので,配置結果は真っ白である。実際に張り付いているレンダリングエンジンは,WindowsであればIEのActiveXコンポーネント,MacOSXであれば(たぶん)Safariのコンポーネント,Linux系であれば(たぶん)何らかのGeckoコンポーネントが採用される。
Browserコンポーネントにレンダリングを要求するには,2通りの方法がある。1つは,手元にあるHTMLなどの文字列をレンダリングさせる方法,もう一つは,URL文字列を指定してWebサーバなどからコンテンツをダウンロードさせてレンダリングさせる方法である。
例えば,HTML文字列を渡す時には,以下のようにsetText()メソッドを使用する。
String html = “ test
ほげ”; browser.setText(html);
URL文字列を指定する場合は,以下のようにsetUrl()メソッドを使用する。
String url = “http://www.eisbahn.jp/”; browser.setUrl(url);
BrowserコンポーネントはWebブラウザを実現するためのコンポーネントであるので,Webブラウザの基本的な機能である「進む,戻る,更新する」はそれぞれ「forward(),back(),refresh()」メソッドを呼び出すことで実現可能である。もちろんこれらの機能を備えたい場合は,そのためのUIを自分で設置する必要がある。
Browserコンポーネントで何らかのコンテンツをレンダリングした後に,その内容に対してEclipseプラグインのJavaコード側から操作をしたくなることがあるだろう。その場合に,setText()メソッドやsetUrl()メソッドを使用してコンテンツ全体を更新するのも1つの手である。しかし,Browserコンポーネントにはexecute()メソッドという非常に強力なAPIが提供されている。execute()メソッドにJavaScriptコードを渡すことによって,JavaScriptコードをレンダリングエンジンで外部から実行することができるのだ。
例えば,以下のようなHTMLがBrowserコンポーネントにsetText()あるいはsetUrl()メソッドによってセットされているとする。
Script Test
outputという関数がscriptタグ内に定義されている。これをexecute()メソッドを使用することによって実行することができる。
Browser browser = …; browser.execute(“output(‘Hello Eclipse!’);”);
これによって,divタグ内が「Hello Eclipse!」という文字列で書き換えられる。DHTMLを理解していれば,execute()メソッドを使用することによって,Browserコンポーネント内のコンテンツを自在に更新することが可能である。
ちなみに,SWTコンポーネントは自作のスレッドから直接操作を行うことができない。これを回避するためには,以下のようにコーディングする必要がある。
final Browser browser = …; Shell shell = …; shell.getDisplay().asyncExec(new Runnable() { public void run() { browser.execute(“output(‘Hello Eclipse!’);”); } });
基本的には上記の技術のみで,Webブラウザを利用したEclipseプラグインを開発することができるだろう。しかし,Webブラウザならではの工夫も必要となる。これについては,別エントリで紹介したい。