/************************************************************/ /* Windows Write, Copyright 1985-1990 Microsoft Corporation */ /************************************************************/ /* This file contains the dialog box routines for the print dialog box and the printer initialization code. */ #define NOGDICAPMASKS #define NOVIRTUALKEYCODES #define NOWINSTYLES #define NOSYSMETRICS #define NOMENUS #define NOCLIPBOARD #define NOKEYSTATE #define NOSYSCOMMANDS #define NORASTEROPS #define NOSHOWWINDOW #define NOATOM #define NOCREATESTRUCT #define NODRAWTEXT #define NOMB #define NOMEMMGR #define NOMETAFILE #define NOWH #define NOWNDCLASS #define NOSOUND #define NOCOLOR #define NOSCROLL #define NOCOMM #include #include "mw.h" #include "cmddefs.h" #include "dlgdefs.h" #include "str.h" #include "printdef.h" #include "fmtdefs.h" #include "propdefs.h" fnPrPrinter() { /* This routine is the outside world's interface to the print code. */ extern HWND hParentWw; extern HANDLE hMmwModInstance; extern CHAR *vpDlgBuf; extern int docCur; CHAR rgbDlgBuf[sizeof(int) + 2 * sizeof(BOOL)]; #ifdef INEFFLOCKDOWN extern FARPROC lpDialogPrint; #else BOOL far PASCAL DialogPrint(HWND, unsigned, WORD, LONG); FARPROC lpDialogPrint; if (!(lpDialogPrint = MakeProcInstance(DialogPrint, hMmwModInstance))) { WinFailure(); return; } #endif vpDlgBuf = &rgbDlgBuf[0]; switch (OurDialogBox(hMmwModInstance, MAKEINTRESOURCE(dlgPrint), hParentWw, lpDialogPrint)) { case idiOk: /* Force all of the windows to clean up their act. */ DispatchPaintMsg(); /* At this point, we have the following : vfPrPages = true if print page range else print all pages vpgnBegin = starting page number (if vfPrPages) vpgnEnd = ending page number (if vfPrPages) vcCopies = number of copies to print */ PrintDoc(docCur, TRUE); break; case -1: /* We didn't even have enough memory to create the dialog box. */ #ifdef WIN30 WinFailure(); #else Error(IDPMTNoMemory); #endif break; } #ifndef INEFFLOCKDOWN FreeProcInstance(lpDialogPrint); #endif } BOOL far PASCAL DialogPrint( hDlg, message, wParam, lParam ) HWND hDlg; unsigned message; WORD wParam; LONG lParam; { /* This routine handles input to the Print dialog box. */ extern CHAR *vpDlgBuf; extern int vfPrPages; /* true if print page range */ extern int vpgnBegin; /* starting page number to print */ extern int vpgnEnd; /* ending page number to print */ extern int vcCopies; /* nubmer of copies to print */ extern BOOL vfPrinterValid; extern HDC vhDCPrinter; extern int vfDraftMode; extern HWND vhWndMsgBoxParent; extern ferror; extern HCURSOR vhcArrow; extern int vfCursorVisible; extern CHAR (**hszPrinter)[]; extern CHAR (**hszPrDriver)[]; extern CHAR (**hszPrPort)[]; int *pidiRBDown = (int *)vpDlgBuf; BOOL *pfDraftMode = (BOOL *)(vpDlgBuf + sizeof(int)); BOOL *pfDraftSupport = (BOOL *)(vpDlgBuf + sizeof(int) + sizeof(BOOL)); int iEscape; CHAR szPrDescrip[cchMaxProfileSz]; switch (message) { case WM_INITDIALOG: BuildPrSetupSz(szPrDescrip, &(**hszPrinter)[0], &(**hszPrPort)[0]); SetDlgItemText(hDlg, idiPrtDest, (LPSTR)szPrDescrip); SetDlgItemText(hDlg, idiPrtCopies, (LPSTR)"1"); SelectIdiText(hDlg, idiPrtCopies); if (vfPrPages) { *pidiRBDown = idiPrtFrom; SetDlgItemInt(hDlg, idiPrtPageFrom, vpgnBegin, TRUE); SetDlgItemInt(hDlg, idiPrtPageTo, vpgnEnd, TRUE); } else { *pidiRBDown = idiPrtAll; } iEscape = DRAFTMODE; if (*pfDraftSupport = vfPrinterValid && vhDCPrinter && Escape(vhDCPrinter, QUERYESCSUPPORT, sizeof(int), (LPSTR)&iEscape, (LPSTR)NULL)) { CheckDlgButton(hDlg, idiPrtDraft, *pfDraftMode = vfDraftMode); } else { EnableWindow(GetDlgItem(hDlg, idiPrtDraft), FALSE); if (!vhDCPrinter) /* we've got a timing thing whereby they managed to get into the print dialog inbetween the time printer.setup had unhooked the old printer and the hookup of the new one! ..pault */ EnableWindow(GetDlgItem(hDlg, idiOk), FALSE); } CheckDlgButton(hDlg, *pidiRBDown, TRUE); EnableOtherModeless(FALSE); break; case WM_SETVISIBLE: if (wParam) { EndLongOp(vhcArrow); } return(FALSE); case WM_ACTIVATE: if (wParam) { vhWndMsgBoxParent = hDlg; } if (vfCursorVisible) { ShowCursor(wParam); } return (FALSE); case WM_COMMAND: switch (wParam) { BOOL fPages; int pgnBegin; int pgnEnd; int cCopies; case idiOk: if (fPages = (*pidiRBDown == idiPrtFrom)) { /* Get the range of pages to print. */ if (!WPwFromItW3Id(&pgnBegin, hDlg, idiPrtPageFrom, pgnMin, pgnMax, wNormal, IDPMTNPI)) { /* Reset error condition, so as to report any further error. */ ferror = FALSE; return(TRUE); } if (!WPwFromItW3Id(&pgnEnd, hDlg, idiPrtPageTo, pgnMin, pgnMax, wNormal, IDPMTNPI)) { /* Reset error condition, so as to report any further error. */ ferror = FALSE; return(TRUE); } } /* Get the number of copies to print. */ if (!WPwFromItW3IdFUt(&cCopies, hDlg, idiPrtCopies, 1, 32767, wNormal, IDPMTNPI, FALSE, 0 )) { /* Reset error condition, so as to report any further error. */ ferror = FALSE; return(TRUE); } /* If we have gotten this far, then everything must be okey-dokey. */ vfDraftMode = *pfDraftSupport ? *pfDraftMode : FALSE; if (vfPrPages = fPages) { vpgnBegin = pgnBegin; vpgnEnd = pgnEnd; } vcCopies = cCopies; case idiCancel: OurEndDialog(hDlg, wParam); break; case idiPrtPageFrom: case idiPrtPageTo: if (HIWORD(lParam) == EN_CHANGE) { if (SendMessage(LOWORD(lParam), WM_GETTEXTLENGTH, 0, 0L) && *pidiRBDown != idiPrtFrom) { CheckDlgButton(hDlg, *pidiRBDown, FALSE); CheckDlgButton(hDlg, *pidiRBDown = idiPrtFrom, TRUE); } return(TRUE); } return(FALSE); case idiPrtAll: case idiPrtFrom: CheckDlgButton(hDlg, *pidiRBDown, FALSE); CheckDlgButton(hDlg, *pidiRBDown = wParam, TRUE); // set focus to the edit field automatically if (wParam == idiPrtFrom) SetFocus(GetDlgItem(hDlg, idiPrtPageFrom)); break; case idiPrtDraft: CheckDlgButton(hDlg, wParam, *pfDraftMode = !(*pfDraftMode)); break; default: return(FALSE); } break; default: return(FALSE); } return(TRUE); } BOOL FInitHeaderFooter(fHeader, ppgn, phrgpld, pcpld) BOOL fHeader; unsigned *ppgn; struct PLD (***phrgpld)[]; int *pcpld; { /* This routine initializes the array of print line descriptors used in positioning the header/footer on the printed page. FALSE is returned if an error occurs; TRUE otherwise. */ extern typeCP cpMinHeader; extern typeCP cpMacHeader; extern typeCP cpMinFooter; extern typeCP cpMacFooter; extern int docCur; extern struct PAP vpapAbs; extern struct SEP vsepAbs; extern int dxaPrOffset; extern int dyaPrOffset; extern int dxpPrPage; extern int dxaPrPage; extern int dypPrPage; extern int dyaPrPage; extern struct FLI vfli; extern int vfOutOfMemory; typeCP cpMin; typeCP cpMac; /* Get the cpMin and the cpMac for the header/footer. */ if (fHeader) { cpMin = cpMinHeader; cpMac = cpMacHeader; } else { cpMin = cpMinFooter; cpMac = cpMacFooter; } /* Is there a header/footer. */ if (cpMac - cpMin > ccpEol) { int cpld = 0; int cpldReal = 0; int cpldMax; int xp; int yp; int ichCp = 0; typeCP cpMacDoc = CpMacText(docCur); /* Compute the page number of the start of the headers/footers. */ CacheSect(docCur, cpMin); if ((*ppgn = vsepAbs.pgnStart) == pgnNil) { *ppgn = 1; } /* Does the header/footer appear on the first page. */ CachePara(docCur, cpMin); if (!(vpapAbs.rhc & RHC_fFirst)) { (*ppgn)++; } /* Calculate the bounds of the header/footer in pixels. */ xp = MultDiv(vsepAbs.xaLeft - dxaPrOffset, dxpPrPage, dxaPrPage); yp = fHeader ? MultDiv(vsepAbs.yaRH1 - dyaPrOffset, dypPrPage, dyaPrPage) : 0; /* Initialize the array of print line descriptors for the header/footer. */ if (FNoHeap(*phrgpld = (struct PLD (**)[])HAllocate((cpldMax = cpldRH) * cwPLD))) { *phrgpld = NULL; return (FALSE); } /* We now have to calculate the array of print line descriptors for the header/footer. */ cpMac -= ccpEol; while (cpMin < cpMac) { /* Format this line of the header/footer for the printer. */ FormatLine(docCur, cpMin, ichCp, cpMacDoc, flmPrinting); /* Bail out if an error occurred. */ if (vfOutOfMemory) { return (FALSE); } /* Is the array of print line descriptors big enough? */ if (cpld >= cpldMax && !FChngSizeH(*phrgpld, (cpldMax += cpldRH) * cwPLD, FALSE)) { return (FALSE); } /* Fill the print line descriptor for this line. */ { register struct PLD *ppld = &(***phrgpld)[cpld++]; ppld->cp = cpMin; ppld->ichCp = ichCp; ppld->rc.left = xp + vfli.xpLeft; ppld->rc.right = xp + vfli.xpReal; ppld->rc.top = yp; ppld->rc.bottom = yp + vfli.dypLine; } /* Keep track of the non-blank lines in the header/footer */ if ((vfli.ichReal > 0) || vfli.fGraphics) { cpldReal = cpld; } /* Bump the counters. */ cpMin = vfli.cpMac; ichCp = vfli.ichCpMac; yp += vfli.dypLine; } /* If this is a footer, then we have to move the positions of the lines around so that the footer ends where the user has requested. */ if (!fHeader && cpldReal > 0) { register struct PLD *ppld = &(***phrgpld)[cpldReal - 1]; int dyp = MultDiv(vsepAbs.yaRH2 - dyaPrOffset, dypPrPage, dyaPrPage) - ppld->rc.bottom; int ipld; for (ipld = cpldReal; ipld > 0; ipld--, ppld--) { ppld->rc.top += dyp; ppld->rc.bottom += dyp; } } /* Record the number of non-blank lines in the head/footer. */ *pcpld = cpldReal; } else { /* Indicate there is no header/footer. */ *ppgn = pgnNil; *phrgpld = NULL; *pcpld = 0; } return (TRUE); }