// ComboBoxListCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "ComboListCtrl2.h"
#include <windowsx.h>
#include "ylgl.h"
#include "ChooseReason.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define IDC_ComboBox  0X01
#define PROPERTY_ITEM 0x02
#define PROPERTY_SUB  0x03
/////////////////////////////////////////////////////////////////////////////
// CComboBoxListCtrl2
extern  CFont g_listctrlfont;
CComboBoxListCtrl2::CComboBoxListCtrl2()
{
	m_ComboBox.m_hWnd = NULL;	
	m_bNeedSel=0;
}

CComboBoxListCtrl2::~CComboBoxListCtrl2()
{

}


BEGIN_MESSAGE_MAP(CComboBoxListCtrl2, CListCtrl)
	//{{AFX_MSG_MAP(CComboBoxListCtrl2)
	ON_WM_LBUTTONDBLCLK()
	ON_WM_PARENTNOTIFY()
	ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomdrawList)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_USER_ComboBox_END,OnComboBoxEnd)
	ON_MESSAGE(WM_USER_EDIT_END,OnEditEnd)
END_MESSAGE_MAP()
#undef SubclassWindow  
void CComboBoxListCtrl2::PreSubclassWindow()
{
	// the list control must have the report style.
	ASSERT( GetStyle() & LVS_REPORT );

	CListCtrl::PreSubclassWindow();
	VERIFY( m_ctlHeader.SubclassWindow( GetHeaderCtrl()->GetSafeHwnd() ) );
}
void CComboBoxListCtrl2::OnCustomdrawList ( NMHDR* pNMHDR, LRESULT* pResult )
{
	NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
	// Take the default processing unless we set this to something else below.
	*pResult = 0;

	// First thing - check the draw stage. If it's the control's prepaint
	// stage, then tell Windows we want messages for every item.
	if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
	{
		*pResult = CDRF_NOTIFYITEMDRAW;
	}
	else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
	{
		// This is the prepaint stage for an item. Here's where we set the
		// item's text color. Our return value will tell Windows to draw the
		// item itself, but it will use the new color we set here.
		// We'll cycle the colors through red, green, and light blue.
		COLORREF crText;
		int pos=pLVCD->nmcd.dwItemSpec;
		if(pos%2)
		{
			pLVCD->clrTextBk = g_gridcol1;
		}
		else
		{
			pLVCD->clrTextBk = g_gridcol2;
		}
		// Tell Windows to paint the control itself.
		*pResult = CDRF_DODEFAULT;
	}
}

void CComboBoxListCtrl2::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	CRect rcCtrl;
	LVHITTESTINFO lvhti;
	lvhti.pt = point;
	int nItem = CListCtrl::SubItemHitTest(&lvhti);
	if(nItem == -1)
		return;
	int nSubItem = lvhti.iSubItem;
	CListCtrl::GetSubItemRect(nItem,nSubItem,LVIR_LABEL,rcCtrl); 
#if 0	// Jeff.delete;
	if(nSubItem==3 || nSubItem==5)
#else	// Jeff.add ;
	if(nSubItem==3 || nSubItem==5 || nSubItem == 7)
#endif
	{
		rcCtrl.top -=4;
		rcCtrl.bottom +=200;
		ShowComboBox(TRUE,nItem,nSubItem,rcCtrl);
	}
	else if(nSubItem==0 ||nSubItem==1 || nSubItem==2)
	{
		ShowEdit(TRUE,nItem,nSubItem,rcCtrl);
	}
	CListCtrl::OnLButtonDblClk(nFlags, point);
}

