// XTPChartContent.h
//
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
// (c)1998-2011 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(__XTPCHARTCONTENT_H__)
#define __XTPCHARTCONTENT_H__
//}}AFX_CODEJOCK_PRIVATE

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

class CXTPChartDeviceContext;
class CXTPChartDiagram;
class CXTPChartTitleCollection;
class CXTPChartElementView;
class CXTPChartSeriesCollection;
class CXTPChartLegend;
class CXTPChartPanelCollection;
class CXTPChartSeries;
class CXTPChartAppearance;
class CXTPChartLegendView;
class CXTPPropExchange;
class CXTPMarkupContext;
class CXTPChartContentView;
class CXTPChartDiagramView;
class CXTPChartBorder;

enum XTPChartPanelDirection
{
	xtpChartPanelVertical,
	xtpChartPanelHorizontal
};

#include "XTPChartElement.h"
#include "XTPChartElementView.h"

//===========================================================================
// Summary:
//     This class represents the chart content, which is a kind of CXTPChartElement.
//     This class has a panel collection, series collection, title collection
//     and legend.
// Remarks:
//===========================================================================
class _XTP_EXT_CLASS CXTPChartContent : public CXTPChartElement
{
	DECLARE_DYNAMIC(CXTPChartContent)
public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPChartContent object.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartContent();

	//-------------------------------------------------------------------------
	// Summary:
	//     Destroys a CXTPChartContent object, handles cleanup
	//-------------------------------------------------------------------------
	virtual ~CXTPChartContent();


public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to get the the title collection object.
	// Returns:
	//     A pointer to CXTPChartTitleCollection object.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartTitleCollection* GetTitles() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to get the the series collection object.
	// Returns:
	//     A pointer to CXTPChartSeriesCollection object.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartSeriesCollection* GetSeries() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to get the the chart legend object.
	// Returns:
	//     A pointer to CXTPChartLegend object.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartLegend* GetLegend() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to get the the primary diagram of the chart. Its the diagram of first Panel.
	// Returns:
	//     A pointer to CXTPChartDiagram object.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartDiagram* GetPrimaryDiagram() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to get the the panels of the chart.
	// Returns:
	//     A pointer to CXTPChartPanelCollection object.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartPanelCollection* GetPanels() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to get the the appearance of the chart.
	// Returns:
	//     A pointer to CXTPChartAppearance object.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartAppearance* GetAppearance() const;

