// XTPCalendarThemeOffice2007.h: interface for the CXTPCalendarControlPaintManager class.
//
// This file is a part of the XTREME CALENDAR MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////

//{{AFX_CODEJOCK_PRIVATE
#if !defined(_XTP_CALENDAR_THEME_OFFICE_2007_H__)
#define _XTP_CALENDAR_THEME_OFFICE_2007_H__
//}}AFX_CODEJOCK_PRIVATE

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#if (_MSC_VER > 1100)
#pragma warning(push)
#endif

#pragma warning(disable: 4250)
//#pragma warning(disable: 4097)

#pragma warning(disable : 4100)// TODO: remove when themes will be finished

class CXTPResourceImages;
class CXTPImageManager;
class CXTPCalendarResources;
class CXTPNotifySink;
class CXTPCalendarEventCategories;
class CXTPCalendarEventCategoryIDs;

/////////////////////////////////////////////////////////////////////////////
// Initial version. Will be expanded in the feature.

//{{AFX_CODEJOCK_PRIVATE
class _XTP_EXT_CLASS CXTPCalendarThemeOffice2007 : public CXTPCalendarTheme
{
	DECLARE_DYNCREATE(CXTPCalendarThemeOffice2007)

	typedef CXTPCalendarTheme TBase;
public:

	DECLARE_THEMEPART(CTOHeader, CXTPCalendarTheme::CTOHeader)

