moved saxon and xalan to libs subdir
[TestXSLT.git] / MyDocument.m
index 89c6611..c122af3 100644 (file)
@@ -9,7 +9,7 @@
 
 #import "MyDocument.h"
 #import "Workset.h"
-
+#import <Foundation/NSDebug.h>
 
 
 
@@ -17,6 +17,8 @@
 
 - (id)init {
 
+//     NSZombieEnabled = YES;
+       
        if (self = [super init]) {
                workset = [[Workset alloc] init];
                processor = [XSLTProcessorFactory makeProcessorOfType:PROCESSORTYPE_SABLOTRON];
                xsltDirty = NO;
        }
 
-       NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-    NSDictionary *appDefaults = [NSDictionary
-        dictionaryWithObject:@"YES" forKey:@"AnalyzeCode"];
-       
-    [defaults registerDefaults:appDefaults];
-       
+       defaults = [NSUserDefaults standardUserDefaults];
        
        return self;
 }
 
 - (void)dealloc {
 
+       [uiUpdateTimer release];
        [workset release];
        [processor release];
        [wellFormedParser release];
@@ -46,6 +44,7 @@
 
 }
 
+
 - (IBAction)selectTab:(id)sender {
 
        [self selectTabById:[sender tag]];
 }
 
 
-
-
-
-
 - (IBAction)selectTabById:(int)tabId {
 
        NSString *tabName;
                        tabName = @"resultTab";
                        break;
 
-
        }
 
        [tabView selectTabViewItemWithIdentifier:tabName];
 
 }
 
+
 - (void)textViewDidChangeSelection:(NSNotification *)aNotification {
        [self updateUI];
 }
 }
 
 
-
-
 - (void)updateUI {
        
 //     NSLog(@"updateUI running...");
        
 }
 
+
 - (void)uiUpdateTimerTarget:(NSTimer *)timer {
 
        [self doUpdateUI];
 }
 
 
-
-
 - (void)doUpdateUI {
 
        NSString *activeTabIdentifier = [[tabView selectedTabViewItem] identifier];
        BOOL resultTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible || paramTabIsVisible);
        BOOL resultTabHtmlIsVisible = resultTabIsVisible && [activeResultTabIdentifier isEqualToString:@"htmlResult"];
        BOOL resultTabXslfoIsVisible = resultTabIsVisible && !resultTabHtmlIsVisible && [activeResultTabIdentifier isEqualToString:@"xslfoResult"];
-       BOOL resultTabTextIsVisible = resultTabIsVisible && !(resultTabHtmlIsVisible || resultTabXslfoIsVisible);
+//     BOOL resultTabTextIsVisible = resultTabIsVisible && !(resultTabHtmlIsVisible || resultTabXslfoIsVisible);
        
 //     NSLog(@"xml: %d, xslt: %d, param: %d, result: %d, reshtml: %d, resxslfo: %d, restext: %d", xmlTabIsVisible, xsltTabIsVisible, paramTabIsVisible, resultTabIsVisible, resultTabHtmlIsVisible, resultTabXslfoIsVisible, resultTabTextIsVisible);
        
                [saveXmlButton setEnabled:[self canSaveXmlNow]];
                [saveXmlAsButton setEnabled:[self canSaveXmlAsNow]];
                [xmlTagStackField setStringValue:[xmlView calculateTagStack]];
