/*
基本 是 按 mfc  的 datetime 实现的 只实现了 天数 选择  月 和 年 没做
月 和 年 一般也用的少。 选择也可以。
*/

#pragma once
#include <core/swnd.h>

SNSBEGIN

//
// 日期 选择控件
//
class SOUI_EXP SDateTimePicker
    : public TWindowProxy<IDateTimePicker>
    , public ISDropDownOwner {
    DEF_SOBJECT(SWindow, L"dateTimePicker")

  public:
    enum EnDateType
    {
        eDT_NULL = 0,
        eDT_Year,
        eDT_Month,
        eDT_Day,
        eDT_Hour,
        eDT_Minute,
        eDT_Second,
    };
    SDateTimePicker();
    ~SDateTimePicker();

  public:
    STDMETHOD_(void, SetTime)
    (THIS_ WORD wYear, WORD wMonth, WORD wDay, WORD wHour, WORD wMinute, WORD wSecond) OVERRIDE;
    STDMETHOD_(void, GetTime)
    (THIS_ WORD *wYear, WORD *wMonth, WORD *wDay, WORD *wHour, WORD *wMinute, WORD *wSecond) SCONST OVERRIDE;
    STDMETHOD_(void, CloseUp)(THIS) OVERRIDE;
    STDMETHOD_(void, DropDown)(THIS) OVERRIDE;
    STDMETHOD_(void, Clear)(THIS) OVERRIDE;

  public:
    SStringT GetWindowText(BOOL bRawText = FALSE);
    void SetTime(const SYSTEMTIME &sysTime);
    void GetTime(SYSTEMTIME &sysTime);

  protected: // 继承
    virtual SWindow *GetDropDownOwner();
    virtual void OnCreateDropDown(SDropDownWnd *pDropDown);
    virtual void OnDestroyDropDown(SDropDownWnd *pDropDown);

  protected:
    EnDateType HitTest(CPoint pt);

    virtual BOOL CreateChildren(SXmlNode xmlNode);
    BOOL OnDateChanged(EventCalendarExChanged *pEvt);
    BOOL OnDateCmd(EventCmd *pEvt);
    void GetDropBtnRect(LPRECT pBtnRc, LPRECT pSkinRc = NULL);
    SStringT ToFormatText(EnDateType eType, WORD wNum);
    bool CalcPopupRect(int nHeight, CRect &rcPopup);
    void Draw(EnDateType eType, IRenderTarget *pRT, WORD wNum, CRect &rcText);

  protected:
    void OnPaint(IRenderTarget *pRT);
    void OnLButtonDown(UINT nFlags, CPoint pt);
    void OnMouseMove(UINT nFlags, CPoint pt);
    void OnMouseLeave();
    BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
    void OnKeyDown(TCHAR nChar, UINT nRepCnt, UINT nFlags);
    void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
    void OnDestroy();
    void OnSetFocus(SWND wndOld);
    void OnKillFocus(SWND wndFocus);
    void TimeWheel(bool bUp);
    void CircluNum(bool bUp, WORD &wNum, WORD wMin, WORD wMax); // 循环 子

    HRESULT OnAttrCueText(const SStringW &strValue, BOOL bLoading);
    SOUI_ATTRS_BEGIN()
        ATTR_SKIN(L"btnSkin", m_pSkinBtn, TRUE)
        ATTR_BOOL(L"timeEnable", m_bTimeEnable, TRUE)
        ATTR_INT(L"dropWidth", m_nDropWidth, TRUE)
        ATTR_COLOR(L"cueColor", m_crCue, TRUE)
        ATTR_CUSTOM(L"cueText", OnAttrCueText)
    SOUI_ATTRS_END()

    SOUI_MSG_MAP_BEGIN()
        MSG_WM_PAINT_EX(OnPaint)
        MSG_WM_LBUTTONDOWN(OnLButtonDown)
        MSG_WM_MOUSEMOVE(OnMouseMove)
        MSG_WM_MOUSELEAVE(OnMouseLeave)
        MSG_WM_MOUSEWHEEL(OnMouseWheel)
        MSG_WM_KEYDOWN(OnKeyDown)
        MSG_WM_CHAR(OnChar)
        MSG_WM_DESTROY(OnDestroy)
        MSG_WM_SETFOCUS_EX(OnSetFocus)
        MSG_WM_KILLFOCUS_EX(OnKillFocus)
    SOUI_MSG_MAP_END()

  protected:
    DWORD m_dwBtnState;               /**< 按钮状态      */
    SAutoRefPtr<ISkinObj> m_pSkinBtn; /**< 按钮资源      */
    SDropDownWnd *m_pDropDownWnd;     /**< DropDown指针 */
    EnDateType m_eSelDateType;
    int m_nNumWidth;
    int m_nNumHeight;
    int m_nCharWidth;
    COLORREF m_crSelBg;
    COLORREF m_crSelText;
    SYSTEMTIME m_sysTime;
    SStringT m_sKey;

    int m_nDropWidth;
    bool m_bTimeEnable; // 是否 有 时 分 秒
    SCalendar *m_pCalendar;
    WORD m_wCharNum;
    STrText m_strCue;
    COLORREF m_crCue;
};
SNSEND