Webブラウザコンポーネントの利用 Part2
「 Webブラウザコンポーネントの利用」エントリで紹介したBrowserコンポーネントを使用すれば,低コストでリッチなEclipseプラグインを開発できる。しかし,嬉しいことばかりではない。このエントリでは,発生し得るいくつかの問題点と,その解決方法について紹介する。
万能に見えるBrowserコンポーネントだが,Webブラウザであること故のデメリットもちゃんと対処してあげなければならない。〜clipseで行っている対処として,以下のものがあげられる。
-
コンテキストメニューの無効化
-
ハイパーリンクの無効化
-
レンダリングエンジンの違いの吸収
コンテキストメニューの無効化は,一般的なWebアプリケーションで用いられている手法がそのまま適用できる。つまり,htmlのbodyタグの属性におまじないを指定してあげれば良い。
・・・
・・・
最近のWebブラウザでは,上記の施策で十分であろう。「こんなことも必要だろ!」と何か御持ちの方は,ぜひコメントを。
機会は少ないかも知れないが,レンダリングされたコンテンツ内にaタグなどでハイパーリンクがあった時に,それをクリックしてもページ遷移が起きないようにしたいときが出てくる。ハイパーリンクがクリックされるなど,ページ遷移がBrowserコンポーネントで発生した際のイベントをJavaコードで拾うことができるようになっている。
Browser browser = …; browser.addLocationListener(new LocationListener() { public void changing(LocationEvent evt) { if (evt.location != null && evt.location.startsWith(“http://”)) { // Javaコード側でイベント処理 evt.doit = false; } } public void changed(LocationEvent evt) { } });
上記のコードのように,LocationListenerオブジェクトをBrowserコンポーネントに登録することで,ページ遷移をJava側で知ることができるようになる。上記のコードでは,遷移先のlocationが「http://」で始まるものについては,それに対する処理をJava側で行い,LocationEventオブジェクトのdoitフィールドにfalseをセットすることで,Browserコンポーネントにページ遷移を行わせないように指示している。この条件を満たさない場合は,doitフィールドに何もセットされないために,ページ遷移が行われることになる。つまり,ハイパーリンクをSWTのLinkコンポーネントのように使用することができる。
最後のレンダリングエンジンの違いの吸収については,主にCSS系の話になるだろう。つまり,スタイル定義が同じでも,IEとFirefoxでその解釈が異なるために,見た目が変わってしまうのを何とかしなければならない。これもコンテキストメニューのときと同様に,一般的なWebアプリケーションでのテクニックが使える。
[if lte IE 6]></p>