windows-nt/Source/XPSP1/NT/net/tapi/client/cplareacodedlg.cpp
2020-09-26 16:20:57 +08:00

468 lines
13 KiB
C++

/****************************************************************************
Copyright (c) 1998-1999 Microsoft Corporation
Module Name: cplareacodedlg.cpp
Author: toddb - 10/06/98
****************************************************************************/
#include "cplPreComp.h"
#include "cplAreaCodeDlg.h"
#include "cplSimpleDialogs.h"
CAreaCodeRuleDialog::CAreaCodeRuleDialog(BOOL bNew, CAreaCodeRule * pRule)
{
m_bNew = bNew;
m_pRule = pRule;
m_iSelectedItem = -1;
}
CAreaCodeRuleDialog::~CAreaCodeRuleDialog()
{
}
INT_PTR CAreaCodeRuleDialog::DoModal(HWND hwndParent)
{
return DialogBoxParam( GetUIInstance(), MAKEINTRESOURCE(IDD_NEWAREACODERULE), hwndParent, CAreaCodeRuleDialog::DialogProc, (LPARAM)this );
}
INT_PTR CALLBACK CAreaCodeRuleDialog::DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CAreaCodeRuleDialog * pthis = (CAreaCodeRuleDialog *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
switch (uMsg)
{
case WM_INITDIALOG:
pthis = (CAreaCodeRuleDialog *)lParam;
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR) pthis);
return pthis->OnInitDialog(hwndDlg);
case WM_COMMAND:
return pthis->OnCommand(hwndDlg, LOWORD(wParam), HIWORD(wParam), (HWND)lParam);
case WM_NOTIFY:
return pthis->OnNotify(hwndDlg, (LPNMHDR)lParam);
case WM_HELP:
WinHelp ((HWND)((LPHELPINFO)lParam)->hItemHandle, gszHelpFile, HELP_WM_HELP, (DWORD_PTR)(LPTSTR) a109HelpIDs);
break;
case WM_CONTEXTMENU:
// Process right-clicks on controls
WinHelp ((HWND)wParam, gszHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID) a109HelpIDs);
}
return 0;
}
void CAreaCodeRuleDialog::PopulatePrefixList(HWND hwndList)
{
TCHAR szText[MAX_INPUT];
LVITEM lvi;
lvi.mask = LVIF_TEXT;
lvi.iItem = 0;
lvi.iSubItem = 0;
lvi.pszText = szText;
int i;
LPWSTR pszz = m_pRule->GetPrefixList();
if (pszz)
{
while (*pszz)
{
SHUnicodeToTChar( pszz, szText, ARRAYSIZE(szText) );
ListView_InsertItem(hwndList, &lvi);
pszz += lstrlenW(pszz)+1;
}
}
}
void CAreaCodeRuleDialog::SetPrefixControlsState(HWND hwndDlg, BOOL bAll)
{
HWND hwndList = GetDlgItem(hwndDlg,IDC_PREFIXES);
EnableWindow(hwndList, !bAll);
hwndList = GetDlgItem(hwndDlg, IDC_LIST);
EnableWindow(hwndList, !bAll);
EnableWindow(GetDlgItem(hwndDlg,IDC_ADD), !bAll);
// by default, no prefix is selected so the remove button is always disabled at first
if (m_iSelectedItem == -1)
{
m_iSelectedItem = 0;
}
EnableWindow(GetDlgItem(hwndDlg,IDC_REMOVE), ListView_GetItemCount(hwndList) && !bAll);
if (!bAll)
{
ListView_SetItemState(hwndList, m_iSelectedItem, LVIS_FOCUSED|LVIS_SELECTED, LVIS_FOCUSED|LVIS_SELECTED);
}
}
BOOL CAreaCodeRuleDialog::OnInitDialog(HWND hwndDlg)
{
HWND hwnd;
TCHAR szText[MAX_INPUT];
if ( !m_bNew )
{
LoadString(GetUIInstance(),IDS_EDITRULE, szText, ARRAYSIZE(szText));
SetWindowText(hwndDlg, szText);
}
hwnd = GetDlgItem(hwndDlg,IDC_AREACODE);
SHUnicodeToTChar(m_pRule->GetAreaCode(), szText, ARRAYSIZE(szText));
SetWindowText(hwnd, szText);
SendMessage(hwnd, EM_SETLIMITTEXT, CPL_SETTEXTLIMIT, 0);
LimitInput(hwnd, LIF_ALLOWNUMBER);
BOOL bAll = m_pRule->HasAppliesToAllPrefixes();
CheckRadioButton(hwndDlg, IDC_ALLPREFIXES, IDC_LISTEDPREFIXES, bAll?IDC_ALLPREFIXES:IDC_LISTEDPREFIXES);
// populate the prefix list
hwnd = GetDlgItem(hwndDlg, IDC_LIST);
RECT rc;
GetClientRect(hwnd, &rc);
LVCOLUMN lvc;
lvc.mask = LVCF_SUBITEM | LVCF_WIDTH;
lvc.iSubItem = 0;
lvc.cx = rc.right - GetSystemMetrics(SM_CXVSCROLL);
ListView_InsertColumn( hwnd, 0, &lvc );
PopulatePrefixList(hwnd);
if (ListView_GetItemCount(hwnd) > 0)
{
m_iSelectedItem = 0;
ListView_SetItemState(hwnd, 0, LVIS_FOCUSED|LVIS_SELECTED, LVIS_FOCUSED|LVIS_SELECTED);
}
SetPrefixControlsState(hwndDlg, bAll);
hwnd = GetDlgItem(hwndDlg,IDC_DIALNUMBER);
SHUnicodeToTChar(m_pRule->GetNumberToDial(), szText, ARRAYSIZE(szText));
SetWindowText(hwnd, szText);
SendMessage(hwnd, EM_SETLIMITTEXT, CPL_SETTEXTLIMIT, 0);
if ( m_pRule->HasDialNumber() )
{
SendMessage( GetDlgItem(hwndDlg,IDC_DIALCHECK), BM_SETCHECK, BST_CHECKED, 0 );
}
else
{
EnableWindow(hwnd, FALSE);
}
LimitInput(hwnd, LIF_ALLOWNUMBER|LIF_ALLOWPOUND|LIF_ALLOWSTAR|LIF_ALLOWSPACE|LIF_ALLOWCOMMA);
if ( m_pRule->HasDialAreaCode() )
{
SendMessage( GetDlgItem(hwndDlg,IDC_DIALAREACODE), BM_SETCHECK, BST_CHECKED, 0 );
}
return 1;
}
BOOL CAreaCodeRuleDialog::OnCommand(HWND hwndParent, int wID, int wNotifyCode, HWND hwndCrl)
{
switch (wID)
{
case IDOK:
if (!ApplyChanges(hwndParent) )
{
break;
}
// fall through
case IDCANCEL:
HideToolTip();
EndDialog(hwndParent,wID);
break;
case IDC_ALLPREFIXES:
case IDC_LISTEDPREFIXES:
SetPrefixControlsState(hwndParent, IDC_ALLPREFIXES==wID);
break;
case IDC_ADD:
AddPrefix(hwndParent);
break;
case IDC_REMOVE:
RemoveSelectedPrefix(hwndParent);
break;
case IDC_DIALCHECK:
if ( BN_CLICKED == wNotifyCode )
{
BOOL bOn = SendMessage(hwndCrl, BM_GETCHECK, 0,0) == BST_CHECKED;
HWND hwnd = GetDlgItem(hwndParent, IDC_DIALNUMBER);
EnableWindow(hwnd, bOn);
if ( bOn )
{
SetFocus(hwnd);
}
}
break;
default:
return 0;
}
return 1;
}
BOOL CAreaCodeRuleDialog::OnNotify(HWND hwndDlg, LPNMHDR pnmhdr)
{
switch (pnmhdr->idFrom)
{
case IDC_LIST:
#define pnmlv ((LPNMLISTVIEW)pnmhdr)
switch (pnmhdr->code)
{
case LVN_ITEMCHANGED:
if ( (pnmlv->uChanged & LVIF_STATE) && (pnmlv->uNewState & LVIS_SELECTED) )
{
m_iSelectedItem = pnmlv->iItem;
EnableWindow(GetDlgItem(hwndDlg,IDC_REMOVE), pnmlv->iItem != -1);
}
break;
case NM_DBLCLK:
if ( -1 == pnmlv->iItem )
{
// Do new case
AddPrefix(hwndDlg);
}
break;
case NM_CLICK:
if ( (-1 == pnmlv->iItem) && (-1!=m_iSelectedItem) )
{
m_iSelectedItem = -1;
EnableWindow(GetDlgItem(hwndDlg,IDC_REMOVE), FALSE);
}
break;
default:
break;
}
break;
#undef pnmlv
default:
return 0;
}
return 1;
}
BOOL CAreaCodeRuleDialog::ApplyChanges(HWND hwndParent)
{
TCHAR szAreaCode[MAX_INPUT] = {0};
TCHAR szBuffer[MAX_INPUT];
WCHAR wszBuffer[1024];
PWSTR pwsz;
HWND hwnd;
// read the area code
hwnd = GetDlgItem(hwndParent,IDC_AREACODE);
GetWindowText(hwnd, szAreaCode, ARRAYSIZE(szAreaCode));
if ( !*szAreaCode )
{
ShowErrorMessage(hwnd, IDS_NEEDANAREACODE);
return FALSE;
}
// read the prefix list
hwnd = GetDlgItem(hwndParent, IDC_LIST);
int iItems = ListView_GetItemCount(hwnd);
int i;
LVITEM lvi;
lvi.mask = LVIF_TEXT;
lvi.iSubItem = 0;
lvi.pszText = szBuffer;
lvi.cchTextMax = ARRAYSIZE(szBuffer);
UINT cchFree = ARRAYSIZE(wszBuffer);
wszBuffer[1] = TEXT('\0'); // ensure double NULL termination if iItems is zero
pwsz = wszBuffer;
for (i=0; i<iItems; i++)
{
UINT cchPrefix;
lvi.mask = LVIF_TEXT;
lvi.iItem = i;
ListView_GetItem(hwnd, &lvi);
cchPrefix = lstrlen(szBuffer);
if (cchPrefix >= cchFree)
{
// out of space in temp buffer. Hopefully this will never happen
LOG((TL_ERROR, "ApplyChanges: Out of space in temp buffer."));
break;
}
SHTCharToUnicode(szBuffer, pwsz, cchFree-1);
pwsz += cchPrefix+1;
cchFree -= cchPrefix+1;
}
*pwsz = NULL;
BOOL bAllPrefixes;
bAllPrefixes = SendMessage( GetDlgItem(hwndParent, IDC_ALLPREFIXES), BM_GETCHECK, 0,0 ) == BST_CHECKED;
if ( !bAllPrefixes && iItems==0 )
{
ShowErrorMessage(GetDlgItem(hwndParent,IDC_ADD), IDS_NEEDPREFIXLIST);
return FALSE;
}
BOOL dDialNumber;
dDialNumber = SendMessage( GetDlgItem(hwndParent, IDC_DIALCHECK), BM_GETCHECK, 0,0 ) == BST_CHECKED;
GetWindowText(GetDlgItem(hwndParent,IDC_DIALNUMBER), szBuffer, ARRAYSIZE(szBuffer));
if ( dDialNumber && IsEmptyOrHasOnlySpaces(szBuffer))
{
ShowErrorMessage(GetDlgItem(hwndParent,IDC_DIALNUMBER), IDS_NEEDDIALNUMBER);
return FALSE;
}
// TODO:
// for each prefix, look for a conflicting rule.
// if a conflict is found, alert the user.
// based on the alert optionally ammend the conflicting rule
// now we have verified the input is valid, go ahead and update everything:
// save the prefix list even if Applies To All is selected.
m_pRule->SetPrefixList( wszBuffer, (ARRAYSIZE(wszBuffer)-cchFree+1)*sizeof(WCHAR) );
// read all verse select prefixes radio button
m_pRule->SetAppliesToAllPrefixes( bAllPrefixes );
// Save the area code.
SHTCharToUnicode(szAreaCode, wszBuffer, ARRAYSIZE(wszBuffer));
m_pRule->SetAreaCode( wszBuffer );
// Save the dial number
SHTCharToUnicode(szBuffer, wszBuffer, ARRAYSIZE(wszBuffer));
m_pRule->SetNumberToDial( wszBuffer );
// Save the dial number checkbox
m_pRule->SetDialNumber( dDialNumber );
// read the dial area code check box
BOOL b;
b = SendMessage( GetDlgItem(hwndParent, IDC_DIALAREACODE), BM_GETCHECK, 0,0 ) == BST_CHECKED;
m_pRule->SetDialAreaCode( b );
return TRUE;
}
void CAreaCodeRuleDialog::AddPrefix(HWND hwndParent)
{
CEditDialog ed;
INT_PTR iRes = ed.DoModal(hwndParent, IDS_ADDPREFIX, IDS_TYPEPREFIX, IDS_ACPREFIXES, LIF_ALLOWNUMBER|LIF_ALLOWSPACE|LIF_ALLOWCOMMA);
if ( iRes == (INT_PTR)IDOK )
{
LPTSTR psz = ed.GetString();
if (!psz)
return; // should be impossible, but better safe than sorry
// The string can contain multiple prefixes seperated by spaces, parse it
// up and add one prefix for each chunk
while (*psz)
{
LPTSTR pszNext;
TCHAR ch;
HWND hwndList = GetDlgItem(hwndParent, IDC_LIST);
// trim leading spaces
while ((*psz == TEXT(' ')) || (*psz == TEXT(',')))
psz++;
// check if trimming the spaces toke us to the end of the string
if ( *psz )
{
// find next space and make it a temporary null
pszNext = psz;
while (*pszNext && (*pszNext != TEXT(' ')) && (*pszNext != TEXT(',')) )
pszNext++;
ch = *pszNext;
*pszNext = NULL;
// add this item to the list
LVITEM lvi;
lvi.mask = LVIF_TEXT;
lvi.pszText = psz;
lvi.iItem = 0;
lvi.iSubItem = 0;
ListView_InsertItem(hwndList, &lvi);
// replace our tempory null with it's previous value
*pszNext = ch;
// advance the psz point
psz = pszNext;
}
}
}
}
void CAreaCodeRuleDialog::RemoveSelectedPrefix(HWND hwndParent)
{
if ( -1 != m_iSelectedItem )
{
m_iSelectedItem = DeleteItemAndSelectPrevious(hwndParent, IDC_LIST, m_iSelectedItem, IDC_REMOVE, IDC_ADD);
}
}
int DeleteItemAndSelectPrevious( HWND hwndParent, int iList, int iItem, int iDel, int iAdd )
{
HWND hwnd = GetDlgItem(hwndParent, iList);
ListView_DeleteItem(hwnd, iItem);
// Try to select the previous item, if possible
iItem--;
if ( 0 > iItem )
{
iItem = 0;
}
LVITEM lvi;
lvi.mask = LVIF_PARAM;
lvi.iItem = iItem;
lvi.iSubItem = 0;
if ( ListView_GetItem(hwnd, &lvi) )
{
ListView_SetItemState(hwnd, iItem, LVIS_FOCUSED|LVIS_SELECTED, LVIS_FOCUSED|LVIS_SELECTED);
ListView_EnsureVisible(hwnd, iItem, FALSE);
}
else
{
iItem = -1;
}
hwnd = GetDlgItem(hwndParent,iDel);
if ( -1 == iItem )
{
if ( GetFocus() == hwnd )
{
HWND hwndDef = GetDlgItem(hwndParent,iAdd);
SendMessage(hwnd, BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE,0));
SendMessage(hwndDef, BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE,0));
SetFocus(hwndDef);
}
}
EnableWindow(hwnd, -1!=iItem);
return iItem;
}
BOOL IsEmptyOrHasOnlySpaces(PTSTR pwszStr)
{
while(*pwszStr)
if(*pwszStr++ != TEXT(' '))
return FALSE;
return TRUE;
}