//======== (C) Copyright 1999, 2000 Valve, L.L.C. All rights reserved. ========
//
// The copyright to the contents herein is the property of Valve, L.L.C.
// The contents may be used and/or copied only with the written permission of
// Valve, L.L.C., or in accordance with the terms and conditions stipulated in
// the agreement/contract under which the contents have been supplied.
//
// Purpose: 
//
// $Workfile:     $
// $NoKeywords: $
//=============================================================================

#if !defined( COMMANDEROVERLAY_H )
#define COMMANDEROVERLAY_H

#ifdef _WIN32
#pragma once
#endif

#include "PanelMetaClassMgr.h"


//-----------------------------------------------------------------------------
// forward declarations
//-----------------------------------------------------------------------------
class C_BaseEntity;
class KeyValues;


//-----------------------------------------------------------------------------
// Overlay handle
//-----------------------------------------------------------------------------

typedef unsigned short OverlayHandle_t;
enum
{
	OVERLAY_HANDLE_INVALID = (OverlayHandle_t)~0
};

//-----------------------------------------------------------------------------
// Purpose: Singleton class responsible for managing overlay elements 
//-----------------------------------------------------------------------------
class IHudCommanderOverlayMgr
{
public:
//	// Call this when the game starts up + shuts down
	virtual void GameInit() = 0;
	virtual void GameShutdown() = 0;

	// Call this when the level starts up + shuts down
	virtual void LevelInit( ) = 0;
	virtual void LevelShutdown() = 0;

	// add an overlay element to the commander mode, returns a handle to it
	virtual OverlayHandle_t AddOverlay( char const* pOverlayName, C_BaseEntity* pEntity, vgui::Panel *pParent = NULL ) = 0;

	// removes a particular overlay
	virtual void RemoveOverlay( OverlayHandle_t handle ) = 0;

	// Call this once a frame...
	virtual void Tick( ) = 0;

	// Call this when commander mode is enabled or disabled
	virtual void Enable( bool enable ) = 0;

protected:
	// Don't delete me!
	virtual ~IHudCommanderOverlayMgr() {}
};


//-----------------------------------------------------------------------------
// Returns the singleton commander overlay interface
//-----------------------------------------------------------------------------
IHudCommanderOverlayMgr* HudCommanderOverlayMgr();


//-----------------------------------------------------------------------------
// Helper class for entities to join the list of entities to render on screen
//-----------------------------------------------------------------------------
class CPanelRegistration
{
public:
	CPanelRegistration( ) : m_Overlay(OVERLAY_HANDLE_INVALID) {}

	~CPanelRegistration()
	{
		HudCommanderOverlayMgr()->RemoveOverlay( m_Overlay );
	}

	void Activate( C_BaseEntity* pEntity, char const* pOverlayName, bool active )
	{
		if( active )
		{
			AddOverlay( pEntity, pOverlayName );
		}
		else
		{
			RemoveOverlay();
		}
	}

	void Activate( C_BaseEntity* pEntity, char const* pOverlayName, vgui::Panel *pParent, int sortOrder, bool active )
	{
		if( active )
		{
			AddOverlay( pEntity, pOverlayName, pParent );
		}
		else
		{
			RemoveOverlay();
		}
	}


	void AddOverlay( C_BaseEntity *pEntity, const char *pOverlayName, vgui::Panel *pParent = NULL )
	{
		RemoveOverlay();
		m_Overlay = HudCommanderOverlayMgr()->AddOverlay( pOverlayName, pEntity, pParent );
	}

	void RemoveOverlay()
	{
		if( m_Overlay != OVERLAY_HANDLE_INVALID )
		{
			HudCommanderOverlayMgr()->RemoveOverlay( m_Overlay );
			m_Overlay = OVERLAY_HANDLE_INVALID;
		}
	}


private:
	OverlayHandle_t m_Overlay;
};


//-----------------------------------------------------------------------------
// Macros for help with simple registration of panels
// Put DECLARE_ENTITY_PANEL() in your class definition
// and ENTITY_PANEL_ACTIVATE( "name" ) in the entity's SetDormant call
//-----------------------------------------------------------------------------
#define DECLARE_ENTITY_PANEL()							CPanelRegistration m_OverlayPanel
#define ENTITY_PANEL_ACTIVATE( _pOverlayName, _active )	m_OverlayPanel.Activate( this, _pOverlayName, _active )


//-----------------------------------------------------------------------------
// Helper macro to make overlay factories one line of code. Use like this:
//	DECLARE_OVERLAY_FACTORY( CEntityImagePanel, "image" );
//-----------------------------------------------------------------------------
#define DECLARE_OVERLAY_FACTORY( _PanelClass, _nameString )	\
	DECLARE_PANEL_FACTORY( _PanelClass, C_BaseEntity, _nameString )

#define DECLARE_OVERLAY_POINT_FACTORY( _PanelClass, _nameString )	\
	DECLARE_PANEL_FACTORY( _PanelClass, void, _nameString )


#endif // COMMANDEROVERLAY_H