|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.