// ComboTreeCtrl.cpp : implementation file
//

#include "pch.h"
#include "ComboTreeCtrl.h"

#include "TreeComboBox.h"

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

/////////////////////////////////////////////////////////////////////////////
// CComboTreeCtrl

CComboTreeCtrl::CComboTreeCtrl() :m_pCombo(NULL)
{
}

CComboTreeCtrl::~CComboTreeCtrl()
{
}


BEGIN_MESSAGE_MAP(CComboTreeCtrl, CTreeCtrl)
	ON_NOTIFY_REFLECT(NM_KILLFOCUS, OnKillfocus)
	ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
	ON_NOTIFY_REFLECT(TVN_KEYDOWN, OnKeydown)
	ON_MESSAGE(TREECTRL_CHECK_STATE_CHANGE, OnTreeCtrlCheckStateChange)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CComboTreeCtrl message handlers

void CComboTreeCtrl::Display(IN CRect rc)
{
	if (GetSafeHwnd() == NULL)
		return;

	SetWindowPos(&wndNoTopMost, rc.left, rc.top, rc.right, rc.bottom, SWP_SHOWWINDOW);

	CWnd* pTopParent = GetParent()->GetParentOwner();
	if (pTopParent != NULL)
	{
		pTopParent->SendMessage(WM_NCACTIVATE, TRUE);
		pTopParent->SetRedraw(TRUE);
	}
}

BOOL CComboTreeCtrl::PreTranslateMessage(MSG* pMsg)
{
	if (pMsg->hwnd != m_hWnd)
		return FALSE;

	// ���˵�Alt+F4;
	if (WM_SYSKEYDOWN == pMsg->message && VK_F4 == pMsg->wParam)
		return TRUE;

	// �س�����esc���رտؼ�;
	if (pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE))
	{
		// WMU_CLOSE_CONTROL->�رտؼ�;
		::PostMessage(m_pCombo->m_hWnd, WMU_CLOSE_CONTROL, (WPARAM)0, (LPARAM)0);
		return TRUE;
	}

	return CTreeCtrl::PreTranslateMessage(pMsg);
}

void CComboTreeCtrl::OnKillfocus(NMHDR* pNMHDR, LRESULT* pResult)
{
	// WMU_CLOSE_CONTROL->�رտؼ�;
	::PostMessage(m_pCombo->m_hWnd, WMU_CLOSE_CONTROL, (WPARAM)0, (LPARAM)0);
}

LRESULT CComboTreeCtrl::OnTreeCtrlCheckStateChange(WPARAM wParam, LPARAM lParam)
{
	HTREEITEM hItemChanged = (HTREEITEM)lParam;
	BOOL bCheckState = GetCheck(hItemChanged);
	SelectItem(hItemChanged);

	while (hItemChanged = GetParentItem(hItemChanged))
		SetCheck(hItemChanged);

	return 1;
}

void CComboTreeCtrl::OnClick(NMHDR* pNMHDR, LRESULT* pResult)
{
	UINT nFlags;
	HTREEITEM hItem;
	// verify that we have a mouse click in the check box area 
	DWORD dwPos = GetMessagePos();
	CPoint point(LOWORD(dwPos), HIWORD(dwPos));
	ScreenToClient(&point);
	hItem = HitTest(point, &nFlags);
	if (hItem)
	{
		if (GetParentItem(hItem))
			::PostMessage(m_pCombo->m_hWnd, WMU_CLOSE_CONTROL, (WPARAM)0, (LPARAM)hItem);// WMU_CLOSE_CONTROL->�رտؼ�;
	}

	*pResult = 0;
}

void CComboTreeCtrl::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult)
{
	TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;
	if (pTVKeyDown->wVKey == VK_SPACE)
	{
		HTREEITEM hItem = GetSelectedItem();
		if (hItem != NULL)
		{
			// handle state change here or post message to another handler
			// Post message state has changed
			PostMessage(TREECTRL_CHECK_STATE_CHANGE, 0, (LPARAM)hItem);
		}
	}

	*pResult = 0;
}

/************************************************************************/
/*  ������FindItem[12/7/2016 IT];
/*  ��������ָ�����ʼ����ָ�����Ƶ���;
/*  ������;
/*  	[IN] strName��Ҫ���ҵ�������;
/*  	[IN] hRoot��Ҫ��ʼ���ҵĸ���;
/*  ���أ�void;
/*  ע�⣺;
/*  ʾ����;
/*
/*  �޸ģ�;
/*  ���ڣ�;
/*  ���ݣ�;
/************************************************************************/
HTREEITEM CComboTreeCtrl::FindItem(IN const CString& strName, IN HTREEITEM hRoot)
{
	// �жϸ����Ƿ����Ҫ���ҵ���;
	CString sText = GetItemText(hRoot);
	if (sText.Compare(strName) == 0)
		return hRoot;

	HTREEITEM hItem = NULL;
	// ��ȡ��һ��������;
	HTREEITEM hSub = GetChildItem(hRoot);
	// ������������;
	while (hSub)
	{
		// ��ǰ�����Ƿ���Ҫ���ҵ�����;
		if ((hItem = FindItem(strName, hSub)) != NULL)
			break;

		// ��δ����������һ���ֵ���;
		hSub = GetNextSiblingItem(hSub);
	}

	return hItem;
}