-       
-               [xmlView checkWellFormed];
-               if ([workset hasXmlCode] && [xmlView hasError]) {
-                       [xmlWellFormedIcon setImage:warningIcon];
-                       [xmlWellFormedIcon setToolTip:[xmlView valueForKey:@"errorString"]];
-               } else {
-                       [xmlWellFormedIcon setImage:nil];
-                       [xmlWellFormedIcon setToolTip:nil];
+
+               if ([defaults boolForKey:@"enableWellformedCheck"]) {
+                       [xmlView checkWellFormed];
+                       if ([workset hasXmlCode] && [xmlView hasError]) {
+                               [xmlWellFormedIcon setImage:warningIcon];
+                               [xmlWellFormedIcon setToolTip:[xmlView valueForKey:@"errorString"]];
+                               [self setValue:[xmlView valueForKey:@"errorString"] forKey:@"drawerMessage"];
+                       } else {
+                               [xmlWellFormedIcon setImage:nil];
+                               [xmlWellFormedIcon setToolTip:nil];
+                               [self setValue:nil forKey:@"drawerMessage"];
+                       }
                }
-       
+
        } else if (xsltTabIsVisible) {
                [saveXsltFilenameField setObjectValue:[workset xsltFilename]];
                [saveXsltFilenameField setToolTip:[workset xsltFilename]];
                [saveXsltAsButton setEnabled:[self canSaveXsltAsNow]];
                [xsltTagStackField setStringValue:[xsltView calculateTagStack]];
 
-               [xsltView checkWellFormed];
-               if ([workset hasXsltCode] && [xsltView hasError]) {
-                       [xsltWellFormedIcon setImage:warningIcon];
-                       [xsltWellFormedIcon setToolTip:[xsltView valueForKey:@"errorString"]];
-               } else {
-                       [xsltWellFormedIcon setImage:nil];
-                       [xsltWellFormedIcon setToolTip:nil];
+               if ([defaults boolForKey:@"enableWellformedCheck"]) {
+                       [xsltView checkWellFormed];
+                       if ([workset hasXsltCode] && [xsltView hasError]) {
+                               [xsltWellFormedIcon setImage:warningIcon];
+                               [xsltWellFormedIcon setToolTip:[xsltView valueForKey:@"errorString"]];
+                               [self setValue:[xsltView valueForKey:@"errorString"] forKey:@"drawerMessage"];
+                       } else {
+                               [xsltWellFormedIcon setImage:nil];
+                               [xsltWellFormedIcon setToolTip:nil];
+                               [self setValue:nil forKey:@"drawerMessage"];
+                       }
                }
-
+               
        } else if (paramTabIsVisible) {
                [paramRemoveButton setEnabled:[parameterTable selectedRow] != -1];
                [parameterTable reloadData];
 }
 
 
-
 - (BOOL)canProcessNow {
 
        return [workset hasXmlCode] && [workset hasXsltCode];
 
        }
 
+       return [super validateMenuItem:menuItem];
 
 }
 
 
        if (![processor processStrings:[XMLUtils getDataWithEncodingFromString:[workset xmlCode]] withXslt:[XMLUtils getDataWithEncodingFromString:[workset xsltCode]] andParameters:params]) {
 
-               [drawerMessageField setStringValue:[NSString stringWithFormat:@"Error on line %d of your %@ code:\n%@", [processor errorLine], ([processor errorSource] == XSLT_ERROR_SOURCE_XML ? @"XML" : @"XSLT"), [processor errorMessage]]];
+               [self setValue:[NSString stringWithFormat:@"Error on line %d of your %@ code:\n%@", [processor errorLine], ([processor errorSource] == XSLT_ERROR_SOURCE_XML ? @"XML" : @"XSLT"), [processor errorMessage]] forKey:@"drawerMessage"];
 
                NSBeep();
                [errorDrawer openOnEdge:NSMinYEdge];
                [workset setResultEncoding:[processor resultEncoding]];
                resultDirty = YES;
                [self autoSave];
-               [errorDrawer close];
+//             [errorDrawer close];
                [self selectTabById:RESULT];
                [processingTimeField setStringValue:[NSString stringWithFormat:@"Time: %ldms", processingTime]];
        }
        BOOL resultTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible || paramTabIsVisible);
        
        if (xmlTabIsVisible) {
-               return [self saveXmlAs:sender];
+               [self saveXmlAs:sender];
        } else if (xsltTabIsVisible) {
-               return [self saveXsltAs:sender];
+               [self saveXsltAs:sender];
        } else if (resultTabIsVisible) {
-               return [self saveResultAs:sender];
+               [self saveResultAs:sender];
        }
 
 }
        BOOL resultTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible || paramTabIsVisible);
        
        if (xmlTabIsVisible) {
-               return [self saveXml:sender];
+               [self saveXml:sender];
        } else if (xsltTabIsVisible) {
-               return [self saveXslt:sender];
+               [self saveXslt:sender];
        } else if (resultTabIsVisible) {
-               return [self saveResult:sender];
+               [self saveResult:sender];
        }
        
 }
@@ -1083,24 +1083,36 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn
 
 }
 
-- (IBAction)renderFo:(id)sender {
+- (void)xslfoRenderThread {
 
-       XSL_FO_Renderer *xfr = [[XSL_FO_Renderer alloc] init];
+       NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+       
+       XSL_FO_Renderer *xfr = [[[XSL_FO_Renderer alloc] init] autorelease];
+       xslfoRendererResultData = [xfr render:[workset result]];
+
+       [pool release];
+       [xslfoRendererLock unlockWithCondition:2];
+       
+}
 
-       NSData *resultData = [xfr render:[workset result]];
 
-       [xfr release];
+- (IBAction)renderFo:(id)sender {
 
-       if (!resultData) {
+       xslfoRendererLock = [[[NSConditionLock alloc] initWithCondition:1] autorelease];
+       [NSThread detachNewThreadSelector:@selector(xslfoRenderThread) toTarget:self withObject:nil];
+       [xslfoRendererLock lockWhenCondition:2];
+       [xslfoRendererLock unlock];
+       
+       if (!xslfoRendererResultData) {
                NSLog(@"Unable to render, NULL result");
                return;
        }
        
-       [resultData retain];
+       [xslfoRendererResultData retain];
        [pdfData release];
-       pdfData = resultData;
+       pdfData = xslfoRendererResultData;
        
-       NSImage *pdfImage = [[[NSImage alloc] initWithData:resultData] autorelease];
+       NSImage *pdfImage = [[[NSImage alloc] initWithData:xslfoRendererResultData] autorelease];
        [pdfImage setBackgroundColor:[NSColor whiteColor]];
        [pdfImage recache];
        [pdfImage setCacheMode:NSImageCacheNever];
@@ -1234,13 +1246,23 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn
                unsavedChangesPanelController = [[UnsavedChangesPanelController alloc] initWithWindowNibName:@"UnsavedChanges"];
 //             NSLog(@"init unsaved changes panel controller: %@", unsavedChangesPanelController);
        }
-
        
+}
 
-       
+
+- (void)canCloseDocumentWithDelegate:(id)delegate shouldCloseSelector:(SEL)shouldCloseSelector contextInfo:(void *)contextInfo {
+
+       [uiUpdateTimer invalidate];
+       [super canCloseDocumentWithDelegate:delegate shouldCloseSelector:shouldCloseSelector contextInfo:contextInfo];
 }
 
 
+
+
+
+
+
+
 - (IBAction)showErrorLocation:(id)sender {
 
        XMLTextView *textView;