// CountryComboBox.cpp : implementation file // #include "stdafx.h" #include "CertWiz.h" #include "CountryComboBox.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif BEGIN_MESSAGE_MAP(CComboEdit, CEdit) ON_WM_CHAR() END_MESSAGE_MAP() void CComboEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { if (m_pParent->OnEditChar(nChar)) { CEdit::OnChar(nChar, nRepCnt, nFlags); } } BOOL CComboEdit::SubclassDlgItem(UINT nID, CCountryComboBox * pParent) { ASSERT(pParent != NULL); m_pParent = pParent; return CEdit::SubclassDlgItem(nID, pParent); } BOOL CCountryComboBox::OnEditChar(UINT nChar) { int index; int len = m_strInput.GetLength(); if ( ((nChar == VK_ESCAPE) || (nChar == VK_RETURN) || (nChar == VK_TAB)) && GetDroppedState() ) { // hide the dropdown ShowDropDown(FALSE); } if (nChar == VK_RETURN) { // Check if there is something selected... index = GetCurSel(); if (index != -1) { m_Index = index; SetCurSel(m_Index); SetEditSel(0, m_strInput.GetLength()); return TRUE; } } if (nChar == VK_ESCAPE) { if (len == 0) { MessageBeep(MB_ICONQUESTION); return FALSE; } m_strInput.Empty(); len = 0; return FALSE; } else if (nChar == VK_BACK) { if (len == 0) { MessageBeep(MB_ICONQUESTION); return FALSE; } m_strInput.ReleaseBuffer(--len); } else if (_istalpha((TCHAR) nChar) || VK_SPACE == nChar) { m_strInput += (TCHAR)nChar; len++; } else { MessageBeep(MB_ICONQUESTION); return FALSE; } if (len > 0 && len <= 2) { if (CB_ERR != (index = FindString(-1, m_strInput))) { m_Index = index; SetCurSel(m_Index); SetEditSel(0, m_strInput.GetLength()); } else { // try to find it in country names list index = -1; POSITION pos = m_map_name_code.GetStartPosition(); int i = 0; while (pos != NULL) { CString name, code; m_map_name_code.GetNextAssoc(pos, name, code); if (0 == _tcsnicmp(name, m_strInput, len)) { index = i; break; } i++; } if (index != -1) { m_Index = index; SetCurSel(m_Index); SetEditSel(4, len); } else { m_strInput.ReleaseBuffer(--len); MessageBeep(MB_ICONQUESTION); } } } else if (len > 2) { // try to find it in country names list index = -1; POSITION pos = m_map_name_code.GetStartPosition(); while (pos != NULL) { CString name, code; m_map_name_code.GetNextAssoc(pos, name, code); if (0 == _tcsnicmp(name, m_strInput, len)) { index = FindString(-1, code); break; } } if (index != -1) { m_Index = index; SetCurSel(m_Index); SetEditSel(4, 4+len); } else { m_strInput.ReleaseBuffer(--len); MessageBeep(MB_ICONQUESTION); } } else { // just remove selection SetEditSel(-1, 0); } return FALSE; } ///////////////////////////////////////////////////////////////////////////// // CCountryComboBox CCountryComboBox::CCountryComboBox() { } CCountryComboBox::~CCountryComboBox() { } #define IDC_COMBOEDIT 1001 BOOL CCountryComboBox::SubclassDlgItem(UINT nID, CWnd * pParent) { return CComboBox::SubclassDlgItem(nID, pParent) && m_edit.SubclassDlgItem(IDC_COMBOEDIT, this); } BOOL CCountryComboBox::Init() { BOOL rc = FALSE; CString strData, strCode, strName, str; for (int i = IDS_COUNTRIES_FIRST;; i++) { if (!strData.LoadString(i)) { break; } if (strData.IsEmpty()) { rc = TRUE; break; } strCode = strData.Left(2); strName = strData.Right(strData.GetLength() - 2); str = strCode; str += _T(" ("); str += strName; str += _T(")"); if (CB_ERR == AddString(str)) break; m_map_name_code.SetAt(strName, strCode); } return rc; } #define MAX_COUNTRY_NAME 64 #define MAX_COUNTRY_CODE 10 void CCountryComboBox::SetSelectedCountry(CString& country_code) { int index; TCHAR szCountryName[MAX_COUNTRY_NAME+1]; TCHAR sz3CharCountryCode[MAX_COUNTRY_CODE+1]; int iRet = GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SISO3166CTRYNAME, sz3CharCountryCode, MAX_COUNTRY_CODE); iRet = GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SCOUNTRY, szCountryName, MAX_COUNTRY_NAME); if (country_code.IsEmpty()) { // Try to look it up from the country name // i know this is kind of weird since we can look it up from // the countrycode, but this code has been like this for a while // and i don't want to break anything m_map_name_code.Lookup(szCountryName, country_code); } if (!country_code.IsEmpty() && CB_ERR != (index = FindString(-1, country_code) )) { SetCurSel(index); } else { int len = 0; POSITION pos = NULL; CString name, code; //IISDebugOutput((_T("No Match for:%s\n"),szCountryName)); // we didn't find a match // try looping thru the m_map_name_code // to find a matching country code index = -1; len = _tcslen(sz3CharCountryCode); pos = m_map_name_code.GetStartPosition(); while (pos != NULL) { m_map_name_code.GetNextAssoc(pos, name, code); if (0 == _tcsnicmp(code, sz3CharCountryCode, len)) { index = FindString(-1, code); break; } } if (index == -1) { // if we still didn't find it // then search thru the list and look for a similiar // looking country name index = -1; len = _tcslen(szCountryName); pos = m_map_name_code.GetStartPosition(); while (pos != NULL) { m_map_name_code.GetNextAssoc(pos, name, code); if (0 == _tcsnicmp(name, szCountryName, len)) { index = FindString(-1, code); break; } } } if (index != -1) { SetCurSel(index); } else { SetCurSel(0); } } } void CCountryComboBox::GetSelectedCountry(CString& country_code) { CString str; GetLBText(GetCurSel(), str); country_code = str.Left(2); } BEGIN_MESSAGE_MAP(CCountryComboBox, CComboBox) //{{AFX_MSG_MAP(CCountryComboBox) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCountryComboBox message handlers