LCOV - code coverage report
Current view: top level - vcl/source/window - window2.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 655 1074 61.0 %
Date: 2014-11-03 Functions: 147 180 81.7 %
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 <limits.h>
      21             : #include <tools/debug.hxx>
      22             : #include <tools/poly.hxx>
      23             : 
      24             : #include <vcl/bitmap.hxx>
      25             : #include <vcl/dialog.hxx>
      26             : #include <vcl/event.hxx>
      27             : #include <vcl/fixed.hxx>
      28             : #include <vcl/layout.hxx>
      29             : #include <vcl/timer.hxx>
      30             : #include <vcl/metric.hxx>
      31             : #include <vcl/virdev.hxx>
      32             : #include <vcl/window.hxx>
      33             : #include <vcl/scrbar.hxx>
      34             : #include <vcl/dockwin.hxx>
      35             : #include <vcl/tabctrl.hxx>
      36             : #include <vcl/settings.hxx>
      37             : 
      38             : #include <window.h>
      39             : #include <outfont.hxx>
      40             : #include <outdev.h>
      41             : #include <svdata.hxx>
      42             : #include <impbmp.hxx>
      43             : #include <salbmp.hxx>
      44             : #include <salgdi.hxx>
      45             : #include <salframe.hxx>
      46             : #include <scrwnd.hxx>
      47             : 
      48             : using namespace com::sun::star;
      49             : 
      50             : namespace vcl {
      51             : 
      52         248 : void Window::ShowFocus( const Rectangle& rRect )
      53             : {
      54         248 :     if( mpWindowImpl->mbInShowFocus )
      55           0 :         return;
      56         248 :     mpWindowImpl->mbInShowFocus = true;
      57             : 
      58         248 :     ImplWinData* pWinData = ImplGetWinData();
      59             : 
      60             :     // native themeing suggest not to use focus rects
      61         248 :     if( ! ( mpWindowImpl->mbUseNativeFocus &&
      62         248 :             IsNativeWidgetEnabled() ) )
      63             :     {
      64         248 :         if ( !mpWindowImpl->mbInPaint )
      65             :         {
      66          15 :             if ( mpWindowImpl->mbFocusVisible )
      67             :             {
      68           0 :                 if ( *(pWinData->mpFocusRect) == rRect )
      69             :                 {
      70           0 :                     mpWindowImpl->mbInShowFocus = false;
      71           0 :                     return;
      72             :                 }
      73             : 
      74           0 :                 ImplInvertFocus( *(pWinData->mpFocusRect) );
      75             :             }
      76             : 
      77          15 :             ImplInvertFocus( rRect );
      78             :         }
      79         248 :         if ( !pWinData->mpFocusRect )
      80         129 :             pWinData->mpFocusRect = new Rectangle( rRect );
      81             :         else
      82         119 :             *(pWinData->mpFocusRect) = rRect;
      83         248 :         mpWindowImpl->mbFocusVisible = true;
      84             :     }
      85             :     else
      86             :     {
      87           0 :         if( ! mpWindowImpl->mbNativeFocusVisible )
      88             :         {
      89           0 :             mpWindowImpl->mbNativeFocusVisible = true;
      90           0 :             if ( !mpWindowImpl->mbInPaint )
      91           0 :                 Invalidate();
      92             :         }
      93             :     }
      94         248 :     mpWindowImpl->mbInShowFocus = false;
      95             : }
      96             : 
      97       28675 : void Window::HideFocus()
      98             : {
      99             : 
     100       28675 :     if( mpWindowImpl->mbInHideFocus )
     101           0 :         return;
     102       28675 :     mpWindowImpl->mbInHideFocus = true;
     103             : 
     104             :     // native themeing can suggest not to use focus rects
     105       28675 :     if( ! ( mpWindowImpl->mbUseNativeFocus &&
     106       28675 :             IsNativeWidgetEnabled() ) )
     107             :     {
     108       28675 :         if ( !mpWindowImpl->mbFocusVisible )
     109             :         {
     110       28436 :             mpWindowImpl->mbInHideFocus = false;
     111       28436 :             return;
     112             :         }
     113             : 
     114         239 :         if ( !mpWindowImpl->mbInPaint )
     115         235 :             ImplInvertFocus( *(ImplGetWinData()->mpFocusRect) );
     116         239 :         mpWindowImpl->mbFocusVisible = false;
     117             :     }
     118             :     else
     119             :     {
     120           0 :         if( mpWindowImpl->mbNativeFocusVisible )
     121             :         {
     122           0 :             mpWindowImpl->mbNativeFocusVisible = false;
     123           0 :             if ( !mpWindowImpl->mbInPaint )
     124           0 :                 Invalidate();
     125             :         }
     126             :     }
     127         239 :     mpWindowImpl->mbInHideFocus = false;
     128             : }
     129             : 
     130      103960 : void Window::Invert( const Rectangle& rRect, sal_uInt16 nFlags )
     131             : {
     132      103960 :     if ( !IsDeviceOutputNecessary() )
     133         412 :         return;
     134             : 
     135      103900 :     OutputDevice *pOutDev = GetOutDev();
     136      103900 :     Rectangle aRect( pOutDev->ImplLogicToDevicePixel( rRect ) );
     137             : 
     138      103900 :     if ( aRect.IsEmpty() )
     139         274 :         return;
     140      103626 :     aRect.Justify();
     141             : 
     142             :     // we need a graphics
     143      103626 :     if ( !mpGraphics )
     144             :     {
     145           0 :         if ( !pOutDev->AcquireGraphics() )
     146           0 :             return;
     147             :     }
     148             : 
     149      103626 :     if ( mbInitClipRegion )
     150       12715 :         InitClipRegion();
     151             : 
     152      103626 :     if ( mbOutputClipped )
     153          18 :         return;
     154             : 
     155      103608 :     SalInvert nSalFlags = 0;
     156      103608 :     if ( nFlags & INVERT_HIGHLIGHT )
     157           0 :         nSalFlags |= SAL_INVERT_HIGHLIGHT;
     158      103608 :     if ( nFlags & INVERT_50 )
     159           0 :         nSalFlags |= SAL_INVERT_50;
     160      103608 :     mpGraphics->Invert( aRect.Left(), aRect.Top(), aRect.GetWidth(), aRect.GetHeight(), nSalFlags, this );
     161             : }
     162             : 
     163          24 : void Window::Invert( const Polygon& rPoly, sal_uInt16 nFlags )
     164             : {
     165          24 :     if ( !IsDeviceOutputNecessary() )
     166           0 :         return;
     167             : 
     168          24 :     sal_uInt16 nPoints = rPoly.GetSize();
     169             : 
     170          24 :     if ( nPoints < 2 )
     171           0 :         return;
     172             : 
     173          24 :     OutputDevice *pOutDev = GetOutDev();
     174          24 :     Polygon aPoly( pOutDev->ImplLogicToDevicePixel( rPoly ) );
     175             : 
     176             :     // we need a graphics
     177          24 :     if ( !mpGraphics )
     178             :     {
     179           0 :         if ( !pOutDev->AcquireGraphics() )
     180           0 :             return;
     181             :     }
     182             : 
     183          24 :     if ( mbInitClipRegion )
     184           2 :         InitClipRegion();
     185             : 
     186          24 :     if ( mbOutputClipped )
     187           0 :         return;
     188             : 
     189          24 :     SalInvert nSalFlags = 0;
     190          24 :     if ( nFlags & INVERT_HIGHLIGHT )
     191           0 :         nSalFlags |= SAL_INVERT_HIGHLIGHT;
     192          24 :     if ( nFlags & INVERT_50 )
     193           0 :         nSalFlags |= SAL_INVERT_50;
     194          24 :     const SalPoint* pPtAry = (const SalPoint*)aPoly.GetConstPointAry();
     195          24 :     mpGraphics->Invert( nPoints, pPtAry, nSalFlags, this );
     196             : }
     197             : 
     198           0 : void Window::ShowTracking( const Rectangle& rRect, sal_uInt16 nFlags )
     199             : {
     200           0 :     ImplWinData* pWinData = ImplGetWinData();
     201             : 
     202           0 :     if ( !mpWindowImpl->mbInPaint || !(nFlags & SHOWTRACK_WINDOW) )
     203             :     {
     204           0 :         if ( mpWindowImpl->mbTrackVisible )
     205             :         {
     206           0 :             if ( (*(pWinData->mpTrackRect)  == rRect) &&
     207           0 :                  (pWinData->mnTrackFlags    == nFlags) )
     208           0 :                 return;
     209             : 
     210           0 :             InvertTracking( *(pWinData->mpTrackRect), pWinData->mnTrackFlags );
     211             :         }
     212             : 
     213           0 :         InvertTracking( rRect, nFlags );
     214             :     }
     215             : 
     216           0 :     if ( !pWinData->mpTrackRect )
     217           0 :         pWinData->mpTrackRect = new Rectangle( rRect );
     218             :     else
     219           0 :         *(pWinData->mpTrackRect) = rRect;
     220           0 :     pWinData->mnTrackFlags      = nFlags;
     221           0 :     mpWindowImpl->mbTrackVisible              = true;
     222             : }
     223             : 
     224           0 : void Window::HideTracking()
     225             : {
     226           0 :     if ( mpWindowImpl->mbTrackVisible )
     227             :     {
     228           0 :         ImplWinData* pWinData = ImplGetWinData();
     229           0 :         if ( !mpWindowImpl->mbInPaint || !(pWinData->mnTrackFlags & SHOWTRACK_WINDOW) )
     230           0 :             InvertTracking( *(pWinData->mpTrackRect), pWinData->mnTrackFlags );
     231           0 :         mpWindowImpl->mbTrackVisible = false;
     232             :     }
     233           0 : }
     234             : 
     235         507 : void Window::InvertTracking( const Rectangle& rRect, sal_uInt16 nFlags )
     236             : {
     237         507 :     OutputDevice *pOutDev = GetOutDev();
     238         507 :     Rectangle aRect( pOutDev->ImplLogicToDevicePixel( rRect ) );
     239             : 
     240         507 :     if ( aRect.IsEmpty() )
     241         113 :         return;
     242         501 :     aRect.Justify();
     243             : 
     244             :     SalGraphics* pGraphics;
     245             : 
     246         501 :     if ( nFlags & SHOWTRACK_WINDOW )
     247             :     {
     248         501 :         if ( !IsDeviceOutputNecessary() )
     249         101 :             return;
     250             : 
     251             :         // we need a graphics
     252         400 :         if ( !mpGraphics )
     253             :         {
     254           0 :             if ( !pOutDev->AcquireGraphics() )
     255           0 :                 return;
     256             :         }
     257             : 
     258         400 :         if ( mbInitClipRegion )
     259         281 :             InitClipRegion();
     260             : 
     261         400 :         if ( mbOutputClipped )
     262           0 :             return;
     263             : 
     264         400 :         pGraphics = mpGraphics;
     265             :     }
     266             :     else
     267             :     {
     268           0 :         pGraphics = ImplGetFrameGraphics();
     269             : 
     270           0 :         if ( nFlags & SHOWTRACK_CLIP )
     271             :         {
     272           0 :             Point aPoint( mnOutOffX, mnOutOffY );
     273             :             vcl::Region aRegion( Rectangle( aPoint,
     274           0 :                                        Size( mnOutWidth, mnOutHeight ) ) );
     275           0 :             ImplClipBoundaries( aRegion, false, false );
     276           0 :             pOutDev->SelectClipRegion( aRegion, pGraphics );
     277             :         }
     278             :     }
     279             : 
     280         400 :     sal_uInt16 nStyle = nFlags & SHOWTRACK_STYLE;
     281         400 :     if ( nStyle == SHOWTRACK_OBJECT )
     282           0 :         pGraphics->Invert( aRect.Left(), aRect.Top(), aRect.GetWidth(), aRect.GetHeight(), SAL_INVERT_TRACKFRAME, this );
     283         400 :     else if ( nStyle == SHOWTRACK_SPLIT )
     284           0 :         pGraphics->Invert( aRect.Left(), aRect.Top(), aRect.GetWidth(), aRect.GetHeight(), SAL_INVERT_50, this );
     285             :     else
     286             :     {
     287         400 :         long nBorder = 1;
     288         400 :         if ( nStyle == SHOWTRACK_BIG )
     289           0 :             nBorder = 5;
     290         400 :         pGraphics->Invert( aRect.Left(), aRect.Top(), aRect.GetWidth(), nBorder, SAL_INVERT_50, this );
     291         400 :         pGraphics->Invert( aRect.Left(), aRect.Bottom()-nBorder+1, aRect.GetWidth(), nBorder, SAL_INVERT_50, this );
     292         400 :         pGraphics->Invert( aRect.Left(), aRect.Top()+nBorder, nBorder, aRect.GetHeight()-(nBorder*2), SAL_INVERT_50, this );
     293         400 :         pGraphics->Invert( aRect.Right()-nBorder+1, aRect.Top()+nBorder, nBorder, aRect.GetHeight()-(nBorder*2), SAL_INVERT_50, this );
     294             :     }
     295             : }
     296             : 
     297           0 : void Window::InvertTracking( const Polygon& rPoly, sal_uInt16 nFlags )
     298             : {
     299           0 :     sal_uInt16 nPoints = rPoly.GetSize();
     300             : 
     301           0 :     if ( nPoints < 2 )
     302           0 :         return;
     303             : 
     304           0 :     OutputDevice *pOutDev = GetOutDev();
     305             : 
     306           0 :     Polygon aPoly( pOutDev->ImplLogicToDevicePixel( rPoly ) );
     307             : 
     308             :     SalGraphics* pGraphics;
     309             : 
     310           0 :     if ( nFlags & SHOWTRACK_WINDOW )
     311             :     {
     312           0 :         if ( !IsDeviceOutputNecessary() )
     313           0 :             return;
     314             : 
     315             :         // we need a graphics
     316           0 :         if ( !mpGraphics )
     317             :         {
     318           0 :             if ( !pOutDev->AcquireGraphics() )
     319           0 :                 return;
     320             :         }
     321             : 
     322           0 :         if ( mbInitClipRegion )
     323           0 :             InitClipRegion();
     324             : 
     325           0 :         if ( mbOutputClipped )
     326           0 :             return;
     327             : 
     328           0 :         pGraphics = mpGraphics;
     329             :     }
     330             :     else
     331             :     {
     332           0 :         pGraphics = ImplGetFrameGraphics();
     333             : 
     334           0 :         if ( nFlags & SHOWTRACK_CLIP )
     335             :         {
     336           0 :             Point aPoint( mnOutOffX, mnOutOffY );
     337             :             vcl::Region aRegion( Rectangle( aPoint,
     338           0 :                                        Size( mnOutWidth, mnOutHeight ) ) );
     339           0 :             ImplClipBoundaries( aRegion, false, false );
     340           0 :             pOutDev->SelectClipRegion( aRegion, pGraphics );
     341             :         }
     342             :     }
     343             : 
     344           0 :     const SalPoint* pPtAry = (const SalPoint*)aPoly.GetConstPointAry();
     345           0 :     pGraphics->Invert( nPoints, pPtAry, SAL_INVERT_TRACKFRAME, this );
     346             : }
     347             : 
     348           0 : IMPL_LINK( Window, ImplTrackTimerHdl, Timer*, pTimer )
     349             : {
     350           0 :     ImplSVData* pSVData = ImplGetSVData();
     351             : 
     352             :     // Bei Button-Repeat muessen wir den Timeout umsetzen
     353           0 :     if ( pSVData->maWinData.mnTrackFlags & STARTTRACK_BUTTONREPEAT )
     354           0 :         pTimer->SetTimeout( GetSettings().GetMouseSettings().GetButtonRepeat() );
     355             : 
     356             :     // Tracking-Event erzeugen
     357           0 :     Point           aMousePos( mpWindowImpl->mpFrameData->mnLastMouseX, mpWindowImpl->mpFrameData->mnLastMouseY );
     358           0 :     if( ImplIsAntiparallel() )
     359             :     {
     360             :         // - RTL - re-mirror frame pos at pChild
     361           0 :         const OutputDevice *pOutDev = GetOutDev();
     362           0 :         pOutDev->ReMirror( aMousePos );
     363             :     }
     364             :     MouseEvent      aMEvt( ImplFrameToOutput( aMousePos ),
     365             :                            mpWindowImpl->mpFrameData->mnClickCount, 0,
     366           0 :                            mpWindowImpl->mpFrameData->mnMouseCode, mpWindowImpl->mpFrameData->mnMouseCode );
     367           0 :     TrackingEvent   aTEvt( aMEvt, TRACKING_REPEAT );
     368           0 :     Tracking( aTEvt );
     369             : 
     370           0 :     return 0;
     371             : }
     372             : 
     373           0 : void Window::StartTracking( sal_uInt16 nFlags )
     374             : {
     375           0 :     ImplSVData* pSVData = ImplGetSVData();
     376             : 
     377           0 :     if ( pSVData->maWinData.mpTrackWin != this )
     378             :     {
     379           0 :         if ( pSVData->maWinData.mpTrackWin )
     380           0 :             pSVData->maWinData.mpTrackWin->EndTracking( ENDTRACK_CANCEL );
     381             :     }
     382             : 
     383           0 :     if ( nFlags & (STARTTRACK_SCROLLREPEAT | STARTTRACK_BUTTONREPEAT) )
     384             :     {
     385           0 :         pSVData->maWinData.mpTrackTimer = new AutoTimer;
     386             : 
     387           0 :         if ( nFlags & STARTTRACK_SCROLLREPEAT )
     388           0 :             pSVData->maWinData.mpTrackTimer->SetTimeout( GetSettings().GetMouseSettings().GetScrollRepeat() );
     389             :         else
     390           0 :             pSVData->maWinData.mpTrackTimer->SetTimeout( GetSettings().GetMouseSettings().GetButtonStartRepeat() );
     391           0 :         pSVData->maWinData.mpTrackTimer->SetTimeoutHdl( LINK( this, Window, ImplTrackTimerHdl ) );
     392           0 :         pSVData->maWinData.mpTrackTimer->Start();
     393             :     }
     394             : 
     395           0 :     pSVData->maWinData.mpTrackWin   = this;
     396           0 :     pSVData->maWinData.mnTrackFlags = nFlags;
     397           0 :     CaptureMouse();
     398           0 : }
     399             : 
     400           6 : void Window::EndTracking( sal_uInt16 nFlags )
     401             : {
     402           6 :     ImplSVData* pSVData = ImplGetSVData();
     403             : 
     404           6 :     if ( pSVData->maWinData.mpTrackWin == this )
     405             :     {
     406             :         // due to DbgChkThis in brackets, as the window could be destroyed
     407             :         // in the handler
     408             :         {
     409             : 
     410           0 :         if ( pSVData->maWinData.mpTrackTimer )
     411             :         {
     412           0 :             delete pSVData->maWinData.mpTrackTimer;
     413           0 :             pSVData->maWinData.mpTrackTimer = NULL;
     414             :         }
     415             : 
     416           0 :         pSVData->maWinData.mpTrackWin    = NULL;
     417           0 :         pSVData->maWinData.mnTrackFlags  = 0;
     418           0 :         ReleaseMouse();
     419             :         }
     420             : 
     421             :         // call EndTracking if required
     422           0 :         if ( !(nFlags & ENDTRACK_DONTCALLHDL) )
     423             :         {
     424           0 :             Point           aMousePos( mpWindowImpl->mpFrameData->mnLastMouseX, mpWindowImpl->mpFrameData->mnLastMouseY );
     425           0 :             if( ImplIsAntiparallel() )
     426             :             {
     427             :                 // - RTL - re-mirror frame pos at pChild
     428           0 :                 const OutputDevice *pOutDev = GetOutDev();
     429           0 :                 pOutDev->ReMirror( aMousePos );
     430             :             }
     431             : 
     432             :             MouseEvent      aMEvt( ImplFrameToOutput( aMousePos ),
     433             :                                    mpWindowImpl->mpFrameData->mnClickCount, 0,
     434           0 :                                    mpWindowImpl->mpFrameData->mnMouseCode, mpWindowImpl->mpFrameData->mnMouseCode );
     435           0 :             TrackingEvent   aTEvt( aMEvt, nFlags | ENDTRACK_END );
     436           0 :             Tracking( aTEvt );
     437             :         }
     438             :     }
     439           6 : }
     440             : 
     441      144367 : bool Window::IsTracking() const
     442             : {
     443      144367 :     return (ImplGetSVData()->maWinData.mpTrackWin == this);
     444             : }
     445             : 
     446           0 : void Window::StartAutoScroll( sal_uInt16 nFlags )
     447             : {
     448           0 :     ImplSVData* pSVData = ImplGetSVData();
     449             : 
     450           0 :     if ( pSVData->maWinData.mpAutoScrollWin != this )
     451             :     {
     452           0 :         if ( pSVData->maWinData.mpAutoScrollWin )
     453           0 :             pSVData->maWinData.mpAutoScrollWin->EndAutoScroll();
     454             :     }
     455             : 
     456           0 :     pSVData->maWinData.mpAutoScrollWin = this;
     457           0 :     pSVData->maWinData.mnAutoScrollFlags = nFlags;
     458           0 :     pSVData->maAppData.mpWheelWindow = new ImplWheelWindow( this );
     459           0 : }
     460             : 
     461           0 : void Window::EndAutoScroll()
     462             : {
     463           0 :     ImplSVData* pSVData = ImplGetSVData();
     464             : 
     465           0 :     if ( pSVData->maWinData.mpAutoScrollWin == this )
     466             :     {
     467           0 :         pSVData->maWinData.mpAutoScrollWin = NULL;
     468           0 :         pSVData->maWinData.mnAutoScrollFlags = 0;
     469           0 :         pSVData->maAppData.mpWheelWindow->ImplStop();
     470           0 :         pSVData->maAppData.mpWheelWindow->doLazyDelete();
     471           0 :         pSVData->maAppData.mpWheelWindow = NULL;
     472             :     }
     473           0 : }
     474             : 
     475          16 : sal_uIntPtr Window::SaveFocus()
     476             : {
     477          16 :     ImplSVData* pSVData = ImplGetSVData();
     478          16 :     if ( pSVData->maWinData.mpFocusWin )
     479             :     {
     480          16 :         ImplFocusDelData* pDelData = new ImplFocusDelData;
     481          16 :         pSVData->maWinData.mpFocusWin->ImplAddDel( pDelData );
     482          16 :         pDelData->mpFocusWin = pSVData->maWinData.mpFocusWin;
     483          16 :         return reinterpret_cast<sal_uIntPtr>(pDelData);
     484             :     }
     485             :     else
     486           0 :         return 0;
     487             : }
     488             : 
     489          32 : bool Window::EndSaveFocus( sal_uIntPtr nSaveId, bool bRestore )
     490             : {
     491          32 :     if ( !nSaveId )
     492          20 :         return false;
     493             :     else
     494             :     {
     495          12 :         bool                bOK = true;
     496          12 :         ImplFocusDelData*   pDelData = reinterpret_cast<ImplFocusDelData*>(nSaveId);
     497          12 :         if ( !pDelData->IsDead() )
     498             :         {
     499          12 :             pDelData->mpFocusWin->ImplRemoveDel( pDelData );
     500          12 :             if ( bRestore )
     501          12 :                 pDelData->mpFocusWin->GrabFocus();
     502             :         }
     503             :         else
     504           0 :             bOK = !bRestore;
     505          12 :         delete pDelData;
     506          12 :         return bOK;
     507             :     }
     508             : }
     509             : 
     510       15928 : void Window::SetZoom( const Fraction& rZoom )
     511             : {
     512       15928 :     if ( mpWindowImpl->maZoom != rZoom )
     513             :     {
     514          85 :         mpWindowImpl->maZoom = rZoom;
     515          85 :         StateChanged( StateChangedType::ZOOM );
     516             :     }
     517       15928 : }
     518             : 
     519         464 : inline long WinFloatRound( double fVal )
     520             : {
     521         464 :     return( fVal > 0.0 ? (long) ( fVal + 0.5 ) : -(long) ( -fVal + 0.5 ) );
     522             : }
     523             : 
     524      163726 : void Window::SetZoomedPointFont( const vcl::Font& rFont )
     525             : {
     526      163726 :     const Fraction& rZoom = GetZoom();
     527      163726 :     if ( rZoom.GetNumerator() != rZoom.GetDenominator() )
     528             :     {
     529          84 :         vcl::Font aFont( rFont );
     530          84 :         Size aSize = aFont.GetSize();
     531          84 :         double n = (double)aSize.Width();
     532          84 :         n *= (double)rZoom.GetNumerator();
     533          84 :         n /= (double)rZoom.GetDenominator();
     534          84 :         aSize.Width() = WinFloatRound( n );
     535          84 :         n = (double)aSize.Height();
     536          84 :         n *= (double)rZoom.GetNumerator();
     537          84 :         n /= (double)rZoom.GetDenominator();
     538          84 :         aSize.Height() = WinFloatRound( n );
     539          84 :         aFont.SetSize( aSize );
     540          84 :         SetPointFont( aFont );
     541             : 
     542             :         // Use another font if the representation is to be scaled,
     543             :         // and the actual font is not scalable
     544         168 :         FontMetric aMetric = GetFontMetric();
     545          84 :         long       nFontDiff = std::abs( GetFont().GetSize().Height()-aMetric.GetSize().Height() );
     546          84 :         if ( (aMetric.GetType() == TYPE_RASTER) && (nFontDiff >= 2) )
     547             :         {
     548             :             sal_uInt16 nType;
     549           0 :             if ( aMetric.GetPitch() == PITCH_FIXED )
     550           0 :                 nType = DEFAULTFONT_FIXED;
     551             :             else
     552           0 :                 nType = DEFAULTFONT_UI_SANS;
     553           0 :             vcl::Font aTempFont = GetDefaultFont( nType, GetSettings().GetLanguageTag().getLanguageType(), 0 );
     554           0 :             aFont.SetName( aTempFont.GetName() );
     555           0 :             SetPointFont( aFont );
     556          84 :         }
     557             :     }
     558             :     else
     559      163642 :         SetPointFont( rFont );
     560      163726 : }
     561             : 
     562       80429 : long Window::CalcZoom( long nCalc ) const
     563             : {
     564             : 
     565       80429 :     const Fraction& rZoom = GetZoom();
     566       80429 :     if ( rZoom.GetNumerator() != rZoom.GetDenominator() )
     567             :     {
     568         296 :         double n = (double)nCalc;
     569         296 :         n *= (double)rZoom.GetNumerator();
     570         296 :         n /= (double)rZoom.GetDenominator();
     571         296 :         nCalc = WinFloatRound( n );
     572             :     }
     573       80429 :     return nCalc;
     574             : }
     575             : 
     576        1588 : void Window::SetControlFont()
     577             : {
     578        1588 :     if ( mpWindowImpl->mpControlFont )
     579             :     {
     580           0 :         delete mpWindowImpl->mpControlFont;
     581           0 :         mpWindowImpl->mpControlFont = NULL;
     582           0 :         StateChanged( StateChangedType::CONTROLFONT );
     583             :     }
     584        1588 : }
     585             : 
     586        8803 : void Window::SetControlFont( const vcl::Font& rFont )
     587             : {
     588        8803 :     if ( rFont == vcl::Font() )
     589             :     {
     590        1380 :         SetControlFont();
     591        1380 :         return;
     592             :     }
     593             : 
     594        7423 :     if ( mpWindowImpl->mpControlFont )
     595             :     {
     596        6580 :         if ( *mpWindowImpl->mpControlFont == rFont )
     597        1326 :             return;
     598        5254 :         *mpWindowImpl->mpControlFont = rFont;
     599             :     }
     600             :     else
     601         843 :         mpWindowImpl->mpControlFont = new vcl::Font( rFont );
     602             : 
     603        6097 :     StateChanged( StateChangedType::CONTROLFONT );
     604             : }
     605             : 
     606       16854 : vcl::Font Window::GetControlFont() const
     607             : {
     608       16854 :     if ( mpWindowImpl->mpControlFont )
     609       13465 :         return *mpWindowImpl->mpControlFont;
     610             :     else
     611             :     {
     612        3389 :         vcl::Font aFont;
     613        3389 :         return aFont;
     614             :     }
     615             : }
     616             : 
     617        1046 : void Window::SetControlForeground()
     618             : {
     619        1046 :     if ( mpWindowImpl->mbControlForeground )
     620             :     {
     621           0 :         mpWindowImpl->maControlForeground = Color( COL_TRANSPARENT );
     622           0 :         mpWindowImpl->mbControlForeground = false;
     623           0 :         StateChanged( StateChangedType::CONTROLFOREGROUND );
     624             :     }
     625        1046 : }
     626             : 
     627         150 : void Window::SetControlForeground( const Color& rColor )
     628             : {
     629         150 :     if ( rColor.GetTransparency() )
     630             :     {
     631           0 :         if ( mpWindowImpl->mbControlForeground )
     632             :         {
     633           0 :             mpWindowImpl->maControlForeground = Color( COL_TRANSPARENT );
     634           0 :             mpWindowImpl->mbControlForeground = false;
     635           0 :             StateChanged( StateChangedType::CONTROLFOREGROUND );
     636             :         }
     637             :     }
     638             :     else
     639             :     {
     640         150 :         if ( mpWindowImpl->maControlForeground != rColor )
     641             :         {
     642         122 :             mpWindowImpl->maControlForeground = rColor;
     643         122 :             mpWindowImpl->mbControlForeground = true;
     644         122 :             StateChanged( StateChangedType::CONTROLFOREGROUND );
     645             :         }
     646             :     }
     647         150 : }
     648             : 
     649        1142 : void Window::SetControlBackground()
     650             : {
     651        1142 :     if ( mpWindowImpl->mbControlBackground )
     652             :     {
     653          32 :         mpWindowImpl->maControlBackground = Color( COL_TRANSPARENT );
     654          32 :         mpWindowImpl->mbControlBackground = false;
     655          32 :         StateChanged( StateChangedType::CONTROLBACKGROUND );
     656             :     }
     657        1142 : }
     658             : 
     659        5956 : void Window::SetControlBackground( const Color& rColor )
     660             : {
     661        5956 :     if ( rColor.GetTransparency() )
     662             :     {
     663           0 :         if ( mpWindowImpl->mbControlBackground )
     664             :         {
     665           0 :             mpWindowImpl->maControlBackground = Color( COL_TRANSPARENT );
     666           0 :             mpWindowImpl->mbControlBackground = false;
     667           0 :             StateChanged( StateChangedType::CONTROLBACKGROUND );
     668             :         }
     669             :     }
     670             :     else
     671             :     {
     672        5956 :         if ( mpWindowImpl->maControlBackground != rColor )
     673             :         {
     674        5956 :             mpWindowImpl->maControlBackground = rColor;
     675        5956 :             mpWindowImpl->mbControlBackground = true;
     676        5956 :             StateChanged( StateChangedType::CONTROLBACKGROUND );
     677             :         }
     678             :     }
     679        5956 : }
     680             : 
     681       65378 : Size Window::CalcWindowSize( const Size& rOutSz ) const
     682             : {
     683       65378 :     Size aSz = rOutSz;
     684       65378 :     aSz.Width()  += mpWindowImpl->mnLeftBorder+mpWindowImpl->mnRightBorder;
     685       65378 :     aSz.Height() += mpWindowImpl->mnTopBorder+mpWindowImpl->mnBottomBorder;
     686       65378 :     return aSz;
     687             : }
     688             : 
     689       30580 : Size Window::CalcOutputSize( const Size& rWinSz ) const
     690             : {
     691       30580 :     Size aSz = rWinSz;
     692       30580 :     aSz.Width()  -= mpWindowImpl->mnLeftBorder+mpWindowImpl->mnRightBorder;
     693       30580 :     aSz.Height() -= mpWindowImpl->mnTopBorder+mpWindowImpl->mnBottomBorder;
     694       30580 :     return aSz;
     695             : }
     696             : 
     697           0 : vcl::Font Window::GetDrawPixelFont( OutputDevice* pDev ) const
     698             : {
     699           0 :     vcl::Font aFont = GetPointFont();
     700           0 :     Size    aFontSize = aFont.GetSize();
     701           0 :     MapMode aPtMapMode( MAP_POINT );
     702           0 :     aFontSize = pDev->LogicToPixel( aFontSize, aPtMapMode );
     703           0 :     aFont.SetSize( aFontSize );
     704           0 :     return aFont;
     705             : }
     706             : 
     707       12523 : long Window::GetDrawPixel( OutputDevice* pDev, long nPixels ) const
     708             : {
     709       12523 :     long nP = nPixels;
     710       12523 :     if ( pDev->GetOutDevType() != OUTDEV_WINDOW )
     711             :     {
     712           0 :         MapMode aMap( MAP_100TH_MM );
     713           0 :         Size aSz( nP, 0 );
     714           0 :         aSz = PixelToLogic( aSz, aMap );
     715           0 :         aSz = pDev->LogicToPixel( aSz, aMap );
     716           0 :         nP = aSz.Width();
     717             :     }
     718       12523 :     return nP;
     719             : }
     720             : 
     721           0 : static void lcl_HandleScrollHelper( ScrollBar* pScrl, long nN, bool isMultiplyByLineSize )
     722             : {
     723           0 :     if ( pScrl && nN && pScrl->IsEnabled() && pScrl->IsInputEnabled() && ! pScrl->IsInModalMode() )
     724             :     {
     725           0 :         long nNewPos = pScrl->GetThumbPos();
     726             : 
     727           0 :         if ( nN == -LONG_MAX )
     728           0 :             nNewPos += pScrl->GetPageSize();
     729           0 :         else if ( nN == LONG_MAX )
     730           0 :             nNewPos -= pScrl->GetPageSize();
     731             :         else
     732             :         {
     733             :             // allowing both chunked and continuous scrolling
     734           0 :             if(isMultiplyByLineSize){
     735           0 :                 nN*=pScrl->GetLineSize();
     736             :             }
     737             : 
     738           0 :             const double fVal = (double)(nNewPos - nN);
     739             : 
     740           0 :             if ( fVal < LONG_MIN )
     741           0 :                 nNewPos = LONG_MIN;
     742           0 :             else if ( fVal > LONG_MAX )
     743           0 :                 nNewPos = LONG_MAX;
     744             :             else
     745           0 :                 nNewPos = (long)fVal;
     746             :         }
     747             : 
     748           0 :         pScrl->DoScroll( nNewPos );
     749             :     }
     750             : 
     751           0 : }
     752             : 
     753           0 : bool Window::HandleScrollCommand( const CommandEvent& rCmd,
     754             :                                   ScrollBar* pHScrl, ScrollBar* pVScrl )
     755             : {
     756           0 :     bool bRet = false;
     757             : 
     758           0 :     if ( pHScrl || pVScrl )
     759             :     {
     760           0 :         switch( rCmd.GetCommand() )
     761             :         {
     762             :             case COMMAND_STARTAUTOSCROLL:
     763             :             {
     764           0 :                 sal_uInt16 nFlags = 0;
     765           0 :                 if ( pHScrl )
     766             :                 {
     767           0 :                     if ( (pHScrl->GetVisibleSize() < pHScrl->GetRangeMax()) &&
     768           0 :                          pHScrl->IsEnabled() && pHScrl->IsInputEnabled() && ! pHScrl->IsInModalMode() )
     769           0 :                         nFlags |= AUTOSCROLL_HORZ;
     770             :                 }
     771           0 :                 if ( pVScrl )
     772             :                 {
     773           0 :                     if ( (pVScrl->GetVisibleSize() < pVScrl->GetRangeMax()) &&
     774           0 :                          pVScrl->IsEnabled() && pVScrl->IsInputEnabled() && ! pVScrl->IsInModalMode() )
     775           0 :                         nFlags |= AUTOSCROLL_VERT;
     776             :                 }
     777             : 
     778           0 :                 if ( nFlags )
     779             :                 {
     780           0 :                     StartAutoScroll( nFlags );
     781           0 :                     bRet = true;
     782             :                 }
     783             :             }
     784           0 :             break;
     785             : 
     786             :             case COMMAND_WHEEL:
     787             :             {
     788           0 :                 const CommandWheelData* pData = rCmd.GetWheelData();
     789             : 
     790           0 :                 if ( pData && (CommandWheelMode::SCROLL == pData->GetMode()) )
     791             :                 {
     792           0 :                     if (!pData->IsDeltaPixel())
     793             :                     {
     794           0 :                         sal_uLong nScrollLines = pData->GetScrollLines();
     795             :                         long nLines;
     796           0 :                         if ( nScrollLines == COMMAND_WHEEL_PAGESCROLL )
     797             :                         {
     798           0 :                             if ( pData->GetDelta() < 0 )
     799           0 :                                 nLines = -LONG_MAX;
     800             :                             else
     801           0 :                                 nLines = LONG_MAX;
     802             :                         }
     803             :                         else
     804           0 :                             nLines = pData->GetNotchDelta() * (long)nScrollLines;
     805           0 :                         if ( nLines )
     806             :                         {
     807             :                             ImplHandleScroll( NULL,
     808             :                                           0L,
     809           0 :                                           pData->IsHorz() ? pHScrl : pVScrl,
     810           0 :                                           nLines );
     811           0 :                             bRet = true;
     812             :                         }
     813             :                     }
     814             :                     else
     815             :                     {
     816             :                         // Mobile / touch scrolling section
     817           0 :                         const Point & deltaPoint = rCmd.GetMousePosPixel();
     818             : 
     819           0 :                         double deltaXInPixels = double(deltaPoint.X());
     820           0 :                         double deltaYInPixels = double(deltaPoint.Y());
     821           0 :                         Size winSize = this->GetOutputSizePixel();
     822             : 
     823           0 :                         if(pHScrl)
     824             :                         {
     825           0 :                             double visSizeX = double(pHScrl->GetVisibleSize());
     826           0 :                             double ratioX = deltaXInPixels / double(winSize.getWidth());
     827           0 :                             long deltaXInLogic = long(visSizeX * ratioX);
     828             :                             // Touch need to work by pixels. Did not apply this to
     829             :                             // Android, as android code may require adaptations
     830             :                             // to work with this scrolling code
     831             : #ifndef IOS
     832           0 :                             long lineSizeX = pHScrl->GetLineSize();
     833             : 
     834           0 :                             if(lineSizeX)
     835             :                             {
     836           0 :                                 deltaXInLogic /= lineSizeX;
     837             :                             }
     838             :                             else
     839             :                             {
     840           0 :                                 deltaXInLogic = 0;
     841             :                             }
     842             : #endif
     843           0 :                             if ( deltaXInLogic)
     844             :                             {
     845             : #ifndef IOS
     846           0 :                                 bool isMultiplyByLineSize = true;
     847             : #else
     848             :                                 bool isMultiplyByLineSize = false;
     849             : #endif
     850           0 :                                 lcl_HandleScrollHelper( pHScrl, deltaXInLogic, isMultiplyByLineSize );
     851           0 :                                 bRet = true;
     852             :                             }
     853             :                         }
     854           0 :                         if(pVScrl)
     855             :                         {
     856           0 :                             double visSizeY = double(pVScrl->GetVisibleSize());
     857           0 :                             double ratioY = deltaYInPixels / double(winSize.getHeight());
     858           0 :                             long deltaYInLogic = long(visSizeY * ratioY);
     859             : 
     860             :                             // Touch need to work by pixels. Did not apply this to
     861             :                             // Android, as android code may require adaptations
     862             :                             // to work with this scrolling code
     863             : #ifndef IOS
     864           0 :                             long lineSizeY = pVScrl->GetLineSize();
     865           0 :                             if(lineSizeY)
     866             :                             {
     867           0 :                                 deltaYInLogic /= lineSizeY;
     868             :                             }
     869             :                             else
     870             :                             {
     871           0 :                                 deltaYInLogic = 0;
     872             :                             }
     873             : #endif
     874           0 :                             if ( deltaYInLogic )
     875             :                             {
     876             : #ifndef IOS
     877           0 :                                 bool isMultiplyByLineSize = true;
     878             : #else
     879             :                                 bool isMultiplyByLineSize = false;
     880             : #endif
     881           0 :                                 lcl_HandleScrollHelper( pVScrl, deltaYInLogic, isMultiplyByLineSize );
     882             : 
     883           0 :                                 bRet = true;
     884             :                             }
     885             :                         }
     886             :                     }
     887             :                 }
     888             :             }
     889           0 :             break;
     890             : 
     891             :             case COMMAND_AUTOSCROLL:
     892             :             {
     893           0 :                 const CommandScrollData* pData = rCmd.GetAutoScrollData();
     894           0 :                 if ( pData && (pData->GetDeltaX() || pData->GetDeltaY()) )
     895             :                 {
     896             :                     ImplHandleScroll( pHScrl, pData->GetDeltaX(),
     897           0 :                                       pVScrl, pData->GetDeltaY() );
     898           0 :                     bRet = true;
     899             :                 }
     900             :             }
     901           0 :             break;
     902             : 
     903             :             default:
     904           0 :             break;
     905             :         }
     906             :     }
     907             : 
     908           0 :     return bRet;
     909             : }
     910             : 
     911             : // Note that when called for COMMAND_WHEEL above, despite its name,
     912             : // pVScrl isn't necessarily the vertical scroll bar. Depending on
     913             : // whether the scroll is horizontal or vertical, it is either the
     914             : // horizontal or vertical scroll bar. nY is correspondingly either
     915             : // the horizontal or vertical scroll amount.
     916             : 
     917           0 : void Window::ImplHandleScroll( ScrollBar* pHScrl, long nX,
     918             :                                ScrollBar* pVScrl, long nY )
     919             : {
     920           0 :     lcl_HandleScrollHelper( pHScrl, nX, true );
     921           0 :     lcl_HandleScrollHelper( pVScrl, nY, true );
     922           0 : }
     923             : 
     924      871204 : DockingManager* Window::GetDockingManager()
     925             : {
     926      871204 :     return ImplGetDockingManager();
     927             : }
     928             : 
     929       16268 : void Window::EnableDocking( bool bEnable )
     930             : {
     931             :     // update list of dockable windows
     932       16268 :     if( bEnable )
     933       16268 :         ImplGetDockingManager()->AddWindow( this );
     934             :     else
     935           0 :         ImplGetDockingManager()->RemoveWindow( this );
     936       16268 : }
     937             : 
     938             : // retrieves the list of owner draw decorated windows for this window hiearchy
     939           0 : ::std::vector<vcl::Window *>& Window::ImplGetOwnerDrawList()
     940             : {
     941           0 :     return ImplGetTopmostFrameWindow()->mpWindowImpl->mpFrameData->maOwnerDrawList;
     942             : }
     943             : 
     944       79682 : void Window::SetHelpId( const OString& rHelpId )
     945             : {
     946       79682 :     mpWindowImpl->maHelpId = rHelpId;
     947       79682 : }
     948             : 
     949      319762 : const OString& Window::GetHelpId() const
     950             : {
     951      319762 :     return mpWindowImpl->maHelpId;
     952             : }
     953             : 
     954       12208 : void Window::SetUniqueId( const OString& rUniqueId )
     955             : {
     956       12208 :     mpWindowImpl->maUniqId = rUniqueId;
     957       12208 : }
     958             : 
     959         104 : const OString& Window::GetUniqueId() const
     960             : {
     961         104 :     return mpWindowImpl->maUniqId;
     962             : }
     963             : 
     964             : // --------- old inline methods ---------------
     965             : 
     966     1832057 : vcl::Window* Window::ImplGetWindow()
     967             : {
     968     1832057 :     if ( mpWindowImpl->mpClientWindow )
     969     1336099 :         return mpWindowImpl->mpClientWindow;
     970             :     else
     971      495958 :         return this;
     972             : }
     973             : 
     974           0 : ImplFrameData* Window::ImplGetFrameData()
     975             : {
     976           0 :     return mpWindowImpl->mpFrameData;
     977             : }
     978             : 
     979      192319 : SalFrame* Window::ImplGetFrame() const
     980             : {
     981      192319 :     return mpWindowImpl->mpFrame;
     982             : }
     983             : 
     984    10628452 : vcl::Window* Window::ImplGetParent() const
     985             : {
     986    10628452 :     return mpWindowImpl->mpParent;
     987             : }
     988             : 
     989      117608 : vcl::Window* Window::ImplGetClientWindow() const
     990             : {
     991      117608 :     return mpWindowImpl->mpClientWindow;
     992             : }
     993             : 
     994      375512 : vcl::Window* Window::ImplGetBorderWindow() const
     995             : {
     996      375512 :     return mpWindowImpl->mpBorderWindow;
     997             : }
     998             : 
     999      606575 : vcl::Window* Window::ImplGetFirstOverlapWindow()
    1000             : {
    1001      606575 :     if ( mpWindowImpl->mbOverlapWin )
    1002       12444 :         return this;
    1003             :     else
    1004      594131 :         return mpWindowImpl->mpOverlapWindow;
    1005             : }
    1006             : 
    1007           0 : const vcl::Window* Window::ImplGetFirstOverlapWindow() const
    1008             : {
    1009           0 :     if ( mpWindowImpl->mbOverlapWin )
    1010           0 :         return this;
    1011             :     else
    1012           0 :         return mpWindowImpl->mpOverlapWindow;
    1013             : }
    1014             : 
    1015       41828 : vcl::Window* Window::ImplGetFrameWindow() const
    1016             : {
    1017       41828 :     return mpWindowImpl->mpFrameWindow;
    1018             : }
    1019             : 
    1020           0 : bool Window::ImplIsDockingWindow() const
    1021             : {
    1022           0 :     return mpWindowImpl->mbDockWin;
    1023             : }
    1024             : 
    1025         346 : bool Window::ImplIsFloatingWindow() const
    1026             : {
    1027         346 :     return mpWindowImpl->mbFloatWin;
    1028             : }
    1029             : 
    1030           0 : bool Window::ImplIsSplitter() const
    1031             : {
    1032           0 :     return mpWindowImpl->mbSplitter;
    1033             : }
    1034             : 
    1035       10774 : bool Window::ImplIsPushButton() const
    1036             : {
    1037       10774 :     return mpWindowImpl->mbPushButton;
    1038             : }
    1039             : 
    1040    15365297 : bool Window::ImplIsOverlapWindow() const
    1041             : {
    1042    15365297 :     return mpWindowImpl->mbOverlapWin;
    1043             : }
    1044             : 
    1045           0 : void Window::ImplSetMouseTransparent( bool bTransparent )
    1046             : {
    1047           0 :     mpWindowImpl->mbMouseTransparent = bTransparent;
    1048           0 : }
    1049             : 
    1050           0 : Point Window::ImplOutputToFrame( const Point& rPos )
    1051             : {
    1052           0 :     return Point( rPos.X()+mnOutOffX, rPos.Y()+mnOutOffY );
    1053             : }
    1054             : 
    1055       80466 : Point Window::ImplFrameToOutput( const Point& rPos )
    1056             : {
    1057       80466 :     return Point( rPos.X()-mnOutOffX, rPos.Y()-mnOutOffY );
    1058             : }
    1059             : 
    1060       10511 : void Window::SetCompoundControl( bool bCompound )
    1061             : {
    1062       10511 :     mpWindowImpl->mbCompoundControl = bCompound;
    1063       10511 : }
    1064             : 
    1065         431 : void Window::IncrementLockCount()
    1066             : {
    1067         431 :     mpWindowImpl->mnLockCount++;
    1068         431 : }
    1069             : 
    1070         431 : void Window::DecrementLockCount()
    1071             : {
    1072         431 :     mpWindowImpl->mnLockCount--;
    1073         431 : }
    1074             : 
    1075     7505694 : WinBits Window::GetStyle() const
    1076             : {
    1077     7505694 :     return mpWindowImpl->mnStyle;
    1078             : }
    1079             : 
    1080       16849 : WinBits Window::GetPrevStyle() const
    1081             : {
    1082       16849 :     return mpWindowImpl->mnPrevStyle;
    1083             : }
    1084             : 
    1085          18 : WinBits Window::GetExtendedStyle() const
    1086             : {
    1087          18 :     return mpWindowImpl->mnExtendedStyle;
    1088             : }
    1089             : 
    1090       21910 : void Window::SetType( WindowType nType )
    1091             : {
    1092       21910 :     mpWindowImpl->mnType = nType;
    1093       21910 : }
    1094             : 
    1095    16486000 : WindowType Window::GetType() const
    1096             : {
    1097    16486000 :     return mpWindowImpl->mnType;
    1098             : }
    1099             : 
    1100           0 : Dialog* Window::GetParentDialog() const
    1101             : {
    1102           0 :     const vcl::Window *pWindow = this;
    1103             : 
    1104           0 :     while( pWindow )
    1105             :     {
    1106           0 :         if( pWindow->IsDialog() )
    1107           0 :             break;
    1108             : 
    1109           0 :         pWindow = pWindow->GetParent();
    1110             :     }
    1111             : 
    1112           0 :     return const_cast<Dialog *>(dynamic_cast<const Dialog*>(pWindow));
    1113             : }
    1114             : 
    1115      548163 : bool Window::IsSystemWindow() const
    1116             : {
    1117      548163 :     return mpWindowImpl->mbSysWin;
    1118             : }
    1119             : 
    1120        1036 : bool Window::IsDialog() const
    1121             : {
    1122        1036 :     return mpWindowImpl->mbDialog;
    1123             : }
    1124             : 
    1125        1698 : bool Window::IsMenuFloatingWindow() const
    1126             : {
    1127        1698 :     return mpWindowImpl->mbMenuFloatingWindow;
    1128             : }
    1129             : 
    1130         422 : bool Window::IsToolbarFloatingWindow() const
    1131             : {
    1132         422 :     return mpWindowImpl->mbToolbarFloatingWindow;
    1133             : }
    1134             : 
    1135       40523 : void Window::EnableAllResize( bool bEnable )
    1136             : {
    1137       40523 :     mpWindowImpl->mbAllResize = bEnable;
    1138       40523 : }
    1139             : 
    1140       68006 : void Window::EnableChildTransparentMode( bool bEnable )
    1141             : {
    1142       68006 :     mpWindowImpl->mbChildTransparent = bEnable;
    1143       68006 : }
    1144             : 
    1145       34366 : bool Window::IsChildTransparentModeEnabled() const
    1146             : {
    1147       34366 :     return mpWindowImpl->mbChildTransparent;
    1148             : }
    1149             : 
    1150           0 : bool Window::IsMouseTransparent() const
    1151             : {
    1152           0 :     return mpWindowImpl->mbMouseTransparent;
    1153             : }
    1154             : 
    1155     2127790 : bool Window::IsPaintTransparent() const
    1156             : {
    1157     2127790 :     return mpWindowImpl->mbPaintTransparent;
    1158             : }
    1159             : 
    1160          16 : void Window::SetDialogControlStart( bool bStart )
    1161             : {
    1162          16 :     mpWindowImpl->mbDlgCtrlStart = bStart;
    1163          16 : }
    1164             : 
    1165       23491 : bool Window::IsDialogControlStart() const
    1166             : {
    1167       23491 :     return mpWindowImpl->mbDlgCtrlStart;
    1168             : }
    1169             : 
    1170        5598 : void Window::SetDialogControlFlags( sal_uInt16 nFlags )
    1171             : {
    1172        5598 :     mpWindowImpl->mnDlgCtrlFlags = nFlags;
    1173        5598 : }
    1174             : 
    1175       25397 : sal_uInt16 Window::GetDialogControlFlags() const
    1176             : {
    1177       25397 :     return mpWindowImpl->mnDlgCtrlFlags;
    1178             : }
    1179             : 
    1180       36233 : const InputContext& Window::GetInputContext() const
    1181             : {
    1182       36233 :     return mpWindowImpl->maInputContext;
    1183             : }
    1184             : 
    1185      164541 : bool Window::IsControlFont() const
    1186             : {
    1187      164541 :     return (mpWindowImpl->mpControlFont != 0);
    1188             : }
    1189             : 
    1190         421 : Color Window::GetControlForeground() const
    1191             : {
    1192         421 :     return mpWindowImpl->maControlForeground;
    1193             : }
    1194             : 
    1195      189731 : bool Window::IsControlForeground() const
    1196             : {
    1197      189731 :     return mpWindowImpl->mbControlForeground;
    1198             : }
    1199             : 
    1200        2310 : Color Window::GetControlBackground() const
    1201             : {
    1202        2310 :     return mpWindowImpl->maControlBackground;
    1203             : }
    1204             : 
    1205      379360 : bool Window::IsControlBackground() const
    1206             : {
    1207      379360 :     return mpWindowImpl->mbControlBackground;
    1208             : }
    1209             : 
    1210      382460 : bool Window::IsInPaint() const
    1211             : {
    1212      382460 :     return mpWindowImpl->mbInPaint;
    1213             : }
    1214             : 
    1215    39176845 : vcl::Window* Window::GetParent() const
    1216             : {
    1217    39176845 :     return mpWindowImpl->mpRealParent;
    1218             : }
    1219             : 
    1220     2753049 : bool Window::IsVisible() const
    1221             : {
    1222     2753049 :     return mpWindowImpl->mbVisible;
    1223             : }
    1224             : 
    1225     5470309 : bool Window::IsReallyVisible() const
    1226             : {
    1227     5470309 :     return mpWindowImpl->mbReallyVisible;
    1228             : }
    1229             : 
    1230      217987 : bool Window::IsReallyShown() const
    1231             : {
    1232      217987 :     return mpWindowImpl->mbReallyShown;
    1233             : }
    1234             : 
    1235           0 : bool Window::IsInInitShow() const
    1236             : {
    1237           0 :     return mpWindowImpl->mbInInitShow;
    1238             : }
    1239             : 
    1240      390802 : bool Window::IsEnabled() const
    1241             : {
    1242      390802 :     return !mpWindowImpl->mbDisabled;
    1243             : }
    1244             : 
    1245       63823 : bool Window::IsInputEnabled() const
    1246             : {
    1247       63823 :     return !mpWindowImpl->mbInputDisabled;
    1248             : }
    1249             : 
    1250           0 : bool Window::IsAlwaysEnableInput() const
    1251             : {
    1252           0 :     return mpWindowImpl->meAlwaysInputMode == AlwaysInputEnabled;
    1253             : }
    1254             : 
    1255        6158 : sal_uInt16 Window::GetActivateMode() const
    1256             : {
    1257        6158 :     return mpWindowImpl->mnActivateMode;
    1258             : 
    1259             : }
    1260             : 
    1261           0 : bool Window::IsAlwaysOnTopEnabled() const
    1262             : {
    1263           0 :     return mpWindowImpl->mbAlwaysOnTop;
    1264             : }
    1265             : 
    1266           0 : bool Window::IsDefaultPos() const
    1267             : {
    1268           0 :     return mpWindowImpl->mbDefPos;
    1269             : }
    1270             : 
    1271         260 : bool Window::IsDefaultSize() const
    1272             : {
    1273         260 :     return mpWindowImpl->mbDefSize;
    1274             : }
    1275             : 
    1276       49587 : void Window::EnablePaint( bool bEnable )
    1277             : {
    1278       49587 :     mpWindowImpl->mbPaintDisabled = !bEnable;
    1279       49587 : }
    1280             : 
    1281      168381 : bool Window::IsPaintEnabled() const
    1282             : {
    1283      168381 :     return !mpWindowImpl->mbPaintDisabled;
    1284             : }
    1285             : 
    1286      956892 : bool Window::IsUpdateMode() const
    1287             : {
    1288      956892 :     return !mpWindowImpl->mbNoUpdate;
    1289             : }
    1290             : 
    1291          64 : void Window::SetParentUpdateMode( bool bUpdate )
    1292             : {
    1293          64 :     mpWindowImpl->mbNoParentUpdate = !bUpdate;
    1294          64 : }
    1295             : 
    1296       62298 : bool Window::IsActive() const
    1297             : {
    1298       62298 :     return mpWindowImpl->mbActive;
    1299             : }
    1300             : 
    1301        6294 : sal_uInt16 Window::GetGetFocusFlags() const
    1302             : {
    1303        6294 :     return mpWindowImpl->mnGetFocusFlags;
    1304             : }
    1305             : 
    1306       68541 : bool Window::IsCompoundControl() const
    1307             : {
    1308       68541 :     return mpWindowImpl->mbCompoundControl;
    1309             : }
    1310             : 
    1311         798 : bool Window::IsWait() const
    1312             : {
    1313         798 :     return (mpWindowImpl->mnWaitCount != 0);
    1314             : }
    1315             : 
    1316       71153 : vcl::Cursor* Window::GetCursor() const
    1317             : {
    1318       71153 :     return mpWindowImpl->mpCursor;
    1319             : }
    1320             : 
    1321      244862 : const Fraction& Window::GetZoom() const
    1322             : {
    1323      244862 :     return mpWindowImpl->maZoom;
    1324             : }
    1325             : 
    1326        1760 : bool Window::IsZoom() const
    1327             : {
    1328        1760 :     return mpWindowImpl->maZoom.GetNumerator() != mpWindowImpl->maZoom.GetDenominator();
    1329             : }
    1330             : 
    1331        3216 : void Window::SetHelpText( const OUString& rHelpText )
    1332             : {
    1333        3216 :     mpWindowImpl->maHelpText = rHelpText;
    1334        3216 :     mpWindowImpl->mbHelpTextDynamic = true;
    1335        3216 : }
    1336             : 
    1337       32904 : void Window::SetQuickHelpText( const OUString& rHelpText )
    1338             : {
    1339       32904 :     mpWindowImpl->maQuickHelpText = rHelpText;
    1340       32904 : }
    1341             : 
    1342       17218 : const OUString& Window::GetQuickHelpText() const
    1343             : {
    1344       17218 :     return mpWindowImpl->maQuickHelpText;
    1345             : }
    1346             : 
    1347         126 : void Window::SetData( void* pNewData )
    1348             : {
    1349         126 :     mpWindowImpl->mpUserData = pNewData;
    1350         126 : }
    1351             : 
    1352           0 : void* Window::GetData() const
    1353             : {
    1354           0 :     return mpWindowImpl->mpUserData;
    1355             : }
    1356             : 
    1357           0 : bool Window::IsCreatedWithToolkit() const
    1358             : {
    1359           0 :     return mpWindowImpl->mbCreatedWithToolkit;
    1360             : }
    1361             : 
    1362       50867 : void Window::SetCreatedWithToolkit( bool b )
    1363             : {
    1364       50867 :     mpWindowImpl->mbCreatedWithToolkit = b;
    1365             : 
    1366       50867 : }
    1367           0 : const Pointer& Window::GetPointer() const
    1368             : {
    1369           0 :     return mpWindowImpl->maPointer;
    1370             : }
    1371             : 
    1372     1434405 : VCLXWindow* Window::GetWindowPeer() const
    1373             : {
    1374     1434405 :     return mpWindowImpl->mpVCLXWindow;
    1375             : }
    1376             : 
    1377       57754 : void Window::SetPosPixel( const Point& rNewPos )
    1378             : {
    1379       57754 :     setPosSizePixel( rNewPos.X(), rNewPos.Y(), 0, 0, WINDOW_POSSIZE_POS );
    1380       57754 : }
    1381             : 
    1382      254077 : void Window::SetSizePixel( const Size& rNewSize )
    1383             : {
    1384             :     setPosSizePixel( 0, 0, rNewSize.Width(), rNewSize.Height(),
    1385      254077 :                      WINDOW_POSSIZE_SIZE );
    1386      254077 : }
    1387             : 
    1388      494873 : void Window::SetPosSizePixel( const Point& rNewPos, const Size& rNewSize )
    1389             : {
    1390             :     setPosSizePixel( rNewPos.X(), rNewPos.Y(),
    1391             :                      rNewSize.Width(), rNewSize.Height(),
    1392      494873 :                      WINDOW_POSSIZE_POSSIZE );
    1393      494873 : }
    1394             : 
    1395       59562 : void Window::SetOutputSizePixel( const Size& rNewSize )
    1396             : {
    1397       59562 :     SetSizePixel( Size( rNewSize.Width()+mpWindowImpl->mnLeftBorder+mpWindowImpl->mnRightBorder,
    1398      119124 :                         rNewSize.Height()+mpWindowImpl->mnTopBorder+mpWindowImpl->mnBottomBorder ) );
    1399       59562 : }
    1400             : 
    1401             : //When a widget wants to renegotiate layout, get toplevel parent dialog and call
    1402             : //resize on it. Mark all intermediate containers (or container-alike) widgets
    1403             : //as dirty for the size remains unchanged, but layout changed circumstances
    1404             : namespace
    1405             : {
    1406     2959683 :     bool queue_ungrouped_resize(vcl::Window *pOrigWindow)
    1407             :     {
    1408     2959683 :         bool bSomeoneCares = false;
    1409             : 
    1410     2959683 :         vcl::Window *pWindow = pOrigWindow->GetParent();
    1411     2959683 :         if (pWindow)
    1412             :         {
    1413     2856690 :             if (isContainerWindow(*pWindow))
    1414             :             {
    1415      439672 :                 bSomeoneCares = true;
    1416             :             }
    1417     2417018 :             else if (pWindow->GetType() == WINDOW_TABCONTROL)
    1418             :             {
    1419         104 :                 bSomeoneCares = true;
    1420             :             }
    1421     2856690 :             pWindow->queue_resize();
    1422             :         }
    1423             : 
    1424     2959683 :         return bSomeoneCares;
    1425             :     }
    1426             : }
    1427             : 
    1428     2880717 : void Window::queue_resize(StateChangedType eReason)
    1429             : {
    1430     2880717 :     bool bSomeoneCares = queue_ungrouped_resize(this);
    1431             : 
    1432     2880717 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1433     2880717 :     if (eReason != StateChangedType::VISIBLE)
    1434             :     {
    1435     2276509 :         pWindowImpl->mnOptimalWidthCache = -1;
    1436     2276509 :         pWindowImpl->mnOptimalHeightCache = -1;
    1437             :     }
    1438     2880717 :     if (pWindowImpl->m_xSizeGroup && pWindowImpl->m_xSizeGroup->get_mode() != VCL_SIZE_GROUP_NONE)
    1439             :     {
    1440       27306 :         std::set<vcl::Window*> &rWindows = pWindowImpl->m_xSizeGroup->get_widgets();
    1441      160884 :         for (std::set<vcl::Window*>::iterator aI = rWindows.begin(),
    1442       27306 :             aEnd = rWindows.end(); aI != aEnd; ++aI)
    1443             :         {
    1444      106272 :             vcl::Window *pOther = *aI;
    1445      106272 :             if (pOther == this)
    1446       27306 :                 continue;
    1447       78966 :             queue_ungrouped_resize(pOther);
    1448             :         }
    1449             :     }
    1450             : 
    1451     2880717 :     if (bSomeoneCares)
    1452             :     {
    1453             :         //fdo#57090 force a resync of the borders of the borderwindow onto this
    1454             :         //window in case they have changed
    1455      360810 :         vcl::Window* pBorderWindow = ImplGetBorderWindow();
    1456      360810 :         if (pBorderWindow)
    1457       22140 :             pBorderWindow->Resize();
    1458             :     }
    1459     2880717 : }
    1460             : 
    1461             : namespace
    1462             : {
    1463       11820 :     VclAlign toAlign(const OString &rValue)
    1464             :     {
    1465       11820 :         VclAlign eRet = VCL_ALIGN_FILL;
    1466             : 
    1467       11820 :         if (rValue == "fill")
    1468           0 :             eRet = VCL_ALIGN_FILL;
    1469       11820 :         else if (rValue == "start")
    1470         738 :             eRet = VCL_ALIGN_START;
    1471       11082 :         else if (rValue == "end")
    1472        2218 :             eRet = VCL_ALIGN_END;
    1473        8864 :         else if (rValue == "center")
    1474        8864 :             eRet = VCL_ALIGN_CENTER;
    1475       11820 :         return eRet;
    1476             :     }
    1477             : }
    1478             : 
    1479           0 : bool Window::set_font_attribute(const OString &rKey, const OString &rValue)
    1480             : {
    1481           0 :     if (rKey == "weight")
    1482             :     {
    1483           0 :         vcl::Font aFont(GetControlFont());
    1484           0 :         if (rValue == "thin")
    1485           0 :             aFont.SetWeight(WEIGHT_THIN);
    1486           0 :         else if (rValue == "ultralight")
    1487           0 :             aFont.SetWeight(WEIGHT_ULTRALIGHT);
    1488           0 :         else if (rValue == "light")
    1489           0 :             aFont.SetWeight(WEIGHT_LIGHT);
    1490           0 :         else if (rValue == "book")
    1491           0 :             aFont.SetWeight(WEIGHT_SEMILIGHT);
    1492           0 :         else if (rValue == "normal")
    1493           0 :             aFont.SetWeight(WEIGHT_NORMAL);
    1494           0 :         else if (rValue == "medium")
    1495           0 :             aFont.SetWeight(WEIGHT_MEDIUM);
    1496           0 :         else if (rValue == "semibold")
    1497           0 :             aFont.SetWeight(WEIGHT_SEMIBOLD);
    1498           0 :         else if (rValue == "bold")
    1499           0 :             aFont.SetWeight(WEIGHT_BOLD);
    1500           0 :         else if (rValue == "ultrabold")
    1501           0 :             aFont.SetWeight(WEIGHT_ULTRABOLD);
    1502             :         else
    1503           0 :             aFont.SetWeight(WEIGHT_BLACK);
    1504           0 :         SetControlFont(aFont);
    1505             :     }
    1506           0 :     else if (rKey == "style")
    1507             :     {
    1508           0 :         vcl::Font aFont(GetControlFont());
    1509           0 :         if (rValue == "normal")
    1510           0 :             aFont.SetItalic(ITALIC_NONE);
    1511           0 :         else if (rValue == "oblique")
    1512           0 :             aFont.SetItalic(ITALIC_OBLIQUE);
    1513           0 :         else if (rValue == "italic")
    1514           0 :             aFont.SetItalic(ITALIC_NORMAL);
    1515           0 :         SetControlFont(aFont);
    1516             :     }
    1517           0 :     else if (rKey == "underline" && toBool(rValue) == true)
    1518             :     {
    1519           0 :         vcl::Font aFont(GetControlFont());
    1520           0 :         aFont.SetUnderline(UNDERLINE_SINGLE);
    1521           0 :         SetControlFont(aFont);
    1522             :     }
    1523           0 :     else if (rKey == "size")
    1524             :     {
    1525           0 :         vcl::Font aFont(GetControlFont());
    1526           0 :         sal_Int32 nHeight = rValue.toInt32() / 1000;
    1527           0 :         aFont.SetHeight(nHeight);
    1528           0 :         SetControlFont(aFont);
    1529             :     }
    1530             :     else
    1531             :     {
    1532             :         SAL_INFO("vcl.layout", "unhandled font attribute: " << rKey.getStr());
    1533           0 :         return false;
    1534             :     }
    1535           0 :     return true;
    1536             : }
    1537             : 
    1538      142826 : bool Window::set_property(const OString &rKey, const OString &rValue)
    1539             : {
    1540      142826 :     if ((rKey == "label") || (rKey == "title") || (rKey == "text") )
    1541             :     {
    1542        5224 :         SetText(OStringToOUString(VclBuilder::convertMnemonicMarkup(rValue), RTL_TEXTENCODING_UTF8));
    1543             :     }
    1544      137602 :     else if (rKey == "visible")
    1545       37898 :         Show(toBool(rValue));
    1546       99704 :     else if (rKey == "sensitive")
    1547           0 :         Enable(toBool(rValue));
    1548       99704 :     else if (rKey == "resizable")
    1549             :     {
    1550           0 :         WinBits nBits = GetStyle();
    1551           0 :         nBits &= ~(WB_SIZEABLE);
    1552           0 :         if (toBool(rValue))
    1553           0 :             nBits |= WB_SIZEABLE;
    1554           0 :         SetStyle(nBits);
    1555             :     }
    1556       99704 :     else if (rKey == "xalign")
    1557             :     {
    1558        1496 :         WinBits nBits = GetStyle();
    1559        1496 :         nBits &= ~(WB_LEFT | WB_CENTER | WB_RIGHT);
    1560             : 
    1561        1496 :         float f = rValue.toFloat();
    1562        1496 :         if (f == 0.0)
    1563        1496 :             nBits |= WB_LEFT;
    1564           0 :         else if (f == 1.0)
    1565           0 :             nBits |= WB_RIGHT;
    1566           0 :         else if (f == 0.5)
    1567           0 :             nBits |= WB_CENTER;
    1568             : 
    1569        1496 :         SetStyle(nBits);
    1570             :     }
    1571       98208 :     else if (rKey == "justification")
    1572             :     {
    1573           0 :         WinBits nBits = GetStyle();
    1574           0 :         nBits &= ~(WB_LEFT | WB_CENTER | WB_RIGHT);
    1575             : 
    1576           0 :         if (rValue == "left")
    1577           0 :             nBits |= WB_LEFT;
    1578           0 :         else if (rValue == "right")
    1579           0 :             nBits |= WB_RIGHT;
    1580           0 :         else if (rValue == "center")
    1581           0 :             nBits |= WB_CENTER;
    1582             : 
    1583           0 :         SetStyle(nBits);
    1584             :     }
    1585       98208 :     else if (rKey == "yalign")
    1586             :     {
    1587           0 :         WinBits nBits = GetStyle();
    1588           0 :         nBits &= ~(WB_TOP | WB_VCENTER | WB_BOTTOM);
    1589             : 
    1590           0 :         float f = rValue.toFloat();
    1591           0 :         if (f == 0.0)
    1592           0 :             nBits |= WB_TOP;
    1593           0 :         else if (f == 1.0)
    1594           0 :             nBits |= WB_BOTTOM;
    1595           0 :         else if (f == 0.5)
    1596           0 :             nBits |= WB_CENTER;
    1597             : 
    1598           0 :         SetStyle(nBits);
    1599             :     }
    1600       98208 :     else if (rKey == "wrap")
    1601             :     {
    1602           0 :         WinBits nBits = GetStyle();
    1603           0 :         nBits &= ~(WB_WORDBREAK);
    1604           0 :         if (toBool(rValue))
    1605           0 :             nBits |= WB_WORDBREAK;
    1606           0 :         SetStyle(nBits);
    1607             :     }
    1608       98208 :     else if (rKey == "height-request")
    1609           0 :         set_height_request(rValue.toInt32());
    1610       98208 :     else if (rKey == "width-request")
    1611           0 :         set_width_request(rValue.toInt32());
    1612       98208 :     else if (rKey == "hexpand")
    1613        7494 :         set_hexpand(toBool(rValue));
    1614       90714 :     else if (rKey == "vexpand")
    1615         110 :         set_vexpand(toBool(rValue));
    1616       90604 :     else if (rKey == "halign")
    1617        8130 :         set_halign(toAlign(rValue));
    1618       82474 :     else if (rKey == "valign")
    1619        3690 :         set_valign(toAlign(rValue));
    1620       78784 :     else if (rKey == "tooltip-markup")
    1621           0 :         SetQuickHelpText(OStringToOUString(rValue, RTL_TEXTENCODING_UTF8));
    1622       78784 :     else if (rKey == "tooltip-text")
    1623        9594 :         SetQuickHelpText(OStringToOUString(rValue, RTL_TEXTENCODING_UTF8));
    1624       69190 :     else if (rKey == "border-width")
    1625        2254 :         set_border_width(rValue.toInt32());
    1626       66936 :     else if (rKey == "margin-left")
    1627          28 :         set_margin_left(rValue.toInt32());
    1628       66908 :     else if (rKey == "margin-right")
    1629          26 :         set_margin_right(rValue.toInt32());
    1630       66882 :     else if (rKey == "margin-top")
    1631           8 :         set_margin_top(rValue.toInt32());
    1632       66874 :     else if (rKey == "margin-bottom")
    1633           8 :         set_margin_bottom(rValue.toInt32());
    1634       66866 :     else if (rKey == "hscrollbar-policy")
    1635             :     {
    1636           0 :         WinBits nBits = GetStyle();
    1637           0 :         nBits &= ~(WB_AUTOHSCROLL|WB_HSCROLL);
    1638           0 :         if (rValue == "always")
    1639           0 :             nBits |= WB_HSCROLL;
    1640           0 :         else if (rValue == "automatic")
    1641           0 :             nBits |= WB_AUTOHSCROLL;
    1642           0 :         SetStyle(nBits);
    1643             :     }
    1644       66866 :     else if (rKey == "vscrollbar-policy")
    1645             :     {
    1646           0 :         WinBits nBits = GetStyle();
    1647           0 :         nBits &= ~(WB_AUTOVSCROLL|WB_VSCROLL);
    1648           0 :         if (rValue == "always")
    1649           0 :             nBits |= WB_VSCROLL;
    1650           0 :         else if (rValue == "automatic")
    1651           0 :             nBits |= WB_AUTOVSCROLL;
    1652           0 :         SetStyle(nBits);
    1653             :     }
    1654       66866 :     else if (rKey == "accessible-name")
    1655             :     {
    1656           0 :         SetAccessibleName(OStringToOUString(rValue, RTL_TEXTENCODING_UTF8));
    1657             :     }
    1658       66866 :     else if (rKey == "accessible-description")
    1659             :     {
    1660           0 :         SetAccessibleDescription(OStringToOUString(rValue, RTL_TEXTENCODING_UTF8));
    1661             :     }
    1662       66866 :     else if (rKey == "use-markup")
    1663             :     {
    1664             :         //https://live.gnome.org/GnomeGoals/RemoveMarkupInMessages
    1665             :         SAL_WARN_IF(toBool(rValue), "vcl.layout", "Use pango attributes instead of mark-up");
    1666             :     }
    1667             :     else
    1668             :     {
    1669             :         SAL_INFO("vcl.layout", "unhandled property: " << rKey.getStr());
    1670       66866 :         return false;
    1671             :     }
    1672       75960 :     return true;
    1673             : }
    1674             : 
    1675        1956 : void Window::set_height_request(sal_Int32 nHeightRequest)
    1676             : {
    1677             : 
    1678        1956 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1679             : 
    1680        1956 :     if ( pWindowImpl->mnHeightRequest != nHeightRequest )
    1681             :     {
    1682        1956 :         pWindowImpl->mnHeightRequest = nHeightRequest;
    1683        1956 :         queue_resize();
    1684             :     }
    1685        1956 : }
    1686             : 
    1687        5650 : void Window::set_width_request(sal_Int32 nWidthRequest)
    1688             : {
    1689             : 
    1690        5650 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1691             : 
    1692        5650 :     if ( pWindowImpl->mnWidthRequest != nWidthRequest )
    1693             :     {
    1694        5648 :         pWindowImpl->mnWidthRequest = nWidthRequest;
    1695        5648 :         queue_resize();
    1696             :     }
    1697        5650 : }
    1698             : 
    1699      237153 : Size Window::get_ungrouped_preferred_size() const
    1700             : {
    1701      237153 :     Size aRet(get_width_request(), get_height_request());
    1702      237153 :     if (aRet.Width() == -1 || aRet.Height() == -1)
    1703             :     {
    1704             :         //cache gets blown away by queue_resize
    1705      232721 :         WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1706      232721 :         if (pWindowImpl->mnOptimalWidthCache == -1 || pWindowImpl->mnOptimalHeightCache == -1)
    1707             :         {
    1708       42868 :             Size aOptimal(GetOptimalSize());
    1709       42868 :             pWindowImpl->mnOptimalWidthCache = aOptimal.Width();
    1710       42868 :             pWindowImpl->mnOptimalHeightCache = aOptimal.Height();
    1711             :         }
    1712             : 
    1713      232721 :         if (aRet.Width() == -1)
    1714      214265 :             aRet.Width() = pWindowImpl->mnOptimalWidthCache;
    1715      232721 :         if (aRet.Height() == -1)
    1716      232721 :             aRet.Height() = pWindowImpl->mnOptimalHeightCache;
    1717             :     }
    1718      237153 :     return aRet;
    1719             : }
    1720             : 
    1721      170733 : Size Window::get_preferred_size() const
    1722             : {
    1723      170733 :     Size aRet(get_ungrouped_preferred_size());
    1724             : 
    1725      170733 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1726      170733 :     if (pWindowImpl->m_xSizeGroup)
    1727             :     {
    1728       13284 :         const VclSizeGroupMode eMode = pWindowImpl->m_xSizeGroup->get_mode();
    1729       13284 :         if (eMode != VCL_SIZE_GROUP_NONE)
    1730             :         {
    1731       13284 :             const bool bIgnoreInHidden = pWindowImpl->m_xSizeGroup->get_ignore_hidden();
    1732       13284 :             const std::set<vcl::Window*> &rWindows = pWindowImpl->m_xSizeGroup->get_widgets();
    1733      106272 :             for (std::set<vcl::Window*>::const_iterator aI = rWindows.begin(),
    1734       13284 :                 aEnd = rWindows.end(); aI != aEnd; ++aI)
    1735             :             {
    1736       79704 :                 const vcl::Window *pOther = *aI;
    1737       79704 :                 if (pOther == this)
    1738       26568 :                     continue;
    1739       66420 :                 if (bIgnoreInHidden && !pOther->IsVisible())
    1740           0 :                     continue;
    1741       66420 :                 Size aOtherSize = pOther->get_ungrouped_preferred_size();
    1742       66420 :                 if (eMode == VCL_SIZE_GROUP_BOTH || eMode == VCL_SIZE_GROUP_HORIZONTAL)
    1743           0 :                     aRet.Width() = std::max(aRet.Width(), aOtherSize.Width());
    1744       66420 :                 if (eMode == VCL_SIZE_GROUP_BOTH || eMode == VCL_SIZE_GROUP_VERTICAL)
    1745       66420 :                     aRet.Height() = std::max(aRet.Height(), aOtherSize.Height());
    1746             :             }
    1747             :         }
    1748             :     }
    1749             : 
    1750      170733 :     return aRet;
    1751             : }
    1752             : 
    1753       64747 : VclAlign Window::get_halign() const
    1754             : {
    1755       64747 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1756       64747 :     return pWindowImpl->meHalign;
    1757             : }
    1758             : 
    1759        8130 : void Window::set_halign(VclAlign eAlign)
    1760             : {
    1761        8130 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1762        8130 :     pWindowImpl->meHalign = eAlign;
    1763        8130 : }
    1764             : 
    1765       64747 : VclAlign Window::get_valign() const
    1766             : {
    1767       64747 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1768       64747 :     return pWindowImpl->meValign;
    1769             : }
    1770             : 
    1771        3690 : void Window::set_valign(VclAlign eAlign)
    1772             : {
    1773        3690 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1774        3690 :     pWindowImpl->meValign = eAlign;
    1775        3690 : }
    1776             : 
    1777       93304 : bool Window::get_hexpand() const
    1778             : {
    1779       93304 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1780       93304 :     return pWindowImpl->mbHexpand;
    1781             : }
    1782             : 
    1783        7494 : void Window::set_hexpand(bool bExpand)
    1784             : {
    1785        7494 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1786        7494 :     pWindowImpl->mbHexpand = bExpand;
    1787        7494 : }
    1788             : 
    1789       72282 : bool Window::get_vexpand() const
    1790             : {
    1791       72282 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1792       72282 :     return pWindowImpl->mbVexpand;
    1793             : }
    1794             : 
    1795         110 : void Window::set_vexpand(bool bExpand)
    1796             : {
    1797         110 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1798         110 :     pWindowImpl->mbVexpand = bExpand;
    1799         110 : }
    1800             : 
    1801       98104 : bool Window::get_expand() const
    1802             : {
    1803       98104 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1804       98104 :     return pWindowImpl->mbExpand;
    1805             : }
    1806             : 
    1807       26618 : void Window::set_expand(bool bExpand)
    1808             : {
    1809       26618 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1810       26618 :     pWindowImpl->mbExpand = bExpand;
    1811       26618 : }
    1812             : 
    1813      100840 : VclPackType Window::get_pack_type() const
    1814             : {
    1815      100840 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1816      100840 :     return pWindowImpl->mePackType;
    1817             : }
    1818             : 
    1819        3690 : void Window::set_pack_type(VclPackType ePackType)
    1820             : {
    1821        3690 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1822        3690 :     pWindowImpl->mePackType = ePackType;
    1823        3690 : }
    1824             : 
    1825       95080 : sal_Int32 Window::get_padding() const
    1826             : {
    1827       95080 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1828       95080 :     return pWindowImpl->mnPadding;
    1829             : }
    1830             : 
    1831           0 : void Window::set_padding(sal_Int32 nPadding)
    1832             : {
    1833           0 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1834           0 :     pWindowImpl->mnPadding = nPadding;
    1835           0 : }
    1836             : 
    1837       49056 : bool Window::get_fill() const
    1838             : {
    1839       49056 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1840       49056 :     return pWindowImpl->mbFill;
    1841             : }
    1842             : 
    1843       26618 : void Window::set_fill(bool bFill)
    1844             : {
    1845       26618 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1846       26618 :     pWindowImpl->mbFill = bFill;
    1847       26618 : }
    1848             : 
    1849       33382 : sal_Int32 Window::get_grid_width() const
    1850             : {
    1851       33382 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1852       33382 :     return pWindowImpl->mnGridWidth;
    1853             : }
    1854             : 
    1855        8978 : void Window::set_grid_width(sal_Int32 nCols)
    1856             : {
    1857        8978 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1858        8978 :     pWindowImpl->mnGridWidth = nCols;
    1859        8978 : }
    1860             : 
    1861       97006 : sal_Int32 Window::get_grid_left_attach() const
    1862             : {
    1863       97006 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1864       97006 :     return pWindowImpl->mnGridLeftAttach;
    1865             : }
    1866             : 
    1867        8978 : void Window::set_grid_left_attach(sal_Int32 nAttach)
    1868             : {
    1869        8978 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1870        8978 :     pWindowImpl->mnGridLeftAttach = nAttach;
    1871        8978 : }
    1872             : 
    1873       33382 : sal_Int32 Window::get_grid_height() const
    1874             : {
    1875       33382 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1876       33382 :     return pWindowImpl->mnGridHeight;
    1877             : }
    1878             : 
    1879        8978 : void Window::set_grid_height(sal_Int32 nRows)
    1880             : {
    1881        8978 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1882        8978 :     pWindowImpl->mnGridHeight = nRows;
    1883        8978 : }
    1884             : 
    1885      101570 : sal_Int32 Window::get_grid_top_attach() const
    1886             : {
    1887      101570 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1888      101570 :     return pWindowImpl->mnGridTopAttach;
    1889             : }
    1890             : 
    1891        8978 : void Window::set_grid_top_attach(sal_Int32 nAttach)
    1892             : {
    1893        8978 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1894        8978 :     pWindowImpl->mnGridTopAttach = nAttach;
    1895        8978 : }
    1896             : 
    1897        2254 : void Window::set_border_width(sal_Int32 nBorderWidth)
    1898             : {
    1899        2254 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1900        2254 :     pWindowImpl->mnBorderWidth = nBorderWidth;
    1901        2254 : }
    1902             : 
    1903      214010 : sal_Int32 Window::get_border_width() const
    1904             : {
    1905      214010 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1906      214010 :     return pWindowImpl->mnBorderWidth;
    1907             : }
    1908             : 
    1909          28 : void Window::set_margin_left(sal_Int32 nWidth)
    1910             : {
    1911          28 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1912          28 :     pWindowImpl->mnMarginLeft = nWidth;
    1913          28 : }
    1914             : 
    1915      213874 : sal_Int32 Window::get_margin_left() const
    1916             : {
    1917      213874 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1918      213874 :     return pWindowImpl->mnMarginLeft;
    1919             : }
    1920             : 
    1921          26 : void Window::set_margin_right(sal_Int32 nWidth)
    1922             : {
    1923          26 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1924          26 :     pWindowImpl->mnMarginRight = nWidth;
    1925          26 : }
    1926             : 
    1927      213874 : sal_Int32 Window::get_margin_right() const
    1928             : {
    1929      213874 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1930      213874 :     return pWindowImpl->mnMarginRight;
    1931             : }
    1932             : 
    1933           8 : void Window::set_margin_top(sal_Int32 nWidth)
    1934             : {
    1935           8 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1936           8 :     pWindowImpl->mnMarginTop = nWidth;
    1937           8 : }
    1938             : 
    1939      213874 : sal_Int32 Window::get_margin_top() const
    1940             : {
    1941      213874 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1942      213874 :     return pWindowImpl->mnMarginTop;
    1943             : }
    1944             : 
    1945           8 : void Window::set_margin_bottom(sal_Int32 nWidth)
    1946             : {
    1947           8 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1948           8 :     pWindowImpl->mnMarginBottom = nWidth;
    1949           8 : }
    1950             : 
    1951      213874 : sal_Int32 Window::get_margin_bottom() const
    1952             : {
    1953      213874 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1954      213874 :     return pWindowImpl->mnMarginBottom;
    1955             : }
    1956             : 
    1957      237155 : sal_Int32 Window::get_height_request() const
    1958             : {
    1959      237155 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1960      237155 :     return pWindowImpl->mnHeightRequest;
    1961             : }
    1962             : 
    1963      238607 : sal_Int32 Window::get_width_request() const
    1964             : {
    1965      238607 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1966      238607 :     return pWindowImpl->mnWidthRequest;
    1967             : }
    1968             : 
    1969       44404 : bool Window::get_secondary() const
    1970             : {
    1971       44404 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1972       44404 :     return pWindowImpl->mbSecondary;
    1973             : }
    1974             : 
    1975           0 : void Window::set_secondary(bool bSecondary)
    1976             : {
    1977           0 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1978           0 :     pWindowImpl->mbSecondary = bSecondary;
    1979           0 : }
    1980             : 
    1981           0 : bool Window::get_non_homogeneous() const
    1982             : {
    1983           0 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1984           0 :     return pWindowImpl->mbNonHomogeneous;
    1985             : }
    1986             : 
    1987           0 : void Window::set_non_homogeneous(bool bNonHomogeneous)
    1988             : {
    1989           0 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1990           0 :     pWindowImpl->mbNonHomogeneous = bNonHomogeneous;
    1991           0 : }
    1992             : 
    1993        4428 : void Window::add_to_size_group(boost::shared_ptr< VclSizeGroup > xGroup)
    1994             : {
    1995        4428 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    1996             :     //To-Do, multiple groups
    1997        4428 :     pWindowImpl->m_xSizeGroup = xGroup;
    1998        4428 :     pWindowImpl->m_xSizeGroup->insert(this);
    1999        4428 :     if (VCL_SIZE_GROUP_NONE != pWindowImpl->m_xSizeGroup->get_mode())
    2000        4428 :         queue_resize();
    2001        4428 : }
    2002             : 
    2003      442826 : void Window::remove_from_all_size_groups()
    2004             : {
    2005      442826 :     WindowImpl *pWindowImpl = mpWindowImpl->mpBorderWindow ? mpWindowImpl->mpBorderWindow->mpWindowImpl : mpWindowImpl;
    2006             :     //To-Do, multiple groups
    2007      442826 :     if (pWindowImpl->m_xSizeGroup)
    2008             :     {
    2009        4428 :         if (VCL_SIZE_GROUP_NONE != pWindowImpl->m_xSizeGroup->get_mode())
    2010        4428 :             queue_resize();
    2011        4428 :         pWindowImpl->m_xSizeGroup->erase(this);
    2012        4428 :         pWindowImpl->m_xSizeGroup.reset();
    2013             :     }
    2014      442826 : }
    2015             : 
    2016        1476 : void Window::add_mnemonic_label(FixedText *pLabel)
    2017             : {
    2018        1476 :     std::vector<FixedText*>& v = mpWindowImpl->m_aMnemonicLabels;
    2019        1476 :     if (std::find(v.begin(), v.end(), pLabel) != v.end())
    2020        1476 :         return;
    2021        1476 :     v.push_back(pLabel);
    2022        1476 :     pLabel->set_mnemonic_widget(this);
    2023             : }
    2024             : 
    2025        2952 : void Window::remove_mnemonic_label(FixedText *pLabel)
    2026             : {
    2027        2952 :     std::vector<FixedText*>& v = mpWindowImpl->m_aMnemonicLabels;
    2028        2952 :     std::vector<FixedText*>::iterator aFind = std::find(v.begin(), v.end(), pLabel);
    2029        2952 :     if (aFind == v.end())
    2030        4428 :         return;
    2031        1476 :     v.erase(aFind);
    2032        1476 :     pLabel->set_mnemonic_widget(NULL);
    2033             : }
    2034             : 
    2035      452560 : std::vector<FixedText*> Window::list_mnemonic_labels() const
    2036             : {
    2037      452560 :     return mpWindowImpl->m_aMnemonicLabels;
    2038             : }
    2039             : 
    2040        1233 : } /* namespace vcl */
    2041             : 
    2042             : 
    2043             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10