//-----------------------------------------------------------------------------
// File: flexlistbox.h
//
// Desc: Implements a list box control that can display a list of text strings,
//       each can be selected by mouse.  The class CFlexListBox is derived from
//       CFlexWnd.  It is used by the class CFlexComboBox when it needs to
//       expand to show the list of choices.
//
// Copyright (C) 1999-2001 Microsoft Corporation. All Rights Reserved.
//-----------------------------------------------------------------------------

#ifndef __FLEXLISTBOX_H__
#define __FLEXLISTBOX_H__


#include "flexscrollbar.h"


#define FLBF_INTEGRALHEIGHT		0x00000001

#define FLBF_DEFAULT (FLBF_INTEGRALHEIGHT)

enum {
	FLBN_SEL,
	FLBN_FINALSEL,
	FLBN_CANCEL
};

struct FLEXLISTBOXCREATESTRUCT {
	DWORD dwSize;
	DWORD dwFlags;
	HWND hWndParent;
	HWND hWndNotify;
	BOOL bVisible;
	RECT rect;
	HFONT hFont;
	COLORREF rgbText, rgbBk, rgbSelText, rgbSelBk, rgbFill, rgbLine;
	int nSBWidth;
};

struct FLEXLISTBOXITEM {
	FLEXLISTBOXITEM() : pszText(NULL), nID(-1), pData(NULL), bSelected(FALSE) {}
	FLEXLISTBOXITEM(const FLEXLISTBOXITEM &i) {nID = i.nID; pData = i.pData; bSelected = i.bSelected; SetText(i.GetText());}
	~FLEXLISTBOXITEM() {cleartext();}
	void SetText(LPCTSTR str) {cleartext(); pszText = _tcsdup(str);}
	LPCTSTR GetText() const {return pszText;}
	int nID;
	void *pData;
	BOOL bSelected;
private:
	void cleartext() {if (pszText) free(pszText); pszText = NULL;}
	LPTSTR pszText;	// allocated
};


class CFlexListBox : public CFlexWnd
{
public:
	CFlexListBox();
	~CFlexListBox();

	// creation
	BOOL Create(FLEXLISTBOXCREATESTRUCT *);
	BOOL CreateForSingleSel(FLEXLISTBOXCREATESTRUCT *);

	// cosmetics
	void SetFont(HFONT hFont);
	void SetColors(COLORREF text, COLORREF bk, COLORREF seltext, COLORREF selbk, COLORREF fill, COLORREF line);

	// setup
	int AddString(LPCTSTR);	// returns index

	// interaction
	void SelectAndShowSingleItem(int i, BOOL bScroll = TRUE);
	void SetSel(int i) {SelectAndShowSingleItem(i, FALSE);}
	void StartSel();

	LPCTSTR GetSelText();
	int GetSel();

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

private:
	HWND m_hWndNotify;

	CArray<FLEXLISTBOXITEM, FLEXLISTBOXITEM &> m_ItemArray;

	COLORREF m_rgbText, m_rgbBk, m_rgbSelText, m_rgbSelBk, m_rgbFill, m_rgbLine;
	HFONT m_hFont;
	int m_nSBWidth;

	int m_nTextHeight;

	DWORD m_dwFlags;

	int m_nSelItem;
	int m_nTopIndex;
		
	void Calc();
	void SetVertSB(BOOL);
	void SetVertSB();
	void SetSBValues();

	void InternalPaint(HDC hDC);
	
	void Notify(int code);

	POINT m_point;
	BOOL m_bOpenClick;  // True when user click the combobox to open the listbox. False after that button up msg is processed.
	BOOL m_bCapture;
	BOOL m_bDragging;

	CFlexScrollBar m_VertSB;
	BOOL m_bVertSB;
};


CFlexListBox *CreateFlexListBox(FLEXLISTBOXCREATESTRUCT *pcs);


#endif //__FLEXLISTBOX_H__
