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];
85 - (void)textViewDidChangeSelection:(NSNotification *)aNotification {
90 - (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem {
92 [[self undoManager] removeAllActions];
102 // NSLog(@"updateUI running...");
104 [uiUpdateTimer invalidate];
105 [uiUpdateTimer release];
107 uiUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(uiUpdateTimerTarget:) userInfo:nil repeats:NO];
109 [uiUpdateTimer retain];
113 - (void)uiUpdateTimerTarget:(NSTimer *)timer {
124 NSString *activeTabIdentifier = [[tabView selectedTabViewItem] identifier];
125 NSString *activeResultTabIdentifier = [[resultTabView selectedTabViewItem] identifier];
127 BOOL xmlTabIsVisible = [activeTabIdentifier isEqualToString:@"xmlTab"];
128 BOOL xsltTabIsVisible = !xmlTabIsVisible && [activeTabIdentifier isEqualToString:@"xsltTab"];
129 BOOL paramTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible) && [activeTabIdentifier isEqualToString:@"parametersTab"];
130 BOOL resultTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible || paramTabIsVisible);
131 BOOL resultTabHtmlIsVisible = resultTabIsVisible && [activeResultTabIdentifier isEqualToString:@"htmlResult"];
132 BOOL resultTabXslfoIsVisible = resultTabIsVisible && !resultTabHtmlIsVisible && [activeResultTabIdentifier isEqualToString:@"xslfoResult"];
133 BOOL resultTabTextIsVisible = resultTabIsVisible && !(resultTabHtmlIsVisible || resultTabXslfoIsVisible);
135 // NSLog(@"xml: %d, xslt: %d, param: %d, result: %d, reshtml: %d, resxslfo: %d, restext: %d", xmlTabIsVisible, xsltTabIsVisible, paramTabIsVisible, resultTabIsVisible, resultTabHtmlIsVisible, resultTabXslfoIsVisible, resultTabTextIsVisible);
137 if (xmlTabIsVisible) {
138 [saveXmlFilenameField setObjectValue:[workset xmlFilename]];
139 [saveXmlFilenameField setToolTip:[workset xmlFilename]];
140 [saveXmlButton setEnabled:[workset hasXmlFilename] && xmlDirty];
141 [saveXmlAsButton setEnabled:[workset hasXmlCode]];
142 [xmlTagStackField setStringValue:[xmlView calculateTagStack]];
144 [xmlView checkWellFormed];
145 if ([workset hasXmlCode] && [xmlView hasError]) {
146 [xmlWellFormedIcon setImage:warningIcon];
147 [xmlWellFormedIcon setToolTip:[xmlView valueForKey:@"errorString"]];
149 [xmlWellFormedIcon setImage:nil];
150 [xmlWellFormedIcon setToolTip:nil];
153 } else if (xsltTabIsVisible) {
154 [saveXsltFilenameField setObjectValue:[workset xsltFilename]];
155 [saveXsltFilenameField setToolTip:[workset xsltFilename]];
156 [saveXsltButton setEnabled:[workset hasXsltFilename] && xsltDirty];
157 [saveXsltAsButton setEnabled:[workset hasXsltCode]];
158 [xsltTagStackField setStringValue:[xsltView calculateTagStack]];
160 [xsltView checkWellFormed];
161 if ([workset hasXsltCode] && [xsltView hasError]) {
162 [xsltWellFormedIcon setImage:warningIcon];
163 [xsltWellFormedIcon setToolTip:[xsltView valueForKey:@"errorString"]];
165 [xsltWellFormedIcon setImage:nil];
166 [xsltWellFormedIcon setToolTip:nil];
169 } else if (paramTabIsVisible) {
170 [paramRemoveButton setEnabled:[parameterTable selectedRow] != -1];
171 [parameterTable reloadData];
172 } else if (resultTabIsVisible) {
173 [saveResultAsButton setEnabled:[workset hasResult]];
174 [saveResultButton setEnabled:[workset hasResultFilename] && resultDirty];
175 [autoSaveCheckbox setEnabled:[workset hasResultFilename]];
176 [openResultURLButton setEnabled:[workset hasResultFilename]];
177 [autoShowCheckbox setEnabled:[openResultURLButton isEnabled]];
178 [saveResultFilenameField setObjectValue:[workset resultFilename]];
179 [saveResultFilenameField setToolTip:[workset resultFilename]];
181 if (resultTabHtmlIsVisible) {
182 [self resizeWebView];
183 [self updateResultWebView];
184 } else if (resultTabXslfoIsVisible) {
185 [self updateResultImageView];
186 [pdfCurrentPageField setIntValue: (pdfPageCount ? (pdfCurrentPage + 1) : 0)];
187 [pdfPageCountField setIntValue:pdfPageCount];
189 [pdfPreviousPageButton setEnabled:pdfCurrentPage > 0];
190 [pdfNextPageButton setEnabled:pdfCurrentPage < (pdfPageCount - 1)];
191 [pdfSaveAsButton setEnabled:(pdfPageCount > 0)];
192 // } else if (resultTabTextIsVisible) {
198 [processButton setEnabled:[self canProcessNow]];
200 // move this to xmlview.
201 // [self updateWellFormedIcons];
205 [resultView setString:[workset stringResult]];
210 - (void)updateResultWebView {
211 if (!webViewUpToDate) {
212 WebFrame *mainFrame = [resultWebView mainFrame];
213 [mainFrame loadHTMLString:[workset stringResult] baseURL:nil];
214 webViewUpToDate = YES;
219 - (void)updateResultImageView {
220 if (!imageViewUpToDate) {
221 [self renderFo:self];
222 imageViewUpToDate = YES;
228 - (BOOL)canProcessNow {
230 return [workset hasXmlCode] && [workset hasXsltCode];
234 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
236 // NSLog(@"validate: %@, tag: %d", menuItem, [menuItem tag]);
238 switch ([menuItem tag]) {
241 return [self canProcessNow];
245 return [workset hasResultFilename];
249 return [self canFindNow];
252 case 13: // Find Next
253 case 14: // Find Previous
254 return [self canFindAgainNow];
257 case 15: // Use Selection for Find
258 return [self canUseSelectionForFindNow];
261 case 16: // Jump to Line
262 return [self canJumpToLineNow];
275 - (IBAction)showInBrowser:(id)sender {
282 - (void)updateCompleteUI {
284 [xmlView setString:[workset xmlCode]];
285 [xsltView setString:[workset xsltCode]];
290 - (void)textDidChange:(NSNotification *)aNotification {
292 id sender = [aNotification object];
294 if ([sender isEqual:xmlView]) {
295 [workset setXmlCode:[xmlView string]];
297 } else if ([sender isEqual:xsltView]) {
298 [workset setXsltCode:[xsltView string]];
302 [self updateChangeCount:NSChangeDone];
309 - (NSTabView *)tabView {
315 - (BOOL)canJumpToLineNow {
317 NSTextView *view = [self currentTextView];
319 return (view == xmlView) || (view == xsltView);
324 - (IBAction)showJumpToLinePanel:(id)sender {
326 [NSApp beginSheet:[jumpToLinePanelController window]
327 modalForWindow:[[[self windowControllers] objectAtIndex:0] window]
332 [NSApp runModalForWindow:[jumpToLinePanelController window]];
333 [NSApp endSheet:[jumpToLinePanelController window]];
334 [[jumpToLinePanelController window] orderOut:self];
336 if ([jumpToLinePanelController lineNumber] == 0) {
340 [((XMLTextView *)[self currentTextView]) selectLineByNumber:[jumpToLinePanelController lineNumber]];
342 // NSLog(@"jump to line: %d", [jumpToLinePanelController lineNumber]);
347 - (IBAction)showFindPanel:(id)sender {
349 [findPanelController refresh];
351 [NSApp beginSheet:[findPanelController window]
352 modalForWindow:[[[self windowControllers] objectAtIndex:0] window]
357 [NSApp runModalForWindow:[findPanelController window]];
358 [NSApp endSheet:[findPanelController window]];
359 [[findPanelController window] orderOut:self];
361 if ([findPanelController aborted]) {
365 [self findStringWithSearchFlags:[findPanelController searchFlags]];
372 - (IBAction)findNext:(id)sender {
374 [self findStringWithSearchFlags:[findPanelController searchFlags] & NSCaseInsensitiveSearch];
379 - (IBAction)findPrevious:(id)sender {
381 [self findStringWithSearchFlags:([findPanelController searchFlags] | NSBackwardsSearch)];
385 - (BOOL)canUseSelectionForFindNow {
387 NSTextView *view = [self currentTextView];
388 NSRange selectedRange;
394 selectedRange = [view selectedRange];
396 if (selectedRange.length < 1) {
406 - (IBAction)useSelectionForFind:(id)sender {
409 NSTextView *view = [self currentTextView];
411 text = [[view string] substringWithRange:[view selectedRange]];
413 [findPanelController setFindString:text];
422 NSString *currentTabViewItem = [[[self tabView] selectedTabViewItem] identifier];
424 if ([currentTabViewItem isEqualToString:@"xmlTab"]
425 || [currentTabViewItem isEqualToString:@"xsltTab"]
426 || [currentTabViewItem isEqualToString:@"resultTab"]) {
434 - (BOOL)canFindAgainNow {
436 return ([findPanelController findString] != nil) && [self canFindNow];
441 - (void)findStringWithSearchFlags:(int)flags {
443 NSTextView *currentView;
446 NSRange selectedRange, leftRange, rightRange, resultRange, searchRange;
448 NSPasteboard *findBoard = [NSPasteboard pasteboardWithName:NSFindPboard];
450 string = [findBoard stringForType:NSStringPboardType];
452 currentView = [self currentTextView];
453 if (currentView == nil) {
457 text = [currentView string];
459 selectedRange = [currentView selectedRange];
460 leftRange = NSMakeRange(0, selectedRange.location);
461 rightRange = NSMakeRange(NSMaxRange(selectedRange), [text length] - NSMaxRange(selectedRange));
463 if (flags & NSBackwardsSearch) {
464 searchRange = leftRange;
466 searchRange = rightRange;
469 resultRange = [text rangeOfString:string options:flags range:searchRange];
471 if (resultRange.location == NSNotFound) {
476 [currentView setSelectedRange:resultRange];
477 [currentView scrollRangeToVisible:resultRange];
484 - (NSTextView *)currentTextView {
486 NSString *currentTabViewItem = [[[self tabView] selectedTabViewItem] identifier];
488 if ([currentTabViewItem isEqualToString:@"xmlTab"]) {
490 } else if ([currentTabViewItem isEqualToString:@"xsltTab"]) {
492 } else if ([currentTabViewItem isEqualToString:@"resultTab"]) {
504 - (IBAction)process:(id)sender {
507 const char **params = [[workset parameterSet] cArray];
509 struct timeval tstart, tend;
510 gettimeofday(&tstart, NULL);
514 if ([workset hasXsltFilename]) {
515 [processor setBaseUri:[NSString stringWithFormat:@"file://%@", [workset xsltFilename]]];
518 if (![processor processStrings:[XMLUtils getDataWithEncodingFromString:[workset xmlCode]] withXslt:[XMLUtils getDataWithEncodingFromString:[workset xsltCode]] andParameters:params]) {
520 [drawerMessageField setStringValue:[NSString stringWithFormat:@"Error on line %d of your %@ code:\n%@", [processor errorLine], ([processor errorSource] == XSLT_ERROR_SOURCE_XML ? @"XML" : @"XSLT"), [processor errorMessage]]];
523 [errorDrawer openOnEdge:NSMinYEdge];
524 [self showErrorLocation:nil];
528 gettimeofday(&tend, NULL);
530 processingTime = ((tend.tv_sec * 1000000 + tend.tv_usec) - (tstart.tv_sec * 1000000 + tstart.tv_usec)) / 1000;
532 [workset setResult:[processor result]];
533 [workset setResultEncoding:[processor resultEncoding]];
537 [self selectTabById:RESULT];
538 [processingTimeField setStringValue:[NSString stringWithFormat:@"Time: %ldms", processingTime]];
541 webViewUpToDate = NO;
542 imageViewUpToDate = NO;
550 if (resultDirty && [autoSaveCheckbox state] == NSOnState) {
551 [self saveResult:nil];
558 if ([autoShowCheckbox state] == NSOnState) {
559 [self openResultURL:nil];
565 - (IBAction)loadXml:(id)sender {
567 NSOpenPanel *panel = [NSOpenPanel openPanel];
569 if ([panel runModalForDirectory:nil file:nil types:nil] == NSOKButton) {
571 // NSLog(@"choosen: %@", [[panel filenames] objectAtIndex:0]);
573 [workset setXmlCode:[XMLUtils getStringWithEncodingFromFile:[[panel filenames] objectAtIndex:0]]];
574 [workset setXmlFilename:[[panel filenames] objectAtIndex:0]];
575 [self updateChangeCount:NSChangeDone];
576 [self updateCompleteUI];
584 - (IBAction)loadXslt:(id)sender {
586 NSOpenPanel *panel = [NSOpenPanel openPanel];
588 if ([panel runModalForDirectory:nil file:nil types:nil] == NSOKButton) {
590 // NSLog(@"choosen: %@", [[panel filenames] objectAtIndex:0]);
592 [workset setXsltCode:[XMLUtils getStringWithEncodingFromFile:[[panel filenames] objectAtIndex:0]]];
593 [workset setXsltFilename:[[panel filenames] objectAtIndex:0]];
594 [self updateChangeCount:NSChangeDone];
595 [self updateCompleteUI];
602 - (IBAction)saveXmlAs:(id)sender {
604 NSSavePanel *panel = [NSSavePanel savePanel];
606 if ([panel runModal] == NSFileHandlingPanelOKButton) {
608 [workset setXmlFilename:[panel filename]];
616 - (IBAction)saveXml:(id)sender {
619 if ([workset hasXmlFilename]) {
628 - (IBAction)saveXsltAs:(id)sender {
630 NSSavePanel *panel = [NSSavePanel savePanel];
632 if ([panel runModal] == NSFileHandlingPanelOKButton) {
634 [workset setXsltFilename:[panel filename]];
642 - (IBAction)saveXslt:(id)sender {
644 if ([workset hasXsltFilename]) {
654 - (IBAction)saveResultAs:(id)sender {
656 NSSavePanel *panel = [NSSavePanel savePanel];
658 if ([panel runModal] == NSFileHandlingPanelOKButton) {
660 [workset setResultFilename:[panel filename]];
662 [self saveResult:nil];
667 - (IBAction)saveResult:(id)sender {
669 if ([workset hasResultFilename]) {
671 [[workset result] writeToFile:[workset resultFilename] atomically:NO];
682 - (IBAction)openResultURL:(id)sender {
684 // NSLog(@"openResultURL running...");
686 if ([workset hasResultFilename]) {
688 [[NSWorkspace sharedWorkspace] openURL:[NSURL fileURLWithPath:[workset resultFilename]]];
694 - (IBAction)newParameter:(id)sender {
696 [[workset parameterSet] addParameter:@"name" withValue:@"value"];
701 - (IBAction)removeParameter:(id)sender {
703 int row = [parameterTable selectedRow];
706 [[workset parameterSet] removeParameterAtIndex:row];
714 - (int)numberOfRowsInTableView:(NSTableView *)aTableView {
715 return [[workset parameterSet] count];
718 - (id)tableView:(NSTableView *)aTableView
719 objectValueForTableColumn:(NSTableColumn *)aTableColumn
722 return [[workset parameterSet] getField:[aTableColumn identifier] atIndex:rowIndex];
727 - (void)tableView:(NSTableView *)aTableView
728 setObjectValue:(id)anObject
729 forTableColumn:(NSTableColumn *)aTableColumn
732 [[workset parameterSet] setField:[aTableColumn identifier] atIndex:rowIndex toString:anObject];
738 - (IBAction)setProcessorType:(id)sender {
740 int newType = [sender tag];
742 if ([processor processorType] == newType) {
746 [self switchProcessorToType:newType updateUI:NO];
751 - (IBAction)switchProcessorToType:(int)newType updateUI:(BOOL)updateUI {
753 XSLTProcessor *newProcessor = nil;
755 newProcessor = [XSLTProcessorFactory makeProcessorOfType:newType];
758 NSLog(@"Unable to create new processor of type '%d'", newType);
762 processor = newProcessor;
765 [processorTypePopUp selectItemAtIndex:[processorTypePopUp indexOfItemWithTag:newType]];
773 - (id)handleProcessScriptCommand:(NSScriptCommand *)command {
775 if ([self canProcessNow]) {
784 - (id)handleExportScriptCommand:(NSScriptCommand *)command {
786 NSDictionary *args = [command evaluatedArguments];
787 NSString *file = [args objectForKey:@"File"];
793 [workset setResultFilename:file];
795 [self saveResult:nil];
802 - (id)handleSetParamScriptCommand:(NSScriptCommand *)command {
804 NSDictionary *args = [command evaluatedArguments];
805 NSString *paramName = [args objectForKey:@"Name"];
806 NSString *paramValue = [args objectForKey:@"Value"];
808 [[workset parameterSet] removeParameterByName:paramName];
810 [[workset parameterSet] addParameter:paramName withValue:paramValue];
817 - (id)handleClearParamScriptCommand:(NSScriptCommand *)command {
819 NSDictionary *args = [command evaluatedArguments];
820 NSString *paramName = [args objectForKey:@"Name"];
822 [[workset parameterSet] removeParameterByName:paramName];
827 - (id)handleSetProcessorTypeScriptCommand:(NSScriptCommand *)command {
829 NSDictionary *args = [command evaluatedArguments];
830 NSString *processorType = [args objectForKey:@"Name"];
832 if ([processorType caseInsensitiveCompare:@"libxslt"] == NSOrderedSame) {
834 [self switchProcessorToType:PROCESSORTYPE_LIBXSLT updateUI:YES];
836 } else if ([processorType caseInsensitiveCompare:@"sablotron"] == NSOrderedSame) {
838 [self switchProcessorToType:PROCESSORTYPE_SABLOTRON updateUI:YES];
840 } else if ([processorType caseInsensitiveCompare:@"saxon"] == NSOrderedSame) {
842 [self switchProcessorToType:PROCESSORTYPE_SAXON updateUI:YES];
844 } else if ([processorType caseInsensitiveCompare:@"xalan-j"] == NSOrderedSame) {
846 [self switchProcessorToType:PROCESSORTYPE_XALAN_J updateUI:YES];
849 NSLog(@"unknown processor");
857 - (BOOL)handleDroppedFile:(NSString *)filename forTextView:(NSTextView *)sender {
859 NSString *fileContents = [XMLUtils getStringWithEncodingFromFile:filename];
861 if ([sender isEqual: xmlView]) {
863 [self setXmlcode:fileContents];
864 [workset setXmlFilename:filename];
866 } else if ([sender isEqual:xsltView]) {
868 [self setXsltcode:fileContents];
869 [workset setXsltFilename:filename];
873 NSLog(@"Unknown sender view");
885 - (NSString *)xmlcode {
886 return [workset xmlCode];
889 - (void)setXmlcode:(NSString *)s {
891 NSString *currentContents = [[[NSString alloc] initWithString:[self xmlcode]] autorelease];
893 [[self undoManager] registerUndoWithTarget:self
894 selector:@selector(setXmlcode:)
895 object:currentContents];
897 [workset setXmlCode:s];
898 [self updateCompleteUI];
903 - (NSString *)xsltcode {
904 return [workset xsltCode];
907 - (void)setXsltcode:(NSString *)s {
909 NSString *currentContents = [[[NSString alloc] initWithString:[self xsltcode]] autorelease];
911 [[self undoManager] registerUndoWithTarget:self
912 selector:@selector(setXsltcode:)
913 object:currentContents];
915 [workset setXsltCode:s];
916 [self updateCompleteUI];
920 - (NSString *)result {
921 return [workset stringResult];
926 - (void)tableViewSelectionDidChange:(NSNotification *)notification {
931 - (void)checkForExternalModifications {
935 if ([workset xmlModifiedExternally] && xmlDirty || [workset xsltModifiedExternally] && xsltDirty) {
937 /* external changes conflicting with local changes detected.
938 * Ask the user if we should keep the local unsaved changes
940 keep = [self showUnsavedChangesPanel];
944 if ([workset xmlModifiedExternally] && !(xmlDirty && keep)) {
945 [workset reloadXmlFromFile];
946 [self updateChangeCount:NSChangeDone];
947 [self updateCompleteUI];
951 if ([workset xsltModifiedExternally] && !(xsltDirty && keep)) {
952 [workset reloadXsltFromFile];
953 [self updateChangeCount:NSChangeDone];
954 [self updateCompleteUI];
963 - (BOOL)showUnsavedChangesPanel {
965 [NSApp beginSheet:[unsavedChangesPanelController window]
966 modalForWindow:[[[self windowControllers] objectAtIndex:0] window]
971 [NSApp runModalForWindow:[unsavedChangesPanelController window]];
972 [NSApp endSheet:[unsavedChangesPanelController window]];
973 [[unsavedChangesPanelController window] orderOut:self];
975 return ([unsavedChangesPanelController keepChanges]);
979 - (IBAction)renderFo:(id)sender {
981 XSL_FO_Renderer *xfr = [[XSL_FO_Renderer alloc] init];
983 NSData *resultData = [xfr render:[workset result]];
987 pdfData = resultData;
989 NSImage *pdfImage = [[[NSImage alloc] initWithData:resultData] autorelease];
990 [pdfImage setBackgroundColor:[NSColor whiteColor]];
991 [pdfImage setCacheMode:NSImageCacheNever];
993 [resultImageView setImage:pdfImage];
994 [resultImageView setFrameSize:[pdfImage size]];
996 //:[[[pdfImage representations] objectAtIndex:0] bounds]
997 //[resultImageView sizeToFit];
999 //[resultImageView setNeedsDisplay:YES];
1001 //NSLog(@"image reps: -%@-", [pdfImage representations]);
1002 //NSLog(@"count: -%d-", [[[pdfImage representations] objectAtIndex:0] pageCount]);
1004 pdfPageCount = [[[pdfImage representations] objectAtIndex:0] pageCount];
1012 - (IBAction)pdfPreviousPage:(id)sender {
1014 if (pdfCurrentPage > 0) {
1016 [[[[resultImageView image] representations] objectAtIndex:0] setCurrentPage:pdfCurrentPage];
1017 [resultImageView setNeedsDisplay:YES];
1023 - (IBAction)pdfNextPage:(id)sender {
1025 if (pdfCurrentPage < (pdfPageCount - 1)) {
1027 [[[[resultImageView image] representations] objectAtIndex:0] setCurrentPage:pdfCurrentPage];
1028 [resultImageView setNeedsDisplay:YES];
1035 - (IBAction)pdfSaveAs:(id)sender {
1037 NSSavePanel *panel = [NSSavePanel savePanel];
1039 if ([panel runModal] == NSFileHandlingPanelOKButton) {
1041 [pdfData writeToFile:[panel filename] atomically:YES];
1050 - (void)windowDidBecomeMain:(NSNotification *)aNotification {
1052 [self checkForExternalModifications];
1056 - (void)windowDidResize:(NSNotification *)aNotification {
1058 [self resizeWebView];
1062 - (void)resizeWebView {
1064 [[[resultWebView mainFrame] frameView] setFrame:[resultWebView frame]];
1065 [resultWebView setNeedsDisplay:YES];
1073 - (NSString *)windowNibName
1075 // Override returning the nib file name of the document
1076 // 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.
1077 return @"MyDocument";
1080 - (void)windowControllerDidLoadNib:(NSWindowController *) aController
1085 NSSize errorDrawerSize;
1087 [super windowControllerDidLoadNib:aController];
1089 [resultImageView setImageAlignment:NSImageAlignTopLeft];
1090 // [resultImageView setImageFrameStyle:NSImageFrameGroove];
1091 [resultImageView setImageScaling:NSScaleNone];
1092 [resultImageView setEditable:NO];
1096 [resultWebView setTextSizeMultiplier:0.9];
1098 warningIcon = [xmlWellFormedIcon image];
1100 [self updateCompleteUI];
1102 errorDrawerSize = [errorDrawer contentSize];
1103 errorDrawerSize.height = 130;
1104 [errorDrawer setContentSize:errorDrawerSize];
1109 if (findPanelController == nil) {
1110 findPanelController = [[FindPanelController alloc] initWithWindowNibName:@"FindPanel"];
1111 // NSLog(@"init find panel controller: %@", findPanelController);
1114 if (jumpToLinePanelController == nil) {
1115 jumpToLinePanelController = [[JumpToLinePanelController alloc] initWithWindowNibName:@"JumpToLine"];
1116 // NSLog(@"init jump to line panel controller: %@", jumpToLinePanelController);
1119 if (unsavedChangesPanelController == nil) {
1120 unsavedChangesPanelController = [[UnsavedChangesPanelController alloc] initWithWindowNibName:@"UnsavedChanges"];
1121 // NSLog(@"init unsaved changes panel controller: %@", unsavedChangesPanelController);
1130 - (IBAction)showErrorLocation:(id)sender {
1132 XMLTextView *textView;
1135 if ([processor errorSource] == XSLT_ERROR_SOURCE_XML) {
1136 [self selectTabById:XML];
1139 [self selectTabById:XSLT];
1140 textView = xsltView;
1143 errorLine = [processor errorLine];
1145 [textView selectLineByNumber:errorLine];
1149 - (NSData *)dataRepresentationOfType:(NSString *)aType
1151 // Insert code here to write your document from the given data. You can also choose to override -fileWrapperRepresentationOfType: or -writeToFile:ofType: instead.
1152 return [NSArchiver archivedDataWithRootObject:workset];
1155 - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType
1157 // Insert code here to read your document from the given data. You can also choose to override -loadFileWrapperRepresentation:ofType: or -readFromFile:ofType: instead.
1160 workset = [[NSUnarchiver unarchiveObjectWithData:data] retain];
1161 [self updateCompleteUI];