Skip to content

Commit e05a628

Browse files
committed
Move some common actions up in the responder chain.
1 parent af1c4b5 commit e05a628

File tree

4 files changed

+109
-89
lines changed

4 files changed

+109
-89
lines changed

Classes/Controllers/PBGitHistoryController.m

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,11 @@ - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
322322
} else if ([menuItem action] == @selector(setTreeView:)) {
323323
[menuItem setState:(self.selectedCommitDetailsIndex == kHistoryTreeViewIndex) ? NSOnState : NSOffState];
324324
}
325-
return YES;
325+
326+
if ([self respondsToSelector:[menuItem action]])
327+
return YES;
328+
329+
return [[self nextResponder] validateMenuItem:menuItem];
326330
}
327331

328332
- (IBAction) setDetailedView:(id)sender
@@ -564,28 +568,6 @@ - (void)showCommitsFromTree:(id)sender
564568
[searchController setHistorySearch:searchString mode:kGitXPathSearchMode];
565569
}
566570

567-
- (void)showInFinderAction:(id)sender
568-
{
569-
NSURL *workingDirectoryURL = self.repository.workingDirectoryURL;
570-
NSMutableArray *URLs = [NSMutableArray array];
571-
572-
for (NSString *filePath in [sender representedObject]) {
573-
[URLs addObject:[workingDirectoryURL URLByAppendingPathComponent:filePath]];
574-
}
575-
[[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:URLs];
576-
}
577-
578-
- (void)openFilesAction:(id)sender
579-
{
580-
NSURL *workingDirectoryURL = self.repository.workingDirectoryURL;
581-
NSMutableArray *URLs = [NSMutableArray array];
582-
583-
for (NSString *filePath in [sender representedObject]) {
584-
[URLs addObject:[workingDirectoryURL URLByAppendingPathComponent:filePath]];
585-
}
586-
[[NSWorkspace sharedWorkspace] openURLs:URLs withAppBundleIdentifier:nil options:0 additionalEventParamDescriptor:nil launchIdentifiers:NULL];
587-
}
588-
589571
- (void) checkoutFiles:(id)sender
590572
{
591573
NSMutableArray *files = [NSMutableArray array];
@@ -641,7 +623,6 @@ - (NSArray *)menuItemsForPaths:(NSArray *)paths
641623

642624
NSArray *menuItems = [NSArray arrayWithObjects:historyItem, diffItem, checkoutItem, finderItem, openFilesItem, nil];
643625
for (NSMenuItem *item in menuItems) {
644-
[item setTarget:self];
645626
[item setRepresentedObject:filePaths];
646627
}
647628

Classes/Controllers/PBGitIndexController.m

Lines changed: 54 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -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];

Classes/git/PBGitRepository.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,4 +143,7 @@ static NSString * PBStringFromBranchFilterType(PBGitXBranchFilterType type) {
143143
// for the scripting bridge
144144
- (void)findInModeScriptCommand:(NSScriptCommand *)command;
145145

146+
- (IBAction)showInFinderAction:(id)sender;
147+
- (IBAction)openFilesAction:(id)sender;
148+
146149
@end

Classes/git/PBGitRepository.m

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,53 @@ - (void)showWindows
170170
[super showWindows];
171171
}
172172

173+
#pragma mark -
174+
#pragma mark NSResponder methods
175+
176+
- (NSArray *)selectedURLsFromSender:(id)sender {
177+
NSArray *selectedFiles = [sender representedObject];
178+
if ([selectedFiles count] == 0)
179+
return nil;
180+
181+
NSURL *workingDirectoryURL = self.workingDirectoryURL;
182+
NSMutableArray *URLs = [NSMutableArray array];
183+
for (id file in selectedFiles) {
184+
NSString *path = file;
185+
// Those can be PBChangedFiles sent by PBGitIndexController. Get their path.
186+
if ([file respondsToSelector:@selector(path)]) {
187+
path = [file path];
188+
}
189+
190+
if (![path isKindOfClass:[NSString class]])
191+
continue;
192+
[URLs addObject:[workingDirectoryURL URLByAppendingPathComponent:path]];
193+
}
194+
195+
return URLs;
196+
}
197+
198+
- (IBAction)showInFinderAction:(id)sender {
199+
NSArray *URLs = [self selectedURLsFromSender:sender];
200+
if ([URLs count] == 0)
201+
return;
202+
203+
[[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:URLs];
204+
}
205+
206+
- (IBAction)openFilesAction:(id)sender {
207+
NSArray *URLs = [self selectedURLsFromSender:sender];
208+
209+
if ([URLs count] == 0)
210+
return;
211+
212+
[[NSWorkspace sharedWorkspace] openURLs:URLs
213+
withAppBundleIdentifier:nil
214+
options:0
215+
additionalEventParamDescriptor:nil
216+
launchIdentifiers:NULL];
217+
}
218+
219+
173220
#pragma mark -
174221
#pragma mark Properties/General methods
175222

0 commit comments

Comments
 (0)