#include "stdafx.h" #include "UIOption.h" namespace DuiLib { COptionUI::COptionUI() : m_bSelected(false), m_dwSelectedBkColor(0), m_dwSelectedTextColor(0) { } COptionUI::~COptionUI() { if( !m_sGroupName.IsEmpty() && m_pManager ) m_pManager->RemoveOptionGroup(m_sGroupName, this); } LPCTSTR COptionUI::GetClass() const { return _T("OptionUI"); } LPVOID COptionUI::GetInterface(LPCTSTR pstrName) { if( _tcscmp(pstrName, DUI_CTR_OPTION) == 0 ) return static_cast(this); return CButtonUI::GetInterface(pstrName); } void COptionUI::SetManager(CPaintManagerUI* pManager, CControlUI* pParent, bool bInit) { CControlUI::SetManager(pManager, pParent, bInit); if( bInit && !m_sGroupName.IsEmpty() ) { if (m_pManager) m_pManager->AddOptionGroup(m_sGroupName, this); } } LPCTSTR COptionUI::GetGroup() const { return m_sGroupName; } void COptionUI::SetGroup(LPCTSTR pStrGroupName) { if( pStrGroupName == NULL ) { if( m_sGroupName.IsEmpty() ) return; m_sGroupName.Empty(); } else { if( m_sGroupName == pStrGroupName ) return; if (!m_sGroupName.IsEmpty() && m_pManager) m_pManager->RemoveOptionGroup(m_sGroupName, this); m_sGroupName = pStrGroupName; } if( !m_sGroupName.IsEmpty() ) { if (m_pManager) m_pManager->AddOptionGroup(m_sGroupName, this); } else { if (m_pManager) m_pManager->RemoveOptionGroup(m_sGroupName, this); } Selected(m_bSelected); } bool COptionUI::IsSelected() const { return m_bSelected; } void COptionUI::Selected(bool bSelected, bool bTriggerEvent) { if( m_bSelected == bSelected ) return; m_bSelected = bSelected; if( m_bSelected ) m_uButtonState |= UISTATE_SELECTED; else m_uButtonState &= ~UISTATE_SELECTED; if( m_pManager != NULL ) { if( !m_sGroupName.IsEmpty() ) { if( m_bSelected ) { CStdPtrArray* aOptionGroup = m_pManager->GetOptionGroup(m_sGroupName); for( int i = 0; i < aOptionGroup->GetSize(); i++ ) { COptionUI* pControl = static_cast(aOptionGroup->GetAt(i)); if( pControl != this ) { pControl->Selected(false, bTriggerEvent); } } } if(bTriggerEvent) m_pManager->SendNotify (this, DUI_MSGTYPE_SELECTCHANGED, bSelected); } else { if(bTriggerEvent) m_pManager->SendNotify (this, DUI_MSGTYPE_SELECTCHANGED, bSelected); } } Invalidate(); } bool COptionUI::Activate() { if( !CButtonUI::Activate() ) return false; if( !m_sGroupName.IsEmpty() ) Selected(true); else Selected(!m_bSelected); return true; } void COptionUI::SetEnabled(bool bEnable) { CControlUI::SetEnabled(bEnable); if( !IsEnabled() ) { if( m_bSelected ) m_uButtonState = UISTATE_SELECTED; else m_uButtonState = 0; } } LPCTSTR COptionUI::GetSelectedImage() { return m_diSelected.sDrawString; } void COptionUI::SetSelectedImage(LPCTSTR pStrImage) { if( m_diSelected.sDrawString == pStrImage && m_diSelected.pImageInfo != NULL ) return; m_diSelected.Clear(); m_diSelected.sDrawString = pStrImage; Invalidate(); } LPCTSTR COptionUI::GetSelectedHotImage() { return m_diSelectedHot.sDrawString; } void COptionUI::SetSelectedHotImage( LPCTSTR pStrImage ) { if( m_diSelectedHot.sDrawString == pStrImage && m_diSelectedHot.pImageInfo != NULL ) return; m_diSelectedHot.Clear(); m_diSelectedHot.sDrawString = pStrImage; Invalidate(); } void COptionUI::SetSelectedTextColor(DWORD dwTextColor) { m_dwSelectedTextColor = dwTextColor; } DWORD COptionUI::GetSelectedTextColor() { if (m_dwSelectedTextColor == 0) m_dwSelectedTextColor = m_pManager->GetDefaultFontColor(); return m_dwSelectedTextColor; } void COptionUI::SetSelectedBkColor( DWORD dwBkColor ) { m_dwSelectedBkColor = dwBkColor; } DWORD COptionUI::GetSelectBkColor() { return m_dwSelectedBkColor; } LPCTSTR COptionUI::GetForeImage() { return m_diFore.sDrawString; } void COptionUI::SetForeImage(LPCTSTR pStrImage) { if( m_diFore.sDrawString == pStrImage && m_diFore.pImageInfo != NULL ) return; m_diFore.Clear(); m_diFore.sDrawString = pStrImage; Invalidate(); } SIZE COptionUI::EstimateSize(SIZE szAvailable) { if( m_cxyFixed.cy == 0 ) return CDuiSize(m_cxyFixed.cx, m_pManager->GetFontInfo(GetFont())->tm.tmHeight + 8); return CControlUI::EstimateSize(szAvailable); } void COptionUI::SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue) { if( _tcscmp(pstrName, _T("group")) == 0 ) SetGroup(pstrValue); else if( _tcscmp(pstrName, _T("selected")) == 0 ) Selected(_tcscmp(pstrValue, _T("true")) == 0); else if( _tcscmp(pstrName, _T("selectedimage")) == 0 ) SetSelectedImage(pstrValue); else if( _tcscmp(pstrName, _T("selectedhotimage")) == 0 ) SetSelectedHotImage(pstrValue); else if( _tcscmp(pstrName, _T("foreimage")) == 0 ) SetForeImage(pstrValue); else if( _tcscmp(pstrName, _T("selectedbkcolor")) == 0 ) { if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue); LPTSTR pstr = NULL; DWORD clrColor = _tcstoul(pstrValue, &pstr, 16); SetSelectedBkColor(clrColor); } else if( _tcscmp(pstrName, _T("selectedtextcolor")) == 0 ) { if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue); LPTSTR pstr = NULL; DWORD clrColor = _tcstoul(pstrValue, &pstr, 16); SetSelectedTextColor(clrColor); } else CButtonUI::SetAttribute(pstrName, pstrValue); } void COptionUI::PaintStatusImage(HDC hDC) { if( (m_uButtonState & UISTATE_SELECTED) != 0 ) { if ((m_uButtonState & UISTATE_HOT) != 0) { if (DrawImage(hDC, m_diSelectedHot)) goto Label_ForeImage; } if( DrawImage(hDC, m_diSelected) ) goto Label_ForeImage; else if(m_dwSelectedBkColor != 0) { CRenderEngine::DrawColor(hDC, m_rcPaint, GetAdjustColor(m_dwSelectedBkColor)); goto Label_ForeImage; } } UINT uSavedState = m_uButtonState; m_uButtonState &= ~UISTATE_PUSHED; CButtonUI::PaintStatusImage(hDC); m_uButtonState = uSavedState; Label_ForeImage: DrawImage(hDC, m_diFore); } void COptionUI::PaintText(HDC hDC) { if( (m_uButtonState & UISTATE_SELECTED) != 0 ) { DWORD oldTextColor = m_dwTextColor; if( m_dwSelectedTextColor != 0 ) m_dwTextColor = m_dwSelectedTextColor; if( m_dwTextColor == 0 ) m_dwTextColor = m_pManager->GetDefaultFontColor(); if( m_dwDisabledTextColor == 0 ) m_dwDisabledTextColor = m_pManager->GetDefaultDisabledColor(); if( m_sText.IsEmpty() ) return; int nLinks = 0; RECT rc = m_rcItem; rc.left += m_rcTextPadding.left; rc.right -= m_rcTextPadding.right; rc.top += m_rcTextPadding.top; rc.bottom -= m_rcTextPadding.bottom; if( m_bShowHtml ) CRenderEngine::DrawHtmlText(hDC, m_pManager, rc, m_sText, IsEnabled()?m_dwTextColor:m_dwDisabledTextColor, \ NULL, NULL, nLinks, m_uTextStyle); else CRenderEngine::DrawText(hDC, m_pManager, rc, m_sText, IsEnabled()?m_dwTextColor:m_dwDisabledTextColor, \ m_iFont, m_uTextStyle); m_dwTextColor = oldTextColor; } else { UINT uSavedState = m_uButtonState; m_uButtonState &= ~UISTATE_PUSHED; CButtonUI::PaintText(hDC); m_uButtonState = uSavedState; } } }