Annotation of ntddk/src/print/pscrptui/document.c, revision 1.1.1.1

1.1       root        1: //--------------------------------------------------------------------------
                      2: //
                      3: // Module Name:  DOCUMENT.C
                      4: //
                      5: // Brief Description:  This module contains the PSCRIPT driver's User
                      6: // Document Property functions and related routines.
                      7: //
                      8: // Author:  Kent Settle (kentse)
                      9: // Created: 13-Apr-1992
                     10: //
                     11: // Copyright (c) 1992 Microsoft Corporation
                     12: //--------------------------------------------------------------------------
                     13: 
                     14: #include <stddef.h>
                     15: #include <stdlib.h>
                     16: #include <string.h>
                     17: #include "pscript.h"
                     18: #include "enable.h"
                     19: #include <winspool.h>
                     20: #include "dlgdefs.h"
                     21: #include "pscrptui.h"
                     22: #include "help.h"
                     23: 
                     24: #define DEFAULT_DOCUMENT_DIALOG 0
                     25: #define DOES_DUPLEX             1
                     26: #define DOES_COLLATE            2
                     27: 
                     28: #define MAX_FORM_NAME   32
                     29: 
                     30: // declarations of routines defined within this module.
                     31: 
                     32: LONG DocPropDialogProc(HWND, UINT, DWORD, LONG);
                     33: LONG AdvDocPropDialogProc(HWND, UINT, DWORD, LONG);
                     34: BOOL InitializeDocPropDialog(HWND, PDOCDETAILS);
                     35: BOOL InitializeAdvDocPropDialog(HWND, PDOCDETAILS);
                     36: BOOL AdjustDevmode(PDOCDETAILS);
                     37: VOID SetOrientation(HWND, PDOCDETAILS);
                     38: VOID SetDuplex(HWND, PDOCDETAILS);
                     39: VOID SetCollation(HWND, PDOCDETAILS);
                     40: 
                     41: extern VOID vDoColorAdjUI(LPSTR, COLORADJUSTMENT *, BOOL, BOOL);
                     42: 
                     43: BYTE    DP_AnsiDeviceName[128];
                     44: 
                     45: extern LONG  AboutDlgProc( HWND, UINT, DWORD, LONG );
                     46: extern BOOL SetDefaultPSDEVMODE(PSDEVMODE *, PWSTR, PNTPD, HANDLE);
                     47: extern BOOL ValidateSetDEVMODE(PSDEVMODE *, PSDEVMODE *, HANDLE, PNTPD);
                     48: extern VOID SetFormSize(HANDLE, PSDEVMODE *, PWSTR);
                     49: extern PFORM_INFO_1 GetFormsDataBase(HANDLE, DWORD *, PNTPD);
                     50: extern BOOL bAbout(HWND, PNTPD);
                     51: 
                     52: //--------------------------------------------------------------------------
                     53: // LONG DrvDocumentProperties(hWnd, hPrinter, pDeviceName, pDevModeOutput,
                     54: //                            pDevModeInput, fMode)
                     55: // HWND        hWnd;
                     56: // HANDLE      hPrinter;
                     57: // PSTR        pDeviceName;
                     58: // PDEVMODE    pDevModeOutput;
                     59: // PDEVMODE    pDevModeInput;
                     60: // DWORD       fMode;
                     61: //
                     62: // This routine is called to set the public portions of the DEVMODE
                     63: // structure for the given print document.
                     64: //
                     65: // History:
                     66: //   13-Apr-1992    -by-    Kent Settle     (kentse)
                     67: //  Re-Wrote it.
                     68: //   27-Mar-1992    -by-    Dave Snipp      (davesn)
                     69: //  Wrote it.
                     70: //--------------------------------------------------------------------------
                     71: 
                     72: LONG DrvDocumentProperties(hWnd, hPrinter, pDeviceName, pDevModeOutput,
                     73:                            pDevModeInput, fMode)
                     74: HWND        hWnd;
                     75: HANDLE      hPrinter;
                     76: PWSTR       pDeviceName;
                     77: PDEVMODE    pDevModeOutput;
                     78: PDEVMODE    pDevModeInput;
                     79: DWORD       fMode;
                     80: {
                     81:     LPWSTR          pwRealDeviceName;
                     82:     LONG            ReturnValue;
                     83:     DOCDETAILS      DocDetails;
                     84:     PSDEVMODE      *pDMInput;
                     85:     int             iDialog;
                     86: 
                     87: 
                     88:     // if the user passed in fMode == 0, return the size of the
                     89:     // total DEVMODE structure.
                     90: 
                     91:     if (!fMode)
                     92:         return(sizeof(PSDEVMODE));
                     93: 
                     94: #if 0
                     95: //!!! in order not to break WOW just yet, we won't check this, but
                     96: //!!! we will at some point.  -kentse.
                     97: 
                     98:     // it would be wrong to call this function with fMode != 0 and not
                     99:     // have the DM_COPY bit set.
                    100: 
                    101:     if (!(fMode & DM_COPY))
                    102:     {
                    103:         RIP("PSCRPTUI!DocumentProperties: fMode not NULL and no DM_COPY.\n");
                    104:         SetLastError(ERROR_INVALID_PARAMETER);
                    105:         return(-1L);
                    106:     }
                    107: #endif
                    108: 
                    109:     // if the copy bit is set, then there had better be a pointer
                    110:     // to an output buffer.
                    111: 
                    112:     if ((!pDevModeOutput) && (fMode & DM_COPY))
                    113:     {
                    114:         RIP("PSCRPTUI!DocumentProperties: NULL pDevModeOutput and DM_COPY.\n");
                    115:         SetLastError(ERROR_INVALID_PARAMETER);
                    116:         return(-1L);
                    117:     }
                    118: 
                    119:     // initialize the document details structure.
                    120: 
                    121:     memset (&DocDetails, 0, sizeof(DOCDETAILS));
                    122: 
                    123:     // make a working copy of the input PSDEVMODE structure, if we
                    124:     // have been supplied one.
                    125: 
                    126:     if (pDevModeInput)
                    127:     {
                    128:         DWORD   cb;
                    129: 
                    130:         cb = pDevModeInput->dmSize + pDevModeInput->dmDriverExtra;
                    131:         cb = min(sizeof(PSDEVMODE), cb);
                    132: 
                    133:         CopyMemory(&DocDetails.DMBuffer, pDevModeInput, cb);
                    134: 
                    135:         pDMInput = &DocDetails.DMBuffer;
                    136:     }
                    137:     else
                    138:         pDMInput = NULL;
                    139: 
                    140:     // fill in document details.
                    141: 
                    142:     DocDetails.hPrinter = hPrinter;
                    143:     DocDetails.pDeviceName = pDeviceName;
                    144:     DocDetails.pDMOutput = (PSDEVMODE *)pDevModeOutput;
                    145:     DocDetails.pDMInput = (PSDEVMODE *)pDMInput;
                    146:     DocDetails.flDialogFlags = DEFAULT_DOCUMENT_DIALOG;
                    147: 
                    148:     // get a pointer to our NTPD structure for printer information.
                    149: 
                    150:     if (!(DocDetails.pntpd = MapPrinter(DocDetails.hPrinter)))
                    151:     {
                    152:         RIP("PSCRPTUI!DocumentProperties: MapPrinter failed.\n");
                    153:         return(-1L);
                    154:     }
                    155: 
                    156:     // prompt the user with a dialog box, if that flag is set, otherwise
                    157:     // make sure we have a useful DEVMODE and return that things are fine.
                    158: 
                    159:     if (fMode & DM_PROMPT)
                    160:     {
                    161:         //
                    162:         // Make up ANSI version of the device name for later halftone
                    163:         // UI to use
                    164:         //
                    165: 
                    166:         pwRealDeviceName = (PWSTR)((PSTR)DocDetails.pntpd +
                    167:                                    DocDetails.pntpd->lowszPrinterName);
                    168: 
                    169:         WideCharToMultiByte(CP_ACP,
                    170:                             0,
                    171:                             (LPWSTR)pwRealDeviceName,
                    172:                             (int)(wcslen(pwRealDeviceName) + 1),
                    173:                             DP_AnsiDeviceName,
                    174:                             sizeof(DP_AnsiDeviceName),
                    175:                             NULL,
                    176:                             NULL);
                    177: 
                    178: 
                    179:         // set some option flags, depending on which functions the
                    180:         // current printer supports.  these options will be used to
                    181:         // determine which dialog box to present to the user.
                    182: 
                    183:         if ((DocDetails.pntpd->loszDuplexNone) ||
                    184:             (DocDetails.pntpd->loszDuplexNoTumble) ||
                    185:             (DocDetails.pntpd->loszDuplexTumble))
                    186:             DocDetails.flDialogFlags |= DOES_DUPLEX;
                    187: 
                    188:         if (DocDetails.pntpd->loszCollateOn)
                    189:             DocDetails.flDialogFlags |= DOES_COLLATE;
                    190: 
                    191:         switch(DocDetails.flDialogFlags)
                    192:         {
                    193:             case DEFAULT_DOCUMENT_DIALOG:
                    194:                 iDialog = DOCPROPDIALOG;
                    195: 
                    196:                 break;
                    197: 
                    198:             case DOES_DUPLEX:
                    199:                 iDialog = DOCDUPDIALOG;
                    200: 
                    201:                 break;
                    202: 
                    203:             case DOES_COLLATE:
                    204:                 iDialog = DOCCOLLDIALOG;
                    205: 
                    206:                 break;
                    207: 
                    208:             case (DOES_DUPLEX | DOES_COLLATE):
                    209:                 iDialog = DOCBOTHDIALOG;
                    210: 
                    211:                 break;
                    212:         }
                    213: 
                    214:         // present the user with the document properties dialog
                    215:         // box, which may or may not support duplex or collate.
                    216: 
                    217:         ReturnValue = DialogBoxParam(hModule,
                    218:                                      MAKEINTRESOURCE(iDialog),
                    219:                                      hWnd, (DLGPROC)DocPropDialogProc,
                    220:                                      (LPARAM)&DocDetails);
                    221:     }
                    222:     else
                    223:     {
                    224:         // make sure we have a useful PSDEVMODE structure to work with.
                    225: 
                    226:         if (!AdjustDevmode(&DocDetails))
                    227:         {
                    228:             RIP("PSCRPTUI!DocumentDetails: AdjustDevmode failed.\n");
                    229:             return(-1L);
                    230:         }
                    231: 
                    232:         ReturnValue = IDOK;
                    233:     }
                    234: 
                    235:     if ((ReturnValue == IDOK) && (fMode & DM_COPY))
                    236: 
                    237:         // copy our newly developed PSDEVMODE structure
                    238:         // into the provided buffer.
                    239: 
                    240:         *DocDetails.pDMOutput = *DocDetails.pDMInput;
                    241: 
                    242:     // free up the NTPD memory.
                    243: 
                    244:     if (DocDetails.pntpd)
                    245:         GlobalFree((HGLOBAL)DocDetails.pntpd);
                    246: 
                    247:     return ReturnValue;
                    248: }
                    249: 
                    250: 
                    251: //--------------------------------------------------------------------------
                    252: // BOOL InitializeDocPropDialog(hWnd, pDocDetails)
                    253: // HWND                hWnd;
                    254: // PDOCDETAILS         pDocDetails;
                    255: //
                    256: // This routine does what it's name suggests.
                    257: //
                    258: // History:
                    259: //   14-Apr-1992    -by-    Kent Settle     (kentse)
                    260: //  Re-Wrote form enumeration stuff.
                    261: //   27-Mar-1992    -by-    Dave Snipp      (davesn)
                    262: //  Wrote it.
                    263: //--------------------------------------------------------------------------
                    264: 
                    265: BOOL InitializeDocPropDialog(hWnd, pDocDetails)
                    266: HWND                hWnd;
                    267: PDOCDETAILS         pDocDetails;
                    268: {
                    269:     FORM_INFO_1    *pdbForm, *pdbForms;
                    270:     DWORD           count;
                    271:     DWORD           i, iForm;
                    272:     PNTPD           pntpd;
                    273:     PWSTR           pwstrFormName;
                    274:     BOOL            bTmp;
                    275: 
                    276:     // default to proper orientation, duplex and collation.
                    277: 
                    278:     bTmp = (pDocDetails->pDMInput->dm.dmOrientation == DMORIENT_LANDSCAPE);
                    279: 
                    280:     CheckRadioButton(hWnd, IDD_DEVICEMODEPORTRAIT, IDD_DEVICEMODELANDSCAPE,
                    281:                      bTmp ? IDD_DEVICEMODELANDSCAPE : IDD_DEVICEMODEPORTRAIT);
                    282: 
                    283:     SetOrientation(hWnd, pDocDetails);
                    284: 
                    285:     if (pDocDetails->flDialogFlags & DOES_DUPLEX)
                    286:     {
                    287:         switch (pDocDetails->pDMInput->dm.dmDuplex)
                    288:         {
                    289:             case DMDUP_VERTICAL:
                    290:                 i = IDD_DUPLEX_LONG;
                    291:                 break;
                    292: 
                    293:             case DMDUP_HORIZONTAL:
                    294:                 i = IDD_DUPLEX_SHORT;
                    295:                 break;
                    296: 
                    297:             default:
                    298:                 i = IDD_DUPLEX_NONE;
                    299:                 break;
                    300:         }
                    301: 
                    302:         // now set the appropriate radio button.
                    303: 
                    304:         CheckRadioButton(hWnd, IDD_DUPLEX_NONE, IDD_DUPLEX_SHORT, i);
                    305: 
                    306:         SetDuplex(hWnd, pDocDetails);
                    307:     }
                    308: 
                    309:     if (pDocDetails->flDialogFlags & DOES_COLLATE)
                    310:     {
                    311:         bTmp = pDocDetails->pDMInput->dm.dmCollate;
                    312: 
                    313:         CheckRadioButton(hWnd, IDD_COLLATE_OFF, IDD_COLLATE_ON,
                    314:                          bTmp ? IDD_COLLATE_ON : IDD_COLLATE_OFF);
                    315: 
                    316:         SetCollation(hWnd, pDocDetails);
                    317:     }
                    318: 
                    319:     // fill in the given number of copies.
                    320: 
                    321:     SetDlgItemInt(hWnd, IDD_DEVICEMODENOCOPIES,
                    322:                   (int)pDocDetails->pDMInput->dm.dmCopies, FALSE);
                    323: 
                    324:     // get a local pointer to NTPD structure.
                    325: 
                    326:     pntpd = pDocDetails->pntpd;
                    327: 
                    328:     // fill in the forms list box.
                    329: 
                    330:     if (!(pdbForms = GetFormsDataBase(pDocDetails->hPrinter, &count, pntpd)))
                    331:     {
                    332:         RIP("PSCRPTUI!InitializeDocPropDialog: GetFormsDataBase failed.\n");
                    333:         return(FALSE);
                    334:     }
                    335:     else
                    336:     {
                    337:         // enumerate each form name.  check to see if it is
                    338:         // valid for the current printer.  if it is, insert
                    339:         // the form name into the forms combo box.
                    340: 
                    341:         pdbForm = pdbForms;
                    342: 
                    343:         for (i = 0; i < count; i++)
                    344:         {
                    345:             if (pdbForm->Flags & PSCRIPT_VALID_FORM)
                    346:             {
                    347:                 // add the form to the list box.
                    348: 
                    349:                 SendDlgItemMessage(hWnd, IDD_FORMCOMBO, CB_ADDSTRING,
                    350:                                    (WPARAM)0, (LPARAM)pdbForm->pName);
                    351:             }
                    352: 
                    353:             pdbForm++;
                    354:         }
                    355: 
                    356:         SendDlgItemMessage(hWnd, IDD_FORMCOMBO, CB_SETCURSEL, 0, 0L);
                    357:     }
                    358: 
                    359:     GlobalFree((HGLOBAL)pdbForms);
                    360: 
                    361:     // select the form specified in the DEVMODE in the combo box.
                    362: 
                    363:     pwstrFormName = pDocDetails->pDMInput->dm.dmFormName;
                    364: 
                    365:     iForm = SendDlgItemMessage(hWnd, IDD_FORMCOMBO, CB_FINDSTRING,
                    366:                                (WPARAM)-1, (LPARAM)pwstrFormName);
                    367: 
                    368:     // if the specified form could not be found in the list box, simply
                    369:     // select the first one.
                    370: 
                    371:     if (iForm == CB_ERR)
                    372:         iForm = 0;
                    373: 
                    374:     SendDlgItemMessage(hWnd, IDD_FORMCOMBO, CB_SETCURSEL, (WPARAM)iForm,
                    375:                        (LPARAM)0);
                    376: 
                    377:     return(TRUE);
                    378: }
                    379: 
                    380: 
                    381: //--------------------------------------------------------------------------
                    382: // LONG DocPropDialogProc(hWnd, usMst, wParam, lParam)
                    383: // HWND    hWnd;
                    384: // UINT    usMsg;
                    385: // DWORD   wParam;
                    386: // LONG    lParam;
                    387: //
                    388: // This routine services the Document Properties dialog box.
                    389: //
                    390: // History:
                    391: //   15-Apr-1992    -by-    Kent Settle     (kentse)
                    392: //  Added NTPD stuff, IDD_OPTIONS, IDD_FORMCOMBO.
                    393: //   27-Mar-1992    -by-    Dave Snipp      (davesn)
                    394: //  Wrote it.
                    395: //--------------------------------------------------------------------------
                    396: 
                    397: LONG DocPropDialogProc(hWnd, usMsg, wParam, lParam)
                    398: HWND    hWnd;
                    399: UINT    usMsg;
                    400: DWORD   wParam;
                    401: LONG    lParam;
                    402: {
                    403:     PDOCDETAILS     pDocDetails;
                    404:     BOOL            bTmp;
                    405:     DWORD           dwDialog;
                    406: 
                    407:     switch(usMsg)
                    408:     {
                    409:         case WM_INITDIALOG:
                    410:             pDocDetails = (PDOCDETAILS)lParam;
                    411: 
                    412:             if (!pDocDetails)
                    413:             {
                    414:                 RIP("PSCRPTUI!DocPropDialogProc: null pDocDetails.\n");
                    415:                 return(FALSE);
                    416:             }
                    417: 
                    418:             // make sure we have a useful PSDEVMODE structure to work with.
                    419: 
                    420:             if (!AdjustDevmode(pDocDetails))
                    421:             {
                    422:                 RIP("PSCRPTUI!DocPropDialogProc: AdjustDevmode failed.\n");
                    423:                 return(FALSE);
                    424:             }
                    425: 
                    426:             // save the pointer to the possibly adjusted DOCDETAILS structure.
                    427: 
                    428:             SetWindowLong(hWnd, GWL_USERDATA, lParam);
                    429: 
                    430:             InitializeDocPropDialog(hWnd, pDocDetails);
                    431: 
                    432:             // intialize the help stuff.
                    433: 
                    434:             vHelpInit();
                    435: 
                    436:             pDocDetails->coloradj = pDocDetails->pDMInput->coloradj;
                    437: 
                    438:             return TRUE;
                    439: 
                    440:         case WM_COMMAND:
                    441:             pDocDetails = (PDOCDETAILS)GetWindowLong(hWnd, GWL_USERDATA);
                    442: 
                    443:             switch(LOWORD(wParam))
                    444:             {
                    445:                 case IDD_HELP_BUTTON:
                    446:                     dwDialog = HLP_DOC_PROP_STANDARD;
                    447: 
                    448:                     switch(pDocDetails->flDialogFlags)
                    449:                     {
                    450:                         case DEFAULT_DOCUMENT_DIALOG:
                    451:                             break;
                    452: 
                    453:                         case DOES_DUPLEX:
                    454:                             dwDialog = HLP_DOC_PROP_DUPLEX;
                    455:                             break;
                    456: 
                    457:                         case DOES_COLLATE:
                    458:                             dwDialog = HLP_DOC_PROP_COLLATE;
                    459:                             break;
                    460: 
                    461:                         case (DOES_DUPLEX | DOES_COLLATE):
                    462:                             dwDialog = HLP_DOC_PROP_BOTH;
                    463:                             break;
                    464:                     }
                    465: 
                    466:                     vShowHelp(hWnd, HELP_CONTEXT, dwDialog,
                    467:                               pDocDetails->hPrinter);
                    468:                     return(TRUE);
                    469: 
                    470:                 case IDOK:
                    471:                     // copy the number of copies into PSDEVMODE.
                    472: 
                    473:                     pDocDetails->pDMInput->dm.dmCopies =
                    474:                             (short)GetDlgItemInt(hWnd, IDD_DEVICEMODENOCOPIES,
                    475:                                                  &bTmp, FALSE);
                    476: 
                    477:                     GetDlgItemText(hWnd, IDD_FORMCOMBO,
                    478:                                    pDocDetails->pDMInput->dm.dmFormName,
                    479:                                    sizeof(pDocDetails->pDMInput->dm.dmFormName));
                    480: 
                    481:                     // update paper size information in DEVMODE based on the
                    482:                     // form name.
                    483: 
                    484:                     SetFormSize(pDocDetails->hPrinter, pDocDetails->pDMInput,
                    485:                                 pDocDetails->pDMInput->dm.dmFormName);
                    486: 
                    487:                     // Update color adjustment
                    488: 
                    489:                     pDocDetails->pDMInput->coloradj = pDocDetails->coloradj;
                    490: 
                    491:                     EndDialog (hWnd, IDOK);
                    492:                     return TRUE;
                    493: 
                    494:                 case IDCANCEL:
                    495:                     EndDialog (hWnd, IDCANCEL);
                    496:                     return TRUE;
                    497: 
                    498:                 case IDD_DEVICEMODEPORTRAIT:
                    499:                     pDocDetails->pDMInput->dm.dmOrientation = DMORIENT_PORTRAIT;
                    500:                     SetOrientation(hWnd, pDocDetails);
                    501:                     SetDuplex(hWnd, pDocDetails);
                    502:                     break;
                    503: 
                    504:                 case IDD_DEVICEMODELANDSCAPE:
                    505:                     pDocDetails->pDMInput->dm.dmOrientation = DMORIENT_LANDSCAPE;
                    506:                     SetOrientation(hWnd, pDocDetails);
                    507:                     SetDuplex(hWnd, pDocDetails);
                    508:                     break;
                    509: 
                    510:                 case IDD_DUPLEX_NONE:
                    511:                     pDocDetails->pDMInput->dm.dmDuplex = DMDUP_SIMPLEX;
                    512:                     SetDuplex(hWnd, pDocDetails);
                    513:                     break;
                    514: 
                    515:                 case IDD_DUPLEX_LONG:
                    516:                     pDocDetails->pDMInput->dm.dmDuplex = DMDUP_VERTICAL;
                    517:                     SetDuplex(hWnd, pDocDetails);
                    518:                     break;
                    519: 
                    520:                 case IDD_DUPLEX_SHORT:
                    521:                     pDocDetails->pDMInput->dm.dmDuplex = DMDUP_HORIZONTAL;
                    522:                     SetDuplex(hWnd, pDocDetails);
                    523:                     break;
                    524: 
                    525:                 case IDD_COLLATE_ON:
                    526:                     pDocDetails->pDMInput->dm.dmCollate = DMCOLLATE_TRUE;
                    527:                     SetCollation(hWnd, pDocDetails);
                    528:                     break;
                    529: 
                    530:                 case IDD_COLLATE_OFF:
                    531:                     pDocDetails->pDMInput->dm.dmCollate = DMCOLLATE_FALSE;
                    532:                     SetCollation(hWnd, pDocDetails);
                    533:                     break;
                    534: 
                    535:                 case IDD_OPTIONS: // Advanced dialog stuff.
                    536:                     DialogBoxParam(hModule, MAKEINTRESOURCE(ADVDOCPROPDIALOG),
                    537:                                    hWnd, (DLGPROC)AdvDocPropDialogProc,
                    538:                                    (LPARAM)pDocDetails);
                    539: 
                    540:                     SetFocus(GetDlgItem(hWnd, IDOK));
                    541:                     return TRUE;
                    542: 
                    543:                 case IDD_HALFTONE_PUSH_BUTTON:
                    544: 
                    545:                     vDoColorAdjUI(DP_AnsiDeviceName, &pDocDetails->coloradj,
                    546:                                   (BOOL)((pDocDetails->pntpd->flFlags &
                    547:                                                             COLOR_DEVICE) &&
                    548:                                          (pDocDetails->pDMInput->dm.dmColor ==
                    549:                                                             DMCOLOR_COLOR)),
                    550:                                                             TRUE);
                    551: 
                    552:                     return(TRUE);
                    553: 
                    554:                 case IDD_ABOUT:
                    555:                     return(bAbout(hWnd, pDocDetails->pntpd));
                    556: 
                    557:                 default:
                    558:                     return (FALSE);
                    559:             }
                    560: 
                    561:             break;
                    562: 
                    563:         case WM_DESTROY:
                    564:             // clean up any used help stuff.
                    565: 
                    566:             vHelpDone(hWnd);
                    567:             return(TRUE);
                    568: 
                    569:         default:
                    570:             return (FALSE);
                    571:     }
                    572: 
                    573:     return  FALSE;
                    574: }
                    575: 
                    576: 
                    577: //--------------------------------------------------------------------------
                    578: // LONG DrvAdvancedDocumentProperties(hWnd, hPrinter, pDeviceName, pDevModeOutput,
                    579: //                                 pDevModeInput)
                    580: // HWND        hWnd;
                    581: // HANDLE      hPrinter;
                    582: // LPSTR       pDeviceName;
                    583: // PDEVMODE    pDevModeOutput;
                    584: // PDEVMODE    pDevModeInput;
                    585: //
                    586: // This routine is called to set the public portions of the DEVMODE
                    587: // structure for the given print document.
                    588: //
                    589: // History:
                    590: //   15-Apr-1992    -by-    Kent Settle     (kentse)
                    591: //  Added DocDetails.
                    592: //   27-Mar-1992    -by-    Dave Snipp      (davesn)
                    593: //  Wrote it.
                    594: //--------------------------------------------------------------------------
                    595: 
                    596: LONG DrvAdvancedDocumentProperties(hWnd, hPrinter, pDeviceName, pDevModeOutput,
                    597:                                    pDevModeInput)
                    598: HWND        hWnd;
                    599: HANDLE      hPrinter;
                    600: PWSTR       pDeviceName;
                    601: PDEVMODE    pDevModeOutput;
                    602: PDEVMODE    pDevModeInput;
                    603: {
                    604:     LONG        ReturnValue;
                    605:     DOCDETAILS  DocDetails;
                    606:     PSDEVMODE  *pDMInput;
                    607: 
                    608:     // make a working copy of the input PSDEVMODE structure, if we
                    609:     // have been supplied one.
                    610: 
                    611:     if (pDevModeInput)
                    612:     {
                    613:         DocDetails.DMBuffer = *(PSDEVMODE *)pDevModeInput;
                    614:         pDMInput = &DocDetails.DMBuffer;
                    615:     }
                    616:     else
                    617:         pDMInput = NULL;
                    618: 
                    619:     // Fill in the DOCDETAILS structure so that lower level functions
                    620:     // can access this important data.
                    621: 
                    622:     DocDetails.hPrinter = hPrinter;
                    623:     DocDetails.pDeviceName = pDeviceName;
                    624:     DocDetails.pDMOutput = (PSDEVMODE *)pDevModeOutput;
                    625:     DocDetails.pDMInput = (PSDEVMODE *)pDMInput;
                    626: 
                    627:     // get a pointer to our NTPD structure for printer information.
                    628: 
                    629:     if (!(DocDetails.pntpd = MapPrinter(DocDetails.hPrinter)))
                    630:     {
                    631:         RIP("PSCRPTUI!DocumentProperties: MapPrinter failed.\n");
                    632:         return(-1L);
                    633:     }
                    634: 
                    635:     ReturnValue = DialogBoxParam(hModule,
                    636:                              MAKEINTRESOURCE(ADVDOCPROPDIALOG),
                    637:                              hWnd,
                    638:                              (DLGPROC)AdvDocPropDialogProc,
                    639:                              (LPARAM)&DocDetails);
                    640: 
                    641:     // free up the NTPD memory.
                    642: 
                    643:     if (DocDetails.pntpd)
                    644:         GlobalFree((HGLOBAL)DocDetails.pntpd);
                    645: 
                    646:     return ReturnValue;
                    647: }
                    648: 
                    649: 
                    650: //--------------------------------------------------------------------------
                    651: // LONG AdvDocPropDialogProc(hWnd, usMsg, wParam, lParam)
                    652: // HWND    hWnd;
                    653: // UINT    usMsg;
                    654: // DWORD   wParam;
                    655: // LONG    lParam;
                    656: //
                    657: // This routine services the Advanced Document Properties dialog box.
                    658: //
                    659: // History:
                    660: //   15-Apr-1992    -by-    Kent Settle     (kentse)
                    661: //  Re-Wrote it.
                    662: //   27-Mar-1992    -by-    Dave Snipp      (davesn)
                    663: //  Wrote it.
                    664: //--------------------------------------------------------------------------
                    665: 
                    666: LONG AdvDocPropDialogProc(hWnd, usMsg, wParam, lParam)
                    667: HWND    hWnd;
                    668: UINT    usMsg;
                    669: DWORD   wParam;
                    670: LONG    lParam;
                    671: {
                    672:     PDOCDETAILS     pDocDetails;
                    673:     WCHAR           wcbuf[8];
                    674:     CHAR            cbuf[8];
                    675:     PWSTR           pwstr;
                    676:     PSTR            pstr;
                    677:     LONG            i;
                    678:     BOOL            bTmp;
                    679: 
                    680:     switch(usMsg)
                    681:     {
                    682:         case WM_INITDIALOG:
                    683:             // get a local pointer to our DOCDETAILS structure.
                    684: 
                    685:             pDocDetails = (PDOCDETAILS)lParam;
                    686: 
                    687:             // make sure we have a useful PSDEVMODE structure to work with.
                    688: 
                    689:             if (!AdjustDevmode(pDocDetails))
                    690:             {
                    691:                 RIP("PSCRPTUI!AdvDocPropDialogProc: AdjustDevmode failed.\n");
                    692:                 return(FALSE);
                    693:             }
                    694: 
                    695:             // save a copy of the DEVMODE in case we cancel out of this.
                    696: 
                    697:             CopyMemory(&pDocDetails->DMOriginal, &pDocDetails->DMBuffer,
                    698:                        sizeof(PSDEVMODE));
                    699: 
                    700:             // save away the pointer to possibly adjusted DOCDETAILS structure.
                    701: 
                    702:             SetWindowLong(hWnd, GWL_USERDATA, (LONG)pDocDetails);
                    703: 
                    704:             if (!InitializeAdvDocPropDialog(hWnd, pDocDetails))
                    705:             {
                    706:                 RIP("PSCRPTUI!AdvDocPropDialogProc: InitializeAdvDocPropDialog failed.\n");
                    707:                 return(FALSE);
                    708:             }
                    709: 
                    710:             // intialize the help stuff.
                    711: 
                    712:             vHelpInit();
                    713: 
                    714:             return (TRUE);
                    715: 
                    716:         case WM_COMMAND:
                    717:             // get the DOCDETAILS structure we save at initialization.
                    718: 
                    719:             pDocDetails = (PDOCDETAILS)GetWindowLong(hWnd, GWL_USERDATA);
                    720: 
                    721:             switch(LOWORD(wParam))
                    722:             {
                    723:                 case IDOK:
                    724:                     // if the output is going to EPS file, get the
                    725:                     // EPS file name from the edit box, and copy
                    726:                     // it to our PSDEVMODE structure.
                    727: 
                    728:                     if (pDocDetails->pDMInput->dwFlags & PSDEVMODE_EPS)
                    729:                         GetDlgItemText(hWnd, IDD_ENCAPS_FILE_EDIT_BOX,
                    730:                                        pDocDetails->pDMInput->wstrEPSFile,
                    731:                                        sizeof(pDocDetails->pDMInput->wstrEPSFile));
                    732: 
                    733:                     // copy the selected resolution into PSDEVMODE. first
                    734:                     // get the selected value from the combo box.
                    735: 
                    736:                     i = SendDlgItemMessage(hWnd, IDD_RESOLUTION_COMBO_BOX,
                    737:                                            CB_GETCURSEL, 0, 0L);
                    738: 
                    739:                     if (i == CB_ERR)
                    740:                     {
                    741:                         RIP("PSCRPTUI!AdvDocPropDialogProc: CB_GETCURSEL failed.\n");
                    742:                         return (FALSE);
                    743:                     }
                    744: 
                    745:                     i = SendDlgItemMessage(hWnd, IDD_RESOLUTION_COMBO_BOX,
                    746:                                            CB_GETLBTEXT, i, (DWORD)wcbuf);
                    747: 
                    748:                     if (i == CB_ERR)
                    749:                     {
                    750:                         RIP("PSCRPTUI!AdvDocPropDialogProc: CB_GETLBTEXT failed.\n");
                    751:                         return (FALSE);
                    752:                     }
                    753: 
                    754:                     pwstr = wcbuf;
                    755:                     pstr = cbuf;
                    756: 
                    757:                     while (*pwstr)
                    758:                         *pstr++ = (CHAR)*pwstr++;
                    759: 
                    760:                     i = atoi(cbuf);
                    761:                     pDocDetails->pDMInput->dm.dmPrintQuality = (short)i;
                    762: 
                    763:                     // copy the scaling percent into PSDEVMODE.
                    764: 
                    765:                     pDocDetails->pDMInput->dm.dmScale =
                    766:                             (short)GetDlgItemInt(hWnd, IDD_SCALING_EDIT_BOX,
                    767:                                                  &bTmp, FALSE);
                    768: 
                    769:                     // copy our newly developed PSDEVMODE structure
                    770:                     // into the provided buffer.
                    771: 
                    772:                     *pDocDetails->pDMOutput = *pDocDetails->pDMInput;
                    773: 
                    774:                     EndDialog (hWnd, IDOK);
                    775:                     return (TRUE);
                    776: 
                    777:                 case IDCANCEL:
                    778:                     // leave the PSDEVMODE buffer unchanged, end the
                    779:                     // dialog, and return that the operation was cancelled.
                    780: 
                    781:                     // restore copy of the DEVMODE.
                    782: 
                    783:                     CopyMemory(&pDocDetails->DMBuffer,
                    784:                                &pDocDetails->DMOriginal,
                    785:                                sizeof(PSDEVMODE));
                    786: 
                    787:                     EndDialog (hWnd, IDCANCEL);
                    788:                     return (TRUE);
                    789: 
                    790:                 case IDD_HELP_BUTTON:
                    791:                     vShowHelp(hWnd, HELP_CONTEXT, HLP_ADV_DOC_PROP,
                    792:                               pDocDetails->hPrinter);
                    793:                     return (TRUE);
                    794: 
                    795:                 case IDD_SUBST_RADIO_BUTTON:
                    796:                     pDocDetails->pDMInput->dwFlags |= PSDEVMODE_FONTSUBST;
                    797: 
                    798:                     return(TRUE);
                    799: 
                    800:                 case IDD_SOFTFONT_RADIO_BUTTON:
                    801:                     pDocDetails->pDMInput->dwFlags &= ~PSDEVMODE_FONTSUBST;
                    802: 
                    803:                     return(TRUE);
                    804: 
                    805:                 case IDD_PRINTER_RADIO_BUTTON:
                    806:                     // if the user was printing to an EPS file,
                    807:                     // then we must clean that up and print to
                    808:                     // the printer.  otherwise, there is nothing
                    809:                     // for us to do.
                    810: 
                    811:                     if (pDocDetails->pDMInput->dwFlags & PSDEVMODE_EPS)
                    812:                     {
                    813:                         // check the Printer radio button, and turn
                    814:                         // off the EPS file radio button.
                    815: 
                    816:                         CheckRadioButton(hWnd, IDD_PRINTER_RADIO_BUTTON,
                    817:                                          IDD_ENCAPS_FILE_RADIO_BUTTON,
                    818:                                          IDD_PRINTER_RADIO_BUTTON);
                    819: 
                    820:                         // empty out the EPS filename edit box.
                    821: 
                    822:                         SetDlgItemText(hWnd, IDD_ENCAPS_FILE_EDIT_BOX, L"");
                    823: 
                    824:                         // disable the EPS file edit box and text.
                    825: 
                    826:                         EnableWindow(GetDlgItem(hWnd, IDD_ENCAPS_FILE_TEXT),
                    827:                                      FALSE);
                    828:                         EnableWindow(GetDlgItem(hWnd, IDD_ENCAPS_FILE_EDIT_BOX),
                    829:                                      FALSE);
                    830: 
                    831:                         // clear the EPS file flag.
                    832: 
                    833:                         pDocDetails->pDMInput->dwFlags &= ~PSDEVMODE_EPS;
                    834:                     }
                    835: 
                    836:                     return (TRUE);
                    837: 
                    838:                 case IDD_ENCAPS_FILE_RADIO_BUTTON:
                    839:                     // if the user was printing to a printer,
                    840:                     // then we must clean that up and print to
                    841:                     // the EPS file.  otherwise, there is nothing
                    842:                     // for us to do.
                    843: 
                    844:                     if (!(pDocDetails->pDMInput->dwFlags & PSDEVMODE_EPS))
                    845:                     {
                    846:                         // check the EPS file radio button, and turn off
                    847:                         // the printer radio button.
                    848: 
                    849:                         CheckRadioButton(hWnd, IDD_PRINTER_RADIO_BUTTON,
                    850:                                          IDD_ENCAPS_FILE_RADIO_BUTTON,
                    851:                                          IDD_ENCAPS_FILE_RADIO_BUTTON);
                    852: 
                    853:                         // fill in the last know EPS file name.
                    854: 
                    855:                         SetDlgItemText(hWnd, IDD_ENCAPS_FILE_EDIT_BOX,
                    856:                                        pDocDetails->pDMInput->wstrEPSFile);
                    857: 
                    858:                         // enable the EPS file edit box and text.
                    859: 
                    860:                         EnableWindow(GetDlgItem(hWnd, IDD_ENCAPS_FILE_TEXT),
                    861:                                      TRUE);
                    862:                         EnableWindow(GetDlgItem(hWnd, IDD_ENCAPS_FILE_EDIT_BOX),
                    863:                                      TRUE);
                    864: 
                    865:                         // set the EPS file flag.
                    866: 
                    867:                         pDocDetails->pDMInput->dwFlags |= PSDEVMODE_EPS;
                    868:                     }
                    869: 
                    870:                     SendDlgItemMessage(hWnd, IDD_ENCAPS_FILE_EDIT_BOX,
                    871:                                        EM_SETSEL, 0, 0x7FFF0000);
                    872: 
                    873:                     SetFocus(GetDlgItem(hWnd, IDD_ENCAPS_FILE_EDIT_BOX));
                    874: 
                    875:                     return (TRUE);
                    876: 
                    877:                 case IDD_COLOR_CHECK_BOX:
                    878:                     // check the current state of the button, and change it
                    879:                     // to the opposite state.
                    880: 
                    881:                     if (pDocDetails->pDMInput->dm.dmColor == DMCOLOR_COLOR)
                    882:                     {
                    883:                         // option is enabled, so disable it.
                    884: 
                    885:                         CheckDlgButton(hWnd, IDD_COLOR_CHECK_BOX, 0);
                    886:                         pDocDetails->pDMInput->dm.dmColor = DMCOLOR_MONOCHROME;
                    887:                     }
                    888:                     else
                    889:                     {
                    890:                         // option is disabled, so enable it.
                    891: 
                    892:                         CheckDlgButton(hWnd, IDD_COLOR_CHECK_BOX, 1);
                    893:                         pDocDetails->pDMInput->dm.dmColor = DMCOLOR_COLOR;
                    894:                     }
                    895: 
                    896:                     return (TRUE);
                    897: 
                    898: 
                    899:                 case IDD_ERROR_HANDLER_CHECK_BOX:
                    900:                 case IDD_MIRROR_CHECK_BOX:
                    901:                 case IDD_COLORS_TO_BLACK_CHECK_BOX:
                    902:                 case IDD_NEG_IMAGE_CHECK_BOX:
                    903:                     // this case statement is written to handle multiple cases.
                    904:                     // NOTE! it does assume the order of some things which are
                    905:                     // asserted below.
                    906: 
                    907:                     ASSERTPS((IDD_MIRROR_CHECK_BOX == IDD_ERROR_HANDLER_CHECK_BOX + 1) &&
                    908:                              (IDD_COLORS_TO_BLACK_CHECK_BOX == IDD_MIRROR_CHECK_BOX + 1) &&
                    909:                              (IDD_NEG_IMAGE_CHECK_BOX == IDD_COLORS_TO_BLACK_CHECK_BOX + 1),
                    910:                              "PSCRPTUI!AdvDocPropDialogProc: invalid check box id's.\n");
                    911: 
                    912:                     ASSERTPS((PSDEVMODE_MIRROR == PSDEVMODE_EHANDLER << 1) &&
                    913:                              (PSDEVMODE_BLACK == PSDEVMODE_MIRROR << 1) &&
                    914:                              (PSDEVMODE_NEG == PSDEVMODE_BLACK << 1),
                    915:                              "PSCRPTUI!AdvDocPropDialogProc: invalid PSDEVMODE id's.\n");
                    916: 
                    917:                     // check the current state of the button, and change it
                    918:                     // to the opposite state.
                    919: 
                    920:                     if (pDocDetails->pDMInput->dwFlags &
                    921:                         (PSDEVMODE_EHANDLER << (LOWORD(wParam) - IDD_ERROR_HANDLER_CHECK_BOX)))
                    922:                     {
                    923:                         // option is enabled, so disable it.
                    924: 
                    925:                         CheckDlgButton(hWnd, LOWORD(wParam), 0);
                    926:                         pDocDetails->pDMInput->dwFlags &=
                    927:                             ~(PSDEVMODE_EHANDLER << (LOWORD(wParam) - IDD_ERROR_HANDLER_CHECK_BOX));
                    928:                     }
                    929:                     else
                    930:                     {
                    931:                         // option is disabled, so enable it.
                    932: 
                    933:                         CheckDlgButton(hWnd, LOWORD(wParam), 1);
                    934:                         pDocDetails->pDMInput->dwFlags |=
                    935:                             (PSDEVMODE_EHANDLER << (LOWORD(wParam) - IDD_ERROR_HANDLER_CHECK_BOX));
                    936:                     }
                    937: 
                    938:                     return (TRUE);
                    939: 
                    940:                 default:
                    941:                     return (FALSE);
                    942:             }
                    943: 
                    944:             break;
                    945: 
                    946:         case WM_DESTROY:
                    947:             // clean up any used help stuff.
                    948: 
                    949:             vHelpDone(hWnd);
                    950:             return (TRUE);
                    951: 
                    952:         default:
                    953:             return (FALSE);
                    954:     }
                    955: 
                    956:     return (FALSE);
                    957: }
                    958: 
                    959: 
                    960: //--------------------------------------------------------------------------
                    961: // BOOL InitializeAdvDocPropDialog(hWnd, pDocDetails)
                    962: // HWND                hWnd;
                    963: // PDOCDETAILS         pDocDetails;
                    964: //
                    965: // This routine does what it's name suggests.
                    966: //
                    967: // History:
                    968: //   15-Apr-1992    -by-    Kent Settle     (kentse)
                    969: //  Wrote it.
                    970: //--------------------------------------------------------------------------
                    971: 
                    972: BOOL InitializeAdvDocPropDialog(hWnd, pDocDetails)
                    973: HWND                hWnd;
                    974: PDOCDETAILS         pDocDetails;
                    975: {
                    976:     BOOL            bEPS = FALSE;
                    977:     PSDEVMODE      *pdevmode;
                    978:     PWSTR           pwstr;
                    979:     WCHAR           wcbuf[8];
                    980:     CHAR            cbuf[8];
                    981:     LONG            i, j, iResolution;
                    982:     PSRESOLUTION   *pRes;
                    983:     PNTPD           pntpd;
                    984:     BOOL            bFontSubstitution;
                    985: 
                    986:     pdevmode = pDocDetails->pDMInput;
                    987:     pntpd = pDocDetails->pntpd;
                    988: 
                    989: //!!! temporarily disable EPS printing until it works.  -kentse.
                    990: 
                    991:     EnableWindow(GetDlgItem(hWnd, IDD_ENCAPS_FILE_TEXT), FALSE);
                    992:     EnableWindow(GetDlgItem(hWnd, IDD_ENCAPS_FILE_EDIT_BOX), FALSE);
                    993:     EnableWindow(GetDlgItem(hWnd, IDD_ENCAPS_FILE_RADIO_BUTTON), FALSE);
                    994: 
                    995: //     if (pdevmode->dwFlags & PSDEVMODE_EPS)
                    996: //        bEPS = TRUE;
                    997: 
                    998:     // check the appropriate Print To radio button.
                    999: 
                   1000:     CheckRadioButton(hWnd, IDD_PRINTER_RADIO_BUTTON,
                   1001:                      IDD_ENCAPS_FILE_RADIO_BUTTON,
                   1002:                      bEPS ? IDD_ENCAPS_FILE_RADIO_BUTTON :
                   1003:                                  IDD_PRINTER_RADIO_BUTTON);
                   1004: 
                   1005:     SendDlgItemMessage (hWnd, IDD_ENCAPS_FILE_EDIT_BOX, EM_LIMITTEXT,
                   1006:                         MAX_EPS_FILE, 0L);
                   1007: 
                   1008:     // if we are printing to an EPS file, initialize the Name
                   1009:     // edit box, and enable it.
                   1010: 
                   1011:     if (bEPS)
                   1012:         pwstr = pdevmode->wstrEPSFile;
                   1013:     else
                   1014:         pwstr = L"";
                   1015: 
                   1016:     SetDlgItemText(hWnd, IDD_ENCAPS_FILE_EDIT_BOX, pwstr);
                   1017: 
                   1018:     EnableWindow(GetDlgItem(hWnd, IDD_ENCAPS_FILE_TEXT), bEPS);
                   1019:     EnableWindow(GetDlgItem(hWnd, IDD_ENCAPS_FILE_EDIT_BOX), bEPS);
                   1020: 
                   1021:     // reset the content of the resolution combo box.
                   1022: 
                   1023:     SendDlgItemMessage (hWnd, IDD_RESOLUTION_COMBO_BOX, CB_RESETCONTENT, 0, 0);
                   1024: 
                   1025:     // fill in the resolution combo box.
                   1026: 
                   1027:     if (pntpd->cResolutions == 0)
                   1028:     {
                   1029:         itoa((int)pntpd->iDefResolution, (char *)cbuf, (int)10);
                   1030:         strcpy2WChar(wcbuf, cbuf);
                   1031: 
                   1032:         iResolution = SendDlgItemMessage(hWnd, IDD_RESOLUTION_COMBO_BOX,
                   1033:                                          CB_INSERTSTRING, (WPARAM)-1,
                   1034:                                          (LPARAM)wcbuf);
                   1035:     }
                   1036:     else
                   1037:     {
                   1038:         pRes = (PSRESOLUTION *)((CHAR *)pntpd + pntpd->loResolution);
                   1039: 
                   1040:         iResolution = 0;
                   1041: 
                   1042:         for (i = 0; i < (int)pntpd->cResolutions; i++)
                   1043:         {
                   1044:             itoa((int)pRes->iValue, (CHAR *)cbuf, (int)10);
                   1045:             strcpy2WChar(wcbuf, cbuf);
                   1046: 
                   1047:             j = SendDlgItemMessage(hWnd, IDD_RESOLUTION_COMBO_BOX, CB_INSERTSTRING,
                   1048:                                    (WPARAM)-1, (LPARAM)wcbuf);
                   1049: 
                   1050:             if ((pdevmode->dm.dmPrintQuality == (short)pRes++->iValue))
                   1051:                 iResolution = j;
                   1052:         }
                   1053:     }
                   1054: 
                   1055:     // highlight the given resolution.
                   1056: 
                   1057:     SendDlgItemMessage(hWnd, IDD_RESOLUTION_COMBO_BOX, CB_SETCURSEL,
                   1058:                        iResolution, 0L);
                   1059: 
                   1060:     // fill in the scaling percentage.
                   1061: 
                   1062:     SetDlgItemInt(hWnd, IDD_SCALING_EDIT_BOX, (int)pdevmode->dm.dmScale, FALSE);
                   1063: 
                   1064:     // set the state of the color check box.  if the printer is b/w, grey
                   1065:     // out the check box.  if the printer is color, and DMCOLOR_COLOR is
                   1066:     // set in the PSDEVMODE, then check the check box.  otherwise, clear
                   1067:     // the check box.
                   1068: 
                   1069:     if (!(pntpd->flFlags & COLOR_DEVICE))
                   1070:     {
                   1071:         CheckDlgButton(hWnd, IDD_COLOR_CHECK_BOX, 0);
                   1072:         EnableWindow(GetDlgItem(hWnd, IDD_COLOR_CHECK_BOX), FALSE);
                   1073:     }
                   1074:     else if (pdevmode->dm.dmColor == DMCOLOR_COLOR)
                   1075:     {
                   1076:         EnableWindow(GetDlgItem(hWnd, IDD_COLOR_CHECK_BOX), TRUE);
                   1077:         CheckDlgButton(hWnd, IDD_COLOR_CHECK_BOX, 1);
                   1078:     }
                   1079:     else
                   1080:     {
                   1081:         EnableWindow(GetDlgItem(hWnd, IDD_COLOR_CHECK_BOX), TRUE);
                   1082:         CheckDlgButton(hWnd, IDD_COLOR_CHECK_BOX, 0);
                   1083:     }
                   1084: 
                   1085:     // set the state of the negative image check box.
                   1086: 
                   1087:     if (pdevmode->dwFlags & PSDEVMODE_NEG)
                   1088:         CheckDlgButton(hWnd, IDD_NEG_IMAGE_CHECK_BOX, 1);
                   1089:     else
                   1090:         CheckDlgButton(hWnd, IDD_NEG_IMAGE_CHECK_BOX, 0);
                   1091: 
                   1092:     // set the state of the all colors to black check box.
                   1093: 
                   1094:     if (pdevmode->dwFlags & PSDEVMODE_BLACK)
                   1095:         CheckDlgButton(hWnd, IDD_COLORS_TO_BLACK_CHECK_BOX, 1);
                   1096:     else
                   1097:         CheckDlgButton(hWnd, IDD_COLORS_TO_BLACK_CHECK_BOX, 0);
                   1098: 
                   1099:     // set the state of the mirror image check box.
                   1100: 
                   1101:     if (pdevmode->dwFlags & PSDEVMODE_MIRROR)
                   1102:         CheckDlgButton(hWnd, IDD_MIRROR_CHECK_BOX, 1);
                   1103:     else
                   1104:         CheckDlgButton(hWnd, IDD_MIRROR_CHECK_BOX, 0);
                   1105: 
                   1106:     // set the state of the error handler check box.
                   1107: 
                   1108:     if (pdevmode->dwFlags & PSDEVMODE_EHANDLER)
                   1109:         CheckDlgButton(hWnd, IDD_ERROR_HANDLER_CHECK_BOX, 1);
                   1110:     else
                   1111:         CheckDlgButton(hWnd, IDD_ERROR_HANDLER_CHECK_BOX, 0);
                   1112: 
                   1113:     // check whether font substitution is enabled, and set
                   1114:     // the appropriate radio button.
                   1115: 
                   1116:     if (pdevmode->dm.dmDriverExtra &&
                   1117:         (!(pdevmode->dwFlags & PSDEVMODE_FONTSUBST)))
                   1118:         bFontSubstitution = FALSE;
                   1119:     else
                   1120:         bFontSubstitution = TRUE;
                   1121: 
                   1122:     CheckRadioButton(hWnd, IDD_SUBST_RADIO_BUTTON, IDD_SOFTFONT_RADIO_BUTTON,
                   1123:                      bFontSubstitution ? IDD_SUBST_RADIO_BUTTON :
                   1124:                      IDD_SOFTFONT_RADIO_BUTTON);
                   1125: 
                   1126:     return(TRUE);
                   1127: }
                   1128: 
                   1129: 
                   1130: //--------------------------------------------------------------------------
                   1131: // VOID SetOrientation(hWnd, pDocDetails)
                   1132: // HWND        hWnd;
                   1133: // DOCDETAILS *pDocDetails;
                   1134: //
                   1135: // This routine selects the proper portrait or landscape icon, depending
                   1136: // on bPortrait.
                   1137: //
                   1138: // History:
                   1139: //   27-Mar-1992    -by-    Dave Snipp      (davesn)
                   1140: //  Wrote it.
                   1141: //--------------------------------------------------------------------------
                   1142: 
                   1143: VOID SetOrientation(hWnd, pDocDetails)
                   1144: HWND        hWnd;
                   1145: DOCDETAILS *pDocDetails;
                   1146: {
                   1147:     BOOL    bLandscape;
                   1148: 
                   1149:     bLandscape = (pDocDetails->pDMInput->dm.dmOrientation == DMORIENT_LANDSCAPE);
                   1150: 
                   1151:     // load the icons needed within this dialog box.
                   1152: 
                   1153:     pDocDetails->hIconPortrait = LoadIcon(hModule,
                   1154:                                           MAKEINTRESOURCE(ICOPORTRAIT));
                   1155:     pDocDetails->hIconLandscape = LoadIcon(hModule,
                   1156:                                           MAKEINTRESOURCE(ICOLANDSCAPE));
                   1157: 
                   1158:     SendDlgItemMessage(hWnd, IDD_ORIENTATION_ICON, STM_SETICON,
                   1159:                        bLandscape ? (WPARAM)pDocDetails->hIconLandscape :
                   1160:                                    (WPARAM)pDocDetails->hIconPortrait, 0L);
                   1161: }
                   1162: 
                   1163: 
                   1164: //--------------------------------------------------------------------------
                   1165: // VOID SetDuplex(hWnd, pDocDetails)
                   1166: // HWND        hWnd;
                   1167: // PDOCDETAILS pDocDetails;
                   1168: //
                   1169: // This routine will operate on pDocDetails->pDMInput PSDEVMODE structure,
                   1170: // making sure that is a structure we know about and can handle.
                   1171: //
                   1172: // History:
                   1173: //   20-Apr-1992    -by-    Kent Settle     (kentse)
                   1174: //  Wrote it.
                   1175: //--------------------------------------------------------------------------
                   1176: 
                   1177: VOID SetDuplex(hWnd, pDocDetails)
                   1178: HWND        hWnd;
                   1179: PDOCDETAILS pDocDetails;
                   1180: {
                   1181:     BOOL    bPortrait;
                   1182:     HANDLE  hDuplexIcon;
                   1183: 
                   1184:     // set up for proper default duplex mode if it exists on the printer.
                   1185: 
                   1186:     if (pDocDetails->flDialogFlags & DOES_DUPLEX)
                   1187:     {
                   1188:         // load the duplex icons.
                   1189: 
                   1190:         pDocDetails->hIconPDuplexNone = LoadIcon(hModule,
                   1191:                                                  MAKEINTRESOURCE(ICO_P_NONE));
                   1192:         pDocDetails->hIconLDuplexNone = LoadIcon(hModule,
                   1193:                                                  MAKEINTRESOURCE(ICO_L_NONE));
                   1194:         pDocDetails->hIconPDuplexTumble = LoadIcon(hModule,
                   1195:                                                  MAKEINTRESOURCE(ICO_P_HORIZ));
                   1196:         pDocDetails->hIconLDuplexTumble = LoadIcon(hModule,
                   1197:                                                  MAKEINTRESOURCE(ICO_L_VERT));
                   1198:         pDocDetails->hIconPDuplexNoTumble = LoadIcon(hModule,
                   1199:                                                  MAKEINTRESOURCE(ICO_P_VERT));
                   1200:         pDocDetails->hIconLDuplexNoTumble = LoadIcon(hModule,
                   1201:                                                  MAKEINTRESOURCE(ICO_L_HORIZ));
                   1202: 
                   1203: //!!! Should we have to worry about TRUE and FALSE Duplex printers? - kentse.
                   1204: 
                   1205:         bPortrait = (pDocDetails->pDMInput->dm.dmOrientation ==
                   1206:                     DMORIENT_PORTRAIT);
                   1207: 
                   1208:         switch (pDocDetails->pDMInput->dm.dmDuplex)
                   1209:         {
                   1210:             case DMDUP_VERTICAL:
                   1211:                 hDuplexIcon = bPortrait ? pDocDetails->hIconPDuplexNoTumble :
                   1212:                                           pDocDetails->hIconLDuplexTumble;
                   1213:                 break;
                   1214: 
                   1215:             case DMDUP_HORIZONTAL:
                   1216:                 hDuplexIcon = bPortrait ? pDocDetails->hIconPDuplexTumble :
                   1217:                                           pDocDetails->hIconLDuplexNoTumble;
                   1218:                 break;
                   1219: 
                   1220:             default:
                   1221:                 hDuplexIcon = bPortrait ? pDocDetails->hIconPDuplexNone :
                   1222:                                           pDocDetails->hIconLDuplexNone;
                   1223:                 break;
                   1224:         }
                   1225: 
                   1226:         // now set the appropriate icon.
                   1227: 
                   1228:         SendDlgItemMessage(hWnd, IDD_DUPLEX_ICON, STM_SETICON,
                   1229:                            (LONG)hDuplexIcon, 0L);
                   1230:     }
                   1231: }
                   1232: 
                   1233: 
                   1234: //--------------------------------------------------------------------------
                   1235: // VOID SetCollation(hWnd, pDocDetails)
                   1236: // HWND        hWnd;
                   1237: // DOCDETAILS *pDocDetails;
                   1238: //
                   1239: // This routine selects the proper collation icon and radio
                   1240: // buttons, depending on pDocDetails.
                   1241: //
                   1242: // History:
                   1243: //   01-Dec-1992    -by-    Kent Settle     (kentse)
                   1244: //  Wrote it.
                   1245: //--------------------------------------------------------------------------
                   1246: 
                   1247: VOID SetCollation(hWnd, pDocDetails)
                   1248: HWND        hWnd;
                   1249: DOCDETAILS *pDocDetails;
                   1250: {
                   1251:     BOOL    bCollate;
                   1252: 
                   1253:     // set up for proper default collate mode if it exists on the printer.
                   1254: 
                   1255:     if (pDocDetails->flDialogFlags & DOES_COLLATE)
                   1256:     {
                   1257:         bCollate = pDocDetails->pDMInput->dm.dmCollate;
                   1258: 
                   1259:         // load the icons needed within this dialog box.
                   1260: 
                   1261:         pDocDetails->hIconCollateOn = LoadIcon(hModule,
                   1262:                                               MAKEINTRESOURCE(ICO_COLLATE));
                   1263:         pDocDetails->hIconCollateOff = LoadIcon(hModule,
                   1264:                                               MAKEINTRESOURCE(ICO_NO_COLLATE));
                   1265: 
                   1266:         SendDlgItemMessage(hWnd, IDD_COLLATE_ICON, STM_SETICON,
                   1267:                            bCollate ? (WPARAM)pDocDetails->hIconCollateOn :
                   1268:                                       (WPARAM)pDocDetails->hIconCollateOff, 0L);
                   1269:     }
                   1270: }
                   1271: 
                   1272: 
                   1273: //--------------------------------------------------------------------------
                   1274: // BOOL AdjustDevmode(pDocDetails)
                   1275: // DOCDETAILS *pDocDetails;
                   1276: //
                   1277: // This routine will operate on pDocDetails->pDMInput PSDEVMODE structure,
                   1278: // making sure that is a structure we know about and can handle.
                   1279: //
                   1280: // History:
                   1281: //   20-Apr-1992    -by-    Kent Settle     (kentse)
                   1282: //  Wrote it.
                   1283: //--------------------------------------------------------------------------
                   1284: 
                   1285: BOOL AdjustDevmode(pDocDetails)
                   1286: DOCDETAILS *pDocDetails;
                   1287: {
                   1288:     PSDEVMODE  devmodeT;
                   1289: 
                   1290:     // first create the default DEVMODE structure in pDocDetails->pDMBuffer;
                   1291: 
                   1292:     if (!(SetDefaultPSDEVMODE(&devmodeT, pDocDetails->pDeviceName,
                   1293:                               pDocDetails->pntpd, pDocDetails->hPrinter)))
                   1294:     {
                   1295:         RIP("PSCRPTUI!AdjustDevmode: SetDefaultPSDEVMODE failed.\n");
                   1296:         return(FALSE);
                   1297:     }
                   1298: 
                   1299:     // make sure this is a DEVMODE we can live with.
                   1300: 
                   1301:     if (!(ValidateSetDEVMODE(&devmodeT, pDocDetails->pDMInput,
                   1302:                              pDocDetails->hPrinter, pDocDetails->pntpd)))
                   1303:     {
                   1304:         RIP("PSCRPTUI!AdjustDevmode: ValidateSetDEVMODE failed.\n");
                   1305:         return(FALSE);
                   1306:     }
                   1307: 
                   1308:     // copy our newly created and validated devmode.
                   1309: 
                   1310:     pDocDetails->DMBuffer = devmodeT;
                   1311:     pDocDetails->pDMInput = &pDocDetails->DMBuffer;
                   1312: 
                   1313:     return(TRUE);
                   1314: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.