// XTPControlProgress.h : interface for the CXTPControlProgress class.
//
// This file is a part of the XTREME COMMANDBARS 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(__XTPCONTOLPROGRESS_H__)
#define __XTPCONTOLPROGRESS_H__
//}}AFX_CODEJOCK_PRIVATE

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


class CXTPProgressPaintManager;
class CXTPWinThemeWrapper;

//===========================================================================
// Summary:
//     CXTPControlProgressBase is base class for all progress objects
//===========================================================================
class _XTP_EXT_CLASS CXTPProgressBase
{
public:

	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPProgressBase object
	//-----------------------------------------------------------------------
	CXTPProgressBase();

	//-----------------------------------------------------------------------
	// Summary:
	//     Destroys a CXTPProgressBase object, handles cleanup and deallocation
	//-----------------------------------------------------------------------
	virtual ~CXTPProgressBase();

public:

	//----------------------------------------------------------------------
	// Summary:
	//     Sets the upper and lower limits of the progress bar control's range.
	// Parameters:
	//     nLower - Lower limit of the progress bar control's range.
	//     nUpper - Upper limit of the progress bar control's range.
	//----------------------------------------------------------------------
	void SetRange(int nLower, int nUpper);

	//----------------------------------------------------------------------
	// Summary:
	//     Gets the upper and lower limits of the progress bar control's range.
	// Parameters:
	//     nLower - Lower limit of the progress bar control's range.
	//     nUpper - Upper limit of the progress bar control's range.
	//----------------------------------------------------------------------
	void GetRange(int& nLower, int& nUpper) const;

	//----------------------------------------------------------------------
	// Summary:
	//     Gets the current position of the progress bar, whose return value
	//     is always between the values for the Max and Min properties, inclusive.
	// Returns:
	//     Current position of the progress bar.
	//----------------------------------------------------------------------
	int GetPos() const;

	//----------------------------------------------------------------------
	// Summary:
	//     Sets the current position of the progress bar, whose return value
	//     is always between the values for the Max and Min properties, inclusive.
	// Parameters:
	//     nPos - Position to move progress bar.
	//----------------------------------------------------------------------
	void SetPos(int nPos);

public:
	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to get bounding rectangle of progressbar
	//----------------------------------------------------------------------
	virtual CRect GetProgressRect() = 0;

protected:
	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to redraw progress bar
	//----------------------------------------------------------------------
	virtual void RedrawProgress() = 0;

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to retrieve pointer to CXTPProgressPaintManager
	//----------------------------------------------------------------------
	virtual CXTPProgressPaintManager* GetProgressPaintManager() const = 0;

protected:
	int m_nMin;     // Minimum
	int m_nMax;     // Maximum
	int m_nPos;     // Current position

};


//===========================================================================
// Summary:
//     CXTPControlProgress is a CXTPControl derived class.
//     It represents an progress control.
//===========================================================================
class _XTP_EXT_CLASS CXTPControlProgress : public CXTPControl, public CXTPProgressBase
{
	DECLARE_XTP_CONTROL(CXTPControlProgress)
public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPControlProgress object
	//-----------------------------------------------------------------------
	CXTPControlProgress();

protected:
	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to determine the size of the control.
	// Parameters:
	//     pDC - Pointer to a valid device context
	// Returns:
	//     Size of the control.
	//----------------------------------------------------------------------
	virtual CSize GetSize(CDC* pDC);

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to draw the control.
	// Parameters:
	//     pDC - Pointer to a valid device context.
	//----------------------------------------------------------------------
	virtual void Draw(CDC* pDC);

protected:

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to redraw the progress bar.
	//-----------------------------------------------------------------------
	virtual void RedrawProgress();

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to retrieve the paint manager of the progress
	//     bar.
	// Returns:
	//     A pointer to a CXTPProgressPaintManager object
	//-----------------------------------------------------------------------
	virtual CXTPProgressPaintManager* GetProgressPaintManager() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the bounding rectangle of the control.
	// Returns:
	//     The bounding rectangle of the control.
	//-----------------------------------------------------------------------
	virtual CRect GetProgressRect();

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called when the user clicks the control.
	// Parameters:
	//     bKeyboard - TRUE if the control is selected using the keyboard.
	//     pt        - Mouse cursor position.
	//----------------------------------------------------------------------
	virtual void OnClick(BOOL bKeyboard = FALSE, CPoint pt = CPoint(0, 0));


protected:

	//-----------------------------------------------------------------------
	// Summary:
	//     This method makes a copy of the progress bar.
	// Parameters:
	//     pControl - Control needed to be copied.
	//     bRecursive - TRUE to copy recursively.
	//-----------------------------------------------------------------------
	void Copy(CXTPControl* pControl, BOOL bRecursive = FALSE);

	//-----------------------------------------------------------------------
	// Summary:
	//     Reads or writes this object from or to an archive.
	// Parameters:
	//     pPX - A CXTPPropExchange object to serialize to or from.
	//----------------------------------------------------------------------
	void DoPropExchange(CXTPPropExchange* pPX);

};


//===========================================================================
// Summary: CXTPProgressPaintManager object
//===========================================================================
class _XTP_EXT_CLASS CXTPProgressPaintManager
{
public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPProgressPaintManager object
	// Parameters:
	//     pPaintManager - PaintManager of commandbars
	//-----------------------------------------------------------------------
	CXTPProgressPaintManager(CXTPPaintManager* pPaintManager);

	//-----------------------------------------------------------------------
	// Summary:
	//     Destroys a CXTPProgressPaintManager object, handles cleanup and deallocation
	//-----------------------------------------------------------------------
	virtual ~CXTPProgressPaintManager();

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called to draw progress
	// Parameters:
	//     pDC - Pointer to device context
	//     pProgressBar - Progress to draw
	//-----------------------------------------------------------------------
	virtual void DrawProgress(CDC* pDC, CXTPProgressBase* pProgressBar);

	//-------------------------------------------------------------------------
	// Summary:
	//     Recalculates metrics
	//-------------------------------------------------------------------------
	virtual void RefreshMetrics();

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns parent paintmanager object
	//-----------------------------------------------------------------------
	CXTPPaintManager* GetPaintManager() const;

protected:
	CXTPWinThemeWrapper* m_themeProgress;        // Theme wrapper
	CXTPPaintManager* m_pPaintManager;          // Pointer to parent PaintManager

public:
	int m_cyProgress;           // Progress height
};

AFX_INLINE  int CXTPProgressBase::GetPos() const {
	return m_nPos;
}
AFX_INLINE CXTPPaintManager* CXTPProgressPaintManager::GetPaintManager() const {
	return m_pPaintManager;
}


#endif //#if !defined(__XTPCONTOLPROGRESS_H__)