// XTPCalendarTimeLineViewTimeScale.h: interface for the
// CXTPCalendarTimeLineViewTimeScale class.
//

//{{AFX_CODEJOCK_PRIVATE
#ifndef _XTPCALENDARTIMELINEVIEWTIMESCALE_H__
#define _XTPCALENDARTIMELINEVIEWTIMESCALE_H__
//}}AFX_CODEJOCK_PRIVATE

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


#include "Common/XTPDrawHelpers.h"

#include "XTPCalendarPaintManager.h"
#include "XTPCalendarPtrs.h"

struct XTPCALENDARHITTESTINFO_TIMELINE_VIEW;
class CXTPCalendarTimeLineView;
class CXTPCalendarTLV_TimeScaleParams;
class CXTPCalendarTimeLineViewTimeScalePart;

//============================================================================
// Summary:
//     predefine set of different scales based on time intervals
//============================================================================
enum XTPEnumCalendarDateItem
{
	xtpDTScale_Unknown  = 0, // Typed unknown value

	xtpDTScale_Sec      = 0x0001, // Sec scale
	xtpDTScale_Min      = 0x0002, // Min scale
	xtpDTScale_Hour     = 0x0004, // Hour scale
	xtpDTScale_Day      = 0x0010, // Day scale
	xtpDTScale_WorkWeek = 0x0015, // WorkWeek scale
	xtpDTScale_Week     = 0x0020, // Week scale
	xtpDTScale_Month    = 0x0040, // Month scale
	xtpDTScale_Year     = 0x0080, // Year scale
};

//============================================================================
// Summary:
//     Timeline view scale is
//============================================================================
struct XTP_CALENDAR_TIMELINE_VIEW_SCALE
{
	int m_eType;    // one of the values from enum XTPEnumCalendarDateItem
	int m_nValue;   // number of days to show (e.g. 1, 5, 7, 31)
};

//============================================================================
// Summary:
//     This class implements a specific view portion of the Calendar
//     control - called Timeline view scale.
//============================================================================
class _XTP_EXT_CLASS CXTPCalendarTimeLineViewTimeScale : public CXTPCmdTarget
{
public:
	// --------------------------
	// Summary:
	//     Default object constructor.
	// Parameters:
	//     pView :  pointer to associated CXTPCalendarTimeLineView object.
	// --------------------------
	CXTPCalendarTimeLineViewTimeScale(CXTPCalendarTimeLineView* pView);

	//-----------------------------------------------------------------------
	// Summary:
	//     Default class destructor.
	// Remarks:
	//     Handles member items deallocation.
	//-----------------------------------------------------------------------
	virtual ~CXTPCalendarTimeLineViewTimeScale();

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function is used to obtain the owner view object.
	// Returns:
	//     CXTPCalendarTimeLineView pointer to the owner view object.
	//-----------------------------------------------------------------------
	CXTPCalendarTimeLineView* GetView();

	// -----------------
	// Summary:
	//  access function to get time scale params
	// Returns:
	//  pointer to CXTPCalendarTLV_TimeScaleParams object
	// -----------------
	virtual CXTPCalendarTLV_TimeScaleParams* GetTimeScaleParams();

	// ---------------------------------------
	// Summary:
	//  access function to set time scale params
	//  from predefined set XTPEnumCalendarTimeScaleParamsID
	// Parameters:
	//  eTimeScaleParamsID :  int as one of XTPEnumCalendarTimeScaleParamsID set
	// ---------------------------------------
	virtual void SetTimeScaleParams(int eTimeScaleParamsID);

	// ---------------------------------------
	// Summary:
	//  access function to set time scale params
	//  from another CXTPCalendarTLV_TimeScaleParams object
	// Parameters:
	// pSParams :  pointer to CXTPCalendarTLV_TimeScaleParams object
	// -----------------------------
	virtual void SetTimeScaleParams2(CXTPCalendarTLV_TimeScaleParams* pSParams);

	// -----------------
	// Summary:
	//  access function to get start view date value
	// Returns:
	//  start view date value as COleDateTime object
	// -----------------
	virtual COleDateTime GetStartViewDate();

	// -----------------------
	// Summary:
	//  access function to set start view date value
	// Parameters:
	// dt :  new start view date value
	// -----------------------
	virtual void SetStartViewDate(COleDateTime dt);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function is used to adjust time scale layout
	//     depending on the provided parent rectangle
	// Parameters:
	//     rcParentRect :  provided parent rectangle
	// ---------------------------------
	virtual void AdjustLayout(CRect rcParentRect);

