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

214 lines
5.3 KiB
C++

// File: redial.cpp
#include <precomp.h>
#include "resource.h"
// from confroom.cpp
VOID PlaceCall(LPCTSTR pcszName, LPCTSTR pcszAddress, NM_ADDR_TYPE addrType);
/* B U I L D R E D I A L L I S T M E N U */
/*-------------------------------------------------------------------------
%%Function: BuildRedialListMenu
-------------------------------------------------------------------------*/
BOOL BuildRedialListMenu(HMENU hPopupMenu, RegEntry * pRe)
{
ASSERT(NULL != hPopupMenu);
MENUITEMINFO mmi;
InitStruct(&mmi);
mmi.fMask = MIIM_STATE | MIIM_ID | MIIM_TYPE;
mmi.wID = ID_FIRST_REDIAL_ITEM;
mmi.fType = MFT_STRING;
int cItem = pRe->GetNumber(REGVAL_MRU_COUNT, 0);
if (0 == cItem)
{
// Insert a "stub" item
TCHAR szMenuText[MAX_PATH];
if (FLoadString(IDS_REDIAL_EMPTY, szMenuText, CCHMAX(szMenuText)))
{
mmi.fState = MFS_DISABLED;
mmi.dwTypeData = szMenuText;
mmi.cch = lstrlen(mmi.dwTypeData);
InsertMenuItem(hPopupMenu, 0, TRUE, &mmi);;
}
}
else
{
mmi.fState = MFS_ENABLED;
for (int iItem = 0; iItem < cItem; iItem++)
{
TCHAR szKey[MAX_PATH];
wsprintf(szKey, TEXT("%s%d"), REGVAL_NAME_MRU_PREFIX, iItem);
mmi.dwTypeData = (LPTSTR) pRe->GetString(szKey);
mmi.cch = lstrlen(mmi.dwTypeData);
InsertMenuItem(hPopupMenu, iItem, TRUE, &mmi);;
mmi.wID++;
}
}
return TRUE;
}
/* D I S P L A Y R E D I A L L I S T P O P U P */
/*-------------------------------------------------------------------------
%%Function: DisplayRedialListPopup
-------------------------------------------------------------------------*/
int DisplayRedialListPopup(HMENU hPopupMenu, RECT const *rc)
{
TPMPARAMS tpm;
tpm.cbSize = sizeof(tpm);
tpm.rcExclude = *rc;
// Popup the menu (making sure it doesn't cover the button)
int id = ::TrackPopupMenuEx(hPopupMenu,
TPM_VERTICAL | TPM_TOPALIGN | TPM_RETURNCMD,
tpm.rcExclude.left, tpm.rcExclude.bottom,
::GetMainWindow(), &tpm);
return (0 == id) ? -1 : id -= ID_FIRST_REDIAL_ITEM;
}
/* D O T B R E D I A L L I S T */
/*-------------------------------------------------------------------------
%%Function: DoTbRedialList
-------------------------------------------------------------------------*/
VOID DoTbRedialList(HWND hwndRedial, RECT const *prcExclude)
{
RECT rcExclude;
ASSERT(NULL != hwndRedial);
if (NULL == prcExclude)
{
GetClientRect(hwndRedial, &rcExclude);
}
else
{
rcExclude = *prcExclude;
}
::MapWindowPoints(hwndRedial, NULL, (LPPOINT)&rcExclude, 2);
HMENU hPopupMenu = CreatePopupMenu();
if (NULL == hPopupMenu)
return;
RegEntry re(DLGCALL_MRU_KEY, HKEY_CURRENT_USER);
if (BuildRedialListMenu(hPopupMenu, &re))
{
int iItem = DisplayRedialListPopup(hPopupMenu, &rcExclude);
if (-1 != iItem)
{
TCHAR szKey[MAX_PATH];
wsprintf(szKey, TEXT("%s%d"), REGVAL_DLGCALL_ADDR_MRU_PREFIX, iItem);
TCHAR szAddress[CCHMAXSZ_ADDRESS];
lstrcpyn(szAddress, re.GetString(szKey), CCHMAX(szAddress));
if (!FEmptySz(szAddress))
{
wsprintf(szKey, TEXT("%s%d"), REGVAL_DLGCALL_TYPE_MRU_PREFIX, iItem);
NM_ADDR_TYPE addrType = (NM_ADDR_TYPE) re.GetNumber(szKey);
wsprintf(szKey, TEXT("%s%d"), REGVAL_DLGCALL_NAME_MRU_PREFIX, iItem);
PlaceCall(re.GetString(szKey), szAddress, addrType);
}
}
}
::DestroyMenu(hPopupMenu);
}
VOID DoTbRedialList(HWND hwndToolbar, UINT uCmd)
{
RECT rcShow;
// Determine which toolbar button was pressed:
int nIndex = SendMessage(hwndToolbar, TB_COMMANDTOINDEX, uCmd, 0);
// Get it's position
::SendMessage(hwndToolbar, TB_GETITEMRECT, nIndex, (LPARAM) &rcShow);
DoTbRedialList(hwndToolbar, &rcShow);
}
/* G E T R E D I A L H E L P T E X T */
/*-------------------------------------------------------------------------
%%Function: GetRedialHelpText
-------------------------------------------------------------------------*/
VOID GetRedialHelpText(LPTSTR psz, int cchMax, int id)
{
TCHAR szKey[MAX_PATH];
TCHAR szName[CCHMAXSZ_NAME];
TCHAR szAddress[CCHMAXSZ_ADDRESS];
TCHAR szUsing[MAX_PATH];
TCHAR szFormat[MAX_PATH];
SetEmptySz(psz);
RegEntry re(DLGCALL_MRU_KEY, HKEY_CURRENT_USER);
wsprintf(szKey, TEXT("%s%d"), REGVAL_DLGCALL_NAME_MRU_PREFIX, id);
lstrcpyn(szName, re.GetString(szKey), CCHMAX(szName));
if (FEmptySz(szName))
return;
if (!FLoadString(IDS_REDIAL_FORMAT, szFormat, CCHMAX(szFormat)))
return;
wsprintf(szKey, TEXT("%s%d"), REGVAL_DLGCALL_TYPE_MRU_PREFIX, id);
int idsUsing;
switch (re.GetNumber(szKey))
{
case NM_ADDR_IP:
case NM_ADDR_MACHINENAME:
idsUsing = IDS_CALLUSING_IP;
break;
case NM_ADDR_H323_GATEWAY:
idsUsing = IDS_CALLUSING_PHONE;
break;
case NM_ADDR_ULS:
idsUsing = IDS_CALLUSING_ILS;
break;
case NM_ADDR_ALIAS_ID:
case NM_ADDR_ALIAS_E164:
idsUsing = IDS_CALLUSING_GK;
break;
default:
idsUsing = 0;
break;
}
if (0 == idsUsing)
{
SetEmptySz(szUsing);
}
else if (!FLoadString(idsUsing, szUsing, CCHMAX(szUsing)))
{
return;
}
wsprintf(szKey, TEXT("%s%d"), REGVAL_DLGCALL_ADDR_MRU_PREFIX, id);
lstrcpyn(szAddress, re.GetString(szKey), CCHMAX(szAddress));
if ((lstrlen(szAddress) + lstrlen(szFormat) + lstrlen(szUsing) + lstrlen(szName)) > cchMax)
{
// Just display the address if it won't fit
lstrcpyn(psz, szAddress, cchMax);
return;
}
wsprintf(psz, szFormat, szName, szUsing, szAddress);
ASSERT(lstrlen(psz) < cchMax);
}