title.png

^<< 2007.05/1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>$

Trackback の仕組みはありませんので、コメントにでも残していただくと嬉しいかも、です。

(2007.05.01) ファイルオープン時のフィルタリング

MacOS X 10.4 では*1、UTI(Uniform Type Identifier)という識別子を使ってファイルの種別を一元的に管理できる仕組みがあります。

となれば、ファイルを開くダイアログでも、選択可能なファイルをこの仕組みを使ってフィルタリングしたくなりますよね。ちょうどWindowsでは、標準のファイル選択ダイアログを使う場合に、拡張子でフィルタリングさせるように。

これには Navigation Services の NavCreateGetFileDialog() や NavCreateChooseFileDialog() で、ダイアログを作成する時に指定する方法があります。詳しくは "Filtering the Types of Files That Users Can Open" を参照のこと。

Navigation Servicesを使ったCarbon API的な方法に対応する、Cocoa な世界のやり方があるだろう、と思って探してみたのですが、どうやら現状の NSOpenPanel には直接UTIを指定してフィルタリングさせる仕組みは無いようです。

似たような仕組みとしては、setAllowedFileTypes: というのがあるのですが、これの引数に指定する NSArray は NSString の配列で、拡張子や OSType (NSFileTypeForHFSTypeCode() で NSString にする)を指定するわけです。これはそもそもUTIとは似て非なるものです。しかも私が試した限りでは、なぜか 、setAllowedFileTypes: は、On the Fly ではうまく反映されません。ポップアップの選択項目に応じてフィルタリング対象を変える、という用途には使えないわけです。

というわけで Cocoa でやるには、NSOpenPanel の delegate メソッドである

- (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename

を使う事になりそうです。このメソッドの中で対象ファイルが UTI 的に適合しているかどうかを判定して返してあげる、と。ただ、このメソッドにはディレクトリもやってくるので、Bundleかどうか等も判定しながら、ディレクトリの場合は通すようにしないと、ヒエラルキーを辿れなくなるので注意です。

*1一部10.3から

ツッコミ