2 // NJMappingsViewController.m
5 // Created by Joe Wreschnig on 3/17/13.
9 #import "NJMappingsViewController.h"
13 #define PB_ROW @"com.yukkurigames.Enjoyable.MappingRow"
16 @implementation NJMappingsViewController
18 - (void)awakeFromNib {
19 [self.mappingList registerForDraggedTypes:@[PB_ROW, NSURLPboardType]];
20 [self.mappingList setDraggingSourceOperationMask:NSDragOperationCopy forLocal:NO];
23 - (IBAction)addClicked:(id)sender {
24 NJMapping *newMapping = [[NJMapping alloc] init];
25 [self.delegate mappingsViewController:self addMapping:newMapping];
28 - (IBAction)removeClicked:(id)sender {
29 [self.delegate mappingsViewController:self
30 removeMappingAtIndex:self.mappingList.selectedRow];
33 - (IBAction)moveUpClicked:(id)sender {
34 NSInteger fromIdx = self.mappingList.selectedRow;
35 NSInteger toIdx = fromIdx - 1;
36 [self.delegate mappingsViewController:self
37 moveMappingFromIndex:fromIdx
39 [self.mappingList scrollRowToVisible:toIdx];
40 [self.mappingList selectRowIndexes:[[NSIndexSet alloc] initWithIndex:toIdx]
41 byExtendingSelection:NO];
44 - (IBAction)moveDownClicked:(id)sender {
45 NSInteger fromIdx = self.mappingList.selectedRow;
46 NSInteger toIdx = fromIdx + 1;
47 [self.delegate mappingsViewController:self
48 moveMappingFromIndex:fromIdx
50 [self.mappingList scrollRowToVisible:toIdx];
51 [self.mappingList selectRowIndexes:[[NSIndexSet alloc] initWithIndex:toIdx]
52 byExtendingSelection:NO];
55 - (IBAction)mappingTriggerClicked:(id)sender {
56 [self.mappingListPopover showRelativeToRect:self.mappingListTrigger.bounds
57 ofView:self.mappingListTrigger
58 preferredEdge:NSMinXEdge];
59 self.mappingListTrigger.state = NSOnState;
62 - (void)popoverWillShow:(NSNotification *)notification {
63 self.mappingListTrigger.state = NSOnState;
66 - (void)popoverWillClose:(NSNotification *)notification {
67 self.mappingListTrigger.state = NSOffState;
70 - (void)beginUpdates {
71 [self.mappingList beginUpdates];
75 [self.mappingList endUpdates];
76 [self changedActiveMappingToIndex:self.mappingList.selectedRow];
79 - (void)addedMappingAtIndex:(NSInteger)index startEditing:(BOOL)startEditing {
80 [self.mappingList abortEditing];
81 [self.mappingList insertRowsAtIndexes:[[NSIndexSet alloc] initWithIndex:index]
82 withAnimation:startEditing ? 0 : NSTableViewAnimationSlideLeft];
84 [self.mappingListTrigger performClick:self];
85 [self.mappingList editColumn:0 row:index withEvent:nil select:YES];
86 [self.mappingList scrollRowToVisible:index];
90 - (void)removedMappingAtIndex:(NSInteger)index {
91 [self.mappingList abortEditing];
92 [self.mappingList removeRowsAtIndexes:[[NSIndexSet alloc] initWithIndex:index]
93 withAnimation:NSTableViewAnimationEffectFade];
96 - (void)changedActiveMappingToIndex:(NSInteger)index {
97 NJMapping *mapping = [self.delegate mappingsViewController:self
98 mappingForIndex:index];
99 self.removeMapping.enabled = [self.delegate mappingsViewController:self
100 canRemoveMappingAtIndex:index];
101 self.moveUp.enabled = [self.delegate mappingsViewController:self
102 canMoveMappingFromIndex:index toIndex:index - 1];
103 self.moveDown.enabled = [self.delegate mappingsViewController:self
104 canMoveMappingFromIndex:index toIndex:index + 1];
105 self.mappingListTrigger.title = mapping.name;
106 [self.mappingList selectRowIndexes:[NSIndexSet indexSetWithIndex:index] byExtendingSelection:NO];
107 [self.mappingList scrollRowToVisible:index];
108 [NSUserDefaults.standardUserDefaults setInteger:index forKey:@"selected"];
112 - (void)tableViewSelectionDidChange:(NSNotification *)note {
113 [self.mappingList abortEditing];
114 NSTableView *tableView = note.object;
115 [self.delegate mappingsViewController:self
116 choseMappingAtIndex:tableView.selectedRow];
119 - (id)tableView:(NSTableView *)view objectValueForTableColumn:(NSTableColumn *)column row:(NSInteger)index {
120 return [self.delegate mappingsViewController:self
121 mappingForIndex:index].name;
124 - (void)tableView:(NSTableView *)view
125 setObjectValue:(NSString *)obj
126 forTableColumn:(NSTableColumn *)col
127 row:(NSInteger)index {
128 [self.delegate mappingsViewController:self
129 renameMappingAtIndex:index
133 - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
134 return [self.delegate numberOfMappings:self];
137 - (BOOL)tableView:(NSTableView *)tableView
138 acceptDrop:(id <NSDraggingInfo>)info
140 dropOperation:(NSTableViewDropOperation)dropOperation {
141 NSPasteboard *pboard = [info draggingPasteboard];
142 if ([pboard.types containsObject:PB_ROW]) {
143 NSString *value = [pboard stringForType:PB_ROW];
144 NSInteger srcRow = [value intValue];
146 [self.delegate mappingsViewController:self
147 moveMappingFromIndex:srcRow
150 } else if ([pboard.types containsObject:NSURLPboardType]) {
151 NSURL *url = [NSURL URLFromPasteboard:pboard];
153 if (![self.delegate mappingsViewController:self
154 importMappingFromURL:url
157 [tableView presentError:error];
167 - (NSDragOperation)tableView:(NSTableView *)tableView
168 validateDrop:(id <NSDraggingInfo>)info
169 proposedRow:(NSInteger)row
170 proposedDropOperation:(NSTableViewDropOperation)dropOperation {
171 NSPasteboard *pboard = [info draggingPasteboard];
172 if ([pboard.types containsObject:PB_ROW]) {
173 [tableView setDropRow:MAX(1, row) dropOperation:NSTableViewDropAbove];
174 return NSDragOperationMove;
175 } else if ([pboard.types containsObject:NSURLPboardType]) {
176 NSURL *url = [NSURL URLFromPasteboard:pboard];
177 if ([url.pathExtension isEqualToString:@"enjoyable"]) {
178 [tableView setDropRow:MAX(1, row) dropOperation:NSTableViewDropAbove];
179 return NSDragOperationCopy;
181 return NSDragOperationNone;
184 return NSDragOperationNone;
188 - (NSArray *)tableView:(NSTableView *)tableView
189 namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropDestination
190 forDraggedRowsWithIndexes:(NSIndexSet *)indexSet {
191 NJMapping *toSave = [self.delegate mappingsViewController:self
192 mappingForIndex:indexSet.firstIndex];
193 NSString *filename = [[toSave.name stringByFixingPathComponent]
194 stringByAppendingPathExtension:@"enjoyable"];
195 NSURL *dst = [dropDestination URLByAppendingPathComponent:filename];
196 dst = [NSFileManager.defaultManager generateUniqueURLWithBase:dst];
198 if (![toSave writeToURL:dst error:&error]) {
199 [tableView presentError:error];
202 return @[dst.lastPathComponent];
206 - (BOOL)tableView:(NSTableView *)tableView
207 writeRowsWithIndexes:(NSIndexSet *)rowIndexes
208 toPasteboard:(NSPasteboard *)pboard {
209 if (rowIndexes.count == 1 && rowIndexes.firstIndex != 0) {
210 [pboard declareTypes:@[PB_ROW, NSFilesPromisePboardType] owner:nil];
211 [pboard setString:@(rowIndexes.firstIndex).stringValue forType:PB_ROW];
212 [pboard setPropertyList:@[@"enjoyable"] forType:NSFilesPromisePboardType];
214 } else if (rowIndexes.count == 1 && rowIndexes.firstIndex == 0) {
215 [pboard declareTypes:@[NSFilesPromisePboardType] owner:nil];
216 [pboard setPropertyList:@[@"enjoyable"] forType:NSFilesPromisePboardType];
224 [self.mappingList reloadData];