|
|
/*****************************************************************************
* * diqvedit.c * * VList plug-in that does strings. * *****************************************************************************/
#include "diquick.h"
#pragma BEGIN_CONST_DATA
/*****************************************************************************
* * VLISTEDIT * * BOOL-specific goo. * *****************************************************************************/
typedef struct VLISTEDIT {
VLISTITEM item;
PTSTR ptszValue;
/*
* If non-NULL, then this is a read/write control. */ EDITUPDATEPROC Update; PV pvRef1; PV pvRef2;
} VLISTEDIT, *PVLISTEDIT;
/*****************************************************************************
* * VEdit_PreDisplay * * Set the edit control text and let the dialog know who it is in * charge of. * *****************************************************************************/
void INTERNAL VEdit_PreDisplay(HWND hdlg, PV pv) { PVLISTEDIT pvedit = pv; HWND hwndEdit = GetDlgItem(hdlg, IDC_VEDIT_EDIT);
SetWindowText(hwndEdit, pvedit->ptszValue);
Edit_SetReadOnly(hwndEdit, !pvedit->Update); ShowWindow(GetDlgItem(hdlg, IDC_VEDIT_APPLY), pvedit->Update ? SW_SHOW : SW_HIDE);
SetDialogPtr(hdlg, pvedit);
}
/*****************************************************************************
* * VEdit_Destroy * * Gotta free the string. * *****************************************************************************/
void INTERNAL VEdit_Destroy(PV pv) { PVLISTEDIT pvedit = pv;
LocalFree(pvedit->ptszValue); }
/*****************************************************************************
* * VEdit_OnInitDialog * * Limit the strings to MAX_PATH characters. * *****************************************************************************/
BOOL INTERNAL VEdit_OnInitDialog(HWND hdlg) { HWND hwndEdit = GetDlgItem(hdlg, IDC_VEDIT_EDIT); Edit_LimitText(hwndEdit, MAX_PATH); return TRUE; }
/*****************************************************************************
* * VEdit_OnCommand * * If they pressed Apply, then apply it. * *****************************************************************************/
BOOL INTERNAL VEdit_OnCommand(HWND hdlg, int id, UINT codeNotify) { if (id == IDC_VEDIT_APPLY) { PVLISTEDIT pvedit = GetDialogPtr(hdlg); TCHAR tsz[MAX_PATH];
GetDlgItemText(hdlg, IDC_VEDIT_EDIT, tsz, cA(tsz)); pvedit->Update(tsz, pvedit->pvRef1, pvedit->pvRef2);
return TRUE; } return FALSE; }
/*****************************************************************************
* * VEdit_DlgProc * * Nothing really happens here. The real work is done externally. * *****************************************************************************/
INT_PTR CALLBACK VEdit_DlgProc(HWND hdlg, UINT wm, WPARAM wp, LPARAM lp) { switch (wm) { case WM_INITDIALOG: return VEdit_OnInitDialog(hdlg);
case WM_COMMAND: return VEdit_OnCommand(hdlg, (int)GET_WM_COMMAND_ID(wp, lp), (UINT)GET_WM_COMMAND_CMD(wp, lp));
}
return FALSE; }
/*****************************************************************************
* * c_vvtblEdit * * Our vtbl. * *****************************************************************************/
const VLISTVTBL c_vvtblEdit = { VEdit_PreDisplay, VEdit_Destroy, IDD_VAL_EDIT, VEdit_DlgProc, };
/*****************************************************************************
* * VEdit_Create * * Make a vlist item that tracks a string. * *****************************************************************************/
PVLISTITEM EXTERNAL VEdit_Create(LPCTSTR ptszValue, EDITUPDATEPROC Update, PV pvRef1, PV pvRef2) { PVLISTEDIT pvedit = LocalAlloc(LPTR, cbX(VLISTEDIT));
if (pvedit) { pvedit->item.pvtbl = &c_vvtblEdit; pvedit->ptszValue = LocalAlloc(LPTR, cbX(TCHAR) * (lstrlen(ptszValue) + 1)); if (pvedit->ptszValue) { lstrcpy(pvedit->ptszValue, ptszValue); pvedit->Update = Update; pvedit->pvRef1 = pvRef1; pvedit->pvRef2 = pvRef2; } else { LocalFree(pvedit); pvedit = 0; } }
return (PV)pvedit; }
|