		DECLARE_THEMEPART_MEMBER(0, CTOFormula_MulDivC, HeightFormula)
		//===========================================
		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);

		virtual void Draw(CCmdTarget* pObject, CDC* pDC) {ASSERT(FALSE);};

	protected:
	};
	friend class CTOHeader;

	//=======================================================================
	DECLARE_THEMEPART(CTOEvent, CXTPCalendarTheme::CTOEvent)
		struct CEventFontsColorsSet
		{
			CXTPPaintManagerColor           clrBorder;
			CXTPPaintManagerColorGradient   grclrBackground;

			CThemeFontColorSetValue         fcsetSubject;
			CThemeFontColorSetValue         fcsetLocation;
			CThemeFontColorSetValue         fcsetBody;

			CThemeFontColorSetValue         fcsetStartEnd; // for a month view single day event times
			                                               // or DayView multiday event From/To
			virtual void CopySettings(const CEventFontsColorsSet& rSrc);

			virtual void doPX(CXTPPropExchange* pPX, LPCTSTR pcszPropName, CXTPCalendarTheme* pTheme);
			virtual void Serialize(CArchive& ar);
		};

		CEventFontsColorsSet    m_fcsetNormal;
		CEventFontsColorsSet    m_fcsetSelected;

		CXTPPaintManagerColor   m_clrGripperBorder;
		CXTPPaintManagerColor   m_clrGripperBackground;

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void RefreshFromParent(CTOEvent* pParentSrc);

		virtual void DoPropExchange(CXTPPropExchange* pPX);
		virtual void Serialize(CArchive& ar);

		virtual int CalcMinEventHeight(CDC* pDC);

		virtual void GetEventColors(CDC* pDC, CXTPCalendarViewEvent* pViewEvent, COLORREF& rClrBorder,
									COLORREF& rClrBorderNotSel, CXTPPaintManagerColorGradient& rGrclrBk,
									BOOL bSelected = -1, int* pnColorsSrc_1Cat2Lbl = NULL);

		virtual void GetShowAsStatusColors(CDC* pDC, CXTPCalendarViewEvent* pViewEvent, COLORREF& clrBorder, COLORREF& clrBorderNotSel, CXTPPaintManagerColorGradient& grclrBk);
		virtual BOOL DrawShowAsStatus(CDC* pDC, CXTPCalendarViewEvent* pViewEvent, CXTPCalendarThemeOffice2007* pThemeX, const CRect& rcEvent, LONG& lShowAsBlockWidth);

		virtual void FillEventBackgroundEx(CDC* pDC, CXTPCalendarViewEvent* pViewEvent, const CRect& rcRect);

		virtual void MultidayDrawTime(int nMDEFlags, CXTPCalendarViewEvent* pViewEvent,
										CDC* pDC, const CRect& rcEvent, BOOL fStartTimeAsClock, BOOL fEndTimeAsClock, CRect& rcText);
		virtual void MultidayDrawTimeBlocks(CDC* pDC, const CRect& rcEventRect, CXTPCalendarViewEvent* pViewEvent,
										BOOL MultiDayFirstPart, BOOL MultiDayLastPart,
																	BOOL fStartTimeAsClock, BOOL fEndTimeAsClock);
		virtual void GetMultidayTimeFontAndColor(CFont*& pFont, COLORREF& clrColor, BOOL bSelected);

  protected:
		virtual BOOL Draw_ArrowL(CXTPCalendarViewEvent* pViewEvent, CDC* pDC, CRect& rrcRect, LONG lArrowOffset = 0);
		virtual BOOL Draw_ArrowR(CXTPCalendarViewEvent* pViewEvent, CDC* pDC, CRect& rrcRect);

		virtual CSize Draw_Icons(CXTPCalendarViewEvent* pViewEvent, CDC* pDC, const CRect& rcIconsMax, BOOL bCalculate = FALSE);

		virtual void InitBusyStatusDefaultColors();
	};
	friend class CTOEvent;

	DECLARE_THEMEPART(CTODay, CXTPCalendarTheme::CTODay)
		virtual int HitTestExpandDayButton(const CXTPCalendarViewDay* pViewDay, const CPoint* pPoint = NULL); // return 0 or xtpCalendarHitTestDayExpandButton
	};

	DECLARE_THEMEPART(CTOPrevNextEventButton, CXTPCalendarThemePart)

		CXTPCalendarThemeIntValue   m_nBitmapID;
		CXTPCalendarThemeRectValue  m_rcBitmapBorder;

		CThemeFontColorSetValue     m_fcsetText;
		CXTPPaintManagerColor       m_clrDisabledText;
		CXTPCalendarThemeStringValue m_strText;

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);

		virtual void DoPropExchange(CXTPPropExchange* pPX){};
		virtual void Serialize(CArchive& ar){};

		virtual void AdjustLayout(CXTPCalendarView* pObject, CDC* pDC, const CRect& rcRect);
		virtual void Draw(CXTPCalendarView* pObject, CDC* pDC);

		virtual int HitTest(const CPoint* pPoint = NULL) const; // return 0, xtpCalendarHitTestPrevEventButton or xtpCalendarHitTestNextEventButton

		virtual void OnMouseMove(CCmdTarget* pObject, UINT nFlags, CPoint point);
		virtual BOOL OnLButtonDown(CCmdTarget* pObject, UINT nFlags, CPoint point);

		virtual CRect GetRect();

		//------------------------------
		CTOPrevNextEventButton()
		{
			m_bPrev = TRUE;
			m_rcRect.SetRect(0,0,0,0);

			m_bHot = FALSE;
			m_bDisabled = FALSE;
			m_bVisible = TRUE;
		}

	protected:
		CSize GetSize(const CRect* prcRect = NULL);
		BOOL m_bPrev;
		CRect m_rcRect;

	public:
		BOOL m_bHot;
		BOOL m_bDisabled;
		BOOL m_bVisible;
	};
	friend class CTOPrevNextEventButton;

	DECLARE_THEMEPART(CTOPrevNextEventButtons, CXTPCalendarThemePart)

		CTOPrevNextEventButtons();
		virtual ~CTOPrevNextEventButtons();

		DECLARE_THEMEPART_MEMBER_(0, CTOPrevNextEventButton, PrevEventButton, CXTPCalendarThemePart)
		DECLARE_THEMEPART_MEMBER_(1, CTOPrevNextEventButton, NextEventButton, CXTPCalendarThemePart)

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void AdjustLayout(CXTPCalendarView* pObject, CDC* pDC, const CRect& rcRect);

		virtual void Draw(CXTPCalendarView* pObject, CDC* pDC);

		virtual int HitTest(const CPoint* pPoint = NULL) const; // return 0, xtpCalendarHitTestPrevEventButton or xtpCalendarHitTestNextEventButton

		virtual BOOL IsPrevNextButtonsVisible();

		virtual BOOL _IsSomeEventVisible();
		COleDateTime GetVisibleDay(BOOL bFirst);

		virtual BOOL GetPrevEventDay(COleDateTime* pdtDay = NULL);
		virtual BOOL GetNextEventDay(COleDateTime* pdtDay = NULL);

		virtual void OnStatusChanged();

		virtual void OnMouseMove(CCmdTarget* pObject, UINT nFlags, CPoint point);
		virtual BOOL OnLButtonDown(CCmdTarget* pObject, UINT nFlags, CPoint point);

		// Settings
		CXTPCalendarThemeBOOLValue  m_bHide;

		CXTPCalendarThemeIntValue   m_nIdleStepTime_ms;
		CXTPCalendarThemeIntValue   m_nRefreshDaysPerIdleStep;
		CXTPCalendarThemeBOOLValue  m_bUseActiveViewResources;

		virtual void SetCacheSize(int nDays);

	protected:
		CXTPCalendarResources* _GetActiveResources();

		void _RequestToFindEvents();
		void _StopRequests();
		BOOL _RefreshDay(long ndtDay, BOOL& rbRefreshed, BOOL bRefreshPermanently);

		//void _ResetData();

		virtual BOOL OnTimer(UINT_PTR uTimerID);
		virtual void OnDetachCalendar();

		UINT_PTR     m_nRefreshTimerID;

		long m_ndtRefreshDatePrev;
		long m_ndtRefreshDateNext;

		BOOL m_bScanPrev;
		BOOL m_bScanNext;

		long m_ndtMinScanDay;
		long m_ndtMaxScanDay;

		CRect m_rcRect;

		class CDaysMap : protected CArray<char, char>
		{
		protected:
			long m_nDaysOffset;
			int m_nCacheSizeMax_days;
		public:
			CDaysMap();

			long GetMinDay();
			long GetMaxDay();

			int GetDayState(long nDay);
			void SetDayState(long nDay, int nState); // states: (0)-unknown, (-1)-has no-events, (1)-has events.
			void SetDaysStateSafe(long nDayStart, long nDayEnd, int nState); // states: (0)-unknown, (-1)-has no-events, (1)-has events.

			void AdjustMiddleDay(long nDay);

			void SetDataSize(int nDays);
			int GetDataSize();
		protected:
			void _GrowArrayIfNeed(long nDay);
		};

		CDaysMap m_mapDaysState;
	protected:
		CXTPNotifySink* m_pSink;
		virtual void OnEvent_Calendar(XTP_NOTIFY_CODE Event, WPARAM wParam, LPARAM lParam);
	};
	friend class CTOPrevNextEventButtons;


	/////////////////////////////////////////////////////////////////////////
	// ******** Day View *********

	//=======================================================================
	DECLARE_THEMEPART2(CTODayViewEvent, CTOEvent, CXTPCalendarTheme::CTODayViewEvent)

		DECLARE_THEMEPART_MEMBER(0, CTOEventIconsToDraw, EventIconsToDraw)
		DECLARE_THEMEPART_MEMBER(1, CTOFormula_MulDivC,  HeightFormula)

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);

	protected:
		static const int nCategoryIconWidth;
		static const int nCategoryIconOffset;

		BOOL NeedDrawCategoryIcons(CXTPCalendarEvent* pEvent);
		void DrawCategoryIcons(CDC* pDC, CXTPCalendarEvent* pEvent, const CRect& rcCategoryIcons);
		bool GetCategoryIconColors(CXTPCalendarEventCategories* pCategories,
															CXTPCalendarEventCategoryIDs* pCategoryIDs,
															int nCategoryIdx, COLORREF& clrCatColor, COLORREF& clrIconBorder);
		int CalcCategoryAreaWidth(int nCategoriesCount);
	};

	DECLARE_THEMEPART2(CTODayViewEvent_MultiDay, CTODayViewEvent, CXTPCalendarTheme::CTODayViewEvent_MultiDay)

		CXTPCalendarThemeStringValue m_strDateFormatFrom;
		CXTPCalendarThemeStringValue m_strDateFormatTo;
		CXTPCalendarThemeBOOLValue   m_bShowFromToArrowTextAlways;

		virtual void AdjustLayout(CCmdTarget* pObject, CDC* pDC, const CRect& rcRect, int nEventPlaceNumber);
		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);

		virtual void DoPropExchange(CXTPPropExchange* pPX);
		virtual void Serialize(CArchive& ar);

		virtual void Draw(CCmdTarget* pObject, CDC* pDC);

		virtual void CalcEventYs(CRect& rcRect, int nEventPlaceNumber);

	protected:
		virtual BOOL Draw_ArrowLtext(CXTPCalendarViewEvent* pViewEvent, CDC* pDC, CThemeFontColorSetValue* pfcsetText, CRect& rrcRect, int nLeft_x);
		virtual BOOL Draw_ArrowRtext(CXTPCalendarViewEvent* pViewEvent, CDC* pDC, CThemeFontColorSetValue* pfcsetText, CRect& rrcRect, int nRight_x);

		virtual CString Format_FromToDate(CXTPCalendarViewEvent* pViewEvent, int nStart1End2);

		void DrawCategoryIcons(CDC* pDC, CXTPCalendarViewEvent* pViewEvent, CRect rcCategoryIcons, const CRect& rcEventMax);
		CRect AdjustCategoryIconsRectWidth(const CRect& rcCategoryIconsBase, const CRect& rcEvent, int nCategoriesCount);
	};
	friend class CTODayViewEvent_MultiDay;

	DECLARE_THEMEPART2(CTODayViewEvent_SingleDay, CTODayViewEvent, CXTPCalendarTheme::CTODayViewEvent_SingleDay)
		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void AdjustLayout(CCmdTarget* pObject, CDC* pDC, const CRect& rcRect, int nEventPlaceNumber);
		virtual void Draw(CCmdTarget* pObject, CDC* pDC);
		virtual void DrawShadow(CDC* pDC, CXTPCalendarDayViewEvent* pViewEvent);

		private:
			void DrawCategoryIcons(CDC* pDC, CXTPCalendarViewEvent* pViewEvent, const CRect& rcText, const CRect& rcTopRow);
			CRect CalcCategoryIconsRect(int nCategoriesCount, const CRect& rcText, const CRect& rcTopRow);
	};
	friend class CTODayViewEvent_SingleDay;

	//=======================================================================
	DECLARE_THEMEPART(CTODayViewTimeScale, CXTPCalendarTheme::CTODayViewTimeScale)
		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);

		virtual int CalcMinRowHeight(CDC* pDC, CXTPCalendarDayViewTimeScale* pTimeScale);

		DECLARE_THEMEPART_MEMBER(0, CTOFormula_MulDivC, HeightFormula)
	};

	//=======================================================================
	DECLARE_THEMEPART2(CTODayViewDayGroupHeader, CTOHeader, CXTPCalendarTheme::CTODayViewDayGroupHeader)
		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void Draw(CCmdTarget* pObject, CDC* pDC);
	};

	DECLARE_THEMEPART(CTODayViewDayGroupAllDayEvents, CXTPCalendarTheme::CTODayViewDayGroupAllDayEvents)

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);

		virtual void Draw(CCmdTarget* pObject, CDC* pDC);

		virtual void SetDynColors(CXTPCalendarDayViewGroup* pViewGroup);
	protected:
		COLORREF m_clrDynHatch;
		int      m_nDynBusyStatus;
	};

	DECLARE_THEMEPART(CTODayViewDayGroupCell, CXTPCalendarTheme::CTODayViewDayGroupCell)

		COLORREF m_clrDynHatchBrush;

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual int CalcHeight(CDC* pDC, int nCellWidth) {return 23;}

		virtual void Draw(CDC* pDC, const CRect& rcRect,
						  const XTP_CALENDAR_THEME_DAYVIEWCELL_PARAMS& cellParams, CXTPPropsStateContext* pStateCnt = NULL);
	};

	//=======================================================================
	DECLARE_THEMEPART(CTODayViewDayGroup, CXTPCalendarTheme::CTODayViewDayGroup)

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void Draw(CCmdTarget* pObject, CDC* pDC);

		virtual BOOL IsSelected(CXTPCalendarViewGroup* pViewGroup);

		DECLARE_THEMEPART_MEMBER(0, CTODayViewDayGroupHeader,       Header)
		DECLARE_THEMEPART_MEMBER(1, CTODayViewDayGroupAllDayEvents, AllDayEvents)
		DECLARE_THEMEPART_MEMBER(2, CTODayViewDayGroupCell,         Cell)
		DECLARE_THEMEPART_MEMBER(3, CTODayViewEvent_MultiDay,       MultiDayEvent)
		DECLARE_THEMEPART_MEMBER(4, CTODayViewEvent_SingleDay,      SingleDayEvent)

	public:
		virtual void OnMouseMove(CCmdTarget* pObject, UINT nFlags, CPoint point);
		virtual BOOL OnLButtonDown(CCmdTarget* pObject, UINT nFlags, CPoint point);

		virtual CRect GetScrollButtonRect(const XTP_DAY_VIEW_GROUP_LAYOUT& groupLayout, int nButton);

	protected:
		virtual void AdjustDayEvents(CXTPCalendarDayViewGroup* pDayViewGroup, CDC* pDC);
		int HitTestAllDayEventsScrollIcons(const CXTPCalendarDayViewGroup* pDVGroup, const CPoint& point);
	};

	DECLARE_THEMEPART2(CTODayViewDayHeader, CTOHeader, CXTPCalendarTheme::CTODayViewDayHeader)

		CXTPCalendarThemeBOOLValue m_UseOffice2003HeaderFormat;

		CTODayViewDayHeader()
		{
			m_nWeekDayFormat = 0;
		}

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void AdjustLayout(CCmdTarget* pObject, CDC* pDC, const CRect& rcRect);
		virtual void Draw(CCmdTarget* pObject, CDC* pDC);

		virtual void DoPropExchange(CXTPPropExchange* pPX);
		virtual void Serialize(CArchive& ar);
	private:
		int m_nWeekDayFormat; // 0 - no Week Day, 1 - short, 2 - long
	};

	//=======================================================================
	DECLARE_THEMEPART(CTODayViewDay, CXTPCalendarTheme::CTODayViewDay)

		CXTPPaintManagerColor         m_clrBorder;
		CXTPPaintManagerColor         m_clrTodayBorder;

		DECLARE_THEMEPART_MEMBER(0, CTODayViewDayHeader,            Header)
		DECLARE_THEMEPART_MEMBER(1, CTODayViewDayGroup,             Group)

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);

		virtual void DoPropExchange(CXTPPropExchange* pPX);
		virtual void Serialize(CArchive& ar);

		virtual void Draw(CCmdTarget* pObject, CDC* pDC);

		virtual void Draw_DayBorder(CXTPCalendarDayViewDay* pDayViewDay, CDC* pDC);
		virtual CRect ExcludeDayBorder(CXTPCalendarDayViewDay* pDayViewDay, const CRect& rcDay);
	public:
		virtual void OnMouseMove(CCmdTarget* pObject, UINT nFlags, CPoint point);
	};

	DECLARE_THEMEPART(CTODayViewHeader, CTOHeader)
		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
	};


	//=======================================================================
	DECLARE_THEMEPART(CTODayView, CXTPCalendarTheme::CTODayView)

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);

		virtual void AdjustLayout(CDC* pDC, const CRect& rcRect);
		virtual void Draw(CDC* pDC);

		DECLARE_THEMEPART_MEMBER_(0, CTODayViewHeader,   Header, CXTPCalendarTheme::CTOHeader)
		DECLARE_THEMEPART_MEMBER(1, CTODayViewEvent,     Event)
		DECLARE_THEMEPART_MEMBER(2, CTODayViewTimeScale, TimeScale)
		DECLARE_THEMEPART_MEMBER(3, CTODayViewDay, Day)

		// theme specific control options
		virtual BOOL IsUseCellAlignedDraggingInTimeArea() const {return TRUE;};
	protected:
	};

	/////////////////////////////////////////////////////////////////////////
	// ******** Month View *********

	// ======= MonthViewEvent ======
	DECLARE_THEMEPART2(CTOMonthViewEvent, CTOEvent, CXTPCalendarTheme::CTOMonthViewEvent)
		DECLARE_THEMEPART_MEMBER(0, CTOEventIconsToDraw, EventIconsToDraw)
		DECLARE_THEMEPART_MEMBER(1, CTOFormula_MulDivC,  HeightFormula)

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void AdjustLayout(CCmdTarget* pObject, CDC* pDC, const CRect& rcRect, int nEventPlaceNumber);
	};
	friend class CTOMonthViewEvent;

	// ---- MonthViewEvent_SingleDay ----
	DECLARE_THEMEPART2(CTOMonthViewEvent_SingleDay, CTOMonthViewEvent, CXTPCalendarTheme::CTOMonthViewEvent_SingleDay)

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void Draw(CCmdTarget* pObject, CDC* pDC);

		virtual void GetShowAsStatusColors(CDC* pDC, CXTPCalendarViewEvent* pViewEvent, COLORREF& clrBorder, COLORREF& clrBorderNotSel, CXTPPaintManagerColorGradient& grclrBk);

	protected:
		virtual void Draw_Background(CDC* pDC, const CRect& rcEventRect, CXTPCalendarMonthViewEvent* pViewEvent);
		virtual CSize Draw_Time(CDC* pDC, const CRect& rcEventRect, CXTPCalendarMonthViewEvent* pViewEvent);
		virtual void Draw_Caption(CDC* pDC, const CRect& rcTextRect, CXTPCalendarMonthViewEvent* pViewEvent);

	protected:
	};
	friend class CTOMonthViewEvent_SingleDay;

	// ---- MonthViewEvent_MultiDay ----
	DECLARE_THEMEPART2(CTOMonthViewEvent_MultiDay, CTOMonthViewEvent, CXTPCalendarTheme::CTOMonthViewEvent_MultiDay)

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void Draw(CCmdTarget* pObject, CDC* pDC);
	};
	friend class CTOMonthViewEvent_MultiDay;

	// ===== MonthViewDayHeader ====
	DECLARE_THEMEPART2(CTOMonthViewDayHeader, CTOHeader, CXTPCalendarTheme::CTOMonthViewDayHeader)
		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void Draw(CCmdTarget* pObject, CDC* pDC);

	};
	friend class CTOMonthViewDayHeader;

	// ======= MonthViewDay =======
	DECLARE_THEMEPART2(CTOMonthViewDay, CTODay, CXTPCalendarTheme::CTOMonthViewDay)

		CXTPPaintManagerColor m_clrBorder;
		CXTPPaintManagerColor m_clrTodayBorder;

		CXTPPaintManagerColor m_clrBackgroundLight;
		CXTPPaintManagerColor m_clrBackgroundDark;
		CXTPPaintManagerColor m_clrBackgroundSelected;

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void Draw(CCmdTarget* pObject, CDC* pDC);

		virtual void DoPropExchange(CXTPPropExchange* pPX);
		virtual void Serialize(CArchive& ar);

		DECLARE_THEMEPART_MEMBER(0, CTOMonthViewDayHeader,       Header);
		DECLARE_THEMEPART_MEMBER(1, CTOMonthViewEvent_MultiDay,  MultiDayEvent);
		DECLARE_THEMEPART_MEMBER(2, CTOMonthViewEvent_SingleDay, SingleDayEvent);

	public:
		virtual void OnMouseMove(CCmdTarget* pObject, UINT nFlags, CPoint point);
		virtual BOOL OnLButtonDown(CCmdTarget* pObject, UINT nFlags, CPoint point);

		void SetDynColors(CXTPCalendarMonthViewDay* pMViewDay);
	protected:
		COLORREF m_clrDynHatch;
		int      m_nDynBusyStatus;
		BOOL     m_fHatchBackground;
	};
	friend class CTOMonthViewDay;

	// ======= MonthViewWeekDayHeader =======
	DECLARE_THEMEPART2(CTOMonthViewWeekDayHeader, CTOHeader, CXTPCalendarTheme::CTOMonthViewWeekDayHeader)

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void AdjustLayout(CCmdTarget* pObject, CDC* pDC, const CRect& rcRect);
		virtual void Draw(CCmdTarget* pObject, CDC* pDC);

	protected:
		virtual void Draw_Borders2(CDC* pDC, const CRect& rcRect, BOOL bDrawRightBorder);
	protected:
		BOOL m_bWeekDayNamesLong;
		BOOL m_bWeekDayNameSaSuLong;

		CStringArray m_arWeekDayNamesLong;  // 0 - Sunday, 1 - Monday, ...; 7 - Sat/Sun
		CStringArray m_arWeekDayNamesShort; // 0 - Sunday, 1 - Monday, ...; 7 - Sat/Sun

	public:
		CTOMonthViewWeekDayHeader()
		{
			m_bWeekDayNamesLong = FALSE;
			m_bWeekDayNameSaSuLong = FALSE;
		}
	};
	friend class CTOMonthViewWeekDayHeader;

	// ======= MonthViewWeekHeader =======
	DECLARE_THEMEPART(CTOMonthViewWeekHeader, CTOHeader)
		CXTPPaintManagerColor   m_clrFreeSpaceBk;
		// CTOHeader::m_TextCenter.fcsetNormal is used to draw header caption;

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void AdjustLayout(CCmdTarget* pObject, CDC* pDC, const CRect& rcRect);
		virtual void Draw(CCmdTarget* pObject, CDC* pDC);

		virtual void DoPropExchange(CXTPPropExchange* pPX);
		virtual void Serialize(CArchive& ar);

		virtual BOOL OnLButtonDown(CCmdTarget* pObject, UINT nFlags, CPoint point);

		virtual int CalcWidth(CDC* pDC);

		CTOMonthViewWeekHeader()
		{
			m_rcHeader.SetRect(0,0,0,0);
			m_bDateFormatShort = TRUE;
		}
	protected:
		CRect m_rcHeader;
		BOOL  m_bDateFormatShort;


		void GetWeekHeaderRect(CXTPCalendarThemeOffice2007* pThemeX, CXTPCalendarMonthViewDay* pViewDay, CRect& rcWHeader);

		void SwitchCalendarActiveViewToWeekView(CXTPCalendarControl* pCalendar);

		virtual void FormatWeekCaption(COleDateTime dtWDay1, CString& rstrShort, CString& rstrLong, int nShort1Long2 = 0);

		virtual CString _FormatWCaption(LPCTSTR pcszDay1, LPCTSTR pcszMonth1, LPCTSTR pcszDay7,
										LPCTSTR pcszMonth7, LPCTSTR pcszDayMonthSeparator, int nDateOrdering);

		virtual void Draw_TextCenter(CDC* pDC, const CRect& rcRect, int nState,
									 LPCTSTR pcszCenterText, int* pnWidth = NULL);
	};
	friend class CTOMonthViewWeekHeader;

	// ******* MonthView theme part object *******
	DECLARE_THEMEPART(CTOMonthView, CXTPCalendarTheme::CTOMonthView)

		// TODO:
		// BOOL m_bShowWeekNumbers;
		//
		//virtual void DoPropExchange(CXTPPropExchange* pPX);
		//virtual void Serialize(CArchive& ar);

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void AdjustLayout(CDC* pDC, const CRect& rcRect, BOOL bCallPostAdjustLayout);
		virtual void Draw(CDC* pDC);
		virtual BOOL OnLButtonDown(CCmdTarget* pObject, UINT nFlags, CPoint point);

		DECLARE_THEMEPART_MEMBER( 0, CTOHeader,                 Header);
		DECLARE_THEMEPART_MEMBER( 1, CTOMonthViewEvent,         Event);
		DECLARE_THEMEPART_MEMBER( 2, CTOMonthViewWeekDayHeader, WeekDayHeader);
		DECLARE_THEMEPART_MEMBER_(3, CTOMonthViewWeekHeader,    WeekHeader, CTOHeader);
		DECLARE_THEMEPART_MEMBER( 4, CTOMonthViewDay,           Day);
	};
	friend class CTOMonthView;


	/////////////////////////////////////////////////////////////////////////
	// ******** WeekView *********

	// ======= WeekViewEvent =======
	DECLARE_THEMEPART2(CTOWeekViewEvent, CTOEvent, CXTPCalendarTheme::CTOWeekViewEvent)
		DECLARE_THEMEPART_MEMBER(0, CTOEventIconsToDraw, EventIconsToDraw)
		DECLARE_THEMEPART_MEMBER(1, CTOFormula_MulDivC,  HeightFormula)

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void AdjustLayout(CCmdTarget* pObject, CDC* pDC, const CRect& rcRect, int nEventPlaceNumber);
	};
	friend class CTOWeekViewEvent;

	// ==== WeekViewEvent_SingleDay ====
	DECLARE_THEMEPART2(CTOWeekViewEvent_SingleDay, CTOWeekViewEvent, CXTPCalendarTheme::CTOWeekViewEvent_SingleDay)
		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void Draw(CCmdTarget* pObject, CDC* pDC);
	protected:
		virtual void Draw_Background(CDC* pDC, const CRect& rcEventRect, CXTPCalendarWeekViewEvent* pViewEvent);
		virtual CSize Draw_Time(CDC* pDC, const CRect& rcEventRect, CXTPCalendarWeekViewEvent* pViewEvent);
		virtual void Draw_Caption(CDC* pDC, const CRect& rcTextRect, CXTPCalendarWeekViewEvent* pViewEvent);
	};
	friend class CTOWeekViewEvent_SingleDay;

	// ==== WeekViewEvent_MultiDay ====
	DECLARE_THEMEPART2(CTOWeekViewEvent_MultiDay, CTOWeekViewEvent, CXTPCalendarTheme::CTOWeekViewEvent_MultiDay)
		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void Draw(CCmdTarget* pObject, CDC* pDC);
		virtual void GetMultidayTimeFontAndColor(CFont*& pFont, COLORREF& clrColor, BOOL bSelected);
	};
	friend class CTOWeekViewEvent_MultiDay;

	// ==== WeekViewDayHeader ====
	DECLARE_THEMEPART2(CTOWeekViewDayHeader, CTOHeader, CXTPCalendarTheme::CTOWeekViewDayHeader)
		CXTPCalendarThemeStringValue m_strHeaderFormat;
		CXTPCalendarThemeBOOLValue m_UseOffice2003HeaderFormat;

		virtual void AdjustLayout(CCmdTarget* pObject, CDC* pDC, const CRect& rcRect);
		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void Draw(CCmdTarget* pObject, CDC* pDC);

		virtual void DoPropExchange(CXTPPropExchange* pPX);
		virtual void Serialize(CArchive& ar);
	};
	friend class CTOWeekViewDayHeader;

	// ======= WeekViewDay =======
	DECLARE_THEMEPART2(CTOWeekViewDay, CTODay, CXTPCalendarTheme::CTOWeekViewDay)

		CXTPPaintManagerColor m_clrBorder;
		CXTPPaintManagerColor m_clrTodayBorder;

		CXTPPaintManagerColor m_clrBackgroundLight;
		CXTPPaintManagerColor m_clrBackgroundDark;
		CXTPPaintManagerColor m_clrBackgroundSelected;

		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void Draw(CCmdTarget* pObject, CDC* pDC);

		virtual void DoPropExchange(CXTPPropExchange* pPX);
		virtual void Serialize(CArchive& ar);

		virtual void OnMouseMove(CCmdTarget* pObject, UINT nFlags, CPoint point);
		virtual BOOL OnLButtonDown(CCmdTarget* pObject, UINT nFlags, CPoint point);

		DECLARE_THEMEPART_MEMBER(0, CTOWeekViewDayHeader,       Header);
		DECLARE_THEMEPART_MEMBER(1, CTOWeekViewEvent_MultiDay,  MultiDayEvent);
		DECLARE_THEMEPART_MEMBER(2, CTOWeekViewEvent_SingleDay, SingleDayEvent);

		virtual void SetDynColors(CXTPCalendarWeekViewDay* pWViewDay);
	protected:
		COLORREF m_clrDynHatch;
		int      m_nDynBusyStatus;
	};
	friend class CTOWeekViewDay;

	// ==== WeekView theme part object ====
	DECLARE_THEMEPART(CTOWeekView, CXTPCalendarTheme::CTOWeekView)
		virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);
		virtual void AdjustLayout(CDC* pDC, const CRect& rcRect, BOOL bCallPostAdjustLayout);
		virtual void Draw(CCmdTarget* pObject, CDC* pDC);

		DECLARE_THEMEPART_MEMBER(0, CTOWeekViewEvent, Event);
		DECLARE_THEMEPART_MEMBER(1, CTOWeekViewDay,   Day);
	};


	DECLARE_THEMEPART(CTOCellDynBackground, CXTPCalendarThemePart)
		virtual int GetCellDynBackground(CXTPCalendarViewGroup* pVioewGroup, COleDateTime dtCellTime,
										 int nCellIndex, XTP_BUSY_STATUS_CONTEXT& rContext);
		virtual CXTPCalendarViewEvent* GetCellBackgroundEvent(CXTPCalendarViewGroup* pVioewGroup,
										 COleDateTime dtCellTime, int nCellIndex);
		BOOL DrawMonthViewHatchBackground();
		CXTPCalendarEvent* GetBkTentativeEvent();
	protected:
		virtual int CmpEventBusyStatus(CXTPCalendarEvent* pEvent1, CXTPCalendarEvent* pEvent2);
		virtual int _GetEventBusyStatusRank(CXTPCalendarEvent* pEvent);

	protected:
		void CheckIsBackgroundHatchNeeded();

	protected:
		BOOL m_fDrawMonthViewBackgroundHatch;
		CXTPCalendarViewEvent* m_pBkViewEvent;
		CXTPCalendarEvent* m_pBkTentativeEvent;

	};

	//=======================================================================
	DECLARE_THEMEPART_MEMBER(0, CTOColorsSet,   ColorsSet)

	virtual BOOL IsBaseColorOrig();
	virtual COLORREF GetColor(int eCLR, COLORREF clrBase = (COLORREF)-1);
	virtual COLORREF GetColor2(LPCTSTR pcszColorName, COLORREF clrDefault);

	virtual CXTPResourceImage* GetBitmap(LPCTSTR pcszStdBmpName);

	DECLARE_THEMEPART_MEMBER(1, CTOHeader,      Header)
	DECLARE_THEMEPART_MEMBER(2, CTOEvent,       Event)

	DECLARE_THEMEPART_MEMBER(3, CTODayView,     DayView)
	DECLARE_THEMEPART_MEMBER(4, CTOMonthView,   MonthView)
	DECLARE_THEMEPART_MEMBER(5, CTOWeekView,    WeekView)

	// office 2007 theme specific parts
	DECLARE_THEMEPART_MEMBER_(6, CTOCellDynBackground, CellDynBackground, CTOCellDynBackground)

	DECLARE_THEMEPART_MEMBER_(7, CTOPrevNextEventButtons, PrevNextEventButtons, CXTPCalendarThemePart)

	//=======================================================================
	CXTPCalendarThemeOffice2007();
	virtual ~CXTPCalendarThemeOffice2007();

	// If enough space on the rect - draw 3 strings one under other
	// as multi-line text.
	// If rect height allow draw only 1 line - string 1 an 2 are drawn
	// as single line with a separator.
	// Separate font settings are used to draw each text.
	virtual CSize DrawText_Auto2SL3ML(CDC* pDC,
					LPCTSTR pcszText1, LPCTSTR pcszText2, LPCTSTR pcszText3,
					CThemeFontColorSet* pFontColor1, CThemeFontColorSet* pFontColor2,
					CThemeFontColorSet* pFontColor3,
					CRect& rcRect, LPCTSTR pcszText1Separator, UINT uWordBreakMode = DT_WORDBREAK);


	// Common    colors id's: {0   - 99}
	// DayViev   colors id's: {100 - 499}
	// MonthViev colors id's: {500 - 999}
	// WeekViev  colors id's: {1000 - 1499}
	//
	// For darken colors: id + 5000

	enum XTPEnumThemeColorsSet
	{
		xtpCLR_DarkenOffset = 5000,

		xtpCLR_SelectedBk   = 1 + xtpCLR_DarkenOffset,

		xtpCLR_HeaderBorder = 2,
		xtpCLR_DayBorder    = 3,

		xtpCLR_MultiDayEventBorder          = 10,
		xtpCLR_MultiDayEventSelectedBorder  = 11 + xtpCLR_DarkenOffset,
		xtpCLR_MultiDayEventBkGRfrom        = 12,
		xtpCLR_MultiDayEventBkGRto          = 13,

		xtpCLR_MultiDayEventFromToDates     = 20,

		//xtpCLR_DayView_ = 100,
		xtpCLR_DayViewCellWorkBk                = 101,
		xtpCLR_DayViewCellNonWorkBk             = 102,

		xtpCLR_DayViewCellWorkBorderBottomInHour    = 103,
		xtpCLR_DayViewCellWorkBorderBottomHour      = 104,
		xtpCLR_DayViewCellNonWorkBorderBottomInHour = 105,
		xtpCLR_DayViewCellNonWorkBorderBottomHour   = 106,

		xtpCLR_DayViewAllDayEventsBk            = 110,
		xtpCLR_DayViewAllDayEventsBorderBottom  = 111,

		xtpCLR_DayViewSingleDayEventBorder      = 120,
		xtpCLR_DayViewSingleDayEventSelectedBorder= 121 + xtpCLR_DarkenOffset,
		xtpCLR_DayViewSingleDayEventBkGRfrom    = 122,
		xtpCLR_DayViewSingleDayEventBkGRto      = 123,

		//xtpCLR_MonthView_ = 500,
		xtpCLR_MonthViewDayBkLight                  = 501,
		xtpCLR_MonthViewDayBkDark                   = 502,
		xtpCLR_MonthViewDayBkSelected               = 503,

		xtpCLR_MonthViewEventTime                   = 510 + xtpCLR_DarkenOffset,

		xtpCLR_MonthViewSingleDayEventBorder        = 520,
		xtpCLR_MonthViewSingleDayEventSelectedBorder= 521 + xtpCLR_DarkenOffset,
		xtpCLR_MonthViewSingleDayEventBkGRfrom      = 522,
		xtpCLR_MonthViewSingleDayEventBkGRto        = 523,

		//xtpCLR_WeekView_ = 1000,
		xtpCLR_WeekViewDayBkLight                  = 1001,
		xtpCLR_WeekViewDayBkDark                   = 1002,
		xtpCLR_WeekViewDayBkSelected               = 1003,

		xtpCLR_WeekViewEventTime                   = 1010 + xtpCLR_DarkenOffset,

		xtpCLR_WeekViewSingleDayEventBorder         = 1020,
		xtpCLR_WeekViewSingleDayEventSelectedBorder = 1021 + xtpCLR_DarkenOffset,
		xtpCLR_WeekViewSingleDayEventBkGRfrom       = 1022,
		xtpCLR_WeekViewSingleDayEventBkGRto         = 1023,

	};

