LCOV - code coverage report
Current view: top level - vcl/source/window - dockwin.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 255 648 39.4 %
Date: 2015-06-13 12:38:46 Functions: 38 66 57.6 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <tools/time.hxx>
      21             : #include <tools/rc.h>
      22             : #include <vcl/event.hxx>
      23             : #include <vcl/floatwin.hxx>
      24             : #include <vcl/dockwin.hxx>
      25             : #include <vcl/layout.hxx>
      26             : #include <vcl/svapp.hxx>
      27             : #include <vcl/timer.hxx>
      28             : #include <vcl/idle.hxx>
      29             : #include <vcl/unowrap.hxx>
      30             : #include <vcl/settings.hxx>
      31             : 
      32             : #include <svdata.hxx>
      33             : #include <window.h>
      34             : #include <brdwin.hxx>
      35             : #include <salframe.hxx>
      36             : 
      37             : #define DOCKWIN_FLOATSTYLES         (WB_SIZEABLE | WB_MOVEABLE | WB_CLOSEABLE | WB_STANDALONE | WB_PINABLE | WB_ROLLABLE )
      38             : 
      39             : class DockingWindow::ImplData
      40             : {
      41             : public:
      42             :     ImplData();
      43             :     ~ImplData();
      44             : 
      45             :     VclPtr<vcl::Window> mpParent;
      46             :     Size                maMaxOutSize;
      47             : };
      48             : 
      49       66663 : DockingWindow::ImplData::ImplData()
      50             : {
      51       66663 :     mpParent = NULL;
      52       66663 :     maMaxOutSize = Size( SHRT_MAX, SHRT_MAX );
      53       66663 : }
      54             : 
      55       66580 : DockingWindow::ImplData::~ImplData()
      56             : {
      57       66580 : }
      58             : 
      59             : class ImplDockFloatWin : public FloatingWindow
      60             : {
      61             : private:
      62             :     VclPtr<DockingWindow> mpDockWin;
      63             :     sal_uInt64      mnLastTicks;
      64             :     Idle            maDockIdle;
      65             :     Point           maDockPos;
      66             :     Rectangle       maDockRect;
      67             :     bool            mbInMove;
      68             :     ImplSVEvent *   mnLastUserEvent;
      69             : 
      70             :     DECL_LINK(DockingHdl, void *);
      71             :     DECL_LINK_TYPED(DockTimerHdl, Idle *, void);
      72             : public:
      73             :     ImplDockFloatWin( vcl::Window* pParent, WinBits nWinBits,
      74             :                       DockingWindow* pDockingWin );
      75             :     virtual ~ImplDockFloatWin();
      76             :     virtual void dispose() SAL_OVERRIDE;
      77             : 
      78             :     virtual void    Move() SAL_OVERRIDE;
      79             :     virtual void    Resize() SAL_OVERRIDE;
      80             :     virtual void    TitleButtonClick( TitleButton nButton ) SAL_OVERRIDE;
      81             :     virtual void    Pin() SAL_OVERRIDE;
      82             :     virtual void    Roll() SAL_OVERRIDE;
      83             :     virtual void    PopupModeEnd() SAL_OVERRIDE;
      84             :     virtual void    Resizing( Size& rSize ) SAL_OVERRIDE;
      85             :     virtual bool    Close() SAL_OVERRIDE;
      86             : };
      87             : 
      88           0 : ImplDockFloatWin::ImplDockFloatWin( vcl::Window* pParent, WinBits nWinBits,
      89             :                                     DockingWindow* pDockingWin ) :
      90             :         FloatingWindow( pParent, nWinBits ),
      91             :         mpDockWin( pDockingWin ),
      92           0 :         mnLastTicks( tools::Time::GetSystemTicks() ),
      93             :         mbInMove( false ),
      94           0 :         mnLastUserEvent( 0 )
      95             : {
      96             :     // copy settings of DockingWindow
      97           0 :     if ( pDockingWin )
      98             :     {
      99           0 :         SetSettings( pDockingWin->GetSettings() );
     100           0 :         Enable( pDockingWin->IsEnabled(), false );
     101           0 :         EnableInput( pDockingWin->IsInputEnabled(), false );
     102           0 :         AlwaysEnableInput( pDockingWin->IsAlwaysEnableInput(), false );
     103           0 :         EnableAlwaysOnTop( pDockingWin->IsAlwaysOnTopEnabled() );
     104           0 :         SetActivateMode( pDockingWin->GetActivateMode() );
     105             :     }
     106             : 
     107           0 :     SetBackground();
     108             : 
     109           0 :     maDockIdle.SetIdleHdl( LINK( this, ImplDockFloatWin, DockTimerHdl ) );
     110           0 :     maDockIdle.SetPriority( SchedulerPriority::MEDIUM );
     111           0 : }
     112             : 
     113           0 : ImplDockFloatWin::~ImplDockFloatWin()
     114             : {
     115           0 :     disposeOnce();
     116           0 : }
     117             : 
     118           0 : void ImplDockFloatWin::dispose()
     119             : {
     120           0 :     if( mnLastUserEvent )
     121           0 :         Application::RemoveUserEvent( mnLastUserEvent );
     122             : 
     123           0 :     disposeBuilder();
     124             : 
     125           0 :     mpDockWin.clear();
     126           0 :     FloatingWindow::dispose();
     127           0 : }
     128             : 
     129           0 : IMPL_LINK_NOARG_TYPED(ImplDockFloatWin, DockTimerHdl, Idle *, void)
     130             : {
     131             :     DBG_ASSERT( mpDockWin->IsFloatingMode(), "docktimer called but not floating" );
     132             : 
     133           0 :     maDockIdle.Stop();
     134           0 :     PointerState aState = GetPointerState();
     135             : 
     136           0 :     if( aState.mnState & KEY_MOD1 )
     137             :     {
     138             :         // i43499 CTRL disables docking now
     139           0 :         mpDockWin->GetParent()->ImplGetFrameWindow()->HideTracking();
     140           0 :         mpDockWin->EndDocking( maDockRect, true );
     141           0 :         if( aState.mnState & ( MOUSE_LEFT | MOUSE_MIDDLE | MOUSE_RIGHT ) )
     142           0 :             maDockIdle.Start();
     143             :     }
     144           0 :     else if( ! ( aState.mnState & ( MOUSE_LEFT | MOUSE_MIDDLE | MOUSE_RIGHT ) ) )
     145             :     {
     146           0 :         mpDockWin->GetParent()->ImplGetFrameWindow()->HideTracking();
     147           0 :         mpDockWin->EndDocking( maDockRect, false );
     148             :     }
     149             :     else
     150             :     {
     151           0 :         mpDockWin->GetParent()->ImplGetFrameWindow()->ShowTracking( maDockRect, SHOWTRACK_BIG | SHOWTRACK_WINDOW );
     152           0 :         maDockIdle.Start();
     153             :     }
     154           0 : }
     155             : 
     156           0 : IMPL_LINK_NOARG(ImplDockFloatWin, DockingHdl)
     157             : {
     158           0 :     PointerState aState = mpDockWin->GetParent()->GetPointerState();
     159             : 
     160           0 :     mnLastUserEvent = 0;
     161           0 :     if( mpDockWin->IsDockable()                             &&
     162           0 :         (tools::Time::GetSystemTicks() - mnLastTicks > 500)        &&
     163           0 :         ( aState.mnState & ( MOUSE_LEFT | MOUSE_MIDDLE | MOUSE_RIGHT ) ) &&
     164           0 :         !(aState.mnState & KEY_MOD1) )  // i43499 CTRL disables docking now
     165             :     {
     166           0 :         maDockPos = Point( mpDockWin->GetParent()->AbsoluteScreenToOutputPixel( OutputToAbsoluteScreenPixel( Point() ) ) );
     167           0 :         maDockPos = mpDockWin->GetParent()->OutputToScreenPixel( maDockPos );  // sfx expects screen coordinates
     168             : 
     169           0 :         if( ! mpDockWin->IsDocking() )
     170           0 :             mpDockWin->StartDocking();
     171           0 :         maDockRect = Rectangle( maDockPos, mpDockWin->GetSizePixel() );
     172             : 
     173             :         // mouse pos also in screen pixels
     174           0 :         Point aMousePos = mpDockWin->GetParent()->OutputToScreenPixel( aState.maPos );
     175             : 
     176           0 :         bool bFloatMode = mpDockWin->Docking( aMousePos, maDockRect );
     177           0 :         if( ! bFloatMode )
     178             :         {
     179           0 :             mpDockWin->GetParent()->ImplGetFrameWindow()->ShowTracking( maDockRect, SHOWTRACK_OBJECT | SHOWTRACK_WINDOW );
     180           0 :             DockTimerHdl( nullptr );
     181             :         }
     182             :         else
     183             :         {
     184           0 :             mpDockWin->GetParent()->ImplGetFrameWindow()->HideTracking();
     185           0 :             maDockIdle.Stop();
     186           0 :             mpDockWin->EndDocking( maDockRect, true );
     187             :         }
     188             :     }
     189           0 :     mbInMove = false;
     190           0 :     return 0;
     191             : }
     192             : 
     193           0 : void ImplDockFloatWin::Move()
     194             : {
     195           0 :     if( mbInMove )
     196           0 :         return;
     197             : 
     198           0 :     mbInMove = true;
     199           0 :     FloatingWindow::Move();
     200           0 :     mpDockWin->Move();
     201             : 
     202             :     /*
     203             :      *  note: the window should only dock if
     204             :      *  the user releases all mouse buttons. The real problem here
     205             :      *  is that we don't get mouse events (at least not on X)
     206             :      *  if the mouse is on the decoration. So we have to start an
     207             :      *  awkward timer based process that polls the modifier/buttons
     208             :      *  to see whether they are in the right condition shortly after the
     209             :      *  last Move message.
     210             :      */
     211           0 :     if( ! mnLastUserEvent )
     212           0 :         mnLastUserEvent = Application::PostUserEvent( LINK( this, ImplDockFloatWin, DockingHdl ), NULL, true );
     213             : }
     214             : 
     215           0 : void ImplDockFloatWin::Resize()
     216             : {
     217           0 :     FloatingWindow::Resize();
     218           0 :     Size aSize( GetSizePixel() );
     219           0 :     mpDockWin->ImplPosSizeWindow( 0, 0, aSize.Width(), aSize.Height(), PosSizeFlags::PosSize );
     220           0 : }
     221             : 
     222           0 : void ImplDockFloatWin::TitleButtonClick( TitleButton nButton )
     223             : {
     224           0 :     FloatingWindow::TitleButtonClick( nButton );
     225           0 : }
     226             : 
     227           0 : void ImplDockFloatWin::Pin()
     228             : {
     229           0 :     FloatingWindow::Pin();
     230           0 : }
     231             : 
     232           0 : void ImplDockFloatWin::Roll()
     233             : {
     234           0 :     FloatingWindow::Roll();
     235           0 : }
     236             : 
     237           0 : void ImplDockFloatWin::PopupModeEnd()
     238             : {
     239           0 :     FloatingWindow::PopupModeEnd();
     240           0 : }
     241             : 
     242           0 : void ImplDockFloatWin::Resizing( Size& rSize )
     243             : {
     244           0 :     FloatingWindow::Resizing( rSize );
     245           0 :     mpDockWin->Resizing( rSize );
     246           0 : }
     247             : 
     248           0 : bool ImplDockFloatWin::Close()
     249             : {
     250           0 :     return mpDockWin->Close();
     251             : }
     252             : 
     253           0 : bool DockingWindow::ImplStartDocking( const Point& rPos )
     254             : {
     255           0 :     if ( !mbDockable )
     256           0 :         return false;
     257             : 
     258           0 :     maMouseOff      = rPos;
     259           0 :     maMouseStart    = maMouseOff;
     260           0 :     mbDocking       = true;
     261           0 :     mbLastFloatMode = IsFloatingMode();
     262           0 :     mbStartFloat    = mbLastFloatMode;
     263             : 
     264             :     // calculate FloatingBorder
     265           0 :     VclPtr<FloatingWindow> pWin;
     266           0 :     if ( mpFloatWin )
     267           0 :         pWin = mpFloatWin;
     268             :     else
     269           0 :         pWin = VclPtr<ImplDockFloatWin>::Create( mpImplData->mpParent, mnFloatBits, nullptr );
     270           0 :     pWin->GetBorder( mnDockLeft, mnDockTop, mnDockRight, mnDockBottom );
     271           0 :     if ( !mpFloatWin )
     272           0 :         pWin.disposeAndClear();
     273             : 
     274           0 :     Point   aPos    = ImplOutputToFrame( Point() );
     275           0 :     Size    aSize   = Window::GetOutputSizePixel();
     276           0 :     mnTrackX        = aPos.X();
     277           0 :     mnTrackY        = aPos.Y();
     278           0 :     mnTrackWidth    = aSize.Width();
     279           0 :     mnTrackHeight   = aSize.Height();
     280             : 
     281           0 :     if ( mbLastFloatMode )
     282             :     {
     283           0 :         maMouseOff.X()  += mnDockLeft;
     284           0 :         maMouseOff.Y()  += mnDockTop;
     285           0 :         mnTrackX        -= mnDockLeft;
     286           0 :         mnTrackY        -= mnDockTop;
     287           0 :         mnTrackWidth    += mnDockLeft+mnDockRight;
     288           0 :         mnTrackHeight   += mnDockTop+mnDockBottom;
     289             :     }
     290             : 
     291           0 :     if ( GetSettings().GetStyleSettings().GetDragFullOptions() & DragFullOptions::Docking &&
     292           0 :         !( mnFloatBits & ( WB_MOVEABLE | WB_SIZEABLE | WB_CLOSEABLE ) ) ) // no full drag when migrating to system window
     293           0 :         mbDragFull = true;
     294             :     else
     295             :     {
     296           0 :         StartDocking();
     297           0 :         mbDragFull = false;
     298           0 :         ImplUpdateAll();
     299           0 :         ImplGetFrameWindow()->ImplUpdateAll();
     300             :     }
     301             : 
     302           0 :     StartTracking( StartTrackingFlags::KeyMod );
     303           0 :     return true;
     304             : }
     305             : 
     306       66663 : void DockingWindow::ImplInitDockingWindowData()
     307             : {
     308       66663 :     mpWindowImpl->mbDockWin = true;
     309       66663 :     mpFloatWin     = NULL;
     310       66663 :     mpOldBorderWin = NULL;
     311       66663 :     mpImplData     = new ImplData;
     312       66663 :     mnTrackX       = 0;
     313       66663 :     mnTrackY       = 0;
     314       66663 :     mnTrackWidth   = 0;
     315       66663 :     mnTrackHeight  = 0;
     316       66663 :     mnDockLeft     = 0;
     317       66663 :     mnDockTop      = 0;
     318       66663 :     mnDockRight    = 0;
     319       66663 :     mnDockBottom   = 0;
     320       66663 :     mnFloatBits    = 0;
     321       66663 :     mbDockCanceled  = false;
     322       66663 :     mbDockPrevented = false;
     323       66663 :     mbFloatPrevented = false;
     324       66663 :     mbDockable     = false;
     325       66663 :     mbDocking      = false;
     326       66663 :     mbDragFull     = false;
     327       66663 :     mbLastFloatMode = false;
     328       66663 :     mbStartFloat   = false;
     329       66663 :     mbTrackDock    = false;
     330       66663 :     mbPinned       = false;
     331       66663 :     mbRollUp       = false;
     332       66663 :     mbDockBtn      = false;
     333       66663 :     mbHideBtn      = false;
     334       66663 :     mbIsDefferedInit = false;
     335       66663 :     mbIsCalculatingInitialLayoutSize = false;
     336       66663 :     mbInitialLayoutDone = false;
     337       66663 :     mpDialogParent = NULL;
     338             : 
     339             :     //To-Do, reuse maResizeTimer
     340       66663 :     maLayoutIdle.SetPriority(SchedulerPriority::RESIZE);
     341       66663 :     maLayoutIdle.SetIdleHdl( LINK( this, DockingWindow, ImplHandleLayoutTimerHdl ) );
     342       66663 : }
     343             : 
     344       66663 : void DockingWindow::ImplInit( vcl::Window* pParent, WinBits nStyle )
     345             : {
     346       66663 :     if ( !(nStyle & WB_NODIALOGCONTROL) )
     347       66663 :         nStyle |= WB_DIALOGCONTROL;
     348             : 
     349       66663 :     mpImplData->mpParent    = pParent;
     350       66663 :     mbDockable              = (nStyle & WB_DOCKABLE) != 0;
     351       66663 :     mnFloatBits             = WB_BORDER | (nStyle & DOCKWIN_FLOATSTYLES);
     352       66663 :     nStyle                 &= ~(DOCKWIN_FLOATSTYLES | WB_BORDER);
     353       66663 :     if ( nStyle & WB_DOCKBORDER )
     354           0 :         nStyle |= WB_BORDER;
     355             : 
     356       66663 :     Window::ImplInit( pParent, nStyle, NULL );
     357             : 
     358       66663 :     ImplInitSettings();
     359       66663 : }
     360             : 
     361       66891 : void DockingWindow::ImplInitSettings()
     362             : {
     363             :     // Hack: to be able to build DockingWindows w/o background before switching
     364             :     // TODO: Hack
     365       66891 :     if ( IsBackground() )
     366             :     {
     367       66890 :         const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
     368             : 
     369       66890 :         Color aColor;
     370       66890 :         if ( IsControlBackground() )
     371           0 :             aColor = GetControlBackground();
     372       66890 :         else if ( Window::GetStyle() & WB_3DLOOK )
     373       60481 :             aColor = rStyleSettings.GetFaceColor();
     374             :         else
     375        6409 :             aColor = rStyleSettings.GetWindowColor();
     376       66890 :         SetBackground( aColor );
     377             :     }
     378       66891 : }
     379             : 
     380          17 : void DockingWindow::ImplLoadRes( const ResId& rResId )
     381             : {
     382          17 :     Window::ImplLoadRes( rResId );
     383             : 
     384          17 :     sal_uLong  nMask = ReadLongRes();
     385             : 
     386          17 :     if ( (RSC_DOCKINGWINDOW_XYMAPMODE | RSC_DOCKINGWINDOW_X |
     387          17 :           RSC_DOCKINGWINDOW_Y) & nMask )
     388             :     {
     389             :         // use Sizes of the Resource
     390           0 :         Point   aPos;
     391           0 :         MapUnit ePosMap = MAP_PIXEL;
     392             : 
     393           0 :         if ( RSC_DOCKINGWINDOW_XYMAPMODE & nMask )
     394           0 :             ePosMap = (MapUnit)ReadLongRes();
     395             : 
     396           0 :         if ( RSC_DOCKINGWINDOW_X & nMask )
     397             :         {
     398           0 :             aPos.X() = ReadShortRes();
     399           0 :             aPos.X() = ImplLogicUnitToPixelX( aPos.X(), ePosMap );
     400             :         }
     401             : 
     402           0 :         if ( RSC_DOCKINGWINDOW_Y & nMask )
     403             :         {
     404           0 :             aPos.Y() = ReadShortRes();
     405           0 :             aPos.Y() = ImplLogicUnitToPixelY( aPos.Y(), ePosMap );
     406             :         }
     407             : 
     408           0 :         SetFloatingPos( aPos );
     409             :     }
     410             : 
     411          17 :     if ( nMask & RSC_DOCKINGWINDOW_FLOATING )
     412             :     {
     413           0 :         if ( ReadShortRes() != 0 )
     414           0 :             SetFloatingMode( true );
     415             :     }
     416          17 : }
     417             : 
     418       63394 : DockingWindow::DockingWindow( WindowType nType ) :
     419       63394 :     Window(nType)
     420             : {
     421       63394 :     ImplInitDockingWindowData();
     422       63394 : }
     423             : 
     424        3252 : DockingWindow::DockingWindow( vcl::Window* pParent, WinBits nStyle ) :
     425        3252 :     Window( WINDOW_DOCKINGWINDOW )
     426             : {
     427        3252 :     ImplInitDockingWindowData();
     428        3252 :     ImplInit( pParent, nStyle );
     429        3252 : }
     430             : 
     431           0 : DockingWindow::DockingWindow( vcl::Window* pParent, const ResId& rResId ) :
     432           0 :     Window( WINDOW_DOCKINGWINDOW )
     433             : {
     434           0 :     ImplInitDockingWindowData();
     435           0 :     rResId.SetRT( RSC_DOCKINGWINDOW );
     436           0 :     WinBits nStyle = ImplInitRes( rResId );
     437           0 :     ImplInit( pParent, nStyle );
     438           0 :     ImplLoadRes( rResId );
     439             : 
     440           0 :     if ( !(nStyle & WB_HIDE) )
     441           0 :         Show();
     442           0 : }
     443             : 
     444             : //Find the real parent stashed in mpDialogParent.
     445          17 : void DockingWindow::doDeferredInit(WinBits nBits)
     446             : {
     447          17 :     vcl::Window *pParent = mpDialogParent;
     448          17 :     mpDialogParent = NULL;
     449          17 :     ImplInit(pParent, nBits);
     450          17 :     mbIsDefferedInit = false;
     451          17 : }
     452             : 
     453          17 : void DockingWindow::loadUI(vcl::Window* pParent, const OString& rID, const OUString& rUIXMLDescription,
     454             :     const css::uno::Reference<css::frame::XFrame> &rFrame)
     455             : {
     456          17 :     mbIsDefferedInit = true;
     457          17 :     mpDialogParent = pParent; //should be unset in doDeferredInit
     458          17 :     m_pUIBuilder = new VclBuilder(this, getUIRootDir(), rUIXMLDescription, rID, rFrame);
     459          17 : }
     460             : 
     461          17 : DockingWindow::DockingWindow(vcl::Window* pParent, const OString& rID,
     462             :     const OUString& rUIXMLDescription, const css::uno::Reference<css::frame::XFrame> &rFrame)
     463          17 :     : Window(WINDOW_DOCKINGWINDOW)
     464             : {
     465          17 :     ImplInitDockingWindowData();
     466             : 
     467          17 :     loadUI(pParent, rID, rUIXMLDescription, rFrame);
     468          17 : }
     469             : 
     470      131273 : DockingWindow::~DockingWindow()
     471             : {
     472       65636 :     disposeOnce();
     473       65637 : }
     474             : 
     475       66580 : void DockingWindow::dispose()
     476             : {
     477       66580 :     if ( IsFloatingMode() )
     478             :     {
     479           0 :         Show( false, ShowFlags::NoFocusChange );
     480           0 :         SetFloatingMode( false );
     481             :     }
     482       66580 :     delete mpImplData;
     483       66580 :     mpImplData = NULL;
     484       66580 :     mpFloatWin.clear();
     485       66580 :     mpOldBorderWin.clear();
     486       66580 :     mpDialogParent.clear();
     487       66580 :     disposeBuilder();
     488       66580 :     Window::dispose();
     489       66580 : }
     490             : 
     491           0 : void DockingWindow::Tracking( const TrackingEvent& rTEvt )
     492             : {
     493           0 :     if( GetDockingManager()->IsDockable( this ) )   // new docking interface
     494           0 :         return Window::Tracking( rTEvt );
     495             : 
     496           0 :     if ( mbDocking )
     497             :     {
     498           0 :         if ( rTEvt.IsTrackingEnded() )
     499             :         {
     500           0 :             mbDocking = false;
     501           0 :             if ( mbDragFull )
     502             :             {
     503             :                 // reset old state on Cancel
     504           0 :                 if ( rTEvt.IsTrackingCanceled() )
     505             :                 {
     506           0 :                     StartDocking();
     507           0 :                     Rectangle aRect( Point( mnTrackX, mnTrackY ), Size( mnTrackWidth, mnTrackHeight ) );
     508           0 :                     EndDocking( aRect, mbStartFloat );
     509             :                 }
     510             :             }
     511             :             else
     512             :             {
     513           0 :                 HideTracking();
     514           0 :                 if ( rTEvt.IsTrackingCanceled() )
     515             :                 {
     516           0 :                     mbDockCanceled = true;
     517           0 :                     EndDocking( Rectangle( Point( mnTrackX, mnTrackY ), Size( mnTrackWidth, mnTrackHeight ) ), mbLastFloatMode );
     518           0 :                     mbDockCanceled = false;
     519             :                 }
     520             :                 else
     521           0 :                     EndDocking( Rectangle( Point( mnTrackX, mnTrackY ), Size( mnTrackWidth, mnTrackHeight ) ), mbLastFloatMode );
     522             :             }
     523             :         }
     524             :         // dock only for non-synthetic MouseEvents
     525           0 :         else if ( !rTEvt.GetMouseEvent().IsSynthetic() || rTEvt.GetMouseEvent().IsModifierChanged() )
     526             :         {
     527           0 :             Point   aMousePos = rTEvt.GetMouseEvent().GetPosPixel();
     528           0 :             Point   aFrameMousePos = ImplOutputToFrame( aMousePos );
     529           0 :             Size    aFrameSize = mpWindowImpl->mpFrameWindow->GetOutputSizePixel();
     530           0 :             if ( aFrameMousePos.X() < 0 )
     531           0 :                 aFrameMousePos.X() = 0;
     532           0 :             if ( aFrameMousePos.Y() < 0 )
     533           0 :                 aFrameMousePos.Y() = 0;
     534           0 :             if ( aFrameMousePos.X() > aFrameSize.Width()-1 )
     535           0 :                 aFrameMousePos.X() = aFrameSize.Width()-1;
     536           0 :             if ( aFrameMousePos.Y() > aFrameSize.Height()-1 )
     537           0 :                 aFrameMousePos.Y() = aFrameSize.Height()-1;
     538           0 :             aMousePos = ImplFrameToOutput( aFrameMousePos );
     539           0 :             aMousePos.X() -= maMouseOff.X();
     540           0 :             aMousePos.Y() -= maMouseOff.Y();
     541           0 :             Point aFramePos = ImplOutputToFrame( aMousePos );
     542           0 :             Rectangle aTrackRect( aFramePos, Size( mnTrackWidth, mnTrackHeight ) );
     543           0 :             Rectangle aCompRect = aTrackRect;
     544           0 :             aFramePos.X()    += maMouseOff.X();
     545           0 :             aFramePos.Y()    += maMouseOff.Y();
     546           0 :             if ( mbDragFull )
     547           0 :                 StartDocking();
     548           0 :             bool bFloatMode = Docking( aFramePos, aTrackRect );
     549           0 :             mbDockPrevented = false;
     550           0 :             mbFloatPrevented = false;
     551           0 :             if ( mbLastFloatMode != bFloatMode )
     552             :             {
     553           0 :                 if ( bFloatMode )
     554             :                 {
     555           0 :                     aTrackRect.Left()   -= mnDockLeft;
     556           0 :                     aTrackRect.Top()    -= mnDockTop;
     557           0 :                     aTrackRect.Right()  += mnDockRight;
     558           0 :                     aTrackRect.Bottom() += mnDockBottom;
     559             :                 }
     560             :                 else
     561             :                 {
     562           0 :                     if ( aCompRect == aTrackRect )
     563             :                     {
     564           0 :                         aTrackRect.Left()   += mnDockLeft;
     565           0 :                         aTrackRect.Top()    += mnDockTop;
     566           0 :                         aTrackRect.Right()  -= mnDockRight;
     567           0 :                         aTrackRect.Bottom() -= mnDockBottom;
     568             :                     }
     569             :                 }
     570           0 :                 mbLastFloatMode = bFloatMode;
     571             :             }
     572           0 :             if ( mbDragFull )
     573             :             {
     574           0 :                 Point aPos;
     575           0 :                 Point aOldPos = OutputToScreenPixel( aPos );
     576           0 :                 EndDocking( aTrackRect, mbLastFloatMode );
     577             :                 // repaint if state or position has changed
     578           0 :                 if ( aOldPos != OutputToScreenPixel( aPos ) )
     579             :                 {
     580           0 :                     ImplUpdateAll();
     581           0 :                     ImplGetFrameWindow()->ImplUpdateAll();
     582             :                 }
     583             : //                EndDocking( aTrackRect, mbLastFloatMode );
     584             :             }
     585             :             else
     586             :             {
     587             :                 sal_uInt16 nTrackStyle;
     588           0 :                 if ( bFloatMode )
     589           0 :                     nTrackStyle = SHOWTRACK_BIG;
     590             :                 else
     591           0 :                     nTrackStyle = SHOWTRACK_OBJECT;
     592           0 :                 Rectangle aShowTrackRect = aTrackRect;
     593           0 :                 aShowTrackRect.SetPos( ImplFrameToOutput( aShowTrackRect.TopLeft() ) );
     594           0 :                 ShowTracking( aShowTrackRect, nTrackStyle );
     595             : 
     596             :                 // recalculate mouse offset, as the rectangle was changed
     597           0 :                 maMouseOff.X()  = aFramePos.X() - aTrackRect.Left();
     598           0 :                 maMouseOff.Y()  = aFramePos.Y() - aTrackRect.Top();
     599             :             }
     600             : 
     601           0 :             mnTrackX        = aTrackRect.Left();
     602           0 :             mnTrackY        = aTrackRect.Top();
     603           0 :             mnTrackWidth    = aTrackRect.GetWidth();
     604           0 :             mnTrackHeight   = aTrackRect.GetHeight();
     605             :         }
     606             :     }
     607             : }
     608             : 
     609      187222 : bool DockingWindow::Notify( NotifyEvent& rNEvt )
     610             : {
     611      187222 :     if( GetDockingManager()->IsDockable( this ) )   // new docking interface
     612       12046 :         return Window::Notify( rNEvt );
     613             : 
     614      175176 :     if ( mbDockable )
     615             :     {
     616       84701 :         if ( rNEvt.GetType() == MouseNotifyEvent::MOUSEBUTTONDOWN )
     617             :         {
     618           0 :             const MouseEvent* pMEvt = rNEvt.GetMouseEvent();
     619           0 :             if ( pMEvt->IsLeft() )
     620             :             {
     621           0 :                 if ( pMEvt->IsMod1() && (pMEvt->GetClicks() == 2) )
     622             :                 {
     623           0 :                     SetFloatingMode( !IsFloatingMode() );
     624           0 :                     return true;
     625             :                 }
     626           0 :                 else if ( pMEvt->GetClicks() == 1 )
     627             :                 {
     628             :                     // check if window is floating standalone (IsFloating())
     629             :                     // or only partially floating and still docked with one border
     630             :                     // ( !mpWindowImpl->mbFrame)
     631           0 :                     if( ! IsFloatingMode() || ! mpFloatWin->mpWindowImpl->mbFrame )
     632             :                     {
     633           0 :                         Point   aPos = pMEvt->GetPosPixel();
     634           0 :                         vcl::Window* pWindow = rNEvt.GetWindow();
     635           0 :                         if ( pWindow != this )
     636             :                         {
     637           0 :                             aPos = pWindow->OutputToScreenPixel( aPos );
     638           0 :                             aPos = ScreenToOutputPixel( aPos );
     639             :                         }
     640           0 :                         ImplStartDocking( aPos );
     641             :                     }
     642           0 :                     return true;
     643             :                 }
     644             :             }
     645             :         }
     646       84701 :         else if( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
     647             :         {
     648           0 :             const vcl::KeyCode& rKey = rNEvt.GetKeyEvent()->GetKeyCode();
     649           0 :             if( rKey.GetCode() == KEY_F10 && rKey.GetModifier() &&
     650           0 :                 rKey.IsShift() && rKey.IsMod1() )
     651             :             {
     652           0 :                 SetFloatingMode( !IsFloatingMode() );
     653           0 :                 return true;
     654             :             }
     655             :         }
     656             :     }
     657             : 
     658      175176 :     return Window::Notify( rNEvt );
     659             : }
     660             : 
     661           0 : void DockingWindow::StartDocking()
     662             : {
     663           0 :     mbDocking = true;
     664           0 : }
     665             : 
     666           0 : bool DockingWindow::Docking( const Point&, Rectangle& )
     667             : {
     668           0 :     return IsFloatingMode();
     669             : }
     670             : 
     671           0 : void DockingWindow::EndDocking( const Rectangle& rRect, bool bFloatMode )
     672             : {
     673           0 :     if ( !IsDockingCanceled() )
     674             :     {
     675           0 :         bool bShow = false;
     676           0 :         if ( bool(bFloatMode) != IsFloatingMode() )
     677             :         {
     678           0 :             Show( false, ShowFlags::NoFocusChange );
     679           0 :             SetFloatingMode( bFloatMode );
     680           0 :             bShow = true;
     681           0 :             if ( bFloatMode && mpFloatWin )
     682           0 :                 mpFloatWin->SetPosSizePixel( rRect.TopLeft(), rRect.GetSize() );
     683             :         }
     684           0 :         if ( !bFloatMode )
     685             :         {
     686           0 :             Point aPos = rRect.TopLeft();
     687           0 :             aPos = GetParent()->ScreenToOutputPixel( aPos );
     688           0 :             Window::SetPosSizePixel( aPos, rRect.GetSize() );
     689             :         }
     690             : 
     691           0 :         if ( bShow )
     692           0 :             Show();
     693             :     }
     694           0 :     mbDocking = false;
     695           0 : }
     696             : 
     697           0 : bool DockingWindow::PrepareToggleFloatingMode()
     698             : {
     699           0 :     return true;
     700             : }
     701             : 
     702           0 : bool DockingWindow::Close()
     703             : {
     704           0 :     ImplDelData aDelData;
     705           0 :     ImplAddDel( &aDelData );
     706           0 :     CallEventListeners( VCLEVENT_WINDOW_CLOSE );
     707           0 :     if ( aDelData.IsDead() )
     708           0 :         return false;
     709           0 :     ImplRemoveDel( &aDelData );
     710             : 
     711           0 :     if ( mpWindowImpl->mxWindowPeer.is() && IsCreatedWithToolkit() )
     712           0 :         return false;
     713             : 
     714           0 :     Show( false, ShowFlags::NoFocusChange );
     715           0 :     return true;
     716             : }
     717             : 
     718           0 : void DockingWindow::ToggleFloatingMode()
     719             : {
     720           0 : }
     721             : 
     722           0 : void DockingWindow::Resizing( Size& )
     723             : {
     724           0 : }
     725             : 
     726       28897 : void DockingWindow::DoInitialLayout()
     727             : {
     728       28897 :     if ( GetSettings().GetStyleSettings().GetAutoMnemonic() )
     729       28897 :        ImplWindowAutoMnemonic( this );
     730             : 
     731       28897 :     if (isLayoutEnabled())
     732             :     {
     733          34 :         mbIsCalculatingInitialLayoutSize = true;
     734          34 :         setDeferredProperties();
     735          34 :         setOptimalLayoutSize();
     736          34 :         mbIsCalculatingInitialLayoutSize = false;
     737          34 :         mbInitialLayoutDone = true;
     738             :     }
     739       28897 : }
     740             : 
     741      146858 : void DockingWindow::StateChanged( StateChangedType nType )
     742             : {
     743      146858 :     switch(nType)
     744             :     {
     745             :         case StateChangedType::InitShow:
     746       28897 :             DoInitialLayout();
     747       28897 :             break;
     748             : 
     749             :         case StateChangedType::ControlBackground:
     750           0 :             ImplInitSettings();
     751           0 :             Invalidate();
     752           0 :             break;
     753             : 
     754             :         case StateChangedType::Style:
     755           0 :             mbDockable = (GetStyle() & WB_DOCKABLE) != 0;
     756           0 :             break;
     757             : 
     758             :         default:
     759      117961 :             break;
     760             :     }
     761             : 
     762      146858 :     Window::StateChanged( nType );
     763      146858 : }
     764             : 
     765         267 : void DockingWindow::DataChanged( const DataChangedEvent& rDCEvt )
     766             : {
     767        1068 :     if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
     768        1068 :          (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
     769             :     {
     770         228 :         ImplInitSettings();
     771         228 :         Invalidate();
     772             :     }
     773             :     else
     774          39 :         Window::DataChanged( rDCEvt );
     775         267 : }
     776             : 
     777           0 : void DockingWindow::SetFloatingMode( bool bFloatMode )
     778             : {
     779           0 :     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
     780           0 :     if( pWrapper )
     781             :     {
     782           0 :         pWrapper->SetFloatingMode( bFloatMode );
     783           0 :         return;
     784             :     }
     785           0 :     if ( IsFloatingMode() != bFloatMode )
     786             :     {
     787           0 :         if ( PrepareToggleFloatingMode() ) // changes to floating mode can be vetoed
     788             :         {
     789           0 :             bool bVisible = IsVisible();
     790             : 
     791           0 :             if ( bFloatMode )
     792             :             {
     793           0 :                 Show( false, ShowFlags::NoFocusChange );
     794             : 
     795           0 :                 sal_Int32 nBorderWidth = get_border_width();
     796             : 
     797           0 :                 maDockPos = Window::GetPosPixel();
     798             : 
     799           0 :                 vcl::Window* pRealParent = mpWindowImpl->mpRealParent;
     800           0 :                 mpOldBorderWin = mpWindowImpl->mpBorderWindow;
     801             : 
     802             :                 ImplDockFloatWin* pWin =
     803             :                     VclPtr<ImplDockFloatWin>::Create(
     804             : 
     805             :                                          mpImplData->mpParent,
     806           0 :                                          mnFloatBits & ( WB_MOVEABLE | WB_SIZEABLE | WB_CLOSEABLE ) ?  mnFloatBits | WB_SYSTEMWINDOW : mnFloatBits,
     807           0 :                                          this );
     808           0 :                 mpFloatWin      = pWin;
     809           0 :                 mpWindowImpl->mpBorderWindow  = NULL;
     810           0 :                 mpWindowImpl->mnLeftBorder    = 0;
     811           0 :                 mpWindowImpl->mnTopBorder     = 0;
     812           0 :                 mpWindowImpl->mnRightBorder   = 0;
     813           0 :                 mpWindowImpl->mnBottomBorder  = 0;
     814             :                 // if the parent gets destroyed, we also have to reset the parent of the BorderWindow
     815           0 :                 if ( mpOldBorderWin )
     816           0 :                     mpOldBorderWin->SetParent( pWin );
     817             : 
     818             :                 // #i123765# reset the buffered DropTargets when undocking, else it may not
     819             :                 // be correctly initialized
     820           0 :                 mpWindowImpl->mxDNDListenerContainer.clear();
     821             : 
     822           0 :                 SetParent( pWin );
     823           0 :                 SetPosPixel( Point() );
     824           0 :                 mpWindowImpl->mpBorderWindow = pWin;
     825           0 :                 pWin->mpWindowImpl->mpClientWindow = this;
     826           0 :                 mpWindowImpl->mpRealParent = pRealParent;
     827           0 :                 pWin->SetText( Window::GetText() );
     828           0 :                 Size aSize(Window::GetSizePixel());
     829           0 :                 pWin->SetOutputSizePixel(aSize);
     830           0 :                 pWin->SetPosPixel( maFloatPos );
     831             :                 // pass on DockingData to FloatingWindow
     832           0 :                 pWin->ShowTitleButton( TitleButton::Docking, mbDockBtn );
     833           0 :                 pWin->ShowTitleButton( TitleButton::Hide, mbHideBtn );
     834           0 :                 pWin->SetPin( mbPinned );
     835           0 :                 if ( mbRollUp )
     836           0 :                     pWin->RollUp();
     837             :                 else
     838           0 :                     pWin->RollDown();
     839           0 :                 pWin->SetRollUpOutputSizePixel( maRollUpOutSize );
     840           0 :                 pWin->SetMinOutputSizePixel( maMinOutSize );
     841             : 
     842           0 :                 pWin->SetMaxOutputSizePixel( mpImplData->maMaxOutSize );
     843             : 
     844           0 :                 ToggleFloatingMode();
     845             : 
     846           0 :                 set_border_width(nBorderWidth);
     847             : 
     848           0 :                 if ( bVisible )
     849           0 :                     Show();
     850             : 
     851           0 :                 mpFloatWin->queue_resize();
     852             :             }
     853             :             else
     854             :             {
     855           0 :                 Show( false, ShowFlags::NoFocusChange );
     856             : 
     857           0 :                 sal_Int32 nBorderWidth = get_border_width();
     858             : 
     859             :                 // store FloatingData in FloatingWindow
     860           0 :                 maFloatPos      = mpFloatWin->GetPosPixel();
     861           0 :                 mbDockBtn       = mpFloatWin->IsTitleButtonVisible( TitleButton::Docking );
     862           0 :                 mbHideBtn       = mpFloatWin->IsTitleButtonVisible( TitleButton::Hide );
     863           0 :                 mbPinned        = mpFloatWin->IsPinned();
     864           0 :                 mbRollUp        = mpFloatWin->IsRollUp();
     865           0 :                 maRollUpOutSize = mpFloatWin->GetRollUpOutputSizePixel();
     866           0 :                 maMinOutSize    = mpFloatWin->GetMinOutputSizePixel();
     867           0 :                 mpImplData->maMaxOutSize = mpFloatWin->GetMaxOutputSizePixel();
     868             : 
     869           0 :                 vcl::Window* pRealParent = mpWindowImpl->mpRealParent;
     870           0 :                 mpWindowImpl->mpBorderWindow = NULL;
     871           0 :                 if ( mpOldBorderWin )
     872             :                 {
     873           0 :                     SetParent( mpOldBorderWin );
     874           0 :                     static_cast<ImplBorderWindow*>(mpOldBorderWin.get())->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder );
     875           0 :                     mpOldBorderWin->Resize();
     876             :                 }
     877           0 :                 mpWindowImpl->mpBorderWindow = mpOldBorderWin;
     878           0 :                 SetParent( pRealParent );
     879           0 :                 mpWindowImpl->mpRealParent = pRealParent;
     880           0 :                 mpFloatWin.disposeAndClear();
     881           0 :                 SetPosPixel( maDockPos );
     882             : 
     883           0 :                 ToggleFloatingMode();
     884             : 
     885           0 :                 set_border_width(nBorderWidth);
     886             : 
     887           0 :                 if ( bVisible )
     888           0 :                     Show();
     889             :             }
     890             :         }
     891             :     }
     892             : }
     893             : 
     894           9 : void DockingWindow::SetFloatStyle( WinBits nStyle )
     895             : {
     896           9 :     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
     897           9 :     if( pWrapper )
     898             :     {
     899           9 :         pWrapper->SetFloatStyle( nStyle );
     900          18 :         return;
     901             :     }
     902             : 
     903           0 :     mnFloatBits = nStyle;
     904             : }
     905             : 
     906       15535 : WinBits DockingWindow::GetFloatStyle() const
     907             : {
     908       15535 :     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
     909       15535 :     if( pWrapper )
     910             :     {
     911           9 :         return pWrapper->GetFloatStyle();
     912             :     }
     913             : 
     914       15526 :     return mnFloatBits;
     915             : }
     916             : 
     917      120817 : void DockingWindow::setPosSizePixel( long nX, long nY,
     918             :                                      long nWidth, long nHeight,
     919             :                                      PosSizeFlags nFlags )
     920             : {
     921      120817 :     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
     922      120817 :     if (pWrapper)
     923             :     {
     924       30714 :         if (!pWrapper->mpFloatWin)
     925       30714 :             Window::setPosSizePixel( nX, nY, nWidth, nHeight, nFlags );
     926             :     }
     927             :     else
     928             :     {
     929       90103 :         if (!mpFloatWin)
     930       90103 :             Window::setPosSizePixel( nX, nY, nWidth, nHeight, nFlags );
     931             :     }
     932             : 
     933      120817 :     if (::isLayoutEnabled(this))
     934             :     {
     935         251 :         Size aSize(GetSizePixel());
     936             : 
     937         251 :         sal_Int32 nBorderWidth = get_border_width();
     938             : 
     939         251 :         aSize.Width() -= 2 * nBorderWidth;
     940         251 :         aSize.Height() -= 2 * nBorderWidth;
     941             : 
     942         251 :         Point aPos(nBorderWidth, nBorderWidth);
     943         251 :         Window *pBox = GetWindow(GetWindowType::FirstChild);
     944             :         assert(pBox);
     945         251 :         VclContainer::setLayoutAllocation(*pBox, aPos, aSize);
     946             :     }
     947      120817 : }
     948             : 
     949       74736 : Point DockingWindow::GetPosPixel() const
     950             : {
     951       74736 :     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
     952       74736 :     if( pWrapper )
     953             :     {
     954       50517 :         if ( pWrapper->mpFloatWin )
     955           0 :             return pWrapper->mpFloatWin->GetPosPixel();
     956             :         else
     957       50517 :             return Window::GetPosPixel();
     958             :     }
     959             : 
     960       24219 :     if ( mpFloatWin )
     961           0 :         return mpFloatWin->GetPosPixel();
     962             :     else
     963       24219 :         return Window::GetPosPixel();
     964             : }
     965             : 
     966      185995 : Size DockingWindow::GetSizePixel() const
     967             : {
     968      185995 :     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
     969      185995 :     if( pWrapper )
     970             :     {
     971       50825 :         if ( pWrapper->mpFloatWin )
     972           0 :             return pWrapper->mpFloatWin->GetSizePixel();
     973             :         else
     974       50825 :             return Window::GetSizePixel();
     975             :     }
     976             : 
     977      135170 :     if ( mpFloatWin )
     978           0 :         return mpFloatWin->GetSizePixel();
     979             :     else
     980      135170 :         return Window::GetSizePixel();
     981             : }
     982             : 
     983       19466 : void DockingWindow::SetOutputSizePixel( const Size& rNewSize )
     984             : {
     985       19466 :     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
     986       19466 :     if( pWrapper )
     987             :     {
     988        9528 :         if ( pWrapper->mpFloatWin )
     989           0 :             pWrapper->mpFloatWin->SetOutputSizePixel( rNewSize );
     990             :         else
     991        9528 :             Window::SetOutputSizePixel( rNewSize );
     992       28994 :         return;
     993             :     }
     994             : 
     995        9938 :     if ( mpFloatWin )
     996           0 :         mpFloatWin->SetOutputSizePixel( rNewSize );
     997             :     else
     998        9938 :         Window::SetOutputSizePixel( rNewSize );
     999             : }
    1000             : 
    1001       57084 : Size DockingWindow::GetOutputSizePixel() const
    1002             : {
    1003       57084 :     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
    1004       57084 :     if( pWrapper )
    1005             :     {
    1006       13620 :         if ( pWrapper->mpFloatWin )
    1007           0 :             return pWrapper->mpFloatWin->GetOutputSizePixel();
    1008             :         else
    1009       13620 :             return Window::GetOutputSizePixel();
    1010             :     }
    1011             : 
    1012       43464 :     if ( mpFloatWin )
    1013           0 :         return mpFloatWin->GetOutputSizePixel();
    1014             :     else
    1015       43464 :         return Window::GetOutputSizePixel();
    1016             : }
    1017             : 
    1018        3236 : Point DockingWindow::GetFloatingPos() const
    1019             : {
    1020        3236 :     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
    1021        3236 :     if( pWrapper )
    1022             :     {
    1023           0 :         if ( pWrapper->mpFloatWin )
    1024             :         {
    1025           0 :             WindowStateData aData;
    1026           0 :             aData.SetMask( WINDOWSTATE_MASK_POS );
    1027           0 :             pWrapper->mpFloatWin->GetWindowStateData( aData );
    1028           0 :             Point aPos( aData.GetX(), aData.GetY() );
    1029           0 :             aPos = pWrapper->mpFloatWin->GetParent()->ImplGetFrameWindow()->AbsoluteScreenToOutputPixel( aPos );
    1030           0 :             return aPos;
    1031             :         }
    1032             :         else
    1033           0 :             return maFloatPos;
    1034             :     }
    1035             : 
    1036        3236 :     if ( mpFloatWin )
    1037             :     {
    1038           0 :         WindowStateData aData;
    1039           0 :         aData.SetMask( WINDOWSTATE_MASK_POS );
    1040           0 :         mpFloatWin->GetWindowStateData( aData );
    1041           0 :         Point aPos( aData.GetX(), aData.GetY() );
    1042           0 :         aPos = mpFloatWin->GetParent()->ImplGetFrameWindow()->AbsoluteScreenToOutputPixel( aPos );
    1043           0 :         return aPos;
    1044             :     }
    1045             :     else
    1046        3236 :         return maFloatPos;
    1047             : }
    1048             : 
    1049     1171988 : bool DockingWindow::IsFloatingMode() const
    1050             : {
    1051     1171988 :     ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this );
    1052     1171988 :     if( pWrapper )
    1053      748419 :         return pWrapper->IsFloatingMode();
    1054             :     else
    1055      423569 :         return (mpFloatWin != nullptr);
    1056             : }
    1057             : 
    1058           0 : void DockingWindow::SetMaxOutputSizePixel( const Size& rSize )
    1059             : {
    1060           0 :     if ( mpFloatWin )
    1061           0 :         mpFloatWin->SetMaxOutputSizePixel( rSize );
    1062           0 :     mpImplData->maMaxOutSize = rSize;
    1063           0 : }
    1064             : 
    1065       13333 : void DockingWindow::SetText(const OUString& rStr)
    1066             : {
    1067       13333 :     setDeferredProperties();
    1068       13333 :     Window::SetText(rStr);
    1069       13333 : }
    1070             : 
    1071       15967 : OUString DockingWindow::GetText() const
    1072             : {
    1073       15967 :     const_cast<DockingWindow*>(this)->setDeferredProperties();
    1074       15967 :     return Window::GetText();
    1075             : }
    1076             : 
    1077      320941 : bool DockingWindow::isLayoutEnabled() const
    1078             : {
    1079             :     //pre dtor called, and single child is a container => we're layout enabled
    1080      320941 :     return mpImplData && ::isLayoutEnabled(this);
    1081             : }
    1082             : 
    1083          34 : void DockingWindow::setOptimalLayoutSize()
    1084             : {
    1085          34 :     maLayoutIdle.Stop();
    1086             : 
    1087             :     //resize DockingWindow to fit requisition on initial show
    1088          34 :     Window *pBox = GetWindow(GetWindowType::FirstChild);
    1089             : 
    1090          34 :     Size aSize = get_preferred_size();
    1091             : 
    1092          34 :     Size aMax(bestmaxFrameSizeForScreenSize(GetDesktopRectPixel().GetSize()));
    1093             : 
    1094          34 :     aSize.Width() = std::min(aMax.Width(), aSize.Width());
    1095          34 :     aSize.Height() = std::min(aMax.Height(), aSize.Height());
    1096             : 
    1097          34 :     SetMinOutputSizePixel(aSize);
    1098          34 :     SetSizePixel(aSize);
    1099          34 :     setPosSizeOnContainee(aSize, *pBox);
    1100          34 : }
    1101             : 
    1102         115 : void DockingWindow::setPosSizeOnContainee(Size aSize, Window &rBox)
    1103             : {
    1104         115 :     sal_Int32 nBorderWidth = get_border_width();
    1105             : 
    1106         115 :     aSize.Width() -= 2 * nBorderWidth;
    1107         115 :     aSize.Height() -= 2 * nBorderWidth;
    1108             : 
    1109         115 :     Point aPos(nBorderWidth, nBorderWidth);
    1110         115 :     VclContainer::setLayoutAllocation(rBox, aPos, aSize);
    1111         115 : }
    1112             : 
    1113          49 : Size DockingWindow::GetOptimalSize() const
    1114             : {
    1115          49 :     if (!isLayoutEnabled())
    1116           0 :         return Window::GetOptimalSize();
    1117             : 
    1118          49 :     Size aSize = VclContainer::getLayoutRequisition(*GetWindow(GetWindowType::FirstChild));
    1119             : 
    1120          49 :     sal_Int32 nBorderWidth = get_border_width();
    1121             : 
    1122          98 :     aSize.Height() += mpWindowImpl->mnLeftBorder + mpWindowImpl->mnRightBorder
    1123          98 :         + 2*nBorderWidth;
    1124          98 :     aSize.Width() += mpWindowImpl->mnTopBorder + mpWindowImpl->mnBottomBorder
    1125          98 :         + 2*nBorderWidth;
    1126             : 
    1127          49 :     return Window::CalcWindowSize(aSize);
    1128             : }
    1129             : 
    1130      291897 : void DockingWindow::queue_resize(StateChangedType eReason)
    1131             : {
    1132      291897 :     bool bTriggerLayout = true;
    1133      291897 :     if (hasPendingLayout() || isCalculatingInitialLayoutSize())
    1134             :     {
    1135         378 :         bTriggerLayout = false;
    1136             :     }
    1137      291897 :     if (!isLayoutEnabled())
    1138             :     {
    1139      291472 :         bTriggerLayout = false;
    1140             :     }
    1141      291897 :     if (bTriggerLayout)
    1142             :     {
    1143         149 :         InvalidateSizeCache();
    1144         149 :         maLayoutIdle.Start();
    1145             :     }
    1146      291897 :     vcl::Window::queue_resize(eReason);
    1147      291897 : }
    1148             : 
    1149         196 : IMPL_LINK_NOARG_TYPED(DockingWindow, ImplHandleLayoutTimerHdl, Idle*, void)
    1150             : {
    1151          98 :     if (!isLayoutEnabled())
    1152             :     {
    1153             :         SAL_WARN("vcl.layout", "DockingWindow has become non-layout because extra children have been added directly to it.");
    1154         115 :         return;
    1155             :     }
    1156             : 
    1157          81 :     Window *pBox = GetWindow(GetWindowType::FirstChild);
    1158             :     assert(pBox);
    1159          81 :     setPosSizeOnContainee(GetSizePixel(), *pBox);
    1160         801 : }
    1161             : 
    1162             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11