#ifndef CARDBUTTON_INCLUDED
#define CARDBUTTON_INCLUDED

#define MAXBUTTONTEXT 64

class CardButton
{
	friend class CardWindow;

	//
	//	Constructor is PRIVATE - only a
	//  CardWindow can create buttons!
	//
	CardButton(CardWindow &parent, int id, TCHAR *szText, UINT style, bool visible,
		int x, int y, int width, int height);

	~CardButton();

public:

	void SetStyle(UINT uStyle);
	UINT GetStyle();

	void SetText(TCHAR *fmt, ...);
	void SetFont(HFONT font);

	void SetPlacement(UINT xJustify, UINT yJustify, int xAdjust, int yAdjust);

	void SetForeColor(COLORREF cr);
	void SetBackColor(COLORREF cr);

	void Move(int x, int y, int width, int height);
	void Show(bool fShow);
	void Redraw();
	int  Id();

	void SetIcon(HICON hicon, bool fRedraw);

	void SetButtonProc(pButtonProc proc);

	CardWindow &GetCardWindow() { return parentWnd; }

	bool Lock();
	bool UnLock();

	static COLORREF GetHighlight(COLORREF crBase);
	static COLORREF GetShadow(COLORREF crBase);
	static COLORREF GetFace(COLORREF crBase);

private:

	//
	//	Private member functions
	//
	void AdjustPosition(int winwidth, int winheight);

	void DrawRect(HDC hdc, RECT *rect, bool fNormal);
	void Draw(HDC hdc, bool fNormal);
	void Clip(HDC hdc);

	int  OnLButtonDown(HWND hwnd, int x, int y);
	int  OnMouseMove(HWND hwnd, int x, int y);
	int  OnLButtonUp(HWND hwnd, int x, int y);

	//
	//	Private members
	//
	CardWindow &parentWnd;

	RECT	rect;
	int		id;
	UINT	uStyle;
	bool	fVisible;

	int		xadjust;
	int		xjustify;
	int		yadjust;
	int		yjustify;

	HICON	hIcon;
	HFONT   hFont;

	TCHAR	szText[MAXBUTTONTEXT];

	COLORREF crBack;
	COLORREF crText;
	COLORREF crHighlight;
	COLORREF crShadow;
	COLORREF crShadow2;

	bool	fMouseDown;
	bool    fButtonDown;

	HANDLE	mxlock;

	pButtonProc	ButtonCallback;
};

#endif /* CARDBUTTON_INCLUDED */