public:
	virtual CXTPCalendarViewEventSubjectEditor* StartEditSubject(CXTPCalendarViewEvent* pViewEvent);

	static int DrawClock(CDC* pDC, COleDateTime dtClockTime, CRect rcView, COLORREF clrBackground, XTPCalendarClockAlignFlags cafAlign);
	//-----------------------------------------------------------------------
	// Summary:
	//     Thin method determine event view type (day, week, month) and
	//     return corresponding drawing part.
	// Returns:
	//     Theme drawing part for editing event.
	//-----------------------------------------------------------------------
	virtual CTOEvent* GetThemePartForEvent(CXTPCalendarViewEvent* pViewEvent);

	virtual void GetItemTextIfNeed(int nItem, CString* pstrText, CXTPCalendarViewDay* pViewDay);

	static const int cnGripperSize;
	static const int cnShadowWidth;
	BOOL m_bFlatStyle;

	static COLORREF AFX_CDECL PowerColor(COLORREF clrB, double dFactor, double dPower);

	void DrawEventRect(CDC* pDC, const CRect& rcRect, COLORREF clrBorder,
		BOOL bBoldBorder, CXTPPaintManagerColorGradient& grclrBk);


protected:
	virtual void SetCalendarControl(CXTPCalendarControl* pCalendar);
	virtual void RefreshMetrics(BOOL bRefreshChildren = TRUE);

	virtual void _DrawEventLTHighlight(CDC* pDC, CPoint ptLT, int nRTx, const CXTPPaintManagerColorGradient& grclrBk,
										int nLTCorner = 0, int nLBy = INT_MAX, BOOL bRCorner = TRUE);

protected:

	CXTPNotifySink* m_pSink;
	virtual void OnEvent_ResourceImagesChanged(XTP_NOTIFY_CODE Event, WPARAM wParam, LPARAM lParam);



protected:

};
//}}AFX_CODEJOCK_PRIVATE


/////////////////////////////////////////////////////////////////////////////

#if (_MSC_VER > 1100)
#pragma warning(pop)
#endif

#endif // !defined(_XTP_CALENDAR_THEME_OFFICE_2007_H__)