forked from brotherbard/gitx
-
Notifications
You must be signed in to change notification settings - Fork 0
/
PBWebHistoryController.m
125 lines (102 loc) · 3.31 KB
/
PBWebHistoryController.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
//
// PBWebGitController.m
// GitTest
//
// Created by Pieter de Bie on 14-06-08.
// Copyright 2008 __MyCompanyName__. All rights reserved.
//
#import "PBWebHistoryController.h"
@interface RefMenuItem : NSMenuItem
{
NSString *ref;
}
@property (copy) NSString *ref;
@end
@implementation RefMenuItem
@synthesize ref;
@end
@implementation PBWebHistoryController
@synthesize diff;
- (void) awakeFromNib
{
startFile = @"commit";
[super awakeFromNib];
[historyController addObserver:self forKeyPath:@"webCommit" options:0 context:@"ChangedCommit"];
}
- (void) didLoad
{
[self changeContentTo: historyController.webCommit];
}
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(NSString *)context
{
if ([context isEqualToString: @"ChangedCommit"])
[self changeContentTo: historyController.webCommit];
else
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
- (void) changeContentTo: (PBGitCommit *) content
{
if (content == nil || !finishedLoading)
return;
id script = [view windowScriptObject];
[script setValue: content forKey:@"CommitObject"];
// The sha is the same, but refs may have changed.. reload it lazy
if ([currentSha isEqualToString: content.sha])
{
[script callWebScriptMethod:@"reload" withArguments: nil];
return;
}
currentSha = content.sha;
[script callWebScriptMethod:@"loadCommit" withArguments: nil];
}
- (void) selectCommit: (NSString*) sha
{
[historyController selectCommit:sha];
}
- (void) sendKey: (NSString*) key
{
id script = [view windowScriptObject];
[script callWebScriptMethod:@"handleKeyFromCocoa" withArguments: [NSArray arrayWithObject:key]];
}
- (void) copySource
{
NSString *source = [(DOMHTMLElement *)[[[view mainFrame] DOMDocument] documentElement] outerHTML];
NSPasteboard *a =[NSPasteboard generalPasteboard];
[a declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self];
[a setString:source forType: NSStringPboardType];
}
- (void) removeRef:(RefMenuItem *)sender
{
NSLog(@"Removing ref: %@", [sender ref]);
if ([historyController.repository removeRef: [sender ref]])
NSLog(@"Deletion succesful!");
else
NSLog(@"Deletion failed!");
}
- (NSArray *) webView:(WebView *)sender
contextMenuItemsForElement:(NSDictionary *)element
defaultMenuItems:(NSArray *)defaultMenuItems
{
DOMNode *node = [element valueForKey:@"WebElementDOMNode"];
// If clicked on the text, select the containing div
if ([[node className] isEqualToString:@"DOMText"])
node = [node parentNode];
// Every ref has a class name of 'refs' and some other class. We check on that to see if we pressed on a ref.
if (![[node className] hasPrefix:@"refs "])
return defaultMenuItems;
RefMenuItem *item = [[RefMenuItem alloc] initWithTitle:@"Remove"
action:@selector(removeRef:)
keyEquivalent: @""];
[item setTarget: self];
[item setRef: [[[node childNodes] item:0] textContent]];
return [NSArray arrayWithObject: item];
}
// Open external links in the default browser
- (void)webView:(WebView *)sender decidePolicyForNewWindowAction:(NSDictionary *)actionInformation
request:(NSURLRequest *)request
newFrameName:(NSString *)frameName
decisionListener:(id < WebPolicyDecisionListener >)listener
{
[[NSWorkspace sharedWorkspace] openURL:[request URL]];
}
@end