diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /hammer/iconcombobox.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'hammer/iconcombobox.cpp')
| -rw-r--r-- | hammer/iconcombobox.cpp | 381 |
1 files changed, 381 insertions, 0 deletions
diff --git a/hammer/iconcombobox.cpp b/hammer/iconcombobox.cpp new file mode 100644 index 0000000..3c980db --- /dev/null +++ b/hammer/iconcombobox.cpp @@ -0,0 +1,381 @@ +//========= Copyright 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 ) ); +} + + |