/***************************************************************************** * * diqvrang.c * * VList plug-in that does ranges. * *****************************************************************************/ #include "diquick.h" #pragma BEGIN_CONST_DATA /***************************************************************************** * * VLISTRANGE * * range-specific goo. * *****************************************************************************/ typedef struct VLISTRANGE { VLISTITEM item; DIPROPRANGE diprg; int iRadix; /* * If non-NULL, then this is a read/write control. */ PROPUPDATEPROC Update; PV pvRef1; PV pvRef2; } VLISTRANGE, *PVLISTRANGE; /***************************************************************************** * * VRange_InitUD * * Common updown initialization goo. * *****************************************************************************/ void INTERNAL VRange_InitUD(HWND hwndUD, PVLISTRANGE pvrg, int iValue) { ShowWindow(hwndUD, pvrg->Update ? SW_SHOW : SW_HIDE); UpDown_SetRange(hwndUD, 0x80000000, 0x7FFFFFFF); UpDown_SetPos(hwndUD, pvrg->iRadix, iValue); Edit_SetReadOnly(GetWindow(hwndUD, GW_HWNDPREV), !pvrg->Update); } /***************************************************************************** * * VRange_PreDisplay * * Set the edit control text and let the dialog know who it is in * charge of. * *****************************************************************************/ void INTERNAL VRange_PreDisplay(HWND hdlg, PV pv) { PVLISTRANGE pvrg = pv; HWND hwndUD; hwndUD = GetDlgItem(hdlg, IDC_VRANGE_MINUD); VRange_InitUD(hwndUD, pvrg, pvrg->diprg.lMin); hwndUD = GetDlgItem(hdlg, IDC_VRANGE_MAXUD); VRange_InitUD(hwndUD, pvrg, pvrg->diprg.lMax); ShowWindow(GetDlgItem(hdlg, IDC_VRANGE_APPLY), pvrg->Update ? SW_SHOW : SW_HIDE); CheckRadioButton(hdlg, IDC_VRANGE_DEC, IDC_VRANGE_HEX, pvrg->iRadix == 10 ? IDC_VRANGE_DEC : IDC_VRANGE_HEX); SetDialogPtr(hdlg, pvrg); } /***************************************************************************** * * VRange_Destroy * * Nothing to clean up. * *****************************************************************************/ void INTERNAL VRange_Destroy(PV pv) { PVLISTRANGE pvrg = pv; } /***************************************************************************** * * VRange_OnInitDialog * * Limit the strings to MAX_PATH characters. * *****************************************************************************/ BOOL INTERNAL VRange_OnInitDialog(HWND hdlg) { HWND hwndEdit; hwndEdit = GetDlgItem(hdlg, IDC_VRANGE_MIN); Edit_LimitText(hwndEdit, CCHMAXINT); hwndEdit = GetDlgItem(hdlg, IDC_VRANGE_MAX); Edit_LimitText(hwndEdit, CCHMAXINT); return TRUE; } /***************************************************************************** * * VRange_OnApply * * Read the value (tricky if hex mode) and call the Update. * *****************************************************************************/ void INLINE VRange_OnApply(HWND hdlg, PVLISTRANGE pvrg) { pvrg->Update(&pvrg->diprg.diph, pvrg->pvRef1, pvrg->pvRef2); } /***************************************************************************** * * VRange_GetValue * *****************************************************************************/ void INTERNAL VRange_GetValue(HWND hdlg, PVLISTRANGE pvrg) { HWND hwndUD; hwndUD = GetDlgItem(hdlg, IDC_VRANGE_MINUD); UpDown_GetPos(hwndUD, &pvrg->diprg.lMin); hwndUD = GetDlgItem(hdlg, IDC_VRANGE_MAXUD); UpDown_GetPos(hwndUD, &pvrg->diprg.lMax); } /***************************************************************************** * * VRange_SetValue * *****************************************************************************/ void INTERNAL VRange_SetValue(HWND hdlg, PVLISTRANGE pvrg) { HWND hwndUD; hwndUD = GetDlgItem(hdlg, IDC_VRANGE_MINUD); UpDown_SetPos(hwndUD, pvrg->iRadix, pvrg->diprg.lMin); hwndUD = GetDlgItem(hdlg, IDC_VRANGE_MAXUD); UpDown_SetPos(hwndUD, pvrg->iRadix, pvrg->diprg.lMax); } /***************************************************************************** * * VRange_SetRadix * * Set a new radix by reading the old value, changing the radix, * and writing out the new value. * *****************************************************************************/ void INTERNAL VRange_SetRadix(HWND hdlg, PVLISTRANGE pvrg, int iRadix) { VRange_GetValue(hdlg, pvrg); pvrg->iRadix = iRadix; VRange_SetValue(hdlg, pvrg); } /***************************************************************************** * * VRange_OnCommand * * If they changed the radix, then change it. * * If they pressed Apply, then apply it. * *****************************************************************************/ BOOL INTERNAL VRange_OnCommand(HWND hdlg, int id, UINT codeNotify) { PVLISTRANGE pvrg = GetDialogPtr(hdlg); switch (id) { case IDC_VRANGE_DEC: VRange_SetRadix(hdlg, pvrg, 10); return TRUE; case IDC_VRANGE_HEX: VRange_SetRadix(hdlg, pvrg, 16); return TRUE; case IDC_VRANGE_APPLY: VRange_GetValue(hdlg, pvrg); VRange_OnApply(hdlg, pvrg); return TRUE; } return FALSE; } /***************************************************************************** * * VRange_DlgProc * * Nothing really happens here. The real work is done externally. * *****************************************************************************/ INT_PTR CALLBACK VRange_DlgProc(HWND hdlg, UINT wm, WPARAM wp, LPARAM lp) { switch (wm) { case WM_INITDIALOG: return VRange_OnInitDialog(hdlg); case WM_COMMAND: return VRange_OnCommand(hdlg, (int)GET_WM_COMMAND_ID(wp, lp), (UINT)GET_WM_COMMAND_CMD(wp, lp)); } return FALSE; } /***************************************************************************** * * c_vvtblInt * * Our vtbl. * *****************************************************************************/ const VLISTVTBL c_vvtblRange = { VRange_PreDisplay, VRange_Destroy, IDD_VAL_RANGE, VRange_DlgProc, }; /***************************************************************************** * * VRange_Create * * Make a vlist item that tracks a string. * *****************************************************************************/ PVLISTITEM EXTERNAL VRange_Create(LPDIPROPRANGE pdiprg, int iRadix, PROPUPDATEPROC Update, PV pvRef1, PV pvRef2) { PVLISTRANGE pvrg = LocalAlloc(LPTR, cbX(VLISTRANGE)); if (pvrg) { pvrg->item.pvtbl = &c_vvtblRange; pvrg->diprg = *pdiprg; pvrg->iRadix = iRadix; pvrg->Update = Update; pvrg->pvRef1 = pvRef1; pvrg->pvRef2 = pvRef2; } return (PV)pvrg; }