	// ----------------------------
	// Summary:
	//  access function to get client rectangle according
	//  to passed vertical start position
	// Parameters:
	//     nYstart :  vertical start position
	// Returns:
	//     client rectangle as CRect object
	// ----------------------------
	virtual CRect GetClientRect(int nYstart = 0);

	// -----------------
	// Summary:
	//  access function to get time scale rectangle
	// Returns:
	// time scale rectangle as CRect object
	// -----------------
	virtual CRect GetRect();

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function is used to draw the time scale
	//     the specified device context.
	// Parameters:
	//  pDC - A pointer to a valid device context.
	//-----------------------------------------------------------------------
	virtual void Draw(CDC* pDC);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function is used to determine which view item,
	//     if any, is at a specified position index, and returns additional
	//     info in a XTP_CALENDAR_HITTESTINFO struct.
	// Parameters:
	//     pt       - A CPoint that contains the coordinates of the point to
	//                test.
	//     pHitTest - A pointer to a XTP_CALENDAR_HITTESTINFO structure that
	//                contains information about the point to test.
	// Returns:
	//     A BOOL. TRUE if the item is found. FALSE otherwise.
	// See Also: XTP_CALENDAR_HITTESTINFO
	//-----------------------------------------------------------------------
	virtual BOOL HitTestEx(CPoint pt, XTP_CALENDAR_HITTESTINFO* pHitTest);

	CXTPEmptyRect m_rcScale; // internal member to keep time scale rectangle

protected:
	CXTPCalendarTimeLineView* m_pParentView; //internal pointer to parent view
	COleDateTime m_dtStartViewDate; // internal datetime object to keep start view date
	CXTPEmptyRect m_rcRect;  // internal member used for layout adjustment
	CXTPCalendarTLV_TimeScaleParams* m_pTimeScaleParams; // internal pointer to CXTPCalendarTLV_TimeScaleParams
};

//============================================================================
// Summary:
//     This class implements a Timeline scale params.
//============================================================================
class _XTP_EXT_CLASS CXTPCalendarTLV_TimeScaleParams : public CXTPCmdTarget
{
	friend class CXTPCalendarTimeLineViewTimeScale;
public:
	// -----------------
	// Summary:
	//     Default object constructor.
	// Parameters:
	//     nTimeScaleParamsID - passed new params ID
	//     pTimeScale - pointer to CXTPCalendarTimeLineViewTimeScale
	// -----------------
	CXTPCalendarTLV_TimeScaleParams(int nTimeScaleParamsID,
									CXTPCalendarTimeLineViewTimeScale* pTimeScale);

	//-----------------------------------------------------------------------
	// Summary:
	//     Default class destructor.
	// Remarks:
	//     Handles member items deallocation.
	//-----------------------------------------------------------------------
	virtual ~CXTPCalendarTLV_TimeScaleParams();

	// -----------------
	// Summary:
	//     access function to get current parent time scale object
	// Returns:
	//     pointer to CXTPCalendarTimeLineViewTimeScale
	// -----------------
	CXTPCalendarTimeLineViewTimeScale* GetParentTimeScale();

	// -----------------
	// Summary:
	//     access function to get current time scale params ID
	// Returns:
	//     int as current time scale params ID
	// -----------------
	virtual int GetTimeScaleParamsID() const;

	// -----------------
	// Summary:
	//     access function to get current time scale inteval
	// Returns:
	//     interval as XTP_CALENDAR_TIMELINE_VIEW_SCALE object
	// -----------------
	virtual XTP_CALENDAR_TIMELINE_VIEW_SCALE GetScaleInterval() const;

	// -----------------
	// Summary:
	//     access function to get current time scale inteval
	// Returns:
	//     interval as COleDateTimeSpan object
	// -----------------
	virtual COleDateTimeSpan GetScaleInterval();

	// -----------------
	// Summary:
	//     access function to get current time scale inteval width
	// Returns:
	//     int as current time scale inteval width
	// -----------------
	virtual int GetScaleIntervalWidth_px();

	// -----------------
	// Summary:
	//     access function to get current time per pixel value
	// Returns:
	//     current time per pixel value  as COleDateTimeSpan object
	// -----------------
	virtual COleDateTimeSpan GetTimePerPixel();

