//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
//=============================================================================//

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


#include <UtlLinkedList.h>
#include <UtlVector.h>
#include <vgui/VGUI.h>
#include <vgui_controls/Panel.h>
#include "utlsymbol.h"


namespace vgui
{

	// --------------------------------------------------------------------------------- //
	// CTreeViewListControl
	//
	// This control has N columns, with a tree view in the leftmost column.
	// --------------------------------------------------------------------------------- //

	class CTreeViewListControl : public vgui::Panel
	{
	public:

		typedef vgui::Panel BaseClass;

		CTreeViewListControl( vgui::Panel *pParent, const char *pName );

		// Set the tree view to be displayed on the left. If this isn't set, then nothing displays in here.
		void SetTreeView( vgui::TreeView *pTree );

		// Set the height of the title bar.
		void SetTitleBarInfo( vgui::HFont hFont, int titleBarHeight );

		// Set the color to draw the border lines in.
		void SetBorderColor( Color clr );
		
		// Initialize the column headers.. This info includes the tree view on the left, so this 
		void SetNumColumns( int nColumns );
		int GetNumColumns() const;
		void SetColumnInfo( int iColumn, const char *pTitle, int width );

		// Use this to render your stuff. Iterate over the rows in the tree view and 
		int GetNumRows();
		int GetTreeItemAtRow( int iRow ); // You can use m_pTree->GetItemData to get at the data for the row.

		// Use this to find out the client area to render in for each grid element.
		// The returned box is inclusive.
		// The rule is that the the top and left pixels in each grid element are reserved for lines.
		void GetGridElementBounds( int iColumn, int iRow, int &left, int &top, int &right, int &bottom );


	// Overrides.
	public:

		// This is where it recalculates the row infos.
		virtual void PerformLayout();
		
		// Usually, you'll want to override paint. After calling the base, use GetNumRows() to 
		// iterate over the data in the tree control and fill in the other columns.
		virtual void Paint();
		virtual void PostChildPaint();

		// You can override this to change the way the title bars are drawn.
		void DrawTitleBars();


	private:

		void RecalculateRows();
		void RecalculateRows_R( int index );
		void RecalculateColumns();


	private:

		vgui::TreeView *m_pTree;

		class CColumnInfo
		{
		public:
			CColumnInfo()
			{
				m_Width = m_Left = m_Right = 0;
			}

			CUtlSymbol m_Title;
			int m_Width;
			int m_Left;
			int m_Right;
		};
		CUtlVector<CColumnInfo> m_Columns;
		
		vgui::HFont m_TitleBarFont;
		int m_TitleBarHeight;

		// These are indices into the tree view.
		CUtlVector<int> m_Rows;

		Color m_BorderColor;
	};

}


#endif // TREEVIEWLISTCONTROL_H
