/**************************************************************************** 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: TapiCplWinHelp ((HWND)((LPHELPINFO)lParam)->hItemHandle, gszHelpFile, HELP_WM_HELP, (DWORD_PTR)(LPTSTR) a109HelpIDs); break; case WM_CONTEXTMENU: // Process right-clicks on controls TapiCplWinHelp ((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= 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; }