	// -----------------
	//  Summary:
	// use to calculate scale inteval initial position
	//  Parameters:
	// dtStart - start time as COleDateTime object
	//  Returns:
	// scale inteval initial position as COleDateTime object
	// -----------------
	virtual COleDateTime CalcScaleIntervalBegin(COleDateTime dtStart);

	// -----------------
	// Summary:
	//     abstract function - real ones are:
	//     CXTPCalendarTimeLineViewTimeScalePart* CXTPCalendarTLV_TimeScaleParams_Day::GetPart()
	//     CXTPCalendarTimeLineViewTimeScalePart* CXTPCalendarTLV_TimeScaleParams_Week::GetPart()
	//     CXTPCalendarTimeLineViewTimeScalePart* CXTPCalendarTLV_TimeScaleParams_Month::GetPart()
	// Returns:
	//     pointer to CXTPCalendarTimeLineViewTimeScalePart object
	// -----------------
	virtual CXTPCalendarTimeLineViewTimeScalePart* GetPart() = 0;

protected:

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function is used to set the time scale interval m_scaleInterval.
	// Parameters:
	//     eType - passed to m_eType
	//     nValue - passed to m_nValue
	// -----------------
	void SetScaleInterval(int eType, int nValue);

	XTP_CALENDAR_TIMELINE_VIEW_SCALE m_scaleInterval; // internal instance with m_eType and m_nValue

	int m_nScaleIntervalWidth_px; // internal value for scale inteval (by x)

private:
	CXTPCalendarTimeLineViewTimeScale* m_pTimeScale; // pointer to time scale object
	int m_nTimeScaleParamsID; // internal value of current time scale param id
};

//============================================================================
// Summary:
//     This class implements a Timeline scale params for Day case.
//============================================================================
class _XTP_EXT_CLASS CXTPCalendarTLV_TimeScaleParams_Day :
	public CXTPCalendarTLV_TimeScaleParams
{
public:
	// -----------------
	// Summary:
	//     Default object constructor.
	// Parameters:
	//     pTimeScale - pointer to CXTPCalendarTimeLineViewTimeScale
	// -----------------
	CXTPCalendarTLV_TimeScaleParams_Day(CXTPCalendarTimeLineViewTimeScale* pTimeScale);

	//-----------------------------------------------------------------------
	// Summary:
	//     Default class destructor.
	// Remarks:
	//     Handles member items deallocation.
	//-----------------------------------------------------------------------
	virtual ~CXTPCalendarTLV_TimeScaleParams_Day();

	// -----------------
	// Summary:
	//     abstract function - real ones are:
	//     CXTPCalendarTimeLineViewTimeScalePart* CXTPCalendarTLV_TimeScaleParams_Day::GetPart()
	//     CXTPCalendarTimeLineViewTimeScalePart* CXTPCalendarTLV_TimeScaleParams_Week::GetPart()
	//     CXTPCalendarTimeLineViewTimeScalePart* CXTPCalendarTLV_TimeScaleParams_Month::GetPart()
	// Returns:
	//     pointer to CXTPCalendarTimeLineViewTimeScalePart object
	// -----------------
	virtual CXTPCalendarTimeLineViewTimeScalePart* GetPart();
};

//============================================================================
// Summary:
//     This class implements a Timeline scale params for Week case.
//============================================================================
class _XTP_EXT_CLASS CXTPCalendarTLV_TimeScaleParams_Week :
	public CXTPCalendarTLV_TimeScaleParams
{
public:
	// -----------------
	// Summary:
	//     Default object constructor.
	// Parameters:
	//     pTimeScale - pointer to CXTPCalendarTimeLineViewTimeScale
	// -----------------
	CXTPCalendarTLV_TimeScaleParams_Week(CXTPCalendarTimeLineViewTimeScale* pTimeScale);

	//-----------------------------------------------------------------------
	// Summary:
	//     Default class destructor.
	// Remarks:
	//     Handles member items deallocation.
	//-----------------------------------------------------------------------
	virtual ~CXTPCalendarTLV_TimeScaleParams_Week();

	// -----------------
	// Summary:
	//     abstract function - real ones are:
	//     CXTPCalendarTimeLineViewTimeScalePart* CXTPCalendarTLV_TimeScaleParams_Day::GetPart()
	//     CXTPCalendarTimeLineViewTimeScalePart* CXTPCalendarTLV_TimeScaleParams_Week::GetPart()
	//     CXTPCalendarTimeLineViewTimeScalePart* CXTPCalendarTLV_TimeScaleParams_Month::GetPart()
	// Returns:
	//     pointer to CXTPCalendarTimeLineViewTimeScalePart object
	// -----------------
	virtual CXTPCalendarTimeLineViewTimeScalePart* GetPart();
};

