// XTPChartAxisStrips.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(__XTPCHARTAXISSTRIPS_H__)
#define __XTPCHARTAXISSTRIPS_H__
//}}AFX_CODEJOCK_PRIVATE

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

#include "../XTPChartElement.h"
#include "../Types/XTPChartTypes.h"
#include "../XTPChartDefines.h"
#include "../XTPChartLegend.h"

class CXTPChartAxis;
class CXTPChartFillStyle;
//===========================================================================
// Summary:
//     This is a hybrid object of CXTPChartElement and CXTPChartLegendItem.
//     This class represents a strip parallel to an axis.
// Remarks:
//
//===========================================================================
class _XTP_EXT_CLASS CXTPChartAxisStrip : public CXTPChartElement, public CXTPChartLegendItem
{
	DECLARE_DYNCREATE(CXTPChartAxisStrip)
public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPChartAxisStrip object.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartAxisStrip();

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

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Use this function to set the strip visible/invisible.
	// Parameters:
	//     bVisible - A boolean TRUE to make the strip visible, FALSE to make
	//                the axis strip invisible.
	// Remarks:
	//-----------------------------------------------------------------------
	void SetVisible(BOOL bVisible);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to know whether the axis strip is visible.
	// Returns:
	//     A boolean TRUE if the axis strip is visible, FALSE if the strip
	//     is invisible.
	// Remarks:
	//-----------------------------------------------------------------------
	BOOL IsVisible() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Use this function to set the legend item visible/invisible.
	// Parameters:
	//     bVisible - A boolean TRUE to make the strip visible, FALSE to make
	//                the legend item invisible.
	// Remarks:
	//-----------------------------------------------------------------------
	void SetLegendVisible(BOOL bVisible);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to know whether the legend item is visible.
	// Returns:
	//     A boolean TRUE if the axis strip is visible, FALSE if the legend item
	//     is invisible.
	// Remarks:
	//-----------------------------------------------------------------------
	BOOL IsLegendVisible() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Use this function to set the name for the strip.
	// Parameters:
	//     lpszName - A string value denoting the name of the axis strip.
	// Remarks:
	//-----------------------------------------------------------------------
	void SetName(const CXTPChartString& lpszName);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function get the name of the axix strip.
	// Returns:
	//      A string value denoting the name of the axis strip.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartString GetName() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Use this function to set the legend item name for the strip.
	// Parameters:
	//     lpszName - A string value denoting the legend item name of the axis strip.
	// Remarks:
	//-----------------------------------------------------------------------
	void SetLegendName(const CXTPChartString& lpszName);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function get the legend item name of the axix strip.
	// Returns:
	//      A string value denoting the legend item name of the axis strip.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartString GetLegendName() const;

	//-------------------------------------------------------------------------
	// Summary:
	//     Call this function to get the fill style of the axis strip.
	// Returns:
	//     Returns a pointer to CXTPChartFillStyle object which represents the
	//     fill style of the of the axis strip.
	// Remarks:
	// See Also:
	//-------------------------------------------------------------------------
	CXTPChartFillStyle* GetFillStyle() const;

	//-------------------------------------------------------------------------
	// Summary:
	//     Call this function to get the minimum value of the strip in the axis.
	// Returns:
	//     Returns a string describing the minimum value of the strip in the axis.
	// Remarks:
	// See Also:
	//-------------------------------------------------------------------------
	CXTPChartString GetAxisMinValue() const;
	double GetAxisMinValueInternal() const;

	//-------------------------------------------------------------------------
	// Summary:
	//     Call this function to get the minimum value of the strip in the axis.
	// Parameters:
	//     lpszValue - a string describing the minimum value of the strip in the axis.
	// Remarks:
	// See Also:
	//-------------------------------------------------------------------------
	void SetAxisMinValue(LPCTSTR lpszValue);
	void SetAxisMinValue(double dValue);


	//-------------------------------------------------------------------------
	// Summary:
	//     Call this function to get the maximum value of the strip in the axis.
	// Returns:
	//     Returns a string describing the maximum value of the strip in the axis.
	// Remarks:
	// See Also:
	//-------------------------------------------------------------------------
	CXTPChartString GetAxisMaxValue() const;
	double GetAxisMaxValueInternal() const;

