214 lines
5.3 KiB
C++
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);
|
||
|
}
|
||
|
|
||
|
|