void CComboBoxListCtrl2::ShowComboBox(BOOL bShow,int nItem,int nIndex,CRect rcCtrl)
{
	if(m_ComboBox.m_hWnd == NULL)
	{
		m_ComboBox.Create(WS_VSCROLL|WS_CHILD|CBS_DROPDOWNLIST,CRect(0,0,0,0),this,IDC_ComboBox);
		m_ComboBox.ShowWindow(SW_HIDE);
	}
	if(bShow == TRUE)
	{

		CString strItem = CListCtrl::GetItemText(nItem,nIndex);
		m_ComboBox.MoveWindow(rcCtrl);
		m_ComboBox.ShowWindow(SW_SHOW);
		::SetFocus(m_ComboBox.GetSafeHwnd());
		m_ComboBox.ResetContent ();
		if(nIndex==3)
		{
			m_ComboBox.AddString ("");
			for(int i=0; i<g_List1array.GetSize (); i++)
				m_ComboBox.AddString ("�ѷ�"+g_List1array.ElementAt (i).ElementAt (1));
		}
#if 0
		else if(nIndex==5)
		{
			m_ComboBox.AddString ("OK");
			m_ComboBox.AddString ("");
		}
#else	// Jeff.���ӷ�������������;
		else if ( nIndex == 5 )
		{
			m_ComboBox.AddString("����");
			m_ComboBox.AddString("");
			m_ComboBox.AddString(strItem);
			m_bNeedSel=1;
		}
		else if ( nIndex == 7)
		{
			m_ComboBox.AddString("OK");
			m_ComboBox.AddString("");
		}
#endif
		m_ComboBox.SetCurSel (m_ComboBox.FindString (0, strItem));
		m_ComboBox.SetCtrlData(MAKEWPARAM(nIndex,nItem));	
	}
	else
		m_ComboBox.ShowWindow(SW_HIDE);
}
void CComboBoxListCtrl2::ShowEdit(BOOL bShow,int nItem,int nIndex,CRect rcCtrl)
{
	if(m_edit.m_hWnd == NULL)
	{
		m_edit.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,101);
		m_edit.ShowWindow(SW_HIDE);
		CFont tpFont;
		tpFont.CreateStockObject(DEFAULT_GUI_FONT);
		m_edit.SetFont(&tpFont);
		tpFont.DeleteObject();

	}
	if(bShow == TRUE)
	{
		CString strItem = CListCtrl::GetItemText(nItem,nIndex);
		m_edit.MoveWindow(rcCtrl);
		m_edit.ShowWindow(SW_SHOW);
		m_edit.SetWindowText(strItem);
		::SetFocus(m_edit.GetSafeHwnd());
		m_edit.SetSel(-1);  
		m_edit.SetCtrlData(MAKEWPARAM(nIndex,nItem));	
	}
	else
		m_edit.ShowWindow(SW_HIDE);
}

void CComboBoxListCtrl2::OnEditEnd(WPARAM wParam,LPARAM lParam)
{
	if(wParam == TRUE)
	{
		CString strText(_T(""));
		m_edit.GetWindowText(strText);
		DWORD dwData = m_edit.GetCtrlData();
		int nItem= dwData>>16;
		int nIndex = dwData&0x0000ffff;
		CListCtrl::SetItemText(nItem,nIndex,strText);
	}
	else
	{

	}

	if(lParam == FALSE)
		m_edit.ShowWindow(SW_HIDE);
}

