From: Andrew G. <ag...@us...> - 2002-04-22 18:02:30
|
Update of /cvsroot/zoolib/zoolib/src/platform/macos In directory usw-pr-cvs1:/tmp/cvs-serv6440/macos Modified Files: ZPrint_Carbon.cpp ZPrint_Carbon.h ZPrint_MacClassic.cpp ZPrint_MacClassic.h Log Message: Use LF-line endings -- I don't know how I'd ended up with CR-line endings. Index: ZPrint_Carbon.cpp =================================================================== RCS file: /cvsroot/zoolib/zoolib/src/platform/macos/ZPrint_Carbon.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** ZPrint_Carbon.cpp 22 Apr 2002 17:59:14 -0000 1.1 --- ZPrint_Carbon.cpp 22 Apr 2002 18:02:27 -0000 1.2 *************** *** 1 **** ! static const char rcsid[] = "@(#) $Id$"; /* ------------------------------------------------------------ Copyright (c) 2002 Andrew Green and Learning in Motion, Inc. http://www.zoolib.org Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------ */ #include "ZPrint_Carbon.h" #if ZCONFIG(OS, Carbon) #include "ZDC_QD.h" #include "ZUtil_Mac_HL.h" #include "ZUtil_Mac_LL.h" #include <PMCore.h> // ==================================================================================================== #pragma mark - #pragma mark * ZPrintPageSetup_Carbon ZPrintPageSetup_Carbon::ZPrintPageSetup_Carbon(const ZPrintPageSetup_Carbon& iOther) { ZAssertStop(2, iOther.fPageFormat); fPageFormat = iOther.fPageFormat; ::HandToHand((Handle*)&fPageFormat); } ZPrintPageSetup_Carbon::ZPrintPageSetup_Carbon() { fPrintSettings = kPMNoPrintSettings; fPageFormat = kPMNoPageFormat; OSStatus status = ::PMCreatePageFormat(&fPageFormat); if (fPageFormat == kPMNoPageFormat) throw bad_alloc(); PMPrintSession printSession; ::PMCreateSession(&printSession); status = ::PMCreatePageFormat(&fPageFormat); ::PMRelease(&printSession); Boolean changed; ::PMSessionValidatePageFormat(printSession, fPageFormat, &changed); } ZPrintPageSetup_Carbon::~ZPrintPageSetup_Carbon() { if (fPageFormat) ::DisposeHandle((Handle)fPageFormat); } ZRef<ZPrintPageSetup> ZPrintPageSetup_Carbon::Clone() { return new ZPrintPageSetup_Carbon(*this); } bool ZPrintPageSetup_Carbon::DoPageSetupDialog() { // PMPrintSession printSession; // ::PMCreateSession(&printSession); OSStatus status; Boolean accepted; // Set up a valid PageFormat object. if (fPageFormat == kPMNoPageFormat) { status = ::PMCreatePageFormat(&fPageFormat); // Note that PMPageFormat is not session-specific, but calling // PMSessionDefaultPageFormat assigns values specific to the printer // associated with the current printing session. if ((status == noErr) && (fPageFormat != kPMNoPageFormat)) status = PMSessionDefaultPageFormat(fPrintSession, fPageFormat); } else status = PMSessionValidatePageFormat(fPrintSession, fPageFormat, kPMDontWantBoolean); ZUtil_Mac_HL::sPreDialog(); // Display the Page Setup dialog. if (status == noErr) { status = ::PMSessionPageSetupDialog(fPrintSession, fPageFormat, &accepted); if (!accepted) status = kPMCancel; // user clicked Cancel button } ZUtil_Mac_HL::sPostDialog(); ::PMRelease(&fPrintSession); return accepted; } ZRef<ZPrintJobSetup> ZPrintPageSetup_Carbon::CreateJobSetup() { return new ZPrintJobSetup_Carbon(fPrintSettings, fPageFormat); } ZBPoint<double> ZPrintPageSetup_Carbon::GetPageSize() { PMRect pageRect; ::PMGetAdjustedPageRect(fPageFormat, &pageRect); return ZBPoint<double>(pageRect.right - pageRect.left, pageRect.bottom - pageRect.top); } ZBPoint<double> ZPrintPageSetup_Carbon::GetPageOrigin() { PMRect paperRect; ::PMGetAdjustedPaperRect(fPageFormat, &paperRect); PMRect pageRect; ::PMGetAdjustedPageRect(fPageFormat, &pageRect); return ZBPoint<double>(pageRect.left - paperRect.left, pageRect.top - paperRect.top); } ZBPoint<double> ZPrintPageSetup_Carbon::GetPaperSize() { PMRect paperRect; ::PMGetAdjustedPaperRect(fPageFormat, &paperRect); return ZBPoint<double>(paperRect.right - paperRect.left, paperRect.bottom - paperRect.top); } ZBPoint<double> ZPrintPageSetup_Carbon::GetUnits() { PMResolution res; ::PMGetResolution(fPageFormat, &res); return ZBPoint<double>(res.hRes, res.vRes); } // ==================================================================================================== #pragma mark - #pragma mark * ZPrintJobSetup_Carbon ZPrintJobSetup_Carbon::ZPrintJobSetup_Carbon(const ZPrintJobSetup_Carbon& iOther) { ZAssertStop(2, iOther.fPrintSettings); fPrintSettings = iOther.fPrintSettings; ::HandToHand((Handle*)&fPrintSettings); if (fPrintSettings == nil) throw bad_alloc(); fOptions = iOther.fOptions; } ZPrintJobSetup_Carbon::ZPrintJobSetup_Carbon(PMPrintSettings iPrintSettings, PMPageFormat iPageFormat) : fPrintSettings(iPrintSettings) { ZAssert(fPrintSettings); } ZPrintJobSetup_Carbon::~ZPrintJobSetup_Carbon() { // if (fPrintSettings != kPMNoPrintSettings) // ::PMRelease(&fPrintSession); } ZRef<ZPrintJobSetup> ZPrintJobSetup_Carbon::Clone() { return new ZPrintJobSetup_Carbon(*this); } void ZPrintJobSetup_Carbon::SetOptions(const Options& iOptions) { fOptions = iOptions; ::PMSetFirstPage(fPrintSettings, fOptions.fFirstPage, true); ::PMSetLastPage(fPrintSettings, fOptions.fLastPage, true); } ZPrintJobSetup::Options ZPrintJobSetup_Carbon::GetOptions() { Options theOptions = fOptions; UInt32 firstPage, lastPage; ::PMGetFirstPage(fPrintSettings, &firstPage); ::PMGetLastPage(fPrintSettings, &lastPage); long localFirstPage = min(firstPage, lastPage); long localLastPage = max(firstPage, lastPage); if (localFirstPage == 1 && localLastPage == 9999) theOptions.fPageRange = Options::ePageRangeAll; else theOptions.fPageRange = Options::ePageRangeExplicit; theOptions.fFirstPage = localFirstPage; theOptions.fLastPage = localLastPage; return theOptions; } ZRef<ZPrintJob> ZPrintJobSetup_Carbon::DoPrintDialogAndStartJob(const string& iJobName) { PMPrintSession printSession; fPageFormat = kPMNoPageFormat; fPrintSettings = kPMNoPrintSettings; UInt32 minPage = 1, maxPage = 9999; OSStatus status = ::PMCreateSession(&printSession); if (status != kPMNoError) return nil; // no sense continuing. -ec 01.12.12 if (fPrintSettings == kPMNoPrintSettings) { status = PMCreatePrintSettings(&fPrintSettings); // Note that PMPrintSettings is not session-specific, but calling // PMSessionDefaultPrintSettings assigns values specific to the printer // associated with the current printing session. if ((status == kPMNoError) && (fPrintSettings != kPMNoPrintSettings)) status = ::PMSessionDefaultPrintSettings(fPrintSession, fPrintSettings); } else { status = PMSessionValidatePrintSettings(fPrintSession, fPrintSettings, kPMDontWantBoolean); } // Set a valid page range before displaying the Print dialog if (status == kPMNoError) status = PMSetPageRange(fPrintSettings, minPage, maxPage); ZUtil_Mac_HL::sPreDialog(); // Display the Print dialog. Boolean accepted = false; if (status == noErr) { status = PMSessionPrintDialog(fPrintSession, fPrintSettings, fPageFormat, &accepted); if (!accepted) status = kPMCancel; // user clicked Cancel button } ZUtil_Mac_HL::sPostDialog(); ::PMRelease(&printSession); if (accepted) { //THPrint theTHPrint = fTHPrint; //::HandToHand((Handle*)&theTHPrint); //if (theTHPrint == nil) // throw bad_alloc(); return new ZPrintJob_Carbon(fPrintSettings, iJobName); } return nil; } // ==================================================================================================== #pragma mark - #pragma mark * ZPrintJob_Carbon ZPrintJob_Carbon::ZPrintJob_Carbon(PMPrintSettings iPrintSettings, const string& iJobName) : fPrintSettings(iPrintSettings), fPrinterResFile(-1), fPageDC(nil), fPaperDC(nil), fCurrentPageIndex(0), fJobName(iJobName), fDocOpen(false), fPageOpen(false) { // We have to reset these, otherwise the printer driver will discard // all pages up to but not including whatever was in iFstPage ::PMSetFirstPage(fPrintSettings, 1L, true); ::PMSetLastPage(fPrintSettings, 9999L, true); } ZPrintJob_Carbon::~ZPrintJob_Carbon() { try { this->Finish(); } catch (...) {} if (fPrintSettings != kPMNoPrintSettings) ::PMRelease(&fPrintSettings); } ZDC ZPrintJob_Carbon::GetPageDC() { if (fPageDC == nil) { // We can't get the DC unless a page is open ZAssertStop(2, fPageOpen); // Set up the origin comp so that (0,0) is in the top left corner of the *page* if (fPaperDC) fPageDC = new ZDC(fPaperDC->GetCanvas(), ZPoint::sZero); else fPageDC = new ZDC(new ZDCCanvas_QD_Print((CGrafPtr)GetQDGlobalsThePort()), ZPoint::sZero); PMRect pageRect; ::PMGetAdjustedPageRect(fPageFormat, &pageRect); fPageDC->SetClip(ZRect(pageRect.left, pageRect.top, pageRect.right, pageRect.bottom)); } return *fPageDC; } ZDC ZPrintJob_Carbon::GetPaperDC() { if (fPaperDC == nil) { // We can't get the DC unless a page is open ZAssertStop(2, fPageOpen); // Set up the origin comp so that (0,0) is in the top left // corner of the paper, regardless of how margins are set up PMRect paperRect; ::PMGetAdjustedPaperRect(fPageFormat, &paperRect); ZRect paperZRect(paperRect.left, paperRect.top, paperRect.right, paperRect.bottom); if (fPageDC) fPaperDC = new ZDC(fPageDC->GetCanvas(), -paperZRect.TopLeft()); else fPaperDC = new ZDC(new ZDCCanvas_QD_Print((CGrafPtr)GetQDGlobalsThePort()), -paperZRect.TopLeft()); // Set up clipping to encompass the whole page area. We can't image it all, but // the clip carries some information to anyone using the paperDC. If a client // has kept a DC referencing our underlying PrintPortWrapper then the clipping // (and other settings) for that DC will *not* be affected fPaperDC->SetClip(ZRect(paperZRect.Size())); } return *fPaperDC; } void ZPrintJob_Carbon::NewPage() { ZUtil_Mac_LL::PreserveResFile preserveResFile; ZUtil_Mac_LL::SaveRestoreResFile saveRestoreResFile(fPrinterResFile); try { OSStatus status = kPMNoError; if (!fPrinterOpen) { fPrinterOpen = true; PMPrintSession printSession; status = ::PMCreateSession(&printSession); if (status != kPMNoError) throw runtime_error("PMCreateSession Failed"); fPrinterResFile = ::CurResFile(); } // If we still have a page open, then close it (sending it to the printer or spooler) if (fPageOpen) { // Lose our printing DC's caches. If anyone has kept a reference to the // underlying PrintPortWrappers then that will still be valid, and the // settings in their DC will be used. Really though, users should acquire a // fresh reference to the DC after each page delete fPageDC; fPageDC = nil; delete fPaperDC; fPaperDC = nil; fPageOpen = false; status = ::PMSessionEndPage(fPrintSession); if (status != kPMNoError) throw runtime_error("PMEndPage Failed"); } // Get the doc open, if needed if (!fDocOpen) { fDocOpen = true; Boolean result; ::PMSessionValidatePrintSettings(fPrintSession, fPrintSettings, &result); ::PMSessionValidatePageFormat(fPrintSession, fPageFormat, &result); status = ::PMSessionBeginDocument(fPrintSession, fPrintSettings, fPageFormat); if (status != kPMNoError) throw runtime_error("PMBeginDocument failed"); } if (!fPageOpen) { fPageOpen = true; status = ::PMSessionBeginPage(fPrintSession, fPageFormat, nil); if (status != kPMNoError) throw runtime_error("PMSessionBeginPage Failed"); } ++fCurrentPageIndex; } catch (...) { this->Finish(); throw; } } void ZPrintJob_Carbon::Finish() { delete fPageDC; fPageDC = nil; delete fPaperDC; fPaperDC = nil; ZUtil_Mac_LL::PreserveResFile preserveResFile; ZUtil_Mac_LL::SaveRestoreResFile saveRestoreResFile(fPrinterResFile); if (fPageOpen) { fPageOpen = false; ::PMSessionEndPage(fPrintSession); } if (fDocOpen) { fDocOpen = false; ::PMSessionEndDocument(fPrintSession); } if (fPrinterOpen) { fPrinterOpen = false; ::PMRelease(fPrintSession); fPrinterResFile = -1; } } void ZPrintJob_Carbon::Abort() {} size_t ZPrintJob_Carbon::GetCurrentPageIndex() { return fCurrentPageIndex; } ZBPoint<double> ZPrintJob_Carbon::GetPageSize() { PMRect pageRect; ::PMGetAdjustedPageRect(fPageFormat, &pageRect); return ZBPoint<double>(pageRect.right - pageRect.left, pageRect.bottom - pageRect.top); } ZBPoint<double> ZPrintJob_Carbon::GetPageOrigin() { PMRect paperRect; ::PMGetAdjustedPaperRect(fPageFormat, &paperRect); PMRect pageRect; ::PMGetAdjustedPageRect(fPageFormat, &pageRect); return ZBPoint<double>(pageRect.left - paperRect.left, pageRect.top - paperRect.top); } ZBPoint<double> ZPrintJob_Carbon::GetPaperSize() { PMRect paperRect; ::PMGetAdjustedPaperRect(fPageFormat, &paperRect); return ZBPoint<double>(paperRect.right - paperRect.left, paperRect.bottom - paperRect.top); } ZBPoint<double> ZPrintJob_Carbon::GetUnits() { PMResolution res; ::PMGetResolution(fPageFormat, &res); return ZBPoint<double>(res.hRes, res.vRes); } #endif // ZCONFIG(OS, Carbon) \ No newline at end of file --- 1,464 ---- ! static const char rcsid[] = "@(#) $Id$"; ! ! /* ------------------------------------------------------------ ! Copyright (c) 2002 Andrew Green and Learning in Motion, Inc. ! http://www.zoolib.org ! ! Permission is hereby granted, free of charge, to any person obtaining a copy ! of this software and associated documentation files (the "Software"), to deal ! in the Software without restriction, including without limitation the rights ! to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ! copies of the Software, and to permit persons to whom the Software is ! furnished to do so, subject to the following conditions: ! ! The above copyright notice and this permission notice shall be included in ! all copies or substantial portions of the Software. ! ! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ! IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ! FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ! COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ! AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ! CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ! ------------------------------------------------------------ */ ! ! #include "ZPrint_Carbon.h" ! ! #if ZCONFIG(OS, Carbon) ! ! #include "ZDC_QD.h" ! #include "ZUtil_Mac_HL.h" ! #include "ZUtil_Mac_LL.h" ! ! #include <PMCore.h> ! ! // ==================================================================================================== ! #pragma mark - ! #pragma mark * ZPrintPageSetup_Carbon ! ! ZPrintPageSetup_Carbon::ZPrintPageSetup_Carbon(const ZPrintPageSetup_Carbon& iOther) ! { ! ZAssertStop(2, iOther.fPageFormat); ! fPageFormat = iOther.fPageFormat; ! ::HandToHand((Handle*)&fPageFormat); ! } ! ! ZPrintPageSetup_Carbon::ZPrintPageSetup_Carbon() ! { ! fPrintSettings = kPMNoPrintSettings; ! fPageFormat = kPMNoPageFormat; ! OSStatus status = ::PMCreatePageFormat(&fPageFormat); ! if (fPageFormat == kPMNoPageFormat) ! throw bad_alloc(); ! ! PMPrintSession printSession; ! ::PMCreateSession(&printSession); ! status = ::PMCreatePageFormat(&fPageFormat); ! ::PMRelease(&printSession); ! Boolean changed; ! ::PMSessionValidatePageFormat(printSession, fPageFormat, &changed); ! } ! ! ZPrintPageSetup_Carbon::~ZPrintPageSetup_Carbon() ! { ! if (fPageFormat) ! ::DisposeHandle((Handle)fPageFormat); ! } ! ! ZRef<ZPrintPageSetup> ZPrintPageSetup_Carbon::Clone() ! { return new ZPrintPageSetup_Carbon(*this); } ! ! bool ZPrintPageSetup_Carbon::DoPageSetupDialog() ! { ! // PMPrintSession printSession; ! // ::PMCreateSession(&printSession); ! OSStatus status; ! Boolean accepted; ! ! // Set up a valid PageFormat object. ! if (fPageFormat == kPMNoPageFormat) ! { ! status = ::PMCreatePageFormat(&fPageFormat); ! ! // Note that PMPageFormat is not session-specific, but calling ! // PMSessionDefaultPageFormat assigns values specific to the printer ! // associated with the current printing session. ! if ((status == noErr) && (fPageFormat != kPMNoPageFormat)) ! status = PMSessionDefaultPageFormat(fPrintSession, fPageFormat); ! } ! else ! status = PMSessionValidatePageFormat(fPrintSession, fPageFormat, kPMDontWantBoolean); ! ! ZUtil_Mac_HL::sPreDialog(); ! // Display the Page Setup dialog. ! if (status == noErr) ! { ! status = ::PMSessionPageSetupDialog(fPrintSession, fPageFormat, &accepted); ! if (!accepted) ! status = kPMCancel; // user clicked Cancel button ! } ! ! ZUtil_Mac_HL::sPostDialog(); ! ::PMRelease(&fPrintSession); ! return accepted; ! } ! ! ZRef<ZPrintJobSetup> ZPrintPageSetup_Carbon::CreateJobSetup() ! { return new ZPrintJobSetup_Carbon(fPrintSettings, fPageFormat); } ! ! ZBPoint<double> ZPrintPageSetup_Carbon::GetPageSize() ! { ! PMRect pageRect; ! ::PMGetAdjustedPageRect(fPageFormat, &pageRect); ! return ZBPoint<double>(pageRect.right - pageRect.left, pageRect.bottom - pageRect.top); ! } ! ! ZBPoint<double> ZPrintPageSetup_Carbon::GetPageOrigin() ! { ! PMRect paperRect; ! ::PMGetAdjustedPaperRect(fPageFormat, &paperRect); ! ! PMRect pageRect; ! ::PMGetAdjustedPageRect(fPageFormat, &pageRect); ! ! return ZBPoint<double>(pageRect.left - paperRect.left, pageRect.top - paperRect.top); ! } ! ! ZBPoint<double> ZPrintPageSetup_Carbon::GetPaperSize() ! { ! PMRect paperRect; ! ::PMGetAdjustedPaperRect(fPageFormat, &paperRect); ! return ZBPoint<double>(paperRect.right - paperRect.left, paperRect.bottom - paperRect.top); ! } ! ! ZBPoint<double> ZPrintPageSetup_Carbon::GetUnits() ! { ! PMResolution res; ! ::PMGetResolution(fPageFormat, &res); ! return ZBPoint<double>(res.hRes, res.vRes); ! } ! ! // ==================================================================================================== ! #pragma mark - ! #pragma mark * ZPrintJobSetup_Carbon ! ! ZPrintJobSetup_Carbon::ZPrintJobSetup_Carbon(const ZPrintJobSetup_Carbon& iOther) ! { ! ZAssertStop(2, iOther.fPrintSettings); ! fPrintSettings = iOther.fPrintSettings; ! ::HandToHand((Handle*)&fPrintSettings); ! if (fPrintSettings == nil) ! throw bad_alloc(); ! fOptions = iOther.fOptions; ! } ! ! ZPrintJobSetup_Carbon::ZPrintJobSetup_Carbon(PMPrintSettings iPrintSettings, PMPageFormat iPageFormat) ! : fPrintSettings(iPrintSettings) ! { ! ZAssert(fPrintSettings); ! } ! ! ZPrintJobSetup_Carbon::~ZPrintJobSetup_Carbon() ! { ! // if (fPrintSettings != kPMNoPrintSettings) ! // ::PMRelease(&fPrintSession); ! } ! ! ZRef<ZPrintJobSetup> ZPrintJobSetup_Carbon::Clone() ! { return new ZPrintJobSetup_Carbon(*this); } ! ! void ZPrintJobSetup_Carbon::SetOptions(const Options& iOptions) ! { ! fOptions = iOptions; ! ::PMSetFirstPage(fPrintSettings, fOptions.fFirstPage, true); ! ::PMSetLastPage(fPrintSettings, fOptions.fLastPage, true); ! } ! ! ZPrintJobSetup::Options ZPrintJobSetup_Carbon::GetOptions() ! { ! Options theOptions = fOptions; ! UInt32 firstPage, lastPage; ! ::PMGetFirstPage(fPrintSettings, &firstPage); ! ::PMGetLastPage(fPrintSettings, &lastPage); ! long localFirstPage = min(firstPage, lastPage); ! long localLastPage = max(firstPage, lastPage); ! if (localFirstPage == 1 && localLastPage == 9999) ! theOptions.fPageRange = Options::ePageRangeAll; ! else ! theOptions.fPageRange = Options::ePageRangeExplicit; ! theOptions.fFirstPage = localFirstPage; ! theOptions.fLastPage = localLastPage; ! return theOptions; ! } ! ! ZRef<ZPrintJob> ZPrintJobSetup_Carbon::DoPrintDialogAndStartJob(const string& iJobName) ! { ! PMPrintSession printSession; ! fPageFormat = kPMNoPageFormat; ! fPrintSettings = kPMNoPrintSettings; ! UInt32 minPage = 1, maxPage = 9999; ! ! OSStatus status = ::PMCreateSession(&printSession); ! if (status != kPMNoError) ! return nil; // no sense continuing. -ec 01.12.12 ! ! if (fPrintSettings == kPMNoPrintSettings) ! { ! status = PMCreatePrintSettings(&fPrintSettings); ! ! // Note that PMPrintSettings is not session-specific, but calling ! // PMSessionDefaultPrintSettings assigns values specific to the printer ! // associated with the current printing session. ! if ((status == kPMNoError) && (fPrintSettings != kPMNoPrintSettings)) ! status = ::PMSessionDefaultPrintSettings(fPrintSession, fPrintSettings); ! } ! else ! { ! status = PMSessionValidatePrintSettings(fPrintSession, fPrintSettings, kPMDontWantBoolean); ! } ! ! // Set a valid page range before displaying the Print dialog ! if (status == kPMNoError) ! status = PMSetPageRange(fPrintSettings, minPage, maxPage); ! ! ZUtil_Mac_HL::sPreDialog(); ! ! // Display the Print dialog. ! Boolean accepted = false; ! if (status == noErr) ! { ! status = PMSessionPrintDialog(fPrintSession, fPrintSettings, fPageFormat, &accepted); ! if (!accepted) ! status = kPMCancel; // user clicked Cancel button ! } ! ! ZUtil_Mac_HL::sPostDialog(); ! ::PMRelease(&printSession); ! ! if (accepted) ! { ! //THPrint theTHPrint = fTHPrint; ! //::HandToHand((Handle*)&theTHPrint); ! //if (theTHPrint == nil) ! // throw bad_alloc(); ! return new ZPrintJob_Carbon(fPrintSettings, iJobName); ! } ! return nil; ! } ! ! // ==================================================================================================== ! #pragma mark - ! #pragma mark * ZPrintJob_Carbon ! ! ZPrintJob_Carbon::ZPrintJob_Carbon(PMPrintSettings iPrintSettings, const string& iJobName) ! : fPrintSettings(iPrintSettings), ! fPrinterResFile(-1), ! fPageDC(nil), ! fPaperDC(nil), ! fCurrentPageIndex(0), ! fJobName(iJobName), ! fDocOpen(false), ! fPageOpen(false) ! { ! // We have to reset these, otherwise the printer driver will discard ! // all pages up to but not including whatever was in iFstPage ! ::PMSetFirstPage(fPrintSettings, 1L, true); ! ::PMSetLastPage(fPrintSettings, 9999L, true); ! } ! ! ZPrintJob_Carbon::~ZPrintJob_Carbon() ! { ! try ! { this->Finish(); } ! catch (...) ! {} ! if (fPrintSettings != kPMNoPrintSettings) ! ::PMRelease(&fPrintSettings); ! } ! ! ZDC ZPrintJob_Carbon::GetPageDC() ! { ! if (fPageDC == nil) ! { ! // We can't get the DC unless a page is open ! ZAssertStop(2, fPageOpen); ! ! // Set up the origin comp so that (0,0) is in the top left corner of the *page* ! if (fPaperDC) ! fPageDC = new ZDC(fPaperDC->GetCanvas(), ZPoint::sZero); ! else ! fPageDC = new ZDC(new ZDCCanvas_QD_Print((CGrafPtr)GetQDGlobalsThePort()), ZPoint::sZero); ! ! PMRect pageRect; ! ::PMGetAdjustedPageRect(fPageFormat, &pageRect); ! ! fPageDC->SetClip(ZRect(pageRect.left, pageRect.top, pageRect.right, pageRect.bottom)); ! } ! ! return *fPageDC; ! } ! ! ZDC ZPrintJob_Carbon::GetPaperDC() ! { ! if (fPaperDC == nil) ! { ! // We can't get the DC unless a page is open ! ZAssertStop(2, fPageOpen); ! ! // Set up the origin comp so that (0,0) is in the top left ! // corner of the paper, regardless of how margins are set up ! PMRect paperRect; ! ::PMGetAdjustedPaperRect(fPageFormat, &paperRect); ! ZRect paperZRect(paperRect.left, paperRect.top, paperRect.right, paperRect.bottom); ! if (fPageDC) ! fPaperDC = new ZDC(fPageDC->GetCanvas(), -paperZRect.TopLeft()); ! else ! fPaperDC = new ZDC(new ZDCCanvas_QD_Print((CGrafPtr)GetQDGlobalsThePort()), -paperZRect.TopLeft()); ! ! // Set up clipping to encompass the whole page area. We can't image it all, but ! // the clip carries some information to anyone using the paperDC. If a client ! // has kept a DC referencing our underlying PrintPortWrapper then the clipping ! // (and other settings) for that DC will *not* be affected ! fPaperDC->SetClip(ZRect(paperZRect.Size())); ! } ! ! return *fPaperDC; ! } ! ! void ZPrintJob_Carbon::NewPage() ! { ! ZUtil_Mac_LL::PreserveResFile preserveResFile; ! ZUtil_Mac_LL::SaveRestoreResFile saveRestoreResFile(fPrinterResFile); ! ! try ! { ! OSStatus status = kPMNoError; ! if (!fPrinterOpen) ! { ! fPrinterOpen = true; ! PMPrintSession printSession; ! status = ::PMCreateSession(&printSession); ! if (status != kPMNoError) ! throw runtime_error("PMCreateSession Failed"); ! fPrinterResFile = ::CurResFile(); ! } ! ! // If we still have a page open, then close it (sending it to the printer or spooler) ! if (fPageOpen) ! { ! // Lose our printing DC's caches. If anyone has kept a reference to the ! // underlying PrintPortWrappers then that will still be valid, and the ! // settings in their DC will be used. Really though, users should acquire a ! // fresh reference to the DC after each page ! delete fPageDC; ! fPageDC = nil; ! ! delete fPaperDC; ! fPaperDC = nil; ! ! fPageOpen = false; ! status = ::PMSessionEndPage(fPrintSession); ! if (status != kPMNoError) ! throw runtime_error("PMEndPage Failed"); ! } ! ! // Get the doc open, if needed ! if (!fDocOpen) ! { ! fDocOpen = true; ! Boolean result; ! ::PMSessionValidatePrintSettings(fPrintSession, fPrintSettings, &result); ! ::PMSessionValidatePageFormat(fPrintSession, fPageFormat, &result); ! status = ::PMSessionBeginDocument(fPrintSession, fPrintSettings, fPageFormat); ! ! if (status != kPMNoError) ! throw runtime_error("PMBeginDocument failed"); ! } ! ! if (!fPageOpen) ! { ! fPageOpen = true; ! status = ::PMSessionBeginPage(fPrintSession, fPageFormat, nil); ! if (status != kPMNoError) ! throw runtime_error("PMSessionBeginPage Failed"); ! } ! ! ++fCurrentPageIndex; ! } ! catch (...) ! { ! this->Finish(); ! throw; ! } ! } ! ! void ZPrintJob_Carbon::Finish() ! { ! delete fPageDC; ! fPageDC = nil; ! ! delete fPaperDC; ! fPaperDC = nil; ! ! ZUtil_Mac_LL::PreserveResFile preserveResFile; ! ZUtil_Mac_LL::SaveRestoreResFile saveRestoreResFile(fPrinterResFile); ! ! if (fPageOpen) ! { ! fPageOpen = false; ! ::PMSessionEndPage(fPrintSession); ! } ! ! if (fDocOpen) ! { ! fDocOpen = false; ! ::PMSessionEndDocument(fPrintSession); ! } ! ! if (fPrinterOpen) ! { ! fPrinterOpen = false; ! ::PMRelease(fPrintSession); ! fPrinterResFile = -1; ! } ! } ! ! void ZPrintJob_Carbon::Abort() ! {} ! ! size_t ZPrintJob_Carbon::GetCurrentPageIndex() ! { return fCurrentPageIndex; } ! ! ZBPoint<double> ZPrintJob_Carbon::GetPageSize() ! { ! PMRect pageRect; ! ::PMGetAdjustedPageRect(fPageFormat, &pageRect); ! return ZBPoint<double>(pageRect.right - pageRect.left, pageRect.bottom - pageRect.top); ! } ! ! ZBPoint<double> ZPrintJob_Carbon::GetPageOrigin() ! { ! PMRect paperRect; ! ::PMGetAdjustedPaperRect(fPageFormat, &paperRect); ! ! PMRect pageRect; ! ::PMGetAdjustedPageRect(fPageFormat, &pageRect); ! ! return ZBPoint<double>(pageRect.left - paperRect.left, pageRect.top - paperRect.top); ! } ! ! ZBPoint<double> ZPrintJob_Carbon::GetPaperSize() ! { ! PMRect paperRect; ! ::PMGetAdjustedPaperRect(fPageFormat, &paperRect); ! return ZBPoint<double>(paperRect.right - paperRect.left, paperRect.bottom - paperRect.top); ! } ! ! ZBPoint<double> ZPrintJob_Carbon::GetUnits() ! { ! PMResolution res; ! ::PMGetResolution(fPageFormat, &res); ! return ZBPoint<double>(res.hRes, res.vRes); ! } ! ! #endif // ZCONFIG(OS, Carbon) \ No newline at end of file Index: ZPrint_Carbon.h =================================================================== RCS file: /cvsroot/zoolib/zoolib/src/platform/macos/ZPrint_Carbon.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** ZPrint_Carbon.h 22 Apr 2002 17:59:14 -0000 1.1 --- ZPrint_Carbon.h 22 Apr 2002 18:02:28 -0000 1.2 *************** *** 1 **** ! /* @(#) $Id$ */ /* ------------------------------------------------------------ Copyright (c) 2002 Andrew Green and Learning in Motion, Inc. http://www.zoolib.org Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------ */ #ifndef __ZPrint_Carbon__ #define __ZPrint_Carbon__ 1 #include "zconfig.h" #if ZCONFIG(OS, Carbon) #include "ZPrint.h" #include <PMApplication.h> // ==================================================================================================== #pragma mark - #pragma mark * ZPrintPageSetup_Carbon class ZPrintPageSetup_Carbon : public ZPrintPageSetup { protected: ZPrintPageSetup_Carbon(const ZPrintPageSetup_Carbon& iOther); public: ZPrintPageSetup_Carbon(); virtual ~ZPrintPageSetup_Carbon(); // From ZPrintPageSetup virtual ZRef<ZPrintPageSetup> Clone(); virtual bool DoPageSetupDialog(); virtual ZRef<ZPrintJobSetup> CreateJobSetup(); virtual ZBPoint<double> GetPageSize(); virtual ZBPoint<double> GetPageOrigin(); virtual ZBPoint<double> GetPaperSize(); virtual ZBPoint<double> GetUnits(); // Our protocol PMPageFormat& GetPageFormat() { return fPageFormat; } protected: PMPrintSession fPrintSession; PMPageFormat fPageFormat; PMPrintSettings fPrintSettings; }; // ==================================================================================================== #pragma mark - #pragma mark * ZPrintJobSetup_Carbon class ZPrintJobSetup_Carbon : public ZPrintJobSetup { protected: ZPrintJobSetup_Carbon(const ZPrintJobSetup_Carbon& iOther); public: ZPrintJobSetup_Carbon(PMPrintSettings iPrintSettings, PMPageFormat iPageFormat); virtual ~ZPrintJobSetup_Carbon(); // From ZPrintJobSetup ZRef<ZPrintJobSetup> Clone(); virtual void SetOptions(const Options& iOptions); virtual Options GetOptions(); virtual ZRef<ZPrintJob> DoPrintDialogAndStartJob(const string& iJobName); // Our protocol PMPrintSettings& GetPMPrintSettings() { return fPrintSettings; } protected: Options fOptions; PMPrintSession fPrintSession; PMPrintSettings fPrintSettings; PMPageFormat fPageFormat; }; // ==================================================================================================== #pragma mark - #pragma mark * ZPrintJob_Carbon class ZPrintJob_Carbon : public ZPrintJob { public: ZPrintJob_Carbon(PMPrintSettings iPrintSettings, const string& iJobName); virtual ~ZPrintJob_Carbon(); // From ZPrintJob virtual ZDC GetPageDC(); virtual ZDC GetPaperDC(); virtual void NewPage(); virtual void Finish(); virtual void Abort(); virtual size_t GetCurrentPageIndex(); virtual ZBPoint<double> GetPageSize(); virtual ZBPoint<double> GetPageOrigin(); virtual ZBPoint<double> GetPaperSize(); virtual ZBPoint<double> GetUnits(); protected: short fPrinterResFile; PMPrintSession fPrintSession; PMPrintSettings fPrintSettings; PMPageFormat fPageFormat; ZDC* fPageDC; ZDC* fPaperDC; size_t fCurrentPageIndex; string fJobName; bool fPrinterOpen; bool fDocOpen; bool fPageOpen; }; #endif // ZCONFIG(OS, Carbon) #endif // __ZPrint_Carbon__ \ No newline at end of file --- 1,143 ---- ! /* @(#) $Id$ */ ! ! /* ------------------------------------------------------------ ! Copyright (c) 2002 Andrew Green and Learning in Motion, Inc. ! http://www.zoolib.org ! ! Permission is hereby granted, free of charge, to any person obtaining a copy ! of this software and associated documentation files (the "Software"), to deal ! in the Software without restriction, including without limitation the rights ! to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ! copies of the Software, and to permit persons to whom the Software is ! furnished to do so, subject to the following conditions: ! ! The above copyright notice and this permission notice shall be included in ! all copies or substantial portions of the Software. ! ! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ! IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ! FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ! COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ! AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ! CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ! ------------------------------------------------------------ */ ! ! #ifndef __ZPrint_Carbon__ ! #define __ZPrint_Carbon__ 1 ! ! #include "zconfig.h" ! ! #if ZCONFIG(OS, Carbon) ! ! #include "ZPrint.h" ! ! #include <PMApplication.h> ! ! // ==================================================================================================== ! #pragma mark - ! #pragma mark * ZPrintPageSetup_Carbon ! ! class ZPrintPageSetup_Carbon : public ZPrintPageSetup ! { ! protected: ! ZPrintPageSetup_Carbon(const ZPrintPageSetup_Carbon& iOther); ! ! public: ! ZPrintPageSetup_Carbon(); ! virtual ~ZPrintPageSetup_Carbon(); ! ! // From ZPrintPageSetup ! virtual ZRef<ZPrintPageSetup> Clone(); ! ! virtual bool DoPageSetupDialog(); ! ! virtual ZRef<ZPrintJobSetup> CreateJobSetup(); ! ! virtual ZBPoint<double> GetPageSize(); ! virtual ZBPoint<double> GetPageOrigin(); ! virtual ZBPoint<double> GetPaperSize(); ! virtual ZBPoint<double> GetUnits(); ! ! // Our protocol ! PMPageFormat& GetPageFormat() { return fPageFormat; } ! ! protected: ! PMPrintSession fPrintSession; ! PMPageFormat fPageFormat; ! PMPrintSettings fPrintSettings; ! }; ! ! ! // ==================================================================================================== ! #pragma mark - ! #pragma mark * ZPrintJobSetup_Carbon ! ! class ZPrintJobSetup_Carbon : public ZPrintJobSetup ! { ! protected: ! ZPrintJobSetup_Carbon(const ZPrintJobSetup_Carbon& iOther); ! ! public: ! ZPrintJobSetup_Carbon(PMPrintSettings iPrintSettings, PMPageFormat iPageFormat); ! virtual ~ZPrintJobSetup_Carbon(); ! ! // From ZPrintJobSetup ! ZRef<ZPrintJobSetup> Clone(); ! ! virtual void SetOptions(const Options& iOptions); ! virtual Options GetOptions(); ! ! virtual ZRef<ZPrintJob> DoPrintDialogAndStartJob(const string& iJobName); ! ! // Our protocol ! PMPrintSettings& GetPMPrintSettings() { return fPrintSettings; } ! ! protected: ! Options fOptions; ! PMPrintSession fPrintSession; ! PMPrintSettings fPrintSettings; ! PMPageFormat fPageFormat; ! }; ! ! // ==================================================================================================== ! #pragma mark - ! #pragma mark * ZPrintJob_Carbon ! ! class ZPrintJob_Carbon : public ZPrintJob ! { ! public: ! ZPrintJob_Carbon(PMPrintSettings iPrintSettings, const string& iJobName); ! virtual ~ZPrintJob_Carbon(); ! ! // From ZPrintJob ! virtual ZDC GetPageDC(); ! virtual ZDC GetPaperDC(); ! ! virtual void NewPage(); ! virtual void Finish(); ! virtual void Abort(); ! ! virtual size_t GetCurrentPageIndex(); ! ! virtual ZBPoint<double> GetPageSize(); ! virtual ZBPoint<double> GetPageOrigin(); ! virtual ZBPoint<double> GetPaperSize(); ! virtual ZBPoint<double> GetUnits(); ! ! protected: ! short fPrinterResFile; ! PMPrintSession fPrintSession; ! PMPrintSettings fPrintSettings; ! PMPageFormat fPageFormat; ! ZDC* fPageDC; ! ZDC* fPaperDC; ! size_t fCurrentPageIndex; ! string fJobName; ! bool fPrinterOpen; ! bool fDocOpen; ! bool fPageOpen; ! }; ! ! #endif // ZCONFIG(OS, Carbon) ! ! #endif // __ZPrint_Carbon__ \ No newline at end of file Index: ZPrint_MacClassic.cpp =================================================================== RCS file: /cvsroot/zoolib/zoolib/src/platform/macos/ZPrint_MacClassic.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** ZPrint_MacClassic.cpp 22 Apr 2002 17:59:14 -0000 1.1 --- ZPrint_MacClassic.cpp 22 Apr 2002 18:02:28 -0000 1.2 *************** *** 1 **** ! static const char rcsid[] = "@(#) $Id$"; /* ------------------------------------------------------------ Copyright (c) 2002 Andrew Green and Learning in Motion, Inc. http://www.zoolib.org Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------ */ #include "ZPrint_MacClassic.h" #if ZCONFIG(OS, MacOS7) #include "ZDC_QD.h" #include "ZString.h" #include "ZUtil_Mac_HL.h" #include "ZUtil_Mac_LL.h" #include <Resources.h> // ==================================================================================================== #pragma mark - #pragma mark * ZPrintPageSetup_MacClassic ZPrintPageSetup_MacClassic::ZPrintPageSetup_MacClassic(const ZPrintPageSetup_MacClassic& iOther) { ZAssertStop(2, iOther.fTHPrint); fTHPrint = iOther.fTHPrint; ::HandToHand((Handle*)&fTHPrint); } ZPrintPageSetup_MacClassic::ZPrintPageSetup_MacClassic() { fTHPrint = (THPrint)::NewHandleClear(sizeof(TPrint)); if (fTHPrint == nil) throw bad_alloc(); ::PrOpen(); ::PrintDefault(fTHPrint); ::PrClose(); ::PrValidate(fTHPrint); } ZPrintPageSetup_MacClassic::~ZPrintPageSetup_MacClassic() { if (fTHPrint) ::DisposeHandle((Handle)fTHPrint); } ZRef<ZPrintPageSetup> ZPrintPageSetup_MacClassic::Clone() { return new ZPrintPageSetup_MacClassic(*this); } bool ZPrintPageSetup_MacClassic::DoPageSetupDialog() { ::PrOpen(); ZUtil_Mac_HL::sPreDialog(); bool result = false; if (::PrStlDialog(fTHPrint)) result = true; ZUtil_Mac_HL::sPostDialog(); ::PrClose(); return result; } ZRef<ZPrintJobSetup> ZPrintPageSetup_MacClassic::CreateJobSetup() { THPrint theTHPrint = fTHPrint; ::HandToHand(&((Handle)theTHPrint)); if (theTHPrint == nil) throw bad_alloc(); return new ZPrintJobSetup_MacClassic(theTHPrint); } ZBPoint<double> ZPrintPageSetup_MacClassic::GetPageSize() { return ZBRect<double>(fTHPrint[0]->prInfo.rPage).Size(); } ZBPoint<double> ZPrintPageSetup_MacClassic::GetPageOrigin() { ZBRect<double> paperRect(fTHPrint[0]->rPaper); ZBRect<double> pageRect(fTHPrint[0]->prInfo.rPage); return pageRect.TopLeft() - paperRect.TopLeft(); } ZBPoint<double> ZPrintPageSetup_MacClassic::GetPaperSize() { return ZBRect<double>(fTHPrint[0]->rPaper).Size(); } ZBPoint<double> ZPrintPageSetup_MacClassic::GetUnits() { return ZBPoint<double>(fTHPrint[0]->prInfo.iHRes, fTHPrint[0]->prInfo.iVRes); } // ==================================================================================================== #pragma mark - #pragma mark * ZPrintJobSetup_MacClassic ZPrintJobSetup_MacClassic::ZPrintJobSetup_MacClassic(const ZPrintJobSetup_MacClassic& iOther) { ZAssertStop(2, iOther.fTHPrint); fTHPrint = iOther.fTHPrint; ::HandToHand((Handle*)&fTHPrint); if (fTHPrint == nil) throw bad_alloc(); fOptions = iOther.fOptions; } ZPrintJobSetup_MacClassic::ZPrintJobSetup_MacClassic(THPrint iTHPrint) : fTHPrint(iTHPrint) {} ZPrintJobSetup_MacClassic::~ZPrintJobSetup_MacClassic() { if (fTHPrint) ::DisposeHandle((Handle)fTHPrint); } ZRef<ZPrintJobSetup> ZPrintJobSetup_MacClassic::Clone() { return new ZPrintJobSetup_MacClassic(*this); } void ZPrintJobSetup_MacClassic::SetOptions(const Options& iOptions) { fOptions = iOptions; fTHPrint[0]->prJob.iFstPage = fOptions.fFirstPage; fTHPrint[0]->prJob.iLstPage = fOptions.fLastPage; } ZPrintJobSetup::Options ZPrintJobSetup_MacClassic::GetOptions() { Options theOptions = fOptions; long localFirstPage = min(fTHPrint[0]->prJob.iFstPage, fTHPrint[0]->prJob.iLstPage); long localLastPage = max(fTHPrint[0]->prJob.iFstPage, fTHPrint[0]->prJob.iLstPage); if (localFirstPage == 1 && localLastPage == 9999) theOptions.fPageRange = Options::ePageRangeAll; else theOptions.fPageRange = Options::ePageRangeExplicit; theOptions.fFirstPage = localFirstPage; theOptions.fLastPage = localLastPage; return theOptions; } ZRef<ZPrintJob> ZPrintJobSetup_MacClassic::DoPrintDialogAndStartJob(const string& iJobName) { ::PrOpen(); ZUtil_Mac_HL::sPreDialog(); bool result = ::PrJobDialog(fTHPrint); ZUtil_Mac_HL::sPostDialog(); ::PrClose(); if (result) { THPrint theTHPrint = fTHPrint; ::HandToHand((Handle*)&theTHPrint); if (theTHPrint == nil) throw bad_alloc(); return new ZPrintJob_MacClassic(theTHPrint, iJobName); } return nil; } // ==================================================================================================== #pragma mark - #pragma mark * ZPrintJob_MacClassic ZPrintJob_MacClassic::ZPrintJob_MacClassic(THPrint iTHPrint, const string& iJobName) : fTHPrint(iTHPrint), fTPPrPort(nil), fPrinterResFile(-1), fPageDC(nil), fPaperDC(nil), fCurrentPageIndex(0), fJobName(iJobName), fDocOpen(false), fPageOpen(false) { // We have to reset these, otherwise the printer driver will discard // all pages up to but not including whatever was in iFstPage fTHPrint[0]->prJob.iFstPage = 1; fTHPrint[0]->prJob.iLstPage = 9999; } ZPrintJob_MacClassic::~ZPrintJob_MacClassic() { try { this->Finish(); } catch (...) {} if (fTHPrint) ::DisposeHandle((Handle)fTHPrint); } ZDC ZPrintJob_MacClassic::GetPageDC() { if (fPageDC == nil) { // We can't get the DC unless a page is open ZAssertStop(2, fPageOpen); // Set up the origin comp so that (0,0) is in the top left corner of the *page* if (fPaperDC) fPageDC = new ZDC(fPaperDC->GetCanvas(), ZPoint::sZero); else fPageDC = new ZDC(new ZDCCanvas_QD_Print(&fTPPrPort->gPort), ZPoint::sZero); ZRect pageRect = fTHPrint[0]->prInfo.rPage; fPageDC->SetClip(pageRect); } return *fPageDC; } ZDC ZPrintJob_MacClassic::GetPaperDC() { if (fPaperDC == nil) { // We can't get the DC unless a page is open ZAssertStop(2, fPageOpen); // Set up the origin comp so that (0,0) is in the top left // corner of the paper, regardless of how margins are set up ZRect paperRect = fTHPrint[0]->rPaper; if (fPageDC) fPaperDC = new ZDC(fPageDC->GetCanvas(), -paperRect.TopLeft()); else fPaperDC = new ZDC(new ZDCCanvas_QD_Print(&fTPPrPort->gPort), -paperRect.TopLeft()); // Set up clipping to encompass the whole page area. We can't image it all, but // the clip carries some information to anyone using the paperDC. If a client // has kept a DC referencing our underlying PrintPortWrapper then the clipping // (and other settings) for that DC will *not* be affected fPaperDC->SetClip(ZRect(paperRect.Size())); } return *fPaperDC; } void ZPrintJob_MacClassic::NewPage() { ZUtil_Mac_LL::PreserveResFile preserveResFile; ZUtil_Mac_LL::SaveRestoreResFile saveRestoreResFile(fPrinterResFile); try { if (!fPrinterOpen) { fPrinterOpen = true; ::PrOpen(); if (::PrError() != noErr) throw runtime_error("PrOpen Failed"); fPrinterResFile = ::CurResFile(); } // If we still have a page open, then close it (sending it to the printer or spooler) if (fPageOpen) { // Lose our printing DC's caches. If anyone has kept a reference to the // underlying PrintPortWrappers then that will still be valid, and the // settings in their DC will be used. Really though, users should acquire a // fresh reference to the DC after each page delete fPageDC; fPageDC = nil; delete fPaperDC; fP aperDC = nil; fPageOpen = false; ::PrClosePage(fTPPrPort); if (::PrError() != noErr) throw runtime_error("PrClosePage Failed"); // Check to see if we've hit iPFMaxPgs if (fCurrentPageIndex != 0 && ((fCurrentPageIndex % iPFMaxPgs) == 0)) { // If so, then we have to close the document fDocOpen = false; ::PrCloseDoc(fTPPrPort); if (::PrError() != noErr) throw runtime_error("PrCloseDoc Failed"); // And trigger the spool, I guess this only happens when we're not doing background printing if (fTHPrint[0]->prJob.bJDocLoop == bSpoolLoop) { TPrStatus theTPrStatus; ::PrPicFile(fTHPrint, nil, nil, nil, &theTPrStatus); } } } // Get the doc open, if needed if (!fDocOpen) { fDocOpen = true; // Create a window with fJobName as its title, placed physically offscreen so it's not // visible to the user. The printer driver pulls the title from the frontmost document // window in PrValidate() (ugly, no?) ZRect grayBounds((::GetGrayRgn())[0]->rgnBBox); Rect dummyWindowBounds = ZRect(-5,-5,-1,-1)+grayBounds.TopLeft(); WindowRef dummyWindow = ::NewCWindow(nil, &dummyWindowBounds, ZString::sAsPString(fJobName), true, plainDBox, (WindowRef)-1, false,0); ::PrValidate(fTHPrint); ::DisposeWindow(dummyWindow); fTPPrPort = ::PrOpenDoc(fTHPrint, nil, nil); if (::PrError() != noErr) throw runtime_error("PrOpenDoc failed"); } if (!fPageOpen) { fPageOpen = true; ::PrOpenPage(fTPPrPort, nil); if (::PrError() != noErr) throw runtime_error("PrOpenPage Failed"); } ++fCurrentPageIndex; } catch (...) { this->Finish(); throw; } } void ZPrintJob_MacClassic::Finish() { delete fPageDC; fPageDC = nil; delete fPaperDC; fPaperDC = nil; ZUtil_Mac_LL::PreserveResFile preserveResFile; ZUtil_Mac_LL::SaveRestoreResFile saveRestoreResFile(fPrinterResFile); if (fPageOpen) { fPageOpen = false; ::PrClosePage(fTPPrPort); } if (fDocOpen) { fDocOpen = false; ::PrCloseDoc(fTPPrPort); // And trigger the spool, I guess this only happens when we're not doing background printing if (fTHPrint[0]->prJob.bJDocLoop == bSpoolLoop) { TPrStatus theTPrStatus; ::PrPicFile(fTHPrint, nil, nil, nil, &theTPrStatus); } } fTPPrPort = nil; if (fPrinterOpen) { fPrinterOpen = false; ::PrClose(); fPrinterResFile = -1; } } void ZPrintJob_MacClassic::Abort() {} size_t ZPrintJob_MacClassic::GetCurrentPageIndex() { return fCurrentPageIndex; } ZBPoint<double> ZPrintJob_MacClassic::GetPageSize() { return ZBRect<double>(fTHPrint[0]->prInfo.rPage).Size(); } ZBPoint<double> ZPrintJob_MacClassic::GetPageOrigin() { ZBRect<double> paperRect(fTHPrint[0]->rPaper); ZBRect<double> pageRect(fTHPrint[0]->prInfo.rPage); return pageRect.TopLeft()-paperRect.TopLeft(); } ZBPoint<double> ZPrintJob_MacClassic::GetPaperSize() { return ZBRect<double>(fTHPrint[0]->rPaper).Size(); } ZBPoint<double> ZPrintJob_MacClassic::GetUnits() { return ZBPoint<double>(fTHPrint[0]->prInfo.iHRes, fTHPrint[0]->prInfo.iVRes);} #endif // ZCONFIG(OS, MacOS7) \ No newline at end of file --- 1,390 ---- ! static const char rcsid[] = "@(#) $Id$"; ! ! /* ------------------------------------------------------------ ! Copyright (c) 2002 Andrew Green and Learning in Motion, Inc. ! http://www.zoolib.org ! ! Permission is hereby granted, free of charge, to any person obtaining a copy ! of this software and associated documentation files (the "Software"), to deal ! in the Software without restriction, including without limitation the rights ! to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ! copies of the Software, and to permit persons to whom the Software is ! furnished to do so, subject to the following conditions: ! ! The above copyright notice and this permission notice shall be included in ! all copies or substantial portions of the Software. ! ! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ! IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ! FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ! COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ! AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ! CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ! ------------------------------------------------------------ */ ! ! #include "ZPrint_MacClassic.h" ! ! #if ZCONFIG(OS, MacOS7) ! ! #include "ZDC_QD.h" ! #include "ZString.h" ! #include "ZUtil_Mac_HL.h" ! #include "ZUtil_Mac_LL.h" ! ! #include <Resources.h> ! ! ! // ==================================================================================================== ! #pragma mark - ! #pragma mark * ZPrintPageSetup_MacClassic ! ! ZPrintPageSetup_MacClassic::ZPrintPageSetup_MacClassic(const ZPrintPageSetup_MacClassic& iOther) ! { ! ZAssertStop(2, iOther.fTHPrint); ! fTHPrint = iOther.fTHPrint; ! ::HandToHand((Handle*)&fTHPrint); ! } ! ! ZPrintPageSetup_MacClassic::ZPrintPageSetup_MacClassic() ! { ! fTHPrint = (THPrint)::NewHandleClear(sizeof(TPrint)); ! if (fTHPrint == nil) ! throw bad_alloc(); ! ::PrOpen(); ! ::PrintDefault(fTHPrint); ! ::PrClose(); ! ::PrValidate(fTHPrint); ! } ! ! ZPrintPageSetup_MacClassic::~ZPrintPageSetup_MacClassic() ! { ! if (fTHPrint) ! ::DisposeHandle((Handle)fTHPrint); ! } ! ! ZRef<ZPrintPageSetup> ZPrintPageSetup_MacClassic::Clone() ! { return new ZPrintPageSetup_MacClassic(*this); } ! ! bool ZPrintPageSetup_MacClassic::DoPageSetupDialog() ! { ! ::PrOpen(); ! ZUtil_Mac_HL::sPreDialog(); ! bool result = false; ! if (::PrStlDialog(fTHPrint)) ! result = true; ! ZUtil_Mac_HL::sPostDialog(); ! ::PrClose(); ! return result; ! } ! ! ZRef<ZPrintJobSetup> ZPrintPageSetup_MacClassic::CreateJobSetup() ! { ! THPrint theTHPrint = fTHPrint; ! ::HandToHand(&((Handle)theTHPrint)); ! if (theTHPrint == nil) ! throw bad_alloc(); ! return new ZPrintJobSetup_MacClassic(theTHPrint); ! } ! ! ZBPoint<double> ZPrintPageSetup_MacClassic::GetPageSize() ! { return ZBRect<double>(fTHPrint[0]->prInfo.rPage).Size(); } ! ! ZBPoint<double> ZPrintPageSetup_MacClassic::GetPageOrigin() ! { ! ZBRect<double> paperRect(fTHPrint[0]->rPaper); ! ZBRect<double> pageRect(fTHPrint[0]->prInfo.rPage); ! return pageRect.TopLeft() - paperRect.TopLeft(); ! } ! ! ZBPoint<double> ZPrintPageSetup_MacClassic::GetPaperSize() ! { return ZBRect<double>(fTHPrint[0]->rPaper).Size(); } ! ! ZBPoint<double> ZPrintPageSetup_MacClassic::GetUnits() ! { return ZBPoint<double>(fTHPrint[0]->prInfo.iHRes, fTHPrint[0]->prInfo.iVRes); } ! ! // ==================================================================================================== ! #pragma mark - ! #pragma mark * ZPrintJobSetup_MacClassic ! ! ZPrintJobSetup_MacClassic::ZPrintJobSetup_MacClassic(const ZPrintJobSetup_MacClassic& iOther) ! { ! ZAssertStop(2, iOther.fTHPrint); ! fTHPrint = iOther.fTHPrint; ! ::HandToHand((Handle*)&fTHPrint); ! if (fTHPrint == nil) ! throw bad_alloc(); ! fOptions = iOther.fOptions; ! } ! ! ZPrintJobSetup_MacClassic::ZPrintJobSetup_MacClassic(THPrint iTHPrint) ! : fTHPrint(iTHPrint) ! {} ! ! ZPrintJobSetup_MacClassic::~ZPrintJobSetup_MacClassic() ! { ! if (fTHPrint) ! ::DisposeHandle((Handle)fTHPrint); ! } ! ! ZRef<ZPrintJobSetup> ZPrintJobSetup_MacClassic::Clone() ! { return new ZPrintJobSetup_MacClassic(*this); } ! ! void ZPrintJobSetup_MacClassic::SetOptions(const Options& iOptions) ! { ! fOptions = iOptions; ! fTHPrint[0]->prJob.iFstPage = fOptions.fFirstPage; ! fTHPrint[0]->prJob.iLstPage = fOptions.fLastPage; ! } ! ! ZPrintJobSetup::Options ZPrintJobSetup_MacClassic::GetOptions() ! { ! Options theOptions = fOptions; ! long localFirstPage = min(fTHPrint[0]->prJob.iFstPage, fTHPrint[0]->prJob.iLstPage); ! long localLastPage = max(fTHPrint[0]->prJob.iFstPage, fTHPrint[0]->prJob.iLstPage); ! if (localFirstPage == 1 && localLastPage == 9999) ! theOptions.fPageRange = Options::ePageRangeAll; ! else ! theOptions.fPageRange = Options::ePageRangeExplicit; ! theOptions.fFirstPage = localFirstPage; ! theOptions.fLastPage = localLastPage; ! return theOptions; ! } ! ! ZRef<ZPrintJob> ZPrintJobSetup_MacClassic::DoPrintDialogAndStartJob(const string& iJobName) ! { ! ::PrOpen(); ! ZUtil_Mac_HL::sPreDialog(); ! bool result = ::PrJobDialog(fTHPrint); ! ZUtil_Mac_HL::sPostDialog(); ! ::PrClose(); ! if (result) ! { ! THPrint theTHPrint = fTHPrint; ! ::HandToHand((Handle*)&theTHPrint); ! if (theTHPrint == nil) ! throw bad_alloc(); ! return new ZPrintJob_MacClassic(theTHPrint, iJobName); ! } ! return nil; ! } ! ! // ==================================================================================================== ! #pragma mark - ! #pragma mark * ZPrintJob_MacClassic ! ! ZPrintJob_MacClassic::ZPrintJob_MacClassic(THPrint iTHPrint, const string& iJobName) ! : fTHPrint(iTHPrint), ! fTPPrPort(nil), ! fPrinterResFile(-1), ! fPageDC(nil), ! fPaperDC(nil), ! fCurrentPageIndex(0), ! fJobName(iJobName), ! fDocOpen(false), ! fPageOpen(false) ! { ! // We have to reset these, otherwise the printer driver will discard ! // all pages up to but not including whatever was in iFstPage ! fTHPrint[0]->prJob.iFstPage = 1; ! fTHPrint[0]->prJob.iLstPage = 9999; ! } ! ! ZPrintJob_MacClassic::~ZPrintJob_MacClassic() ! { ! try ! { this->Finish(); } ! catch (...) ! {} ! ! if (fTHPrint) ! ::DisposeHandle((Handle)fTHPrint); ! } ! ! ZDC ZPrintJob_MacClassic::GetPageDC() ! { ! if (fPageDC == nil) ! { ! // We can't get the DC unless a page is open ! ZAssertStop(2, fPageOpen); ! // Set up the origin comp so that (0,0) is in the top left corner of the *page* ! if (fPaperDC) ! fPageDC = new ZDC(fPaperDC->GetCanvas(), ZPoint::sZero); ! else ! fPageDC = new ZDC(new ZDCCanvas_QD_Print(&fTPPrPort->gPort), ZPoint::sZero); ! ! ZRect pageRect = fTHPrint[0]->prInfo.rPage; ! fPageDC->SetClip(pageRect); ! } ! ! return *fPageDC; ! } ! ! ZDC ZPrintJob_MacClassic::GetPaperDC() ! { ! if (fPaperDC == nil) ! { ! // We can't get the DC unless a page is open ! ZAssertStop(2, fPageOpen); ! // Set up the origin comp so that (0,0) is in the top left ! // corner of the paper, regardless of how margins are set up ! ZRect paperRect = fTHPrint[0]->rPaper; ! if (fPageDC) ! fPaperDC = new ZDC(fPageDC->GetCanvas(), -paperRect.TopLeft()); ! else ! fPaperDC = new ZDC(new ZDCCanvas_QD_Print(&fTPPrPort->gPort), -paperRect.TopLeft()); ! // Set up clipping to encompass the whole page area. We can't image it all, but ! // the clip carries some information to anyone using the paperDC. If a client ! // has kept a DC referencing our underlying PrintPortWrapper then the clipping ! // (and other settings) for that DC will *not* be affected ! fPaperDC->SetClip(ZRect(paperRect.Size())); ! } ! ! return *fPaperDC; ! } ! ! void ZPrintJob_MacClassic::NewPage() ! { ! ZUtil_Mac_LL::PreserveResFile preserveResFile; ! ZUtil_Mac_LL::SaveRestoreResFile saveRestoreResFile(fPrinterResFile); ! try ! { ! if (!fPrinterOpen) ! { ! fPrinterOpen = true; ! ::PrOpen(); ! if (::PrError() != noErr) ! throw runtime_error("PrOpen Failed"); ! fPrinterResFile = ::CurResFile(); ! } ! ! // If we still have a page open, then close it (sending it to the printer or spooler) ! if (fPageOpen) ! { ! // Lose our printing DC's caches. If anyone has kept a reference to the ! // underlying PrintPortWrappers then that will still be valid, and the ! // settings in their DC will be used. Really though, users should acquire a ! // fresh reference to the DC after each page ! delete fPageDC; ! fPageDC = nil; ! ! delete fPaperDC; ! fPaperDC = nil; ! ! fPageOpen = false; ! ::PrClosePage(fTPPrPort); ! if (::PrError() != noErr) ! throw runtime_error("PrClosePage Failed"); ! ! // Check to see if we've hit iPFMaxPgs ! if (fCurrentPageIndex != 0 && ((fCurrentPageIndex % iPFMaxPgs) == 0)) ! { ! // If so, then we have to close the document ! fDocOpen = false; ! ::PrCloseDoc(fTPPrPort); ! if (::PrError() != noErr) ! throw runtime_error("PrCloseDoc Failed"); ! // And trigger the spool, I guess this only happens when we're not doing background printing ! if (fTHPrint[0]->prJob.bJDocLoop == bSpoolLoop) ! { ! TPrStatus theTPrStatus; ! ::PrPicFile(fTHPrint, nil, nil, nil, &theTPrStatus); ! } ! } ! } ! ! // Get the doc open, if needed ! if (!fDocOpen) ! { ! fDocOpen = true; ! // Create a window with fJobName as its title, placed physically offscreen so it's not ! // visible to the user. The printer driver pulls the title from the frontmost document ! // window in PrValidate() (ugly, no?) ! ZRect grayBounds((::GetGrayRgn())[0]->rgnBBox); ! Rect dummyWindowBounds = ZRect(-5,-5,-1,-1)+grayBounds.TopLeft(); ! WindowRef dummyWindow = ::NewCWindow(nil, &dummyWindowBounds, ZString::sAsPString(fJobName), true, plainDBox, (WindowRef)-1, false,0); ! ::PrValidate(fTHPrint); ! ::DisposeWindow(dummyWindow); ! fTPPrPort = ::PrOpenDoc(fTHPrint, nil, nil); ! ! if (::PrError() != noErr) ! throw runtime_error("PrOpenDoc failed"); ! } ! ! if (!fPageOpen) ! { ! fPageOpen = true; ! ::PrOpenPage(fTPPrPort, nil); ! if (::PrError() != noErr) ! throw runtime_error("PrOpenPage Failed"); ! } ! ++fCurrentPageIndex; ! } ! catch (...) ! { ! this->Finish(); ! throw; ! } ! } ! ! void ZPrintJob_MacClassic::Finish() ! { ! delete fPageDC; ! fPageDC = nil; ! ! delete fPaperDC; ! fPaperDC = nil; ! ! ZUtil_Mac_LL::PreserveResFile preserveResFile; ! ZUtil_Mac_LL::SaveRestoreResFile saveRestoreResFile(fPrinterResFile); ! ! if (fPageOpen) ! { ! fPageOpen = false; ! ::PrClosePage(fTPPrPort); ! } ! ! if (fDocOpen) ! { ! fDocOpen = false; ! ::PrCloseDoc(fTPPrPort); ! // And trigger the spool, I guess this only happens when we're not doing background printing ! if (fTHPrint[0]->prJob.bJDocLoop == bSpoolLoop) ! { ! TPrStatus theTPrStatus; ! ::PrPicFile(fTHPrint, nil, nil, nil, &theTPrStatus); ! } ! } ! ! fTPPrPort = nil; ! ! if (fPrinterOpen) ! { ! fPrinterOpen = false; ! ::PrClose(); ! fPrinterResFile = -1; ! } ! } ! ! void ZPrintJob_MacClassic::Abort() ! {} ! ! size_t ZPrintJob_MacClassic::GetCurrentPageIndex() ! { return fCurrentPageIndex; } ! ! ZBPoint<double> ZPrintJob_MacClassic::GetPageSize() ! { return ZBRect<double>(fTHPrint[0]->prInfo.rPage).Size(); } ! !... [truncated message content] |