moved FOP to libs subdir
[TestXSLT.git] / MyDocument.m
index 79493c5..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;
        }
 
-       
+       defaults = [NSUserDefaults standardUserDefaults];
        
        return self;
 }
 
 - (void)dealloc {
 
+       [uiUpdateTimer release];
        [workset release];
        [processor release];
        [wellFormedParser release];
@@ -41,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];
 }
@@ -95,8 +95,6 @@
 }
 
 
-
-
 - (void)updateUI {
        
 //     NSLog(@"updateUI running...");
 
        [uiUpdateTimer retain];
 
+       
 }
 
+
 - (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);
        
        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;
        }
 }
 }
 
 
-
 - (BOOL)canProcessNow {
 
        return [workset hasXmlCode] && [workset hasXsltCode];
 
 //     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;
 
        }
 
+       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)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) {
+               [self saveXmlAs:sender];
+       } else if (xsltTabIsVisible) {
+               [self saveXsltAs:sender];
+       } else if (resultTabIsVisible) {
+               [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) {
+               [self saveXml:sender];
+       } else if (xsltTabIsVisible) {
+               [self saveXslt:sender];
+       } else if (resultTabIsVisible) {
+               [self saveResult:sender];
+       }
+       
+}
+
+
+
+
+
+
 - (IBAction)openResultURL:(id)sender {
 
 //     NSLog(@"openResultURL running...");
@@ -976,36 +1083,53 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn
 
 }
 
-- (IBAction)renderFo:(id)sender {
+- (void)xslfoRenderThread {
+
+       NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+       
+       XSL_FO_Renderer *xfr = [[[XSL_FO_Renderer alloc] init] autorelease];
+       xslfoRendererResultData = [xfr render:[workset result]];
 
-       XSL_FO_Renderer *xfr = [[XSL_FO_Renderer alloc] init];
+       [pool release];
+       [xslfoRendererLock unlockWithCondition:2];
+       
+}
 
-       NSData *resultData = [xfr render:[workset result]];
 
-       [resultData retain];
+- (IBAction)renderFo:(id)sender {
+
+       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;
+       }
+       
+       [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];
        
+       NSClipView *clipView = (NSClipView *)[resultImageView superview];
+       NSScrollView *scrollView = (NSScrollView *)[clipView superview];
+       
        [resultImageView setImage:pdfImage];
        [resultImageView setFrameSize:[pdfImage size]];
+       [resultImageView display];
 
-       //:[[[pdfImage representations] objectAtIndex:0] bounds]
-       //[resultImageView sizeToFit];
-       
-       //[resultImageView setNeedsDisplay:YES];
-
-       //NSLog(@"image reps: -%@-", [pdfImage representations]);
-       //NSLog(@"count: -%d-", [[[pdfImage representations] objectAtIndex:0] pageCount]);
+       [clipView scrollToPoint:NSMakePoint([resultImageView frame].origin.x, [resultImageView frame].size.height - [clipView frame].size.height + [resultImageView frame].origin.y)];
+       [scrollView reflectScrolledClipView:clipView];
        
        pdfPageCount = [[[pdfImage representations] objectAtIndex:0] pageCount];
        pdfCurrentPage = 0;
                
-       [xfr release];
-       
 }
 
 
@@ -1061,7 +1185,7 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn
 
 - (void)resizeWebView {
        
-       [[[resultWebView mainFrame] frameView] setFrame:[resultWebView frame]];
+//     [[[resultWebView mainFrame] frameView] setFrame:[resultWebView frame]];
        [resultWebView setNeedsDisplay:YES];
 
 }
@@ -1085,13 +1209,11 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn
        NSSize errorDrawerSize;
 
        [super windowControllerDidLoadNib:aController];
-               
-       [resultImageView setImageAlignment:NSImageAlignTopLeft];
-       //      [resultImageView setImageFrameStyle:NSImageFrameGroove];
+
+       [resultImageView setImageFrameStyle:NSImageFramePhoto];
        [resultImageView setImageScaling:NSScaleNone];
+       [resultImageView setImageAlignment:NSImageAlignCenter];
        [resultImageView setEditable:NO];
-               
-       
        
        [resultWebView setTextSizeMultiplier:0.9];
        
@@ -1103,6 +1225,10 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn
        errorDrawerSize.height = 130;
        [errorDrawer setContentSize:errorDrawerSize];
        
+       NSFont *computerFont = [NSFont fontWithName:@"Courier" size:12.0];
+       [resultView setFont:computerFont];
+
+       [tabView registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
 
        
        
@@ -1120,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;