// XEdit.cpp : implementation file
//

#include "stdafx.h"
#include "XEdit.h"

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

UINT WM_XEDIT_KILL_FOCUS = ::RegisterWindowMessage(_T("WM_XEDIT_KILL_FOCUS"));
UINT WM_XEDIT_VK_ESCAPE  = ::RegisterWindowMessage(_T("WM_XEDIT_VK_ESCAPE"));

///////////////////////////////////////////////////////////////////////////////
// message map

BEGIN_MESSAGE_MAP(CXEdit, CEdit)
	//{{AFX_MSG_MAP(CXEdit)
	ON_WM_CHAR()
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_WM_KILLFOCUS()
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

///////////////////////////////////////////////////////////////////////////////
// ctor
CXEdit::CXEdit(CWnd *pParent, LPCTSTR lpszText,int bNum) :
	m_pParent(pParent),
	m_strText(lpszText),
	m_bMessageSent(FALSE),
	m_bNum(bNum)
{
}

///////////////////////////////////////////////////////////////////////////////
// dtor
CXEdit::~CXEdit()
{
}

///////////////////////////////////////////////////////////////////////////////
// SendRegisteredMessage
void CXEdit::SendRegisteredMessage(UINT nMsg, WPARAM wParam /*= 0*/, LPARAM lParam /*= 0*/)
{
	BOOL bMessageSent = m_bMessageSent;
	m_bMessageSent = TRUE;
	if (m_pParent && ::IsWindow(m_pParent->m_hWnd) && !bMessageSent)
		m_pParent->SendMessage(nMsg, wParam, lParam);
}

///////////////////////////////////////////////////////////////////////////////
// OnCreate
int CXEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
{

	if (CEdit::OnCreate(lpCreateStruct) == -1)
		return -1;

	// set the proper font
	if (!m_pParent)
	{
		m_pParent = GetParent();
	}

	if (m_pParent && ::IsWindow(m_pParent->m_hWnd))
	{
		CFont * pFont = m_pParent->GetFont();
		if (pFont)
			SetFont(pFont);
	}
	else
	{
		m_pParent = NULL;
	}

	SetWindowText(m_strText);
	SetSel(0, -1);
	SetFocus();
	SetCapture();

	return 0;
}

///////////////////////////////////////////////////////////////////////////////
// OnPaint
void CXEdit::OnPaint() 
{
	CRect rect;
	GetClientRect(&rect);
	rect.right += 2;

	CDC * pDC = GetDC();
	pDC->FillSolidRect(&rect, ::GetSysColor(COLOR_WINDOW));
	ReleaseDC(pDC);

	CEdit::OnPaint();		// let CEdit draw the text

	//rect.right -= 2;
	rect.left -= 1;
	rect.top -= 1;
	rect.bottom -=1;

	pDC = GetDC();

	// don't erase the text that CEdit has just drawn
	CBrush * pOldBrush = (CBrush *) pDC->SelectStockObject(NULL_BRUSH);
	//CPen pen(PS_SOLID, 1, ::GetSysColor(COLOR_BTNSHADOW));
	CPen pen(PS_SOLID, 1, ::GetSysColor(COLOR_INACTIVECAPTION));	// same as combobox
	CPen *pOldPen = pDC->SelectObject(&pen);
	pDC->Rectangle(&rect);
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
	ReleaseDC(pDC);
}

///////////////////////////////////////////////////////////////////////////////
// PreTranslateMessage
BOOL CXEdit::PreTranslateMessage(MSG* pMsg)
{
	// handle WM_KEYDOWN in case the edit has focus - otherwise
	// it will be sent to parent, bypassing WM_CHAR
	if (pMsg->message == WM_KEYDOWN)
	{
		if (pMsg->wParam == VK_RETURN)
		{
			SendRegisteredMessage(WM_XEDIT_KILL_FOCUS);
			return TRUE;
		}
		else if (pMsg->wParam == VK_ESCAPE)
		{
			SendRegisteredMessage(WM_XEDIT_VK_ESCAPE);
			return TRUE;
		}
	}

	return CEdit::PreTranslateMessage(pMsg);
}

///////////////////////////////////////////////////////////////////////////////
// OnChar
void CXEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// handle escape and return, in case edit does NOT have focus

	if (m_pParent)
	{
		if (nChar == VK_ESCAPE)
		{
			SendRegisteredMessage(WM_XEDIT_VK_ESCAPE);
			return;
		}
		else if (nChar == VK_RETURN)
		{
			SendRegisteredMessage(WM_XEDIT_KILL_FOCUS);
			return;
		}
	}
	if(m_bNum)
	{
		if( nChar != VK_BACK && (nChar < 0X30 || nChar > 0X39)) 
		{
			return;
		}
	}
	CEdit::OnChar(nChar, nRepCnt, nFlags);
}

///////////////////////////////////////////////////////////////////////////////
// OnKillFocus
void CXEdit::OnKillFocus(CWnd* pNewWnd)
{
	CEdit::OnKillFocus(pNewWnd);

	SendRegisteredMessage(WM_XEDIT_KILL_FOCUS);
}

///////////////////////////////////////////////////////////////////////////////
// OnDestroy
void CXEdit::OnDestroy() 
{
	ReleaseCapture();
	CEdit::OnDestroy();
}