void CComboBoxListCtrl2::OnComboBoxEnd(WPARAM wParam,LPARAM lParam)
{
	if(wParam == TRUE)
	{
		CString strText(_T(""));
		int pos=m_ComboBox.GetCurSel ();
		if(pos!=-1)
		{
			m_ComboBox.GetLBText (pos, strText);
			DWORD dwData = m_ComboBox.GetCtrlData();
			int nItem= dwData>>16;
			int nIndex = dwData&0x0000ffff;
			CListCtrl::SetItemText(nItem,nIndex,strText);
			if(nIndex==3 && strText.IsEmpty ())
			{
				SetItemText(nItem,4,"");
				SetItemText(nItem,5,"");
				SetItemText(nItem,6,"");
				SetItemText(nItem,7,"");	// Jeff.add;
				SetItemText(nItem,8,"");	// Jeff.add;
			}
			else if(nIndex==3)
			{
				SetItemText(nItem,4,g_date);
			}
			else if(nIndex==5 && strText.IsEmpty ())
			{
				SetItemText(nItem,6,"");
			}
#if 0
			else if(nIndex==5)
			{
				SetItemText(nItem,6,g_date);
			}
#else
			else if ( nIndex == 5 )
			{
				if(strText.Find("����")!=-1 && m_bNeedSel)
				{
					m_bNeedSel=0;
					CChooseReason dlg;
					if(dlg.DoModal() == IDOK)
					{
						SetItemText( nItem, 5,"����/("+dlg.sRet+")");
						m_ComboBox.SetCurSel(-1);
					}
					SetItemText(nItem,6,g_date);
				}
				else if( strText == "")	// Jeff.add.��ѡ��ؿ�,���������;
				{
					SetItemText(nItem,6,"");
				}
			}
			else if ( nIndex = 7 )
			{
				if ( strText == "OK")
					SetItemText(nItem,8,g_date);
				else
					SetItemText(nItem,8,"");
			}
#endif
		}
	}
	else
	{

	}

	if(lParam == FALSE)
		m_ComboBox.ShowWindow(SW_HIDE);
}

