/*++ Copyright (c) 1997 Microsoft Corporation Module Name: custsize.c Abstract: Display PostScript custom page size UI Environment: Windows NT PostScript driver UI Revision History: 03/31/97 -davidx- Created it. --*/ #include "precomp.h" #include #include // // PostScript custom page size context-sensitive help IDs // static const DWORD PSCustSizeHelpIDs[] = { IDC_CS_WIDTH, IDH_PSCUST_Width, IDC_CS_HEIGHT, IDH_PSCUST_Height, IDC_CS_INCH, IDH_PSCUST_Unit_Inch, IDC_CS_MM, IDH_PSCUST_Unit_Millimeter, IDC_CS_POINT, IDH_PSCUST_Unit_Point, IDC_CS_FEEDDIRECTION, IDH_PSCUST_PaperFeed_Direction, IDC_CS_CUTSHEET, IDH_PSCUST_Paper_CutSheet, IDC_CS_ROLLFED, IDH_PSCUST_Paper_RollFeed, IDC_CS_XOFFSET, IDH_PSCUST_Offset_Perpendicular, IDC_CS_YOFFSET, IDH_PSCUST_Offset_Parallel, IDOK, IDH_PSCUST_OK, IDCANCEL, IDH_PSCUST_Cancel, IDC_RESTOREDEFAULTS, IDH_PSCUST_Restore_Defaults, 0, 0 }; // // Display units // Note: These constants must be in the same order as dialog control IDs: // IDC_CS_INCH, IDC_CS_MM, IDC_CS_POINT // enum { CSUNIT_INCH, CSUNIT_MM, CSUNIT_POINT, CSUNIT_MAX }; static const double adCSUnitData[CSUNIT_MAX] = { 25400.0, // microns per inch 1000.0, // microns per millimeter 25400.0 / 72.0, // microns per point }; // // Data structure used to pass information to custom page size dialog // typedef struct _CUSTOMSIZEDLG { CUSTOMSIZEDATA csdata; // custom page size data, must be the first field PUIDATA pUiData; // pointer to UIDATA structure PPPDDATA pPpdData; // pointer to PPDDATA structure BOOL bMetric; // whether we're on metric system INT iUnit; // current display unit BOOL bSetText; // we're calling SetDlgItemText BOOL bOKPassed; // user hit OK and setting passed validation/resolution // feed direction to combo box option mapping table (round up to 4-byte boundary) BYTE aubFD2CBOptionMapping[(MAX_FEEDDIRECTION + 3) & ~3]; } CUSTOMSIZEDLG, *PCUSTOMSIZEDLG; #define MAXDIGITLEN 16 // maximum number of digits for user-entered numbers #define INVALID_CBOPTION_INDEX 0xFF // invalid option index for the feeding direction combo box #define CUSTSIZE_ROUNDUP(x) (ceil((x) * 100.0) / 100.0 + 0.001) #define CUSTSIZE_ROUNDDOWN(x) (floor((x) * 100.0) / 100.0 + 0.001) VOID VUpdateCustomSizeTextField( HWND hDlg, PCUSTOMSIZEDLG pDlgData, INT iCtrlID, PCUSTOMSIZERANGE pCSRange ) /*++ Routine Description: Update the custom size parameter text fields: width, height, and offsets Arguments: hDlg - Handle to custom page size dialog window pDlgData - Points to custom page size dialog data iCtrlID - Specifies the interested text field control ID pCSRange - custom page size parameter ranges Return Value: NONE --*/ { TCHAR tchBuf[MAX_DISPLAY_NAME]; DWORD dwVal; double dMin, dMax; double dNum; switch (iCtrlID) { case IDC_CS_WIDTH: dwVal = pDlgData->csdata.dwX; pCSRange += CUSTOMPARAM_WIDTH; break; case IDC_CS_HEIGHT: dwVal = pDlgData->csdata.dwY; pCSRange += CUSTOMPARAM_HEIGHT; break; case IDC_CS_XOFFSET: dwVal = pDlgData->csdata.dwWidthOffset; pCSRange += CUSTOMPARAM_WIDTHOFFSET; break; case IDC_CS_YOFFSET: dwVal = pDlgData->csdata.dwHeightOffset; pCSRange += CUSTOMPARAM_HEIGHTOFFSET; break; } // // The dMin/dMax algorithm here must be the same as in following function // VUpdateCustomSizeRangeField. // // We only show 2 digits after the decimal point. We round the min // number up (ceil) and round the max number down (floor). Also, in // order to correct double -> DWORD conversion error we saw in some // cases (ex. 39.000 is converted to DWROD 38 since the 39.000 is actually // 38.999999...), we add the extra 0.001. // dMin = (double) pCSRange->dwMin / adCSUnitData[pDlgData->iUnit]; dMin = CUSTSIZE_ROUNDUP(dMin); dMax = (double) pCSRange->dwMax / adCSUnitData[pDlgData->iUnit]; dMax = CUSTSIZE_ROUNDDOWN(dMax); // Fix bug Adobe #260379. 7/25/98 jjia // _stprintf(tchBuf, TEXT("%0.2f"), (double) dwVal / adCSUnitData[pDlgData->iUnit]); // // Fix MS #23733: PostScript custom page size dialog warns in border cases. // // Round the number first (2 digits after decimal point), then add 0.001 as explained above. // dNum = (double) dwVal / adCSUnitData[pDlgData->iUnit] + 0.005; dNum = CUSTSIZE_ROUNDDOWN(dNum); // // Make sure we don't show value outside of the range. This is to take care of rounding errors. // if (dNum < dMin) { dNum = dMin; } else if (dNum > dMax) { dNum = dMax; } StringCchPrintfW(tchBuf, CCHOF(tchBuf), TEXT("%ld.%0.2lu"), (DWORD)dNum, (DWORD)((dNum - (DWORD)dNum) * 100.0)); SetDlgItemText(hDlg, iCtrlID, tchBuf); } VOID VUpdateCustomSizeRangeField( HWND hDlg, PCUSTOMSIZEDLG pDlgData, INT iCtrlID, PCUSTOMSIZERANGE pCSRange ) /*++ Routine Description: Update the custom size parameter range fields: width, height, and offsets Arguments: hDlg - Handle to custom page size dialog window pDlgData - Points to custom page size dialog data iCtrlID - Specifies the interested range field control ID pCSRange - custom page size parameter ranges Return Value: NONE --*/ { TCHAR tchBuf[MAX_DISPLAY_NAME]; double dMin, dMax; switch (iCtrlID) { case IDC_CS_WIDTHRANGE: pCSRange += CUSTOMPARAM_WIDTH; break; case IDC_CS_HEIGHTRANGE: pCSRange += CUSTOMPARAM_HEIGHT; break; case IDC_CS_XOFFSETRANGE: pCSRange += CUSTOMPARAM_WIDTHOFFSET; break; case IDC_CS_YOFFSETRANGE: pCSRange += CUSTOMPARAM_HEIGHTOFFSET; break; } // Fix bug Adobe #260379. 7/25/98 jjia // If we build the driver using public MSVC, MSTOOLS and DDK, // the text string will become garbage. So, Don't use '%0.2f' // to format numbers. // _stprintf(tchBuf, // TEXT("(%0.2f, %0.2f)"), // (double) pCSRange->dwMin / adCSUnitData[pDlgData->iUnit], // (double) pCSRange->dwMax / adCSUnitData[pDlgData->iUnit]); // // Fix MS #23733: PostScript custom page size dialog warns in border cases. // // We only show 2 digits after the decimal point. We round the min // number up (ceil) and round the max number down (floor). Also, in // order to correct double -> DWORD conversion error we saw in some // cases (ex. 39.000 is converted to DWROD 38 since the 39.000 is actually // 38.999999...), we add the extra 0.001. // dMin = (double) pCSRange->dwMin / adCSUnitData[pDlgData->iUnit]; dMin = CUSTSIZE_ROUNDUP(dMin); dMax = (double) pCSRange->dwMax / adCSUnitData[pDlgData->iUnit]; dMax = CUSTSIZE_ROUNDDOWN(dMax); StringCchPrintfW(tchBuf, CCHOF(tchBuf), TEXT("(%ld.%0.2lu, %ld.%0.2lu)"), (DWORD)dMin, (DWORD)((dMin - (DWORD)dMin) * 100.0), (DWORD)dMax, (DWORD)((dMax - (DWORD)dMax) * 100.0)); SetDlgItemText(hDlg, iCtrlID, tchBuf); } VOID VUpdateCustomSizeDlgFields( HWND hDlg, PCUSTOMSIZEDLG pDlgData, BOOL bUpdateRangeOnly ) /*++ Routine Description: Update the custom page size dialog controls with the current custom page size parameter values Arguments: hDlg - Handle to custom page size dialog window pDlgData - Points to custom page size dialog data bUpdateRangeOnly - Whether we need to update the range fields only Return Value: NONE --*/ { CUSTOMSIZERANGE csrange[4]; VGetCustomSizeParamRange(pDlgData->pUiData->ci.pRawData, &pDlgData->csdata, csrange); if (! bUpdateRangeOnly) { // // Update the text fields // pDlgData->bSetText = TRUE; VUpdateCustomSizeTextField(hDlg, pDlgData, IDC_CS_WIDTH, csrange); VUpdateCustomSizeTextField(hDlg, pDlgData, IDC_CS_HEIGHT, csrange); VUpdateCustomSizeTextField(hDlg, pDlgData, IDC_CS_XOFFSET, csrange); VUpdateCustomSizeTextField(hDlg, pDlgData, IDC_CS_YOFFSET, csrange); pDlgData->bSetText = FALSE; // // Update the paper feed direction combo box // ASSERT(pDlgData->aubFD2CBOptionMapping[pDlgData->csdata.wFeedDirection] != INVALID_CBOPTION_INDEX); if (SendDlgItemMessage(hDlg, IDC_CS_FEEDDIRECTION, CB_SETCURSEL, pDlgData->aubFD2CBOptionMapping[pDlgData->csdata.wFeedDirection], 0) == CB_ERR) { ERR(("CB_SETCURSEL failed: %d\n", GetLastError())); } // // Update cut-sheet vs. roll-fed radio buttons // CheckDlgButton(hDlg, IDC_CS_CUTSHEET, pDlgData->csdata.wCutSheet); CheckDlgButton(hDlg, IDC_CS_ROLLFED, !pDlgData->csdata.wCutSheet); } // // Update ranges for width, height, and offsets // VUpdateCustomSizeRangeField(hDlg, pDlgData, IDC_CS_WIDTHRANGE, csrange); VUpdateCustomSizeRangeField(hDlg, pDlgData, IDC_CS_HEIGHTRANGE, csrange); VUpdateCustomSizeRangeField(hDlg, pDlgData, IDC_CS_XOFFSETRANGE, csrange); VUpdateCustomSizeRangeField(hDlg, pDlgData, IDC_CS_YOFFSETRANGE, csrange); } BOOL BGetWidthHeightOffsetVal( HWND hDlg, PCUSTOMSIZEDLG pDlgData, INT iCtrlID, PDWORD pdwVal ) /*++ Routine Description: Get the current width/height/offset value in the specified text field Arguments: hDlg - Handle to custom page size dialog window pDlgData - Points to custom page size dialog data iCtrlID - Specifies the interested text field control ID pdwVal - Return the current value in the specified text field (in microns) Return Value: TRUE if successful, FALSE if the text field doesn't contain valid floating-point number. Note that this function doesn't perform any range check. That's done in a later step. --*/ { TCHAR tchBuf[MAXDIGITLEN]; double d; PTSTR ptstr; BOOL bResult = FALSE; // // Get the current value in the speicified text field // if (GetDlgItemText(hDlg, iCtrlID, tchBuf, MAXDIGITLEN) > 0) { // // Treat the string as floating-point number // Make sure there are no non-space characters left // d = _tcstod(tchBuf, &ptstr); while (*ptstr != NUL) { if (! _istspace(*ptstr)) break; ptstr++; } if (bResult = (*ptstr == NUL)) { // // Convert from current unit to microns // d *= adCSUnitData[pDlgData->iUnit]; if (d < 0 || d > MAX_LONG) bResult = FALSE; else *pdwVal = (DWORD) d; } } if (!bResult) { // // automatically correct user's invalid input to value 0.00 // SetDlgItemText(hDlg, iCtrlID, TEXT("0.00")); *pdwVal = 0; } return TRUE; } BOOL BGetFeedDirectionSel( HWND hDlg, PCUSTOMSIZEDLG pDlgData, INT iCtrlID, PDWORD pdwVal ) /*++ Routine Description: Get the currently selected paper direction value Arguments: hDlg - Handle to custom page size dialog window pDlgData - Points to custom page size dialog data iCtrlID - Specifies the paper feed direction combo box control ID pdwVal - Return the selected paper feed direction value Return Value: TRUE if successful, FALSE if the selected choice is constrained or if there is an error --*/ { LRESULT lIndex, lVal; // // Get the currently chosen paper feed direction index // if (((lIndex = SendDlgItemMessage(hDlg, iCtrlID, CB_GETCURSEL, 0, 0)) == CB_ERR) || ((lVal = SendDlgItemMessage(hDlg, iCtrlID, CB_GETITEMDATA, (WPARAM)lIndex, 0)) == CB_ERR)) return FALSE; *pdwVal = (DWORD)lVal; return TRUE; } BOOL BChangeCustomSizeData( HWND hDlg, PCUSTOMSIZEDLG pDlgData, INT iCtrlID, DWORD dwVal ) /*++ Routine Description: Change the specified custom page size parameter Arguments: hDlg - Handle to custom page size dialog window pDlgData - Points to custom page size dialog data iCtrlID - Control ID indicating which parameter should be changed dwVal - New value for the specified parameter Return Value: TRUE --*/ { PCUSTOMSIZEDATA pCSData; // // Update the appropriate custom page size parameter // pCSData = &pDlgData->csdata; switch (iCtrlID) { case IDC_CS_WIDTH: pCSData->dwX = dwVal; break; case IDC_CS_HEIGHT: pCSData->dwY = dwVal; break; case IDC_CS_XOFFSET: pCSData->dwWidthOffset = dwVal; break; case IDC_CS_YOFFSET: pCSData->dwHeightOffset = dwVal; break; case IDC_CS_FEEDDIRECTION: pCSData->wFeedDirection = (WORD)dwVal; break; case IDC_CS_CUTSHEET: pCSData->wCutSheet = TRUE; return TRUE; case IDC_CS_ROLLFED: pCSData->wCutSheet = FALSE; return TRUE; } VUpdateCustomSizeDlgFields(hDlg, pDlgData, TRUE); return TRUE; } VOID VInitPaperFeedDirectionList( HWND hwndList, PCUSTOMSIZEDLG pDlgData ) /*++ Routine Description: Initialize the paper feed direction combo box Arguments: hwndList - Window handle to the paper feed direction combo box pDlgData - Points to custom page size dialog data Return Value: NONE --*/ { PUIINFO pUIInfo; PPPDDATA pPpdData; DWORD dwIndex; TCHAR tchBuf[MAX_DISPLAY_NAME]; LRESULT lIndex; if (hwndList == NULL) return; ASSERT(pDlgData); pUIInfo = pDlgData->pUiData->ci.pUIInfo; pPpdData = pDlgData->pPpdData; ASSERT(pUIInfo && pPpdData); for (dwIndex=0; dwIndex < MAX_FEEDDIRECTION; dwIndex++) { // // First: initialize the mapping table // pDlgData->aubFD2CBOptionMapping[dwIndex] = INVALID_CBOPTION_INDEX; // // Don't show the feeding direction if device doesn't supported it. // if ((dwIndex == LONGEDGEFIRST || dwIndex == LONGEDGEFIRST_FLIPPED) && !LONGEDGEFIRST_SUPPORTED(pUIInfo, pPpdData)) continue; if ((dwIndex == SHORTEDGEFIRST || dwIndex == SHORTEDGEFIRST_FLIPPED) && !SHORTEDGEFIRST_SUPPORTED(pUIInfo, pPpdData)) continue; if ((dwIndex == LONGEDGEFIRST || dwIndex == SHORTEDGEFIRST) && (MINCUSTOMPARAM_ORIENTATION(pPpdData) > 1)) continue; if ((dwIndex == LONGEDGEFIRST_FLIPPED || dwIndex == SHORTEDGEFIRST_FLIPPED) && (MAXCUSTOMPARAM_ORIENTATION(pPpdData) < 2)) continue; if (LoadString(ghInstance, IDS_FEEDDIRECTION_BASE + dwIndex, tchBuf, MAX_DISPLAY_NAME)) { if (((lIndex = SendMessage(hwndList, CB_ADDSTRING, 0, (LPARAM) tchBuf)) == CB_ERR) || (SendMessage(hwndList, CB_SETITEMDATA, (WPARAM)lIndex, (LPARAM)dwIndex) == CB_ERR)) { if (lIndex != CB_ERR) { SendMessage(hwndList, CB_DELETESTRING, (WPARAM)lIndex, 0); ERR(("CB_SETITEMDATA failed: %d\n", GetLastError())); } else { ERR(("CB_ADDSTRING failed: %d\n", GetLastError())); } } else { // // Record the mapping from feed direction to combo box option index. // Note that the combo box can NOT be sorted. // pDlgData->aubFD2CBOptionMapping[dwIndex] = (BYTE)lIndex; } } } } BOOL BCheckCustomSizeData( HWND hDlg, PCUSTOMSIZEDLG pDlgData ) { CUSTOMSIZEDATA csdata; INT iCtrlID; // // If there is no inconsistency, return TRUE // csdata = pDlgData->csdata; if (BValidateCustomPageSizeData(pDlgData->pUiData->ci.pRawData, &csdata)) return TRUE; // // Otherwise, indicate which field is invalid // if (hDlg != NULL) { if (csdata.dwX != pDlgData->csdata.dwX) iCtrlID = IDC_CS_WIDTH; else if (csdata.dwY != pDlgData->csdata.dwY) iCtrlID = IDC_CS_HEIGHT; else if (csdata.dwWidthOffset != pDlgData->csdata.dwWidthOffset) iCtrlID = IDC_CS_XOFFSET; else if (csdata.dwHeightOffset != pDlgData->csdata.dwHeightOffset) iCtrlID = IDC_CS_YOFFSET; else if (csdata.wFeedDirection != pDlgData->csdata.wFeedDirection) iCtrlID = IDC_CS_FEEDDIRECTION; else iCtrlID = IDC_CS_CUTSHEET; SetFocus(GetDlgItem(hDlg, iCtrlID)); if (iCtrlID == IDC_CS_WIDTH || iCtrlID == IDC_CS_HEIGHT || iCtrlID == IDC_CS_XOFFSET || iCtrlID == IDC_CS_YOFFSET) { SendDlgItemMessage(hDlg, iCtrlID, EM_SETSEL, 0, -1); } } return FALSE; } BOOL BCheckCustomSizeFeature( HWND hDlg, PCUSTOMSIZEDLG pDlgData, DWORD dwFeatureID ) { PUIINFO pUIInfo; PPPDDATA pPpdData; PFEATURE pFeature; DWORD dwFeatureIndex, dwOptionIndex; CONFLICTPAIR ConflictPair; // // If the specified feature doesn't exist, simply return TRUE // pUIInfo = pDlgData->pUiData->ci.pUIInfo; if (! (pFeature = GET_PREDEFINED_FEATURE(pUIInfo, dwFeatureID))) return TRUE; dwFeatureIndex = GET_INDEX_FROM_FEATURE(pUIInfo, pFeature); pPpdData = pDlgData->pPpdData; if (dwFeatureID == GID_LEADINGEDGE) { if (SKIP_LEADINGEDGE_CHECK(pUIInfo, pPpdData)) return TRUE; dwOptionIndex = (pDlgData->csdata.wFeedDirection == SHORTEDGEFIRST || pDlgData->csdata.wFeedDirection == SHORTEDGEFIRST_FLIPPED) ? pPpdData->dwLeadingEdgeShort : pPpdData->dwLeadingEdgeLong; if (dwOptionIndex == OPTION_INDEX_ANY) { goto error; } } else // (dwFeatureID == GID_USEHWMARGINS) { dwOptionIndex = pDlgData->csdata.wCutSheet ? pPpdData->dwUseHWMarginsTrue : pPpdData->dwUseHWMarginsFalse; } // // Return TRUE if there is no conflict. This is opposite of // EnumNewPickOneUIConflict which returns TRUE if there is a conflict. // if (! EnumNewPickOneUIConflict( pDlgData->pUiData->ci.pRawData, pDlgData->pUiData->ci.pCombinedOptions, dwFeatureIndex, dwOptionIndex, &ConflictPair)) { return TRUE; } error: if (hDlg != NULL) { SetFocus(GetDlgItem(hDlg, dwFeatureID == GID_LEADINGEDGE ? IDC_CS_FEEDDIRECTION : IDC_CS_CUTSHEET)); } return FALSE; } BOOL BResolveCustomSizeData( HWND hDlg, PCUSTOMSIZEDLG pDlgData ) { PRAWBINARYDATA pRawData; CUSTOMSIZEDATA cssave; PCUSTOMSIZEDATA pCSData; pRawData = pDlgData->pUiData->ci.pRawData; cssave = pDlgData->csdata; pCSData = &pDlgData->csdata; // // Choose alternative wCutSheet and wFeedDirection // value if the current value is constrained. // if (! BCheckCustomSizeFeature(hDlg, pDlgData, GID_USEHWMARGINS)) pCSData->wCutSheet = pCSData->wCutSheet ? FALSE : TRUE; if (! BCheckCustomSizeFeature(hDlg, pDlgData, GID_LEADINGEDGE)) { pCSData->wFeedDirection = (pCSData->wFeedDirection == SHORTEDGEFIRST || pCSData->wFeedDirection == SHORTEDGEFIRST_FLIPPED) ? LONGEDGEFIRST : SHORTEDGEFIRST; } // // Check to see if the specified custom page size parameters are consistent // (VOID) BValidateCustomPageSizeData(pRawData, pCSData); if (pCSData->dwX != cssave.dwX || pCSData->dwY != cssave.dwY) { CUSTOMSIZEDATA cstemp; // // If the width or height parameter is adjusted, // try to adjust the feed direction parameter first // cstemp = *pCSData; *pCSData = cssave; pCSData->wCutSheet = cstemp.wCutSheet; pCSData->wFeedDirection = (cstemp.wFeedDirection == SHORTEDGEFIRST || cstemp.wFeedDirection == SHORTEDGEFIRST_FLIPPED) ? LONGEDGEFIRST : SHORTEDGEFIRST; (VOID) BValidateCustomPageSizeData(pRawData, pCSData); if (pCSData->dwX != cssave.dwX || pCSData->dwY != cssave.dwY || !BCheckCustomSizeFeature(hDlg, pDlgData, GID_LEADINGEDGE)) { *pCSData = cstemp; } } if ((hDlg != NULL) && (!BCheckCustomSizeFeature(hDlg, pDlgData, GID_USEHWMARGINS) || !BCheckCustomSizeFeature(hDlg, pDlgData, GID_LEADINGEDGE))) { *pCSData = cssave; return FALSE; } return TRUE; } BOOL BCheckCustomSizeDataConflicts( HWND hDlg, PCUSTOMSIZEDLG pDlgData ) /*++ Routine Description: Resolve any conflicts involving *LeadingEdge and *UseHWMargins and any inconsistencies between custom page size parameters Arguments: hDlg - Handle to custom page size dialog window NULL if the window is not displayed yet pDlgData - Points to custom page size dialog data Return Value: FALSE if there are any unresolved conflicts or inconsistencies, TRUE otherwise --*/ { BOOL bResult; // // Check if there is any inconsistency // bResult = BCheckCustomSizeFeature(hDlg, pDlgData, GID_LEADINGEDGE) && BCheckCustomSizeFeature(hDlg, pDlgData, GID_USEHWMARGINS) && BCheckCustomSizeData(hDlg, pDlgData); if (! bResult) { // // Display an error message and ask the user whether he wants // to let the system automatically resolve the inconsistency. // if (hDlg == NULL || IDisplayErrorMessageBox(hDlg, MB_OKCANCEL | MB_ICONERROR, IDS_CUSTOMSIZE_ERROR, IDS_CUSTOMSIZEPARAM_ERROR) == IDOK) { bResult = BResolveCustomSizeData(hDlg, pDlgData); if (!bResult && hDlg != NULL) { (VOID) IDisplayErrorMessageBox( hDlg, 0, IDS_CUSTOMSIZE_ERROR, IDS_CUSTOMSIZE_UNRESOLVED); } } } return bResult; } INT_PTR CALLBACK BCustomSizeDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) /*++ Routine Description: Dialog procedure for custom page size dialog Arguments: hDlg - Handle to dialog window uMsg - Message wParam, lParam - Parameters Return Value: TRUE or FALSE depending on whether message is processed --*/ { PCUSTOMSIZEDLG pDlgData; INT iCmd; DWORD dwVal; switch (uMsg) { case WM_INITDIALOG: SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)lParam); pDlgData = (PCUSTOMSIZEDLG) lParam; if (pDlgData == NULL) { RIP(("Dialog parameter is NULL\n")); EndDialog(hDlg, IDCANCEL); return FALSE; } SendDlgItemMessage(hDlg, IDC_CS_WIDTH, EM_SETLIMITTEXT, MAXDIGITLEN-1, 0); SendDlgItemMessage(hDlg, IDC_CS_HEIGHT, EM_SETLIMITTEXT, MAXDIGITLEN-1, 0); SendDlgItemMessage(hDlg, IDC_CS_XOFFSET, EM_SETLIMITTEXT, MAXDIGITLEN-1, 0); SendDlgItemMessage(hDlg, IDC_CS_YOFFSET, EM_SETLIMITTEXT, MAXDIGITLEN-1, 0); pDlgData->iUnit = pDlgData->bMetric ? CSUNIT_MM : CSUNIT_INCH; CheckRadioButton(hDlg, IDC_CS_INCH, IDC_CS_POINT, IDC_CS_INCH + pDlgData->iUnit); // // Determine which feed directions should be disabled // VInitPaperFeedDirectionList(GetDlgItem(hDlg, IDC_CS_FEEDDIRECTION), pDlgData); // // Set up the initial display // if (! (pDlgData->pPpdData->dwCustomSizeFlags & CUSTOMSIZE_CUTSHEET)) EnableWindow(GetDlgItem(hDlg, IDC_CS_CUTSHEET), FALSE); if (! (pDlgData->pPpdData->dwCustomSizeFlags & CUSTOMSIZE_ROLLFED)) EnableWindow(GetDlgItem(hDlg, IDC_CS_ROLLFED), FALSE); VUpdateCustomSizeDlgFields(hDlg, pDlgData, FALSE); ShowWindow(hDlg, SW_SHOW); break; case WM_COMMAND: pDlgData = (PCUSTOMSIZEDLG) GetWindowLongPtr(hDlg, DWLP_USER); if (pDlgData == NULL) { RIP(("Dialog parameter is NULL\n")); break; } iCmd = GET_WM_COMMAND_ID(wParam, lParam); switch (iCmd) { case IDOK: // // Check if the selected paper feed direction is constrained // if (BCheckCustomSizeDataConflicts(hDlg, pDlgData)) { pDlgData->bOKPassed = TRUE; EndDialog(hDlg, IDOK); } return TRUE; case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; case IDC_RESTOREDEFAULTS: // // Use default custom page size parameters // VFillDefaultCustomPageSizeData( pDlgData->pUiData->ci.pRawData, &pDlgData->csdata, pDlgData->bMetric); VUpdateCustomSizeDlgFields(hDlg, pDlgData, FALSE); return TRUE; case IDC_CS_INCH: case IDC_CS_MM: case IDC_CS_POINT: // // Change display unit // pDlgData->iUnit = (iCmd == IDC_CS_INCH) ? CSUNIT_INCH : (iCmd == IDC_CS_MM) ? CSUNIT_MM : CSUNIT_POINT; VUpdateCustomSizeDlgFields(hDlg, pDlgData, FALSE); return TRUE; case IDC_CS_WIDTH: case IDC_CS_HEIGHT: case IDC_CS_XOFFSET: case IDC_CS_YOFFSET: if (GET_WM_COMMAND_CMD(wParam, lParam) != EN_KILLFOCUS || pDlgData->bSetText || pDlgData->bOKPassed) { break; } if (! BGetWidthHeightOffsetVal(hDlg, pDlgData, iCmd, &dwVal) || ! BChangeCustomSizeData(hDlg, pDlgData, iCmd, dwVal)) { VUpdateCustomSizeDlgFields(hDlg, pDlgData, FALSE); SetFocus(GetDlgItem(hDlg, iCmd)); SendDlgItemMessage(hDlg, iCmd, EM_SETSEL, 0, -1); } return TRUE; case IDC_CS_FEEDDIRECTION: if (GET_WM_COMMAND_CMD(wParam, lParam) != CBN_SELCHANGE) break; if (! BGetFeedDirectionSel(hDlg, pDlgData, iCmd, &dwVal) || ! BChangeCustomSizeData(hDlg, pDlgData, iCmd, dwVal)) { VUpdateCustomSizeDlgFields(hDlg, pDlgData, FALSE); SetFocus(GetDlgItem(hDlg, iCmd)); } return TRUE; case IDC_CS_CUTSHEET: case IDC_CS_ROLLFED: BChangeCustomSizeData(hDlg, pDlgData, iCmd, 0); return TRUE; } break; case WM_HELP: case WM_CONTEXTMENU: // // Sanity check // pDlgData = (PCUSTOMSIZEDLG) GetWindowLongPtr(hDlg, DWLP_USER); if (pDlgData == NULL || pDlgData->pUiData->ci.pDriverInfo3->pHelpFile == NULL) { return FALSE; } if (uMsg == WM_HELP) { WinHelp(((LPHELPINFO) lParam)->hItemHandle, pDlgData->pUiData->ci.pDriverInfo3->pHelpFile, HELP_WM_HELP, (ULONG_PTR)PSCustSizeHelpIDs); } else { WinHelp((HWND) wParam, pDlgData->pUiData->ci.pDriverInfo3->pHelpFile, HELP_CONTEXTMENU, (ULONG_PTR)PSCustSizeHelpIDs); } return TRUE; } return FALSE; } BOOL BDisplayPSCustomPageSizeDialog( PUIDATA pUiData ) /*++ Routine Description: Display PostScript custom page size dialog Arguments: pUiData - Points to UIDATA structure Return Value: TRUE if user pressed OK, FALSE otherwise --*/ { CUSTOMSIZEDLG dlgdata; PPSDRVEXTRA pdmPrivate; ZeroMemory(&dlgdata, sizeof(dlgdata)); dlgdata.pUiData = pUiData; dlgdata.pPpdData = GET_DRIVER_INFO_FROM_INFOHEADER((PINFOHEADER) pUiData->ci.pRawData); dlgdata.bMetric = IsMetricCountry(); ASSERT(SUPPORT_CUSTOMSIZE(pUiData->ci.pUIInfo) && SUPPORT_FULL_CUSTOMSIZE_FEATURES(pUiData->ci.pUIInfo, dlgdata.pPpdData)); // // Make sure the custom page size devmode fields are validated // pdmPrivate = pUiData->ci.pdmPrivate; dlgdata.csdata = pdmPrivate->csdata; (VOID) BCheckCustomSizeDataConflicts(NULL, &dlgdata); pdmPrivate->csdata = dlgdata.csdata; // // Display the custom page size dialog. // If the user pressed OK, update the devmode fields again. // if (DialogBoxParam(ghInstance, MAKEINTRESOURCE(IDD_PSCRIPT_CUSTOMSIZE), pUiData->hDlg, BCustomSizeDlgProc, (LPARAM) &dlgdata) == IDOK) { pdmPrivate->csdata = dlgdata.csdata; return TRUE; } else return FALSE; }