LCOV - code coverage report
Current view: top level - vcl/headless - svpframe.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 182 240 75.8 %
Date: 2015-06-13 12:38:46 Functions: 34 58 58.6 %
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/svpforlokit.hxx>
      22             : #include <vcl/syswin.hxx>
      23             : 
      24             : #include "headless/svpframe.hxx"
      25             : #include "headless/svpinst.hxx"
      26             : #include "headless/svpgdi.hxx"
      27             : 
      28             : #include <basebmp/bitmapdevice.hxx>
      29             : #include <basebmp/scanlineformats.hxx>
      30             : #include <basegfx/vector/b2ivector.hxx>
      31             : 
      32             : using namespace basebmp;
      33             : using namespace basegfx;
      34             : 
      35             : SvpSalFrame* SvpSalFrame::s_pFocusFrame = NULL;
      36             : 
      37             : #ifdef IOS
      38             : #define SvpSalGraphics AquaSalGraphics
      39             : #endif
      40             : 
      41             : #ifndef IOS
      42             : 
      43             : namespace {
      44             :     /// Decouple SalFrame lifetime from damagetracker lifetime
      45           0 :     struct DamageTracker : public basebmp::IBitmapDeviceDamageTracker
      46             :     {
      47           0 :         virtual ~DamageTracker() {}
      48           0 :         virtual void damaged( const basegfx::B2IBox& ) const SAL_OVERRIDE {}
      49             :     };
      50             : }
      51             : 
      52           0 : void SvpSalFrame::enableDamageTracker( bool bOn )
      53             : {
      54           0 :     if( m_bDamageTracking == bOn )
      55           0 :         return;
      56           0 :     if( m_aFrame.get() )
      57             :     {
      58           0 :         if( m_bDamageTracking )
      59           0 :             m_aFrame->setDamageTracker( basebmp::IBitmapDeviceDamageTrackerSharedPtr() );
      60             :         else
      61             :             m_aFrame->setDamageTracker(
      62           0 :                 basebmp::IBitmapDeviceDamageTrackerSharedPtr( new DamageTracker ) );
      63             :     }
      64           0 :     m_bDamageTracking = bOn;
      65             : }
      66             : 
      67             : #endif
      68             : 
      69        6925 : SvpSalFrame::SvpSalFrame( SvpSalInstance* pInstance,
      70             :                           SalFrame* pParent,
      71             :                           sal_uLong nSalFrameStyle,
      72             :                           bool      bTopDown,
      73             :                           basebmp::Format nScanlineFormat,
      74             :                           SystemParentData* ) :
      75             :     m_pInstance( pInstance ),
      76             :     m_pParent( static_cast<SvpSalFrame*>(pParent) ),
      77             :     m_nStyle( nSalFrameStyle ),
      78             :     m_bVisible( false ),
      79             :     m_bTopDown( bTopDown ),
      80             : #ifndef IOS
      81             :     m_bDamageTracking( false ),
      82             : #endif
      83             :     m_nScanlineFormat( nScanlineFormat ),
      84             :     m_nMinWidth( 0 ),
      85             :     m_nMinHeight( 0 ),
      86             :     m_nMaxWidth( 0 ),
      87        6925 :     m_nMaxHeight( 0 )
      88             : {
      89             :     // SAL_DEBUG("SvpSalFrame::SvpSalFrame: " << this);
      90             :     // fast and easy cross-platform wiping of the data
      91        6925 :     memset( static_cast<void *>(&m_aSystemChildData), 0, sizeof( SystemEnvData ) );
      92        6925 :     m_aSystemChildData.nSize        = sizeof( SystemEnvData );
      93             : #ifdef IOS
      94             :     // Nothing
      95             : #elif defined ANDROID
      96             :     // Nothing
      97             : #else
      98        6925 :     m_aSystemChildData.pSalFrame    = this;
      99        6925 :     m_aSystemChildData.nDepth       = 24;
     100             : #endif
     101             : 
     102        6925 :     if( m_pParent )
     103        3295 :         m_pParent->m_aChildren.push_back( this );
     104             : 
     105        6925 :     if( m_pInstance )
     106        6925 :         m_pInstance->registerFrame( this );
     107             : 
     108        6925 :     SetPosSize( 0, 0, 800, 600, SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT );
     109        6925 : }
     110             : 
     111       20727 : SvpSalFrame::~SvpSalFrame()
     112             : {
     113        6909 :     if( m_pInstance )
     114        6909 :         m_pInstance->deregisterFrame( this );
     115             : 
     116        6909 :     std::list<SvpSalFrame*> Children = m_aChildren;
     117       20727 :     for( std::list<SvpSalFrame*>::iterator it = Children.begin();
     118       13818 :          it != Children.end(); ++it )
     119           0 :          (*it)->SetParent( m_pParent );
     120        6909 :     if( m_pParent )
     121        3293 :         m_pParent->m_aChildren.remove( this );
     122             : 
     123        6909 :     if( s_pFocusFrame == this )
     124             :     {
     125             :         // SAL_DEBUG("SvpSalFrame::~SvpSalFrame: losing focus: " << this);
     126           9 :         s_pFocusFrame = NULL;
     127             :         // call directly here, else an event for a destroyed frame would be dispatched
     128           9 :         CallCallback( SALEVENT_LOSEFOCUS, NULL );
     129             :         // if the handler has not set a new focus frame
     130             :         // pass focus to another frame, preferably a document style window
     131           9 :         if( s_pFocusFrame == NULL )
     132             :         {
     133           9 :             const std::list< SalFrame* >& rFrames( m_pInstance->getFrames() );
     134          21 :             for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it )
     135             :             {
     136          16 :                 SvpSalFrame* pFrame = const_cast<SvpSalFrame*>(static_cast<const SvpSalFrame*>(*it));
     137          20 :                 if( pFrame->m_bVisible        &&
     138           8 :                     pFrame->m_pParent == NULL &&
     139           4 :                     (pFrame->m_nStyle & (SAL_FRAME_STYLE_MOVEABLE |
     140             :                                          SAL_FRAME_STYLE_SIZEABLE |
     141             :                                          SAL_FRAME_STYLE_CLOSEABLE) ) != 0
     142             :                     )
     143             :                 {
     144           4 :                     pFrame->GetFocus();
     145           4 :                     break;
     146             :                 }
     147             :             }
     148             :         }
     149        6909 :     }
     150       13818 : }
     151             : 
     152        9665 : void SvpSalFrame::GetFocus()
     153             : {
     154        9665 :     if( s_pFocusFrame == this )
     155       16136 :         return;
     156             : 
     157        3194 :     if( (m_nStyle & (SAL_FRAME_STYLE_OWNERDRAWDECORATION | SAL_FRAME_STYLE_FLOAT)) == 0 )
     158             :     {
     159        3194 :         if( s_pFocusFrame )
     160          30 :             s_pFocusFrame->LoseFocus();
     161             :         // SAL_DEBUG("SvpSalFrame::GetFocus(): " << this);
     162        3194 :         s_pFocusFrame = this;
     163        3194 :         m_pInstance->PostEvent( this, NULL, SALEVENT_GETFOCUS );
     164             :     }
     165             : }
     166             : 
     167        3215 : void SvpSalFrame::LoseFocus()
     168             : {
     169        3215 :     if( s_pFocusFrame == this )
     170             :     {
     171             :         // SAL_DEBUG("SvpSalFrame::LoseFocus: " << this);
     172        3180 :         m_pInstance->PostEvent( this, NULL, SALEVENT_LOSEFOCUS );
     173        3180 :         s_pFocusFrame = NULL;
     174             :     }
     175        3215 : }
     176             : 
     177      256157 : SalGraphics* SvpSalFrame::AcquireGraphics()
     178             : {
     179      256157 :     SvpSalGraphics* pGraphics = new SvpSalGraphics();
     180             : #ifndef IOS
     181      256157 :     pGraphics->setDevice( m_aFrame );
     182             : #endif
     183      256157 :     m_aGraphics.push_back( pGraphics );
     184      256157 :     return pGraphics;
     185             : }
     186             : 
     187      255799 : void SvpSalFrame::ReleaseGraphics( SalGraphics* pGraphics )
     188             : {
     189      255799 :     SvpSalGraphics* pSvpGraphics = dynamic_cast<SvpSalGraphics*>(pGraphics);
     190      255799 :     m_aGraphics.remove( pSvpGraphics );
     191      255799 :     delete pSvpGraphics;
     192      255799 : }
     193             : 
     194       99080 : bool SvpSalFrame::PostEvent( void* pData )
     195             : {
     196       99080 :     m_pInstance->PostEvent( this, pData, SALEVENT_USEREVENT );
     197       99080 :     return true;
     198             : }
     199             : 
     200        2949 : void SvpSalFrame::PostPaint(bool bImmediate) const
     201             : {
     202        2949 :     if( m_bVisible )
     203             :     {
     204        2944 :         SalPaintEvent aPEvt(0, 0, maGeometry.nWidth, maGeometry.nHeight);
     205        2944 :         aPEvt.mbImmediateUpdate = bImmediate;
     206        2944 :         CallCallback( SALEVENT_PAINT, &aPEvt );
     207             :     }
     208        2949 : }
     209             : 
     210        6792 : void SvpSalFrame::SetTitle( const OUString& )
     211             : {
     212        6792 : }
     213             : 
     214        3278 : void SvpSalFrame::SetIcon( sal_uInt16 )
     215             : {
     216        3278 : }
     217             : 
     218           0 : void SvpSalFrame::SetMenu( SalMenu* )
     219             : {
     220           0 : }
     221             : 
     222           0 : void SvpSalFrame::DrawMenuBar()
     223             : {
     224           0 : }
     225             : 
     226        4952 : void SvpSalFrame::SetExtendedFrameStyle( SalExtStyle )
     227             : {
     228        4952 : }
     229             : 
     230        6378 : void SvpSalFrame::Show( bool bVisible, bool bNoActivate )
     231             : {
     232        6378 :     if( bVisible && ! m_bVisible )
     233             :     {
     234             :         // SAL_DEBUG("SvpSalFrame::Show: showing: " << this);
     235        3191 :         m_bVisible = true;
     236        3191 :         m_pInstance->PostEvent( this, NULL, SALEVENT_RESIZE );
     237        6382 :         if( ! bNoActivate )
     238        3179 :             GetFocus();
     239             :     }
     240        3187 :     else if( ! bVisible && m_bVisible )
     241             :     {
     242             :         // SAL_DEBUG("SvpSalFrame::Show: hiding: " << this);
     243        3185 :         m_bVisible = false;
     244        3185 :         m_pInstance->PostEvent( this, NULL, SALEVENT_RESIZE );
     245        3185 :         LoseFocus();
     246             :     }
     247             :     else
     248             :     {
     249             :         // SAL_DEBUG("SvpSalFrame::Show: nothihg: " << this);
     250             :     }
     251        6378 : }
     252             : 
     253           2 : void SvpSalFrame::SetMinClientSize( long nWidth, long nHeight )
     254             : {
     255           2 :     m_nMinWidth = nWidth;
     256           2 :     m_nMinHeight = nHeight;
     257           2 : }
     258             : 
     259           0 : void SvpSalFrame::SetMaxClientSize( long nWidth, long nHeight )
     260             : {
     261           0 :     m_nMaxWidth = nWidth;
     262           0 :     m_nMaxHeight = nHeight;
     263           0 : }
     264             : 
     265       16128 : void SvpSalFrame::SetPosSize( long nX, long nY, long nWidth, long nHeight, sal_uInt16 nFlags )
     266             : {
     267       16128 :     if( (nFlags & SAL_FRAME_POSSIZE_X) != 0 )
     268        3120 :         maGeometry.nX = nX;
     269       16128 :     if( (nFlags & SAL_FRAME_POSSIZE_Y) != 0 )
     270        3120 :         maGeometry.nY = nY;
     271       16128 :     if( (nFlags & SAL_FRAME_POSSIZE_WIDTH) != 0 )
     272             :     {
     273       16112 :         maGeometry.nWidth = nWidth;
     274       16112 :         if( m_nMaxWidth > 0 && maGeometry.nWidth > (unsigned int)m_nMaxWidth )
     275           0 :             maGeometry.nWidth = m_nMaxWidth;
     276       16112 :         if( m_nMinWidth > 0 && maGeometry.nWidth < (unsigned int)m_nMinWidth )
     277           0 :             maGeometry.nWidth = m_nMinWidth;
     278             :     }
     279       16128 :     if( (nFlags & SAL_FRAME_POSSIZE_HEIGHT) != 0 )
     280             :     {
     281       16112 :         maGeometry.nHeight = nHeight;
     282       16112 :         if( m_nMaxHeight > 0 && maGeometry.nHeight > (unsigned int)m_nMaxHeight )
     283           0 :             maGeometry.nHeight = m_nMaxHeight;
     284       16112 :         if( m_nMinHeight > 0 && maGeometry.nHeight < (unsigned int)m_nMinHeight )
     285           0 :             maGeometry.nHeight = m_nMinHeight;
     286             :     }
     287             : #ifndef IOS
     288       16128 :     B2IVector aFrameSize( maGeometry.nWidth, maGeometry.nHeight );
     289       16128 :     if( ! m_aFrame.get() || m_aFrame->getSize() != aFrameSize )
     290             :     {
     291       10793 :         if( aFrameSize.getX() == 0 )
     292           3 :             aFrameSize.setX( 1 );
     293       10793 :         if( aFrameSize.getY() == 0 )
     294           3 :             aFrameSize.setY( 1 );
     295       10793 :         sal_Int32 nStride = basebmp::getBitmapDeviceStrideForWidth(m_nScanlineFormat, aFrameSize.getX());
     296       10793 :         m_aFrame = createBitmapDevice( aFrameSize, m_bTopDown, m_nScanlineFormat, nStride );
     297       10793 :         if (m_bDamageTracking)
     298             :             m_aFrame->setDamageTracker(
     299           0 :                 basebmp::IBitmapDeviceDamageTrackerSharedPtr( new DamageTracker ) );
     300             :         // update device in existing graphics
     301      113220 :         for( std::list< SvpSalGraphics* >::iterator it = m_aGraphics.begin();
     302       75480 :              it != m_aGraphics.end(); ++it )
     303             :         {
     304       26947 :              (*it)->setDevice( m_aFrame );
     305             :         }
     306             :     }
     307       16128 :     if( m_bVisible )
     308          13 :         m_pInstance->PostEvent( this, NULL, SALEVENT_RESIZE );
     309             : #endif
     310       16128 : }
     311             : 
     312        6443 : void SvpSalFrame::GetClientSize( long& rWidth, long& rHeight )
     313             : {
     314        6443 :     if( m_bVisible )
     315             :     {
     316        3019 :         rWidth = maGeometry.nWidth;
     317        3019 :         rHeight = maGeometry.nHeight;
     318             :     }
     319             :     else
     320        3424 :         rWidth = rHeight = 0;
     321        6443 : }
     322             : 
     323       10544 : void SvpSalFrame::GetWorkArea( Rectangle& rRect )
     324             : {
     325             :     rRect = Rectangle( Point( 0, 0 ),
     326       10544 :                        Size( VIRTUAL_DESKTOP_WIDTH, VIRTUAL_DESKTOP_HEIGHT ) );
     327       10544 : }
     328             : 
     329       24779 : SalFrame* SvpSalFrame::GetParent() const
     330             : {
     331       24779 :     return m_pParent;
     332             : }
     333             : 
     334             : #define _FRAMESTATE_MASK_GEOMETRY \
     335             :      (WINDOWSTATE_MASK_X     | WINDOWSTATE_MASK_Y |   \
     336             :       WINDOWSTATE_MASK_WIDTH | WINDOWSTATE_MASK_HEIGHT)
     337             : 
     338        3209 : void SvpSalFrame::SetWindowState( const SalFrameState *pState )
     339             : {
     340        3209 :     if (pState == NULL)
     341        3209 :         return;
     342             : 
     343             :     // Request for position or size change
     344        3209 :     if (pState->mnMask & _FRAMESTATE_MASK_GEOMETRY)
     345             :     {
     346        3092 :         long nX = maGeometry.nX;
     347        3092 :         long nY = maGeometry.nY;
     348        3092 :         long nWidth = maGeometry.nWidth;
     349        3092 :         long nHeight = maGeometry.nHeight;
     350             : 
     351             :         // change requested properties
     352        3092 :         if (pState->mnMask & WINDOWSTATE_MASK_X)
     353        3092 :             nX = pState->mnX;
     354        3092 :         if (pState->mnMask & WINDOWSTATE_MASK_Y)
     355        3092 :             nY = pState->mnY;
     356        3092 :         if (pState->mnMask & WINDOWSTATE_MASK_WIDTH)
     357        3092 :             nWidth = pState->mnWidth;
     358        3092 :         if (pState->mnMask & WINDOWSTATE_MASK_HEIGHT)
     359        3092 :             nHeight = pState->mnHeight;
     360             : 
     361             :         SetPosSize( nX, nY, nWidth, nHeight,
     362             :                     SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y |
     363        3092 :                     SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT );
     364             :     }
     365             : }
     366             : 
     367       12876 : bool SvpSalFrame::GetWindowState( SalFrameState* pState )
     368             : {
     369       12876 :     pState->mnState = WINDOWSTATE_STATE_NORMAL;
     370       12876 :     pState->mnX      = maGeometry.nX;
     371       12876 :     pState->mnY      = maGeometry.nY;
     372       12876 :     pState->mnWidth  = maGeometry.nWidth;
     373       12876 :     pState->mnHeight = maGeometry.nHeight;
     374       12876 :     pState->mnMask   = _FRAMESTATE_MASK_GEOMETRY | WINDOWSTATE_MASK_STATE;
     375             : 
     376       12876 :     return true;
     377             : }
     378             : 
     379           0 : void SvpSalFrame::ShowFullScreen( bool, sal_Int32 )
     380             : {
     381             :     SetPosSize( 0, 0, VIRTUAL_DESKTOP_WIDTH, VIRTUAL_DESKTOP_HEIGHT,
     382           0 :                 SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT );
     383           0 : }
     384             : 
     385           0 : void SvpSalFrame::StartPresentation( bool )
     386             : {
     387           0 : }
     388             : 
     389           0 : void SvpSalFrame::SetAlwaysOnTop( bool )
     390             : {
     391           0 : }
     392             : 
     393        6482 : void SvpSalFrame::ToTop( sal_uInt16 )
     394             : {
     395        6482 :     GetFocus();
     396        6482 : }
     397             : 
     398           3 : void SvpSalFrame::SetPointer( PointerStyle )
     399             : {
     400           3 : }
     401             : 
     402           8 : void SvpSalFrame::CaptureMouse( bool )
     403             : {
     404           8 : }
     405             : 
     406           4 : void SvpSalFrame::SetPointerPos( long, long )
     407             : {
     408           4 : }
     409             : 
     410       73437 : void SvpSalFrame::Flush()
     411             : {
     412       73437 : }
     413             : 
     414           0 : void SvpSalFrame::Sync()
     415             : {
     416           0 : }
     417             : 
     418        5537 : void SvpSalFrame::SetInputContext( SalInputContext* )
     419             : {
     420        5537 : }
     421             : 
     422           0 : void SvpSalFrame::EndExtTextInput( EndExtTextInputFlags )
     423             : {
     424           0 : }
     425             : 
     426       43180 : OUString SvpSalFrame::GetKeyName( sal_uInt16 )
     427             : {
     428       43180 :     return OUString();
     429             : }
     430             : 
     431           0 : bool SvpSalFrame::MapUnicodeToKeyCode( sal_Unicode, LanguageType, vcl::KeyCode& )
     432             : {
     433           0 :     return false;
     434             : }
     435             : 
     436        3059 : LanguageType SvpSalFrame::GetInputLanguage()
     437             : {
     438        3059 :     return LANGUAGE_DONTKNOW;
     439             : }
     440             : 
     441         666 : void SvpSalFrame::UpdateSettings( AllSettings& )
     442             : {
     443         666 : }
     444             : 
     445           0 : void SvpSalFrame::Beep()
     446             : {
     447           0 : }
     448             : 
     449        8900 : const SystemEnvData* SvpSalFrame::GetSystemData() const
     450             : {
     451        8900 :     return &m_aSystemChildData;
     452             : }
     453             : 
     454         249 : SalFrame::SalPointerState SvpSalFrame::GetPointerState()
     455             : {
     456         249 :     SalPointerState aState;
     457         249 :     aState.mnState = 0;
     458         249 :     return aState;
     459             : }
     460             : 
     461           0 : KeyIndicatorState SvpSalFrame::GetIndicatorState()
     462             : {
     463           0 :     return KeyIndicatorState::NONE;
     464             : }
     465             : 
     466           0 : void SvpSalFrame::SimulateKeyPress( sal_uInt16 /*nKeyCode*/ )
     467             : {
     468           0 : }
     469             : 
     470        2464 : void SvpSalFrame::SetParent( SalFrame* pNewParent )
     471             : {
     472        2464 :     if( m_pParent )
     473        2464 :         m_pParent->m_aChildren.remove( this );
     474        2464 :     m_pParent = static_cast<SvpSalFrame*>(pNewParent);
     475        2464 : }
     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           0 : }
     497             : 
     498           0 : SalFrame* GetSvpFocusFrameForLibreOfficeKit()
     499             : {
     500           0 :     return SvpSalFrame::GetFocusFrame();
     501             : }
     502             : 
     503           0 : vcl::Window* GetSalFrameWindowForLibreOfficeKit(SalFrame *pSF)
     504             : {
     505           0 :     return pSF->GetWindow();
     506         801 : }
     507             : 
     508             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11