/////////////////////////////////////////////////////////////////////////////
//
//	$Revision: 1 $
//
//	Name		:	ItemEdit.cpp
//
//	Purpose		:	Custom Edit control
//	
//	Written		:	cchow	09/2005
//
//	Description	:	Implementation of CItemEdit
//
//	Copyright (c) 2005 Sierra Wireless Inc. All rights reserved
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ItemEdit.h"
#include ".\itemedit.h"

IMPLEMENT_DYNAMIC(CItemEdit, CEdit)

/////////////////////////////////////////////////////////////////////////////
//
//   Function   :	CItemEdit
//
//   Description:	Constructor
//
//   Arguments  :	[in]szText		- edit text
//					[in]nItem		- Reportview item being edited
//					[in]nSubItem	- subitem being edited
//
//   Returns:   :	none
//
//   Comments   :	none
//
/////////////////////////////////////////////////////////////////////////////
CItemEdit::CItemEdit(LPCTSTR szText, int nItem, int nSubItem)
{
	UNREFERENCED_PARAMETER(szText);

	m_bCancel		= false;
	m_nItem			= nItem;
	m_nSubItem		= nSubItem;
	m_bModified		= false;
}

/////////////////////////////////////////////////////////////////////////////
//
//   Function   :	~CItemEdit
//
//   Description:	Destructor
//
//   Arguments  :	none
//
//   Returns:   :	none
//
//   Comments   :	none
//
/////////////////////////////////////////////////////////////////////////////
CItemEdit::~CItemEdit()
{
}


BEGIN_MESSAGE_MAP(CItemEdit, CEdit)
	ON_WM_CHAR()
	ON_WM_CREATE()
#if defined(UNDER_CE) && (_WIN32_WCE < 420)
	ON_MESSAGE(WM_DESTROY, OnNcDestroy)
#else // UNDER_CE
	ON_WM_NCDESTROY()
#endif // UNDER_CE
	ON_WM_KILLFOCUS()
//	ON_CONTROL_REFLECT(EN_CHANGE, OnEnChange)
//	ON_CONTROL_REFLECT(EN_UPDATE, OnEnUpdate)
ON_CONTROL_REFLECT(EN_CHANGE, OnEnChange)
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
//
//   Function   :	OnKillFocus
//
//   Description:	Indicates window is about to lose input focus
//
//   Arguments  :	See MSDN
//
//   Returns:   :	none
//
//   Comments   :	none
//
/////////////////////////////////////////////////////////////////////////////
void CItemEdit::OnKillFocus(CWnd* pNewWnd)
{
	BOOL bError = FALSE;

	if (!m_bCancel && m_bModified)
	{
		CString		strText;	
		LV_DISPINFO lvDispinfo;

		GetWindowText(strText);

		lvDispinfo.hdr.hwndFrom		= GetParent()->m_hWnd;
		lvDispinfo.hdr.idFrom		= GetDlgCtrlID();
		lvDispinfo.hdr.code			= LVN_ENDLABELEDIT;
		lvDispinfo.item.mask		= LVIF_TEXT | LVIF_PARAM;	
		lvDispinfo.item.iItem		= m_nItem;
		lvDispinfo.item.iSubItem	= m_nSubItem;
		lvDispinfo.item.pszText		= m_bCancel ? NULL : LPTSTR((LPCTSTR)strText);
		lvDispinfo.item.cchTextMax	= strText.GetLength();
		lvDispinfo.item.lParam		= NULL;

		// Send Notification to parent of ListView ctrl	
		bError = (BOOL)GetParent()->GetParent()->SendMessage(	WM_NOTIFY,
																GetParent()->GetDlgCtrlID(),
																(LPARAM)&lvDispinfo);
	}

	if (bError)
	{
		SetFocus();
	}
	else
	{
		CEdit::OnKillFocus(pNewWnd);
		PostMessage(WM_CLOSE);
	}
}

