NSOutlineViewでファイルのリスト表示

今日はファイルリストを表示できるようにしてみた。小さいけれどもちゃんと階層表示されており、またファイル名にはアイコンがついていることがお分かりいただけるだろうか。モデル(データ)は架空のもので、NSDocumentのNIBファイルが読み込まれたあとに、初期化している。
さらに標準のNSOutlineViewのままではリストのファイルネームの頭にアイコンを付けることができない。そこで、NIBファイルが読み込まれるとwindowControllerDidLoadNibが呼ばれるので、superメソッドを実行後に、以下を追記する。

[fileOutlineView setAutoresizesOutlineColumn:NO];
    NSBrowserCell* browserCell = [[[NSBrowserCell alloc] init] autorelease];
[browserCell setLeaf:YES];
[[fileOutlineView tableColumnWithIdentifier:@"name"] setDataCell:browserCell];

これはHMDT本のサンプルコード(の中のFileBrowser)のまんま。[browserCell setLeaf:YES]でセルを葉にしておかないと、面白いことになるので注意(気になる方はご自分でお確かめください)
リストの表現は、まずInterface BuilderでOutlineViewのdataSourceをNSDocumentにつなぎます。その後デリゲートを実装するのですが、これもサンプルコードを利用しています。ただし、こちらのファイルリストは実在していないファイルを取り扱うので、NSWorkSpaceのiconForFileTypeを使って拡張子からファイルタイプのアイコンを作って返しています。

NSImage* icon;
if ([item objectForKey:@"child"] == nil) { //子を持っている=フォルダかどうか
	icon = [[NSWorkspace sharedWorkspace] 
		iconForFileType:[[item objectForKey:@"name"] 
			pathExtension]];
} else {
	icon = [[NSWorkspace sharedWorkspace] 
		iconForFile:[[NSBundle mainBundle] resourcePath]];
}
[icon setSize:NSMakeSize(16, 16)];
[[column dataCell] setImage:icon];

ただし、フォルダのアイコンはどうやって返したらいいのか分からなかったので、取りあえずアプリケーションのバンドル内のResourcesフォルダ(これは実在する)へのパスからiconForFileを使って返しています。フォルダのHFSファイルタイプが分かればいいのかなぁ。
明日はプラグインの読み込みをやってみるつもり。その前にプロトコルの実装だ。