2 // PBWebGitController.m
5 // Created by Pieter de Bie on 14-06-08.
6 // Copyright 2008 __MyCompanyName__. All rights reserved.
9 #import "PBWebHistoryController.h"
10 @interface RefMenuItem : NSMenuItem
14 @property (copy) NSString *ref;
16 @implementation RefMenuItem
21 @implementation PBWebHistoryController
27 startFile = @"commit";
29 [historyController addObserver:self forKeyPath:@"webCommit" options:0 context:@"ChangedCommit"];
34 [self changeContentTo: historyController.webCommit];
37 - (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(NSString *)context
39 if ([context isEqualToString: @"ChangedCommit"])
40 [self changeContentTo: historyController.webCommit];
42 [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
45 - (void) changeContentTo: (PBGitCommit *) content
47 if (content == nil || !finishedLoading)
50 id script = [view windowScriptObject];
51 [script setValue: content forKey:@"CommitObject"];
53 // The sha is the same, but refs may have changed.. reload it lazy
54 if ([currentSha isEqualToString: content.sha])
56 [script callWebScriptMethod:@"reload" withArguments: nil];
60 currentSha = content.sha;
62 [script callWebScriptMethod:@"loadCommit" withArguments: nil];
65 - (void) selectCommit: (NSString*) sha
67 [historyController selectCommit:sha];
70 - (void) sendKey: (NSString*) key
72 id script = [view windowScriptObject];
73 [script callWebScriptMethod:@"handleKeyFromCocoa" withArguments: [NSArray arrayWithObject:key]];
78 NSString *source = [(DOMHTMLElement *)[[[view mainFrame] DOMDocument] documentElement] outerHTML];
79 NSPasteboard *a =[NSPasteboard generalPasteboard];
80 [a declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self];
81 [a setString:source forType: NSStringPboardType];
84 - (void) removeRef:(RefMenuItem *)sender
86 NSLog(@"Removing ref: %@", [sender ref]);
87 if ([historyController.repository removeRef: [sender ref]])
88 NSLog(@"Deletion succesful!");
90 NSLog(@"Deletion failed!");
93 - (NSArray *) webView:(WebView *)sender
94 contextMenuItemsForElement:(NSDictionary *)element
95 defaultMenuItems:(NSArray *)defaultMenuItems
97 DOMNode *node = [element valueForKey:@"WebElementDOMNode"];
99 // If clicked on the text, select the containing div
100 if ([[node className] isEqualToString:@"DOMText"])
101 node = [node parentNode];
103 // Every ref has a class name of 'refs' and some other class. We check on that to see if we pressed on a ref.
104 if (![[node className] hasPrefix:@"refs "])
105 return defaultMenuItems;
107 RefMenuItem *item = [[RefMenuItem alloc] initWithTitle:@"Remove"
108 action:@selector(removeRef:)
110 [item setTarget: self];
111 [item setRef: [[[node childNodes] item:0] textContent]];
112 return [NSArray arrayWithObject: item];
116 // Open external links in the default browser
117 - (void)webView:(WebView *)sender decidePolicyForNewWindowAction:(NSDictionary *)actionInformation
118 request:(NSURLRequest *)request
119 newFrameName:(NSString *)frameName
120 decisionListener:(id < WebPolicyDecisionListener >)listener
122 [[NSWorkspace sharedWorkspace] openURL:[request URL]];