//============================================================================
// Summary:
//     This class implements a Timeline scale params for Month case.
//============================================================================
class _XTP_EXT_CLASS CXTPCalendarTLV_TimeScaleParams_Month :
	public CXTPCalendarTLV_TimeScaleParams
{
public:
	// -----------------
	// Summary:
	//     Default object constructor.
	// Parameters:
	//     pTimeScale - pointer to CXTPCalendarTimeLineViewTimeScale
	// -----------------
	CXTPCalendarTLV_TimeScaleParams_Month(CXTPCalendarTimeLineViewTimeScale* pTimeScale);

	//-----------------------------------------------------------------------
	// Summary:
	//     Default class destructor.
	// Remarks:
	//     Handles member items deallocation.
	//-----------------------------------------------------------------------
	virtual ~CXTPCalendarTLV_TimeScaleParams_Month();

	// -----------------
	// Summary:
	//     abstract function - real ones are:
	//     CXTPCalendarTimeLineViewTimeScalePart* CXTPCalendarTLV_TimeScaleParams_Day::GetPart()
	//     CXTPCalendarTimeLineViewTimeScalePart* CXTPCalendarTLV_TimeScaleParams_Week::GetPart()
	//     CXTPCalendarTimeLineViewTimeScalePart* CXTPCalendarTLV_TimeScaleParams_Month::GetPart()
	// Returns:
	//     pointer to CXTPCalendarTimeLineViewTimeScalePart object
	// -----------------
	virtual CXTPCalendarTimeLineViewTimeScalePart* GetPart();

	//virtual CString FormatLowerScaleLabel(COleDateTime dtDateTime);
	//virtual void DrawLowerScale(CDC* pDC, DATE dtStart, const CRect& rcRect);
};

AFX_INLINE CXTPCalendarTimeLineView* CXTPCalendarTimeLineViewTimeScale::GetView()
{
	return m_pParentView;
}

AFX_INLINE CXTPCalendarTLV_TimeScaleParams*
	CXTPCalendarTimeLineViewTimeScale::GetTimeScaleParams()
{
	return m_pTimeScaleParams;
}

AFX_INLINE COleDateTime CXTPCalendarTimeLineViewTimeScale::GetStartViewDate()
{
	return m_dtStartViewDate;
}

AFX_INLINE void CXTPCalendarTimeLineViewTimeScale::SetStartViewDate(COleDateTime dt)
{
	m_dtStartViewDate = dt;
}

AFX_INLINE CRect CXTPCalendarTimeLineViewTimeScale::GetRect()
{
	return m_rcRect;
}

AFX_INLINE CXTPCalendarTimeLineViewTimeScale*
						CXTPCalendarTLV_TimeScaleParams::GetParentTimeScale()
{
	return m_pTimeScale;
}


AFX_INLINE XTP_CALENDAR_TIMELINE_VIEW_SCALE CXTPCalendarTLV_TimeScaleParams::GetScaleInterval() const
{
	return m_scaleInterval;
}

AFX_INLINE int CXTPCalendarTLV_TimeScaleParams::GetScaleIntervalWidth_px()
{
	return m_nScaleIntervalWidth_px;
}

AFX_INLINE COleDateTimeSpan CXTPCalendarTLV_TimeScaleParams::GetTimePerPixel()
{
	ASSERT(m_nScaleIntervalWidth_px > 0);
	COleDateTimeSpan spSInterval = GetScaleInterval();
	COleDateTimeSpan spTimePerPixel = (DATE)((double)GetScaleInterval() / max(m_nScaleIntervalWidth_px, 1));
	return spTimePerPixel;
}

AFX_INLINE int CXTPCalendarTLV_TimeScaleParams::GetTimeScaleParamsID() const
{
	return m_nTimeScaleParamsID;
}

//============================================================================
#endif // (_XTPCALENDARTIMELINEVIEWTIMESCALE_H__)
