X-0022 ファイル選択のダイアログ

ファイルを開く・保存する際のファイル選択ダイアログは、 nsIFilePicker を使うと簡単に実現できます。動作の規準は Windows のコモンダイアログなので、以下の説明も、 Windows でのファイル操作を想像するとわかりやすいかと思います。

インスタンスの生成

まず、 nsIFilePicker のインスタンスを作ります。 getService() ではなく createInstance() メソッドを使っているのに注意してください。(インスタンスを生成しないと、ファイル選択のダイアログを何度も開くときに問題が起こります)

const nsIFilePicker = Components.interfaces.nsIFilePicker;
const FP = Components.classes['@mozilla.org/filepicker;1']
                     .createInstance(nsIFilePicker);

初期化

次に、ダイアログを init() メソッドで初期化します。

FP.init(
   window, // ダイアログを開く親ウィンドウ
   ファイル選択ダイアログのタイトルバーのタイトル文字列,
   選択モードのフラグ
);

タイトルには好きな文字列を指定できます。選択モードのフラグは、以下の3種類から選んで下さい。

ファイルを保存
Components.interfaces.nsIFilePicker.modeSave
ファイルを開く
Components.interfaces.nsIFilePicker.modeOpen
ディレクトリ(フォルダ)を選択
Components.interfaces.nsIFilePicker.modeGetFolder

このフラグによって、ダイアログの挙動が変わります。例えば modeSave なら、既存ファイルを選択したときに、上書きするかどうかの確認が表示されます。とはいえ、あくまでダイアログの挙動がそうなるというだけのことですから、 modeSave のダイアログを使って選択したファイルの内容を開くということも可能です。(ユーザーが混乱するのであまり宜しくはないですが)

デフォルトのファイル名を指定することもできます。保存するファイル名が固定の場合や、ページタイトルをファイル名にするなどの処理を行う場合に使うといいでしょう。

FP.defaultString = 任意のファイル名 ;

ダイアログで表示するファイルの種類を制限することもできます。

FP.appendFilters(フィルタのフラグ);

フィルタには以下の種類があります。複数のフィルタを使いたい場合は、フィルタの論理和をメソッドに渡せば OK です(例: nsIFP.filterAll | nsIFP.filterHTML )。

すべてのファイル
Components.interfaces.nsIFilePicker.filterAll
HTML ファイル(*.htm, *.html )
Components.interfaces.nsIFilePicker.filterHTML
テキストファイル(*.txt )
Components.interfaces.nsIFilePicker.filterText
画像ファイル(*.gif, *.jpg, *.jpeg, *.png )
Components.interfaces.nsIFilePicker.filterImages
XML ファイル(*.xml )
Components.interfaces.nsIFilePicker.filterXML
XUL ファイル(*.xul )
Components.interfaces.nsIFilePicker.filterXUL
実行ファイル(*.exe, etc. )
Components.interfaces.nsIFilePicker.filterApps

これらの他、オリジナルのフィルタを使うこともできます。 appendFilter() メソッドで表示名とフィルタのマッチングパターンを登録すれば OK です。

FP.appendFilter('JavaScript', '*.js');
FP.appendFilter('Bookmarks', 'bookmarks.html;bookmark.htm');
// マッチングパターンを複数登録する場合は";"でつなげる

ダイアログを開く

準備ができたら、 show() メソッドでダイアログを開きます。ダイアログは modal なウィンドウとして開かれるので、ダイアログを開いている間は処理がストップします。

var result = FP.show();

なお、このメソッドは、どのような操作が行われたかのフラグを返します。ダイアログを閉じたあとに以下のような判別を行うとよいでしょう。

switch (result)
{
   case Components.interfaces.nsIFilePicker.returnOK:
      // OKが選択された場合
   case Components.interfaces.nsIFilePicker.returnReplace:
      // 保存モードで、「上書きする」が選択された場合
      return FP.file;
      break;

   default:
   case Components.interfaces.nsIFilePicker.returnCancel:
      // 「キャンセル」の場合
      break;
}

ダイアログで選択したファイルは、file プロパティにnsILocalFile オブジェクトとして格納されます。