5 // Created by Marc Liyanage on Sun Mar 03 2002.
6 // Copyright (c) 2001 __MyCompanyName__. All rights reserved.
10 #import "MyDocument.h"
16 @implementation MyDocument
20 if (self = [super init]) {
21 workset = [[Workset alloc] init];
22 processor = [XSLTProcessorFactory makeProcessorOfType:PROCESSORTYPE_SABLOTRON];
23 wellFormedParser = [[XMLParserLibxml alloc] init];
37 [wellFormedParser release];
38 [findPanelController release];
39 [jumpToLinePanelController release];
40 [unsavedChangesPanelController release];
44 - (IBAction)selectTab:(id)sender {
46 [self selectTabById:[sender tag]];
55 - (IBAction)selectTabById:(int)tabId {
70 tabName = @"parametersTab";
75 tabName = @"resultTab";
81 [tabView selectTabViewItemWithIdentifier:tabName];
86 - (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem {
88 NSLog(@"switch tab xyz x");
89 [[self undoManager] removeAllActions];
91 if ([[tabViewItem identifier] isEqualToString:@"htmlResult"]) {
93 [self updateResultWebView];
94 } else if ([[tabViewItem identifier] isEqualToString:@"xslfoResult"]) {
95 [self updateResultImageView];
105 // NSLog(@"updateUI running...");
107 [uiUpdateTimer invalidate];
108 [uiUpdateTimer release];
110 uiUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(uiUpdateTimerTarget:) userInfo:nil repeats:NO];
112 [uiUpdateTimer retain];
116 - (void)uiUpdateTimerTarget:(NSTimer *)timer {
127 // NSLog(@"doUpdateUI running...");
128 // NSLog(@"debug: %@", [[[NSApp mainWindow] document] tabView]);
131 [saveXmlAsButton setEnabled:[workset hasXmlCode]];
132 [saveXsltAsButton setEnabled:[workset hasXsltCode]];
133 [saveResultAsButton setEnabled:[workset hasResult]];
135 [saveResultButton setEnabled:[workset hasResultFilename] && resultDirty];
136 [autoSaveCheckbox setEnabled:[workset hasResultFilename]];
138 [openResultURLButton setEnabled:[workset hasResultFilename]];
139 [autoShowCheckbox setEnabled:[openResultURLButton isEnabled]];
141 [paramRemoveButton setEnabled:[parameterTable selectedRow] != -1];
143 [processButton setEnabled:[self canProcessNow]];
145 [saveResultFilenameField setObjectValue:[workset resultFilename]];
146 [saveResultFilenameField setToolTip:[workset resultFilename]];
149 [saveXmlFilenameField setObjectValue:[workset xmlFilename]];
150 [saveXmlFilenameField setToolTip:[workset xmlFilename]];
151 [saveXmlButton setEnabled:[workset hasXmlFilename] && xmlDirty];
154 [saveXsltFilenameField setObjectValue:[workset xsltFilename]];
155 [saveXsltFilenameField setToolTip:[workset xsltFilename]];
156 [saveXsltButton setEnabled:[workset hasXsltFilename] && xsltDirty];
158 [self updateWellFormedIcons];
160 [parameterTable reloadData];
163 [resultView setString:[workset result]];
165 if ([[[resultTabView selectedTabViewItem] identifier] isEqualToString:@"htmlResult"]) {
166 [self updateResultWebView];
167 } else if ([[[resultTabView selectedTabViewItem] identifier] isEqualToString:@"xslfoResult"]) {
168 [self updateResultImageView];
171 [pdfCurrentPageField setIntValue: (pdfPageCount ? (pdfCurrentPage + 1) : 0)];
172 [pdfPageCountField setIntValue:pdfPageCount];
174 [pdfPreviousPageButton setEnabled:pdfCurrentPage > 0];
175 [pdfNextPageButton setEnabled:pdfCurrentPage < (pdfPageCount - 1)];
176 [pdfSaveAsButton setEnabled:(pdfPageCount > 0)];
182 - (void)updateResultWebView {
183 if (!webViewUpToDate) {
184 WebFrame *mainFrame = [resultWebView mainFrame];
185 [mainFrame loadHTMLString:[workset result] baseURL:nil];
186 webViewUpToDate = YES;
191 - (void)updateResultImageView {
192 if (!imageViewUpToDate) {
193 [self renderFo:self];
194 imageViewUpToDate = YES;
199 - (void)updateWellFormedIcons {
201 if (![workset hasXmlCode] || [wellFormedParser checkWellFormedString:[workset xmlCode]]) {
202 [xmlWellFormedIcon setImage:nil];
203 [xmlWellFormedIcon setToolTip:nil];
205 [xmlWellFormedIcon setImage:warningIcon];
206 [xmlWellFormedIcon setToolTip:[NSString stringWithFormat:@"The XML code is not well-formed, error at line %d:\n%@", [wellFormedParser errorLine], [wellFormedParser errorMessage]]];
210 if (![workset hasXsltCode] || [wellFormedParser checkWellFormedString:[workset xsltCode]]) {
211 [xsltWellFormedIcon setImage:nil];
212 [xsltWellFormedIcon setToolTip:nil];
214 [xsltWellFormedIcon setImage:warningIcon];
215 [xsltWellFormedIcon setToolTip:[NSString stringWithFormat:@"The XSLT code is not well-formed, error at line %d:\n%@", [wellFormedParser errorLine], [wellFormedParser errorMessage]]];
222 - (BOOL)canProcessNow {
224 return [workset hasXmlCode] && [workset hasXsltCode];
228 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
230 // NSLog(@"validate: %@, tag: %d", menuItem, [menuItem tag]);
232 switch ([menuItem tag]) {
235 return [self canProcessNow];
239 return [workset hasResultFilename];
243 return [self canFindNow];
246 case 13: // Find Next
247 case 14: // Find Previous
248 return [self canFindAgainNow];
251 case 15: // Use Selection for Find
252 return [self canUseSelectionForFindNow];
255 case 16: // Jump to Line
256 return [self canJumpToLineNow];
268 - (IBAction)showInBrowser:(id)sender {
275 - (void)updateCompleteUI {
277 [xmlView setString:[workset xmlCode]];
278 [xsltView setString:[workset xsltCode]];
285 - (void)textDidChange:(NSNotification *)aNotification {
287 id sender = [aNotification object];
289 if ([sender isEqual:xmlView]) {
290 [workset setXmlCode:[xmlView string]];
292 } else if ([sender isEqual:xsltView]) {
293 [workset setXsltCode:[xsltView string]];
297 [self updateChangeCount:NSChangeDone];
304 - (NSTabView *)tabView {
310 - (BOOL)canJumpToLineNow {
312 NSTextView *view = [self currentTextView];
314 return (view == xmlView) || (view == xsltView);
319 - (IBAction)showJumpToLinePanel:(id)sender {
321 [NSApp beginSheet:[jumpToLinePanelController window]
322 modalForWindow:[[[self windowControllers] objectAtIndex:0] window]
327 [NSApp runModalForWindow:[jumpToLinePanelController window]];
328 [NSApp endSheet:[jumpToLinePanelController window]];
329 [[jumpToLinePanelController window] orderOut:self];
331 if ([jumpToLinePanelController lineNumber] == 0) {
335 [((XMLTextView *)[self currentTextView]) selectLineByNumber:[jumpToLinePanelController lineNumber]];
337 // NSLog(@"jump to line: %d", [jumpToLinePanelController lineNumber]);
342 - (IBAction)showFindPanel:(id)sender {
344 [findPanelController refresh];
346 [NSApp beginSheet:[findPanelController window]
347 modalForWindow:[[[self windowControllers] objectAtIndex:0] window]
352 [NSApp runModalForWindow:[findPanelController window]];
353 [NSApp endSheet:[findPanelController window]];
354 [[findPanelController window] orderOut:self];
356 if ([findPanelController aborted]) {
360 [self findStringWithSearchFlags:[findPanelController searchFlags]];
367 - (IBAction)findNext:(id)sender {
369 [self findStringWithSearchFlags:[findPanelController searchFlags] & NSCaseInsensitiveSearch];
374 - (IBAction)findPrevious:(id)sender {
376 [self findStringWithSearchFlags:([findPanelController searchFlags] | NSBackwardsSearch)];
380 - (BOOL)canUseSelectionForFindNow {
382 NSTextView *view = [self currentTextView];
383 NSRange selectedRange;
389 selectedRange = [view selectedRange];
391 if (selectedRange.length < 1) {
401 - (IBAction)useSelectionForFind:(id)sender {
404 NSTextView *view = [self currentTextView];
406 text = [[view string] substringWithRange:[view selectedRange]];
408 [findPanelController setFindString:text];
417 NSString *currentTabViewItem = [[[self tabView] selectedTabViewItem] identifier];
419 if ([currentTabViewItem isEqualToString:@"xmlTab"]
420 || [currentTabViewItem isEqualToString:@"xsltTab"]
421 || [currentTabViewItem isEqualToString:@"resultTab"]) {
429 - (BOOL)canFindAgainNow {
431 return ([findPanelController findString] != nil) && [self canFindNow];
436 - (void)findStringWithSearchFlags:(int)flags {
438 NSTextView *currentView;
441 NSRange selectedRange, leftRange, rightRange, resultRange, searchRange;
443 NSPasteboard *findBoard = [NSPasteboard pasteboardWithName:NSFindPboard];
445 string = [findBoard stringForType:NSStringPboardType];
447 currentView = [self currentTextView];
448 if (currentView == nil) {
452 text = [currentView string];
454 selectedRange = [currentView selectedRange];
455 leftRange = NSMakeRange(0, selectedRange.location);
456 rightRange = NSMakeRange(NSMaxRange(selectedRange), [text length] - NSMaxRange(selectedRange));
458 if (flags & NSBackwardsSearch) {
459 searchRange = leftRange;
461 searchRange = rightRange;
464 resultRange = [text rangeOfString:string options:flags range:searchRange];
466 if (resultRange.location == NSNotFound) {
471 [currentView setSelectedRange:resultRange];
472 [currentView scrollRangeToVisible:resultRange];
479 - (NSTextView *)currentTextView {
481 NSString *currentTabViewItem = [[[self tabView] selectedTabViewItem] identifier];
483 if ([currentTabViewItem isEqualToString:@"xmlTab"]) {
485 } else if ([currentTabViewItem isEqualToString:@"xsltTab"]) {
487 } else if ([currentTabViewItem isEqualToString:@"resultTab"]) {
499 - (IBAction)process:(id)sender {
502 const char **params = [[workset parameterSet] cArray];
504 struct timeval tstart, tend;
505 gettimeofday(&tstart, NULL);
509 if ([workset hasXsltFilename]) {
510 [processor setBaseUri:[NSString stringWithFormat:@"file://%@", [workset xsltFilename]]];
513 if (![processor processStrings:[workset xmlCode] withXslt:[workset xsltCode] andParameters:params]) {
515 [drawerMessageField setStringValue:[NSString stringWithFormat:@"Error on line %d of your %@ code:\n%@", [processor errorLine], ([processor errorSource] == XSLT_ERROR_SOURCE_XML ? @"XML" : @"XSLT"), [processor errorMessage]]];
518 [errorDrawer openOnEdge:NSMinYEdge];
519 [self showErrorLocation:nil];
523 gettimeofday(&tend, NULL);
525 processingTime = ((tend.tv_sec * 1000000 + tend.tv_usec) - (tstart.tv_sec * 1000000 + tstart.tv_usec)) / 1000;
527 [workset setResult:[processor result]];
531 [self selectTabById:RESULT];
532 [processingTimeField setStringValue:[NSString stringWithFormat:@"Time: %ldms", processingTime]];
535 webViewUpToDate = NO;
536 imageViewUpToDate = NO;
544 if (resultDirty && [autoSaveCheckbox state] == NSOnState) {
545 [self saveResult:nil];
552 if ([autoShowCheckbox state] == NSOnState) {
553 [self openResultURL:nil];
559 - (IBAction)loadXml:(id)sender {
561 NSOpenPanel *panel = [NSOpenPanel openPanel];
563 if ([panel runModalForDirectory:nil file:nil types:nil] == NSOKButton) {
565 // NSLog(@"choosen: %@", [[panel filenames] objectAtIndex:0]);
567 [workset setXmlCode:[NSString stringWithContentsOfFile:[[panel filenames] objectAtIndex:0]]];
568 [workset setXmlFilename:[[panel filenames] objectAtIndex:0]];
569 [self updateChangeCount:NSChangeDone];
570 [self updateCompleteUI];
578 - (IBAction)loadXslt:(id)sender {
580 NSOpenPanel *panel = [NSOpenPanel openPanel];
582 if ([panel runModalForDirectory:nil file:nil types:nil] == NSOKButton) {
584 // NSLog(@"choosen: %@", [[panel filenames] objectAtIndex:0]);
586 [workset setXsltCode:[NSString stringWithContentsOfFile:[[panel filenames] objectAtIndex:0]]];
587 [workset setXsltFilename:[[panel filenames] objectAtIndex:0]];
588 [self updateChangeCount:NSChangeDone];
589 [self updateCompleteUI];
596 - (IBAction)saveXmlAs:(id)sender {
598 NSSavePanel *panel = [NSSavePanel savePanel];
600 if ([panel runModal] == NSFileHandlingPanelOKButton) {
602 [workset setXmlFilename:[panel filename]];
610 - (IBAction)saveXml:(id)sender {
613 if ([workset hasXmlFilename]) {
622 - (IBAction)saveXsltAs:(id)sender {
624 NSSavePanel *panel = [NSSavePanel savePanel];
626 if ([panel runModal] == NSFileHandlingPanelOKButton) {
628 [workset setXsltFilename:[panel filename]];
636 - (IBAction)saveXslt:(id)sender {
638 if ([workset hasXsltFilename]) {
648 - (IBAction)saveResultAs:(id)sender {
650 NSSavePanel *panel = [NSSavePanel savePanel];
652 if ([panel runModal] == NSFileHandlingPanelOKButton) {
654 [workset setResultFilename:[panel filename]];
656 [self saveResult:nil];
661 - (IBAction)saveResult:(id)sender {
663 if ([workset hasResultFilename]) {
665 [[workset result] writeToFile:[workset resultFilename] atomically:NO];
676 - (IBAction)openResultURL:(id)sender {
678 // NSLog(@"openResultURL running...");
680 if ([workset hasResultFilename]) {
682 [[NSWorkspace sharedWorkspace] openURL:[NSURL fileURLWithPath:[workset resultFilename]]];
688 - (IBAction)newParameter:(id)sender {
690 [[workset parameterSet] addParameter:@"name" withValue:@"value"];
695 - (IBAction)removeParameter:(id)sender {
697 int row = [parameterTable selectedRow];
700 [[workset parameterSet] removeParameterAtIndex:row];
708 - (int)numberOfRowsInTableView:(NSTableView *)aTableView {
709 return [[workset parameterSet] count];
712 - (id)tableView:(NSTableView *)aTableView
713 objectValueForTableColumn:(NSTableColumn *)aTableColumn
716 return [[workset parameterSet] getField:[aTableColumn identifier] atIndex:rowIndex];
721 - (void)tableView:(NSTableView *)aTableView
722 setObjectValue:(id)anObject
723 forTableColumn:(NSTableColumn *)aTableColumn
726 [[workset parameterSet] setField:[aTableColumn identifier] atIndex:rowIndex toString:anObject];
732 - (IBAction)setProcessorType:(id)sender {
734 int newType = [sender tag];
736 if ([processor processorType] == newType) {
740 [self switchProcessorToType:newType updateUI:NO];
742 NSLog(@"change processor type menu: %d", [sender tag]);
747 - (IBAction)switchProcessorToType:(int)newType updateUI:(BOOL)updateUI {
749 XSLTProcessor *newProcessor = nil;
751 newProcessor = [XSLTProcessorFactory makeProcessorOfType:newType];
754 NSLog(@"Unable to create new processor of type '%d'", newType);
758 processor = newProcessor;
761 [processorTypePopUp selectItemAtIndex:[processorTypePopUp indexOfItemWithTag:newType]];
769 - (id)handleProcessScriptCommand:(NSScriptCommand *)command {
771 if ([self canProcessNow]) {
780 - (id)handleExportScriptCommand:(NSScriptCommand *)command {
782 NSDictionary *args = [command evaluatedArguments];
783 NSString *file = [args objectForKey:@"File"];
789 [workset setResultFilename:file];
791 [self saveResult:nil];
798 - (id)handleSetParamScriptCommand:(NSScriptCommand *)command {
800 NSDictionary *args = [command evaluatedArguments];
801 NSString *paramName = [args objectForKey:@"Name"];
802 NSString *paramValue = [args objectForKey:@"Value"];
804 [[workset parameterSet] removeParameterByName:paramName];
806 [[workset parameterSet] addParameter:paramName withValue:paramValue];
813 - (id)handleClearParamScriptCommand:(NSScriptCommand *)command {
815 NSDictionary *args = [command evaluatedArguments];
816 NSString *paramName = [args objectForKey:@"Name"];
818 [[workset parameterSet] removeParameterByName:paramName];
823 - (id)handleSetProcessorTypeScriptCommand:(NSScriptCommand *)command {
825 NSDictionary *args = [command evaluatedArguments];
826 NSString *processorType = [args objectForKey:@"Name"];
828 if ([processorType caseInsensitiveCompare:@"libxslt"] == NSOrderedSame) {
830 [self switchProcessorToType:PROCESSORTYPE_LIBXSLT updateUI:YES];
832 } else if ([processorType caseInsensitiveCompare:@"sablotron"] == NSOrderedSame) {
834 [self switchProcessorToType:PROCESSORTYPE_SABLOTRON updateUI:YES];
836 } else if ([processorType caseInsensitiveCompare:@"saxon"] == NSOrderedSame) {
838 [self switchProcessorToType:PROCESSORTYPE_SAXON updateUI:YES];
840 } else if ([processorType caseInsensitiveCompare:@"xalan-j"] == NSOrderedSame) {
842 [self switchProcessorToType:PROCESSORTYPE_XALAN_J updateUI:YES];
845 NSLog(@"unknown processor");
853 - (BOOL)handleDroppedFile:(NSString *)filename forTextView:(NSTextView *)sender {
856 NSString *fileContents = [NSString stringWithContentsOfFile:filename];
858 if (fileContents == nil) {
862 if ([sender isEqual:xmlView]) {
864 [self setXmlcode:fileContents];
865 [workset setXmlFilename:filename];
867 } else if ([sender isEqual:xsltView]) {
869 [self setXsltcode:fileContents];
870 [workset setXsltFilename:filename];
874 NSLog(@"Unknown sender view");
884 - (NSString *)xmlcode {
885 return [workset xmlCode];
888 - (void)setXmlcode:(NSString *)s {
890 NSString *currentContents = [[[NSString alloc] initWithString:[self xmlcode]] autorelease];
892 [[self undoManager] registerUndoWithTarget:self
893 selector:@selector(setXmlcode:)
894 object:currentContents];
896 [workset setXmlCode:s];
897 [self updateCompleteUI];
902 - (NSString *)xsltcode {
903 return [workset xsltCode];
906 - (void)setXsltcode:(NSString *)s {
908 NSString *currentContents = [[[NSString alloc] initWithString:[self xsltcode]] autorelease];
910 [[self undoManager] registerUndoWithTarget:self
911 selector:@selector(setXsltcode:)
912 object:currentContents];
914 [workset setXsltCode:s];
915 [self updateCompleteUI];
919 - (NSString *)result {
920 return [workset result];
925 - (void)tableViewSelectionDidChange:(NSNotification *)notification {
930 - (void)checkForExternalModifications {
934 if ([workset xmlModifiedExternally] && xmlDirty || [workset xsltModifiedExternally] && xsltDirty) {
936 /* external changes conflicting with local changes detected.
937 * Ask the user if we should keep the local unsaved changes
939 keep = [self showUnsavedChangesPanel];
943 if ([workset xmlModifiedExternally] && !(xmlDirty && keep)) {
944 [workset reloadXmlFromFile];
945 [self updateChangeCount:NSChangeDone];
946 [self updateCompleteUI];
950 if ([workset xsltModifiedExternally] && !(xsltDirty && keep)) {
951 [workset reloadXsltFromFile];
952 [self updateChangeCount:NSChangeDone];
953 [self updateCompleteUI];
962 - (BOOL)showUnsavedChangesPanel {
964 [NSApp beginSheet:[unsavedChangesPanelController window]
965 modalForWindow:[[[self windowControllers] objectAtIndex:0] window]
970 [NSApp runModalForWindow:[unsavedChangesPanelController window]];
971 [NSApp endSheet:[unsavedChangesPanelController window]];
972 [[unsavedChangesPanelController window] orderOut:self];
974 return ([unsavedChangesPanelController keepChanges]);
978 - (IBAction)renderFo:(id)sender {
980 XSL_FO_Renderer *xfr = [[XSL_FO_Renderer alloc] init];
982 NSData *resultData = [xfr render:[workset result]];
986 pdfData = resultData;
988 NSImage *pdfImage = [[[NSImage alloc] initWithData:resultData] autorelease];
989 [pdfImage setBackgroundColor:[NSColor whiteColor]];
990 [pdfImage setCacheMode:NSImageCacheNever];
992 [resultImageView setImage:pdfImage];
993 [resultImageView setFrameSize:[pdfImage size]];
995 //:[[[pdfImage representations] objectAtIndex:0] bounds]
996 //[resultImageView sizeToFit];
998 //[resultImageView setNeedsDisplay:YES];
1000 NSLog(@"image reps: -%@-", [pdfImage representations]);
1001 NSLog(@"count: -%d-", [[[pdfImage representations] objectAtIndex:0] pageCount]);
1003 pdfPageCount = [[[pdfImage representations] objectAtIndex:0] pageCount];
1011 - (IBAction)pdfPreviousPage:(id)sender {
1013 if (pdfCurrentPage > 0) {
1015 [[[[resultImageView image] representations] objectAtIndex:0] setCurrentPage:pdfCurrentPage];
1016 [resultImageView setNeedsDisplay:YES];
1022 - (IBAction)pdfNextPage:(id)sender {
1024 if (pdfCurrentPage < (pdfPageCount - 1)) {
1026 [[[[resultImageView image] representations] objectAtIndex:0] setCurrentPage:pdfCurrentPage];
1027 [resultImageView setNeedsDisplay:YES];
1034 - (IBAction)pdfSaveAs:(id)sender {
1036 NSSavePanel *panel = [NSSavePanel savePanel];
1038 if ([panel runModal] == NSFileHandlingPanelOKButton) {
1040 [pdfData writeToFile:[panel filename] atomically:YES];
1049 - (void)windowDidBecomeMain:(NSNotification *)aNotification {
1051 [self checkForExternalModifications];
1055 - (void)windowDidResize:(NSNotification *)aNotification {
1057 [self resizeWebView];
1061 - (void)resizeWebView {
1063 [[[resultWebView mainFrame] frameView] setFrame:[resultWebView frame]];
1064 [resultWebView setNeedsDisplay:YES];
1072 - (NSString *)windowNibName
1074 // Override returning the nib file name of the document
1075 // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead.
1076 return @"MyDocument";
1079 - (void)windowControllerDidLoadNib:(NSWindowController *) aController
1081 NSFont *computerFont = [resultView font];
1083 NSLog(@"resultview: ", resultView);
1084 NSLog(@"font: ", computerFont);
1086 NSSize errorDrawerSize;
1088 [super windowControllerDidLoadNib:aController];
1090 [resultImageView setImageAlignment:NSImageAlignTopLeft];
1091 // [resultImageView setImageFrameStyle:NSImageFrameGroove];
1092 [resultImageView setImageScaling:NSScaleNone];
1093 [resultImageView setEditable:NO];
1096 // Add any code here that need to be executed once the windowController has loaded the document's window.
1098 // register our two input text views to receive file drags
1100 // [xmlView registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
1101 // [xsltView registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
1104 [xmlView setFont:computerFont];
1105 [xsltView setFont:computerFont];
1107 [xmlView setAllowsUndo:YES];
1108 [xsltView setAllowsUndo:YES];
1110 [resultWebView setTextSizeMultiplier:0.9];
1112 warningIcon = [xmlWellFormedIcon image];
1114 [self updateCompleteUI];
1116 errorDrawerSize = [errorDrawer contentSize];
1117 errorDrawerSize.height = 130;
1118 [errorDrawer setContentSize:errorDrawerSize];
1120 if (findPanelController == nil) {
1121 findPanelController = [[FindPanelController alloc] initWithWindowNibName:@"FindPanel"];
1122 // NSLog(@"init find panel controller: %@", findPanelController);
1125 if (jumpToLinePanelController == nil) {
1126 jumpToLinePanelController = [[JumpToLinePanelController alloc] initWithWindowNibName:@"JumpToLine"];
1127 // NSLog(@"init jump to line panel controller: %@", jumpToLinePanelController);
1130 if (unsavedChangesPanelController == nil) {
1131 unsavedChangesPanelController = [[UnsavedChangesPanelController alloc] initWithWindowNibName:@"UnsavedChanges"];
1132 // NSLog(@"init unsaved changes panel controller: %@", unsavedChangesPanelController);
1142 - (IBAction)showErrorLocation:(id)sender {
1144 XMLTextView *textView;
1147 if ([processor errorSource] == XSLT_ERROR_SOURCE_XML) {
1148 [self selectTabById:XML];
1151 [self selectTabById:XSLT];
1152 textView = xsltView;
1155 errorLine = [processor errorLine];
1157 [textView selectLineByNumber:errorLine];
1161 - (NSData *)dataRepresentationOfType:(NSString *)aType
1163 // Insert code here to write your document from the given data. You can also choose to override -fileWrapperRepresentationOfType: or -writeToFile:ofType: instead.
1164 return [NSArchiver archivedDataWithRootObject:workset];
1167 - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType
1169 // Insert code here to read your document from the given data. You can also choose to override -loadFileWrapperRepresentation:ofType: or -readFromFile:ofType: instead.
1172 workset = [[NSUnarchiver unarchiveObjectWithData:data] retain];
1173 [self updateCompleteUI];