	//-------------------------------------------------------------------------
	// Summary:
	//     Call this function to get the maximum value of the strip in the axis.
	// Parameters:
	//     lpszValue - a string describing the maximum value of the strip in the axis.
	// Remarks:
	// See Also:
	//-------------------------------------------------------------------------
	void SetAxisMaxValue(LPCTSTR lpszValue);
	void SetAxisMaxValue(double dValue);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to get the actual color of the axis strip.
	// Returns:
	//     A chart color object, representing an ARGB value.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartColor GetActualColor() const;

	CXTPChartColor GetActualColor2() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Use this function to get the apparent color of the axis strip.
	// Returns:
	//     A CXTPChartColor object representing the ARGB color value, selected.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartColor GetColor() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to set the color of the axis strip.
	// Parameters:
	//     color - A chart color object, representing an ARGB value.
	// Remarks:
	//-----------------------------------------------------------------------
	void SetColor(const CXTPChartColor& color);

	CXTPChartColor GetColor2() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to set the color of the axis strip.
	// Parameters:
	//     color - A chart color object, representing an ARGB value.
	// Remarks:
	//-----------------------------------------------------------------------
	void SetColor2(const CXTPChartColor& color);


public:
	void DoPropExchange(CXTPPropExchange* pPX);

protected:
	//-------------------------------------------------------------------------
	// Summary:
	//     This function create a CXTPChartDeviceCommand object, this object
	//     represents the rendering of an axis strip in the chart.
	// Parameters:
	//     pDC      - Pointer to a CXTPChartDeviceContext object.
	//     rcBounds - The bounding rectangle of the axis strip.
	// Returns:
	//     Returns CXTPChartDeviceCommand object, this object handles
	//     the rendering of an element in the chart.Here it handles
	//     the drawing of the axis strip.
	// Remarks:
	// See Also:
	//-------------------------------------------------------------------------
	virtual CXTPChartDeviceCommand* CreateLegendDeviceCommand(CXTPChartDeviceContext* pDC, CRect rcBounds);

#ifdef _XTP_ACTIVEX
	//{{AFX_CODEJOCK_PRIVATE
	DECLARE_DISPATCH_MAP()
	DECLARE_INTERFACE_MAP()
	DECLARE_OLETYPELIB_EX(CXTPChartAxisStrip);

	BSTR OleGetText();
	void OleSetText(LPCTSTR lpszText);
	VARIANT OleGetAxisMinValue();
	void OleSetAxisMinValue(const VARIANT& var);
	VARIANT OleGetAxisMaxValue();
	void OleSetAxisMaxValue(const VARIANT& var);

	BOOL OleGetLegendVisible();
	void OleSetLegendVisible(BOOL bValue);
	BOOL OleGetVisible();
	void OleSetVisible(BOOL bValue);
	LPDISPATCH OleGetFillStyle();

	OLE_COLOR OleGetColor();
	OLE_COLOR OleGetColor2();
	void OleSetColor(OLE_COLOR clr);
	void OleSetColor2(OLE_COLOR clr);


//}}AFX_CODEJOCK_PRIVATE
#endif

protected:
	BOOL m_bLegendVisible;                  //TRUE if the legend item is visible, FALSE if not visible.
	BOOL m_bVisible;                        //TRUE if the strip is visible, FALSE if not visible.

	CXTPChartString m_strName;               //The name of the strip.
	CXTPChartString m_strLegendName;         //The name of the legend item.

	CXTPChartString m_strAxisMinValue;       //The minimum value of the strip in the axis.
	CXTPChartString m_strAxisMaxValue;       //The maximum value of the strip in the axis.

	double m_dAxisMinValue;       //The minimum value of the strip in the axis.
	double m_dAxisMaxValue;       //The maximum value of the strip in the axis.

	CXTPChartColor m_clrColor;               //The color of the strip.
	CXTPChartColor m_clrColor2;               //The color of the strip.

	CXTPChartFillStyle* m_pFillStyle;        //The fill style used for the background painting.

	friend class CXTPChartAxisStrips;
};

//===========================================================================
// Summary:
//     This class encapsulate a collection of chart axis strip objects.
//     CXTPChartAxisStrips class is designed as a kind of CXTPChartElement.
// Remarks:
//
//===========================================================================
class _XTP_EXT_CLASS CXTPChartAxisStrips : public CXTPChartElementCollection
{
public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPChartAxisStrips object.
	// Parameters:
	//     pAxis - The pointer to a chart axix object, to which the strips are associated.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartAxisStrips(CXTPChartAxis* pAxis);

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


public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to add a new strip to the collection.
	// Parameters:
	//     pStrip - A pointer to an axis strip object.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartAxisStrip* Add(CXTPChartAxisStrip* pStrip);


