LCOV - code coverage report
Current view: top level - vcl/source/window - dialog.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 233 587 39.7 %
Date: 2015-06-13 12:38:46 Functions: 30 60 50.0 %
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 <config_features.h>
      21             : 
      22             : #include <com/sun/star/beans/XPropertySet.hpp>
      23             : #include <com/sun/star/util/thePathSettings.hpp>
      24             : #include <comphelper/processfactory.hxx>
      25             : #include <osl/file.hxx>
      26             : 
      27             : #include <tools/debug.hxx>
      28             : 
      29             : #include <tools/rc.h>
      30             : #include <svdata.hxx>
      31             : #include <window.h>
      32             : #include <brdwin.hxx>
      33             : 
      34             : #include <rtl/strbuf.hxx>
      35             : #include <sal/log.hxx>
      36             : 
      37             : #include <vcl/builder.hxx>
      38             : #include <vcl/layout.hxx>
      39             : #include <vcl/svapp.hxx>
      40             : #include <vcl/event.hxx>
      41             : #include <vcl/wrkwin.hxx>
      42             : #include <vcl/button.hxx>
      43             : #include <vcl/mnemonic.hxx>
      44             : #include <vcl/dialog.hxx>
      45             : #include <vcl/decoview.hxx>
      46             : #include <vcl/msgbox.hxx>
      47             : #include <vcl/unowrap.hxx>
      48             : #include <vcl/settings.hxx>
      49             : 
      50             : #include <iostream>
      51             : 
      52           0 : static OString ImplGetDialogText( Dialog* pDialog )
      53             : {
      54             :     OStringBuffer aErrorStr(OUStringToOString(
      55           0 :         pDialog->GetText(), RTL_TEXTENCODING_UTF8));
      56             : 
      57           0 :     OUString sMessage;
      58           0 :     if (MessBox* pMessBox = dynamic_cast<MessBox*>(pDialog))
      59             :     {
      60           0 :         sMessage = pMessBox->GetMessText();
      61             :     }
      62           0 :     else if (MessageDialog* pMessDialog = dynamic_cast<MessageDialog*>(pDialog))
      63             :     {
      64           0 :         sMessage = pMessDialog->get_primary_text();
      65             :     }
      66             : 
      67           0 :     if (!sMessage.isEmpty())
      68             :     {
      69           0 :         aErrorStr.append(", ");
      70             :         aErrorStr.append(OUStringToOString(
      71           0 :             sMessage, RTL_TEXTENCODING_UTF8));
      72             :     }
      73           0 :     return aErrorStr.makeStringAndClear();
      74             : }
      75             : 
      76       15669 : static bool ImplIsMnemonicCtrl( vcl::Window* pWindow )
      77             : {
      78       15669 :     if( ! pWindow->GetSettings().GetStyleSettings().GetAutoMnemonic() )
      79           0 :         return false;
      80             : 
      81       47007 :     if ( (pWindow->GetType() == WINDOW_RADIOBUTTON) ||
      82       31338 :          (pWindow->GetType() == WINDOW_CHECKBOX) ||
      83       47007 :          (pWindow->GetType() == WINDOW_TRISTATEBOX) ||
      84       15669 :          (pWindow->GetType() == WINDOW_PUSHBUTTON) )
      85           0 :         return true;
      86             : 
      87       15669 :     if ( pWindow->GetType() == WINDOW_FIXEDTEXT )
      88             :     {
      89           4 :         FixedText *pText = static_cast<FixedText*>(pWindow);
      90           4 :         if (pText->get_mnemonic_widget())
      91           0 :             return true;
      92             :         //This is the legacy pre-layout logic which we retain
      93             :         //until we can be sure we can remove it
      94           4 :         if ( pWindow->GetStyle() & (WB_INFO | WB_NOLABEL) )
      95           0 :             return false;
      96           4 :         vcl::Window* pNextWindow = pWindow->GetWindow( GetWindowType::Next );
      97           4 :         if ( !pNextWindow )
      98           2 :             return false;
      99           2 :         pNextWindow = pNextWindow->GetWindow( GetWindowType::Client );
     100           5 :         if ( !(pNextWindow->GetStyle() & WB_TABSTOP) ||
     101           2 :              (pNextWindow->GetType() == WINDOW_FIXEDTEXT) ||
     102           2 :              (pNextWindow->GetType() == WINDOW_GROUPBOX) ||
     103           2 :              (pNextWindow->GetType() == WINDOW_RADIOBUTTON) ||
     104           2 :              (pNextWindow->GetType() == WINDOW_CHECKBOX) ||
     105           4 :              (pNextWindow->GetType() == WINDOW_TRISTATEBOX) ||
     106           1 :              (pNextWindow->GetType() == WINDOW_PUSHBUTTON) )
     107           1 :             return false;
     108             : 
     109           1 :         return true;
     110             :     }
     111             : 
     112       15665 :     return false;
     113             : }
     114             : 
     115             : // Called by native error dialog popup implementations
     116           0 : void ImplHideSplash()
     117             : {
     118           0 :     ImplSVData* pSVData = ImplGetSVData();
     119           0 :     if( pSVData->mpIntroWindow )
     120           0 :             pSVData->mpIntroWindow->Hide();
     121           0 : }
     122             : 
     123             : //Get next window after pChild of a pTopLevel window as
     124             : //if any intermediate layout widgets didn't exist
     125      121040 : vcl::Window * nextLogicalChildOfParent(vcl::Window *pTopLevel, vcl::Window *pChild)
     126             : {
     127      121040 :     vcl::Window *pLastChild = pChild;
     128             : 
     129      121040 :     if (isContainerWindow(*pChild))
     130         764 :         pChild = pChild->GetWindow(GetWindowType::FirstChild);
     131             :     else
     132      120276 :         pChild = pChild->GetWindow(GetWindowType::Next);
     133             : 
     134      244368 :     while (!pChild)
     135             :     {
     136       38062 :         vcl::Window *pParent = pLastChild->GetParent();
     137       38062 :         if (!pParent)
     138         150 :             return NULL;
     139       37912 :         if (pParent == pTopLevel)
     140       35624 :             return NULL;
     141        2288 :         pLastChild = pParent;
     142        2288 :         pChild = pParent->GetWindow(GetWindowType::Next);
     143             :     }
     144             : 
     145       85266 :     if (pChild && isContainerWindow(*pChild))
     146         552 :         pChild = nextLogicalChildOfParent(pTopLevel, pChild);
     147             : 
     148       85266 :     return pChild;
     149             : }
     150             : 
     151           0 : vcl::Window * prevLogicalChildOfParent(vcl::Window *pTopLevel, vcl::Window *pChild)
     152             : {
     153           0 :     vcl::Window *pLastChild = pChild;
     154             : 
     155           0 :     if (isContainerWindow(*pChild))
     156           0 :         pChild = pChild->GetWindow(GetWindowType::LastChild);
     157             :     else
     158           0 :         pChild = pChild->GetWindow(GetWindowType::Prev);
     159             : 
     160           0 :     while (!pChild)
     161             :     {
     162           0 :         vcl::Window *pParent = pLastChild->GetParent();
     163           0 :         if (!pParent)
     164           0 :             return NULL;
     165           0 :         if (pParent == pTopLevel)
     166           0 :             return NULL;
     167           0 :         pLastChild = pParent;
     168           0 :         pChild = pParent->GetWindow(GetWindowType::Prev);
     169             :     }
     170             : 
     171           0 :     if (pChild && isContainerWindow(*pChild))
     172           0 :         pChild = prevLogicalChildOfParent(pTopLevel, pChild);
     173             : 
     174           0 :     return pChild;
     175             : }
     176             : 
     177             : //Get first window of a pTopLevel window as
     178             : //if any intermediate layout widgets didn't exist
     179       66749 : vcl::Window * firstLogicalChildOfParent(vcl::Window *pTopLevel)
     180             : {
     181       66749 :     vcl::Window *pChild = pTopLevel->GetWindow(GetWindowType::FirstChild);
     182       66749 :     if (pChild && isContainerWindow(*pChild))
     183         142 :         pChild = nextLogicalChildOfParent(pTopLevel, pChild);
     184       66749 :     return pChild;
     185             : }
     186             : 
     187       28914 : void ImplWindowAutoMnemonic( vcl::Window* pWindow )
     188             : {
     189       28914 :     MnemonicGenerator   aMnemonicGenerator;
     190             :     vcl::Window*                 pGetChild;
     191             :     vcl::Window*                 pChild;
     192             : 
     193             :     // register the assigned mnemonics
     194       28914 :     pGetChild = pWindow->GetWindow( GetWindowType::FirstChild );
     195       73497 :     while ( pGetChild )
     196             :     {
     197       15669 :         pChild = pGetChild->ImplGetWindow();
     198       15669 :         aMnemonicGenerator.RegisterMnemonic( pChild->GetText() );
     199       15669 :         pGetChild = nextLogicalChildOfParent(pWindow, pGetChild);
     200             :     }
     201             : 
     202             :     // take the Controls of the dialog into account for TabPages
     203       28914 :     if ( pWindow->GetType() == WINDOW_TABPAGE )
     204             :     {
     205           0 :         vcl::Window* pParent = pWindow->GetParent();
     206           0 :         if ( pParent->GetType() == WINDOW_TABCONTROL )
     207           0 :             pParent = pParent->GetParent();
     208             : 
     209           0 :         if ( (pParent->GetStyle() & (WB_DIALOGCONTROL | WB_NODIALOGCONTROL)) == WB_DIALOGCONTROL )
     210             :         {
     211           0 :             pGetChild = pParent->GetWindow( GetWindowType::FirstChild );
     212           0 :             while ( pGetChild )
     213             :             {
     214           0 :                 pChild = pGetChild->ImplGetWindow();
     215           0 :                 aMnemonicGenerator.RegisterMnemonic( pChild->GetText() );
     216           0 :                 pGetChild = nextLogicalChildOfParent(pWindow, pGetChild);
     217             :             }
     218             :         }
     219             :     }
     220             : 
     221             :     // assign mnemonics to Controls which have none
     222       28914 :     pGetChild = pWindow->GetWindow( GetWindowType::FirstChild );
     223       73497 :     while ( pGetChild )
     224             :     {
     225       15669 :         pChild = pGetChild->ImplGetWindow();
     226       15669 :         if ( ImplIsMnemonicCtrl( pChild ) )
     227             :         {
     228           1 :             OUString aText = pChild->GetText();
     229           2 :             OUString aNewText = aMnemonicGenerator.CreateMnemonic( aText );
     230           1 :             if ( aText != aNewText )
     231           2 :                 pChild->SetText( aNewText );
     232             :         }
     233             : 
     234       15669 :         pGetChild = nextLogicalChildOfParent(pWindow, pGetChild);
     235       28914 :     }
     236       28914 : }
     237             : 
     238           1 : static VclButtonBox* getActionArea(Dialog *pDialog)
     239             : {
     240           1 :     VclButtonBox *pButtonBox = NULL;
     241           1 :     if (pDialog->isLayoutEnabled())
     242             :     {
     243           1 :         vcl::Window *pBox = pDialog->GetWindow(GetWindowType::FirstChild);
     244           1 :         vcl::Window *pChild = pBox->GetWindow(GetWindowType::LastChild);
     245           2 :         while (pChild)
     246             :         {
     247           1 :             pButtonBox = dynamic_cast<VclButtonBox*>(pChild);
     248           1 :             if (pButtonBox)
     249           1 :                 break;
     250           0 :             pChild = pChild->GetWindow(GetWindowType::Prev);
     251             :         }
     252             :     }
     253           1 :     return pButtonBox;
     254             : }
     255             : 
     256           0 : static vcl::Window* getActionAreaButtonList(Dialog *pDialog)
     257             : {
     258           0 :     VclButtonBox* pButtonBox = getActionArea(pDialog);
     259           0 :     if (pButtonBox)
     260           0 :         return pButtonBox->GetWindow(GetWindowType::FirstChild);
     261           0 :     return pDialog->GetWindow(GetWindowType::FirstChild);
     262             : }
     263             : 
     264           0 : static PushButton* ImplGetDefaultButton( Dialog* pDialog )
     265             : {
     266           0 :     vcl::Window* pChild = getActionAreaButtonList(pDialog);
     267           0 :     while ( pChild )
     268             :     {
     269           0 :         if ( pChild->ImplIsPushButton() )
     270             :         {
     271           0 :             PushButton* pPushButton = static_cast<PushButton*>(pChild);
     272           0 :             if ( pPushButton->ImplIsDefButton() )
     273           0 :                 return pPushButton;
     274             :         }
     275             : 
     276           0 :         pChild = pChild->GetWindow( GetWindowType::Next );
     277             :     }
     278             : 
     279           0 :     return NULL;
     280             : }
     281             : 
     282           0 : static PushButton* ImplGetOKButton( Dialog* pDialog )
     283             : {
     284           0 :     vcl::Window* pChild = getActionAreaButtonList(pDialog);
     285           0 :     while ( pChild )
     286             :     {
     287           0 :         if ( pChild->GetType() == WINDOW_OKBUTTON )
     288           0 :             return static_cast<PushButton*>(pChild);
     289             : 
     290           0 :         pChild = pChild->GetWindow( GetWindowType::Next );
     291             :     }
     292             : 
     293           0 :     return NULL;
     294             : }
     295             : 
     296           0 : static PushButton* ImplGetCancelButton( Dialog* pDialog )
     297             : {
     298           0 :     vcl::Window* pChild = getActionAreaButtonList(pDialog);
     299             : 
     300           0 :     while ( pChild )
     301             :     {
     302           0 :         if ( pChild->GetType() == WINDOW_CANCELBUTTON )
     303           0 :             return static_cast<PushButton*>(pChild);
     304             : 
     305           0 :         pChild = pChild->GetWindow( GetWindowType::Next );
     306             :     }
     307             : 
     308           0 :     return NULL;
     309             : }
     310             : 
     311           5 : static void ImplMouseAutoPos( Dialog* pDialog )
     312             : {
     313           5 :     MouseSettingsOptions nMouseOptions = pDialog->GetSettings().GetMouseSettings().GetOptions();
     314           5 :     if ( nMouseOptions & MouseSettingsOptions::AutoCenterPos )
     315             :     {
     316           0 :         Size aSize = pDialog->GetOutputSizePixel();
     317           0 :         pDialog->SetPointerPosPixel( Point( aSize.Width()/2, aSize.Height()/2 ) );
     318             :     }
     319           5 :     else if ( nMouseOptions & MouseSettingsOptions::AutoDefBtnPos )
     320             :     {
     321           0 :         vcl::Window* pWindow = ImplGetDefaultButton( pDialog );
     322           0 :         if ( !pWindow )
     323           0 :             pWindow = ImplGetOKButton( pDialog );
     324           0 :         if ( !pWindow )
     325           0 :             pWindow = ImplGetCancelButton( pDialog );
     326           0 :         if ( !pWindow )
     327           0 :             pWindow = pDialog;
     328           0 :         Size aSize = pWindow->GetOutputSizePixel();
     329           0 :         pWindow->SetPointerPosPixel( Point( aSize.Width()/2, aSize.Height()/2 ) );
     330             :     }
     331           5 : }
     332             : 
     333             : struct DialogImpl
     334             : {
     335             :     long    mnResult;
     336             :     bool    mbStartedModal;
     337             :     Link<>  maEndDialogHdl;
     338             : 
     339          12 :     DialogImpl() : mnResult( -1 ), mbStartedModal( false ) {}
     340             : };
     341             : 
     342          12 : void Dialog::ImplInitDialogData()
     343             : {
     344          12 :     mpWindowImpl->mbDialog  = true;
     345          12 :     mpPrevExecuteDlg        = NULL;
     346          12 :     mbInExecute             = false;
     347          12 :     mbOldSaveBack           = false;
     348          12 :     mbInClose               = false;
     349          12 :     mbModalMode             = false;
     350          12 :     mpContentArea.clear();
     351          12 :     mpActionArea.clear();
     352          12 :     mnMousePositioned       = 0;
     353          12 :     mpDialogImpl            = new DialogImpl;
     354          12 : }
     355             : 
     356           9 : void Dialog::ImplInit( vcl::Window* pParent, WinBits nStyle, InitFlag eFlag )
     357             : {
     358           9 :     SystemWindowFlags nSysWinMode = Application::GetSystemWindowMode();
     359             : 
     360           9 :     if ( !(nStyle & WB_NODIALOGCONTROL) )
     361           9 :         nStyle |= WB_DIALOGCONTROL;
     362           9 :     nStyle |= WB_ROLLABLE;
     363             : 
     364             :     // Now, all Dialogs are per default system windows !!!
     365           9 :     nStyle |= WB_SYSTEMWINDOW;
     366             : 
     367           9 :     if (eFlag == InitFlag::NoParent)
     368           3 :         pParent = NULL;
     369           6 :     else if (!pParent) // parent is NULL: get the default Dialog parent
     370             :     {
     371           2 :         pParent = Application::GetDefDialogParent();
     372           2 :         if ( !pParent && !(nStyle & WB_SYSTEMWINDOW) )
     373           0 :             pParent = ImplGetSVData()->maWinData.mpAppWin;
     374             : 
     375             :         // If Parent is disabled, then we search for a modal dialog
     376             :         // in this frame
     377           2 :         if ( pParent && (!pParent->IsInputEnabled() || pParent->IsInModalMode()) )
     378             :         {
     379           0 :             ImplSVData* pSVData = ImplGetSVData();
     380           0 :             Dialog*     pExeDlg = pSVData->maWinData.mpLastExecuteDlg;
     381           0 :             while ( pExeDlg )
     382             :             {
     383             :                 // only if visible and enabled
     384           0 :                 if ( pParent->ImplGetFirstOverlapWindow()->IsWindowOrChild( pExeDlg, true ) &&
     385           0 :                      pExeDlg->IsReallyVisible() &&
     386           0 :                      pExeDlg->IsEnabled() && pExeDlg->IsInputEnabled() && !pExeDlg->IsInModalMode() )
     387             :                 {
     388           0 :                     pParent = pExeDlg;
     389           0 :                     break;
     390             :                 }
     391             : 
     392           0 :                 pExeDlg = pExeDlg->mpPrevExecuteDlg;
     393             :             }
     394             :         }
     395             :     }
     396             : 
     397          40 :     if ( !pParent || (nStyle & WB_SYSTEMWINDOW) ||
     398          27 :          (pParent->mpWindowImpl->mpFrameData->mbNeedSysWindow && !(nSysWinMode & SystemWindowFlags::NOAUTOMODE)) ||
     399           9 :          (nSysWinMode & SystemWindowFlags::DIALOG) )
     400             :     {
     401             :         // create window with a small border ?
     402           9 :         if ( (nStyle & (WB_BORDER | WB_NOBORDER | WB_MOVEABLE | WB_SIZEABLE | WB_CLOSEABLE)) == WB_BORDER )
     403             :         {
     404           0 :             VclPtrInstance<ImplBorderWindow> pBorderWin( pParent, nStyle, BORDERWINDOW_STYLE_FRAME );
     405           0 :             SystemWindow::ImplInit( pBorderWin, nStyle & ~WB_BORDER, NULL );
     406           0 :             pBorderWin->mpWindowImpl->mpClientWindow = this;
     407           0 :             pBorderWin->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder );
     408           0 :             mpWindowImpl->mpBorderWindow  = pBorderWin;
     409           0 :             mpWindowImpl->mpRealParent    = pParent;
     410             :         }
     411             :         else
     412             :         {
     413           9 :             mpWindowImpl->mbFrame         = true;
     414           9 :             mpWindowImpl->mbOverlapWin    = true;
     415           9 :             SystemWindow::ImplInit( pParent, (nStyle & (WB_MOVEABLE | WB_SIZEABLE | WB_ROLLABLE | WB_CLOSEABLE | WB_STANDALONE)) | WB_CLOSEABLE, NULL );
     416             :             // Now set all style bits
     417           9 :             mpWindowImpl->mnStyle = nStyle;
     418             :         }
     419             :     }
     420             :     else
     421             :     {
     422           0 :         VclPtrInstance<ImplBorderWindow> pBorderWin( pParent, nStyle, BORDERWINDOW_STYLE_OVERLAP | BORDERWINDOW_STYLE_BORDER );
     423           0 :         SystemWindow::ImplInit( pBorderWin, nStyle & ~WB_BORDER, NULL );
     424           0 :         pBorderWin->mpWindowImpl->mpClientWindow = this;
     425           0 :         pBorderWin->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder );
     426           0 :         mpWindowImpl->mpBorderWindow  = pBorderWin;
     427           0 :         mpWindowImpl->mpRealParent    = pParent;
     428             :     }
     429             : 
     430           9 :     SetActivateMode( ActivateModeFlags::GrabFocus );
     431             : 
     432           9 :     ImplInitSettings();
     433           9 : }
     434             : 
     435           7 : void Dialog::ApplySettings(vcl::RenderContext& rRenderContext)
     436             : {
     437           7 :     if (IsControlBackground())
     438             :     {
     439             :         // user override
     440           6 :         SetBackground(GetControlBackground());
     441             :     }
     442           1 :     else if (rRenderContext.IsNativeControlSupported(CTRL_WINDOW_BACKGROUND, PART_BACKGROUND_DIALOG))
     443             :     {
     444             :         // NWF background
     445           0 :         mpWindowImpl->mnNativeBackground = PART_BACKGROUND_DIALOG;
     446           0 :         EnableChildTransparentMode(true);
     447             :     }
     448             :     else
     449             :     {
     450             :         // fallback to settings color
     451           1 :         rRenderContext.SetBackground(GetSettings().GetStyleSettings().GetDialogColor());
     452             :     }
     453           7 : }
     454             : 
     455          13 : void Dialog::ImplInitSettings()
     456             : {
     457             :     // user override
     458          13 :     if (IsControlBackground())
     459           4 :         SetBackground(GetControlBackground());
     460             :     // NWF background
     461           9 :     else if( IsNativeControlSupported(CTRL_WINDOW_BACKGROUND, PART_BACKGROUND_DIALOG))
     462             :     {
     463           0 :         mpWindowImpl->mnNativeBackground = PART_BACKGROUND_DIALOG;
     464           0 :         EnableChildTransparentMode( true );
     465             :     }
     466             :     // fallback to settings color
     467             :     else
     468           9 :         SetBackground(GetSettings().GetStyleSettings().GetDialogColor());
     469          13 : }
     470             : 
     471           1 : Dialog::Dialog( WindowType nType )
     472             :     : SystemWindow( nType )
     473           1 :     , mnInitFlag(InitFlag::Default)
     474             : {
     475           1 :     ImplInitDialogData();
     476           1 : }
     477             : 
     478       75157 : void VclBuilderContainer::disposeBuilder()
     479             : {
     480       75157 :     if (m_pUIBuilder)
     481        1638 :         m_pUIBuilder->disposeBuilder();
     482       75157 : }
     483             : 
     484        1761 : OUString VclBuilderContainer::getUIRootDir()
     485             : {
     486             :     /*to-do, check if user config has an override before using shared one, etc*/
     487             :     css::uno::Reference< css::util::XPathSettings > xPathSettings = css::util::thePathSettings::get(
     488        1761 :         ::comphelper::getProcessComponentContext() );
     489             : 
     490        1761 :     OUString sShareLayer = xPathSettings->getBasePathShareLayer();
     491             : 
     492             :     // "UIConfig" is a "multi path" ... use first part only here!
     493        1761 :     sal_Int32 nPos = sShareLayer.indexOf(';');
     494        1761 :     if (nPos > 0)
     495         123 :         sShareLayer = sShareLayer.copy(0, nPos);
     496             : 
     497             :     // Note: May be an user uses URLs without a final slash! Check it ...
     498        1761 :     if (!sShareLayer.endsWith("/"))
     499        1761 :         sShareLayer += "/";
     500             : 
     501        1761 :     sShareLayer += "soffice.cfg/";
     502             :     /*to-do, can we merge all this foo with existing soffice.cfg finding code, etc*/
     503        1761 :     return sShareLayer;
     504             : }
     505             : 
     506             : //we can't change sizeable after the fact, so need to defer until we know and then
     507             : //do the init. Find the real parent stashed in mpDialogParent.
     508           0 : void Dialog::doDeferredInit(WinBits nBits)
     509             : {
     510           0 :     VclPtr<vcl::Window> pParent = mpDialogParent;
     511           0 :     mpDialogParent = NULL;
     512           0 :     ImplInit(pParent, nBits, mnInitFlag);
     513           0 :     mbIsDefferedInit = false;
     514           0 : }
     515             : 
     516           0 : Dialog::Dialog(vcl::Window* pParent, const OUString& rID, const OUString& rUIXMLDescription)
     517             :     : SystemWindow(WINDOW_DIALOG)
     518           0 :     , mnInitFlag(InitFlag::Default)
     519             : {
     520           0 :     ImplInitDialogData();
     521           0 :     loadUI(pParent, OUStringToOString(rID, RTL_TEXTENCODING_UTF8), rUIXMLDescription);
     522           0 : }
     523             : 
     524           3 : Dialog::Dialog(vcl::Window* pParent, const OUString& rID, const OUString& rUIXMLDescription, WindowType nType, InitFlag eFlag)
     525             :     : SystemWindow(nType)
     526           6 :     , mnInitFlag(eFlag)
     527             : {
     528           3 :     ImplInitDialogData();
     529           6 :     loadUI(pParent, OUStringToOString(rID, RTL_TEXTENCODING_UTF8), rUIXMLDescription);
     530           0 : }
     531             : 
     532           8 : Dialog::Dialog(vcl::Window* pParent, WinBits nStyle, InitFlag eFlag)
     533             :     : SystemWindow(WINDOW_DIALOG)
     534           8 :     , mnInitFlag(eFlag)
     535             : {
     536           8 :     ImplInitDialogData();
     537           8 :     ImplInit( pParent, nStyle, eFlag );
     538           8 : }
     539             : 
     540           0 : void Dialog::set_action_area(VclButtonBox* pBox)
     541             : {
     542           0 :     mpActionArea.set(pBox);
     543           0 : }
     544             : 
     545           0 : void Dialog::set_content_area(VclBox* pBox)
     546             : {
     547           0 :     mpContentArea.set(pBox);
     548           0 : }
     549             : 
     550           1 : void Dialog::settingOptimalLayoutSize(Window *pBox)
     551             : {
     552             :     const DialogStyle& rDialogStyle =
     553           1 :         GetSettings().GetStyleSettings().GetDialogStyle();
     554           1 :     VclBox * pBox2 = static_cast<VclBox*>(pBox);
     555           1 :     pBox2->set_border_width(rDialogStyle.content_area_border);
     556           1 :     pBox2->set_spacing(pBox2->get_spacing() +
     557           1 :         rDialogStyle.content_area_spacing);
     558             : 
     559           1 :     VclButtonBox *pActionArea = getActionArea(this);
     560           1 :     if (pActionArea)
     561             :     {
     562           1 :         pActionArea->set_border_width(rDialogStyle.action_area_border);
     563           1 :         pActionArea->set_spacing(rDialogStyle.button_spacing);
     564             :     }
     565           1 : }
     566             : 
     567          18 : Dialog::~Dialog()
     568             : {
     569           9 :     disposeOnce();
     570           9 : }
     571             : 
     572           9 : void Dialog::dispose()
     573             : {
     574           9 :     delete mpDialogImpl;
     575           9 :     mpDialogImpl = NULL;
     576           9 :     mpPrevExecuteDlg.clear();
     577           9 :     mpActionArea.clear();
     578           9 :     mpContentArea.clear();
     579           9 :     SystemWindow::dispose();
     580           9 : }
     581             : 
     582           0 : IMPL_LINK_NOARG(Dialog, ImplAsyncCloseHdl)
     583             : {
     584           0 :     Close();
     585           0 :     return 0;
     586             : }
     587             : 
     588          79 : bool Dialog::Notify( NotifyEvent& rNEvt )
     589             : {
     590             :     // first call the base class due to Tab control
     591          79 :     bool nRet = SystemWindow::Notify( rNEvt );
     592          79 :     if ( !nRet )
     593             :     {
     594          79 :         if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
     595             :         {
     596           0 :             const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
     597           0 :             vcl::KeyCode    aKeyCode = pKEvt->GetKeyCode();
     598           0 :             sal_uInt16      nKeyCode = aKeyCode.GetCode();
     599             : 
     600           0 :             if ( (nKeyCode == KEY_ESCAPE) &&
     601           0 :                  ((GetStyle() & WB_CLOSEABLE) || ImplGetCancelButton( this ) || ImplGetOKButton( this )) )
     602             :             {
     603             :                 // #i89505# for the benefit of slightly mentally challenged implementations
     604             :                 // like e.g. SfxModelessDialog which destroy themselves inside Close()
     605             :                 // post this Close asynchronous so we can leave our key handler before
     606             :                 // we get destroyed
     607           0 :                 PostUserEvent( LINK( this, Dialog, ImplAsyncCloseHdl ), this, true);
     608           0 :                 return true;
     609             :             }
     610             :         }
     611          79 :         else if ( rNEvt.GetType() == MouseNotifyEvent::GETFOCUS )
     612             :         {
     613             :             // make sure the dialog is still modal
     614             :             // changing focus between application frames may
     615             :             // have re-enabled input for our parent
     616           3 :             if( mbInExecute && mbModalMode )
     617             :             {
     618             :                 // do not change modal counter (pSVData->maAppData.mnModalDialog)
     619           0 :                 SetModalInputMode( false );
     620           0 :                 SetModalInputMode( true );
     621             : 
     622             :                 // #93022# def-button might have changed after show
     623           0 :                 if( !mnMousePositioned )
     624             :                 {
     625           0 :                     mnMousePositioned = 1;
     626           0 :                     ImplMouseAutoPos( this );
     627             :                 }
     628             : 
     629             :             }
     630             :         }
     631             :     }
     632             : 
     633          79 :     return nRet;
     634             : }
     635             : 
     636             : //What we really want here is something that gives the available width and
     637             : //height of a users screen, taking away the space taken up the OS
     638             : //taskbar, menus, etc.
     639          51 : Size bestmaxFrameSizeForScreenSize(const Size &rScreenSize)
     640             : {
     641          51 :     long w = rScreenSize.Width();
     642          51 :     if (w <= 800)
     643           0 :         w -= 15;
     644          51 :     else if (w <= 1024)
     645          35 :         w -= 65;
     646             :     else
     647          16 :         w -= 115;
     648             : 
     649          51 :     long h = rScreenSize.Height();
     650          51 :     if (h <= 768)
     651          35 :         h -= 50;
     652             :     else
     653          16 :         h -= 100;
     654             : 
     655          51 :     return Size(w, h);
     656             : }
     657             : 
     658          17 : void Dialog::StateChanged( StateChangedType nType )
     659             : {
     660          17 :     if (nType == StateChangedType::InitShow)
     661             :     {
     662           5 :         DoInitialLayout();
     663             : 
     664           5 :         if ( !HasChildPathFocus() || HasFocus() )
     665           5 :             GrabFocusToFirstControl();
     666           5 :         if ( !(GetStyle() & WB_CLOSEABLE) )
     667             :         {
     668           0 :             if ( ImplGetCancelButton( this ) || ImplGetOKButton( this ) )
     669             :             {
     670           0 :                 if ( ImplGetBorderWindow() )
     671           0 :                     static_cast<ImplBorderWindow*>(ImplGetBorderWindow())->SetCloseButton();
     672             :             }
     673             :         }
     674             : 
     675           5 :         ImplMouseAutoPos( this );
     676             :     }
     677             : 
     678          17 :     SystemWindow::StateChanged( nType );
     679             : 
     680          17 :     if (nType == StateChangedType::ControlBackground)
     681             :     {
     682           4 :         ImplInitSettings();
     683           4 :         Invalidate();
     684             :     }
     685          17 : }
     686             : 
     687           0 : void Dialog::DataChanged( const DataChangedEvent& rDCEvt )
     688             : {
     689           0 :     SystemWindow::DataChanged( rDCEvt );
     690             : 
     691           0 :     if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
     692           0 :          (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
     693             :     {
     694           0 :         ImplInitSettings();
     695           0 :         Invalidate();
     696             :     }
     697           0 : }
     698             : 
     699           0 : bool Dialog::Close()
     700             : {
     701           0 :     ImplDelData aDelData;
     702           0 :     ImplAddDel( &aDelData );
     703           0 :     CallEventListeners( VCLEVENT_WINDOW_CLOSE );
     704           0 :     if ( aDelData.IsDead() )
     705           0 :         return false;
     706           0 :     ImplRemoveDel( &aDelData );
     707             : 
     708           0 :     if ( mpWindowImpl->mxWindowPeer.is() && IsCreatedWithToolkit() && !IsInExecute() )
     709           0 :         return false;
     710             : 
     711           0 :     mbInClose = true;
     712             : 
     713           0 :     if ( !(GetStyle() & WB_CLOSEABLE) )
     714             :     {
     715           0 :         bool bRet = true;
     716           0 :         ImplAddDel( &aDelData );
     717           0 :         PushButton* pButton = ImplGetCancelButton( this );
     718           0 :         if ( pButton )
     719           0 :             pButton->Click();
     720             :         else
     721             :         {
     722           0 :             pButton = ImplGetOKButton( this );
     723           0 :             if ( pButton )
     724           0 :                 pButton->Click();
     725             :             else
     726           0 :                 bRet = false;
     727             :         }
     728           0 :         if ( aDelData.IsDead() )
     729           0 :             return true;
     730           0 :         ImplRemoveDel( &aDelData );
     731           0 :         return bRet;
     732             :     }
     733             : 
     734           0 :     if ( IsInExecute() )
     735             :     {
     736           0 :         EndDialog( RET_CANCEL );
     737           0 :         mbInClose = false;
     738           0 :         return true;
     739             :     }
     740             :     else
     741             :     {
     742           0 :         mbInClose = false;
     743           0 :         return SystemWindow::Close();
     744           0 :     }
     745             : }
     746             : 
     747           0 : bool Dialog::ImplStartExecuteModal()
     748             : {
     749           0 :     if ( mbInExecute )
     750             :     {
     751             : #ifdef DBG_UTIL
     752             :         OStringBuffer aErrorStr;
     753             :         aErrorStr.append("Dialog::StartExecuteModal() is called in Dialog::StartExecuteModal(): ");
     754             :         aErrorStr.append(ImplGetDialogText(this));
     755             :         OSL_FAIL(aErrorStr.getStr());
     756             : #endif
     757           0 :         return false;
     758             :     }
     759             : 
     760           0 :     switch ( Application::GetDialogCancelMode() )
     761             :     {
     762             :     case Application::DIALOG_CANCEL_OFF:
     763           0 :         break;
     764             :     case Application::DIALOG_CANCEL_SILENT:
     765             :         SAL_INFO(
     766             :             "vcl",
     767             :             "Dialog \"" << ImplGetDialogText(this).getStr()
     768             :                 << "\"cancelled in silent mode");
     769           0 :         return false;
     770             :     default:
     771             :         assert(false && "this cannot happen");
     772             :         // fall through
     773             :     case Application::DIALOG_CANCEL_FATAL:
     774           0 :         std::abort();
     775             :     }
     776             : 
     777             : #ifdef DBG_UTIL
     778             :     vcl::Window* pParent = GetParent();
     779             :     if ( pParent )
     780             :     {
     781             :         pParent = pParent->ImplGetFirstOverlapWindow();
     782             :         DBG_ASSERT( pParent->IsReallyVisible(),
     783             :                     "Dialog::StartExecuteModal() - Parent not visible" );
     784             :         DBG_ASSERT( pParent->IsInputEnabled(),
     785             :                     "Dialog::StartExecuteModal() - Parent input disabled, use another parent to ensure modality!" );
     786             :         DBG_ASSERT( ! pParent->IsInModalMode(),
     787             :                     "Dialog::StartExecuteModal() - Parent already modally disabled, use another parent to ensure modality!" );
     788             : 
     789             :     }
     790             : #endif
     791             : 
     792           0 :     ImplSVData* pSVData = ImplGetSVData();
     793             : 
     794             :      // link all dialogs which are being executed
     795           0 :     mpPrevExecuteDlg = pSVData->maWinData.mpLastExecuteDlg;
     796           0 :     pSVData->maWinData.mpLastExecuteDlg = this;
     797             : 
     798             :     // stop capturing, in order to have control over the dialog
     799           0 :     if ( pSVData->maWinData.mpTrackWin )
     800           0 :         pSVData->maWinData.mpTrackWin->EndTracking( TrackingEventFlags::Cancel );
     801           0 :     if ( pSVData->maWinData.mpCaptureWin )
     802           0 :         pSVData->maWinData.mpCaptureWin->ReleaseMouse();
     803           0 :     EnableInput( true, true );
     804             : 
     805           0 :     if ( GetParent() )
     806             :     {
     807           0 :         NotifyEvent aNEvt( MouseNotifyEvent::EXECUTEDIALOG, this );
     808           0 :         GetParent()->CompatNotify( aNEvt );
     809             :     }
     810           0 :     mbInExecute = true;
     811           0 :     SetModalInputMode( true );
     812           0 :     mbOldSaveBack = IsSaveBackgroundEnabled();
     813           0 :     EnableSaveBackground();
     814             : 
     815             :     // FIXME: no layouting, workaround some clipping issues
     816           0 :     ImplAdjustNWFSizes();
     817             : 
     818           0 :     Show();
     819             : 
     820           0 :     pSVData->maAppData.mnModalMode++;
     821           0 :     return true;
     822             : }
     823             : 
     824           0 : void Dialog::ImplEndExecuteModal()
     825             : {
     826           0 :     ImplSVData* pSVData = ImplGetSVData();
     827           0 :     pSVData->maAppData.mnModalMode--;
     828           0 : }
     829             : 
     830           0 : short Dialog::Execute()
     831             : {
     832             : #if HAVE_FEATURE_DESKTOP
     833             : 
     834           0 :     setDeferredProperties();
     835             : 
     836           0 :     if ( !ImplStartExecuteModal() )
     837           0 :         return 0;
     838             : 
     839           0 :     ImplDelData aDelData;
     840           0 :     ImplAddDel( &aDelData );
     841             : 
     842             : #ifdef DBG_UTIL
     843             :     ImplDelData aParentDelData;
     844             :     vcl::Window* pDialogParent = mpDialogParent;
     845             :     if( pDialogParent )
     846             :         pDialogParent->ImplAddDel( &aParentDelData );
     847             : #endif
     848             : 
     849             :     // Yield util EndDialog is called or dialog gets destroyed
     850             :     // (the latter should not happen, but better safe than sorry
     851           0 :     while ( !aDelData.IsDead() && mbInExecute )
     852           0 :         Application::Yield();
     853             : 
     854           0 :     ImplEndExecuteModal();
     855             : 
     856             : #ifdef DBG_UTIL
     857             :     if( pDialogParent  )
     858             :     {
     859             :         if( ! aParentDelData.IsDead() )
     860             :             pDialogParent->ImplRemoveDel( &aParentDelData );
     861             :         else
     862             :             OSL_FAIL( "Dialog::Execute() - Parent of dialog destroyed in Execute()" );
     863             :     }
     864             : #endif
     865           0 :     if ( !aDelData.IsDead() )
     866           0 :         ImplRemoveDel( &aDelData );
     867             : #ifdef DBG_UTIL
     868             :     else
     869             :     {
     870             :         OSL_FAIL( "Dialog::Execute() - Dialog destroyed in Execute()" );
     871             :     }
     872             : #endif
     873             : 
     874           0 :     long nRet = mpDialogImpl->mnResult;
     875           0 :     mpDialogImpl->mnResult = -1;
     876           0 :     return (short)nRet;
     877             : 
     878             : #else
     879             : 
     880             :     // touch_ui_dialog_modal was dummied out both for Android and iOS (well, TiledLibreOffice anyway)
     881             :     // For Android it returned MLODialogOK always, for iOS Cancel. Let's go with OK.
     882             :     // MLODialogResult result = touch_ui_dialog_modal(kind, ImplGetDialogText(this).getStr());
     883             :     return RET_OK;
     884             : 
     885             : #endif
     886             : }
     887             : 
     888             : // virtual
     889           0 : void Dialog::StartExecuteModal( const Link<>& rEndDialogHdl )
     890             : {
     891           0 :     if ( !ImplStartExecuteModal() )
     892           0 :         return;
     893             : 
     894           0 :     mpDialogImpl->maEndDialogHdl = rEndDialogHdl;
     895           0 :     mpDialogImpl->mbStartedModal = true;
     896             : }
     897             : 
     898           0 : void Dialog::EndDialog( long nResult )
     899             : {
     900           0 :     if ( mbInExecute )
     901             :     {
     902           0 :         SetModalInputMode( false );
     903             : 
     904             :         // remove dialog from the list of dialogs which are being executed
     905           0 :         ImplSVData* pSVData = ImplGetSVData();
     906           0 :         Dialog* pExeDlg = pSVData->maWinData.mpLastExecuteDlg;
     907           0 :         while ( pExeDlg )
     908             :         {
     909           0 :             if ( pExeDlg == this )
     910             :             {
     911           0 :                 pSVData->maWinData.mpLastExecuteDlg = mpPrevExecuteDlg;
     912           0 :                 break;
     913             :             }
     914           0 :             pExeDlg = pExeDlg->mpPrevExecuteDlg;
     915             :         }
     916             :         // set focus to previous modal dialogue if it is modal for
     917             :         // the same frame parent (or NULL)
     918           0 :         if( mpPrevExecuteDlg )
     919             :         {
     920           0 :             vcl::Window* pFrameParent = ImplGetFrameWindow()->ImplGetParent();
     921           0 :             vcl::Window* pPrevFrameParent = mpPrevExecuteDlg->ImplGetFrameWindow()->ImplGetParent();
     922           0 :             if( ( !pFrameParent && !pPrevFrameParent ) ||
     923           0 :                 ( pFrameParent && pPrevFrameParent && pFrameParent->ImplGetFrame() == pPrevFrameParent->ImplGetFrame() )
     924             :                 )
     925             :             {
     926           0 :                 mpPrevExecuteDlg->GrabFocus();
     927             :             }
     928             :         }
     929           0 :         mpPrevExecuteDlg = NULL;
     930             : 
     931           0 :         Hide();
     932           0 :         EnableSaveBackground( mbOldSaveBack );
     933           0 :         if ( GetParent() )
     934             :         {
     935           0 :             NotifyEvent aNEvt( MouseNotifyEvent::ENDEXECUTEDIALOG, this );
     936           0 :             GetParent()->CompatNotify( aNEvt );
     937             :         }
     938             : 
     939           0 :         mpDialogImpl->mnResult = nResult;
     940             : 
     941           0 :         if ( mpDialogImpl->mbStartedModal )
     942             :         {
     943           0 :             ImplEndExecuteModal();
     944           0 :             if (mpDialogImpl->maEndDialogHdl.IsSet())
     945             :             {
     946           0 :                 mpDialogImpl->maEndDialogHdl.Call( this );
     947           0 :                 mpDialogImpl->maEndDialogHdl = Link<>();
     948             :             }
     949           0 :             mpDialogImpl->mbStartedModal = false;
     950           0 :             mpDialogImpl->mnResult = -1;
     951             :         }
     952           0 :         mbInExecute = false;
     953             :     }
     954           0 : }
     955             : 
     956           0 : long Dialog::GetResult() const
     957             : {
     958           0 :     return mpDialogImpl->mnResult;
     959             : }
     960             : 
     961           0 : void Dialog::EndAllDialogs( vcl::Window* pParent )
     962             : {
     963           0 :    ImplSVData*  pSVData = ImplGetSVData();
     964             :    Dialog*      pTempModDialog;
     965           0 :    Dialog*      pModDialog = pSVData->maWinData.mpLastExecuteDlg;
     966           0 :    while ( pModDialog )
     967             :    {
     968           0 :      pTempModDialog = pModDialog->mpPrevExecuteDlg;
     969           0 :      if( !pParent || ( pParent && pParent->IsWindowOrChild( pModDialog, true ) ) )
     970             :      {
     971           0 :         pModDialog->EndDialog( RET_CANCEL );
     972           0 :         pModDialog->PostUserEvent( Link<>() );
     973             :      }
     974           0 :      pModDialog = pTempModDialog;
     975             :    }
     976           0 : }
     977             : 
     978           0 : void Dialog::SetModalInputMode( bool bModal )
     979             : {
     980           0 :     if ( bModal == mbModalMode )
     981           0 :         return;
     982             : 
     983           0 :     ImplSVData* pSVData = ImplGetSVData();
     984           0 :     mbModalMode = bModal;
     985           0 :     if ( bModal )
     986             :     {
     987           0 :         pSVData->maAppData.mnModalDialog++;
     988             : 
     989             :         // Diable the prev Modal Dialog, because our dialog must close at first,
     990             :         // before the other dialog can be closed (because the other dialog
     991             :         // is on stack since our dialog returns)
     992           0 :         if ( mpPrevExecuteDlg && !mpPrevExecuteDlg->IsWindowOrChild( this, true ) )
     993           0 :             mpPrevExecuteDlg->EnableInput( false, true, true, this );
     994             : 
     995             :         // determine next overlap dialog parent
     996           0 :         vcl::Window* pParent = GetParent();
     997           0 :         if ( pParent )
     998             :         {
     999             :             // #103716# dialogs should always be modal to the whole frame window
    1000             :             // #115933# disable the whole frame hierarchy, useful if our parent
    1001             :             // is a modeless dialog
    1002           0 :             mpDialogParent = pParent->mpWindowImpl->mpFrameWindow;
    1003           0 :             mpDialogParent->ImplIncModalCount();
    1004             :         }
    1005             : 
    1006             :     }
    1007             :     else
    1008             :     {
    1009           0 :         pSVData->maAppData.mnModalDialog--;
    1010             : 
    1011           0 :         if ( mpDialogParent )
    1012             :         {
    1013             :             // #115933# re-enable the whole frame hierarchy again (see above)
    1014             :             // note that code in getfocus assures that we do not accidentally enable
    1015             :             // windows that were disabled before
    1016           0 :             mpDialogParent->ImplDecModalCount();
    1017             :         }
    1018             : 
    1019             :         // Enable the prev Modal Dialog
    1020           0 :         if ( mpPrevExecuteDlg && !mpPrevExecuteDlg->IsWindowOrChild( this, true ) )
    1021             :         {
    1022           0 :             mpPrevExecuteDlg->EnableInput( true, true, true, this );
    1023             :             // ensure continued modality of prev dialog
    1024             :             // do not change modality counter
    1025             : 
    1026             :             // #i119994# need find the last modal dialog before reactive it
    1027           0 :             Dialog * pPrevModalDlg = mpPrevExecuteDlg;
    1028             : 
    1029           0 :             while( pPrevModalDlg && !pPrevModalDlg->IsModalInputMode() )
    1030           0 :                 pPrevModalDlg = pPrevModalDlg->mpPrevExecuteDlg;
    1031             : 
    1032           0 :             if( pPrevModalDlg &&
    1033           0 :             ( pPrevModalDlg == mpPrevExecuteDlg.get()
    1034           0 :                 || !pPrevModalDlg->IsWindowOrChild( this, true ) ) )
    1035             :             {
    1036           0 :                 mpPrevExecuteDlg->SetModalInputMode( false );
    1037           0 :                 mpPrevExecuteDlg->SetModalInputMode( true );
    1038             :             }
    1039             :         }
    1040             :     }
    1041             : }
    1042             : 
    1043           0 : void Dialog::SetModalInputMode( bool bModal, bool bSubModalDialogs )
    1044             : {
    1045           0 :     if ( bSubModalDialogs )
    1046             :     {
    1047           0 :         vcl::Window* pOverlap = ImplGetFirstOverlapWindow();
    1048           0 :         pOverlap = pOverlap->mpWindowImpl->mpFirstOverlap;
    1049           0 :         while ( pOverlap )
    1050             :         {
    1051           0 :             if ( pOverlap->IsDialog() )
    1052           0 :                 static_cast<Dialog*>(pOverlap)->SetModalInputMode( bModal, true );
    1053           0 :             pOverlap = pOverlap->mpWindowImpl->mpNext;
    1054             :         }
    1055             :     }
    1056             : 
    1057           0 :     SetModalInputMode( bModal );
    1058           0 : }
    1059             : 
    1060           5 : void Dialog::GrabFocusToFirstControl()
    1061             : {
    1062             :     vcl::Window* pFocusControl;
    1063             : 
    1064             :     // find focus control, even if the dialog has focus
    1065           5 :     if ( HasFocus() )
    1066           0 :         pFocusControl = NULL;
    1067             :     else
    1068             :     {
    1069             :         // prefer a child window which had focus before
    1070           5 :         pFocusControl = ImplGetFirstOverlapWindow()->mpWindowImpl->mpLastFocusWindow;
    1071             :         // find the control out of the dialog control
    1072           5 :         if ( pFocusControl )
    1073           0 :             pFocusControl = ImplFindDlgCtrlWindow( pFocusControl );
    1074             :     }
    1075             :     // no control had the focus before or the control is not
    1076             :     // part of the tab-control, now give focus to the
    1077             :     // first control in the tab-control
    1078           5 :     if ( !pFocusControl ||
    1079           0 :          !(pFocusControl->GetStyle() & WB_TABSTOP) ||
    1080           0 :          !isVisibleInLayout(pFocusControl) ||
    1081           5 :          !isEnabledInLayout(pFocusControl) || !pFocusControl->IsInputEnabled() )
    1082             :     {
    1083           5 :         sal_uInt16 n = 0;
    1084           5 :         pFocusControl = ImplGetDlgWindow( n, GetDlgWindowType::First );
    1085             :     }
    1086           5 :     if ( pFocusControl )
    1087           0 :         pFocusControl->ImplControlFocus( GetFocusFlags::Init );
    1088           5 : }
    1089             : 
    1090           0 : void Dialog::GetDrawWindowBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder, sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const
    1091             : {
    1092           0 :     ScopedVclPtrInstance<ImplBorderWindow> aImplWin( static_cast<vcl::Window*>(const_cast<Dialog *>(this)), WB_BORDER|WB_STDWORK, BORDERWINDOW_STYLE_OVERLAP );
    1093           0 :     aImplWin->GetBorder( rLeftBorder, rTopBorder, rRightBorder, rBottomBorder );
    1094           0 : }
    1095             : 
    1096           0 : void Dialog::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, DrawFlags )
    1097             : {
    1098           0 :     Point aPos = pDev->LogicToPixel( rPos );
    1099           0 :     Size aSize = pDev->LogicToPixel( rSize );
    1100             : 
    1101           0 :     Wallpaper aWallpaper = GetBackground();
    1102           0 :     if ( !aWallpaper.IsBitmap() )
    1103           0 :         ImplInitSettings();
    1104             : 
    1105           0 :     pDev->Push();
    1106           0 :     pDev->SetMapMode();
    1107           0 :     pDev->SetLineColor();
    1108             : 
    1109           0 :     if ( aWallpaper.IsBitmap() )
    1110           0 :         pDev->DrawBitmapEx( aPos, aSize, aWallpaper.GetBitmap() );
    1111             :     else
    1112             :     {
    1113           0 :         pDev->SetFillColor( aWallpaper.GetColor() );
    1114           0 :         pDev->DrawRect( Rectangle( aPos, aSize ) );
    1115             :     }
    1116             : 
    1117           0 :     if (!( GetStyle() & WB_NOBORDER ))
    1118             :     {
    1119           0 :         ScopedVclPtrInstance< ImplBorderWindow > aImplWin( this, WB_BORDER|WB_STDWORK, BORDERWINDOW_STYLE_OVERLAP );
    1120           0 :         aImplWin->SetText( GetText() );
    1121           0 :         aImplWin->setPosSizePixel( aPos.X(), aPos.Y(), aSize.Width(), aSize.Height() );
    1122           0 :         aImplWin->SetDisplayActive( true );
    1123           0 :         aImplWin->InitView();
    1124             : 
    1125           0 :         aImplWin->Draw( Rectangle( aPos, aSize ), pDev, aPos );
    1126             :     }
    1127             : 
    1128           0 :     pDev->Pop();
    1129           0 : }
    1130             : 
    1131         134 : void Dialog::queue_resize(StateChangedType eReason)
    1132             : {
    1133         134 :     if (IsInClose())
    1134         134 :         return;
    1135         134 :     SystemWindow::queue_resize(eReason);
    1136             : }
    1137             : 
    1138           0 : bool Dialog::set_property(const OString &rKey, const OString &rValue)
    1139             : {
    1140           0 :     if (rKey == "border-width")
    1141           0 :         set_border_width(rValue.toInt32());
    1142             :     else
    1143           0 :         return SystemWindow::set_property(rKey, rValue);
    1144           0 :     return true;
    1145             : }
    1146             : 
    1147       75378 : VclBuilderContainer::VclBuilderContainer()
    1148       75378 :     : m_pUIBuilder(NULL)
    1149             : {
    1150       75378 : }
    1151             : 
    1152       72712 : VclBuilderContainer::~VclBuilderContainer()
    1153             : {
    1154       72712 :     delete m_pUIBuilder;
    1155       72712 : }
    1156             : 
    1157           0 : ModelessDialog::ModelessDialog(vcl::Window* pParent, const OUString& rID, const OUString& rUIXMLDescription, InitFlag eFlag)
    1158           0 :     : Dialog(pParent, rID, rUIXMLDescription, WINDOW_MODELESSDIALOG, eFlag)
    1159             : {
    1160           0 : }
    1161             : 
    1162           1 : ModalDialog::ModalDialog( vcl::Window* pParent, WinBits nStyle ) :
    1163           1 :     Dialog( WINDOW_MODALDIALOG )
    1164             : {
    1165           1 :     ImplInit( pParent, nStyle );
    1166           1 : }
    1167             : 
    1168           3 : ModalDialog::ModalDialog( vcl::Window* pParent, const OUString& rID, const OUString& rUIXMLDescription ) :
    1169           3 :     Dialog(pParent, rID, rUIXMLDescription, WINDOW_MODALDIALOG)
    1170             : {
    1171         801 : }
    1172             : 
    1173             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11