Modernize DNDArrayController.
parent
832fa6dbd0
commit
730276a7e7
|
@ -1,22 +1,28 @@
|
|||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
extern NSString *MovedRowsType;
|
||||
extern NSString *CogPlaylistItemType;
|
||||
extern NSString *CogUrlsPboardType;
|
||||
extern NSString *iTunesDropType;
|
||||
|
||||
@interface DNDArrayController : NSArrayController
|
||||
{
|
||||
IBOutlet NSTableView *tableView;
|
||||
}
|
||||
@interface DNDArrayController : NSArrayController <NSTableViewDataSource>
|
||||
|
||||
@property IBOutlet NSTableView *tableView;
|
||||
|
||||
// table view drag and drop support
|
||||
- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard;
|
||||
- (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id <NSDraggingInfo>)info proposedRow:(int)row proposedDropOperation:(NSTableViewDropOperation)op;
|
||||
- (BOOL)tableView:(NSTableView*)tv acceptDrop:(id <NSDraggingInfo>)info row:(int)row dropOperation:(NSTableViewDropOperation)op;
|
||||
|
||||
- (id <NSPasteboardWriting>)tableView:(NSTableView *)tableView
|
||||
pasteboardWriterForRow:(NSInteger)row;
|
||||
- (NSDragOperation)tableView:(NSTableView *)tableView
|
||||
validateDrop:(id <NSDraggingInfo>)info
|
||||
proposedRow:(int)row
|
||||
proposedDropOperation:(NSTableViewDropOperation)dropOperation;
|
||||
- (BOOL)tableView:(NSTableView *)tableView
|
||||
acceptDrop:(id <NSDraggingInfo>)info
|
||||
row:(int)row
|
||||
dropOperation:(NSTableViewDropOperation)dropOperation;
|
||||
|
||||
// utility methods
|
||||
-(void)moveObjectsInArrangedObjectsFromIndexes:(NSIndexSet*)indexSet toIndex:(unsigned int)insertIndex;
|
||||
-(void)moveObjectsInArrangedObjectsFromIndexes:(NSIndexSet *)indexSet
|
||||
toIndex:(unsigned int)insertIndex;
|
||||
|
||||
@end
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
@implementation DNDArrayController
|
||||
|
||||
NSString *MovedRowsType = @"MOVED_ROWS_TYPE";
|
||||
NSString *CogPlaylistItemType = @"org.cogx.cog.playlist-item";
|
||||
NSString *CogUrlsPboardType = @"COG_URLS_TYPE";
|
||||
|
||||
// @"CorePasteboardFlavorType 0x6974756E" is the "itun" type representing an iTunes plist
|
||||
|
@ -14,102 +14,105 @@ NSString *iTunesDropType = @"CorePasteboardFlavorType 0x6974756E";
|
|||
- (void)awakeFromNib
|
||||
{
|
||||
// register for drag and drop
|
||||
[tableView registerForDraggedTypes:[NSArray arrayWithObjects:MovedRowsType, CogUrlsPboardType, NSFilenamesPboardType, iTunesDropType, nil]];
|
||||
[self.tableView registerForDraggedTypes:@[CogPlaylistItemType, CogUrlsPboardType,
|
||||
NSFilenamesPboardType, iTunesDropType]];
|
||||
}
|
||||
|
||||
|
||||
- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard
|
||||
- (id <NSPasteboardWriting>)tableView:(NSTableView *)tableView
|
||||
pasteboardWriterForRow:(NSInteger)row
|
||||
{
|
||||
DLog(@"INDEX SET ON DRAG: %@", rowIndexes);
|
||||
|
||||
NSData *data = [NSArchiver archivedDataWithRootObject:rowIndexes];
|
||||
|
||||
[pboard declareTypes: [NSArray arrayWithObjects:MovedRowsType, nil] owner:self];
|
||||
[pboard setData:data forType: MovedRowsType];
|
||||
NSPasteboardItem *item = [[NSPasteboardItem alloc] init];
|
||||
[item setString:[@(row) stringValue] forType:CogPlaylistItemType];
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
return YES;
|
||||
- (void)tableView:(NSTableView *)tableView
|
||||
draggingSession:(NSDraggingSession *)session
|
||||
willBeginAtPoint:(NSPoint)screenPoint
|
||||
forRowIndexes:(NSIndexSet *)rowIndexes
|
||||
{
|
||||
DLog(@"Drag session started with indexes: %@", rowIndexes);
|
||||
}
|
||||
|
||||
|
||||
- (NSDragOperation)tableView:(NSTableView*)tv
|
||||
validateDrop:(id <NSDraggingInfo>)info
|
||||
proposedRow:(int)row
|
||||
proposedDropOperation:(NSTableViewDropOperation)op
|
||||
- (NSDragOperation)tableView:(NSTableView*)tableView
|
||||
validateDrop:(id <NSDraggingInfo>)info
|
||||
proposedRow:(int)row
|
||||
proposedDropOperation:(NSTableViewDropOperation)dropOperation
|
||||
{
|
||||
NSDragOperation dragOp = NSDragOperationCopy;
|
||||
|
||||
if ([info draggingSource] == tv)
|
||||
dragOp = NSDragOperationMove;
|
||||
|
||||
DLog(@"VALIDATING DROP!");
|
||||
NSDragOperation dragOp = NSDragOperationCopy;
|
||||
|
||||
if ([info draggingSource] == tableView)
|
||||
dragOp = NSDragOperationMove;
|
||||
|
||||
DLog(@"VALIDATING DROP!");
|
||||
// we want to put the object at, not over,
|
||||
// the current row (contrast NSTableViewDropOn)
|
||||
[tv setDropRow:row dropOperation:NSTableViewDropAbove];
|
||||
|
||||
// the current row (contrast NSTableViewDropOn)
|
||||
[tableView setDropRow:row dropOperation:NSTableViewDropAbove];
|
||||
|
||||
return dragOp;
|
||||
}
|
||||
|
||||
|
||||
- (BOOL)tableView:(NSTableView*)tv
|
||||
acceptDrop:(id <NSDraggingInfo>)info
|
||||
row:(int)row
|
||||
dropOperation:(NSTableViewDropOperation)op
|
||||
- (BOOL)tableView:(NSTableView*)tableView
|
||||
acceptDrop:(id <NSDraggingInfo>)info
|
||||
row:(int)row
|
||||
dropOperation:(NSTableViewDropOperation)dropOperation
|
||||
{
|
||||
if (row < 0)
|
||||
{
|
||||
row = 0;
|
||||
}
|
||||
|
||||
if (row < 0) {
|
||||
row = 0;
|
||||
}
|
||||
|
||||
NSArray<NSPasteboardItem *> *items = info.draggingPasteboard.pasteboardItems;
|
||||
// if drag source is self, it's a move
|
||||
if ([info draggingSource] == tableView)
|
||||
{
|
||||
NSIndexSet *indexSet = [NSUnarchiver unarchiveObjectWithData:[[info draggingPasteboard] dataForType:MovedRowsType]];
|
||||
if (indexSet)
|
||||
{
|
||||
DLog(@"INDEX SET ON DROP: %@", indexSet);
|
||||
NSArray *selected = [[self arrangedObjects] objectsAtIndexes:indexSet];
|
||||
[self moveObjectsInArrangedObjectsFromIndexes:indexSet toIndex:row];
|
||||
|
||||
[self setSelectedObjects:selected];
|
||||
|
||||
DLog(@"ACCEPTING DROP!");
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
DLog(@"REJECTING DROP!");
|
||||
return NO;
|
||||
if ([info draggingSource] == tableView || items == nil) {
|
||||
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
|
||||
for (NSPasteboardItem *item in items) {
|
||||
[indexSet addIndex:[[item stringForType:CogPlaylistItemType] intValue]];
|
||||
}
|
||||
if ([indexSet count] > 0) {
|
||||
DLog(@"INDEX SET ON DROP: %@", indexSet);
|
||||
NSArray *selected = [[self arrangedObjects] objectsAtIndexes:indexSet];
|
||||
[self moveObjectsInArrangedObjectsFromIndexes:indexSet toIndex:row];
|
||||
|
||||
[self setSelectedObjects:selected];
|
||||
|
||||
DLog(@"ACCEPTING DROP!");
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
DLog(@"REJECTING DROP!");
|
||||
return NO;
|
||||
}
|
||||
|
||||
|
||||
-(void) moveObjectsInArrangedObjectsFromIndexes:(NSIndexSet*)indexSet
|
||||
toIndex:(unsigned int)insertIndex
|
||||
-(void) moveObjectsInArrangedObjectsFromIndexes:(NSIndexSet *)indexSet
|
||||
toIndex:(unsigned int)insertIndex
|
||||
{
|
||||
|
||||
NSArray *objects = [self arrangedObjects];
|
||||
NSUInteger index = [indexSet lastIndex];
|
||||
|
||||
int aboveInsertIndexCount = 0;
|
||||
id object;
|
||||
int removeIndex;
|
||||
|
||||
while (NSNotFound != index)
|
||||
{
|
||||
if (index >= insertIndex) {
|
||||
removeIndex = (int)(index + aboveInsertIndexCount);
|
||||
aboveInsertIndexCount += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
removeIndex = (int)index;
|
||||
insertIndex -= 1;
|
||||
}
|
||||
|
||||
object = [objects objectAtIndex:removeIndex];
|
||||
NSArray *objects = [self arrangedObjects];
|
||||
NSUInteger index = [indexSet lastIndex];
|
||||
|
||||
[self removeObjectAtArrangedObjectIndex:removeIndex];
|
||||
[self insertObject:object atArrangedObjectIndex:insertIndex];
|
||||
|
||||
index = [indexSet indexLessThanIndex:index];
|
||||
int aboveInsertIndexCount = 0;
|
||||
id object;
|
||||
int removeIndex;
|
||||
|
||||
while (NSNotFound != index) {
|
||||
if (index >= insertIndex) {
|
||||
removeIndex = (int)(index + aboveInsertIndexCount);
|
||||
aboveInsertIndexCount += 1;
|
||||
} else {
|
||||
removeIndex = (int)index;
|
||||
insertIndex -= 1;
|
||||
}
|
||||
|
||||
object = [objects objectAtIndex:removeIndex];
|
||||
|
||||
[self removeObjectAtArrangedObjectIndex:removeIndex];
|
||||
[self insertObject:object atArrangedObjectIndex:insertIndex];
|
||||
|
||||
index = [indexSet indexLessThanIndex:index];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -867,7 +867,7 @@
|
|||
pe.current = YES;
|
||||
|
||||
if (pe != nil)
|
||||
[tableView scrollRowToVisible:pe.index];
|
||||
[self.tableView scrollRowToVisible:pe.index];
|
||||
|
||||
currentEntry = pe;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue