#ifndef _SELTRACK_H_
#define _SELTRACK_H_

// This file defines the class used to handle the selection rectangle
// complete with resize handles

BOOL InitSelectionTracking();
void CleanupSelectionTracking();

/////////////////////////////////////////////////////////////////////////////
// CSelectionTracker - simple rectangular tracking rectangle w/resize handles

class CSelectionTracker
{
public:
// Constructor / Destructor
	CSelectionTracker();
	virtual ~CSelectionTracker();

	BOOL Init(); // You must call Init after construction

// Style Flags
	enum StyleFlags
	{
		solidLine = 1, dottedLine = 2, hatchedBorder = 4,
		resizeInside = 8, resizeOutside = 16, hatchInside = 32,
		lineSelection = 64
	};

// Hit-Test codes
	enum TrackerHit
	{
		hitNothing = -1,
		hitTopLeft = 0, hitTopRight = 1, hitBottomRight = 2, hitBottomLeft = 3,
		hitTop = 4, hitRight = 5, hitBottom = 6, hitLeft = 7, hitMiddle = 8
	};

// Attributes
	UINT m_uStyle;      // current state
	CRect m_rect;        // current position (always in pixels)
	CSize m_sizeMin;    // minimum X and Y size during track operation
	int m_nHandleSize;  // size of resize handles (default from WIN.INI)

// Operations
	void Draw(HDC hdc) const;
	void GetTrueRect(LPRECT lpTrueRect) const;
	BOOL SetCursor(HWND hwnd,  LPARAM lParam) const;
	BOOL Track(HWND hwnd, CPoint point, BOOL bAllowInvert = FALSE,
		HWND hwndClipTo = NULL);
	BOOL TrackRubberBand(HWND hwnd, CPoint point, BOOL bAllowInvert = TRUE);
	int HitTest(CPoint point) const;
	int NormalizeHit(int nHandle) const;

private:

	BOOL _bAllowInvert;    // flag passed to Track or TrackRubberBand
	CRect _rectLast;
	CSize _sizeLast;
	CSize _sizeMin;
	BOOL _bErase;          // TRUE if _DrawTrackerRect is called for erasing
	BOOL _bFinalErase;     // TRUE if _DragTrackerRect called for final erase

	// implementation helpers
	void _DrawTrackerRect(LPCRECT lpRect, HWND hwndClipTo, HDC hdc, HWND hwnd);
	void _AdjustRect(int nHandle, LPRECT lpRect);
	void _OnChangedRect(const CRect& rectOld);
	UINT _GetHandleMask() const;
	int _HitTestHandles(CPoint point) const;
	void _GetHandleRect(int nHandle, CRect* pHandleRect) const;
	void _GetModifyPointers(int nHandle, int** ppx, int** ppy, int* px, int*py);
	int _GetHandleSize(LPCRECT lpRect = NULL) const;
	BOOL _TrackHandle(int nHandle, HWND hwnd, CPoint point, HWND hwndClipTo);
	void _DrawDragRect(HDC hdc, LPCRECT lpRect, SIZE size, LPCRECT lpRectLast, SIZE sizeLast);
};

#endif