#import "MWExportWatcher.h" #import "MGWPopUpButton.h" #import "MWFakeFile.h" #import "TAMSCharEngine.h" #import "myResults.h" #import "tams.h" #import "utils.h" #import "tamsutils.h" #import "prefBoss.h" #import "stringCategories.h" #define TABFMT 1 #define COMMAFMT 2 #define NLFMT 3 #define CRFMT 4 #define XMLFMT 5 #define OTHERFMT 99 int moveInArray(id who, NSMutableArray *theArray, int row); @implementation MWExportWatcher -(id) init { [super init]; colPool = [[NSMutableArray alloc] init]; colList = [[NSMutableArray alloc] init]; dndList = [[NSMutableArray alloc] init]; return self; } -(void) dealloc { [colPool release]; [colList release]; [dndList release]; [super dealloc]; } -(NSString *) XprocessString: (NSString *) who line: (int) ln { NSString *ss; NSMutableString *s2, *s3, *s4; //get the selected row //get the appropriate data if([who length]) { ss = who; //set it to the textview s2 = [[NSMutableString alloc] init]; s3 = [[NSMutableString alloc] init]; s4 = [[NSMutableString alloc] init]; [s2 setString: ss]; [s2 replaceOccurrencesOfString: @"\\n" withString: @"\n" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\t" withString: @"\t" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\r" withString: @"\r" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; if([tagSwitch state] == NSOffState) { MWFakeFile *mf; TAMSCharEngine *tx; ctQChar *qq; qq = [[ctQChar alloc] init]; mf = [[MWFakeFile alloc] initWithString: s2]; tx = [[TAMSCharEngine alloc] initWithFile: mf]; [tx setAllowTab: 1]; [tx setNoPar: 0]; [tx startSearch]; while([tx scanNext: qq withWarnings: NO] != ENDOFFILE) { if([qq tokentype] == CHAR) { [s3 appendString: [qq buff]]; } } [tx release]; [qq release]; [mf release]; } else [s3 setString: s2]; [s3 replaceOccurrencesOfString: @"\\n" withString: @"\n" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; [s3 replaceOccurrencesOfString: @"\\t" withString: @"\t" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; [s3 replaceOccurrencesOfString: @"\\r" withString: @"\r" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; if([gPrefBoss TAScanForLN] && ln > 0) { [s4 setString: [NSString stringWithFormat: @"%d\t%@", ln, s3]]; } else { [s4 setString: s3]; } [s2 release]; [s3 release]; return s4; /*put colorize stuff here */ //if([self global: @"nonregexcharflag"] || [self global: @"regexcharflag"]) return; } } -(NSString *) processString: (NSString *) who line: (int) ln { NSMutableString *s2, *s3, *s4; //get the selected row //get the appropriate data if([tagSwitch state] == NSOnState && [escapeSwitch state] == NSOnState) return who; if([who length] == 0) return who; s3 = [[NSMutableString alloc] init]; s4 = [[NSMutableString alloc] init]; s2 = [[NSMutableString alloc] init]; [s2 setString: who]; if([escapeSwitch state] == NSOffState) { [s2 replaceOccurrencesOfString: @"\\n" withString: @"\n" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\t" withString: @"\t" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\r" withString: @"\r" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; } /* useless if([escapeSwitch state] == NSOffState) { //set it to the textview [s2 replaceOccurrencesOfString: @"\\n" withString: @"\n" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\t" withString: @"\t" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\r" withString: @"\r" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; } */ if([tagSwitch state] == NSOffState) { TAMSCharEngine *tx; ctQChar *qq; qq = [[ctQChar alloc] init]; tx = [[TAMSCharEngine alloc] initWithString: s2]; if([escapeSwitch state] == NSOffState) { [tx setAllowTab: 1]; [tx setNoPar: 0]; } else { [tx setAllowTab: 0]; [tx setNoPar: 1]; } [tx startSearch]; while([tx scanNext: qq withWarnings: NO] != ENDOFFILE) { if([qq tokentype] == CHAR) { [s3 appendString: [qq buff]]; } } [tx release]; [qq release]; } else [s3 setString: s2]; /* if([escapeSwitch state] == NSOffState) { [s3 replaceOccurrencesOfString: @"\\n" withString: @"\n" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; [s3 replaceOccurrencesOfString: @"\\t" withString: @"\t" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; [s3 replaceOccurrencesOfString: @"\\r" withString: @"\r" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; } else [s3 replaceOccurrencesOfString: @"\\" withString: @"\\\\" options: 0 range: NSMakeRange(0, [s3 length])]; */ if([gPrefBoss TAScanForLN] && ln > 0) { if([escapeSwitch state] == NSOffState) [s4 setString: [NSString stringWithFormat: @"%d\t%@", ln, s3]]; else [s4 setString: [NSString stringWithFormat: @"%d\\t%@", ln, s3]]; } else { [s4 setString: s3]; } [s2 release]; [s3 release]; [s4 autorelease]; return s4; } -(NSMutableString *) getDataString { NSMutableString *fs = [NSMutableString string]; NSMutableString *rs = [NSMutableString string]; //NSMutableString *opentag = [NSMutableString string]; //NSMutableString *closetag = [NSMutableString string]; NSMutableString *ans = [[NSMutableString alloc] init]; NSArray *myData; int i,j,n,m; int format; NSEnumerator *nnn; NSNumber *ndx; nnn = [fieldList selectedRowEnumerator]; format = [[formatMenu selectedItem] tag]; [colList removeAllObjects]; while((ndx = [nnn nextObject]) != nil) { [colList addObject: [colPool objectAtIndex: [ndx intValue]]]; } if([colList count] < 1) { NSWARNING(@"Select fields for export"); return [NSMutableString string]; } if([selectedSwitch state] == NSOnState) myData = [theBoss hotData]; else myData = [theBoss allData]; switch(format) { case TABFMT: [fs setString: @"\t"]; [rs setString: @"\n"]; break; case COMMAFMT: [fs setString: @","]; [rs setString: @"\n"]; break; case NLFMT: [fs setString: @"\n"]; [rs setString: @"\n"]; break; case CRFMT: [fs setString: @"\r"]; [rs setString: @"\r"]; break; case XMLFMT: [fs setString: @"\n"]; [rs setString: @"\n"]; break; case OTHERFMT: [fs setString: [[colDelim stringValue] stringUnescaped]]; [rs setString: [[rowDelim stringValue] stringUnescaped]]; break; }; n = [myData count]; m = [colList count]; if(format == XMLFMT) { [ans appendString: @""]; [ans appendString: @"\n\n"]; } else if ([headerSwitch state] == NSOnState) { for(j = 0; j < m; j++) { if(j > 0) { [ans appendString: fs]; [ans appendString: [[[colList objectAtIndex: j] copy] autorelease]]; } else [ans appendString: [[[colList objectAtIndex: j] copy] autorelease]]; } [ans appendString: rs]; } for(i = 0; i < n; i++) { if(format == XMLFMT) [ans appendString: @"\n"]; for(j = 0; j < m; j++) { NSString *md, *fldname; NSDictionary *rcrd; int ln = [[[myData objectAtIndex: i] objectForKey: @"_line_number"] intValue]; rcrd = [myData objectAtIndex: i]; fldname = [colList objectAtIndex: j]; if([fldname isEqualToString: @"_beg_loc"]) md = [(NSNumber *)[rcrd objectForKey: fldname] stringValue]; else if([fldname isEqualToString: @"_doc"]) md = [(MWFile *)[rcrd objectForKey: fldname] name]; else md = [[myData objectAtIndex: i] objectForKey: [colList objectAtIndex: j]]; if([[colList objectAtIndex: j] isEqualToString: @"_data"] == NO) ln = -1; if(format != XMLFMT) { if(j > 0) { [ans appendString: fs]; [ans appendString: [self processString: md line: ln]]; } else [ans appendString: [self processString: md line: ln]]; } else { [ans appendString: [NSString stringWithFormat: @"\t<%@>%@\n", [colList objectAtIndex: j], [self processString: md line: ln], [colList objectAtIndex: j]]]; } } if(format == XMLFMT) [ans appendString: @""]; [ans appendString: rs]; } if(format == XMLFMT) [ans appendString: @"\n"]; [ans autorelease]; return ans; } -(void) savePanelDidEnd: (NSSavePanel *) sheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode == NSOKButton) { NSString *myName = [sheet filename]; NSString *md = [self getDataString]; [md writeToFile: myName atomically: YES]; } else { } } - (IBAction)exitExport:(id)sender { [thePane orderOut: sender]; [NSApp endSheet: thePane returnCode: 0]; } - (IBAction)runExport:(id)sender { NSSavePanel *msp; if([clipboardSwitch state] == NSOffState) { msp = [NSSavePanel savePanel]; [msp setDelegate: self]; if([[formatMenu selectedItem] tag] == XMLFMT) [msp setRequiredFileType: @"xml"]; else [msp setRequiredFileType: @"txt"]; [msp beginSheetForDirectory: nil file: nil modalForWindow: thePane modalDelegate: self didEndSelector: @selector(savePanelDidEnd:returnCode:contextInfo:) contextInfo: nil]; } else { BOOL a; NSString *ans = [self getDataString]; [ans retain]; [[NSPasteboard generalPasteboard] declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self]; a = [[NSPasteboard generalPasteboard] setString: ans forType: NSStringPboardType]; [ans autorelease]; //get string //copy to clipboard } //[thePane orderOut: sender]; //[NSApp endSheet: thePane returnCode: 1]; } - (NSDragOperation)tableView:(NSTableView *)tableView validateDrop:(id)info proposedRow:(int)row proposedDropOperation:(NSTableViewDropOperation)operation { if(tableView == fieldList) return NSDragOperationMove;//NSDragOperationEvery else return NSDragOperationNone ; } - (int)numberOfRowsInTableView:(NSTableView *) tt { if(tt == fieldList) return [colPool count]; else return 0; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { if(aTableView == fieldList) return [colPool objectAtIndex: rowIndex]; else return @""; } - (BOOL)tableView:(NSTableView *)tableView writeRows:(NSArray *)rows toPasteboard:(NSPasteboard *)pboard { id testid; testid = fieldList; if(tableView == fieldList) { /* [dndList removeAllObjects]; FORALL(rows) { [dndList addObject: [colPool objectAtIndex: [temp intValue]]]; } ENDFORALL; [pboard setString: [dndList objectAtIndex: 0] forType: NSStringPboardType]; return YES; */ #ifdef SINGLEDRAG if([rows count] != 1) return NO; dndNdx = [[rows objectAtIndex: 0] intValue]; [pboard setString: [colPool objectAtIndex: [[rows objectAtIndex: 0] intValue]] forType: NSStringPboardType]; return YES; #else [dndList removeAllObjects]; FORALL(rows) { [dndList addObject: [colPool objectAtIndex: [temp intValue]]]; } ENDFORALL; [pboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self]; [pboard setString: [colPool objectAtIndex: [[rows objectAtIndex: 0] intValue]] forType: NSStringPboardType]; return YES; #endif } else return NO; } - (BOOL)tableView:(NSTableView *)tableView acceptDrop:(id )info row:(int)row dropOperation:(NSTableViewDropOperation)operation { int n; if(tableView == fieldList) { int currSpot; n = [dndList count]; currSpot = row; FORALL(dndList) { currSpot = moveInArray(temp, colPool, currSpot); } ENDFORALL; [tableView reloadData]; [tableView deselectAll: nil]; FORALL(dndList) { [tableView selectRow: [colPool indexOfObject: temp] byExtendingSelection: YES]; } ENDFORALL; [dndList removeAllObjects]; return YES; } else return NO; } -(void) exportDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode) { } } -(void) doExport { NSWindow *who; if([gPrefBoss detachedSheetValue]) who = nil; else who = theWindow; [fieldList setVerticalMotionCanBeginDrag: YES]; [fieldList registerForDraggedTypes: [NSArray arrayWithObjects: NSStringPboardType, nil]]; [clipboardSwitch setState: NSOnState]; [escapeSwitch setState: NSOffState]; [tagSwitch setState: NSOffState]; [headerSwitch setState: NSOffState]; [selectedSwitch setState: NSOnState]; [formatMenu selectItemWithTag: 1]; [colDelim setStringValue: @""]; [rowDelim setStringValue: @""]; [colPool removeAllObjects]; columns = [theBoss tableColumns]; FORALL(columns) { NSString *idfr = [temp identifier]; if([idfr isEqualToString: @"#"]) continue; #ifdef COLFILTER else if([idfr isEqualToString: @"_code"] || [idfr isEqualToString: @"_data"]) [colPool addObject: [[idfr copy] autorelease]]; else if([idfr characterAtIndex: 0] == '_') continue; else #endif [colPool addObject: [[idfr copy] autorelease]]; } ENDFORALL; [fieldList deselectAll: nil]; [fieldList reloadData]; [NSApp beginSheet: thePane modalForWindow: who modalDelegate: self didEndSelector: @selector(exportDidEnd:returnCode:contextInfo:) contextInfo: nil]; } @end