	CXTPChartBorder* GetBorder() const;

public:

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to draw the content.
	// Parameters:
	//     pDC      - A pointer to the chart device context object.
	//     rcBounds - The bound of the chart content.
	// Remarks:
	//-----------------------------------------------------------------------
	void DrawContent(CXTPChartDeviceContext* pDC, CRect rcBounds);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to create the device command tree.
	// Parameters:
	//     hDC      - The GDI device context HANDLE.
	//     rcBounds - The rectangle of the device context.
	// Returns:
	//     A pointer to CXTPChartDeviceCommand object - root of Command tree.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartDeviceCommand* CreateDeviceComand(CXTPChartDeviceContext* pDC, CRect rcBounds);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to create the device context for the drawing.
	// Parameters:
	//     hDC      - The GDI device context HANDLE.
	//     rcBounds - The rectangle of the device context.
	// Returns:
	//     A pointer to CXTPChartDeviceContext object.If the chart has 3D diagram,
	//     it returns CXTPChartOpenGLDeviceContext object.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartDeviceContext* CreateDeviceContext(CXTPChartContainer* pContainer, HDC hDC, CRect rcBounds, BOOL bWindowDC);

public:

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to get the background color of the chart content.
	// Returns:
	//     A CXTPChartColor object which describes an ARGB value.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartColor GetBackgroundColor() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to set the background color of the chart content.
	// Parameters:
	//     clr - Color of the background
	// Remarks:
	//-----------------------------------------------------------------------
	void SetBackgroundColor(const CXTPChartColor& clr);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to get the appearance background color of the chart content.
	// Returns:
	//     A CXTPChartColor object which describes an ARGB value.
	// Remarks:
	//     Call SetBackgroundColor to set custom background color. If custom background not set - color from current appearance will be used.
	//-----------------------------------------------------------------------
	CXTPChartColor GetActualBackgroundColor() const;
	CXTPChartColor GetActualBorderColor() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function whenever a change in the content of the chart.
	//     This call causes a redraw.
	// Parameters:
	//     updateOptions - Options that indicated what kind of changes done.
	// Remarks:
	//-----------------------------------------------------------------------
	virtual void OnChartChanged(XTPChartUpdateOptions updateOptions = xtpChartUpdateView);

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to Store/Load the properties of content
	//      using the specified data object.
	// Parameters:
	//     pPX - Source or destination CXTPPropExchange data object reference.
	// Remarks:
	//     This member function is used to store or load property data to or
	//     from a storage.
	//-----------------------------------------------------------------------
	virtual void DoPropExchange(CXTPPropExchange* pPX);


protected:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to calculate the view of the chart content.
	// Parameters:
	//     pDC      - Pointer to the chart device context object.
	//     rcBounds - The bounding rectangle.
	// Remarks:
	//-----------------------------------------------------------------------
	virtual CXTPChartContentView* CreateView(CXTPChartDeviceContext* pDC, CRect rcBounds);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to update the color of the points from the palette.
	// Remarks:
	//-----------------------------------------------------------------------
	void UpdateDiagram();

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to update the content whenever there is a change
	//     in the series style.
	// Parameters:
	//     pSeries - A pointer to chart series object.
	// Remarks:
	//-----------------------------------------------------------------------
	virtual void OnSeriesStyleChanged(CXTPChartSeries* pSeries);

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to check whether there is any 3D diagram in the
	//     content.
	// Parameters:
	//     pSeries - A pointer to chart series object.
	// Remarks:
	//-----------------------------------------------------------------------
	BOOL Has3DDiagram() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to get distance between 2 panels
	// Returns:
	//     Distance between 2 panels.
	//
	// Remarks:
	//     10 pixels is used by default
	//-----------------------------------------------------------------------
	int GetPanelDistance() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to set distance between 2 panels
	// Parameters:
	//     nDistance - New distance to b set
	// Remarks:
	//-----------------------------------------------------------------------
	void SetPanelDistance(int nDistance);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to get layout direction of panels - top-to-bottom or left-to-right.
	// Returns:
	//     XTPChartPanelDirection value indicates direction of panels (xtpChartPanelVertical/xtpChartPanelHorizontal)   //
	//-----------------------------------------------------------------------
	XTPChartPanelDirection GetPanelDirection() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to set layout direction of panels - top-to-bottom or left-to-right.
	// Parameters:
	//     nDirection - XTPChartPanelDirection value indicates direction of panels (xtpChartPanelVertical/xtpChartPanelHorizontal)  //
	//-----------------------------------------------------------------------
	void SetPanelDirection(XTPChartPanelDirection nDirection);

public:
	//-------------------------------------------------------------------------
	// Summary:
	//     Call this method to enable markup for tab captions
	// Parameters:
	//     bEnable - TRUE to enable markup
	//-------------------------------------------------------------------------
	void EnableMarkup(BOOL bEnable = TRUE);

	//-------------------------------------------------------------------------
	// Summary:
	//     Returns markup context
	//-------------------------------------------------------------------------
	CXTPMarkupContext* GetMarkupContext() const;

protected:
	void AddContainer(CXTPChartContainer* pContainer);
	void RemoveContainer(CXTPChartContainer* pContainer);



protected:
	CXTPChartPanelCollection* m_pPanels;        //The panel collection.
	CXTPChartTitleCollection* m_pTitles;        //The title collection.
	CXTPChartSeriesCollection* m_pSeries;       //The series collection.
	CXTPChartLegend* m_pLegend;                 //The legend object.

	CXTPChartAppearance* m_pAppearance;         //The chart appearance object.

	CXTPChartBorder* m_pBorder;                 //The chart border.

	CXTPChartColor m_clrBackground;             //The chart background color.

	CArray<CXTPChartContainer*, CXTPChartContainer*> m_arrContainers;   //The chart containers

