2011年6月6日月曜日

Cocoa NSTableView ドラッグアンドドロップ(2)

デベロッパドキュメントその他を読みながらドラッグアンドドロップの処理の勉強。
とりあえず本日は

-(NSDragOperation)tableView:(NSTableView*)aTableView validateDrop:(id)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)dropOperation

-(BOOL)tableView:(NSTableView *)tableView acceptDrop:(id)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)dropOperation
を付け加えて、自分がdropを受け付ける状態にしてみた。dropされたら

    NSPasteboard* pboard=[info draggingPasteboard];
    NSArray *classes = [[NSArray alloc] initWithObjects:[NSURL class], nil];
    
    NSDictionary *options = [NSDictionary dictionary];
    
    NSArray *copiedItems = [pboard readObjectsForClasses:classes options:options];
    if(copiedItems !=nil){
         NSLog(@"%@",[[copiedItems objectAtIndex:0] path]);
        
    }
   
    return YES;

こんな感じでデベロッパドキュメントの通りに記述してみて、無事URLが渡ってきているのを確かめた。
Dragについては昨日書いた
-(BOOL)tableView:(NSTableView *)tableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard{

    NSLog(@"Drag index %@",rowIndexes);
    [arrayController setSelectionIndexes:rowIndexes];
    NSArray *dataArray=[arrayController selectedObjects];
    NSMutableArray *itemArray=[NSMutableArray arrayWithCapacity:[dataArray count]];
    
    for(DirectoryFile* item in dataArray){
        [itemArray addObject:[item fileURL]];
    }
    [pboard writeObjects:itemArray];  
    return YES;
}

これだけでFinderにファイルがドロップできてしまう。いささかびっくり。PasteBoardに書きだす、というのはそういう働きをするのか。

ただvalidateDrop:についてはいろいろ書かなくてはならないことがたくさんあるようだ。それに現在はNSTableViewを素で使っているが、Drag中の画像をカスタマイズしようとするとNSTableViewからのサブクラス化も避けられない模様。

この場合はFinderならどういう動作をするのかな、という感じでFinderをいじってみることが最近多い。そうすると、極めて納得のいく動き方をする。さすがだなあ。

ま、Finderの代替アプリを作りたいわけではないので、同じ動作をする必要はないのだろうけど。Finderがあえてユーザーから隠しているフォルダなどを手軽にのぞくためのToolができたらいいなあ。挫折しないようにがんばろう。

0 件のコメント:

コメントを投稿