void RadioButtonGroup::handleButtonDeselected(ButtonSelectedEventDetails* const e)
{
    if(getSelectedButton() == e->getSource())
    {
        setSelectedButton(NULL);
    }
}
//=============================================================
//=============================================================
void CC3DCircleListLayer::endUpdateToCenter()
{
    CCButton* pSelButton = getSelectedButton();
    if(!pSelButton)
        return;
    moveToCenter(pSelButton,true);
}
bool RadioButtonGroup::isSelected(const RadioButton* const Button) const
{
    if(Button == getSelectedButton())
    {
        return true;
    }
    else
    {
        return false;
    }
}
void RadioButtonGroup::handleButtonSelected(ButtonSelectedEventDetails* const e)
{
    RadioButtonRefPtr TheButton = dynamic_cast<RadioButton*>(e->getSource());
    RadioButtonRefPtr PreviousSelected(getSelectedButton());
    if(PreviousSelected != TheButton)
    {
        setSelectedButton(TheButton);
        if(PreviousSelected != NULL)
        {
            PreviousSelected->setSelected(false);
        }
    }
}
void RadioButtonGroup::addButton(RadioButton* const Button)
{
    pushToGroupButtons(Button);
    if(Button->getSelected())
    {
        RadioButtonRefPtr SelectedButton(getSelectedButton());
        if(SelectedButton == NULL)
        {
            setSelectedButton(SelectedButton);
        }
        else
        {
            Button->setSelected(false);
        }
    }
}
void RadioButtonGroup::changed(ConstFieldMaskArg whichField, 
                            UInt32            origin,
                            BitVector         details)
{
    Inherited::changed(whichField, origin, details);

    if(whichField & GroupButtonsFieldMask)
    {
        for(UInt32 i(0) ; i<_ButtonConnections.size() ; ++i)
        {
            _ButtonConnections[i].disconnect();
        }
        _ButtonConnections.clear();
        for(UInt32 i(0) ; i<getMFGroupButtons()->size() ; ++i)
        {
            _ButtonConnections.push_back(getGroupButtons(i)->connectButtonSelected(boost::bind(&RadioButtonGroup::handleButtonSelected, this, _1)));
            _ButtonConnections.push_back(getGroupButtons(i)->connectButtonDeselected(boost::bind(&RadioButtonGroup::handleButtonDeselected, this, _1)));
        }
    }

    if(whichField & SelectedButtonFieldMask)
    {
        RadioButtonRefPtr SelectedButton(getSelectedButton());
        RadioButtonRefPtr tmpButton;
        for(UInt32 i(0) ; i<getMFGroupButtons()->size() ; ++i)
        {
            tmpButton = getGroupButtons(i);
                if(tmpButton == SelectedButton)
                    tmpButton->setSelected(true);
                else
                    tmpButton->setSelected(false);
            
        }
    }

}
//=============================================================
//=============================================================
void CC3DCircleListLayer::refreshItemWithMoveDegree(float fMoveDegree)
{
    float fMoveX = getContentSize().width*0.5;
    float fMoveY = getContentSize().height*0.5;
    
    float fScaleMax = 1;
    float fScaleMin = 0.5;
    
    int zOrderMax = 1000;
    
    //    float fCameraDegreeMax = 45;
    //    float fCameraDegreeMin = 0;
    
    for(int i=0;i<m_pButtonArray->count();i++)
    {
        CCButton* pButton = (CCButton*)m_pButtonArray->objectAtIndex(i);
        CCString* pFOldDegree = (CCString*)pButton->getUserData();
        float fOldDegree  = pFOldDegree->floatValue();
        
        fOldDegree = fabsf(fOldDegree);
        float fCurDegree = fOldDegree + fMoveDegree;
        if(fCurDegree < 0)
        {
            fCurDegree = 2*M_PI - fabsf(fCurDegree);
        }
        int nCircleCount = (int)fCurDegree/(2*M_PI);
        fCurDegree = fCurDegree - nCircleCount*(2*M_PI);
        //=============================================================
        //=============================================================
        delete pFOldDegree;
        CCString* pString = new CCString();
        pString->initWithFormat("%f",fabs(fCurDegree));
        pButton->setUserData(pString);
        //=============================================================
        //=============================================================
        //
        //
        //
        //=============================================================
        //=============================================================
        float fCircleX = m_fEllipseA * cosf(fCurDegree);
        float fCircleY = m_fEllipseB * sinf(fCurDegree);
        fCircleX += fMoveX;
        fCircleY += fMoveY;
        CCPoint buttonPos = ccp(fCircleX,fCircleY);
        pButton->setPosition(buttonPos);
        //=============================================================
        //=============================================================
        //
        //
        //
        //=============================================================
        //=============================================================
        float fScaleDegree = fCurDegree - M_PI_2;
        float fScalePercent = (1-cosf(fScaleDegree))/2.0;
        float fScale = fScaleMin + (fScaleMax - fScaleMin)*fScalePercent;
        pButton->setScale(fScale);
        int nOrder = zOrderMax * fScalePercent + 1;
        pButton->setZOrder(nOrder);
        //=============================================================
        //=============================================================
        
        m_pSelectedButton =  getSelectedButton();
        if(m_pSelectedButton)
        {
            if(m_pDelegate)
            {
                int nIndex = m_pSelectedButton->getTag();
                m_pDelegate->onCC3DCircleListLayerSelectIndex(nIndex);
            }
        }
        
        //        //=============================================================
        //        //camera
        //        //=============================================================
        //        int flagMove = 1;
        //        if(buttonPos.x > getContentSize().width*0.5)
        //        {
        //            flagMove = 1;
        //        }
        //        else
        //        {
        //            flagMove = -1;
        //        }
        //        float fCameraDegree = fCameraDegreeMin + (fCameraDegreeMax - fCameraDegreeMin)*(1-fScalePercent);
        //        fCameraDegree *= -flagMove;
        //        float radians = (float)CC_DEGREES_TO_RADIANS(fCameraDegree);
        //        float fSin = sinf(radians) * CCCamera::getZEye();
        //        CCCamera* pCamera = pButton->getCamera();
        //        pCamera->setCenterXYZ(fSin, 0, 0);
        //        //=============================================================
        //        //=============================================================
    }
}