	CXTPMarkupContext* m_pMarkupContext;        // Markup context

	int m_nPanelDistance;                       // Panel distance
	XTPChartPanelDirection m_nPanelDirection;   // Panel direction.

	friend class CXTPChartSeriesCollection;
	friend class CXTPChartSeries;
	friend class CXTPChartControl;
};

//===========================================================================
// Summary:
//     This class represents the view of the chart content, which is a kind of
//     CXTPChartElementView.
// Remarks:
//===========================================================================
class _XTP_EXT_CLASS CXTPChartContentView : public CXTPChartElementView
{
public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPChartContentView object.
	// Parameters:
	//     pContent - Pointer to chart content object.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartContentView(CXTPChartContainer* pContainer, CXTPChartContent* pContent);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to create various child view objects, which
	//     constitutes the view of the content.
	// Parameters:
	//     pDC - Pointer to chart device context.
	// Remarks:
	//-----------------------------------------------------------------------
	void CreateView(CXTPChartDeviceContext* pDC);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to calculate the view/layout of the content
	//     with respect to a bounding rectangle.
	// Parameters:
	//     pDC      - Pointer to chart device context.
	//     rcBounds - The bounding rectangle.
	// Remarks:
	//-----------------------------------------------------------------------
	void CalculateView(CXTPChartDeviceContext* pDC, CRect rcBounds);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to get the legend view object associated with this
	//     object.
	// Returns:
	//     Pointer to chart legend view object.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartLegendView* GetLegendView() const;

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to determine current DiagramView under point
	// Parameters:
	//     pt - Position to hit test.
	// Returns:
	//     Pointer to CXTPChartDiagramView view object.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartDiagramView* HitTestDiagramView(CPoint pt) const;

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to crate the device command for this object.
	//     This function create different child device command objects and
	// Parameters:
	//     pDC - The device context.
	// Returns:
	//     A pointer to chart device context object.
	// Remarks:
	//-----------------------------------------------------------------------
	virtual CXTPChartDeviceCommand* CreateDeviceCommand(CXTPChartDeviceContext* pDC);

protected:
	CRect m_rcBounds;               //The bounds.
	CXTPChartContent* m_pContent;    //The chart content.

public:
	CXTPChartLegendView* m_pLegendView;      //The legend view.
	CXTPChartElementView* m_pTitlesView;     //The titles view.
	CXTPChartElementView* m_pDiagramView;    //The diagram view.
};



AFX_INLINE CXTPChartTitleCollection* CXTPChartContent::GetTitles() const {
	return m_pTitles;
}

AFX_INLINE CXTPChartSeriesCollection* CXTPChartContent::GetSeries() const {
	return m_pSeries;
}
AFX_INLINE CXTPChartLegend* CXTPChartContent::GetLegend() const {
	return m_pLegend;
}
AFX_INLINE CXTPChartPanelCollection* CXTPChartContent::GetPanels() const {
	return m_pPanels;
}
AFX_INLINE CXTPChartAppearance* CXTPChartContent::GetAppearance() const {
	return m_pAppearance;
}
AFX_INLINE CXTPMarkupContext* CXTPChartContent::GetMarkupContext() const {
	return m_pMarkupContext;
}
AFX_INLINE int CXTPChartContent::GetPanelDistance() const {
	return m_nPanelDistance;
}
AFX_INLINE void CXTPChartContent::SetPanelDistance(int nDistance) {
	m_nPanelDistance = nDistance;
	OnChartChanged();
}
AFX_INLINE XTPChartPanelDirection CXTPChartContent::GetPanelDirection() const {
	return m_nPanelDirection;
}
AFX_INLINE void CXTPChartContent::SetPanelDirection(XTPChartPanelDirection nDirection) {
	m_nPanelDirection = nDirection;
	OnChartChanged();
}
AFX_INLINE void CXTPChartContent::SetBackgroundColor(const CXTPChartColor& clr) {
	m_clrBackground = clr;
	OnChartChanged();
}
AFX_INLINE CXTPChartBorder* CXTPChartContent::GetBorder() const {
	return m_pBorder;
}

#endif //#if !defined(__XTPCHARTCONTENT_H__)
