#include "stdafx.h"
#include "SSwitch2.h"

namespace SOUI
{

	SSwitch2::SSwitch2() : m_BOpen(TRUE), m_BChangeing(FALSE), m_FrameNow(0), m_pSkin(NULL), m_pSkinOff(NULL), m_pSkinOn(NULL)
	{
		m_style.m_strCursor = _T("hand");
		m_evtSet.addEvent(EVENTID(EventSwitchChanging));
	}

	SSwitch2::~SSwitch2()
	{

	}

	void SSwitch2::GetTextRect(LPRECT pRect)
	{
		GetClientRect(pRect);
		SASSERT(m_pSkin);
		CSize szSwitch = m_pSkin->GetSkinSize();
		pRect->left += szSwitch.cx + SwitchSpacing;
	}

	CRect SSwitch2::GetSwitchRect()
	{
		CRect rcClient;
		GetClientRect(rcClient);
		SASSERT(m_pSkin);
		CSize szCheck = m_pSkin->GetSkinSize();
		CRect rcCheckBox(rcClient.TopLeft(), szCheck);
		rcCheckBox.OffsetRect(0, (rcClient.Height() - szCheck.cy) / 2);
		return rcCheckBox;
	}

	void SSwitch2::OnPaint(IRenderTarget *pRT)
	{
		//背景、前景皮肤中间状态数必须一致。自己保证，不再代码检查
		CRect rcSwitch =GetSwitchRect();
		if (IsDisabled(TRUE))
		{
			if (m_disableSkin == NULL)
			{
				if(m_disableSkin=m_pSkin->Scale(GetScale()))
					m_disableSkin->OnColorize(0XFF888888);
			}
			if (m_disableSkin)
				m_disableSkin->Draw(pRT, rcSwitch, m_BOpen ? m_FrameNow : m_pSkin->GetStates() - m_FrameNow - 1);
		}
		else
		{
			if (m_pSkin)
				m_pSkin->Draw(pRT, rcSwitch, m_BOpen ? m_FrameNow : m_pSkin->GetStates() - m_FrameNow - 1);
		}
		if (!m_pSkinOn || !m_pSkinOff)
			return;
		(m_BOpen ?m_pSkinOn:m_pSkinOff)->Draw(pRT, rcSwitch, m_FrameNow);
		__super::OnPaint(pRT);
	}
	
	CSize SSwitch2::GetDesiredSize(int wid, int hei)
	{
		CSize szSkinRet;
		if (m_pSkin)
			szSkinRet = m_pSkin->GetSkinSize();
		CSize szRet = __super::GetDesiredSize(wid,hei);
		szRet.cx += szSkinRet.cx + SwitchSpacing;
		szRet.cy = (std::max)(szRet.cy, szSkinRet.cy);
		return szRet;
	}

	HRESULT SSwitch2::OnAttrOpen(const SStringW& strValue, BOOL bLoading)
	{
		m_BOpen = (strValue != L"0");
		m_FrameNow =  0;
		if (!bLoading)
			SetOpen(m_BOpen);
		
		return bLoading ? S_FALSE : S_OK;
	}

	void SSwitch2::OnLButtonUp(UINT nFlags, CPoint point)
	{
		__super::OnLButtonUp(nFlags, point);
		if (!GetWindowRect().PtInRect(point)) return;
		SetOpen(!m_BOpen);
	}

	void SSwitch2::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
	{
		if (nChar == VK_SPACE)
		{
			SetOpen(!m_BOpen);
		}
	}
	
	//属性处理

	BOOL SSwitch2::IsOpen() { return m_BOpen; }

	void SSwitch2::SetOpen(BOOL bOpen)
	{
		if ((m_BOpen != bOpen) && !m_BChangeing)
		{
			EventSwitchChanging evt(this);
			evt.bTurnOn = bOpen;
			FireEvent(evt);

			if (evt.bCacnel)
				return;
			m_BOpen = bOpen;
			m_BChangeing = TRUE;
			m_FrameNow = m_pSkinOn->GetStates()-1;
			GetContainer()->RegisterTimelineHandler(this);			
		}
	}

	void SSwitch2::OnStateChanged(DWORD dwOldState, DWORD dwNewState)
	{
		InvalidateRect(NULL);
		__super::OnStateChanged(dwOldState, dwNewState);
	}

	void SSwitch2::OnNextFrame()
	{
		if (m_BChangeing&&m_pSkinOn)
		{
			m_FrameNow--;
			if (m_FrameNow <=0)
			{
				m_FrameNow = 0;
				m_BChangeing = FALSE;
				GetContainer()->UnregisterTimelineHandler(this);
			}
		}
		else
			GetContainer()->UnregisterTimelineHandler(this);
		InvalidateRect(NULL);
	}
}