//-----------------------------------------------------------------------------
// File: flextooltip.h
//
// Desc: Implements a tooltip class that displays a text string as a tooltip.
//       CFlexTooltip (derived from CFlexWnd) is used throughout the UI when
//       a control needs to have a tooltip.
//
// Copyright (C) 1999-2001 Microsoft Corporation. All Rights Reserved.
//-----------------------------------------------------------------------------

#ifndef __FLEXTOOLTIP_H__
#define __FLEXTOOLTIP_H__

struct TOOLTIPINIT
{
	HWND hWndParent;
	int iSBWidth;
	DWORD dwID;
	HWND hWndNotify;
	TCHAR tszCaption[MAX_PATH];
};

struct TOOLTIPINITPARAM
{
	HWND hWndParent;
	int iSBWidth;
	DWORD dwID;
	HWND hWndNotify;
	LPCTSTR tszCaption;
};

class CFlexToolTip : public CFlexWnd
{
	LPTSTR m_tszText;
	COLORREF m_rgbText, m_rgbBk, m_rgbSelText, m_rgbSelBk, m_rgbFill, m_rgbLine;
	HWND m_hNotifyWnd;
	DWORD m_dwID;  // Used to store offset when owned by a control
	int m_iSBWidth;  // Width of the owner window's scroll bar.  We cannot obscure the scroll bar.
	BOOL m_bEnabled;  // Whether this is enabled.  If not, we hide the underlying window.

	void InternalPaint(HDC hDC);

public:
	CFlexToolTip();
	virtual ~CFlexToolTip();

	// Statics for show control
	static UINT_PTR s_uiTimerID;
	static DWORD s_dwLastTimeStamp;  // Last time stamp for mouse move
	static TOOLTIPINIT s_TTParam;  // Parameters to initialize the tooltip
	static void SetToolTipParent(HWND hWnd) { s_TTParam.hWndParent = hWnd; }
	static void UpdateToolTipParam(TOOLTIPINITPARAM &TTParam)
	{
		s_TTParam.hWndParent = TTParam.hWndParent;
		s_TTParam.iSBWidth = TTParam.iSBWidth;
		s_TTParam.dwID = TTParam.dwID;
		s_TTParam.hWndNotify = TTParam.hWndNotify;
		if (TTParam.tszCaption)
			lstrcpy((LPTSTR)s_TTParam.tszCaption, TTParam.tszCaption);
		else
			s_TTParam.tszCaption[0] = _T('\0');
	}
	static TOOLTIPINIT &GetTTParam() { return s_TTParam; }
	static void CALLBACK TimerFunc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);

	HWND Create(HWND hParent, const RECT &rect, BOOL bVisible, int iSBWidth = 0);

	HWND GetParent() { return ::GetParent(m_hWnd); }

	virtual LRESULT OnCreate(LPCREATESTRUCT lpCreateStruct);
	virtual void OnDestroy();

private:
	void SetNotifyWindow(HWND hWnd) { m_hNotifyWnd = hWnd; }
	void SetColors(COLORREF text, COLORREF bk, COLORREF seltext, COLORREF selbk, COLORREF fill, COLORREF line);
	void SetText(LPCTSTR tszText, POINT *textpos = NULL);
	void SetID(DWORD dwID) { m_dwID = dwID; }
	void SetPosition(POINT pt, BOOL bOffsetForMouseCursor = TRUE);
	void SetSBWidth(int iSBWidth) { m_iSBWidth = iSBWidth; }

public:
	DWORD GetID() { return m_dwID; }
	void SetEnable(BOOL bEnable)
	{
		if (m_hWnd)
		{
			if (bEnable && !m_bEnabled)
			{
				ShowWindow(m_hWnd, SW_SHOW);
				Invalidate();
			}
			else if (!bEnable && m_bEnabled)
			{
				ShowWindow(m_hWnd, SW_HIDE);
				Invalidate();
			}
		}
		m_bEnabled = bEnable;
	}
	BOOL IsEnabled() { return m_bEnabled; }

	virtual void OnClick(POINT point, WPARAM fwKeys, BOOL bLeft);
	virtual void OnDoubleClick(POINT point, WPARAM fwKeys, BOOL bLeft);

protected:
	virtual void OnPaint(HDC hDC);
	virtual LRESULT WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
};

#endif
