Merge branch 'fix_interspacing'
[GitX.git] / PBDetailController.m
blob15e759ea40822545a7ce7c2a6835c044a6a990bd
1 //
2 //  PBDetailController.m
3 //  GitX
4 //
5 //  Created by Pieter de Bie on 16-06-08.
6 //  Copyright 2008 __MyCompanyName__. All rights reserved.
7 //
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"])
23         {
24                 self.repository = theRepository;
25                 [self showWindow:nil];
26         }
27         return self;
30 - (void)awakeFromNib
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];
42 - (void) updateKeys
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];
53         else
54                 realCommit = nil;
55         
56         self.webCommit = nil;
57         self.rawCommit = nil;
58         self.gitTree = nil;
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;
64         }
65 }       
68 - (void) setSelectedTab: (int) number
70         selectedTab = number;
71         [[NSUserDefaults standardUserDefaults] setInteger:selectedTab forKey:@"Repository Window Selected Tab Index"];
72         [self updateKeys];
75 - (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
77     if ([(NSString *)context isEqualToString: @"commitChange"]) {
78                 [self updateKeys];
79                 return;
80         }
81         else if ([(NSString *)context isEqualToString: @"treeChange"]) {
82                         [self updateQuicklookForce: NO];
83         }
85         else {
86                 [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
87         }
90 - (IBAction) openSelectedFile: sender
92         NSArray* selectedFiles = [treeController selectedObjects];
93         if ([selectedFiles count] == 0)
94                 return;
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];
114         else
115                 [super keyDown: event];
118 - (IBAction) toggleQuickView: sender
120         id panel = [QLPreviewPanel sharedPreviewPanel];
121         if ([panel isOpen]) {
122                 [panel closePanel];
123         } else {
124                 [[QLPreviewPanel sharedPreviewPanel] makeKeyAndOrderFrontWithEffect:1];
125                 [self updateQuicklookForce: YES];
126         }
129 - (void) updateQuicklookForce: (BOOL) force
131         if (!force && ![[QLPreviewPanel sharedPreviewPanel] isOpen])
132                 return;
133         
134         NSArray* selectedFiles = [treeController selectedObjects];
136         if ([selectedFiles count] == 0)
137                 return;
138         
139         NSMutableArray* fileNames = [NSMutableArray array];
140         for (PBGitTree* tree in selectedFiles) {
141                 NSString* s = [tree tmpFileNameForContents];
142                 if (s)
143                         [fileNames addObject:[NSURL fileURLWithPath: s]];
144         }
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"])
153                 return;
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]];
161         }
163 @end