// // FileViewerController.m // GitX // // Created by German Laullon on 11/06/10. // Copyright 2010 __MyCompanyName__. All rights reserved. // #import "FileViewerController.h" #import "PBGitHistoryController.h" #define GROUP_LABEL @"Label" // string #define GROUP_SEPARATOR @"HasSeparator" // BOOL as NSNumber #define GROUP_SELECTION_MODE @"SelectionMode" // MGScopeBarGroupSelectionMode (int) as NSNumber #define GROUP_ITEMS @"Items" // array of dictionaries, each containing the following keys: #define ITEM_IDENTIFIER @"Identifier" // string #define ITEM_NAME @"Name" // string @implementation FileViewerController #pragma mark Setup and teardown - (id)initWithRepository:(PBGitRepository *)theRepository andController:(id)theController; { repository=theRepository; controller=theController; return [self initWithNibName:@"FileViewer" bundle:[NSBundle mainBundle]]; } - (void)awakeFromNib { self.groups = [NSMutableArray arrayWithCapacity:0]; scopeBar.delegate = self; NSArray *items = [NSArray arrayWithObjects: [NSDictionary dictionaryWithObjectsAndKeys: @"source", ITEM_IDENTIFIER, @"Source", ITEM_NAME, nil], [NSDictionary dictionaryWithObjectsAndKeys: @"blame", ITEM_IDENTIFIER, @"Blame", ITEM_NAME, nil], [NSDictionary dictionaryWithObjectsAndKeys: (commit)?@"commit":@"diff", ITEM_IDENTIFIER, @"Diff", ITEM_NAME, nil], [NSDictionary dictionaryWithObjectsAndKeys: @"log", ITEM_IDENTIFIER, @"History", ITEM_NAME, nil], nil]; [self.groups addObject:[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:NO], GROUP_SEPARATOR, [NSNumber numberWithInt:MGRadioSelectionMode], GROUP_SELECTION_MODE, // single selection group. items, GROUP_ITEMS, nil]]; [scopeBar reloadData]; [webViewFileViwer setFrameLoadDelegate:self]; } - (void)dealloc { self.groups = nil; [super dealloc]; } #pragma mark JavaScript log.js methods + (BOOL)isSelectorExcludedFromWebScript:(SEL)sel { if (sel == @selector(selectCommit:)) return NO; return YES; } - (void) selectCommit:(NSString*)c { NSLog(@"[FileViewerController controller:%@]",controller); if([(PBGitHistoryController *)controller selectCommit:sha]) NSLog(@"---"); NSLog(@"[FileViewerController selectCommit:%@]",c); } #pragma mark MGScopeBarDelegate methods - (int)numberOfGroupsInScopeBar:(MGScopeBar *)theScopeBar { return [self.groups count]; } - (NSArray *)scopeBar:(MGScopeBar *)theScopeBar itemIdentifiersForGroup:(int)groupNumber { return [[self.groups objectAtIndex:groupNumber] valueForKeyPath:[NSString stringWithFormat:@"%@.%@", GROUP_ITEMS, ITEM_IDENTIFIER]]; } - (NSString *)scopeBar:(MGScopeBar *)theScopeBar labelForGroup:(int)groupNumber { return [[self.groups objectAtIndex:groupNumber] objectForKey:GROUP_LABEL]; // might be nil, which is fine (nil means no label). } - (NSString *)scopeBar:(MGScopeBar *)theScopeBar titleOfItem:(NSString *)identifier inGroup:(int)groupNumber { NSArray *items = [[self.groups objectAtIndex:groupNumber] objectForKey:GROUP_ITEMS]; if (items) { for (NSDictionary *item in items) { if ([[item objectForKey:ITEM_IDENTIFIER] isEqualToString:identifier]) { return [item objectForKey:ITEM_NAME]; break; } } } return nil; } - (MGScopeBarGroupSelectionMode)scopeBar:(MGScopeBar *)theScopeBar selectionModeForGroup:(int)groupNumber { return [[[self.groups objectAtIndex:groupNumber] objectForKey:GROUP_SELECTION_MODE] intValue]; } - (void)scopeBar:(MGScopeBar *)theScopeBar selectedStateChanged:(BOOL)selected forItem:(NSString *)identifier inGroup:(int)groupNumber { NSString *path = [NSString stringWithFormat:@"html/views/%@", identifier]; NSString *html = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:path]; NSLog(@"[FileViewerController scopeBar:selectedStateChanged] -> file: '%@' (%@)",html,identifier); NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:html]]; [[webViewFileViwer mainFrame] loadRequest:request]; } - (void)showFile:(NSString *)f sha:(NSString *)s{ file=f; sha=s; NSString *show=[[[scopeBar selectedItems] objectAtIndex:0] objectAtIndex:0]; NSLog(@"[showFile:sha] showFile:%@ sha:%@ (show=%@)",file,sha,show); [self scopeBar:scopeBar selectedStateChanged:true forItem:show inGroup:0]; } - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame { NSString *show=[[[scopeBar selectedItems] objectAtIndex:0] objectAtIndex:0]; NSString *path = [NSString stringWithFormat:@"html/views/%@", show]; NSString *formatFile = [[NSBundle mainBundle] pathForResource:@"format" ofType:@"html" inDirectory:path]; NSString *testFile = [NSString stringWithFormat:@"%@/test.html",NSHomeDirectory()]; NSString *format; if(formatFile!=nil) format=[NSString stringWithContentsOfURL:[NSURL fileURLWithPath:formatFile] encoding:NSUTF8StringEncoding error:nil]; NSString *txt; if(show==@"source") txt=[repository outputForArguments:[NSArray arrayWithObjects:@"show", [self refSpec], nil]]; else if(show==@"blame") txt=[self parseBlame:[repository outputInWorkdirForArguments:[NSArray arrayWithObjects:@"blame", @"-p", file, sha, nil]]]; else if((show==@"diff") || (show==@"commit")) txt=[repository outputInWorkdirForArguments:[NSArray arrayWithObjects:@"diff", (sha!=nil)?sha:file , (sha!=nil)?file:nil, nil]]; else if(show==@"log") txt=[self parseLog:[repository outputInWorkdirForArguments:[NSArray arrayWithObjects:@"log", [NSString stringWithFormat:@"--pretty=format:%@",format], @"--", file, nil]]]; else return; // XXXX controlar mejor. NSLog(@"didFinishLoadForFrame -> txt: '%@'",([txt length]>180)?[txt substringToIndex:180]:txt); id script = [webViewFileViwer windowScriptObject]; [script setValue:self forKey:@"Controler"]; [script callWebScriptMethod:@"showFile" withArguments:[NSArray arrayWithObjects:txt, nil]]; //[[[[[sender mainFrame] DOMDocument] documentElement] outerHTML] writeToFile:testFile atomically:YES encoding:NSUTF8StringEncoding error:nil]; } - (NSString*)refSpec { return [NSString stringWithFormat:@"%@:%@", (sha!=nil)?sha:@"HEAD", file]; } -(NSString *)parseLog:(NSString *)string { return string; } -(NSString *)parseBlame:(NSString *)string { string=[string stringByReplacingOccurrencesOfString:@"<" withString:@"<"]; string=[string stringByReplacingOccurrencesOfString:@">" withString:@">"]; NSArray *lines = [string componentsSeparatedByString:@"\n"]; NSString *line; NSMutableDictionary *headers=[NSMutableDictionary dictionary]; NSMutableString *res=[NSMutableString string]; [res appendString:@"
%@ | \n\n",author,summary];
[headers setObject:block forKey:[header objectAtIndex:0]];
}
[res appendString:[headers objectForKey:[header objectAtIndex:0]]];
NSMutableString *code=[NSMutableString string];
do{
line=[lines objectAtIndex:i++];
}while([line characterAtIndex:0]!='\t');
line=[line stringByReplacingOccurrencesOfString:@"\t" withString:@" "];
[code appendString:line];
[code appendString:@"\n"];
int n;
for(n=1;n | \n"];
}else{
break;
}
[res appendString:@"