//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
//=============================================================================

#ifndef BUYPRESET_LISTBOX_H
#define BUYPRESET_LISTBOX_H
#ifdef _WIN32
#pragma once
#endif

#include <vgui/VGUI.h>
#include <vgui_controls/Panel.h>

#include <utlvector.h>

//--------------------------------------------------------------------------------------------------------------
/**
 *  ListBox-style control with behavior needed by weapon lists for BuyPreset editing
 */
class BuyPresetListBox : public vgui::Panel
{
	DECLARE_CLASS_SIMPLE( BuyPresetListBox, vgui::Panel );

public:
	BuyPresetListBox( vgui::Panel *parent, char const *panelName );
	~BuyPresetListBox();

    class IBuyPresetListBoxUserData
    {
    protected:
        friend BuyPresetListBox;
        virtual ~IBuyPresetListBoxUserData() {};
    };

	virtual int AddItem( vgui::Panel *panel, IBuyPresetListBoxUserData *userData );	///< Adds an item to the end of the listbox.  UserData is assumed to be a pointer that will be deleted by the listbox if non-NULL.
	virtual int	GetItemCount( void ) const;						///< Returns the number of items in the listbox
	void SwapItems( int index1, int index2 );					///< Exchanges two items in the listbox
	void MakeItemVisible( int index );							///< Try to ensure that the given index is visible

	vgui::Panel * GetItemPanel( int index ) const;				///< Returns the panel in the given index, or NULL
    IBuyPresetListBoxUserData * GetItemUserData( int index );						///< Returns the userData in the given index, or NULL
	void SetItemUserData( int index, IBuyPresetListBoxUserData * userData );			///< Sets the userData in the given index

	virtual void RemoveItem( int index );						///< Removes an item from the table (changing the indices of all following items), deleting the panel and userData
	virtual void DeleteAllItems();								///< clears the listbox, deleting all panels and userData

	// overrides
	virtual void OnSizeChanged(int wide, int tall);				////< Handles size changes
	MESSAGE_FUNC_INT( OnSliderMoved, "ScrollBarSliderMoved", position );	///< Handles slider being dragged
	virtual void OnMouseWheeled(int delta);						///< Scrolls the list according to the mouse wheel movement
	virtual void MoveScrollBarToTop();							///< Moves slider to the top

protected:

	virtual int	computeVPixelsNeeded( void );					///< Computes vertical pixels needed by listbox contents

	virtual void PerformLayout();								///< Positions listbox items, etc after internal changes
	virtual void ApplySchemeSettings( vgui::IScheme *pScheme );	///< Loads colors, fonts, etc

	virtual void OnCommand( const char *command );				///< Passes commands up to the parent

private:
	enum { SCROLLBAR_SIZE = 18, DEFAULT_HEIGHT = 24, PANELBUFFER = 5 };

	typedef struct dataitem_s
	{
		vgui::Panel *panel;
        IBuyPresetListBoxUserData * userData;
	} DataItem;
	CUtlVector< DataItem >	m_items;

	vgui::ScrollBar			*m_vbar;
	vgui::Panel				*m_pPanelEmbedded;

	int						m_iScrollbarSize;
	int						m_iDefaultHeight;
	int						m_iPanelBuffer;

	int						m_visibleIndex;
	int						m_lastSize;
};

#endif // BUYPRESET_LISTBOX_H