csgo-2018-source/hammer/iconcombobox.cpp
2021-07-24 21:11:47 -07:00

382 lines
11 KiB
C++

//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include <stdafx.h>
#include "IconComboBox.h"
// memdbgon must be the last include file in a .cpp file!!!
#include <tier0/memdbgon.h>
//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CIconComboBox::CIconComboBox()
{
}
//-----------------------------------------------------------------------------
// Purpose: Deconstructor
//-----------------------------------------------------------------------------
CIconComboBox::~CIconComboBox()
{
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CIconComboBox::Init( void )
{
// initialize the icon size
m_IconSize.cx = GetSystemMetrics( SM_CXICON );
m_IconSize.cy = GetSystemMetrics( SM_CYICON );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
int CIconComboBox::AddIcon( LPCTSTR pIconName )
{
//
// create/load an icon from file
//
// NULL - no icons in file
// 1 - not a proper icon file
//
HICON hIcon = ExtractIcon( AfxGetInstanceHandle(), pIconName, 0 );
if( ( hIcon == ( HICON )1 ) || !hIcon )
return CB_ERR;
//
// add the icon to the combo box - returning the index
//
// CB_ERR - general error adding icon
// CB_ERRSPACE - insufficient space necessary to add icon
//
int ndx = CComboBox::AddString( pIconName );
if( ( ndx == CB_ERR ) || ( ndx == CB_ERRSPACE ) )
return ndx;
//
// associate the icon with the index
//
// CB_ERR - general error
//
int result = SetItemData( ndx, ( DWORD )hIcon );
if( result == CB_ERR )
return result;
// return the icon index
return ndx;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
int CIconComboBox::InsertIcon( LPCTSTR pIconName, int ndx )
{
//
// create an icon from file
//
// NULL - no icons in file
// 1 - not a proper icon file
//
HICON hIcon = ExtractIcon( AfxGetInstanceHandle(), pIconName, 0 );
if( ( hIcon == ( HICON )1 ) || !hIcon )
return CB_ERR;
//
// insert the icon into the combo box -- returning the index
//
// CB_ERR - general error adding icon
// CB_ERRSPACE - insufficient space necessary to add icon
//
int result = CComboBox::InsertString( ndx, pIconName );
if( ( result == CB_ERR ) || ( result == CB_ERRSPACE ) )
return result;
//
// associate the icon with the index
//
// CB_ERR - general error
//
result = SetItemData( ndx, ( DWORD )hIcon );
if( result == CB_ERR )
return result;
// return the icon index
return ndx;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
int CIconComboBox::SelectIcon( LPCTSTR pIconName )
{
//
// search the combo box list for the given string, -1 = search the whole list
//
// CB_ERR - unsuccessful search
//
int ndx = CComboBox::FindStringExact( -1, pIconName );
if( ndx == CB_ERR )
return CB_ERR;
// set the selection current
return CComboBox::SetCurSel( ndx );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
int CIconComboBox::SelectIcon( int ndx )
{
// set the selection current
return CComboBox::SetCurSel( ndx );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
int CIconComboBox::DeleteIcon( LPCTSTR pIconName )
{
//
// search the combo box list for the given string, -1 = search the whole list
//
// CB_ERR - unsuccessful search
//
int ndx = CComboBox::FindStringExact( -1, pIconName );
if( ndx == CB_ERR )
return CB_ERR;
// remove the icon from the combo box
return CComboBox::DeleteString( ndx );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
int CIconComboBox::DeleteIcon( int ndx )
{
// remove the icon from the combo box
return CComboBox::DeleteString( ndx );
}
//-----------------------------------------------------------------------------
// Purpose: don't allow the icon combo box to "AddString"
//-----------------------------------------------------------------------------
int CIconComboBox::AddString( LPCTSTR lpszString )
{
assert( FALSE );
return CB_ERR;
}
//-----------------------------------------------------------------------------
// Purpose: don't allow the icon combo box to "InsertString"
//-----------------------------------------------------------------------------
int CIconComboBox::InsertString( int nIndex, LPCTSTR lpszString )
{
assert( FALSE );
return CB_ERR;
}
//-----------------------------------------------------------------------------
// Purpose: don't allow the icon combo box to "DeleteString"
//-----------------------------------------------------------------------------
int CIconComboBox::DeleteString( int nIndex )
{
assert( FALSE );
return CB_ERR;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CIconComboBox::MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct )
{
lpMeasureItemStruct->itemWidth = m_IconSize.cx;
lpMeasureItemStruct->itemHeight = m_IconSize.cy + 1;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CIconComboBox::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
CBrush *pOldBrush = NULL;
CPen *pOldPen = NULL;
//
// the icon is "disabled"
//
if( !IsWindowEnabled() )
{
SetDisabledBrushAndPen( lpDrawItemStruct, &pOldBrush, &pOldPen );
OnDrawIcon( lpDrawItemStruct );
ResetBrushAndPen( lpDrawItemStruct, pOldBrush, pOldPen );
return;
}
//
// the icon is "selected"
//
if( ( lpDrawItemStruct->itemState & ODS_SELECTED ) &&
( lpDrawItemStruct->itemAction & ( ODA_SELECT | ODA_DRAWENTIRE ) ) )
{
SetSelectedBrushAndPen( lpDrawItemStruct, &pOldBrush, &pOldPen );
OnDrawIcon( lpDrawItemStruct );
ResetBrushAndPen( lpDrawItemStruct, pOldBrush, pOldPen );
}
//
// the icon is "un-selected"
//
if( !( lpDrawItemStruct->itemState & ODS_SELECTED ) &&
( lpDrawItemStruct->itemAction & ( ODA_SELECT | ODA_DRAWENTIRE ) ) )
{
SetUnSelectedBrushAndPen( lpDrawItemStruct, &pOldBrush, &pOldPen );
OnDrawIcon( lpDrawItemStruct );
ResetBrushAndPen( lpDrawItemStruct, pOldBrush, pOldPen );
}
//
// icon gains focus
//
if( lpDrawItemStruct->itemAction & ODA_FOCUS )
{
// get the device context
CDC* pDC = CDC::FromHandle( lpDrawItemStruct->hDC );
// render the focus rectangle
pDC->DrawFocusRect( &lpDrawItemStruct->rcItem );
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CIconComboBox::OnDrawIcon( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
// any items to draw?
if( GetCount() == 0 )
return;
// get the device context - to draw
CDC* pDC = CDC::FromHandle( lpDrawItemStruct->hDC );
// get the current icon to render
HICON hIcon = ( HICON )lpDrawItemStruct->itemData;
if( !hIcon )
return;
// calculate the icon's upper left corner
int UpperLeftX = lpDrawItemStruct->rcItem.left +
( ( lpDrawItemStruct->rcItem.right - lpDrawItemStruct->rcItem.left ) / 2 ) -
( m_IconSize.cx / 2 );
int UpperLeftY = lpDrawItemStruct->rcItem.top +
( ( lpDrawItemStruct->rcItem.bottom - lpDrawItemStruct->rcItem.top ) / 2 ) -
( m_IconSize.cy / 2 );
// render the icon
pDC->DrawIcon( UpperLeftX, UpperLeftY, hIcon );
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CIconComboBox::ResetBrushAndPen( LPDRAWITEMSTRUCT lpDrawItemStruct,
CBrush *pBrush, CPen *pPen )
{
// get the device context
CDC* pDC = CDC::FromHandle( lpDrawItemStruct->hDC );
// reset brush and pen
pDC->SelectObject( pBrush );
pDC->SelectObject( pPen );
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CIconComboBox::SetDisabledBrushAndPen( LPDRAWITEMSTRUCT lpDrawItemStruct,
CBrush **ppOldBrush, CPen **ppOldPen )
{
// get the device context
CDC* pDC = CDC::FromHandle( lpDrawItemStruct->hDC );
// set brush and pen to light gray
CBrush brushDisabled( RGB( 192, 192, 192 ) );
CPen penDisabled( PS_SOLID, 1, RGB( 192, 192, 192 ) );
// set the brush and pen current -- saving the old brush and pen state
*ppOldBrush = pDC->SelectObject( &brushDisabled );
*ppOldPen = pDC->SelectObject( &penDisabled );
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CIconComboBox::SetUnSelectedBrushAndPen( LPDRAWITEMSTRUCT lpDrawItemStruct,
CBrush **ppOldBrush, CPen **ppOldPen )
{
// get the device context
CDC* pDC = CDC::FromHandle( lpDrawItemStruct->hDC );
// set the brush and pen "un-highlighted"
CBrush brushUnSelected( GetSysColor( COLOR_WINDOW ) );
CPen penUnSelected( PS_SOLID, 1, GetSysColor( COLOR_WINDOW ) );
// set the brush and pen current -- saving the old brush and pen state
*ppOldBrush = pDC->SelectObject( &brushUnSelected );
*ppOldPen = pDC->SelectObject( &penUnSelected );
//
// set some addition render state - background and text color
//
pDC->Rectangle( &lpDrawItemStruct->rcItem );
pDC->SetBkColor( GetSysColor( COLOR_WINDOW ) );
pDC->SetTextColor( GetSysColor( COLOR_WINDOWTEXT ) );
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CIconComboBox::SetSelectedBrushAndPen( LPDRAWITEMSTRUCT lpDrawItemStruct,
CBrush **ppOldBrush, CPen **ppOldPen )
{
// get the device context
CDC* pDC = CDC::FromHandle( lpDrawItemStruct->hDC );
// set the brush and pen "highlighted"
CBrush brushSelected( GetSysColor( COLOR_HIGHLIGHT ) );
CPen penSelected( PS_SOLID, 1, GetSysColor( COLOR_HIGHLIGHT ) );
// set the brush and pen current -- saving the old brush and pen state
*ppOldBrush = pDC->SelectObject( &brushSelected );
*ppOldPen = pDC->SelectObject( &penSelected );
//
// set some addition render state - background and text color
//
pDC->Rectangle( &lpDrawItemStruct->rcItem );
pDC->SetBkColor( GetSysColor( COLOR_HIGHLIGHT ) );
pDC->SetTextColor( GetSysColor( COLOR_HIGHLIGHTTEXT ) );
}