version 3.1 checkin
[TestXSLT.git] / MyDocument.m
index 893f60b..8dd8eaa 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;
        }
 
-       
+       defaults = [NSUserDefaults standardUserDefaults];
        
        return self;
 }
 
 - (void)dealloc {
 
+       [uiUpdateTimer release];
        [workset release];
        [processor release];
        [wellFormedParser release];
 
        [uiUpdateTimer retain];
 
+       
 }
 
 - (void)uiUpdateTimerTarget:(NSTimer *)timer {
 
 
 
+
 - (void)doUpdateUI {
 
        NSString *activeTabIdentifier = [[tabView selectedTabViewItem] identifier];
        if (xmlTabIsVisible) {
                [saveXmlFilenameField setObjectValue:[workset xmlFilename]];
                [saveXmlFilenameField setToolTip:[workset xmlFilename]];
-               [saveXmlButton setEnabled:[workset hasXmlFilename] && xmlDirty];
-               [saveXmlAsButton setEnabled:[workset hasXmlCode]];
+               [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]];
-               [saveXsltButton setEnabled:[workset hasXsltFilename] && xsltDirty];
-               [saveXsltAsButton setEnabled:[workset hasXsltCode]];
+               [saveXsltButton setEnabled:[self canSaveXsltNow]];
+               [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];
        } else if (resultTabIsVisible) {
-               [saveResultAsButton setEnabled:[workset hasResult]];
-               [saveResultButton setEnabled:[workset hasResultFilename] && resultDirty];
+               [saveResultAsButton setEnabled:[self canSaveResultAsNow]];
+               [saveResultButton setEnabled:[self canSaveResultNow]];
                [autoSaveCheckbox setEnabled:[workset hasResultFilename]];
                [openResultURLButton setEnabled:[workset hasResultFilename]];
                [autoShowCheckbox setEnabled:[openResultURLButton isEnabled]];
 - (void)updateResultWebView {
        if (!webViewUpToDate) {
                WebFrame *mainFrame = [resultWebView mainFrame];
-               [mainFrame loadHTMLString:[workset stringResult] baseURL:nil];
+//             [mainFrame loadHTMLString:[workset stringResult] baseURL:nil];
+               [mainFrame loadHTMLString:[workset stringResult] baseURL:[NSURL URLWithString:[webViewBaseURL stringValue]]];
+//             [mainFrame loadHTMLString:[workset stringResult] baseURL:[NSURL URLWithString:@"file:///Users/liyanage/Sites/primavera/images/x"]];
                webViewUpToDate = YES;
        }
 }
 
 //     NSLog(@"validate: %@, tag: %d", menuItem, [menuItem tag]);
 
+       NSString *activeTabIdentifier = [[tabView selectedTabViewItem] identifier];
+       BOOL xmlTabIsVisible = [activeTabIdentifier isEqualToString:@"xmlTab"];
+       BOOL xsltTabIsVisible = !xmlTabIsVisible && [activeTabIdentifier isEqualToString:@"xsltTab"];
+       BOOL paramTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible) && [activeTabIdentifier isEqualToString:@"parametersTab"];
+       BOOL resultTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible || paramTabIsVisible);
+
+       
        switch ([menuItem tag]) {
 
                case 10:        // Process
                        return [self canJumpToLineNow];
                        break;
                        
+               case 17:        // Save Current Pane
+                       if (xmlTabIsVisible) {
+                               return [self canSaveXmlNow];
+                       } else if (xsltTabIsVisible) {
+                               return [self canSaveXsltNow];
+                       } else if (resultTabIsVisible) {
+                               return [self canSaveResultNow];
+                       }
+                       break;
+                       
+               case 18:        // Save Current Pane As...
+                       if (xmlTabIsVisible) {
+                               return [self canSaveXmlAsNow];
+                       } else if (xsltTabIsVisible) {
+                               return [self canSaveXsltAsNow];
+                       } else if (resultTabIsVisible) {
+                               return [self canSaveResultAsNow];
+                       }
+                       break;
                        
                default:
                        return YES;
 
        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)canSaveXmlAsNow {
+       return [workset hasXmlCode];
+}
+
+- (BOOL)canSaveXmlNow {
+       return [workset hasXmlFilename] && xmlDirty;
+}
+
+- (BOOL)canSaveXsltAsNow {
+       return [workset hasXsltCode];
+}
+
+- (BOOL)canSaveXsltNow {
+       return [workset hasXsltFilename] && xsltDirty;
+}
+
+- (BOOL)canSaveResultAsNow {
+       return [workset hasResult];
+}
+
+- (BOOL)canSaveResultNow {
+       return [workset hasResultFilename] && resultDirty;
+}
+
+
+
+
 - (IBAction)saveXmlAs:(id)sender {
 
        NSSavePanel *panel = [NSSavePanel savePanel];
 }
 
 
+- (IBAction)saveCurrentAs:(id)sender {
+       
+       NSString *activeTabIdentifier = [[tabView selectedTabViewItem] identifier];
+       BOOL xmlTabIsVisible = [activeTabIdentifier isEqualToString:@"xmlTab"];
+       BOOL xsltTabIsVisible = !xmlTabIsVisible && [activeTabIdentifier isEqualToString:@"xsltTab"];
+       BOOL paramTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible) && [activeTabIdentifier isEqualToString:@"parametersTab"];
+       BOOL resultTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible || paramTabIsVisible);
+       
+       if (xmlTabIsVisible) {
+               return [self saveXmlAs:sender];
+       } else if (xsltTabIsVisible) {
+               return [self saveXsltAs:sender];
+       } else if (resultTabIsVisible) {
+               return [self saveResultAs:sender];
+       }
+
+}
+
+
+
+
+- (IBAction)saveCurrent:(id)sender {
+
+       NSString *activeTabIdentifier = [[tabView selectedTabViewItem] identifier];
+       BOOL xmlTabIsVisible = [activeTabIdentifier isEqualToString:@"xmlTab"];
+       BOOL xsltTabIsVisible = !xmlTabIsVisible && [activeTabIdentifier isEqualToString:@"xsltTab"];
+       BOOL paramTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible) && [activeTabIdentifier isEqualToString:@"parametersTab"];
+       BOOL resultTabIsVisible = !(xmlTabIsVisible || xsltTabIsVisible || paramTabIsVisible);
+       
+       if (xmlTabIsVisible) {
+               return [self saveXml:sender];
+       } else if (xsltTabIsVisible) {
+               return [self saveXslt:sender];
+       } else if (resultTabIsVisible) {
+               return [self saveResult:sender];
+       }
+       
+}
+
+
+
+
+
+
 - (IBAction)openResultURL:(id)sender {
 
 //     NSLog(@"openResultURL running...");
@@ -976,24 +1089,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];
@@ -1066,7 +1191,7 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn
 
 - (void)resizeWebView {
        
-       [[[resultWebView mainFrame] frameView] setFrame:[resultWebView frame]];
+//     [[[resultWebView mainFrame] frameView] setFrame:[resultWebView frame]];
        [resultWebView setNeedsDisplay:YES];
 
 }
@@ -1108,6 +1233,10 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn
        
        NSFont *computerFont = [NSFont fontWithName:@"Courier" size:12.0];
        [resultView setFont:computerFont];
+
+       [tabView registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
+
+       
        
        if (findPanelController == nil) {
                findPanelController = [[FindPanelController alloc] initWithWindowNibName:@"FindPanel"];
@@ -1123,13 +1252,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;