You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
300 lines
6.5 KiB
300 lines
6.5 KiB
// 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
|
|
|