ctrl_resize.cpp
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:6k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * ctrl_resize.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 VideoLAN
  5.  * $Id: ctrl_resize.cpp 6964 2004-03-05 20:56:39Z ipkiss $
  6.  *
  7.  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
  8.  *          Olivier Teuli鑢e <ipkiss@via.ecp.fr>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. #include "ctrl_resize.hpp"
  25. #include "../events/evt_generic.hpp"
  26. #include "../events/evt_mouse.hpp"
  27. #include "../events/evt_motion.hpp"
  28. #include "../src/generic_layout.hpp"
  29. #include "../src/os_factory.hpp"
  30. #include "../utils/position.hpp"
  31. #include "../commands/async_queue.hpp"
  32. #include "../commands/cmd_resize.hpp"
  33. CtrlResize::CtrlResize( intf_thread_t *pIntf, CtrlFlat &rCtrl,
  34.                         GenericLayout &rLayout, const UString &rHelp,
  35.                         VarBool *pVisible ):
  36.     CtrlFlat( pIntf, rHelp, pVisible ), m_fsm( pIntf ), m_rCtrl( rCtrl ),
  37.     m_rLayout( rLayout ), m_cmdOutStill( this, &transOutStill ),
  38.     m_cmdStillOut( this, &transStillOut ),
  39.     m_cmdStillStill( this, &transStillStill ),
  40.     m_cmdStillResize( this, &transStillResize ),
  41.     m_cmdResizeStill( this, &transResizeStill ),
  42.     m_cmdResizeResize( this, &transResizeResize )
  43. {
  44.     m_pEvt = NULL;
  45.     m_xPos = 0;
  46.     m_yPos = 0;
  47.     // States
  48.     m_fsm.addState( "out" );
  49.     m_fsm.addState( "still" );
  50.     m_fsm.addState( "resize" );
  51.     // Transitions
  52.     m_fsm.addTransition( "out", "enter", "still", &m_cmdOutStill );
  53.     m_fsm.addTransition( "still", "leave", "out", &m_cmdStillOut );
  54.     m_fsm.addTransition( "still", "motion", "still", &m_cmdStillStill );
  55.     m_fsm.addTransition( "resize", "mouse:left:up:none", "still",
  56.                          &m_cmdResizeStill );
  57.     m_fsm.addTransition( "still", "mouse:left:down:none", "resize",
  58.                          &m_cmdStillResize );
  59.     m_fsm.addTransition( "resize", "motion", "resize", &m_cmdResizeResize );
  60.     m_fsm.setState( "still" );
  61. }
  62. bool CtrlResize::mouseOver( int x, int y ) const
  63. {
  64.     return m_rCtrl.mouseOver( x, y );
  65. }
  66. void CtrlResize::draw( OSGraphics &rImage, int xDest, int yDest )
  67. {
  68.     m_rCtrl.draw( rImage, xDest, yDest );
  69. }
  70. void CtrlResize::setLayout( GenericLayout *pLayout, const Position &rPosition )
  71. {
  72.     CtrlGeneric::setLayout( pLayout, rPosition );
  73.     // Set the layout of the decorated control as well
  74.     m_rCtrl.setLayout( pLayout, rPosition );
  75. }
  76. const Position *CtrlResize::getPosition() const
  77. {
  78.     return m_rCtrl.getPosition();
  79. }
  80. void CtrlResize::handleEvent( EvtGeneric &rEvent )
  81. {
  82.     m_pEvt = &rEvent;
  83.     m_fsm.handleTransition( rEvent.getAsString() );
  84.     // Transmit the event to the decorated control
  85.     // XXX: Is it really a good idea?
  86.     m_rCtrl.handleEvent( rEvent );
  87. }
  88. void CtrlResize::transOutStill( SkinObject *pCtrl )
  89. {
  90.     CtrlResize *pThis = (CtrlResize*)pCtrl;
  91.     OSFactory *pOsFactory = OSFactory::instance( pThis->getIntf() );
  92.     pOsFactory->changeCursor( OSFactory::kResizeNWSE );
  93. }
  94. void CtrlResize::transStillOut( SkinObject *pCtrl )
  95. {
  96.     CtrlResize *pThis = (CtrlResize*)pCtrl;
  97.     OSFactory *pOsFactory = OSFactory::instance( pThis->getIntf() );
  98.     pOsFactory->changeCursor( OSFactory::kDefaultArrow );
  99. }
  100. void CtrlResize::transStillStill( SkinObject *pCtrl )
  101. {
  102.     CtrlResize *pThis = (CtrlResize*)pCtrl;
  103.     OSFactory *pOsFactory = OSFactory::instance( pThis->getIntf() );
  104.     pOsFactory->changeCursor( OSFactory::kResizeNWSE );
  105. }
  106. void CtrlResize::transStillResize( SkinObject *pCtrl )
  107. {
  108.     CtrlResize *pThis = (CtrlResize*)pCtrl;
  109.     EvtMouse *pEvtMouse = (EvtMouse*)pThis->m_pEvt;
  110.     // Set the cursor
  111.     OSFactory *pOsFactory = OSFactory::instance( pThis->getIntf() );
  112.     pOsFactory->changeCursor( OSFactory::kResizeNWSE );
  113.     pThis->m_xPos = pEvtMouse->getXPos();
  114.     pThis->m_yPos = pEvtMouse->getYPos();
  115.     pThis->captureMouse();
  116.     pThis->m_width = pThis->m_rLayout.getWidth();
  117.     pThis->m_height = pThis->m_rLayout.getHeight();
  118. }
  119. void CtrlResize::transResizeStill( SkinObject *pCtrl )
  120. {
  121.     CtrlResize *pThis = (CtrlResize*)pCtrl;
  122.     // Set the cursor
  123.     OSFactory *pOsFactory = OSFactory::instance( pThis->getIntf() );
  124.     pOsFactory->changeCursor( OSFactory::kResizeNWSE );
  125.     pThis->releaseMouse();
  126. }
  127. void CtrlResize::transResizeResize( SkinObject *pCtrl )
  128. {
  129.     CtrlResize *pThis = (CtrlResize*)pCtrl;
  130.     EvtMotion *pEvtMotion = (EvtMotion*)pThis->m_pEvt;
  131.     // Set the cursor
  132.     OSFactory *pOsFactory = OSFactory::instance( pThis->getIntf() );
  133.     pOsFactory->changeCursor( OSFactory::kResizeNWSE );
  134.     int newWidth = pEvtMotion->getXPos() - pThis->m_xPos + pThis->m_width;
  135.     int newHeight = pEvtMotion->getYPos() - pThis->m_yPos + pThis->m_height;
  136.     // Check boundaries
  137.     if( newWidth < pThis->m_rLayout.getMinWidth() )
  138.     {
  139.         newWidth = pThis->m_rLayout.getMinWidth();
  140.     }
  141.     if( newWidth > pThis->m_rLayout.getMaxWidth() )
  142.     {
  143.         newWidth = pThis->m_rLayout.getMaxWidth();
  144.     }
  145.     if( newHeight < pThis->m_rLayout.getMinHeight() )
  146.     {
  147.         newHeight = pThis->m_rLayout.getMinHeight();
  148.     }
  149.     if( newHeight > pThis->m_rLayout.getMaxHeight() )
  150.     {
  151.         newHeight = pThis->m_rLayout.getMaxHeight();
  152.     }
  153.     // Create a resize command
  154.     CmdGeneric *pCmd = new CmdResize( pThis->getIntf(), pThis->m_rLayout,
  155.                                       newWidth, newHeight );
  156.     // Push the command in the asynchronous command queue
  157.     AsyncQueue *pQueue = AsyncQueue::instance( pThis->getIntf() );
  158.     pQueue->remove( "resize" );
  159.     pQueue->push( CmdGenericPtr( pCmd ) );
  160. }