@@ -17,6 +17,8 @@ @interface PBGitIndexController ()
1717- (void )discardChangesForFiles : (NSArray *)files force : (BOOL )force ;
1818@end
1919
20+ // FIXME: This isn't a view/window/whatever controller, though it acts like one...
21+ // See for example -menuForTable and its setTarget: calls.
2022@implementation PBGitIndexController
2123
2224- (void )awakeFromNib
@@ -99,35 +101,30 @@ - (NSMenu *) menuForTable:(NSTableView *)table
99101 if ([table tag ] == 0 ) {
100102 NSMenuItem *stageItem = [[NSMenuItem alloc ] initWithTitle: @" Stage Changes" action: @selector (stageFilesAction: ) keyEquivalent: @" s" ];
101103 [stageItem setTarget: self ];
102- [stageItem setRepresentedObject: selectedFiles];
103104 [menu addItem: stageItem];
104105 }
105106 else if ([table tag ] == 1 ) {
106107 NSMenuItem *unstageItem = [[NSMenuItem alloc ] initWithTitle: @" Unstage Changes" action: @selector (unstageFilesAction: ) keyEquivalent: @" u" ];
107108 [unstageItem setTarget: self ];
108- [unstageItem setRepresentedObject: selectedFiles];
109109 [menu addItem: unstageItem];
110110 }
111111
112112 NSString *title = [selectedFiles count ] == 1 ? @" Open file" : @" Open files" ;
113113 NSMenuItem *openItem = [[NSMenuItem alloc ] initWithTitle: title action: @selector (openFilesAction: ) keyEquivalent: @" " ];
114- [openItem setTarget: self ];
115- [openItem setRepresentedObject: selectedFiles];
114+ [openItem setTarget: commitController.repository];
116115 [menu addItem: openItem];
117116
118117 // Attempt to ignore
119118 if ([self allSelectedCanBeIgnored: selectedFiles]) {
120119 NSString *ignoreText = [selectedFiles count ] == 1 ? @" Ignore File" : @" Ignore Files" ;
121120 NSMenuItem *ignoreItem = [[NSMenuItem alloc ] initWithTitle: ignoreText action: @selector (ignoreFilesAction: ) keyEquivalent: @" " ];
122121 [ignoreItem setTarget: self ];
123- [ignoreItem setRepresentedObject: selectedFiles];
124122 [menu addItem: ignoreItem];
125123 }
126124
127125 if ([selectedFiles count ] == 1 ) {
128126 NSMenuItem *showInFinderItem = [[NSMenuItem alloc ] initWithTitle: @" Show in Finder" action: @selector (showInFinderAction: ) keyEquivalent: @" " ];
129- [showInFinderItem setTarget: self ];
130- [showInFinderItem setRepresentedObject: selectedFiles];
127+ [showInFinderItem setTarget: commitController.repository];
131128 [menu addItem: showInFinderItem];
132129 }
133130
@@ -140,52 +137,63 @@ - (NSMenu *) menuForTable:(NSTableView *)table
140137 break ;
141138 }
142139 }
143- if (!addDiscardMenu)
144- {
145- return menu;
146- }
147140
148- NSMenuItem *discardItem = [[NSMenuItem alloc ] initWithTitle: @" Discard changes…" action: @selector (discardFilesAction: ) keyEquivalent: @" " ];
149- [discardItem setTarget: self ];
150- [discardItem setAlternate: NO ];
151- [discardItem setRepresentedObject: selectedFiles];
141+ if (addDiscardMenu)
142+ {
143+ NSMenuItem *discardItem = [[NSMenuItem alloc ] initWithTitle: @" Discard changes…" action: @selector (discardFilesAction: ) keyEquivalent: @" " ];
144+ [discardItem setAlternate: NO ];
145+ [discardItem setTarget: self ];
152146
153- [menu addItem: discardItem];
147+ [menu addItem: discardItem];
154148
155- NSMenuItem *discardForceItem = [[NSMenuItem alloc ] initWithTitle: @" Discard changes" action: @selector (forceDiscardFilesAction: ) keyEquivalent: @" " ];
156- [discardForceItem setTarget: self ];
157- [discardForceItem setAlternate: YES ];
158- [discardForceItem setRepresentedObject: selectedFiles];
159- [discardForceItem setKeyEquivalentModifierMask: NSAlternateKeyMask ];
160- [menu addItem: discardForceItem];
161-
162- BOOL trashInsteadOfDiscard = floor (NSAppKitVersionNumber ) > NSAppKitVersionNumber10_7 ;
163- if (trashInsteadOfDiscard)
164- {
165- for (PBChangedFile* file in selectedFiles)
166- {
167- if (file.status != NEW)
168- {
169- trashInsteadOfDiscard = NO ;
170- break ;
171- }
172- }
173- }
174-
175- if (trashInsteadOfDiscard && [selectedFiles count ] > 0 )
176- {
177- NSMenuItem * moveToTrashItem = [[NSMenuItem alloc ] initWithTitle: @" Move to Trash" action: @selector (moveToTrashAction: ) keyEquivalent: @" " ];
178- [moveToTrashItem setTarget: self ];
179- [moveToTrashItem setRepresentedObject: selectedFiles];
180- [menu addItem: moveToTrashItem];
181-
182- [menu removeItem: discardItem];
183- [menu removeItem: discardForceItem];
184- }
149+ NSMenuItem *discardForceItem = [[NSMenuItem alloc ] initWithTitle: @" Discard changes" action: @selector (forceDiscardFilesAction: ) keyEquivalent: @" " ];
150+ [discardForceItem setAlternate: YES ];
151+ [discardForceItem setKeyEquivalentModifierMask: NSAlternateKeyMask ];
152+ [discardForceItem setTarget: self ];
153+ [menu addItem: discardForceItem];
185154
155+ BOOL trashInsteadOfDiscard = floor (NSAppKitVersionNumber ) > NSAppKitVersionNumber10_7 ;
156+ if (trashInsteadOfDiscard)
157+ {
158+ for (PBChangedFile* file in selectedFiles)
159+ {
160+ if (file.status != NEW)
161+ {
162+ trashInsteadOfDiscard = NO ;
163+ break ;
164+ }
165+ }
166+ }
167+
168+ if (trashInsteadOfDiscard && [selectedFiles count ] > 0 )
169+ {
170+ NSMenuItem * moveToTrashItem = [[NSMenuItem alloc ] initWithTitle: @" Move to Trash" action: @selector (moveToTrashAction: ) keyEquivalent: @" " ];
171+ [moveToTrashItem setTarget: self ];
172+ [menu addItem: moveToTrashItem];
173+
174+ [menu removeItem: discardItem];
175+ [menu removeItem: discardForceItem];
176+ }
177+ }
178+
179+ for (NSMenuItem *item in [menu itemArray ]) {
180+ [item setRepresentedObject: selectedFiles];
181+ }
182+
186183 return menu;
187184}
188185
186+ - (BOOL )validateMenuItem : (NSMenuItem *)menuItem
187+ {
188+ if ([self respondsToSelector: [menuItem action ]])
189+ return YES ;
190+
191+ if ([commitController respondsToSelector: [menuItem action ]])
192+ return YES ;
193+
194+ return [[commitController nextResponder ] validateMenuItem: menuItem];
195+ }
196+
189197- (void ) stageSelectedFiles
190198{
191199 [commitController.index stageFiles: [unstagedFilesController selectedObjects ]];
@@ -207,14 +215,6 @@ - (void) unstageFilesAction:(id) sender
207215 [commitController.index unstageFiles: [sender representedObject ]];
208216}
209217
210- - (void ) openFilesAction : (id ) sender
211- {
212- NSArray *files = [sender representedObject ];
213- NSURL *workingDirectoryURL = commitController.repository .workingDirectoryURL ;
214- for (PBChangedFile *file in files)
215- [[NSWorkspace sharedWorkspace ] openURL: [workingDirectoryURL URLByAppendingPathComponent: [file path ]]];
216- }
217-
218218- (void ) ignoreFilesAction : (id ) sender
219219{
220220 NSArray *selectedFiles = [sender representedObject ];
@@ -239,17 +239,6 @@ - (void)forceDiscardFilesAction:(id) sender
239239 [self discardChangesForFiles: selectedFiles force: TRUE ];
240240}
241241
242- - (void ) showInFinderAction : (id ) sender
243- {
244- NSArray *selectedFiles = [sender representedObject ];
245- if ([selectedFiles count ] == 0 )
246- return ;
247- NSURL *workingDirectoryURL = commitController.repository .workingDirectoryURL ;
248- NSURL *filePath = [workingDirectoryURL URLByAppendingPathComponent: [[selectedFiles objectAtIndex: 0 ] path ]];
249-
250- [[NSWorkspace sharedWorkspace ] activateFileViewerSelectingURLs: @[filePath]];
251- }
252-
253242- (void )moveToTrashAction : (id )sender
254243{
255244 NSArray *selectedFiles = [sender representedObject ];
0 commit comments