LCOV - code coverage report
Current view: top level - vcl/headless - svpframe.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 175 237 73.8 %
Date: 2014-11-03 Functions: 31 56 55.4 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <string.h>
      21             : #include "vcl/syswin.hxx"
      22             : #include "headless/svpframe.hxx"
      23             : #include "headless/svpinst.hxx"
      24             : #include "headless/svpgdi.hxx"
      25             : 
      26             : #include <basebmp/bitmapdevice.hxx>
      27             : #include <basebmp/scanlineformats.hxx>
      28             : #include <basegfx/vector/b2ivector.hxx>
      29             : 
      30             : using namespace basebmp;
      31             : using namespace basegfx;
      32             : 
      33             : SvpSalFrame* SvpSalFrame::s_pFocusFrame = NULL;
      34             : 
      35             : #ifndef IOS
      36             : 
      37             : namespace {
      38             :     /// Decouple SalFrame lifetime from damagetracker lifetime
      39             :     struct DamageTracker : public basebmp::IBitmapDeviceDamageTracker
      40             :     {
      41           0 :         DamageTracker( SvpSalFrame& rFrame ) : m_rFrame( rFrame ) {}
      42           0 :         virtual ~DamageTracker() {}
      43           0 :         virtual void damaged( const basegfx::B2IBox& rDamageRect ) const SAL_OVERRIDE
      44             :         {
      45           0 :             m_rFrame.damaged( rDamageRect );
      46           0 :         }
      47             :         SvpSalFrame& m_rFrame;
      48             :     };
      49             : }
      50             : 
      51           0 : void SvpSalFrame::enableDamageTracker( bool bOn )
      52             : {
      53           0 :     if( m_bDamageTracking == bOn )
      54           0 :         return;
      55           0 :     if( m_aFrame.get() )
      56             :     {
      57           0 :         if( m_bDamageTracking )
      58           0 :             m_aFrame->setDamageTracker( basebmp::IBitmapDeviceDamageTrackerSharedPtr() );
      59             :         else
      60             :             m_aFrame->setDamageTracker(
      61           0 :                 basebmp::IBitmapDeviceDamageTrackerSharedPtr( new DamageTracker( *this ) ) );
      62             :     }
      63           0 :     m_bDamageTracking = bOn;
      64             : }
      65             : 
      66             : #endif
      67             : 
      68       12438 : SvpSalFrame::SvpSalFrame( SvpSalInstance* pInstance,
      69             :                           SalFrame* pParent,
      70             :                           sal_uLong nSalFrameStyle,
      71             :                           bool      bTopDown,
      72             :                           basebmp::Format nScanlineFormat,
      73             :                           SystemParentData* ) :
      74             :     m_pInstance( pInstance ),
      75             :     m_pParent( static_cast<SvpSalFrame*>(pParent) ),
      76             :     m_nStyle( nSalFrameStyle ),
      77             :     m_bVisible( false ),
      78             :     m_bTopDown( bTopDown ),
      79             : #ifndef IOS
      80             :     m_bDamageTracking( false ),
      81             : #endif
      82             :     m_nScanlineFormat( nScanlineFormat ),
      83             :     m_nMinWidth( 0 ),
      84             :     m_nMinHeight( 0 ),
      85             :     m_nMaxWidth( 0 ),
      86       12438 :     m_nMaxHeight( 0 )
      87             : {
      88             :     // SAL_DEBUG("SvpSalFrame::SvpSalFrame: " << this);
      89             :     // fast and easy cross-platform wiping of the data
      90       12438 :     memset( (void *)&m_aSystemChildData, 0, sizeof( SystemEnvData ) );
      91       12438 :     m_aSystemChildData.nSize        = sizeof( SystemEnvData );
      92             : #ifdef IOS
      93             :     // Nothing
      94             : #elif defined ANDROID
      95             :     // Nothing
      96             : #else
      97       12438 :     m_aSystemChildData.pSalFrame    = this;
      98       12438 :     m_aSystemChildData.nDepth       = 24;
      99             : #endif
     100             : 
     101       12438 :     if( m_pParent )
     102        6314 :         m_pParent->m_aChildren.push_back( this );
     103             : 
     104       12438 :     if( m_pInstance )
     105       12438 :         m_pInstance->registerFrame( this );
     106             : 
     107       12438 :     SetPosSize( 0, 0, 800, 600, SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT );
     108       12438 : }
     109             : 
     110       37260 : SvpSalFrame::~SvpSalFrame()
     111             : {
     112       12420 :     if( m_pInstance )
     113       12420 :         m_pInstance->deregisterFrame( this );
     114             : 
     115       12420 :     std::list<SvpSalFrame*> Children = m_aChildren;
     116       37260 :     for( std::list<SvpSalFrame*>::iterator it = Children.begin();
     117       24840 :          it != Children.end(); ++it )
     118           0 :          (*it)->SetParent( m_pParent );
     119       12420 :     if( m_pParent )
     120        6314 :         m_pParent->m_aChildren.remove( this );
     121             : 
     122       12420 :     if( s_pFocusFrame == this )
     123             :     {
     124             :         // SAL_DEBUG("SvpSalFrame::~SvpSalFrame: losing focus: " << this);
     125          16 :         s_pFocusFrame = NULL;
     126             :         // call directly here, else an event for a destroyed frame would be dispatched
     127          16 :         CallCallback( SALEVENT_LOSEFOCUS, NULL );
     128             :         // if the handler has not set a new focus frame
     129             :         // pass focus to another frame, preferably a document style window
     130          16 :         if( s_pFocusFrame == NULL )
     131             :         {
     132          16 :             const std::list< SalFrame* >& rFrames( m_pInstance->getFrames() );
     133          34 :             for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it )
     134             :             {
     135          26 :                 SvpSalFrame* pFrame = const_cast<SvpSalFrame*>(static_cast<const SvpSalFrame*>(*it));
     136          34 :                 if( pFrame->m_bVisible        &&
     137          16 :                     pFrame->m_pParent == NULL &&
     138           8 :                     (pFrame->m_nStyle & (SAL_FRAME_STYLE_MOVEABLE |
     139             :                                          SAL_FRAME_STYLE_SIZEABLE |
     140             :                                          SAL_FRAME_STYLE_CLOSEABLE) ) != 0
     141             :                     )
     142             :                 {
     143           8 :                     pFrame->GetFocus();
     144           8 :                     break;
     145             :                 }
     146             :             }
     147             :         }
     148       12420 :     }
     149       24840 : }
     150             : 
     151       16572 : void SvpSalFrame::GetFocus()
     152             : {
     153       16572 :     if( s_pFocusFrame == this )
     154       27610 :         return;
     155             : 
     156        5534 :     if( (m_nStyle & (SAL_FRAME_STYLE_OWNERDRAWDECORATION | SAL_FRAME_STYLE_FLOAT)) == 0 )
     157             :     {
     158        5534 :         if( s_pFocusFrame )
     159          54 :             s_pFocusFrame->LoseFocus();
     160             :         // SAL_DEBUG("SvpSalFrame::GetFocus(): " << this);
     161        5534 :         s_pFocusFrame = this;
     162        5534 :         m_pInstance->PostEvent( this, NULL, SALEVENT_GETFOCUS );
     163             :     }
     164             : }
     165             : 
     166        5652 : void SvpSalFrame::LoseFocus()
     167             : {
     168        5652 :     if( s_pFocusFrame == this )
     169             :     {
     170             :         // SAL_DEBUG("SvpSalFrame::LoseFocus: " << this);
     171        5514 :         m_pInstance->PostEvent( this, NULL, SALEVENT_LOSEFOCUS );
     172        5514 :         s_pFocusFrame = NULL;
     173             :     }
     174        5652 : }
     175             : 
     176      422753 : SalGraphics* SvpSalFrame::AcquireGraphics()
     177             : {
     178      422753 :     SvpSalGraphics* pGraphics = new SvpSalGraphics();
     179             : #ifndef IOS
     180      422753 :     pGraphics->setDevice( m_aFrame );
     181             : #endif
     182      422753 :     m_aGraphics.push_back( pGraphics );
     183      422753 :     return pGraphics;
     184             : }
     185             : 
     186      422455 : void SvpSalFrame::ReleaseGraphics( SalGraphics* pGraphics )
     187             : {
     188      422455 :     SvpSalGraphics* pSvpGraphics = dynamic_cast<SvpSalGraphics*>(pGraphics);
     189      422455 :     m_aGraphics.remove( pSvpGraphics );
     190      422455 :     delete pSvpGraphics;
     191      422455 : }
     192             : 
     193       83552 : bool SvpSalFrame::PostEvent( void* pData )
     194             : {
     195       83552 :     m_pInstance->PostEvent( this, pData, SALEVENT_USEREVENT );
     196       83552 :     return true;
     197             : }
     198             : 
     199        5207 : void SvpSalFrame::PostPaint(bool bImmediate) const
     200             : {
     201        5207 :     if( m_bVisible )
     202             :     {
     203        5172 :         SalPaintEvent aPEvt(0, 0, maGeometry.nWidth, maGeometry.nHeight);
     204        5172 :         aPEvt.mbImmediateUpdate = bImmediate;
     205        5172 :         CallCallback( SALEVENT_PAINT, &aPEvt );
     206             :     }
     207        5207 : }
     208             : 
     209       11516 : void SvpSalFrame::SetTitle( const OUString& )
     210             : {
     211       11516 : }
     212             : 
     213        5590 : void SvpSalFrame::SetIcon( sal_uInt16 )
     214             : {
     215        5590 : }
     216             : 
     217           0 : void SvpSalFrame::SetMenu( SalMenu* )
     218             : {
     219           0 : }
     220             : 
     221           0 : void SvpSalFrame::DrawMenuBar()
     222             : {
     223           0 : }
     224             : 
     225        8444 : void SvpSalFrame::SetExtendedFrameStyle( SalExtStyle )
     226             : {
     227        8444 : }
     228             : 
     229       11200 : void SvpSalFrame::Show( bool bVisible, bool bNoActivate )
     230             : {
     231       11200 :     if( bVisible && ! m_bVisible )
     232             :     {
     233             :         // SAL_DEBUG("SvpSalFrame::Show: showing: " << this);
     234        5602 :         m_bVisible = true;
     235        5602 :         m_pInstance->PostEvent( this, NULL, SALEVENT_RESIZE );
     236       11204 :         if( ! bNoActivate )
     237        5510 :             GetFocus();
     238             :     }
     239        5598 :     else if( ! bVisible && m_bVisible )
     240             :     {
     241             :         // SAL_DEBUG("SvpSalFrame::Show: hiding: " << this);
     242        5598 :         m_bVisible = false;
     243        5598 :         m_pInstance->PostEvent( this, NULL, SALEVENT_RESIZE );
     244        5598 :         LoseFocus();
     245             :     }
     246             :     else
     247             :     {
     248             :         // SAL_DEBUG("SvpSalFrame::Show: nothihg: " << this);
     249             :     }
     250       11200 : }
     251             : 
     252          70 : void SvpSalFrame::SetMinClientSize( long nWidth, long nHeight )
     253             : {
     254          70 :     m_nMinWidth = nWidth;
     255          70 :     m_nMinHeight = nHeight;
     256          70 : }
     257             : 
     258           0 : void SvpSalFrame::SetMaxClientSize( long nWidth, long nHeight )
     259             : {
     260           0 :     m_nMaxWidth = nWidth;
     261           0 :     m_nMaxHeight = nHeight;
     262           0 : }
     263             : 
     264       29095 : void SvpSalFrame::SetPosSize( long nX, long nY, long nWidth, long nHeight, sal_uInt16 nFlags )
     265             : {
     266       29095 :     if( (nFlags & SAL_FRAME_POSSIZE_X) != 0 )
     267        5488 :         maGeometry.nX = nX;
     268       29095 :     if( (nFlags & SAL_FRAME_POSSIZE_Y) != 0 )
     269        5488 :         maGeometry.nY = nY;
     270       29095 :     if( (nFlags & SAL_FRAME_POSSIZE_WIDTH) != 0 )
     271             :     {
     272       29055 :         maGeometry.nWidth = nWidth;
     273       29055 :         if( m_nMaxWidth > 0 && maGeometry.nWidth > (unsigned int)m_nMaxWidth )
     274           0 :             maGeometry.nWidth = m_nMaxWidth;
     275       29055 :         if( m_nMinWidth > 0 && maGeometry.nWidth < (unsigned int)m_nMinWidth )
     276           0 :             maGeometry.nWidth = m_nMinWidth;
     277             :     }
     278       29095 :     if( (nFlags & SAL_FRAME_POSSIZE_HEIGHT) != 0 )
     279             :     {
     280       29055 :         maGeometry.nHeight = nHeight;
     281       29055 :         if( m_nMaxHeight > 0 && maGeometry.nHeight > (unsigned int)m_nMaxHeight )
     282           0 :             maGeometry.nHeight = m_nMaxHeight;
     283       29055 :         if( m_nMinHeight > 0 && maGeometry.nHeight < (unsigned int)m_nMinHeight )
     284           0 :             maGeometry.nHeight = m_nMinHeight;
     285             :     }
     286             : #ifndef IOS
     287       29095 :     B2IVector aFrameSize( maGeometry.nWidth, maGeometry.nHeight );
     288       29095 :     if( ! m_aFrame.get() || m_aFrame->getSize() != aFrameSize )
     289             :     {
     290       19087 :         if( aFrameSize.getX() == 0 )
     291           4 :             aFrameSize.setX( 1 );
     292       19087 :         if( aFrameSize.getY() == 0 )
     293           4 :             aFrameSize.setY( 1 );
     294       19087 :         m_aFrame = createBitmapDevice( aFrameSize, m_bTopDown, m_nScanlineFormat );
     295       19087 :         if (m_bDamageTracking)
     296             :             m_aFrame->setDamageTracker(
     297           0 :                 basebmp::IBitmapDeviceDamageTrackerSharedPtr( new DamageTracker( *this ) ) );
     298             :         // update device in existing graphics
     299      197082 :         for( std::list< SvpSalGraphics* >::iterator it = m_aGraphics.begin();
     300      131388 :              it != m_aGraphics.end(); ++it )
     301             :         {
     302       46607 :              (*it)->setDevice( m_aFrame );
     303             :         }
     304             :     }
     305       29095 :     if( m_bVisible )
     306          32 :         m_pInstance->PostEvent( this, NULL, SALEVENT_RESIZE );
     307             : #endif
     308       29095 : }
     309             : 
     310       11153 : void SvpSalFrame::GetClientSize( long& rWidth, long& rHeight )
     311             : {
     312       11153 :     if( m_bVisible )
     313             :     {
     314        5286 :         rWidth = maGeometry.nWidth;
     315        5286 :         rHeight = maGeometry.nHeight;
     316             :     }
     317             :     else
     318        5867 :         rWidth = rHeight = 0;
     319       11153 : }
     320             : 
     321       32500 : void SvpSalFrame::GetWorkArea( Rectangle& rRect )
     322             : {
     323             :     rRect = Rectangle( Point( 0, 0 ),
     324       32500 :                        Size( VIRTUAL_DESKTOP_WIDTH, VIRTUAL_DESKTOP_HEIGHT ) );
     325       32500 : }
     326             : 
     327       44988 : SalFrame* SvpSalFrame::GetParent() const
     328             : {
     329       44988 :     return m_pParent;
     330             : }
     331             : 
     332             : #define _FRAMESTATE_MASK_GEOMETRY \
     333             :      (WINDOWSTATE_MASK_X     | WINDOWSTATE_MASK_Y |   \
     334             :       WINDOWSTATE_MASK_WIDTH | WINDOWSTATE_MASK_HEIGHT)
     335             : 
     336        5602 : void SvpSalFrame::SetWindowState( const SalFrameState *pState )
     337             : {
     338        5602 :     if (pState == NULL)
     339        5602 :         return;
     340             : 
     341             :     // Request for position or size change
     342        5602 :     if (pState->mnMask & _FRAMESTATE_MASK_GEOMETRY)
     343             :     {
     344        5426 :         long nX = maGeometry.nX;
     345        5426 :         long nY = maGeometry.nY;
     346        5426 :         long nWidth = maGeometry.nWidth;
     347        5426 :         long nHeight = maGeometry.nHeight;
     348             : 
     349             :         // change requested properties
     350        5426 :         if (pState->mnMask & WINDOWSTATE_MASK_X)
     351        5426 :             nX = pState->mnX;
     352        5426 :         if (pState->mnMask & WINDOWSTATE_MASK_Y)
     353        5426 :             nY = pState->mnY;
     354        5426 :         if (pState->mnMask & WINDOWSTATE_MASK_WIDTH)
     355        5366 :             nWidth = pState->mnWidth;
     356        5426 :         if (pState->mnMask & WINDOWSTATE_MASK_HEIGHT)
     357        5366 :             nHeight = pState->mnHeight;
     358             : 
     359             :         SetPosSize( nX, nY, nWidth, nHeight,
     360             :                     SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y |
     361        5426 :                     SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT );
     362             :     }
     363             : }
     364             : 
     365       21988 : bool SvpSalFrame::GetWindowState( SalFrameState* pState )
     366             : {
     367       21988 :     pState->mnState = WINDOWSTATE_STATE_NORMAL;
     368       21988 :     pState->mnX      = maGeometry.nX;
     369       21988 :     pState->mnY      = maGeometry.nY;
     370       21988 :     pState->mnWidth  = maGeometry.nWidth;
     371       21988 :     pState->mnHeight = maGeometry.nHeight;
     372       21988 :     pState->mnMask   = _FRAMESTATE_MASK_GEOMETRY | WINDOWSTATE_MASK_STATE;
     373             : 
     374       21988 :     return true;
     375             : }
     376             : 
     377           0 : void SvpSalFrame::ShowFullScreen( bool, sal_Int32 )
     378             : {
     379             :     SetPosSize( 0, 0, VIRTUAL_DESKTOP_WIDTH, VIRTUAL_DESKTOP_HEIGHT,
     380           0 :                 SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT );
     381           0 : }
     382             : 
     383           0 : void SvpSalFrame::StartPresentation( bool )
     384             : {
     385           0 : }
     386             : 
     387           0 : void SvpSalFrame::SetAlwaysOnTop( bool )
     388             : {
     389           0 : }
     390             : 
     391       11054 : void SvpSalFrame::ToTop( sal_uInt16 )
     392             : {
     393       11054 :     GetFocus();
     394       11054 : }
     395             : 
     396           0 : void SvpSalFrame::SetPointer( PointerStyle )
     397             : {
     398           0 : }
     399             : 
     400           0 : void SvpSalFrame::CaptureMouse( bool )
     401             : {
     402           0 : }
     403             : 
     404           0 : void SvpSalFrame::SetPointerPos( long, long )
     405             : {
     406           0 : }
     407             : 
     408      121588 : void SvpSalFrame::Flush()
     409             : {
     410      121588 : }
     411             : 
     412           0 : void SvpSalFrame::Sync()
     413             : {
     414           0 : }
     415             : 
     416        9423 : void SvpSalFrame::SetInputContext( SalInputContext* )
     417             : {
     418        9423 : }
     419             : 
     420           0 : void SvpSalFrame::EndExtTextInput( sal_uInt16 )
     421             : {
     422           0 : }
     423             : 
     424       89730 : OUString SvpSalFrame::GetKeyName( sal_uInt16 )
     425             : {
     426       89730 :     return OUString();
     427             : }
     428             : 
     429           0 : bool SvpSalFrame::MapUnicodeToKeyCode( sal_Unicode, LanguageType, vcl::KeyCode& )
     430             : {
     431           0 :     return false;
     432             : }
     433             : 
     434        4741 : LanguageType SvpSalFrame::GetInputLanguage()
     435             : {
     436        4741 :     return LANGUAGE_DONTKNOW;
     437             : }
     438             : 
     439        1140 : void SvpSalFrame::UpdateSettings( AllSettings& )
     440             : {
     441        1140 : }
     442             : 
     443           0 : void SvpSalFrame::Beep()
     444             : {
     445           0 : }
     446             : 
     447       15538 : const SystemEnvData* SvpSalFrame::GetSystemData() const
     448             : {
     449       15538 :     return &m_aSystemChildData;
     450             : }
     451             : 
     452         427 : SalFrame::SalPointerState SvpSalFrame::GetPointerState()
     453             : {
     454         427 :     SalPointerState aState;
     455         427 :     aState.mnState = 0;
     456         427 :     return aState;
     457             : }
     458             : 
     459           0 : SalFrame::SalIndicatorState SvpSalFrame::GetIndicatorState()
     460             : {
     461             :     SalIndicatorState aState;
     462           0 :     aState.mnState = 0;
     463           0 :     return aState;
     464             : }
     465             : 
     466           0 : void SvpSalFrame::SimulateKeyPress( sal_uInt16 /*nKeyCode*/ )
     467             : {
     468           0 : }
     469             : 
     470        4528 : void SvpSalFrame::SetParent( SalFrame* pNewParent )
     471             : {
     472        4528 :     if( m_pParent )
     473        4528 :         m_pParent->m_aChildren.remove( this );
     474        4528 :     m_pParent = static_cast<SvpSalFrame*>(pNewParent);
     475        4528 : }
     476             : 
     477           0 : bool SvpSalFrame::SetPluginParent( SystemParentData* )
     478             : {
     479           0 :     return true;
     480             : }
     481             : 
     482           0 : void SvpSalFrame::ResetClipRegion()
     483             : {
     484           0 : }
     485             : 
     486           0 : void SvpSalFrame::BeginSetClipRegion( sal_uLong )
     487             : {
     488           0 : }
     489             : 
     490           0 : void SvpSalFrame::UnionClipRegion( long, long, long, long )
     491             : {
     492           0 : }
     493             : 
     494           0 : void SvpSalFrame::EndSetClipRegion()
     495             : {
     496        1125 : }
     497             : 
     498             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10