2011年5月24日火曜日

Cocoa FileManager NavigateBar(3)

ディレクトリを表示したCellをクリックしたら、そのディレクトリ以下にあるディレクトリをメニューで表示してみる。


-(NSInteger)cellAtPoint:(NSPoint)point{
    NaviButtonCell* cell;
    for(NSUInteger i=0;i<[buttonArray count];i++){
        cell=[buttonArray objectAtIndex:i];
        NSRect rect=[cell drawedRect];
        if(NSPointInRect(point, rect)){
            return i;
        }
    }
    return -1;
    
}
-(void)mouseDown:(NSEvent *)theEvent{
    NSPoint point = [self convertPointFromBase:[theEvent locationInWindow]];
 NSInteger index = [self cellAtPoint:point];
    if(index!=-1){
        NaviButtonCell* cell=[buttonArray objectAtIndex:index];
        NSFileManager *fileManager = [NSFileManager defaultManager];
        BOOL isDir, valid;
        
        valid = [fileManager fileExistsAtPath:[cell fullPath] isDirectory:&isDir];
        if (valid && isDir) {
            NSArray *array = [fileManager contentsOfDirectoryAtPath:[cell fullPath] error:NULL];
            if(array){
                NSMenu* menu=[[NSMenu alloc]initWithTitle:@"Directory"];
                for (NSInteger i=0; i<[array count]; i++) {
                    NSString* testpath=[[cell fullPath] stringByAppendingPathComponent:[array objectAtIndex:i]];
                    valid = [fileManager fileExistsAtPath:testpath isDirectory:&isDir];
                    if(valid && isDir){
                        NSMenuItem* item=[[NSMenuItem alloc]initWithTitle:[array objectAtIndex:i] action:@selector(menuSelected:) keyEquivalent:@""];
                        [menu addItem:item];
                        [item release];
                    }
                    
                    
                }
                
                [NSMenu popUpContextMenu:menu withEvent:theEvent forView:self];
                [menu release];
            }
            
        }
    }


}

この程度で可能。ただ、popUpContextMenuだとmouseDownを拾ったロケーションでメニューがpopupしてしまうわけで、こういう事態も起こる。

うーん、Xcode4とはちょっと違う動作だなあ。もしかしてXcode4、popupButton使っているのかなあ。もう少し調査してみよう。

0 件のコメント:

コメントを投稿