diff --git a/ChangeLog b/ChangeLog index c22f8a833..a73b613ca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2002-10-28 Adam Fedor + + * Source/NSScreen.m (-visibleFrame): Don't include dock + with NexT/WindowMaker styles (patch from Stefan ). + +2002-10-28 Adam Fedor + + * Source/NSPrintOperation.m (-cleanUpOperation): Order out print + panel. + (-_runOperation): Use autorelease pool around operation. + (-init): Create a proper, unique temp print file. + (-deliverResult): Implement for previewing, spooling. + * Source/NSPrintPanel.m (-runModel): Don't order self out. + (-_setStatusStringValue:) New private method. + 2002-10-28 Richard Frith-Macdonald * Source/NSTextField.m: ([-dealloc]) morph self to be an NSTextView diff --git a/Source/NSPrintOperation.m b/Source/NSPrintOperation.m index 05a594f03..9d78a38ec 100644 --- a/Source/NSPrintOperation.m +++ b/Source/NSPrintOperation.m @@ -34,17 +34,23 @@ #include #include #include -#include -#include #include +#include +#include +#include +#include +#include #include #include #include +#include #include #include +#include #include #include #include +#include #include #include @@ -82,6 +88,11 @@ typedef struct _page_info_t { @end +@interface NSPrintPanel (Private) +- (void) _setStatusStringValue: (NSString *)string; +@end + + @interface NSView (NSPrintOperation) - (void) _displayPageInRect: (NSRect)pageRect atPlacement: (NSPoint)location @@ -435,11 +446,12 @@ static NSString *NSPrintOperationThreadKey = @"NSPrintOperationThreadKey"; // // Running a Print Operation // -/** Called by the print operation and it has finished running a printing +/** Called by the print operation after it has finished running a printing operation. */ - (void)cleanUpOperation { + [[self printPanel] orderOut: self]; _currentPage = 0; [NSPrintOperation setCurrentOperation: nil]; } @@ -454,10 +466,13 @@ static NSString *NSPrintOperationThreadKey = @"NSPrintOperationThreadKey"; return NO; } -/* Private method to run the printing operation */ +/* Private method to run the printing operation. Needs to create an + autoreleaes pool to make sure the print context is destroyed before + returning (which closes the print file.) */ - (BOOL) _runOperation { BOOL result; + CREATE_AUTORELEASE_POOL(pool); NSGraphicsContext *oldContext = [NSGraphicsContext currentContext]; [self createContext]; @@ -490,6 +505,7 @@ static NSString *NSPrintOperationThreadKey = @"NSPrintOperationThreadKey"; } NS_ENDHANDLER [self destroyContext]; + RELEASE(pool); return result; } @@ -651,7 +667,11 @@ static NSString *NSPrintOperationThreadKey = @"NSPrintOperationThreadKey"; _showPanels = NO; [self setPrintInfo: aPrintInfo]; - ASSIGN(_path, @"/tmp/NSTempPrintFile"); + _path = [NSTemporaryDirectory() stringByAppendingPathComponent: @"GSPrint-"]; + _path = [_path stringByAppendingString: + [[NSProcessInfo processInfo] globallyUniqueString]]; + _path = [_path stringByAppendingPathExtension: @"ps"]; + RETAIN(_path); _pathSet = NO; _currentPage = 0; @@ -948,8 +968,9 @@ scaleRect(NSRect rect, double scale) last: _currentPage info: &info]; } - NSDebugLLog(@"NSPrinting", @" current page %d, rect %@", - _currentPage, NSStringFromRect(pageRect)); + + NSDebugLLog(@"NSPrinting", @" current page %d, rect %@", + _currentPage, NSStringFromRect(pageRect)); if (NSIsEmptyRect(pageRect)) break; @@ -1028,7 +1049,6 @@ scaleRect(NSRect rect, double scale) label: label bBox: info.sheetBounds fonts: nil]; - DPSPrintf(ctxt, "/__GSsheetsaveobject save def\n"); if (info.orient == NSLandscapeOrientation) { DPSrotate(ctxt, 90); @@ -1095,7 +1115,6 @@ scaleRect(NSRect rect, double scale) NSPrintOperation *printOp = [NSPrintOperation currentOperation]; if ([printOp isEPSOperation] == NO) DPSPrintf(ctxt, "showpage\n"); - DPSPrintf(ctxt, "__GSsheetsaveobject restore\n"); DPSPrintf(ctxt, "%%%%PageTrailer\n"); DPSPrintf(ctxt, "\n"); } @@ -1143,16 +1162,88 @@ scaleRect(NSRect rect, double scale) return _context; } -- (BOOL)deliverResult +- (BOOL) _deliverSpooledResult { - // FIXME + int copies; + NSDictionary *dict; + NSTask *task; + NSString *name, *status; + NSMutableArray *args; + name = [[_printInfo printer] name]; + status = [NSString stringWithFormat: @"Spooling to printer %@.", name]; + [_printPanel _setStatusStringValue: status]; -/* + dict = [_printInfo dictionary]; + args = [NSMutableArray array]; + copies = [[dict objectForKey: NSPrintCopies] intValue]; + if (copies > 1) + [args addObject: [NSString stringWithFormat: @"-#%0d", copies]]; + if ([name isEqual: @"Unknown"] == NO) + { + [args addObject: @"-P"]; + [args addObject: name]; + } + [args addObject: _path]; + + task = [NSTask new]; + [task setLaunchPath: @"lpr"]; + [task setArguments: args]; + [task launch]; + [task waitUntilExit]; + AUTORELEASE(task); + return YES; +} + +- (BOOL) deliverResult +{ + BOOL success; + NSString *job; + + success = YES; + job = [_printInfo jobDisposition]; + if ([job isEqual: NSPrintPreviewJob]) + { + /* Check to see if there is a GNUstep app that can preview PS files. + It's not likely at this point, so also check for a standards + previewer, like gv. + */ + NSTask *task; + NSString *preview; + NSWorkspace *ws = [NSWorkspace sharedWorkspace]; + [_printPanel _setStatusStringValue: @"Opening in previewer..."]; + preview = [ws getBestAppInRole: @"Viewer" forExtension: @"ps"]; + if (preview) + { + [ws openFile: _path withApplication: preview]; + } + else + { + NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; + preview = [def objectForKey: @"NSPreviewApp"]; + if (preview == nil || [preview length] == 0) + preview = @"gv"; + task = [NSTask new]; + [task setLaunchPath: preview]; + [task setArguments: [NSArray arrayWithObject: _path]]; + [task launch]; + AUTORELEASE(task); + } + } + else if ([job isEqual: NSPrintSpoolJob]) + { + sucess = [self _deliverSpooledResult]; + } + else if ([job isEqual: NSPrintFaxJob]) + { + } + + /* We can't remove the temp file because the previewer might still be + using it, perhaps the printer is also? if (!_pathSet) [[NSFileManager defaultManager] removeFileAtPath: _path handler: nil]; -*/ - return YES; + */ + return success; } @end @@ -1232,7 +1323,6 @@ scaleRect(NSRect rect, double scale) - (NSGraphicsContext*)createContext { NSMutableDictionary *info; - NSAutoreleasePool *pool; if (_context) return _context; @@ -1242,12 +1332,7 @@ scaleRect(NSRect rect, double scale) [info setObject: _path forKey: @"NSOutputFile"]; [info setObject: NSGraphicsContextPSFormat forKey: NSGraphicsContextRepresentationFormatAttributeName]; - /* We have to remove the autorelease from the context, because we need the - contents of the file before the next return to the run loop */ - pool = [NSAutoreleasePool new]; _context = RETAIN([NSGraphicsContext graphicsContextWithAttributes: info]); - [pool release]; - return _context; } diff --git a/Source/NSPrintPanel.m b/Source/NSPrintPanel.m index 70e8c7d9d..3167373d2 100644 --- a/Source/NSPrintPanel.m +++ b/Source/NSPrintPanel.m @@ -179,14 +179,16 @@ static NSPrintPanel *shared_instance; /** Display the Print panel in a modal loop. Saves any aquired information in the NSPrintInfo object for the current NSPrintOperation. Returns NSCancelButton if the user clicks the Cancel button or - NSOKButton otherwise. + NSOKButton otherwise. Unlike other panels, this one does not order + itself out after the modal session is finished. You must do that + yourself. */ - (int)runModal { _picked = NSOKButton; [NSApp runModalForWindow: self]; [_optionPanel orderOut: self]; - [self orderOut: self]; + /* Don't order ourselves out, let the NSPrintOperation do that */ return (_picked == NSCancelButton) ? NSCancelButton : NSOKButton; } @@ -240,10 +242,6 @@ static NSPrintPanel *shared_instance; else if (tag == NSPPPreviewButton) { _picked = NSPPPreviewButton; - NSRunAlertPanel(@"Sorry", @"Previewing of print file not implemented", - @"OK", NULL, NULL); - /* Don't stop the modal session */ - return; } else if (tag ==NSFaxButton ) { @@ -623,4 +621,9 @@ static NSPrintPanel *shared_instance; } +/* Private method for NSPrintOperation */ +- (void) _setStatusStringValue: (NSString *)string +{ + [CONTROL(self, NSPPStatusField) setStringValue: string ]; +} @end diff --git a/Source/NSScreen.m b/Source/NSScreen.m index 09822792c..f6453b2a6 100644 --- a/Source/NSScreen.m +++ b/Source/NSScreen.m @@ -268,14 +268,18 @@ static NSMutableArray *screenArray = nil; { NSRect visFrame = _frame; - switch ([NSApp interfaceStyle]) + switch (NSInterfaceStyleForKey(@"NSIntefaceStyle", nil)) { case NSMacintoshInterfaceStyle: // What is the size of the Mac menubar? visFrame.size.height -= 25; return visFrame; - case NSWindows95InterfaceStyle: + case GSWindowMakerInterfaceStyle: case NSNextStepInterfaceStyle: + visFrame.size.width -= 64; + return visFrame; + + case NSWindows95InterfaceStyle: case NSNoInterfaceStyle: default: return _frame;