	//-----------------------------------------------------------------------
	// Summary:
	//     Use this function to get a strip at a particular index in the strips collection.
	// Parameters:
	//     nIndex - The zero based index of the item of choice.
	// Returns:
	//     An pointer to the strip object in the selected index.
	// Remarks:
	//-----------------------------------------------------------------------
	CXTPChartAxisStrip* GetAt(int nIndex) const;

public:
	void DoPropExchange(CXTPPropExchange* pPX);

#ifdef _XTP_ACTIVEX
//{{AFX_CODEJOCK_PRIVATE
	DECLARE_DISPATCH_MAP()
	DECLARE_INTERFACE_MAP()

	DECLARE_OLETYPELIB_EX(CXTPChartAxisStrips);

	afx_msg long OleGetItemCount();
	afx_msg LPDISPATCH OleGetItem(long nIndex);
	DECLARE_ENUM_VARIANT(CXTPChartAxisStrips)

	afx_msg LPDISPATCH OleAdd(LPCWSTR lpszTitle);
//}}AFX_CODEJOCK_PRIVATE
#endif

protected:
};

AFX_INLINE CXTPChartAxisStrip* CXTPChartAxisStrips::GetAt(int nIndex) const {
	return nIndex >= 0 && nIndex < m_arrElements.GetSize() ? (CXTPChartAxisStrip*)m_arrElements.GetAt(nIndex) : NULL;
}

AFX_INLINE CXTPChartString CXTPChartAxisStrip::GetName() const {
	return m_strName;
}
AFX_INLINE void CXTPChartAxisStrip::SetVisible(BOOL bVisible) {
	m_bVisible = bVisible;
	OnChartChanged();
}
AFX_INLINE BOOL CXTPChartAxisStrip::IsVisible() const {
	return m_bVisible;
}
AFX_INLINE CXTPChartFillStyle* CXTPChartAxisStrip::GetFillStyle() const {
	return m_pFillStyle;
}
AFX_INLINE CXTPChartString CXTPChartAxisStrip::GetAxisMinValue() const {
	return m_strAxisMinValue;
}
AFX_INLINE double CXTPChartAxisStrip::GetAxisMinValueInternal() const {
	return m_dAxisMinValue;
}
AFX_INLINE void CXTPChartAxisStrip::SetAxisMinValue(LPCTSTR lpszValue) {
	m_strAxisMinValue = lpszValue;
	OnChartChanged();
}
AFX_INLINE void CXTPChartAxisStrip::SetAxisMinValue(double dValue) {
	m_dAxisMinValue = dValue;
	m_strAxisMinValue.Empty();
	OnChartChanged();
}
AFX_INLINE CXTPChartString CXTPChartAxisStrip::GetAxisMaxValue() const {
	return m_strAxisMaxValue;
}
AFX_INLINE double CXTPChartAxisStrip::GetAxisMaxValueInternal() const {
	return m_dAxisMaxValue;
}
AFX_INLINE void CXTPChartAxisStrip::SetAxisMaxValue(LPCTSTR lpszValue) {
	m_strAxisMaxValue = lpszValue;
	OnChartChanged();
}
AFX_INLINE void CXTPChartAxisStrip::SetAxisMaxValue(double dValue) {
	m_dAxisMaxValue = dValue;
	m_strAxisMaxValue.Empty();
	OnChartChanged();
}
AFX_INLINE BOOL CXTPChartAxisStrip::IsLegendVisible() const {
	return m_bLegendVisible;
}
AFX_INLINE void CXTPChartAxisStrip::SetLegendVisible(BOOL bLegendVisible) {
	m_bLegendVisible = bLegendVisible;
	OnChartChanged();
}
AFX_INLINE CXTPChartColor CXTPChartAxisStrip::GetColor() const {
	return m_clrColor;
}
AFX_INLINE CXTPChartColor CXTPChartAxisStrip::GetColor2() const {
	return m_clrColor2;
}
AFX_INLINE void CXTPChartAxisStrip::SetLegendName(const CXTPChartString& lpszName) {
	m_strLegendName = lpszName;
	OnChartChanged();
}

#endif //#if !defined(__XTPCHARTAXISStripS_H__)
