2011年5月30日月曜日

Cocoa NSTreeControllerを調べる(3)

昨日の段階ではNSTreeControllerとファイルシステムの間にNSTreeNodeをはさんでみたが、どーも冗長なのでもう少し調べてみた。

InterfaceBuilderでNSTreeControllerのアトリビュートを表示すると

こうなっていて、実際にはこの「Children Key Path」をうそでもいいから入力しないと、ビルドには成功しても実行時にデバッグコンソールでエラーが出続ける。
で、ここでChildrenとかのKeyPathを入れるということは、Contentに子ノードを表現するArrayなり、Arrayを返すメソッドがあれば自動的にTree表示してくれそうな感じがする。Childrenの他に入力するKeyPathは画像の通り「Count」と「IsLeaf」・・・ふーむ、これはつまり、EseでOutlineView用に使っているクラスを流用すれば、簡単に行けるのでは?

と見当をつけてさっそく作業をしてみる。
EseのOutlineViewで使っているノード用のクラスはデベロッパドキュメントに載っていたFileSystem.mほぼそのまま。若干現在の実験プロジェクト用に書き換えて、さらにbindingも変えた。


「Model Key Path」に「representedObject」を入れるとNSTreeNodeが保持するObjectのKeyPathが要求されるようなので、ここはrepresentedObjectを削除して直接FileSystemクラスのKeyPathを指定した。

そうすると、とりあえずこれだけのコードで
-(void)awakeFromNib{
    NSArray *mountedVols = [[NSWorkspace sharedWorkspace] mountedLocalVolumePaths]; 
 NSMutableArray *roots=[NSMutableArray array];
    if ([mountedVols count] > 0)
        
 {
  for (NSString *element in mountedVols){
            NSLog(@"%@",element);
            FileSystemItem* item,*parent;
            if([element isEqualToString:@"/"]){
                item=[[FileSystemItem alloc] initWithPath:element parent:nil];
            }
            else{
                parent=[[FileSystemItem alloc]initWithPath:[element stringByDeletingLastPathComponent] parent:nil];
                item=[[FileSystemItem alloc] initWithPath:element parent:parent];
               
            }
                       [roots addObject:item];
            [item release];
          
        }
  [treeController setContent:roots]; 
 }
    

}

(parentをreleaseしてないの点は現在のところ無視(^^;))
こうなった。

ふむふむ、あとはOutlineViewではディレクトリ名しか必要としないから全部NSStringでPath名を取得しているところを、NSURLに入れ替えるかどうか、というあたりだな。removableなメディアのマウントについてはNotificationがあるので簡単だろうし。

0 件のコメント:

コメントを投稿