batik入門記その2 〜Squiggle-the SVG Browser解析編1〜

ってことでさっそくサンプルアプリとして付属しているSVGBrowserを見てみることに。Browserの起動はこんな感じ。バイナリ版を解凍したディレクトリのbatik-squiggle.jarがSVGBrowser本体。

 cd 
 java -jar batik-squiggle.jar

とりあえずサムネイル機能はナイス。Scriptingがどうなのか気になる。ドキュメント自体はBrowserの機能を丁寧に説明してくれているのだが、所詮使い方の説明なのであまり参考にはならなかった。まぁbatikの持つ機能を概観するにはなかなかよいサンプルだったのかな。

といきなりBrowserに手を出すのは早いって事で、SVGを表示してくれるJSVGCanvasのドキュメントにあるSVGを単純に表示するだけのアプリを作ることにした。GUIアプリは久しく作ってなかったのでちょっと楽しみである反面、いろいろとハマった思い出が…

SVGの表示は非常に簡単。JSVGCanvas#setURI(String)にSVGファイルのパスを食わせてあげれば後は勝手に読み込んで表示してくれる。う〜ん、便利だ。とこれだけだと何なので、JSVGCanvasに設定できるリスナをちらっと調べてみた。

 ・SVGDocumentLoaderListener:SVGDocumentLoaderEventを拾う

  -void documentLoadingCancelled(SVGDocumentLoaderEvent e) 
  -void documentLoadingCompleted(SVGDocumentLoaderEvent e) 
  -void documentLoadingFailed(SVGDocumentLoaderEvent e) 
  -void documentLoadingStarted(SVGDocumentLoaderEvent e)  

 SVGのロードに関するイベントをお知らせしてくれる。

 ・GVTTreeBuilderListener:GVTTreeBuilderEventを拾う

  -void gvtBuildCancelled(GVTTreeBuilderEvent e) 
  -void gvtBuildCompleted(GVTTreeBuilderEvent e) 
  -void gvtBuildFailed(GVTTreeBuilderEvent e) 
  -void gvtBuildStarted(GVTTreeBuilderEvent e)  

 DOMツリーの構築に関するイベントをお知らせしてくれる。

 ・SVGLoadEventDispatcherListener:SVGLoadEventDispatcherEventを拾う

  -void svgLoadEventDispatchCancelled(SVGLoadEventDispatcherEvent e) 
     Called when a onload event dispatch was cancelled. 
  -void svgLoadEventDispatchCompleted(SVGLoadEventDispatcherEvent e) 
      Called when a onload event dispatch was completed. 
  -void svgLoadEventDispatchFailed(SVGLoadEventDispatcherEvent e) 
      Called when a onload event dispatch failed. 
  -void svgLoadEventDispatchStarted(SVGLoadEventDispatcherEvent e) 
      Called when a onload event dispatch started. 

 This event is triggered only in dynamic documentsなんだってさ。onload eventって
 ひょっとしていつものあれか?

 ・GVTTreeRendererListener:GVTTreeRendererEventを拾う

  -void gvtRenderingCancelled(GVTTreeRendererEvent e) 
  -void gvtRenderingCompleted(GVTTreeRendererEvent e) 
  -void gvtRenderingFailed(GVTTreeRendererEvent e) 
  -void gvtRenderingPrepare(GVTTreeRendererEvent e) 
  -void gvtRenderingStarted(GVTTreeRendererEvent e)  

 イメージのレンダリングに関するイベントをお知らせしてくれる。
 In dynamic documents this event is fired only once for the initial renderingだとか。

 ・UpdateManagerListener:UpdateManagerEventを拾う
  -省略
 どうやらUpdateManagerなるものがいて、そいつの起動だの停止だののイベントをお知らせ
 してくれるようだが、現時点ではようわからん。まぁ必要ならそのうち調べるだろう…
 Only dynamic documents trigger this eventなのだ。

それぞれ、以下のメソッドでリスナを設定する。

 public void addSVGDocumentLoaderListener(SVGDocumentLoaderListener l)
 public void addGVTTreeBuilderListener(GVTTreeBuilderListener l)
 public void addSVGLoadEventDispatcherListener(SVGLoadEventDispatcherListener l)
 public void addGVTTreeRendererListener(GVTTreeRendererListener l) 
 public void addUpdateManagerListener(UpdateManagerListener l)

まぁ1、2と4番目のリスナは今回使ったように進捗を表示するくらいにしか使わないんだろうなぁ。結局これらは肝心のScriptingには全く関係ない。ってかさっさとScriptingがどの程度、どんな感じで実現できるのか調べておかないと後で大変なんじゃない?と言っても選択肢としてこれぐらいっきゃないから、なきゃないで何とかしないといけないんだよなぁ…

それにしても、jarファイルかなり分割してあるけど単にSVGを表示するだけでほとんど全部使ってるし。きっとScriptingしたらさらにあいつも追加になるんだろう。

んで、静的なドキュメントは
 1.parsing
 2.building
 3.rendering
てな感じで表示されて、setURI/setSVGDocumentで開始されるんだけど、それは gvtRenderingCompleted で完了する、と。一方の動的なドキュメントは
 1.parsing
 2.building
 3.SVGLoad dispatch
 4.initial rendering
 5.updates
てな感じで流れて、updateManagerStopped で完了する、と。