Exemple #1
0
void VSliderControl::Transition(ControlTransitionEnum  eTrans,
                               Pos                   *pPos)
{
    Rect oRect;

    if (m_eCurrentState == CS_Dragging && eTrans == CT_SetValue)
        return;

    switch(eTrans)
    {
       case CT_MouseEnter:
           m_pParent->SendControlMessage(this, CM_MouseEnter);
           break;
       case CT_MouseLeave:
           m_pParent->SendControlMessage(this, CM_MouseLeave);
           break;

       case CT_SetValue:
       {
           int iNewPos;    

           if (m_iValue < 0 || m_iValue > 100)
               return;

           m_oMutex.Acquire();
           if (m_bInUpdate)
           {
              m_oMutex.Release();
              return;
           }
           m_bInUpdate = true;

           iNewPos = ((100 - m_iValue) * m_iRange) / 100;
           if (iNewPos == m_iCurrentPos)
           {
              m_bInUpdate = false;
              m_oMutex.Release();
              return;
           }

           m_iCurrentPos = iNewPos;
           m_bInUpdate = false;
           m_oMutex.Release();

           if (!m_pPanel->IsHidden())
               MoveThumb(iNewPos);
           
           return;
       }   

       default:
          break;
    }  

    if (m_pPanel->IsHidden())
       return;

    oRect.x1 = m_oRect.x1;
    oRect.x2 = m_oRect.x2;
    oRect.y1 = m_oRect.y1 + m_iCurrentPos;
    oRect.y2 = oRect.y1 + m_iThumbHeight;

    m_oMutex.Acquire();
    if (m_eCurrentState != CS_Dragging && 
        m_eLastState == CS_Dragging)
    {    
        if (m_oOrigin.y != -1)
        {
            Rect oRect;
     
            m_oMutex.Release();
            m_pParent->GetWindowPosition(oRect);
            m_oMutex.Acquire();
            
            m_oOrigin.y = m_oRect.y1 + m_iCurrentPos + (m_iThumbHeight / 2);
            m_oOrigin.y += oRect.y1;
            m_oOrigin.x += oRect.x1;
            
            m_oMutex.Release();
            m_pParent->EndMouseCapture();
            m_pParent->HideMouse(false);
            m_oMutex.Acquire();
            
            m_oOrigin.y = -1;
        }    
        m_iValue = 100 - ((m_iCurrentPos * 100) / m_iRange);

        m_oMutex.Release();
        m_pParent->SendControlMessage(this, CM_ValueChanged);
        m_oMutex.Acquire();
    }    

    if (m_eCurrentState == CS_Dragging && 
        m_eLastState != CS_Dragging)
       m_bIsDrag = oRect.IsPosInRect(*pPos);

    m_oMutex.Release();

    int iThumbNumber = m_iNumThumbStates * (1 - m_iCurrentPos / m_iRange);
    iThumbNumber = min(m_iNumThumbStates - 1, iThumbNumber);

    if (m_eCurrentState != CS_MouseOver && m_eCurrentState != CS_DisabledMO) 
        BlitTrough(m_iCurrentPos);

    switch(m_eCurrentState)
    {
       case CS_Normal:
          BlitFrame(CS_Normal, iThumbNumber, &oRect);
          break;

       case CS_MouseOver:
          BlitFrame(CS_MouseOver, iThumbNumber, &oRect);
          break;

       case CS_Dragging:
       
          m_oMutex.Acquire();
          if (m_bInUpdate)
          {
              m_oMutex.Release();
              return;
          }
              
          m_bInUpdate = true;
          m_oMutex.Release();

          if (m_bIsDrag)
              HandleDrag(eTrans, pPos); 
          else
              HandleJump(eTrans, pPos);    

          m_oMutex.Acquire();
          m_bInUpdate = false;
          m_oMutex.Release();
          break;
          
       case CS_Disabled:
          BlitFrame(CS_Disabled, iThumbNumber, &oRect);
          break;

       default:
          break;
    }
}