// ComboBoxEx.cpp : implementation file
//

#include "stdafx.h"
#include "ComboBoxEx.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CComboBoxEx

CComboBoxEx::CComboBoxEx()
{
        m_bEditChanged=FALSE;
        m_bDoComplete = FALSE;
        m_bAutoComplete = FALSE;
}

CComboBoxEx::~CComboBoxEx()
{
}


BEGIN_MESSAGE_MAP(CComboBoxEx, CComboBox)
        //{{AFX_MSG_MAP(CComboBoxEx)
        ON_CONTROL_REFLECT_EX(CBN_EDITCHANGE, OnEditchange)
        ON_CONTROL_REFLECT_EX(CBN_SELCHANGE, OnSelchange)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CComboBoxEx message handlers

void CComboBoxEx::LoadState(LPCSTR szRegSubKey, UINT nMaxItems)
{
        CString s,s2;
        UINT cnt = AfxGetApp()->GetProfileInt(szRegSubKey, "Count", 0);
        for (UINT i=0; i < cnt && i < nMaxItems; i++)
        {
                s2.Format("Item_%d", i);
                s = AfxGetApp()->GetProfileString(szRegSubKey, s2);
                if (i==0)
                        SetWindowText(s);
                if (FindStringExact(-1, s) == -1
                        && !s.IsEmpty())
                        AddString(s);
        }
}

void CComboBoxEx::SaveState(LPCSTR szRegSubKey, UINT nMaxItems)
{
        CString strItem,s,s2;
        int i,idx,cnt = GetCount();

        GetWindowText(strItem);
        if (!strItem.IsEmpty())
        {
                AfxGetApp()->WriteProfileString(szRegSubKey, "Item_0", strItem);
                idx=1;
        }
        else
                idx=0;
        for (i=0; i < cnt && idx < (int)nMaxItems; i++)
        {
                GetLBText(i, s);
                if (s != strItem
                        && !s.IsEmpty())
                {
                        s2.Format("Item_%d", idx);
                        AfxGetApp()->WriteProfileString(szRegSubKey, s2, s);
                        idx++;
                }
        }
        AfxGetApp()->WriteProfileInt(szRegSubKey, "Count", idx);
}


BOOL CComboBoxEx::OnEditchange() 
{
        m_bEditChanged=TRUE;
        
        int length = GetWindowTextLength();

        // bail if not auto completing or no text
        if (!m_bDoComplete
                || length <= 0) 
                return FALSE;
        
        // Get the text in the edit box
        CString s;
        GetWindowText(s);
        
        // get the current selection
        DWORD sel = GetEditSel();
        WORD start=LOWORD(sel), end=HIWORD(sel);
        
        // look for the string that is prefixed by the typed text
        int idx = FindString(-1, s);
        if (idx != CB_ERR)
        {
                // set the new string
                CString strNew;
                GetLBText(idx, strNew);
                SetWindowText(strNew);         
                
                // get the caret back in the right spot
                if (sel != CB_ERR)
                        SetEditSel(start, end);  
        }
        
        // select the text after our typing
        if (sel == CB_ERR
                || end >= length)
                SetEditSel(length, -1);
        // restore the selection
        else
                SetEditSel(start, end);

        return FALSE;
}

BOOL CComboBoxEx::OnSelchange() 
{
        m_bEditChanged=FALSE;
        return FALSE;
}

BOOL CComboBoxEx::PreTranslateMessage(MSG* pMsg)
{
        if (m_bAutoComplete
                        && pMsg->message == WM_KEYDOWN)
        {
                m_bDoComplete = TRUE;

                int nVirtKey = (int) pMsg->wParam;
                if (nVirtKey == VK_DELETE || nVirtKey == VK_BACK)
                        m_bDoComplete = FALSE;
        }

        return CComboBox::PreTranslateMessage(pMsg);
}