#include "precomp.h" /**************************************************************************** * * FILE: ChConDlg.cpp * * CREATED: Chris Pirich (ChrisPi) 6-26-96 * * CONTENTS: CChooseConfDlg object * ****************************************************************************/ #include #include "resource.h" #include "ChConDlg.h" #include "help_ids.h" #include "ConfUtil.h" // Dialog ID to Help ID mapping static const DWORD rgHelpIdsChooseConf[] = { IDC_STATIC_CONFNAME, IDH_MCU_CONF_MAIN, IDC_CONFNAME_EDIT, IDH_MCU_CONF_NAME, IDC_CONFNAME_LISTVIEW, IDH_MCU_CONF_LIST, 0, 0 // terminator }; /**************************************************************************** * * CLASS: CChooseConfDlg * * MEMBER: CChooseConfDlg() * * PURPOSE: Constructor - initializes variables * ****************************************************************************/ CChooseConfDlg::CChooseConfDlg( HWND hwndParent, PWSTR* ppwszConferences): m_hwndParent (hwndParent), m_ppwszConferences (ppwszConferences), m_hwnd (NULL) { DebugEntry(CChooseConfDlg::CChooseConfDlg); DebugExitVOID(CChooseConfDlg::CChooseConfDlg); } /**************************************************************************** * * CLASS: CChooseConfDlg * * MEMBER: DoModal() * * PURPOSE: Brings up the modal dialog box * ****************************************************************************/ INT_PTR CChooseConfDlg::DoModal() { DebugEntry(CChooseConfDlg::DoModal); INT_PTR nRet = DialogBoxParam( ::GetInstanceHandle(), MAKEINTRESOURCE(IDD_CHOOSECONF), m_hwndParent, CChooseConfDlg::ChooseConfDlgProc, (LPARAM) this); DebugExitINT_PTR(CChooseConfDlg::DoModal, nRet); return nRet; } /**************************************************************************** * * CLASS: CChooseConfDlg * * MEMBER: ChooseConfDlgProc() * * PURPOSE: Dialog Proc - handles all messages * ****************************************************************************/ INT_PTR CALLBACK CChooseConfDlg::ChooseConfDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL bMsgHandled = FALSE; // uMsg may be any value. // wparam may be any value. // lparam may be any value. ASSERT(IS_VALID_HANDLE(hDlg, WND)); switch (uMsg) { case WM_INITDIALOG: { if (NULL != lParam) { ((CChooseConfDlg*) lParam)->m_hwnd = hDlg; ::SetWindowLongPtr(hDlg, DWLP_USER, lParam); // Create image list and associate it with the list view: HWND hwndLV = ::GetDlgItem(hDlg, IDC_CONFNAME_LISTVIEW); if (NULL != hwndLV) { BOOL fLoadFail = FALSE; HIMAGELIST hIML; hIML = ImageList_Create( 16, 16, ILC_MASK, 1, 0 ); if (NULL == hIML) { fLoadFail = TRUE; } else { HICON hIcon = ::LoadIcon( ::GetInstanceHandle(), MAKEINTRESOURCE(IDI_NET)); if ((NULL == hIcon) || (-1 == ImageList_AddIcon(hIML, hIcon))) { fLoadFail = TRUE; break; } ::DestroyIcon(hIcon); } if (FALSE == fLoadFail) { // Associate the image list with the list view ListView_SetImageList(hwndLV, hIML, LVSIL_SMALL); } // TODO: init conf list and name PWSTR* ppwszConfNames = ((CChooseConfDlg*) lParam)->m_ppwszConferences; ASSERT(ppwszConfNames); int i = 0; int iItems = 0; while (NULL != ppwszConfNames[i]) { // skip empty strings if ( 0 != *ppwszConfNames[i] ) { LV_ITEM lvI; // List view item structure // Fill in the LV_ITEM structure // The mask specifies the the .pszText, .iImage, .lParam and .state // members of the LV_ITEM structure are valid. lvI.mask = LVIF_TEXT | LVIF_IMAGE | /* LVIF_PARAM | */ LVIF_STATE; // put focus on first item lvI.state = (0 == iItems) ? (LVIS_FOCUSED | LVIS_SELECTED) : 0; lvI.stateMask = LVIS_FOCUSED | LVIS_SELECTED; lvI.iItem = iItems; lvI.iSubItem = 0; // The parent window is responsible for storing the text. The List view // window will send a LVN_GETDISPINFO when it needs the text to display/ LPTSTR szName; BSTR bstrName = ::SysAllocString(ppwszConfNames[i]); if(bstrName) { if(SUCCEEDED(BSTR_to_LPTSTR(&szName,bstrName))) { lvI.pszText = szName; lvI.iImage = 0; // lvI.lParam = 0; if (-1 == ListView_InsertItem(hwndLV, &lvI)) { ERROR_OUT(("Failed inserting item into list view")); } if (0 == iItems) { ::SetDlgItemText(hDlg, IDC_CONFNAME_EDIT, lvI.pszText); } iItems++; delete szName; } SysFreeString(bstrName); } } i++; } } } ::SetFocus(::GetDlgItem(hDlg, IDC_CONFNAME_EDIT)); ::SendDlgItemMessage(hDlg, IDC_CONFNAME_EDIT, EM_SETSEL, 0, (LPARAM)-1); RefreshOk(hDlg); bMsgHandled = FALSE; // return FALSE because we set the focus break; } case WM_CONTEXTMENU: DoHelpWhatsThis(wParam, rgHelpIdsChooseConf); break; case WM_HELP: DoHelp(lParam, rgHelpIdsChooseConf); break; default: { CChooseConfDlg* pccd = (CChooseConfDlg*) ::GetWindowLongPtr( hDlg, DWLP_USER); if (NULL != pccd) { bMsgHandled = pccd->ProcessMessage(uMsg, wParam, lParam); } } } return bMsgHandled; } /**************************************************************************** * * CLASS: CChooseConfDlg * * MEMBER: ProcessMessage() * * PURPOSE: processes all messages except WM_INITDIALOG * ****************************************************************************/ BOOL CChooseConfDlg::ProcessMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL bRet = FALSE; ASSERT(m_hwnd); switch (uMsg) { case WM_COMMAND: { switch (LOWORD(wParam)) { case IDOK: { // BUGBUG: how long can a conf name be? TCHAR szName[MAX_PATH]; if (0 != ::GetDlgItemText( m_hwnd, IDC_CONFNAME_EDIT, szName, CCHMAX(szName))) { bRet = OnOk(szName); } break; } case IDCANCEL: { ::EndDialog(m_hwnd, LOWORD(wParam)); bRet = TRUE; break; } case IDC_CONFNAME_EDIT: { if (EN_CHANGE == HIWORD(wParam)) { RefreshOk(m_hwnd); } break; } } break; } case WM_NOTIFY: { if (IDC_CONFNAME_LISTVIEW == wParam) { NM_LISTVIEW* pnmv = (NM_LISTVIEW*) lParam; ASSERT(pnmv); if ((LVN_ITEMCHANGED == pnmv->hdr.code) && (LVIS_SELECTED & pnmv->uNewState)) { TCHAR szName[MAX_PATH]; if (GetConferenceName(pnmv->iItem, szName, CCHMAX(szName))) { ::SetDlgItemText(m_hwnd, IDC_CONFNAME_EDIT, szName); } } else if (NM_DBLCLK == pnmv->hdr.code) { int idx = ListView_GetNextItem( ::GetDlgItem(m_hwnd, IDC_CONFNAME_LISTVIEW), -1, LVNI_FOCUSED | LVNI_SELECTED); if (idx != -1) { TCHAR szName[MAX_PATH]; if (GetConferenceName(idx, szName, CCHMAX(szName))) { OnOk(szName); } } } } break; } default: break; } return bRet; } BOOL CChooseConfDlg::GetConferenceName(int iItem, LPTSTR pszName, int cchName) { LV_ITEM lvI; lvI.mask = LVIF_TEXT; lvI.iItem = iItem; lvI.iSubItem = 0; lvI.pszText = pszName; lvI.cchTextMax = cchName; return ListView_GetItem( ::GetDlgItem(m_hwnd, IDC_CONFNAME_LISTVIEW), &lvI); } void CChooseConfDlg::RefreshOk(HWND hwnd) { BOOL fEnable = 0 != ::GetWindowTextLength( GetDlgItem(hwnd, IDC_CONFNAME_EDIT)); ::EnableWindow(GetDlgItem(hwnd, IDOK), fEnable); } BOOL CChooseConfDlg::OnOk(LPTSTR pszName) { DebugEntry(CChooseConfDlg::OnOk); BOOL bRet = TRUE; m_strConfName = pszName; ::EndDialog(m_hwnd, IDOK); DebugExitBOOL(CChooseConfDlg::OnOk, bRet); return bRet; }