void CComboBoxListCtrl2::OnParentNotify(UINT message, LPARAM lParam) 
{
	CListCtrl::OnParentNotify(message, lParam);
	//////////////////////////////////////////////////////////////////////////
	CHeaderCtrl* pHeaderCtrl = CListCtrl::GetHeaderCtrl();
	if(pHeaderCtrl == NULL)
		return;
	CRect rcHeader;
	pHeaderCtrl->GetWindowRect(rcHeader);
	ScreenToClient(rcHeader);
	//The x coordinate is in the low-order word and the y coordinate is in the high-order word.
	CPoint pt;
	pt.x = GET_X_LPARAM(lParam);
	pt.y = GET_Y_LPARAM(lParam);
	if(rcHeader.PtInRect(pt) && message == WM_LBUTTONDOWN)
	{
		if(m_ComboBox.m_hWnd != NULL)
		{
			DWORD dwStyle = m_ComboBox.GetStyle();
			if((dwStyle&WS_VISIBLE) == WS_VISIBLE)
			{
				m_ComboBox.ShowWindow(SW_HIDE);
			}
		}	
	}	
}
BOOL CComboBoxListCtrl2::PreTranslateMessage(MSG* pMsg) 
{
	if(0)//pMsg->message == WM_KEYDOWN)
	{
		if(pMsg->wParam == VK_TAB && m_ComboBox.m_hWnd!= NULL)
		{
			DWORD dwStyle = m_ComboBox.GetStyle();
			if((dwStyle&WS_VISIBLE) == WS_VISIBLE)
			{
				OnComboBoxEnd(TRUE,TRUE);
				CRect rcCtrl;		 
				int nItem;
				int nSub;
				if(FALSE == Key_Ctrl(nItem,nSub))
					Key_Shift(nItem,nSub);
				CListCtrl::GetSubItemRect(nItem,nSub,LVIR_LABEL,rcCtrl); 
				CPoint pt(rcCtrl.left+1,rcCtrl.top+1);
				OnLButtonDblClk(0,pt);
				POSITION pos = CListCtrl::GetFirstSelectedItemPosition();
				if (pos == NULL)
				{
				}
				else
				{
					while (pos)
					{
						int ntpItem = CListCtrl::GetNextSelectedItem(pos);
						CListCtrl::SetItemState(ntpItem,0,LVIS_SELECTED);
					}
				}
				CListCtrl::SetItemState(nItem,  LVIS_SELECTED,  LVIS_SELECTED);
				return TRUE;
			}
		}
	}

	return CListCtrl::PreTranslateMessage(pMsg);
}
BOOL CComboBoxListCtrl2::Key_Shift(int& nItem,int& nSub)
{
	int nItemCount = CListCtrl::GetItemCount();
	DWORD dwData = m_ComboBox.GetCtrlData();
	nItem= dwData>>16;
	nSub = dwData&0x0000ffff;

	CHeaderCtrl* pHeader = CListCtrl::GetHeaderCtrl();
	if(pHeader == NULL)
		return FALSE;

	short sRet = GetKeyState(VK_SHIFT);
	int nSubcCount = pHeader->GetItemCount();
	sRet = sRet >>15;
	if(sRet == 0)
	{
		nSub += 1;
		if(nSub >= nSubcCount)
		{
			if(nItem == nItemCount-1)
			{
				nItem = 0;
				nSub  = 0;
			}
			else
			{
				nSub = 0;
				nItem += 1;
			}
		}
		if(nItem >= nItemCount)
			nItem = nItemCount-1;
		return FALSE;
	}
	else
	{
		nSub -= 1;
		if(nSub < 0)
		{

			nSub = nSubcCount -1;
			nItem --;
		}

		if(nItem < 0)
			nItem = nItemCount-1;
		return TRUE;

	}
	return FALSE;
}
BOOL CComboBoxListCtrl2::Key_Ctrl(int& nItem,int &nSub)
{
	short sRet = GetKeyState(VK_CONTROL);
	DWORD dwData = m_ComboBox.GetCtrlData();
	nItem= dwData>>16;
	nSub = dwData&0x0000ffff;

	sRet = sRet >>15;
	int nItemCount = CListCtrl::GetItemCount();
	if(sRet == 0)
	{

	}
	else
	{
		nItem = nItem >=nItemCount-1? 0:nItem+=1;
		return TRUE;
	}

	return FALSE;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////

CListCtrlComboBox2::CListCtrlComboBox2()
{
}

CListCtrlComboBox2::~CListCtrlComboBox2()
{
}


BEGIN_MESSAGE_MAP(CListCtrlComboBox2, CComboBox)
	//{{AFX_MSG_MAP(CListCtrlComboBox2)
	ON_WM_KILLFOCUS()
	ON_WM_SETFOCUS()	
	ON_CONTROL_REFLECT(CBN_CLOSEUP, OnCloseup)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CListCtrlComboBox2 message handlers
void CListCtrlComboBox2::SetCtrlData(DWORD dwData)
{
	m_dwData = dwData;
}

DWORD CListCtrlComboBox2::GetCtrlData()
{
	return m_dwData;
}

void CListCtrlComboBox2::OnKillFocus(CWnd* pNewWnd) 
{
	CComboBox::OnKillFocus(pNewWnd);
	CWnd* pParent = this->GetParent();
	::PostMessage(pParent->GetSafeHwnd(),WM_USER_ComboBox_END,m_bExchange,0);
}
BOOL CListCtrlComboBox2::PreTranslateMessage(MSG* pMsg) 
{

	if(pMsg->message == WM_KEYDOWN)
	{
		if(pMsg->wParam == VK_RETURN)
		{
			CWnd* pParent = this->GetParent();
			m_bExchange = TRUE;
			::PostMessage(pParent->GetSafeHwnd(),WM_USER_ComboBox_END,m_bExchange,0);
		}
		else if(pMsg->wParam == VK_ESCAPE)
		{
			CWnd* pParent = this->GetParent();
			m_bExchange = FALSE;
			::PostMessage(pParent->GetSafeHwnd(),WM_USER_ComboBox_END,m_bExchange,0);
		}
	}

	return CComboBox::PreTranslateMessage(pMsg);
}

void CListCtrlComboBox2::OnSetFocus(CWnd* pOldWnd) 
{
	CComboBox::OnSetFocus(pOldWnd);
	m_bExchange = TRUE;	
}

void CComboBoxListCtrl2::InitStyle()
{
	SetFont (&g_listctrlfont);
	SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP);
}

void CListCtrlComboBox2::OnCloseup() 
{
	// TODO: Add your control notification handler code here
	CWnd* pParent = this->GetParent();
	::PostMessage(pParent->GetSafeHwnd(),WM_USER_ComboBox_END,m_bExchange,0);	
}