LCOV - code coverage report
Current view: top level - vcl/source/window - syswin.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 404 646 62.5 %
Date: 2015-06-13 12:38:46 Functions: 39 58 67.2 %
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 <sal/config.h>
      21             : 
      22             : #include <cstdlib>
      23             : 
      24             : #include <tools/debug.hxx>
      25             : 
      26             : #include <vcl/layout.hxx>
      27             : #include <vcl/settings.hxx>
      28             : #include <vcl/svapp.hxx>
      29             : #include <vcl/menu.hxx>
      30             : #include <vcl/event.hxx>
      31             : #include <vcl/syswin.hxx>
      32             : #include <vcl/taskpanelist.hxx>
      33             : #include <vcl/unowrap.hxx>
      34             : 
      35             : #include <rtl/strbuf.hxx>
      36             : 
      37             : #include <salframe.hxx>
      38             : #include <svdata.hxx>
      39             : #include <brdwin.hxx>
      40             : #include <window.h>
      41             : 
      42             : using namespace ::com::sun::star::uno;
      43             : using namespace ::com::sun::star::lang;
      44             : 
      45             : class SystemWindow::ImplData
      46             : {
      47             : public:
      48             :     ImplData();
      49             :     ~ImplData();
      50             : 
      51             :     TaskPaneList*   mpTaskPaneList;
      52             :     Size            maMaxOutSize;
      53             :     OUString   maRepresentedURL;
      54             :     Link<> maCloseHdl;
      55             : };
      56             : 
      57        6933 : SystemWindow::ImplData::ImplData()
      58             : {
      59        6933 :     mpTaskPaneList = NULL;
      60        6933 :     maMaxOutSize = Size( SHRT_MAX, SHRT_MAX );
      61        6933 : }
      62             : 
      63       13830 : SystemWindow::ImplData::~ImplData()
      64             : {
      65        6915 :     delete mpTaskPaneList;
      66        6915 : }
      67             : 
      68        6933 : void SystemWindow::Init()
      69             : {
      70        6933 :     mpImplData          = new ImplData;
      71        6933 :     mpWindowImpl->mbSysWin            = true;
      72        6933 :     mpWindowImpl->mnActivateMode      = ActivateModeFlags::GrabFocus;
      73             : 
      74        6933 :     mpMenuBar           = NULL;
      75        6933 :     mbPinned            = false;
      76        6933 :     mbRollUp            = false;
      77        6933 :     mbRollFunc          = false;
      78        6933 :     mbDockBtn           = false;
      79        6933 :     mbHideBtn           = false;
      80        6933 :     mbSysChild          = false;
      81        6933 :     mbIsCalculatingInitialLayoutSize = false;
      82        6933 :     mbInitialLayoutDone = false;
      83        6933 :     mnMenuBarMode       = MenuBarMode::Normal;
      84        6933 :     mnIcon              = 0;
      85        6933 :     mpDialogParent      = NULL;
      86             : 
      87             :     //To-Do, reuse maResizeTimer
      88        6933 :     maLayoutIdle.SetPriority(SchedulerPriority::RESIZE);
      89        6933 :     maLayoutIdle.SetIdleHdl( LINK( this, SystemWindow, ImplHandleLayoutTimerHdl ) );
      90        6933 : }
      91             : 
      92        6933 : SystemWindow::SystemWindow(WindowType nType)
      93             :     : Window(nType)
      94        6933 :     , mbIsDefferedInit(false)
      95             : {
      96        6933 :     Init();
      97        6933 : }
      98             : 
      99           3 : void SystemWindow::loadUI(vcl::Window* pParent, const OString& rID, const OUString& rUIXMLDescription,
     100             :     const css::uno::Reference<css::frame::XFrame> &rFrame)
     101             : {
     102           3 :     mbIsDefferedInit = true;
     103           3 :     mpDialogParent = pParent; //should be unset in doDeferredInit
     104           6 :     m_pUIBuilder = new VclBuilder(this, getUIRootDir(), rUIXMLDescription, rID, rFrame);
     105           0 : }
     106             : 
     107       13830 : SystemWindow::~SystemWindow()
     108             : {
     109        6915 :     disposeOnce();
     110        6915 : }
     111             : 
     112        6915 : void SystemWindow::dispose()
     113             : {
     114        6915 :     maLayoutIdle.Stop();
     115        6915 :     delete mpImplData;
     116        6915 :     mpImplData = NULL;
     117             : 
     118             :     // Hack to make sure code called from base ~Window does not interpret this
     119             :     // as a SystemWindow (which it no longer is by then):
     120        6915 :     mpWindowImpl->mbSysWin = false;
     121        6915 :     disposeBuilder();
     122        6915 :     mpDialogParent.clear();
     123        6915 :     Window::dispose();
     124        6915 : }
     125             : 
     126       70346 : bool SystemWindow::Notify( NotifyEvent& rNEvt )
     127             : {
     128             :     // capture KeyEvents for menu handling
     129       70346 :     if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
     130             :     {
     131           0 :         MenuBar* pMBar = mpMenuBar;
     132           0 :         if ( !pMBar && ( GetType() == WINDOW_FLOATINGWINDOW ) )
     133             :         {
     134           0 :             vcl::Window* pWin = ImplGetFrameWindow()->ImplGetWindow();
     135           0 :             if( pWin && pWin->IsSystemWindow() )
     136           0 :                 pMBar = static_cast<SystemWindow*>(pWin)->GetMenuBar();
     137             :         }
     138           0 :         if ( pMBar && pMBar->ImplHandleKeyEvent( *rNEvt.GetKeyEvent(), false ) )
     139           0 :             return true;
     140             :     }
     141             : 
     142       70346 :     return Window::Notify( rNEvt );
     143             : }
     144             : 
     145       32682 : bool SystemWindow::PreNotify( NotifyEvent& rNEvt )
     146             : {
     147             :     // capture KeyEvents for taskpane cycling
     148       32682 :     if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
     149             :     {
     150           0 :         if( rNEvt.GetKeyEvent()->GetKeyCode().GetCode() == KEY_F6 &&
     151           0 :             rNEvt.GetKeyEvent()->GetKeyCode().IsMod1() &&
     152           0 :            !rNEvt.GetKeyEvent()->GetKeyCode().IsShift() )
     153             :         {
     154             :             // Ctrl-F6 goes directly to the document
     155           0 :             GrabFocusToDocument();
     156           0 :             return true;
     157             :         }
     158             :         else
     159             :         {
     160           0 :             TaskPaneList *pTList = mpImplData->mpTaskPaneList;
     161           0 :             if( !pTList && ( GetType() == WINDOW_FLOATINGWINDOW ) )
     162             :             {
     163           0 :                 vcl::Window* pWin = ImplGetFrameWindow()->ImplGetWindow();
     164           0 :                 if( pWin && pWin->IsSystemWindow() )
     165           0 :                     pTList = static_cast<SystemWindow*>(pWin)->mpImplData->mpTaskPaneList;
     166             :             }
     167           0 :             if( !pTList )
     168             :             {
     169             :                 // search topmost system window which is the one to handle dialog/toolbar cycling
     170           0 :                 SystemWindow *pSysWin = this;
     171           0 :                 vcl::Window *pWin = this;
     172           0 :                 while( pWin )
     173             :                 {
     174           0 :                     pWin = pWin->GetParent();
     175           0 :                     if( pWin && pWin->IsSystemWindow() )
     176           0 :                         pSysWin = static_cast<SystemWindow*>(pWin);
     177             :                 }
     178           0 :                 pTList = pSysWin->mpImplData->mpTaskPaneList;
     179             :             }
     180           0 :             if( pTList && pTList->HandleKeyEvent( *rNEvt.GetKeyEvent() ) )
     181           0 :                 return true;
     182             :         }
     183             :     }
     184       32682 :     return Window::PreNotify( rNEvt );
     185             : }
     186             : 
     187       33949 : TaskPaneList* SystemWindow::GetTaskPaneList()
     188             : {
     189       33949 :     if( !mpImplData )
     190           0 :         return NULL;
     191       33949 :     if( mpImplData->mpTaskPaneList )
     192       30683 :         return mpImplData->mpTaskPaneList ;
     193             :     else
     194             :     {
     195        3266 :         mpImplData->mpTaskPaneList = new TaskPaneList();
     196        3266 :         MenuBar* pMBar = mpMenuBar;
     197        3266 :         if ( !pMBar && ( GetType() == WINDOW_FLOATINGWINDOW ) )
     198             :         {
     199           0 :             vcl::Window* pWin = ImplGetFrameWindow()->ImplGetWindow();
     200           0 :             if ( pWin && pWin->IsSystemWindow() )
     201           0 :                 pMBar = static_cast<SystemWindow*>(pWin)->GetMenuBar();
     202             :         }
     203        3266 :         if( pMBar )
     204         121 :             mpImplData->mpTaskPaneList->AddWindow( pMBar->ImplGetWindow() );
     205        3266 :         return mpImplData->mpTaskPaneList;
     206             :     }
     207             : }
     208             : 
     209           0 : bool SystemWindow::Close()
     210             : {
     211           0 :     ImplDelData aDelData;
     212           0 :     ImplAddDel( &aDelData );
     213           0 :     CallEventListeners( VCLEVENT_WINDOW_CLOSE );
     214           0 :     if ( aDelData.IsDead() )
     215           0 :         return false;
     216           0 :     ImplRemoveDel( &aDelData );
     217             : 
     218           0 :     if ( mpWindowImpl->mxWindowPeer.is() && IsCreatedWithToolkit() )
     219           0 :         return false;
     220             : 
     221             :     // Is Window not closeable, ignore close
     222           0 :     vcl::Window*     pBorderWin = ImplGetBorderWindow();
     223             :     WinBits     nStyle;
     224           0 :     if ( pBorderWin )
     225           0 :         nStyle = pBorderWin->GetStyle();
     226             :     else
     227           0 :         nStyle = GetStyle();
     228           0 :     if ( !(nStyle & WB_CLOSEABLE) )
     229           0 :         return false;
     230             : 
     231           0 :     Hide();
     232             : 
     233           0 :     return true;
     234             : }
     235             : 
     236           0 : void SystemWindow::TitleButtonClick( TitleButton )
     237             : {
     238           0 : }
     239             : 
     240           0 : void SystemWindow::Pin()
     241             : {
     242           0 : }
     243             : 
     244           0 : void SystemWindow::Roll()
     245             : {
     246           0 : }
     247             : 
     248           0 : void SystemWindow::Resizing( Size& )
     249             : {
     250           0 : }
     251             : 
     252        6639 : void SystemWindow::SetRepresentedURL( const OUString& i_rURL )
     253             : {
     254        6639 :     bool bChanged = (i_rURL != mpImplData->maRepresentedURL);
     255        6639 :     mpImplData->maRepresentedURL = i_rURL;
     256        6639 :     if ( !mbSysChild && bChanged )
     257             :     {
     258        2486 :         const vcl::Window* pWindow = this;
     259        7458 :         while ( pWindow->mpWindowImpl->mpBorderWindow )
     260        2486 :             pWindow = pWindow->mpWindowImpl->mpBorderWindow;
     261             : 
     262        2486 :         if ( pWindow->mpWindowImpl->mbFrame )
     263        2486 :             pWindow->mpWindowImpl->mpFrame->SetRepresentedURL( i_rURL );
     264             :     }
     265        6639 : }
     266             : 
     267        9928 : void SystemWindow::SetIcon( sal_uInt16 nIcon )
     268             : {
     269        9928 :     if ( mnIcon == nIcon )
     270       16566 :         return;
     271             : 
     272        3290 :     mnIcon = nIcon;
     273             : 
     274        3290 :     if ( !mbSysChild )
     275             :     {
     276        3290 :         const vcl::Window* pWindow = this;
     277        9870 :         while ( pWindow->mpWindowImpl->mpBorderWindow )
     278        3290 :             pWindow = pWindow->mpWindowImpl->mpBorderWindow;
     279             : 
     280        3290 :         if ( pWindow->mpWindowImpl->mbFrame )
     281        3290 :             pWindow->mpWindowImpl->mpFrame->SetIcon( nIcon );
     282             :     }
     283             : }
     284             : 
     285        3314 : void SystemWindow::EnableSaveBackground(bool bSave)
     286             : {
     287        3314 :     if( ImplGetSVData()->maWinData.mbNoSaveBackground )
     288           0 :         bSave = false;
     289             : 
     290        3314 :     vcl::Window* pWindow = this;
     291        9942 :     while (pWindow->mpWindowImpl->mpBorderWindow)
     292        3314 :         pWindow = pWindow->mpWindowImpl->mpBorderWindow;
     293        3314 :     if (pWindow->mpWindowImpl->mbOverlapWin && !pWindow->mpWindowImpl->mbFrame)
     294             :     {
     295           0 :         pWindow->mpWindowImpl->mpOverlapData->mbSaveBack = bSave;
     296           0 :         if (!bSave)
     297           0 :             pWindow->ImplDeleteOverlapBackground();
     298             :     }
     299        3314 : }
     300             : 
     301          12 : bool SystemWindow::IsSaveBackgroundEnabled() const
     302             : {
     303          12 :     const vcl::Window* pWindow = this;
     304          36 :     while ( pWindow->mpWindowImpl->mpBorderWindow )
     305          12 :         pWindow = pWindow->mpWindowImpl->mpBorderWindow;
     306          12 :     if ( pWindow->mpWindowImpl->mpOverlapData )
     307          12 :         return pWindow->mpWindowImpl->mpOverlapData->mbSaveBack;
     308             :     else
     309           0 :         return false;
     310             : }
     311             : 
     312           0 : void SystemWindow::ShowTitleButton( TitleButton nButton, bool bVisible )
     313             : {
     314           0 :     if ( nButton == TitleButton::Docking )
     315             :     {
     316           0 :         if ( mbDockBtn != bVisible )
     317             :         {
     318           0 :             mbDockBtn = bVisible;
     319           0 :             if ( mpWindowImpl->mpBorderWindow )
     320           0 :                 static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetDockButton( bVisible );
     321             :         }
     322             :     }
     323           0 :     else if ( nButton == TitleButton::Hide )
     324             :     {
     325           0 :         if ( mbHideBtn != bVisible )
     326             :         {
     327           0 :             mbHideBtn = bVisible;
     328           0 :             if ( mpWindowImpl->mpBorderWindow )
     329           0 :                 static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetHideButton( bVisible );
     330             :         }
     331             :     }
     332           0 :     else if ( nButton == TitleButton::Menu )
     333             :     {
     334           0 :         if ( mpWindowImpl->mpBorderWindow )
     335           0 :             static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetMenuButton( bVisible );
     336             :     }
     337             :     else
     338           0 :         return;
     339             : }
     340             : 
     341           0 : bool SystemWindow::IsTitleButtonVisible( TitleButton nButton ) const
     342             : {
     343           0 :     if ( nButton == TitleButton::Docking )
     344           0 :         return mbDockBtn;
     345             :     else /* if ( nButton == TitleButton::Hide ) */
     346           0 :         return mbHideBtn;
     347             : }
     348             : 
     349           0 : void SystemWindow::SetPin( bool bPin )
     350             : {
     351           0 :     if ( bPin != mbPinned )
     352             :     {
     353           0 :         mbPinned = bPin;
     354           0 :         if ( mpWindowImpl->mpBorderWindow )
     355           0 :             static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetPin( bPin );
     356             :     }
     357           0 : }
     358             : 
     359           0 : void SystemWindow::RollUp()
     360             : {
     361           0 :     if ( !mbRollUp )
     362             :     {
     363           0 :         maOrgSize = GetOutputSizePixel();
     364           0 :         mbRollFunc = true;
     365           0 :         Size aSize = maRollUpOutSize;
     366           0 :         if ( !aSize.Width() )
     367           0 :             aSize.Width() = GetOutputSizePixel().Width();
     368           0 :         mbRollUp = true;
     369           0 :         if ( mpWindowImpl->mpBorderWindow )
     370           0 :             static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetRollUp( true, aSize );
     371             :         else
     372           0 :             SetOutputSizePixel( aSize );
     373           0 :         mbRollFunc = false;
     374             :     }
     375           0 : }
     376             : 
     377           0 : void SystemWindow::RollDown()
     378             : {
     379           0 :     if ( mbRollUp )
     380             :     {
     381           0 :         mbRollUp = false;
     382           0 :         if ( mpWindowImpl->mpBorderWindow )
     383           0 :             static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetRollUp( false, maOrgSize );
     384             :         else
     385           0 :             SetOutputSizePixel( maOrgSize );
     386             :     }
     387           0 : }
     388             : 
     389           2 : void SystemWindow::SetMinOutputSizePixel( const Size& rSize )
     390             : {
     391           2 :     maMinOutSize = rSize;
     392           2 :     if ( mpWindowImpl->mpBorderWindow )
     393             :     {
     394           1 :         static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetMinOutputSize( rSize.Width(), rSize.Height() );
     395           1 :         if ( mpWindowImpl->mpBorderWindow->mpWindowImpl->mbFrame )
     396           1 :             mpWindowImpl->mpBorderWindow->mpWindowImpl->mpFrame->SetMinClientSize( rSize.Width(), rSize.Height() );
     397             :     }
     398           1 :     else if ( mpWindowImpl->mbFrame )
     399           1 :         mpWindowImpl->mpFrame->SetMinClientSize( rSize.Width(), rSize.Height() );
     400           2 : }
     401             : 
     402           0 : void SystemWindow::SetMaxOutputSizePixel( const Size& rSize )
     403             : {
     404           0 :     Size aSize( rSize );
     405           0 :     if( aSize.Width() > SHRT_MAX || aSize.Width() <= 0 )
     406           0 :         aSize.Width() = SHRT_MAX;
     407           0 :     if( aSize.Height() > SHRT_MAX || aSize.Height() <= 0 )
     408           0 :         aSize.Height() = SHRT_MAX;
     409             : 
     410           0 :     mpImplData->maMaxOutSize = aSize;
     411           0 :     if ( mpWindowImpl->mpBorderWindow )
     412             :     {
     413           0 :         static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetMaxOutputSize( aSize.Width(), aSize.Height() );
     414           0 :         if ( mpWindowImpl->mpBorderWindow->mpWindowImpl->mbFrame )
     415           0 :             mpWindowImpl->mpBorderWindow->mpWindowImpl->mpFrame->SetMaxClientSize( aSize.Width(), aSize.Height() );
     416             :     }
     417           0 :     else if ( mpWindowImpl->mbFrame )
     418           0 :         mpWindowImpl->mpFrame->SetMaxClientSize( aSize.Width(), aSize.Height() );
     419           0 : }
     420             : 
     421          13 : const Size& SystemWindow::GetMaxOutputSizePixel() const
     422             : {
     423          13 :     return mpImplData->maMaxOutSize;
     424             : }
     425             : 
     426        3220 : static void ImplWindowStateFromStr(WindowStateData& rData,
     427             :     const OString& rStr)
     428             : {
     429        3220 :     sal_uLong       nValidMask  = 0;
     430        3220 :     sal_Int32 nIndex      = 0;
     431        3220 :     OString aTokenStr;
     432             : 
     433        3220 :     aTokenStr = rStr.getToken(0, ',', nIndex);
     434        3220 :     if (!aTokenStr.isEmpty())
     435             :     {
     436        3101 :         rData.SetX(aTokenStr.toInt32());
     437        3101 :         if( rData.GetX() > -16384 && rData.GetX() < 16384 )
     438        3101 :             nValidMask |= WINDOWSTATE_MASK_X;
     439             :         else
     440           0 :             rData.SetX( 0 );
     441             :     }
     442             :     else
     443         119 :         rData.SetX( 0 );
     444        3220 :     aTokenStr = rStr.getToken(0, ',', nIndex);
     445        3220 :     if (!aTokenStr.isEmpty())
     446             :     {
     447        3101 :         rData.SetY(aTokenStr.toInt32());
     448        3101 :         if( rData.GetY() > -16384 && rData.GetY() < 16384 )
     449        3101 :             nValidMask |= WINDOWSTATE_MASK_Y;
     450             :         else
     451           0 :             rData.SetY( 0 );
     452             :     }
     453             :     else
     454         119 :         rData.SetY( 0 );
     455        3220 :     aTokenStr = rStr.getToken(0, ',', nIndex);
     456        3220 :     if (!aTokenStr.isEmpty())
     457             :     {
     458        3101 :         rData.SetWidth(aTokenStr.toInt32());
     459        3101 :         if( rData.GetWidth() > 0 && rData.GetWidth() < 16384 )
     460        3101 :             nValidMask |= WINDOWSTATE_MASK_WIDTH;
     461             :         else
     462           0 :             rData.SetWidth( 0 );
     463             :     }
     464             :     else
     465         119 :         rData.SetWidth( 0 );
     466        3220 :     aTokenStr = rStr.getToken(0, ';', nIndex);
     467        3220 :     if (!aTokenStr.isEmpty())
     468             :     {
     469        3101 :         rData.SetHeight(aTokenStr.toInt32());
     470        3101 :         if( rData.GetHeight() > 0 && rData.GetHeight() < 16384 )
     471        3101 :             nValidMask |= WINDOWSTATE_MASK_HEIGHT;
     472             :         else
     473           0 :             rData.SetHeight( 0 );
     474             :     }
     475             :     else
     476         119 :         rData.SetHeight( 0 );
     477        3220 :     aTokenStr = rStr.getToken(0, ';', nIndex);
     478        3220 :     if (!aTokenStr.isEmpty())
     479             :     {
     480             :         // #94144# allow Minimize again, should be masked out when read from configuration
     481             :         // 91625 - ignore Minimize
     482        3220 :         sal_uInt32 nState = (sal_uInt32)aTokenStr.toInt32();
     483             :         //nState &= ~(WINDOWSTATE_STATE_MINIMIZED);
     484        3220 :         rData.SetState( nState );
     485        3220 :         nValidMask |= WINDOWSTATE_MASK_STATE;
     486             :     }
     487             :     else
     488           0 :         rData.SetState( 0 );
     489             : 
     490             :     // read maximized pos/size
     491        3220 :     aTokenStr = rStr.getToken(0, ',', nIndex);
     492        3220 :     if (!aTokenStr.isEmpty())
     493             :     {
     494        3101 :         rData.SetMaximizedX(aTokenStr.toInt32());
     495        3101 :         if( rData.GetMaximizedX() > -16384 && rData.GetMaximizedX() < 16384 )
     496        3101 :             nValidMask |= WINDOWSTATE_MASK_MAXIMIZED_X;
     497             :         else
     498           0 :             rData.SetMaximizedX( 0 );
     499             :     }
     500             :     else
     501         119 :         rData.SetMaximizedX( 0 );
     502        3220 :     aTokenStr = rStr.getToken(0, ',', nIndex);
     503        3220 :     if (!aTokenStr.isEmpty())
     504             :     {
     505        3101 :         rData.SetMaximizedY(aTokenStr.toInt32());
     506        3101 :         if( rData.GetMaximizedY() > -16384 && rData.GetMaximizedY() < 16384 )
     507        3101 :             nValidMask |= WINDOWSTATE_MASK_MAXIMIZED_Y;
     508             :         else
     509           0 :             rData.SetMaximizedY( 0 );
     510             :     }
     511             :     else
     512         119 :         rData.SetMaximizedY( 0 );
     513        3220 :     aTokenStr = rStr.getToken(0, ',', nIndex);
     514        3220 :     if (!aTokenStr.isEmpty())
     515             :     {
     516        3101 :         rData.SetMaximizedWidth(aTokenStr.toInt32());
     517        3101 :         if( rData.GetMaximizedWidth() > 0 && rData.GetMaximizedWidth() < 16384 )
     518           0 :             nValidMask |= WINDOWSTATE_MASK_MAXIMIZED_WIDTH;
     519             :         else
     520        3101 :             rData.SetMaximizedWidth( 0 );
     521             :     }
     522             :     else
     523         119 :         rData.SetMaximizedWidth( 0 );
     524        3220 :     aTokenStr = rStr.getToken(0, ';', nIndex);
     525        3220 :     if (!aTokenStr.isEmpty())
     526             :     {
     527        3101 :         rData.SetMaximizedHeight(aTokenStr.toInt32());
     528        3101 :         if( rData.GetMaximizedHeight() > 0 && rData.GetMaximizedHeight() < 16384 )
     529           0 :             nValidMask |= WINDOWSTATE_MASK_MAXIMIZED_HEIGHT;
     530             :         else
     531        3101 :             rData.SetMaximizedHeight( 0 );
     532             :     }
     533             :     else
     534         119 :         rData.SetMaximizedHeight( 0 );
     535             : 
     536             :     // mark valid fields
     537        3220 :     rData.SetMask( nValidMask );
     538        3220 : }
     539             : 
     540        6455 : static OString ImplWindowStateToStr(const WindowStateData& rData)
     541             : {
     542        6455 :     sal_uLong nValidMask = rData.GetMask();
     543        6455 :     if ( !nValidMask )
     544           0 :         return OString();
     545             : 
     546        6455 :     OStringBuffer rStrBuf;
     547             : 
     548        6455 :     if ( nValidMask & WINDOWSTATE_MASK_X )
     549        6455 :         rStrBuf.append(static_cast<sal_Int32>(rData.GetX()));
     550        6455 :     rStrBuf.append(',');
     551        6455 :     if ( nValidMask & WINDOWSTATE_MASK_Y )
     552        6455 :         rStrBuf.append(static_cast<sal_Int32>(rData.GetY()));
     553        6455 :     rStrBuf.append(',');
     554        6455 :     if ( nValidMask & WINDOWSTATE_MASK_WIDTH )
     555        6455 :         rStrBuf.append(static_cast<sal_Int32>(rData.GetWidth()));
     556        6455 :     rStrBuf.append(',');
     557        6455 :     if ( nValidMask & WINDOWSTATE_MASK_HEIGHT )
     558        6455 :         rStrBuf.append(static_cast<sal_Int32>(rData.GetHeight()));
     559        6455 :     rStrBuf.append( ';' );
     560        6455 :     if ( nValidMask & WINDOWSTATE_MASK_STATE )
     561             :     {
     562             :         // #94144# allow Minimize again, should be masked out when read from configuration
     563             :         // 91625 - ignore Minimize
     564        6455 :         sal_uInt32 nState = rData.GetState();
     565        6455 :         rStrBuf.append(static_cast<sal_Int32>(nState));
     566             :     }
     567        6455 :     rStrBuf.append(';');
     568        6455 :     if ( nValidMask & WINDOWSTATE_MASK_MAXIMIZED_X )
     569        6455 :         rStrBuf.append(static_cast<sal_Int32>(rData.GetMaximizedX()));
     570        6455 :     rStrBuf.append(',');
     571        6455 :     if ( nValidMask & WINDOWSTATE_MASK_MAXIMIZED_Y )
     572        6455 :         rStrBuf.append(static_cast<sal_Int32>(rData.GetMaximizedY()));
     573        6455 :     rStrBuf.append( ',' );
     574        6455 :     if ( nValidMask & WINDOWSTATE_MASK_MAXIMIZED_WIDTH )
     575        6455 :         rStrBuf.append(static_cast<sal_Int32>(rData.GetMaximizedWidth()));
     576        6455 :     rStrBuf.append(',');
     577        6455 :     if ( nValidMask & WINDOWSTATE_MASK_MAXIMIZED_HEIGHT )
     578        6455 :         rStrBuf.append(static_cast<sal_Int32>(rData.GetMaximizedHeight()));
     579        6455 :     rStrBuf.append(';');
     580             : 
     581        6455 :     return rStrBuf.makeStringAndClear();
     582             : }
     583             : 
     584        6440 : void SystemWindow::ImplMoveToScreen( long& io_rX, long& io_rY, long i_nWidth, long i_nHeight, vcl::Window* i_pConfigureWin )
     585             : {
     586        6440 :     Rectangle aScreenRect;
     587        6440 :     if( !Application::IsUnifiedDisplay() )
     588           0 :         aScreenRect = Application::GetScreenPosSizePixel( GetScreenNumber() );
     589             :     else
     590             :     {
     591        6440 :         aScreenRect = Application::GetScreenPosSizePixel( 0 );
     592        6440 :         for( unsigned int i = 1; i < Application::GetScreenCount(); i++ )
     593           0 :             aScreenRect.Union( Application::GetScreenPosSizePixel( i ) );
     594             :     }
     595             :     // unfortunately most of the time width and height are not really known
     596        6440 :     if( i_nWidth < 1 )
     597        3339 :         i_nWidth = 50;
     598        6440 :     if( i_nHeight < 1 )
     599        3339 :         i_nHeight = 50;
     600             : 
     601             :     // check left border
     602        6440 :     bool bMove = false;
     603        6440 :     if( io_rX + i_nWidth < aScreenRect.Left() )
     604             :     {
     605           0 :         bMove = true;
     606           0 :         io_rX = aScreenRect.Left();
     607             :     }
     608             :     // check right border
     609        6440 :     if( io_rX > aScreenRect.Right() - i_nWidth )
     610             :     {
     611           0 :         bMove = true;
     612           0 :         io_rX = aScreenRect.Right() - i_nWidth;
     613             :     }
     614             :     // check top border
     615        6440 :     if( io_rY + i_nHeight < aScreenRect.Top() )
     616             :     {
     617           0 :         bMove = true;
     618           0 :         io_rY = aScreenRect.Top();
     619             :     }
     620             :     // check bottom border
     621        6440 :     if( io_rY > aScreenRect.Bottom() - i_nHeight )
     622             :     {
     623           0 :         bMove = true;
     624           0 :         io_rY = aScreenRect.Bottom() - i_nHeight;
     625             :     }
     626        6440 :     vcl::Window* pParent = i_pConfigureWin->GetParent();
     627        6440 :     if( bMove && pParent )
     628             :     {
     629             :         // calculate absolute screen pos here, since that is what is contained in WindowState
     630           0 :         Point aParentAbsPos( pParent->OutputToAbsoluteScreenPixel( Point(0,0) ) );
     631           0 :         Size aParentSizePixel( pParent->GetOutputSizePixel() );
     632           0 :         Point aPos( (aParentSizePixel.Width() - i_nWidth) / 2,
     633           0 :                     (aParentSizePixel.Height() - i_nHeight) / 2 );
     634           0 :         io_rX = aParentAbsPos.X() + aPos.X();
     635           0 :         io_rY = aParentAbsPos.Y() + aPos.Y();
     636             :     }
     637        6440 : }
     638             : 
     639        3220 : void SystemWindow::SetWindowStateData( const WindowStateData& rData )
     640             : {
     641        3220 :     sal_uLong nValidMask = rData.GetMask();
     642        3220 :     if ( !nValidMask )
     643           0 :         return;
     644             : 
     645        3220 :     if ( mbSysChild )
     646           0 :         return;
     647             : 
     648        3220 :     vcl::Window* pWindow = this;
     649        9660 :     while ( pWindow->mpWindowImpl->mpBorderWindow )
     650        3220 :         pWindow = pWindow->mpWindowImpl->mpBorderWindow;
     651             : 
     652        3220 :     if ( pWindow->mpWindowImpl->mbFrame )
     653             :     {
     654        3220 :         sal_uLong           nState      = rData.GetState();
     655             :         SalFrameState   aState;
     656        3220 :         aState.mnMask               = rData.GetMask();
     657        3220 :         aState.mnX                  = rData.GetX();
     658        3220 :         aState.mnY                  = rData.GetY();
     659        3220 :         aState.mnWidth              = rData.GetWidth();
     660        3220 :         aState.mnHeight             = rData.GetHeight();
     661             : 
     662        3220 :         if( rData.GetMask() & (WINDOWSTATE_MASK_WIDTH|WINDOWSTATE_MASK_HEIGHT) )
     663             :         {
     664             :             // #i43799# adjust window state sizes if a minimial output size was set
     665             :             // otherwise the frame and the client might get different sizes
     666        3101 :             if( maMinOutSize.Width() > aState.mnWidth )
     667           0 :                 aState.mnWidth = maMinOutSize.Width();
     668        3101 :             if( maMinOutSize.Height() > aState.mnHeight )
     669           0 :                 aState.mnHeight = maMinOutSize.Height();
     670             :         }
     671             : 
     672        3220 :         aState.mnMaximizedX         = rData.GetMaximizedX();
     673        3220 :         aState.mnMaximizedY         = rData.GetMaximizedY();
     674        3220 :         aState.mnMaximizedWidth     = rData.GetMaximizedWidth();
     675        3220 :         aState.mnMaximizedHeight    = rData.GetMaximizedHeight();
     676             :         // #94144# allow Minimize again, should be masked out when read from configuration
     677             :         // 91625 - ignore Minimize
     678             :         //nState &= ~(WINDOWSTATE_STATE_MINIMIZED);
     679        3220 :         aState.mnState  = nState & WINDOWSTATE_STATE_SYSTEMMASK;
     680             : 
     681             :         // normalize window positions onto screen
     682        3220 :         ImplMoveToScreen( aState.mnX, aState.mnY, aState.mnWidth, aState.mnHeight, pWindow );
     683        3220 :         ImplMoveToScreen( aState.mnMaximizedX, aState.mnMaximizedY, aState.mnMaximizedWidth, aState.mnMaximizedHeight, pWindow );
     684             : 
     685             :         // #96568# avoid having multiple frames at the same screen location
     686             :         //  do the check only if not maximized
     687        3220 :         if( !((rData.GetMask() & WINDOWSTATE_MASK_STATE) && (nState & WINDOWSTATE_STATE_MAXIMIZED)) )
     688        3101 :             if( rData.GetMask() & (WINDOWSTATE_MASK_POS|WINDOWSTATE_MASK_WIDTH|WINDOWSTATE_MASK_HEIGHT) )
     689             :             {
     690        3101 :                 Rectangle aDesktop = GetDesktopRectPixel();
     691        3101 :                 ImplSVData *pSVData = ImplGetSVData();
     692        3101 :                 vcl::Window *pWin = pSVData->maWinData.mpFirstFrame;
     693        3101 :                 bool bWrapped = false;
     694       13231 :                 while( pWin )
     695             :                 {
     696       21910 :                     if( !pWin->ImplIsRealParentPath( this ) && ( pWin != this ) &&
     697       14881 :                         pWin->ImplGetWindow()->IsTopWindow() && pWin->mpWindowImpl->mbReallyVisible )
     698             :                     {
     699         148 :                         SalFrameGeometry g = pWin->mpWindowImpl->mpFrame->GetGeometry();
     700         148 :                         if( std::abs(g.nX-aState.mnX) < 2 && std::abs(g.nY-aState.mnY) < 5 )
     701             :                         {
     702          60 :                             long displacement = g.nTopDecoration ? g.nTopDecoration : 20;
     703         120 :                             if( (unsigned long) (aState.mnX + displacement + aState.mnWidth + g.nRightDecoration) > (unsigned long) aDesktop.Right() ||
     704          60 :                                 (unsigned long) (aState.mnY + displacement + aState.mnHeight + g.nBottomDecoration) > (unsigned long) aDesktop.Bottom() )
     705             :                             {
     706             :                                 // displacing would leave screen
     707           0 :                                 aState.mnX = g.nLeftDecoration ? g.nLeftDecoration : 10; // should result in (0,0)
     708           0 :                                 aState.mnY = displacement;
     709           0 :                                 if( bWrapped ||
     710           0 :                                     (unsigned long) (aState.mnX + displacement + aState.mnWidth + g.nRightDecoration) > (unsigned long) aDesktop.Right() ||
     711           0 :                                     (unsigned long) (aState.mnY + displacement + aState.mnHeight + g.nBottomDecoration) > (unsigned long) aDesktop.Bottom() )
     712           0 :                                     break;  // further displacement not possible -> break
     713             :                                 // avoid endless testing
     714           0 :                                 bWrapped = true;
     715             :                             }
     716             :                             else
     717             :                             {
     718             :                                 // displace
     719          60 :                                 aState.mnX += displacement;
     720          60 :                                 aState.mnY += displacement;
     721             :                             }
     722          60 :                         pWin = pSVData->maWinData.mpFirstFrame; // check new pos again
     723             :                         }
     724             :                     }
     725        7029 :                     pWin = pWin->mpWindowImpl->mpFrameData->mpNextFrame;
     726             :                 }
     727             :             }
     728             : 
     729        3220 :         mpWindowImpl->mpFrame->SetWindowState( &aState );
     730             : 
     731             :         // do a synchronous resize for layout reasons
     732             :         //  but use rData only when the window is not to be maximized (#i38089#)
     733             :         //  otherwise we have no useful size information
     734        3220 :         if( (rData.GetMask() & WINDOWSTATE_MASK_STATE) && (nState & WINDOWSTATE_STATE_MAXIMIZED) )
     735             :         {
     736             :             // query maximized size from frame
     737         119 :             SalFrameGeometry aGeometry = mpWindowImpl->mpFrame->GetGeometry();
     738             : 
     739             :             // but use it only if it is different from the restore size (rData)
     740             :             // as currently only on windows the exact size of a maximized window
     741             :             //  can be computed without actually showing the window
     742         119 :             if( aGeometry.nWidth != rData.GetWidth() || aGeometry.nHeight != rData.GetHeight() )
     743         119 :                 ImplHandleResize( pWindow, aGeometry.nWidth, aGeometry.nHeight );
     744             :         }
     745             :         else
     746        3101 :             if( rData.GetMask() & (WINDOWSTATE_MASK_WIDTH|WINDOWSTATE_MASK_HEIGHT) )
     747        3101 :                 ImplHandleResize( pWindow, aState.mnWidth, aState.mnHeight );   // #i43799# use aState and not rData, see above
     748             :     }
     749             :     else
     750             :     {
     751           0 :         PosSizeFlags nPosSize = PosSizeFlags::NONE;
     752           0 :         if ( nValidMask & WINDOWSTATE_MASK_X )
     753           0 :             nPosSize |= PosSizeFlags::X;
     754           0 :         if ( nValidMask & WINDOWSTATE_MASK_Y )
     755           0 :             nPosSize |= PosSizeFlags::Y;
     756           0 :         if ( nValidMask & WINDOWSTATE_MASK_WIDTH )
     757           0 :             nPosSize |= PosSizeFlags::Width;
     758           0 :         if ( nValidMask & WINDOWSTATE_MASK_HEIGHT )
     759           0 :             nPosSize |= PosSizeFlags::Height;
     760             : 
     761           0 :         if( IsRollUp() )
     762           0 :             RollDown();
     763             : 
     764           0 :         long nX         = rData.GetX();
     765           0 :         long nY         = rData.GetY();
     766           0 :         long nWidth     = rData.GetWidth();
     767           0 :         long nHeight    = rData.GetHeight();
     768           0 :         const SalFrameGeometry& rGeom = pWindow->mpWindowImpl->mpFrame->GetGeometry();
     769           0 :         if( nX < 0 )
     770           0 :             nX = 0;
     771           0 :         if( nX + nWidth > (long) rGeom.nWidth )
     772           0 :             nX = rGeom.nWidth - nWidth;
     773           0 :         if( nY < 0 )
     774           0 :             nY = 0;
     775           0 :         if( nY + nHeight > (long) rGeom.nHeight )
     776           0 :             nY = rGeom.nHeight - nHeight;
     777           0 :         setPosSizePixel( nX, nY, nWidth, nHeight, nPosSize );
     778           0 :         maOrgSize = Size( nWidth, nHeight );
     779             : 
     780             :         // 91625 - ignore Minimize
     781           0 :         if ( nValidMask & WINDOWSTATE_MASK_STATE )
     782             :         {
     783           0 :             sal_uLong nState = rData.GetState();
     784           0 :             if ( nState & WINDOWSTATE_STATE_ROLLUP )
     785           0 :                 RollUp();
     786             :             else
     787           0 :                 RollDown();
     788             :         }
     789             :     }
     790             : }
     791             : 
     792        6455 : void SystemWindow::GetWindowStateData( WindowStateData& rData ) const
     793             : {
     794        6455 :     sal_uLong nValidMask = rData.GetMask();
     795        6455 :     if ( !nValidMask )
     796           0 :         return;
     797             : 
     798        6455 :     if ( mbSysChild )
     799           0 :         return;
     800             : 
     801        6455 :     const vcl::Window* pWindow = this;
     802       19365 :     while ( pWindow->mpWindowImpl->mpBorderWindow )
     803        6455 :         pWindow = pWindow->mpWindowImpl->mpBorderWindow;
     804             : 
     805        6455 :     if ( pWindow->mpWindowImpl->mbFrame )
     806             :     {
     807             :         SalFrameState aState;
     808        6455 :         aState.mnMask = 0xFFFFFFFF;
     809        6455 :         if ( mpWindowImpl->mpFrame->GetWindowState( &aState ) )
     810             :         {
     811        6455 :             if ( nValidMask & WINDOWSTATE_MASK_X )
     812        6455 :                 rData.SetX( aState.mnX );
     813        6455 :             if ( nValidMask & WINDOWSTATE_MASK_Y )
     814        6455 :                 rData.SetY( aState.mnY );
     815        6455 :             if ( nValidMask & WINDOWSTATE_MASK_WIDTH )
     816        6455 :                 rData.SetWidth( aState.mnWidth );
     817        6455 :             if ( nValidMask & WINDOWSTATE_MASK_HEIGHT )
     818        6455 :                 rData.SetHeight( aState.mnHeight );
     819        6455 :             if ( aState.mnMask & WINDOWSTATE_MASK_MAXIMIZED_X )
     820             :             {
     821           0 :                 rData.SetMaximizedX( aState.mnMaximizedX );
     822           0 :                 nValidMask |= WINDOWSTATE_MASK_MAXIMIZED_X;
     823             :             }
     824        6455 :             if ( aState.mnMask & WINDOWSTATE_MASK_MAXIMIZED_Y )
     825             :             {
     826           0 :                 rData.SetMaximizedY( aState.mnMaximizedY );
     827           0 :                 nValidMask |= WINDOWSTATE_MASK_MAXIMIZED_Y;
     828             :             }
     829        6455 :             if ( aState.mnMask & WINDOWSTATE_MASK_MAXIMIZED_WIDTH )
     830             :             {
     831           0 :                 rData.SetMaximizedWidth( aState.mnMaximizedWidth );
     832           0 :                 nValidMask |= WINDOWSTATE_MASK_MAXIMIZED_WIDTH;
     833             :             }
     834        6455 :             if ( aState.mnMask & WINDOWSTATE_MASK_MAXIMIZED_HEIGHT )
     835             :             {
     836           0 :                 rData.SetMaximizedHeight( aState.mnMaximizedHeight );
     837           0 :                 nValidMask |= WINDOWSTATE_MASK_MAXIMIZED_HEIGHT;
     838             :             }
     839        6455 :             if ( nValidMask & WINDOWSTATE_MASK_STATE )
     840             :             {
     841             :                 // #94144# allow Minimize again, should be masked out when read from configuration
     842             :                 // 91625 - ignore Minimize
     843        6455 :                 if ( !(nValidMask&WINDOWSTATE_MASK_MINIMIZED) )
     844        3264 :                     aState.mnState &= ~(WINDOWSTATE_STATE_MINIMIZED);
     845        6455 :                 rData.SetState( aState.mnState );
     846             :             }
     847        6455 :             rData.SetMask( nValidMask );
     848             :         }
     849             :         else
     850           0 :             rData.SetMask( 0 );
     851             :     }
     852             :     else
     853             :     {
     854           0 :         Point   aPos = GetPosPixel();
     855           0 :         Size    aSize = GetSizePixel();
     856           0 :         sal_uLong   nState = 0;
     857             : 
     858           0 :         if ( IsRollUp() )
     859             :         {
     860           0 :             aSize.Height() += maOrgSize.Height();
     861           0 :             nState |= WINDOWSTATE_STATE_ROLLUP;
     862             :         }
     863             : 
     864           0 :         if ( nValidMask & WINDOWSTATE_MASK_X )
     865           0 :             rData.SetX( aPos.X() );
     866           0 :         if ( nValidMask & WINDOWSTATE_MASK_Y )
     867           0 :             rData.SetY( aPos.Y() );
     868           0 :         if ( nValidMask & WINDOWSTATE_MASK_WIDTH )
     869           0 :             rData.SetWidth( aSize.Width() );
     870           0 :         if ( nValidMask & WINDOWSTATE_MASK_HEIGHT )
     871           0 :             rData.SetHeight( aSize.Height() );
     872           0 :         if ( nValidMask & WINDOWSTATE_MASK_STATE )
     873           0 :             rData.SetState( nState );
     874             :     }
     875             : }
     876             : 
     877        3220 : void SystemWindow::SetWindowState(const OString& rStr)
     878             : {
     879        3220 :     if (rStr.isEmpty())
     880        3220 :         return;
     881             : 
     882        3220 :     WindowStateData aData;
     883        3220 :     ImplWindowStateFromStr( aData, rStr );
     884        3220 :     SetWindowStateData( aData );
     885             : }
     886             : 
     887        6455 : OString SystemWindow::GetWindowState( sal_uLong nMask ) const
     888             : {
     889        6455 :     WindowStateData aData;
     890        6455 :     aData.SetMask( nMask );
     891        6455 :     GetWindowStateData( aData );
     892             : 
     893        6455 :     return ImplWindowStateToStr(aData);
     894             : }
     895             : 
     896       10569 : void SystemWindow::SetMenuBar(MenuBar* pMenuBar, const css::uno::Reference<css::frame::XFrame>& rFrame)
     897             : {
     898       10569 :     if ( mpMenuBar != pMenuBar )
     899             :     {
     900        6393 :         MenuBar* pOldMenuBar = mpMenuBar;
     901        6393 :         vcl::Window*  pOldWindow = NULL;
     902        6393 :         vcl::Window*  pNewWindow=NULL;
     903        6393 :         mpMenuBar = pMenuBar;
     904             : 
     905        6393 :         if ( mpWindowImpl->mpBorderWindow && (mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW) )
     906             :         {
     907        6393 :             if ( pOldMenuBar )
     908        3194 :                 pOldWindow = pOldMenuBar->ImplGetWindow();
     909             :             else
     910        3199 :                 pOldWindow = NULL;
     911        6393 :             if ( pOldWindow )
     912             :             {
     913        3194 :                 CallEventListeners( VCLEVENT_WINDOW_MENUBARREMOVED, static_cast<void*>(pOldMenuBar) );
     914        3194 :                 pOldWindow->SetAccessible( ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >() );
     915             :             }
     916        6393 :             if ( pMenuBar )
     917             :             {
     918             :                 DBG_ASSERT( !pMenuBar->pWindow, "SystemWindow::SetMenuBar() - MenuBars can only set in one SystemWindow at time" );
     919        3200 :                 static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetMenuBarWindow( pNewWindow = MenuBar::ImplCreate( mpWindowImpl->mpBorderWindow, pOldWindow, pMenuBar, rFrame));
     920        3200 :                 CallEventListeners( VCLEVENT_WINDOW_MENUBARADDED, static_cast<void*>(pMenuBar) );
     921             :             }
     922             :             else
     923        3193 :                 static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetMenuBarWindow( NULL );
     924        6393 :             ImplToBottomChild();
     925        6393 :             if ( pOldMenuBar )
     926             :             {
     927        3194 :                 bool bDelete = (pMenuBar == 0);
     928        3194 :                 if( bDelete && pOldWindow )
     929             :                 {
     930        3193 :                     if( mpImplData->mpTaskPaneList )
     931        3193 :                         mpImplData->mpTaskPaneList->RemoveWindow( pOldWindow );
     932             :                 }
     933        3194 :                 MenuBar::ImplDestroy( pOldMenuBar, bDelete );
     934        3194 :                 if( bDelete )
     935        3193 :                     pOldWindow = NULL;  // will be deleted in MenuBar::ImplDestroy,
     936             :             }
     937             : 
     938             :         }
     939             :         else
     940             :         {
     941           0 :             if( pMenuBar )
     942           0 :                 pNewWindow = pMenuBar->ImplGetWindow();
     943           0 :             if( pOldMenuBar )
     944           0 :                 pOldWindow = pOldMenuBar->ImplGetWindow();
     945             :         }
     946             : 
     947             :         // update taskpane list to make menubar accessible
     948        6393 :         if( mpImplData->mpTaskPaneList )
     949             :         {
     950        6272 :             if( pOldWindow )
     951           1 :                 mpImplData->mpTaskPaneList->RemoveWindow( pOldWindow );
     952        6272 :             if( pNewWindow )
     953        3079 :                 mpImplData->mpTaskPaneList->AddWindow( pNewWindow );
     954             :         }
     955             :     }
     956       10569 : }
     957             : 
     958           0 : void SystemWindow::SetMenuBarMode( MenuBarMode nMode )
     959             : {
     960           0 :     if ( mnMenuBarMode != nMode )
     961             :     {
     962           0 :         mnMenuBarMode = nMode;
     963           0 :         if ( mpWindowImpl->mpBorderWindow && (mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW) )
     964             :         {
     965           0 :             if ( nMode == MenuBarMode::Hide )
     966           0 :                 static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetMenuBarMode( true );
     967             :             else
     968           0 :                 static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetMenuBarMode( false );
     969             :         }
     970             :     }
     971           0 : }
     972             : 
     973       28880 : bool SystemWindow::ImplIsInTaskPaneList( vcl::Window* pWin )
     974             : {
     975       28880 :     if( mpImplData && mpImplData->mpTaskPaneList )
     976       21158 :         return mpImplData->mpTaskPaneList->IsInList( pWin );
     977        7722 :     return false;
     978             : }
     979             : 
     980           0 : unsigned int SystemWindow::GetScreenNumber() const
     981             : {
     982           0 :     return mpWindowImpl->mpFrame->maGeometry.nDisplayScreenNumber;
     983             : }
     984             : 
     985           0 : void SystemWindow::SetScreenNumber(unsigned int nDisplayScreen)
     986             : {
     987           0 :     mpWindowImpl->mpFrame->SetScreenNumber( nDisplayScreen );
     988           0 : }
     989             : 
     990        9908 : void SystemWindow::SetApplicationID(const OUString &rApplicationID)
     991             : {
     992        9908 :     mpWindowImpl->mpFrame->SetApplicationID( rApplicationID );
     993        9908 : }
     994             : 
     995          16 : void SystemWindow::SetCloseHdl(const Link<>& rLink)
     996             : {
     997          16 :     mpImplData->maCloseHdl = rLink;
     998          16 : }
     999             : 
    1000           2 : const Link<>& SystemWindow::GetCloseHdl() const
    1001             : {
    1002           2 :     return mpImplData->maCloseHdl;
    1003             : }
    1004             : 
    1005      401314 : void SystemWindow::queue_resize(StateChangedType /*eReason*/)
    1006             : {
    1007      401314 :     if (hasPendingLayout() || isCalculatingInitialLayoutSize())
    1008           5 :         return;
    1009      401309 :     if (!isLayoutEnabled())
    1010      401307 :         return;
    1011           2 :     InvalidateSizeCache();
    1012           2 :     maLayoutIdle.Start();
    1013             : }
    1014             : 
    1015       11084 : void SystemWindow::Resize()
    1016             : {
    1017       11084 :     queue_resize();
    1018       11084 : }
    1019             : 
    1020      401328 : bool SystemWindow::isLayoutEnabled() const
    1021             : {
    1022             :     //pre dtor called, and single child is a container => we're layout enabled
    1023      401328 :     return mpImplData && ::isLayoutEnabled(this);
    1024             : }
    1025             : 
    1026           1 : Size SystemWindow::GetOptimalSize() const
    1027             : {
    1028           1 :     if (!isLayoutEnabled())
    1029           0 :         return Window::GetOptimalSize();
    1030             : 
    1031           1 :     Size aSize = VclContainer::getLayoutRequisition(*GetWindow(GetWindowType::FirstChild));
    1032             : 
    1033           1 :     sal_Int32 nBorderWidth = get_border_width();
    1034             : 
    1035           2 :     aSize.Height() += mpWindowImpl->mnLeftBorder + mpWindowImpl->mnRightBorder
    1036           2 :         + 2*nBorderWidth;
    1037           2 :     aSize.Width() += mpWindowImpl->mnTopBorder + mpWindowImpl->mnBottomBorder
    1038           2 :         + 2*nBorderWidth;
    1039             : 
    1040           1 :     return Window::CalcWindowSize(aSize);
    1041             : }
    1042             : 
    1043           1 : void SystemWindow::setPosSizeOnContainee(Size aSize, Window &rBox)
    1044             : {
    1045           1 :     sal_Int32 nBorderWidth = get_border_width();
    1046             : 
    1047           1 :     aSize.Width() -= 2 * nBorderWidth;
    1048           1 :     aSize.Height() -= 2 * nBorderWidth;
    1049             : 
    1050           1 :     Point aPos(nBorderWidth, nBorderWidth);
    1051           1 :     VclContainer::setLayoutAllocation(rBox, aPos, aSize);
    1052           1 : }
    1053             : 
    1054           0 : IMPL_LINK_NOARG_TYPED( SystemWindow, ImplHandleLayoutTimerHdl, Idle*, void )
    1055             : {
    1056           0 :     if (!isLayoutEnabled())
    1057             :     {
    1058             :         SAL_WARN("vcl.layout", "SystemWindow has become non-layout because extra children have been added directly to it.");
    1059           0 :         return;
    1060             :     }
    1061             : 
    1062           0 :     Window *pBox = GetWindow(GetWindowType::FirstChild);
    1063             :     assert(pBox);
    1064           0 :     setPosSizeOnContainee(GetSizePixel(), *pBox);
    1065             : }
    1066             : 
    1067       10125 : void SystemWindow::SetText(const OUString& rStr)
    1068             : {
    1069       10125 :     setDeferredProperties();
    1070       10125 :     Window::SetText(rStr);
    1071       10125 : }
    1072             : 
    1073         257 : OUString SystemWindow::GetText() const
    1074             : {
    1075         257 :     const_cast<SystemWindow*>(this)->setDeferredProperties();
    1076         257 :     return Window::GetText();
    1077             : }
    1078             : 
    1079           0 : void SystemWindow::settingOptimalLayoutSize(Window* /*pBox*/)
    1080             : {
    1081           0 : }
    1082             : 
    1083           1 : void SystemWindow::setOptimalLayoutSize()
    1084             : {
    1085           1 :     maLayoutIdle.Stop();
    1086             : 
    1087             :     //resize SystemWindow to fit requisition on initial show
    1088           1 :     Window *pBox = GetWindow(GetWindowType::FirstChild);
    1089             : 
    1090           1 :     settingOptimalLayoutSize(pBox);
    1091             : 
    1092           1 :     Size aSize = get_preferred_size();
    1093             : 
    1094           1 :     Size aMax(bestmaxFrameSizeForScreenSize(GetDesktopRectPixel().GetSize()));
    1095             : 
    1096           1 :     aSize.Width() = std::min(aMax.Width(), aSize.Width());
    1097           1 :     aSize.Height() = std::min(aMax.Height(), aSize.Height());
    1098             : 
    1099           1 :     SetMinOutputSizePixel(aSize);
    1100           1 :     SetSizePixel(aSize);
    1101           1 :     setPosSizeOnContainee(aSize, *pBox);
    1102           1 : }
    1103             : 
    1104          17 : void SystemWindow::DoInitialLayout()
    1105             : {
    1106          17 :     if ( GetSettings().GetStyleSettings().GetAutoMnemonic() )
    1107          17 :        ImplWindowAutoMnemonic( this );
    1108             : 
    1109          17 :     if (isLayoutEnabled())
    1110             :     {
    1111           1 :         mbIsCalculatingInitialLayoutSize = true;
    1112           1 :         setDeferredProperties();
    1113           1 :         setOptimalLayoutSize();
    1114           1 :         mbIsCalculatingInitialLayoutSize = false;
    1115           1 :         mbInitialLayoutDone = true;
    1116             :     }
    1117          17 : }
    1118             : 
    1119           0 : void SystemWindow::doDeferredInit(WinBits /*nBits*/)
    1120             : {
    1121             :     SAL_WARN("vcl.layout", "SystemWindow in layout without doDeferredInit impl");
    1122         801 : }
    1123             : 
    1124             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11