void UIScrollView::resetPositionWithAction()
{
    using namespace cocos2d;
    CCPoint delta = CCPointZero;
    UIWidget* child = getCheckPositionChild();
    switch (m_eDirection)
    {
        case SCROLLVIEW_DIR_VERTICAL: // vertical
            switch (m_eMoveDirection)
            {
                case SCROLLVIEW_MOVE_DIR_UP: // up
                    delta.y = m_fBottomBoundary + m_fDisBoundaryToChild_0 - child->getRelativeBottomPos();;
                    break;
                    
                case SCROLLVIEW_MOVE_DIR_DOWN: // down
                    delta.y = m_fTopBoundary - m_fDisBoundaryToChild_0 - child->getRelativeTopPos();
                    break;
                    
                default:
                    break;
            }
            break;
        case SCROLLVIEW_DIR_HORIZONTAL: // horizontal
            switch (m_eMoveDirection)
            {
                case SCROLLVIEW_MOVE_DIR_LEFT: // left
                    delta.x = m_fRightBoundary - m_fDisBoundaryToChild_0 - child->getRelativeRightPos();
                    break;
                    
                case SCROLLVIEW_MOVE_DIR_RIGHT: // right
                    delta.x = m_fLeftBoundary + m_fDisBoundaryToChild_0 - child->getRelativeLeftPos();
                    break;
                default:
                    break;
            }
            break;
        default:
            break;
    }
    
//    int times = m_children->count();
    ccArray* arrayChildren = m_children->data;
    int times = arrayChildren->num;
    for (int i = 0; i < times - 1; ++i)
    {
        UIWidget* child = dynamic_cast<UIWidget*>(arrayChildren->arr[i]);
        CCMoveBy* moveBy = CCMoveBy::create(0.25, delta);
        CCEaseOut* ease = CCEaseOut::create(moveBy, 0.5);
        child->runAction(ease);
    }
    
    UIWidget* child_last = dynamic_cast<UIWidget*>(m_children->lastObject());
    CCMoveBy* moveBy = CCMoveBy::create(0.25, delta);
    CCEaseOut* ease = CCEaseOut::create(moveBy, 0.5);
    CCCallFunc* callFunc = CCCallFunc::create(this, callfunc_selector(UIScrollView::handleScrollActionEvent));
    CCSequence* seq = CCSequence::create(ease, callFunc, NULL);
    child_last->runAction(seq);
    
    isRunningAction = true;
}
void UIListView::collectOverBottomChild()
{
    float scroll_bottom = m_fBottomBoundary;
    
    if (m_overBottomArray->count() > 0)
    {
        m_overBottomArray->removeAllObjects();
    }
    
    ccArray* arrayChildren = m_children->data;
    int times = arrayChildren->num;
    for (int i = 0; i < times; ++i)
    {
        UIWidget* child = dynamic_cast<UIWidget*>(arrayChildren->arr[i]);
        float child_top = child->getRelativeTopPos();
        
        if (child_top <= scroll_bottom)
        {
            m_overBottomArray->addObject(child);                
        }
    }
}
void UIListView::setLoopPosition()
{
    switch (m_eDirection)
    {
        case SCROLLVIEW_DIR_VERTICAL: // vertical
            switch (m_eMoveDirection)
            {
                case SCROLLVIEW_MOVE_DIR_UP: // up
                    if (m_overTopArray->count() == m_children->count())
                    {
                        int count = m_overTopArray->count();
                        for (int i = 0; i < count; ++i)
                        {   
                            UIWidget* child = dynamic_cast<UIWidget*>(m_overTopArray->objectAtIndex(i));
                            
                            if (i == 0)
                            {
                                float y = (count - 1);
//                                float y = (0 - m_fDisBetweenChild) + m_fDisBetweenChild * (count - 1);
                                child->setPosition(ccp(child->getPosition().x, y));
                            }
                            else
                            {
                                UIWidget* prev_child = dynamic_cast<UIWidget*>(m_overTopArray->objectAtIndex(i - 1));
                                child->setPosition(ccp(child->getPosition().x, prev_child->getPosition().y));
                            }
                        }
                    }
                    else
                    {
                        float scroll_top = m_fTopBoundary;
                        
                        int count = m_children->count();
                        for (int i = 0; i < count; ++i)
                        {
                            UIWidget* child = dynamic_cast<UIWidget*>(m_children->objectAtIndex(i));
                            float child_bottom = child->getRelativeBottomPos();
                            
                            if (child_bottom >= scroll_top)
                            {
                                int index = (i == 0) ? (count - 1) : (i - 1);
                                UIWidget* prev_child = dynamic_cast<UIWidget*>(m_children->objectAtIndex(index));
                                child->setPosition(ccp(child->getPosition().x, prev_child->getPosition().y));
                            }
                        }
                    }
                    break;
                    
                case SCROLLVIEW_MOVE_DIR_DOWN: // down
                    if (m_overBottomArray->count() == m_children->count())
                    {
                        int count = m_overBottomArray->count();
                        for (int i = 0; i < count; ++i)
                        {
                            UIWidget* child = dynamic_cast<UIWidget*>(m_overBottomArray->objectAtIndex(i));
                            
                            if (i == 0)
                            {
                                float y = (m_fTopBoundary) * (count - 1);
//                                float y = (m_fTopBoundary) - m_fDisBetweenChild * (count - 1);
                                child->setPosition(ccp(child->getPosition().x, y));
                            }
                            else
                            {
                                UIWidget* prev_child = dynamic_cast<UIWidget*>(m_overBottomArray->objectAtIndex(i - 1));
                                child->setPosition(ccp(child->getPosition().x, prev_child->getPosition().y));                                    
                            }
                        }
                    }
                    else
                    {
                        float scroll_bottom = m_fBottomBoundary;
                        
                        int count = m_children->count();
                        for (int i = count - 1; i >= 0; --i)
                        {
                            UIWidget* child = dynamic_cast<UIWidget*>(m_children->objectAtIndex(i));
                            float child_top = child->getRelativeTopPos();
                            
                            if (child_top <= scroll_bottom)
                            {
                                int index = (i == count - 1) ? 0 : (i + 1);
                                UIWidget* next_child = dynamic_cast<UIWidget*>(m_children->objectAtIndex(index));
                                child->setPosition(ccp(child->getPosition().x, next_child->getPosition().y));                                    
                            }
                        }
                    }
                    break;
                    
                default:
                    break;
            }
            break;
            
        case SCROLLVIEW_DIR_HORIZONTAL: // horizontal
            switch (m_eMoveDirection)
            {
                case SCROLLVIEW_MOVE_DIR_LEFT: // left
                    if (m_overLeftArray->count() == m_children->count())
                    {
                        int count = m_overLeftArray->count();
                        for (int i = 0; i < count; ++i)
                        {
                            UIWidget* child = dynamic_cast<UIWidget*>(m_overLeftArray->objectAtIndex(i));
                            
                            if (i == 0)
                            {
                                float x = m_fRightBoundary * (count - 1);
//                                float x = (m_fRightBoundary + m_fDisBetweenChild) - m_fDisBetweenChild * (count - 1);
                                child->setPosition(ccp(x, child->getPosition().y));
                            }
                            else
                            {
                                UIWidget* prev_child = dynamic_cast<UIWidget*>(m_overLeftArray->objectAtIndex(i - 1));
                                child->setPosition(ccp(prev_child->getPosition().x, child->getPosition().y));                                    
                            }
                        }
                    }
                    else
                    {
                        float scroll_left = m_fLeftBoundary;
                        
                        int count = m_children->count();
                        for (int i = 0; i < count; ++i)
                        {
                            UIWidget* child = dynamic_cast<UIWidget*>(m_children->objectAtIndex(i));
                            float child_right = child->getRelativeRightPos();
                            
                            if (child_right <= scroll_left)
                            {
                                int index = (i == 0) ? (count - 1) : (i - 1);
                                UIWidget* prev_child = dynamic_cast<UIWidget*>(m_children->objectAtIndex(index));
                                child->setPosition(ccp(prev_child->getPosition().x, child->getPosition().y));
                            }
                        }
                    }
                    break;
                    
                case SCROLLVIEW_MOVE_DIR_RIGHT: // right
                    if (m_overRightArray->count() == m_children->count())
                    {
                        int count = m_overRightArray->count();
                        for (int i = 0; i < count; ++i)
                        {
                            UIWidget* child = dynamic_cast<UIWidget*>(m_overRightArray->objectAtIndex(i));
                            
                            if (i == 0)
                            {
                                float x = (count - 1);
//                                float x = (0 - m_fDisBetweenChild) + m_fDisBetweenChild * (count - 1);
                                child->setPosition(ccp(x, child->getPosition().y));
                            }
                            else
                            {
                                UIWidget* prev_child = dynamic_cast<UIWidget*>(m_overRightArray->objectAtIndex(i - 1));
                                child->setPosition(ccp(prev_child->getPosition().x, child->getPosition().y));                                    
                            }
                        }
                    }
                    else
                    {
                        float scroll_right = m_fRightBoundary;
                        
                        int count = m_children->count();
                        for (int i = count - 1; i >= 0; --i)
                        {
                            UIWidget* child = dynamic_cast<UIWidget*>(m_children->objectAtIndex(i));
                            float child_left = child->getRelativeLeftPos();
                            
                            if (child_left >= scroll_right)
                            {
                                int index = (i == count - 1) ? 0 : (i + 1);
                                UIWidget* next_child = dynamic_cast<UIWidget*>(m_children->objectAtIndex(index));
                                child->setPosition(ccp(next_child->getPosition().x, child->getPosition().y));
                            }
                        }
                    }
                    break;
                    
                default:
                    break;
            }
            break;
            
        default:
            break;
    }
}
float UIScrollView::calculateOffsetWithDragForce(float moveOffset)
{
    float offset = moveOffset;
    UIWidget* child = getCheckPositionChild();
    
    switch (m_eDirection)
    {
        case SCROLLVIEW_DIR_VERTICAL: // vertical
            switch (m_eMoveDirection)
            {
                case SCROLLVIEW_MOVE_DIR_UP: // up
                    {
                        float scroll_bottom = m_fBottomBoundary;
                        float child_bottom = child->getRelativeBottomPos();
                        
                        if (child_bottom > scroll_bottom)
                        {
                            offset -= m_fDragForce * offset / m_fHeight;
                        }
                    }
                    break;
                    
                case SCROLLVIEW_MOVE_DIR_DOWN: // down
                    {
                        float scroll_top = m_fTopBoundary;
                        float child_top = child->getRelativeTopPos();
                        
                        if (child_top < scroll_top)
                        {
                            offset -= m_fDragForce * offset / m_fHeight;
                        }
                    }
                    break;
                    
                default:
                    break;
            }
            break;
            
        case SCROLLVIEW_DIR_HORIZONTAL: // horizontal
            switch (m_eMoveDirection)
            {
                case SCROLLVIEW_MOVE_DIR_LEFT: // left
                    {
                        float scroll_right = m_fRightBoundary;
                        float child_right = child->getRelativeRightPos();
                        
                        if (child_right < scroll_right)
                        {
                            offset -= m_fDragForce * offset / m_fWidth;
                        }
                    }
                    break;
                    
                case SCROLLVIEW_MOVE_DIR_RIGHT: // right
                    {
                        float scroll_left = m_fLeftBoundary;
                        float child_left = child->getRelativeLeftPos();
                        
                        if (child_left > scroll_left)
                        {
                            offset -= m_fDragForce * offset / m_fWidth;
                        }
                    }
                    break;
                    
                default:
                    break;
            }
            break;
            
        default:
            break;
    }
    
    offset = MIN(offset, m_fDisBetweenChild);
    
    return offset;
}