2 // PBDetailController.m
5 // Created by Pieter de Bie on 16-06-08.
6 // Copyright 2008 __MyCompanyName__. All rights reserved.
9 #import "PBDetailController.h"
10 #import "CWQuickLook.h"
11 #import "PBGitGrapher.h"
12 #import "PBGitRevisionCell.h"
13 #define QLPreviewPanel NSClassFromString(@"QLPreviewPanel")
16 @implementation PBDetailController
18 @synthesize repository, selectedTab, webCommit, rawCommit, gitTree;
20 - (id)initWithRepository:(PBGitRepository*)theRepository;
22 if(self = [self initWithWindowNibName:@"RepositoryWindow"])
24 self.repository = theRepository;
25 [self showWindow:nil];
32 [fileBrowser setTarget:self];
33 [fileBrowser setDoubleAction:@selector(openSelectedFile:)];
34 self.selectedTab = [[NSUserDefaults standardUserDefaults] integerForKey:@"Repository Window Selected Tab Index"];;
35 [commitController addObserver:self forKeyPath:@"selection" options:(NSKeyValueObservingOptionNew,NSKeyValueObservingOptionOld) context:@"commitChange"];
36 [treeController addObserver:self forKeyPath:@"selection" options:0 context:@"treeChange"];
37 NSSize cellSpacing = [commitList intercellSpacing];
38 cellSpacing.height = 0;
39 [commitList setIntercellSpacing:cellSpacing];
44 NSArray* selection = [commitController selectedObjects];
46 // Remove any references in the QLPanel
47 [[QLPreviewPanel sharedPreviewPanel] setURLs:[NSArray array] currentIndex:0 preservingDisplayState:YES];
48 // We have to do this manually, as NSTreeController leaks memory?
49 [treeController setSelectionIndexPaths:[NSArray array]];
51 if ([selection count] > 0)
52 realCommit = [selection objectAtIndex:0];
60 switch (self.selectedTab) {
61 case 0: self.webCommit = realCommit; break;
62 case 1: self.rawCommit = realCommit; break;
63 case 2: self.gitTree = realCommit.tree; break;
68 - (void) setSelectedTab: (int) number
71 [[NSUserDefaults standardUserDefaults] setInteger:selectedTab forKey:@"Repository Window Selected Tab Index"];
75 - (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
77 if ([(NSString *)context isEqualToString: @"commitChange"]) {
81 else if ([(NSString *)context isEqualToString: @"treeChange"]) {
82 [self updateQuicklookForce: NO];
86 [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
90 - (IBAction) openSelectedFile: sender
92 NSArray* selectedFiles = [treeController selectedObjects];
93 if ([selectedFiles count] == 0)
95 PBGitTree* tree = [selectedFiles objectAtIndex:0];
96 NSString* name = [tree tmpFileNameForContents];
97 [[NSWorkspace sharedWorkspace] openTempFile:name];
100 - (IBAction) setDetailedView: sender {
101 self.selectedTab = 0;
103 - (IBAction) setRawView: sender {
104 self.selectedTab = 1;
106 - (IBAction) setTreeView: sender {
107 self.selectedTab = 2;
110 - (void)keyDown:(NSEvent*)event
112 if ([[event charactersIgnoringModifiers] isEqualToString: @"f"] && [event modifierFlags] & NSAlternateKeyMask && [event modifierFlags] & NSCommandKeyMask)
113 [[self window] makeFirstResponder:searchField];
115 [super keyDown: event];
118 - (IBAction) toggleQuickView: sender
120 id panel = [QLPreviewPanel sharedPreviewPanel];
121 if ([panel isOpen]) {
124 [[QLPreviewPanel sharedPreviewPanel] makeKeyAndOrderFrontWithEffect:1];
125 [self updateQuicklookForce: YES];
129 - (void) updateQuicklookForce: (BOOL) force
131 if (!force && ![[QLPreviewPanel sharedPreviewPanel] isOpen])
134 NSArray* selectedFiles = [treeController selectedObjects];
136 if ([selectedFiles count] == 0)
139 NSMutableArray* fileNames = [NSMutableArray array];
140 for (PBGitTree* tree in selectedFiles) {
141 NSString* s = [tree tmpFileNameForContents];
143 [fileNames addObject:[NSURL fileURLWithPath: s]];
146 [[QLPreviewPanel sharedPreviewPanel] setURLs:fileNames currentIndex:0 preservingDisplayState:YES];
150 - (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex
152 if (![[aTableColumn identifier] isEqualToString:@"subject"])
155 PBGitRevisionCell* cell = aCell;
156 if (self.repository.revisionList.grapher &&
157 ![commitController filterPredicate] &&
158 [[commitController sortDescriptors] count] == 0) {
159 PBGitGrapher* g = self.repository.revisionList.grapher;
160 [cell setCellInfo: [g cellInfoForRow:rowIndex]];