From 6b3ded37e4a4825be2df3612bdcbb7dfc00a1800 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Tue, 4 Mar 2014 20:41:13 +0000 Subject: HistoryStats sources git-svn-id: http://svn.miranda-ng.org/main/trunk@8397 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- .../HistoryStats/optionsctrlimpl_radio.cpp | 125 +++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 plugins/!NotAdopted/HistoryStats/optionsctrlimpl_radio.cpp (limited to 'plugins/!NotAdopted/HistoryStats/optionsctrlimpl_radio.cpp') diff --git a/plugins/!NotAdopted/HistoryStats/optionsctrlimpl_radio.cpp b/plugins/!NotAdopted/HistoryStats/optionsctrlimpl_radio.cpp new file mode 100644 index 0000000000..75491192af --- /dev/null +++ b/plugins/!NotAdopted/HistoryStats/optionsctrlimpl_radio.cpp @@ -0,0 +1,125 @@ +#include "_globals.h" +#include "optionsctrlimpl.h" + +/* + * OptionsCtrlImpl::RadioSiblings + */ + +int OptionsCtrlImpl::RadioSiblings::join(Radio* pRadio) +{ + m_Radios.push_back(pRadio); + ++m_nRadios; + + return m_nRadios - 1; +} + +bool OptionsCtrlImpl::RadioSiblings::leave(int nRadio) +{ + assert(nRadio >= 0 && nRadio < m_Radios.size() && m_Radios[nRadio]); + + m_Radios[nRadio] = NULL; + --m_nRadios; + + return (m_nRadios == 0); +} + +void OptionsCtrlImpl::RadioSiblings::setChecked(int nRadio) +{ + if (nRadio == m_nChecked) + { + return; + } + + if (nRadio < 0 || nRadio >= m_Radios.size()) + { + return; + } + + if (m_nChecked != -1) + { + assert(m_Radios[m_nChecked]); + + int nOldChecked = m_nChecked; + + m_nChecked = -1; + m_Radios[nOldChecked]->updateItem(); + } + + assert(m_Radios[nRadio]); + + m_nChecked = nRadio; + m_Radios[m_nChecked]->updateItem(); +} + +/* + * OptionsCtrlImpl::Radio + */ + +bool OptionsCtrlImpl::Radio::getChildEnable(bool bChecked) +{ + return + !m_bDisableChildsOnUncheck && m_bDisableChilds && m_bEnabled || + m_bDisableChildsOnUncheck && bChecked && (!m_bDisableChilds || m_bEnabled); +} + +void OptionsCtrlImpl::Radio::updateItem() +{ + bool bChecked = isChecked(); + + m_pCtrl->setStateImage(m_hItem, m_bEnabled ? (bChecked ? siRadioC : siRadioU) : (bChecked ? siRadioCG : siRadioUG)); + + if (m_bDisableChilds || m_bDisableChildsOnUncheck) + { + enableChilds(getChildEnable(bChecked)); + } +} + +OptionsCtrlImpl::Radio::Radio(OptionsCtrlImpl* pCtrl, Item* pParent, Radio* pSibling, const mu_text* szLabel, DWORD dwFlags, DWORD dwData) + : Item(pCtrl, itRadio, szLabel, dwFlags, dwData) +{ + m_bDisableChildsOnUncheck = bool_(dwFlags & OCF_DISABLECHILDSONUNCHECK); + + pCtrl->insertItem(pParent, this, szLabel, dwFlags, siRadioU); + + m_pSiblings = pSibling ? pSibling->m_pSiblings : new RadioSiblings(); + m_nIndex = m_pSiblings->join(this); + + if (dwFlags & OCF_CHECKED) + { + m_pSiblings->setChecked(m_nIndex); + } + else + { + updateItem(); + } + + if (pParent) + { + pParent->childAdded(this); + } +} + +OptionsCtrlImpl::Radio::~Radio() +{ + if (m_pSiblings->leave(m_nIndex)) + { + delete m_pSiblings; + } +} + +void OptionsCtrlImpl::Radio::onToggle() +{ + if (m_bEnabled && !isChecked()) + { + setChecked(); + m_pCtrl->setModified(this); + } +} + +void OptionsCtrlImpl::Radio::childAdded(Item* pChild) +{ + if (m_bDisableChilds || m_bDisableChildsOnUncheck) + { + pChild->setEnabled(getChildEnable(isChecked())); + } +} -- cgit v1.2.3