bool MacPrinterCanvas::setup(bool s){ #if carbon return false; #else GetPort(&oldPort); PrOpen(); if (!prRecHdl) { prRecHdl = THPrint(NewHandleClear(sizeof(TPrint))); if (PrError() != noErr) { return false; } PrintDefault(prRecHdl); if (PrError() != noErr) { return false; } }else{ PrValidate(prRecHdl); } if (s) { PrStlDialog(prRecHdl); } PrClose(); if (PrError() != noErr) { return false; } //debugfile("MacPrinterCanvas::setup width=%d height=%d\n", pwidth(), pheight()); SetPort(oldPort); return true; #endif }
bool MacPrinterCanvas::finish() { #if carbon return false; #else endPaint(); PrClosePage(gPrinterPort); if (PrError() != noErr) { return false; } PrCloseDoc(gPrinterPort); if (PrError() != noErr) { return false; } if ((**prRecHdl).prJob.bJDocLoop == bSpoolLoop) { TPrStatus theStatus; PrPicFile(prRecHdl, nil, nil, nil, &theStatus); if (PrError() != noErr) { return false; } } PrClose(); if (PrError() != noErr) { return false; } SetPort(oldPort); //debugfile("MacPrinter::finish\n"); return true; #endif }
void ClosePrinter(void) { #if TARGET_API_MAC_CARBON //if(gPageFormat) {PMRelease(gPageFormat); gPageFormat = 0;} // we want to save the pageFormat so the user can get the settings they set in Page Setup if(gPrintSettings) {PMRelease(gPrintSettings); gPrintSettings = 0;} if(gPrintSession) {PMRelease(gPrintSession); gPrintSession = 0;} // Apple says... "By not saving print settings between calls to the Print dialog, you ensure that the dialog displays with the appropriate default settings, which is the recommended behavior." #else PrClose(); #endif }
int ioPrintCleanup(PrintingLogicPtr *token) { PrintingLogicPtr printJob; // Release the PageFormat and PrintSettings objects. PMRelease decrements the // ref count of the allocated objects. We let the Printing Manager decide when // to release the allocated memory. printJob = *token; if (printJob == nil) return 0; // Terminate the current printing session. PrClose(); if(printJob->thePrRecHdl != NULL) DisposeHandle ((Handle) printJob->thePrRecHdl); printJob->thePrRecHdl = NULL; DisposePtr((char*)printJob); *token = nil; return 0; }
boolean shellprint (WindowPtr w, boolean fldialog) { /* 9/5/90 dmb: open and close print resources each time we're called. also, make sure we close each page opened, even when errors occur 9/28/91 dmb: for exit of edit mode before printing 4/24/92 dmb: make sure bJDocLoop is bSpoolLoop before calling PrPicFile, as per IM II-155. otherwise, we can get bogus PrErrors */ // classic mac TPPrPort printport; TPrStatus printstatus; THPrint hp = shellprintinfo.printhandle; SInt32 firstPage = 1; SInt32 lastPage = 9999; short i; boolean fl = false; if (w == nil) /*defensive driving*/ return (false); PrOpen (); if (!shellcheckprinterror (true)) return (false); fl = false; /*until sucessfull print, this is return value*/ if (fldialog) { if (!PrJobDialog (hp)) goto exit; } else PrValidate (hp); setcursortype (cursoriswatch); shellupdateallnow (); /*update all windows that were dirtied by the print dialog*/ shellpushglobals (w); (*shellglobals.settextmoderoutine) (false); /*make sure editing changes are accepted*/ pushport (nil); /*save current port on stack*/ shellprintinfo.printport = printport = PrOpenDoc (hp, nil, nil); currentprintport = w; /*prepares for printing*/ (*shellglobals.beginprintroutine) (); /*fills in fields of printinfo record*/ (*shellglobals.setprintinfoproutine) (); //this only counts the number of pages. // wird in classic lastPage gesetzt? if(lastPage > shellprintinfo.ctpages) lastPage = shellprintinfo.ctpages; for (i = 1; i <= lastPage; i++) { /*print one page*/ if (PrError () != noErr) break; PrOpenPage (printport, nil); if (PrError () == noErr) { SetFractEnable (true); fl = (*shellglobals.printroutine) (i); SetFractEnable (false); } PrClosePage (printport); if (!fl) break; if (keyboardescape ()) { PrSetError (iPrAbort); } } /*for*/ PrCloseDoc (printport); if (fl) { if ( (PrError () == noErr) && ((**hp).prJob.bJDocLoop == bSpoolLoop)) { PrPicFile (hp, nil, nil, nil, &printstatus); } fl = shellcheckprinterror (false); } popport (); (*shellglobals.endprintroutine) (); shellpopglobals (); exit: PrClose (); currentprintport = NULL; return (fl); } /*shellprint*/
boolean shellpagesetup (void) { /* 9/5/90 dmb: open and close print resources each time we're called 9/27/91 dmb: don't do anything when the user cancels the dialog */ boolean fl; #ifdef MACVERSION //Code change by Timothy Paustian Friday, June 16, 2000 10:08:37 PM //new code for the new print manager. # if TARGET_API_MAC_CARBON == 1 if (!carbonValidSession()) { carbonStdSetup(); } { OSStatus status; status = PMSessionPageSetupDialog( shellprintinfo.printhandle, shellprintinfo.pageformat, &fl); if (!fl) status = kPMCancel; // user clicked Cancel button if(status != noErr) return false; } # else PrOpen (); if (!shellcheckprinterror (true)) return (false); PrValidate (shellprintinfo.printhandle); fl = PrStlDialog (shellprintinfo.printhandle); PrClose (); if (!shellcheckprinterror (false)) return (false); # endif #endif #ifdef WIN95VERSION shellprintinfo.pagesetupinfo.Flags = PSD_MARGINS | PSD_INTHOUSANDTHSOFINCHES; shellprintinfo.pagesetupinfo.hwndOwner = hwndMDIClient; fl = PageSetupDlg (&shellprintinfo.pagesetupinfo); #endif if (!fl) return (false); shellcopyprintinfo (); /*copies fields from handle into record*/ shellvisittypedwindows (-1, &shellpagesetupvisit, nil); /*visit all windows*/ return (true); } /*shellpagesetup*/
boolean shellinitprint (void) { /* 9/5/90 dmb: close print resources after initializing stuff 10/21/91 dmb: added margins field to print info; structure is now here to have user-settable margins. 12/31/91 dmb: initialize shellprintinfo.paperrect to standard 72dpi values in case no printer is chosen and shellcopyprintinfo never gets called 1/18/93 dmb: don't call shellcheckprinterror the first time; if PrOpen fails here, we don't want to raise an alert. */ #if MACVERSION && !TARGET_API_MAC_CARBON Handle h; #endif currentprintport = NULL; clearbytes (&shellprintinfo, longsizeof (shellprintinfo)); setrect (&shellprintinfo.margins, 36, 36, 36, 36); setrect (&shellprintinfo.paperrect, 5, 6, 725, 546); /*defaults in case PrOpen fails*/ shellprintinfo.scaleMult = 1; shellprintinfo.scaleDiv = 1; #ifdef MACVERSION # if TARGET_API_MAC_CARBON == 1 //I realized this is only called once during the startup of the app. //Carbon printing really doesn't need any global structures. Better to //allocate them as we use them. // Nope. // We need a global var for calling page setup shellprintinfo.printport = nil; shellprintinfo.printhandle = nil; shellprintinfo.pageformat = nil; shellprintinfo.printsettings = nil; // shellprintinfo.pagerect = {0,0,0,0}; # else if (!newclearhandle (longsizeof (TPrint), &h)) return (false); shellprintinfo.printhandle = (THPrint) h; /*copy into print record*/ PrOpen (); /*initialize the Mac print manager*/ if (PrError () != noErr) goto error; PrintDefault (shellprintinfo.printhandle); /*set default print record*/ PrClose (); /*shouldn't leave print resources open all the time*/ if (!shellcheckprinterror (false)) goto error; # endif #endif #ifdef WIN95VERSION ZeroMemory (&shellprintinfo.pagesetupinfo, sizeof (PAGESETUPDLG)); shellprintinfo.pagesetupinfo.lStructSize = sizeof (PAGESETUPDLG); shellprintinfo.pagesetupinfo.hwndOwner = NULL; shellprintinfo.pagesetupinfo.Flags = PSD_RETURNDEFAULT | PSD_NOWARNING; if (! PageSetupDlg (&shellprintinfo.pagesetupinfo)) { if (CommDlgExtendedError() != 0) goto error; } #endif //#if !TARGET_API_MAC_CARBON shellcopyprintinfo (); /*copies fields from handle into record*/ //#endif return (true); #if !defined(MACVERSION) || !TARGET_API_MAC_CARBON error: #endif /* shelldisposeprintinfo (); */ return (false); } /*shellinitprint*/
// LR 1.66 -- complete rewrite (basically) of this entire routine...it was UGLY! OSStatus HandleMenu( long mSelect, short modifiers ) { short menuID = HiWord( mSelect ); short menuItem = LoWord( mSelect ); short colorResID; WindowRef frontWindow; DialogPtr dlgRef = NULL; EditWindowPtr dWin = NULL; Str255 currentWindowName, newFrontWindowName; // NS: v1.6.6, for window menu WindowRef currentWindow; // NS: this too // Predetermine what type of window we have to work with frontWindow = FrontNonFloatingWindow(); if( frontWindow ) { DialogPtr dlg = GetDialogFromWindow( frontWindow ); if( kHexEditWindowTag == GetWindowKind( frontWindow ) ) dWin = (EditWindowPtr) GetWRefCon( frontWindow ); else if( g.gotoDlg == dlg || g.searchDlg == dlg ) dlgRef = dlg; } switch( menuID ) { case kAppleMenu: if( menuItem == AM_About ) HexEditAboutBox(); #if !TARGET_API_MAC_CARBON else { GrafPtr savePort; Str255 name; GetPort( &savePort ); GetMenuItemText( appleMenu, menuItem, name ); OpenDeskAcc( name ); SetPort( savePort ); } #endif break; case kFileMenu: switch( menuItem ) { case FM_New: gPrefs.overwrite = false; //LR 190 -- overwrite mode makes no sense in a new document NewEditWindow(); break; case FM_Open: AskEditWindow( kWindowNormal ); break; // HR/LR 050328 - Handle FM_Disassemble menu item case FM_Disassemble: g.disassemble = !g.disassemble; if ( g.disassemble ) { dWin->drawMode = DM_Disassembly; dWin->bytesPerLine = kDisBytesPerLine; dWin->hexStart = kDisHexStart; dWin->asciiStart = kDisASCIIStart; } else { dWin->drawMode = DM_Dump; dWin->bytesPerLine = kHexBytesPerLine; dWin->hexStart = kHexHexStart; dWin->asciiStart = kHexASCIIStart; } /* Make sure the editOffset position starts on a new line */ dWin->editOffset -= dWin->editOffset % dWin->bytesPerLine; UpdateEditWindows(); break; case FM_OtherFork: // LR: I want to see both! if( dWin ) { short fork; //LR 180 EditWindowPtr ewin; if( dWin->fork == FT_Data ) fork = FT_Resource; else fork = FT_Data; /*LR 180 -- OpenEditWindow checks for this if( NULL != (ewin = LocateEditWindow( &dWin->fsSpec, fork )) ) // LR: 1.7 - boolean typecast causes failure! { SelectWindow( ewin->oWin.theWin ); // just select existing theWin } else // try to open other fork in new theWin! */ { g.forkMode = fork; OpenEditWindow( &dWin->fsSpec, kWindowNormal, true ); } } break; case FM_CompareFiles: //LR 180 -- now pass in modifiers to allow select override if( GetCompareFiles( modifiers ) ) DoComparison(); break; //LR: 1.66 - NOTE: dWin == NULL == frontWindow! case FM_Save: if( dWin && dWin->oWin.Save ) dWin->oWin.Save( frontWindow ); break; case FM_SaveAs: if( dWin && dWin->oWin.SaveAs ) dWin->oWin.SaveAs( frontWindow ); break; case FM_Revert: if( dWin && dWin->oWin.Revert ) //LR 1.72 -- check before reverting (could be dangerous!) { ParamText( dWin->fsSpec.name, NULL, NULL, NULL ); switch( CautionAlert( alertRevert, NULL ) ) { case ok: dWin->oWin.Revert( frontWindow ); break; } } break; case FM_Close: if( dWin ) CloseEditWindow( frontWindow ); else if( dlgRef ) { HideWindow( frontWindow ); //LR: 1.7 -- no need.GetDialogWindow( dlgRef ) ); } break; case FM_Quit: if( CloseAllEditWindows() ) g.quitFlag = true; break; case FM_PageSetup: #if TARGET_API_MAC_CARBON // sel - carbon session based printing _doPageSetupDialog(&g.pageFormat); #else PrOpen(); PrStlDialog( g.HPrint ); PrClose(); #endif break; case FM_Print: if( dWin ) PrintWindow( dWin ); break; } break; case kEditMenu: #if !TARGET_API_MAC_CARBON if( !SystemEdit( menuItem -1 ) ) #endif { if( dWin ) switch( menuItem ) { case EM_Undo: UndoOperation(); break; case EM_Cut: CutSelection( dWin ); break; case EM_Copy: CopySelection( dWin ); break; case EM_Paste: PasteSelection( dWin ); break; case EM_Clear: ClearSelection( dWin ); break; case EM_SelectAll: dWin->startSel = 0; dWin->endSel = dWin->fileSize; UpdateOnscreen( dWin->oWin.theWin ); break; } else if( dlgRef ) switch( menuItem ) { case EM_Cut: DialogCut( dlgRef ); TEToScrap(); break; case EM_Copy: DialogCopy( dlgRef ); TEToScrap(); break; case EM_Paste: TEFromScrap(); DialogPaste( dlgRef ); break; case EM_Clear: DialogDelete( dlgRef ); break; case EM_SelectAll: break; } } break; case kFindMenu: switch ( menuItem ) { case SM_Find: openfind: OpenSearchDialog(); break; case SM_FindForward: gPrefs.searchForward = true; PerformTextSearch( dWin, kSearchUpdateUI ); //LR 190 -- if dWin is NULL will operate on first edit window, if any (allows search in find dialog) break; case SM_FindBackward: gPrefs.searchForward = false; PerformTextSearch( dWin, kSearchUpdateUI ); //LR 190 -- if dWin is NULL will operate on first edit window break; case SM_Replace: //LR 190 -- add replace & find next (must have a window with selection to start!) if( !dWin ) dWin = FindFirstEditWindow(); // allow this to work in find dialog, etc. if( dWin && dWin->startSel != dWin->endSel ) { EditChunk **replaceChunk; if( !g.searchBuffer[0] ) // if nothing to find open dialog goto openfind; replaceChunk = NewChunk( g.replaceText[0], 0, 0, CT_Unwritten ); if( replaceChunk ) { // Copy replacement text to chunk buffer BlockMoveData( g.replaceText+1, *(*replaceChunk)->data, g.replaceText[0] ); // Do the replacement (with undo) g.replaceAll = false; RememberOperation( dWin, EO_Paste, &gUndo ); PasteOperation( dWin, replaceChunk ); // We're done with the chunk now DisposeChunk( NULL, replaceChunk ); } // Then try to find the next occurance (in LAST direction searched!) and display it if( !PerformTextSearch( dWin, kSearchUpdateUI ) ) ScrollToSelection( dWin, dWin->startSel, true ); } break; case SM_GotoAddress: OpenGotoAddress(); break; } break; case kOptionsMenu: switch ( menuItem ) { case OM_HiAscii: gPrefs.asciiMode = !gPrefs.asciiMode; if( gPrefs.asciiMode ) g.highChar = 0xFF; else g.highChar = 0x7F; UpdateEditWindows(); break; case OM_DecimalAddr: gPrefs.decimalAddr = !gPrefs.decimalAddr; UpdateEditWindows(); break; case OM_Backups: gPrefs.backupFlag = !gPrefs.backupFlag; break; case OM_WinSize: gPrefs.constrainSize = !gPrefs.constrainSize; break; case OM_Overwrite: gPrefs.overwrite = !gPrefs.overwrite; break; case OM_NonDestructive: gPrefs.nonDestructive = !gPrefs.nonDestructive; break; case OM_MoveOnlyPaging: gPrefs.moveOnlyPaging = !gPrefs.moveOnlyPaging; break; case OM_Unformatted: gPrefs.formatCopies = !gPrefs.formatCopies; break; case OM_VertBars: gPrefs.vertBars = !gPrefs.vertBars; UpdateEditWindows(); break; case OM_ComparePref: // LR: compare options ComparisonPreferences(); break; case OM_OpenOnLaunch: gPrefs.dialogAtLaunch = !gPrefs.dialogAtLaunch; //LR -- 192 break; } break; // LR: Add color scheme menu case kColorMenu: colorResID = GetColorMenuResID( menuItem ); if( menuItem == CM_UseColor ) { gPrefs.useColor = !gPrefs.useColor; // toggle color usage } else if( dWin && dWin->csResID > 0 ) // can't color B&W windows! { if( _cmCheckedItem ) CheckMenuItem( colorMenu, _cmCheckedItem, false ); if( (modifiers & optionKey) ) // option down == change all windows (set default color) { EditWindowPtr eWin = FindFirstEditWindow(); while( eWin ) { if( GetWindowKind( eWin->oWin.theWin ) == kHexEditWindowTag ) { eWin->csResID = colorResID; eWin->csMenuID = menuItem; //LR 181 -- for menu tagging } eWin = FindNextEditWindow( eWin ); } goto savepref; } else //LR 181 -- default is (back) to changing color of a single window! { if( GetWindowKind( dWin->oWin.theWin ) == kHexEditWindowTag ) { dWin->csResID = colorResID; dWin->csMenuID = menuItem; //LR 181 -- for menu tagging } } } else { savepref: //LR 190 -- no window open == set preferred color gPrefs.csResID = colorResID; //LR 180 -- save prefs when changing all gPrefs.csMenuID = menuItem; } UpdateEditWindows(); break; // LR : 1.7 - rewrite with bug checking (could crash accessing NULL window) case kWindowMenu: GetMenuItemText( windowMenu, menuItem, newFrontWindowName ); currentWindow = FrontNonFloatingWindow(); while( currentWindow ) { GetWTitle( currentWindow, currentWindowName ); if( EqualPStrings( currentWindowName, newFrontWindowName ) ) { SelectWindow( currentWindow ); break; } currentWindow = GetNextWindow( currentWindow ); } break; } HiliteMenu( 0 ); AdjustMenus(); return( noErr ); }