Rev 1959 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
#import "VignettesController.h"#import "REngine/REngine.h"#import "REngine/RSEXP.h"@implementation VignettesControllerstatic VignettesController *vignettesSharedController = nil;+ (VignettesController*) sharedController{return vignettesSharedController;}- (IBAction)openVignette:(id)sender{int sr = [tableView selectedRow];if (sr>=0) {NSString *cmd = [NSString stringWithFormat:@"open \"%@/%@/doc/%@.pdf\"",[dataSource objectAtColumn:@"path" row:sr],[dataSource objectAtColumn:@"package" row:sr],[dataSource objectAtColumn:@"vignette" row:sr]];SLog(@"VignettesController.openVignette executing: %@", cmd);system([cmd UTF8String]);}}- (IBAction)openVignetteSource:(id)sender{int sr = [tableView selectedRow];if (sr>=0) {[[REngine mainEngine] executeString:[NSString stringWithFormat:@"edit(vignette(\"%@\", package=\"%@\"))",[dataSource objectAtColumn:@"vignette" row:sr],[dataSource objectAtColumn:@"package" row:sr]]];}}- (void) runFilter: (NSString*) filterString{SLog(@"VignettesController.reRunFilter (search string is %@)",filterString?filterString:@"<none>");NSIndexSet *preIx = [tableView selectedRowIndexes];NSMutableIndexSet *postIx = [[NSMutableIndexSet alloc] init];NSMutableIndexSet *absSelIx = [[NSMutableIndexSet alloc] init];int i=0;if ([preIx count]>0) { // save selection in absolute index positionsi = [preIx firstIndex];do {if (!filter || i<filterlen)[absSelIx addIndex:filter?filter[i]:i];i = [preIx indexGreaterThanIndex:i];} while (i!=NSNotFound);i=0;}if (filter) {filterlen=0;if (filter) free(filter);filter=0;}if (filterString && [filterString length]>0) {filterlen=0;while (i<[dataSource count]) {if ([(NSString*)[dataSource objectAtColumn:@"vignette" index:i] rangeOfString:filterString options:NSCaseInsensitiveSearch].location!=NSNotFound ||[(NSString*)[dataSource objectAtColumn:@"description" index:i] rangeOfString:filterString options:NSCaseInsensitiveSearch].location!=NSNotFound ||[(NSString*)[dataSource objectAtColumn:@"package" index:i] rangeOfString:filterString options:NSCaseInsensitiveSearch].location!=NSNotFound) filterlen++;i++;}SLog(@" - found %d matches", filterlen);filter=(int*)malloc(sizeof(int)*(filterlen+1));i=0; filterlen=0;while (i<[dataSource count]) {if ([(NSString*)[dataSource objectAtColumn:@"vignette" index:i] rangeOfString:filterString options:NSCaseInsensitiveSearch].location!=NSNotFound ||[(NSString*)[dataSource objectAtColumn:@"description" index:i] rangeOfString:filterString options:NSCaseInsensitiveSearch].location!=NSNotFound ||[(NSString*)[dataSource objectAtColumn:@"package" index:i] rangeOfString:filterString options:NSCaseInsensitiveSearch].location!=NSNotFound) {if ([absSelIx containsIndex:i])[postIx addIndex:filterlen];filter[filterlen++]=i;}i++;}} else [postIx addIndexes:absSelIx];if (filter)[dataSource setFilter:filter length:filterlen];else[dataSource resetFilter];[tableView reloadData];[tableView selectRowIndexes:postIx byExtendingSelection:NO];[absSelIx release];[postIx release];}- (IBAction)search:(id)sender{if (dataSource)[self runFilter: [filterField stringValue]];}- (void) reload{SLog(@"VignettesController.reload");[dataSource reset];RSEXP *x = [[REngine mainEngine] evaluateString:@"vignette()$results"];SLog(@" result = %@", x);if (x) {RSEXP *dim = [x attr: @"dim"];if (dim) {if ([dim length]!=2) {SLog(@"VignettesController.reload: result is not 2-dimnsional");} else {int *dimi = [dim intArray];if (dimi[1]<4) {SLog(@"VignettesController.reload: not enough columns");} else {int tl = [x length];NSString **a = [x strings];// SLog(@"tl=%d, a=%x", tl, a);if (a) {NSArray *aPkg = [[NSArray alloc] initWithObjects:a count:dimi[0]];NSArray *aPath= [[NSArray alloc] initWithObjects:a+dimi[0] count:dimi[0]];NSArray *aFile= [[NSArray alloc] initWithObjects:a+dimi[0]*2 count:dimi[0]];NSArray *aDesc= [[NSArray alloc] initWithObjects:a+dimi[0]*3 count:dimi[0]];[dataSource addColumn:aPkg withName:@"package"];[dataSource addColumn:aFile withName:@"vignette"];[dataSource addColumn:aDesc withName:@"description"];[dataSource addColumn:aPath withName:@"path"];[tableView reloadData];int i=0;while (i<tl) [a[i++] release];free(a);}}}[dim release];}[x release];}needReload = NO;}- (void)tableViewSelectionDidChange:(NSNotification *)aNotification{int sr = [tableView selectedRow];[openButton setEnabled: (sr!=-1)];[openSourceButton setEnabled: (sr!=-1)];if (sr!=-1) {NSString *pdfFile = [NSString stringWithFormat:@"%@/%@/doc/%@.pdf",[dataSource objectAtColumn:@"path" row:sr],[dataSource objectAtColumn:@"package" row:sr],[dataSource objectAtColumn:@"vignette" row:sr]];SLog(@"VignettesController.tableViewSelectionDidChange: previewing %@", pdfFile);if ([[NSFileManager defaultManager] fileExistsAtPath:pdfFile]) {[pdfView loadFromPath: pdfFile];[pdfDrawer open];} else {[pdfDrawer close];[openButton setEnabled:NO];}} else [pdfDrawer close];}- (void) showVigenttes{if (needReload)[self reload];[window makeKeyAndOrderFront:self];}- (void) awakeFromNib{SLog(@"VignettesController.awakeFromNib");filter=0;filterlen=0;dataSource=[[SortableDataSource alloc] init];[tableView setDataSource: dataSource];[tableView setDoubleAction:@selector(openVignette:)];[tableView setTarget:self];// deferred loading of vignettes//[self reload];needReload = YES;[openButton setEnabled: ([tableView selectedRow]!=-1)];[openSourceButton setEnabled: ([tableView selectedRow]!=-1)];vignettesSharedController = self;}@end