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

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

#include "vgui_controls/EditablePanel.h"
#include "datamodel/dmehandle.h"
#include "tier1/utlntree.h"


//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
class CBaseAnimationSetEditor;
class CDmeAnimationSet;

namespace vgui
{
	class TreeView;
	class IScheme;
	class Menu;
};


//-----------------------------------------------------------------------------
// Panel which shows a tree of controls
//-----------------------------------------------------------------------------
class CBaseAnimSetControlGroupPanel : public vgui::EditablePanel
{
	DECLARE_CLASS_SIMPLE( CBaseAnimSetControlGroupPanel, EditablePanel );
public:
	CBaseAnimSetControlGroupPanel( vgui::Panel *parent, char const *className, CBaseAnimationSetEditor *editor );
	virtual ~CBaseAnimSetControlGroupPanel();

	void ChangeAnimationSet( CDmeAnimationSet *newAnimSet );
	virtual void ApplySchemeSettings( vgui::IScheme *pScheme );

protected:

	MESSAGE_FUNC_INT( OnTreeViewItemSelected, "TreeViewItemSelected", itemIndex );
	MESSAGE_FUNC_INT( OnTreeViewItemDeselected, "TreeViewItemDeselected", itemIndex );
	MESSAGE_FUNC( OnTreeViewItemSelectionCleared, "TreeViewItemSelectionCleared" );

protected:
	enum
	{
		EP_EXPANDED = (1<<0),
		EP_SELECTED = (1<<1),
	};

	struct TreeItem_t
	{
		TreeItem_t() : m_pAttributeName() {}
		CUtlString m_pAttributeName;
	};

	// Used to build a list of open element for refresh
	struct TreeInfo_t
	{
		TreeInfo_t() : m_nFlags( 0 ) {}
		TreeItem_t	m_Item;	// points to the element referenced in an element array
		int			m_nFlags;
	};

	typedef CUtlNTree< TreeInfo_t, int > OpenItemTree_t;
	// Expands all items in the open item tree if they exist
	void ExpandOpenItems( OpenItemTree_t &tree, int nOpenTreeIndex, int nItemIndex, bool makeVisible );
	// Builds a list of open items
	void BuildOpenItemList( OpenItemTree_t &tree, int nParent, int nItemIndex );
	void FillInDataForItem( TreeItem_t &item, int nItemIndex );
	// Finds the tree index of a child matching the particular element + attribute
	int FindTreeItem( int nParentIndex, const TreeItem_t &info );

	vgui::DHANDLE< CBaseAnimationSetEditor >	m_hEditor;

	vgui::DHANDLE< vgui::TreeView >		m_hGroups;
	CUtlVector< int >					m_hSelectableIndices;

	CDmeHandle< CDmeAnimationSet >		m_AnimSet;

	bool								m_bStartItemWasSelected;
	CUtlVector< int >					m_SavedSelectedGroups;
	CUtlSymbolTable						m_SliderNames;
	CUtlVector< CDmeHandle< CDmElement > > m_GroupList;

	friend class CAnimGroupTree;
};

#endif // BASEANIMSETCONTROLGROUPPANEL_H