text: //========= Copyright Valve Corporation, All rights reserved. ============//
  //
  // Purpose: This is a panel which is rendered image on top of an entity
  //
  // $Revision: $
  // $NoKeywords: $
  //=============================================================================//
  #include "cbase.h"
  #pragma warning (disable: 4514)
  #include "vgui_bitmappanel.h"
  #include <KeyValues.h>
  #include "panelmetaclassmgr.h"
  #include "vgui_bitmapimage.h"
  
  #ifdef INVASION_CLIENT_DLL
  #include "hud_commander_statuspanel.h"
  #endif
  
  // memdbgon must be the last include file in a .cpp file!!!
  #include "tier0/memdbgon.h"
  
  DECLARE_BUILD_FACTORY( CBitmapPanel );
  
  
  //-----------------------------------------------------------------------------
  // Constructor
  //-----------------------------------------------------------------------------
  CBitmapPanel::CBitmapPanel( ) :	BaseClass( NULL, "CBitmapPanel" ), m_pImage(0)
  {
  	SetPaintBackgroundEnabled( false );
  	m_szMouseOverText[ 0 ] = 0;
  	m_r = m_g = m_b = m_a = 255;
  	m_bOwnsImage = true;
  }
  
  CBitmapPanel::CBitmapPanel( vgui::Panel *pParent, const char *pName ) : 
  	BaseClass( pParent, pName ), m_pImage(0)
  {
  	SetPaintBackgroundEnabled( false );
  	m_szMouseOverText[ 0 ] = 0;
  	m_r = m_g = m_b = m_a = 255;
  	m_bOwnsImage = true;
  }
  
  CBitmapPanel::~CBitmapPanel()
  {
  	if (m_pImage && m_bOwnsImage)
  	{
  		delete m_pImage;
  		m_pImage = NULL;
  	}
  }
  
  
  //-----------------------------------------------------------------------------
  // initialization
  //-----------------------------------------------------------------------------
  bool CBitmapPanel::Init( KeyValues* pInitData )
  {
  	Assert( pInitData );
  
  	// modulation color
  	if (!ParseRGBA( pInitData, "color", m_r, m_g, m_b, m_a ))
  		return false;
  
  	int x, y, w, h;
  	if (!ParseRect( pInitData, "position", x, y, w, h ))
  		return false;
  
  	const char *mouseover = pInitData->GetString( "mousehint", "" );
  	if ( mouseover && mouseover[ 0 ] )
  	{
  		Q_strncpy( m_szMouseOverText, mouseover, sizeof( m_szMouseOverText ) );
  	}
  
  	// Set the size...
  	SetPos( x, y );
  	SetSize( w, h );
  
  	char const* pClassImage = pInitData->GetString( "material" );
  	if ( !pClassImage || !pClassImage[ 0 ] )
  		return false;
  
  	// hook in the bitmap
  	m_pImage = new BitmapImage( GetVPanel(), pClassImage );
  	m_bOwnsImage = true;
  
  	return true;
  }
  
  
  //-----------------------------------------------------------------------------
  // initialization from build-mode dialog style .res files
  //-----------------------------------------------------------------------------
  void CBitmapPanel::ApplySettings(KeyValues *pInitData)
  {
  	BaseClass::ApplySettings(pInitData);
  
  	if (m_pImage && m_bOwnsImage)
  	{
  		delete m_pImage;
  		m_pImage = NULL;
  	}
  
  	// modulation color. Can't use ParseRGBA since this uses a vgui::KeyValues (feh)
  	m_r = m_g = m_b = m_a = 255;
  	const char *pColorString = pInitData->GetString( "color", "255 255 255 255" );
  	if ( pColorString && pColorString[ 0 ] )
  	{
  		// Try and scan them in
  		int r = 0, g = 0, b = 0, a = 0;
  		int scanned;
  		scanned = sscanf( pColorString, "%i %i %i %i", &r, &g, &b, &a );
  		if ( scanned == 4 )
  		{
  			m_r = r; m_g = g; m_b = b; m_a = a;
  		}
  		else
  		{
  			Warning( "Couldn't scan four color values from %s\n", pColorString );
  		}
  	}
  
  	m_szMouseOverText[0] = 0;
  
  	char const* pClassImage = pInitData->GetString( "material" );
  	if ( pClassImage && pClassImage[ 0 ] && m_bOwnsImage )
  	{
  		// hook in the bitmap
  		m_pImage = new BitmapImage( GetVPanel(), pClassImage );
  	}
  }
  
  
  //-----------------------------------------------------------------------------
  // Draws the puppy
  //-----------------------------------------------------------------------------
  void CBitmapPanel::Paint( void )
  {
  	if ( !m_pImage )
  		return;
  
  	Color color;
  	color.SetColor( m_r, m_g, m_b, m_a );
  	m_pImage->SetColor( color );
  	m_pImage->DoPaint( GetVPanel() );
  }
  
  
  //-----------------------------------------------------------------------------
  // Purpose: 
  //-----------------------------------------------------------------------------
  void CBitmapPanel::OnCursorEntered()
  {
  #ifdef INVASION_CLIENT_DLL
  	if ( m_szMouseOverText[ 0 ] )
  	{
  		StatusPrint( TYPE_HINT, "%s", m_szMouseOverText );
  	}
  #endif
  }
  
  
  //-----------------------------------------------------------------------------
  // Purpose: 
  //-----------------------------------------------------------------------------
  void CBitmapPanel::OnCursorExited()
  {
  #ifdef INVASION_CLIENT_DLL
  	if ( m_szMouseOverText[ 0 ] )
  	{
  		StatusClear();
  	}
  #endif
  }
  
  
  //-----------------------------------------------------------------------------
  // Purpose: 
  // Output : char const
  //-----------------------------------------------------------------------------
  const char *CBitmapPanel::GetMouseOverText( void )
  {
  	return m_szMouseOverText;
  }
  
  
  //-----------------------------------------------------------------------------
  // Purpose: Sets up the panel
  //			Used by panels that aren't created by the commander overlay factory (i.e. aren't parsed from a keyvalues file)
  //-----------------------------------------------------------------------------
  void CBitmapPanel::SetImage( BitmapImage *pImage )
  {
  	m_pImage = pImage;
  	m_bOwnsImage = (pImage == NULL);
  
  	// Get the color from the image
  	if ( m_pImage )
  	{
  		m_pImage->GetColor( m_r, m_g, m_b, m_a );
  	}
  }
  
  //-----------------------------------------------------------------------------
  // Purpose: Set image data directly
  //-----------------------------------------------------------------------------
  void CBitmapPanel::SetBitmap( const Bitmap_t &bitmap )
  {
  
  	// Make sure we have an image that we own
  	if ( m_pImage == NULL || !m_bOwnsImage )
  	{
  		delete m_pImage;
  		m_pImage = new BitmapImage( GetVPanel(), NULL );
  		m_bOwnsImage = true;
  	}
  
  	// Set the bitmap
  	m_pImage->SetBitmap( bitmap );
  }
  