#import "MyDocument.h"
#import "Workset.h"
-
+#import <Foundation/NSDebug.h>
- (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...");
}
-- (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];
- (void)resizeWebView {
- [[[resultWebView mainFrame] frameView] setFrame:[resultWebView frame]];
+// [[[resultWebView mainFrame] frameView] setFrame:[resultWebView frame]];
[resultWebView setNeedsDisplay:YES];
}
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"];
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;