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

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * generic_layout.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 VideoLAN
  5.  * $Id: generic_layout.cpp 7228 2004-04-01 21:04:43Z 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 "generic_layout.hpp"
  25. #include "top_window.hpp"
  26. #include "os_factory.hpp"
  27. #include "os_graphics.hpp"
  28. #include "../controls/ctrl_generic.hpp"
  29. GenericLayout::GenericLayout( intf_thread_t *pIntf, int width, int height,
  30.                               int minWidth, int maxWidth, int minHeight,
  31.                               int maxHeight ):
  32.     SkinObject( pIntf ), m_pWindow( NULL ), m_width( width ),
  33.     m_height( height ), m_minWidth( minWidth ), m_maxWidth( maxWidth ),
  34.     m_minHeight( minHeight ), m_maxHeight( maxHeight )
  35. {
  36.     // Get the OSFactory
  37.     OSFactory *pOsFactory = OSFactory::instance( getIntf() );
  38.     // Create the graphics buffer
  39.     m_pImage = pOsFactory->createOSGraphics( width, height );
  40. }
  41. GenericLayout::~GenericLayout()
  42. {
  43.     if( m_pImage )
  44.     {
  45.         delete m_pImage;
  46.     }
  47. }
  48. void GenericLayout::setWindow( TopWindow *pWindow )
  49. {
  50.     m_pWindow = pWindow;
  51. }
  52. void GenericLayout::onControlCapture( const CtrlGeneric &rCtrl )
  53. {
  54.     // Just forward the request to the window
  55.     TopWindow *pWindow = getWindow();
  56.     if( pWindow )
  57.     {
  58.         pWindow->onControlCapture( rCtrl );
  59.     }
  60. }
  61. void GenericLayout::onControlRelease( const CtrlGeneric &rCtrl )
  62. {
  63.     // Just forward the request to the window
  64.     TopWindow *pWindow = getWindow();
  65.     if( pWindow )
  66.     {
  67.         pWindow->onControlRelease( rCtrl );
  68.     }
  69. }
  70. void GenericLayout::addControl( CtrlGeneric *pControl,
  71.                               const Position &rPosition, int layer )
  72. {
  73.     if( pControl )
  74.     {
  75.         // Associate this layout to the control
  76.         pControl->setLayout( this, rPosition );
  77.         // Draw the control
  78.         pControl->draw( *m_pImage, rPosition.getLeft(), rPosition.getTop() );
  79.         // Add the control in the list.
  80.         // This list must remain sorted by layer order 
  81.         list<LayeredControl>::iterator it;
  82.         for( it = m_controlList.begin(); it != m_controlList.end(); it++ )
  83.         {
  84.             if( layer < (*it).m_layer )
  85.             {
  86.                 m_controlList.insert( it, LayeredControl( pControl, layer ) );
  87.                 break;
  88.             }
  89.         }
  90.         // If this control is in front of all the previous ones
  91.         if( it == m_controlList.end() )
  92.         {
  93.             m_controlList.push_back( LayeredControl( pControl, layer ) );
  94.         }
  95.     }
  96.     else
  97.     {
  98.         msg_Dbg( getIntf(), "Adding NULL control in the layout" );
  99.     }
  100. }
  101. const list<LayeredControl> &GenericLayout::getControlList() const
  102. {
  103.     return m_controlList;
  104. }
  105. void GenericLayout::onControlUpdate( const CtrlGeneric &rCtrl )
  106. {
  107.     // TODO: refresh only the needed area if possible
  108.     refreshAll();
  109. }
  110. void GenericLayout::resize( int width, int height )
  111. {
  112.     if( width == m_width && height == m_height )
  113.     {
  114.         return;
  115.     }
  116.     // Update the window size
  117.     m_width = width;
  118.     m_height = height;
  119.     // Recreate a new image
  120.     if( m_pImage )
  121.     {
  122.         delete m_pImage;
  123.         OSFactory *pOsFactory = OSFactory::instance( getIntf() );
  124.         m_pImage = pOsFactory->createOSGraphics( width, height );
  125.     }
  126.     // Notify all the controls that the size has changed and redraw them
  127.     list<LayeredControl>::const_iterator iter;
  128.     for( iter = m_controlList.begin(); iter != m_controlList.end(); iter++ )
  129.     {
  130.         (*iter).m_pControl->onResize();
  131.         const Position *pPos = (*iter).m_pControl->getPosition();
  132.         if( pPos )
  133.         {
  134.             (*iter).m_pControl->draw( *m_pImage, pPos->getLeft(),
  135.                                       pPos->getTop() );
  136.         }
  137.     }
  138.     // Resize and refresh the associated window
  139.     TopWindow *pWindow = getWindow();
  140.     if( pWindow )
  141.     {
  142.         // Resize the window
  143.         pWindow->refresh( 0, 0, width, height );
  144.         pWindow->resize( width, height );
  145.         pWindow->refresh( 0, 0, width, height );
  146.         // Change the shape of the window and redraw it
  147.         pWindow->updateShape();
  148.         pWindow->refresh( 0, 0, width, height );
  149.     }
  150. }
  151. void GenericLayout::refreshAll()
  152. {
  153.     // Draw all the controls of the layout
  154.     list<LayeredControl>::const_iterator iter;
  155.     for( iter = m_controlList.begin(); iter != m_controlList.end(); iter++ )
  156.     {
  157.         CtrlGeneric *pCtrl = (*iter).m_pControl;
  158.         const Position *pPos = pCtrl->getPosition();
  159.         if( pCtrl->isVisible() && pPos )
  160.         {
  161.             pCtrl->draw( *m_pImage, pPos->getLeft(), pPos->getTop() );
  162.         }
  163.     }
  164.     // Refresh the associated window
  165.     TopWindow *pWindow = getWindow();
  166.     if( pWindow )
  167.     {
  168.         pWindow->refresh( 0, 0, m_width, m_height );
  169.     }
  170. }
  171. const list<Anchor*>& GenericLayout::getAnchorList() const
  172. {
  173.     return m_anchorList;
  174. }
  175. void GenericLayout::addAnchor( Anchor *pAnchor )
  176. {
  177.     m_anchorList.push_back( pAnchor );
  178. }