|
|
/************************************************************/ /* 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 <windows.h>
#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); }
|