メニューはとりあえず.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 件のコメント:
コメントを投稿