windows-nt/Source/XPSP1/NT/enduser/netmeeting/ui/conf/chcondlg.cpp
2020-09-26 16:20:57 +08:00

339 lines
7.6 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "precomp.h"
/****************************************************************************
*
* FILE: ChConDlg.cpp
*
* CREATED: Chris Pirich (ChrisPi) 6-26-96
*
* CONTENTS: CChooseConfDlg object
*
****************************************************************************/
#include <ConfWnd.h>
#include "resource.h"
#include "ChConDlg.h"
#include "help_ids.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)
{
USES_CONVERSION;
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/
lvI.pszText = W2T(ppwszConfNames[i]);
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++;
}
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;
}