ここのところ、JSFLを作ってて偶然ひらめいた、XMLUI(XUL)を利用するときに設定されたXMLファイルをローカルに置かずに扱うためのメモを書いておきます。
XMLUI(XUL)ファイルをローカルに置くのが扱いづらいケースがある
以前、1ft-seabass.jp.MEMO – 【JSFL】込み入ったダイアログを作るためのXMLUI(XUL)についてのいくつかのメモでお伝えしたXULですが、普通に使ってしまうと
document.xmlPanel( どこかのに置いたXULファイル );
という形で呼び出すため、必ずXMLUI(XUL)が設定されたXMLファイルをローカルに置く必要があり、ちょっと扱いづらいです。
この扱いづらいというのは、私の場合、自分だけで使うか、プロジェクト内で複数人で共有しつつも、頻繁にブラッシュアップしながらJSFL制作していくため、JSFLファイルを直接ダブルクリックで実行してもらうケースが多く、たくさんの方に提供しやすくするMXPファイルに固めてExtension化するまでには至ることは少ないことが挙げられます。
Extensionはインストールされる場所が固定されています。それであればにXULファイルを置くなどはやりやすいのです。しかし、JSFL直実行の場合は、使う人がどこにJSFLを置いて実行するかも読めませんし、提供するときに「JSFLだけでなくXULファイルも忘れずに!」と言ってもどうしても忘れるケースはあります。まして、ブラッシュアップする場合は何度も「JSFLだけでなくXULファイルも忘れずに!」といって再度提供を繰り返すので、当然ミスも起きやすくなります。
以上の理由で、できる限りJSFLファイル以外のファイルは避けたいわけです。まー、こういう手間を軽減するのがExtension提供なんですけどねー。ちょっと修正する度にMXPを作り直すのは手間すぎるのです。SVNでやれればそんな苦労も少なくなりそうですが、いつもそういう制作環境のわけでもない。
JSFL自身がXULファイルをどこかに生成して、それをxmlPanelで呼び出してしまえ
さて、事情がかなりレアなケースなのに、えらい熱弁を振るってしまいましたが、ローカルファイルを呼ばざるえない、このdocument.xmlPanelをちょっと飼い慣らしてみます。
いろいろ考えたのですが、要はJSFL自身がXULファイルをどこかに生成して、それをxmlPanelで呼び出してしまえばいいんです。
幸い、JSFLにはテキストファイルを生成できるFLfile.writeがあります。こんなふうに書いてみます。
// XULの内容 var xmlString = '<?xml version="1.0"?>'; xmlString += '<dialog buttons="accept, cancel" title="レイヤーを変更します" >'; xmlString += '<label value="レイヤーを変更します" />'; xmlString += '<radiogroup id="flagLayerVisible">'; xmlString += ' <hbox>'; xmlString += ' <radio label="ON" value="true"/>'; xmlString += ' <radio label="OFF" value="false"/>'; xmlString += ' </hbox>'; xmlString += '</radiogroup>'; xmlString += '<checkbox id="flagAllFlaMode" label="いま開いているflaをすべて変更" checked="false"/>'; xmlString += '</dialog>'; // XULを書き出すパス var tempXMLUIPath = "file:///C:/dialog.xml"; FLfile.write( tempXMLUIPath , xmlString ); // 上記のXMLUIを書き出し var myXMLUIObject = document.xmlPanel( tempXMLUIPath ); FLfile.remove( tempXMLUIPath ); // 利用したらすぐに消す。
これで、XULファイルを置かなきゃいけない呪縛から逃れられます。
しかも、JSFL開発時にいちいちXULファイルも別で開いて開発する必要がなく一元化できるのでステキ!
もう少しやりやすくする
これでも十分使えるのですが、
// XULを書き出すパス var tempXMLUIPath = "file:///C:/dialog.xml";
というJSFLってWindowsでもMacでも使えるのに、Cドライブで固定するのはもったいないので改良します。
JSFLではFLASHが持つ共通のフォルダが呼び出せるので、その中で、ローカルユーザーの Configuration ディレクトリは fl.configURI を使います。これなら、WindowsでもMacでもFLASH側が管理してくれていて、しかも確実に存在するので使い勝手がよさそうですね。
// XULの書き出し場所を決める // 上書きの事故が少なくなるよう、念のため new Date().getTime() でタイムスタンプをくっつける。 // fl.configURIはローカルユーザーの Configuration ディレクトリを表す完全パスです。 var tempXMLUIPath = fl.configURI + "dialog" + new Date().getTime() + ".xml"; FLfile.write( tempXMLUIPath , xmlString ); // 上記のXMLUIを書き出し var myXMLUIObject = document.xmlPanel( tempXMLUIPath ); FLfile.remove( tempXMLUIPath ); // 利用したらすぐに消す。
良い感じです。加えて、上書きの事故が少なくなるよう、念のため new Date().getTime() でタイムスタンプをくっつけました。
完成コード
そんな感じで完成コード置いておきます。
// XULの内容 var xmlString = '<?xml version="1.0"?>'; xmlString += '<dialog buttons="accept, cancel" title="レイヤーを変更します" >'; xmlString += '<label value="レイヤーを変更します" />'; xmlString += '<radiogroup id="flagLayerVisible">'; xmlString += ' <hbox>'; xmlString += ' <radio label="ON" value="true"/>'; xmlString += ' <radio label="OFF" value="false"/>'; xmlString += ' </hbox>'; xmlString += '</radiogroup>'; xmlString += '<checkbox id="flagAllFlaMode" label="いま開いているflaをすべて変更" checked="false"/>'; xmlString += '</dialog>'; // XULの書き出し場所を決める // 上書きの事故が少なくなるよう、念のため new Date().getTime() でタイムスタンプをくっつける。 // fl.configURIはローカルユーザーの Configuration ディレクトリを表す完全パスです。 var tempXMLUIPath = fl.configURI + "dialog" + new Date().getTime() + ".xml"; FLfile.write( tempXMLUIPath , xmlString ); // 上記のXMLUIを書き出し var myXMLUIObject = document.xmlPanel( tempXMLUIPath ); FLfile.remove( tempXMLUIPath ); // 利用したらすぐに消す。 // おまけでOKボタンを押された時とキャンセルボタンが押されたのコードを書いておきます。 if ( myXMLUIObject.dismiss == "accept" ) { fl.trace( "__ ダイアログでOKがボタン押された __" ); fl.trace( "flagLayerVisible : " + myXMLUIObject.flagLayerVisible ); fl.trace( "flagAllFlaMode : " + myXMLUIObject.flagAllFlaMode ); } else { fl.trace( "__ ダイアログでキャンセルボタンが押された __" ); }
おわりに
ということで、いかがでしたでしょうか。自分としては、このTIPSでXULの唯一といえる弱点が解消でき、より使用頻度が高まりました。また、JSFLファイルのみの提供を維持できるのでうれしいです。
今回の完成コードも以下においてきます。気になったら是非試してみてください。
今回のサンプルダウンロード:jsfl_tips_003_sample.zip
それでは、よきJSFLライフを!