2011年6月13日月曜日

Cocoa NSTableView ファイルをゴミ箱へ

右クリックからコンテキストメニューを表示して、NSTableViewで表示中のファイルをゴミ箱へ移動できるようにする。

メニューはとりあえず.xibに置いて、NSTableViewのmenuとつないだ。サブクラス化したNSTableViewの-(NSMenu*)menuForEvent:(NSEvent *)eventで動的に生成する方法もやってみたが、これだとクリックされた行が「半選択状態」にならないため(自前で処理する必要があるんでしょうな)却下。

「半選択状態」とはすなわち

Finderでいう上の画像のような状態。クリックによって選択された行がいくつあっても、右クリックした行が四角で囲まれたハイライト状態になる。この状態で「ゴミ箱へ移動する」を選択したら、当然「半選択状態」の行に対する処理になる。

自分でこれを実装しようとして、はたと考え込んでしまった。「半選択状態」ってSelectionでもhighlightでもないようなんだけど・・・。

NSTableViewで選択されている行は、[arrayController selectionIndexes]とか[tableView selectedRowIndexes]とかでNSIndexSetで取得できる。でも半選択状態の行はこのindexには含まれていない。

デベロッパドキュメントを読み返すと、[tableView clickedRow]っていうメソッドがちゃんとあった。これが「現在クリックされた行」のindexを返す。というわけで、このindexが選択行のNSIndexSetに含まれていなければ、右クリックされた「半選択状態」だとわかるので、以下のように書いてみた。

- (IBAction)moveToTrash:(id)sender {
    NSUInteger clickedIndex=[tableView clickedRow];
    NSIndexSet *indexes=nil;
    if([[arrayController selectionIndexes] containsIndex:clickedIndex]){
        indexes=[arrayController selectionIndexes];
    }
    else{
        indexes=[NSIndexSet indexSetWithIndex:clickedIndex];
    }
    NSArray* selectFile=[fileArray objectsAtIndexes:indexes];
    NSMutableArray* selectURL=[NSMutableArray arrayWithCapacity:[selectFile count]];
    for(DirectoryFile* item in selectFile){
        [selectURL addObject:[item fileURL]];
    }
    [[NSWorkspace sharedWorkspace] recycleURLs:selectURL completionHandler:^(NSDictionary *newURLs, NSError *error) {
        if (error != nil) {
            NSLog(@"error: %@", error);
        } else {
            NSLog(@"newURLs: %@", newURLs);
 
        }
    }];
    [fileArray removeObjectsAtIndexes:indexes];
    [arrayController rearrangeObjects];
  
    
}
[[NSWorkspace sharedWorkspace] recycleURLsの使い方はxcatsan師匠このアーティクルからのいただき。いつものことなんだけど、CocoaのAPIがらみでググるとだいたいxcatsan師匠の過去記事に行き着いてそれが正解、ということが多いなあ。

0 件のコメント:

コメントを投稿