/////////////////////////////////////////////////////////////////////////////
//
//   Function   :	OnChar
//
//   Description:	Passes keyboard events to focus window
//
//   Arguments  :	See MSDN
//
//   Returns:   :	none
//
//   Comments   :	none
//
/////////////////////////////////////////////////////////////////////////////
void CItemEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	switch (nChar)
	{
	case VK_ESCAPE:
		m_bCancel = true;
		GetParent()->SetFocus();		
		return;

	case VK_RETURN:		
		GetParent()->SetFocus();		
		return;	
	}

	CEdit::OnChar(nChar, nRepCnt, nFlags);
}

////////////////////////////////////////////////////////////////////////////////
//
//   Function   :	OnCreate
//
//   Description:	Indicates that a window is being created
//
//   Arguments  :	see MSDN
//
//   Returns:   :	none
//
//   Comments   :	none
//
////////////////////////////////////////////////////////////////////////////////
int CItemEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CEdit::OnCreate(lpCreateStruct) == -1)
		return -1;

	SetFont(GetParent()->GetFont());
	SetFocus();
	return 0;
}

/////////////////////////////////////////////////////////////////////////////
//
//   Function   :	OnNcDestroy
//
//   Description:	Indicates when nonclient area is being destroyed
//
//   Arguments  :	none
//
//   Returns:   :	none
//
//   Comments   :	none
//
/////////////////////////////////////////////////////////////////////////////
void CItemEdit::OnNcDestroy()
{
	CEdit::OnNcDestroy();

	// We destroy the instance of this
	delete this;
}

/////////////////////////////////////////////////////////////////////////////
//
//   Function   :	PreTranslateMessage
//
//   Description:	Called to filter messages before they are dispatched
//
//   Arguments  :	See MSDN
//
//   Returns:   :	none
//
//   Comments   :	none
//
/////////////////////////////////////////////////////////////////////////////
BOOL CItemEdit::PreTranslateMessage(MSG* pMsg)
{
	if( pMsg->message == WM_KEYDOWN )	
	{		
		if( pMsg->wParam == VK_RETURN || 
			pMsg->wParam == VK_DELETE ||
			pMsg->wParam == VK_ESCAPE ||
			GetKeyState( VK_CONTROL))
		{			
			::TranslateMessage(pMsg);
			::DispatchMessage(pMsg);
			return TRUE;
		}	
	}

	return CEdit::PreTranslateMessage(pMsg);
}

////////////////////////////////////////////////////////////////////////////////
//
//   Function   :	HitTest
//
//   Description:	Determine if coordinates intersect control
//
//   Arguments  :	[in]point	- coordates to test against
//
//   Returns:   :	true if intersects, false otherwise
//
//   Comments   :	none
//
////////////////////////////////////////////////////////////////////////////////
bool CItemEdit::HitTest(CPoint point)
{
	CRect rect;

	GetWindowRect(&rect);
	ScreenToClient(&rect);

	return TRUE == rect.PtInRect(point);
}

////////////////////////////////////////////////////////////////////////////////
//
//   Function   :	OnEnChange
//
//   Description:	Indicates the display is updated after text changes
//
//   Arguments  :	none
//
//   Returns:   :	none
//
//   Comments   :	none
//
////////////////////////////////////////////////////////////////////////////////
void CItemEdit::OnEnChange()
{
	// Text has been modified.  Flag it so that
	// the proper notification will be sent later
	m_bModified = true;
}

////////////////////////////////////////////////////////////////////////////////
//
//   Function   :	ResetModified
//
//   Description:	Resets the modified flag to false
//
//   Arguments  :	none
//
//   Returns:   :	none
//
//   Comments   :	Typically called after setting default value to prevent
//					the control from notifying the parent of a change
//
////////////////////////////////////////////////////////////////////////////////
void CItemEdit::ResetModified()
{
	m_bModified = false;
}