LCOV - code coverage report
Current view: top level - vcl/source/app - svapp.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 391 757 51.7 %
Date: 2014-11-03 Functions: 82 135 60.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <config_features.h>
      21             : 
      22             : #include "comphelper/processfactory.hxx"
      23             : 
      24             : #include "osl/module.h"
      25             : #include "osl/file.hxx"
      26             : #include "osl/thread.h"
      27             : 
      28             : #include "rtl/tencinfo.h"
      29             : #include "rtl/instance.hxx"
      30             : #include "rtl/process.h"
      31             : 
      32             : #include "tools/debug.hxx"
      33             : #include "tools/time.hxx"
      34             : 
      35             : #include "i18nlangtag/mslangid.hxx"
      36             : 
      37             : #include "unotools/syslocaleoptions.hxx"
      38             : 
      39             : #include "vcl/settings.hxx"
      40             : #include "vcl/keycod.hxx"
      41             : #include "vcl/event.hxx"
      42             : #include "vcl/vclevent.hxx"
      43             : #include "vcl/virdev.hxx"
      44             : #include "vcl/wrkwin.hxx"
      45             : #include "vcl/svapp.hxx"
      46             : #include "vcl/cvtgrf.hxx"
      47             : #include "vcl/unowrap.hxx"
      48             : #include "vcl/timer.hxx"
      49             : #include "vcl/unohelp.hxx"
      50             : #include "vcl/lazydelete.hxx"
      51             : 
      52             : #include "salinst.hxx"
      53             : #include "salframe.hxx"
      54             : #include "salsys.hxx"
      55             : #include "svdata.hxx"
      56             : #include "salimestatus.hxx"
      57             : #include "xconnection.hxx"
      58             : #include "window.h"
      59             : #include "accmgr.hxx"
      60             : #include "idlemgr.hxx"
      61             : #include "svids.hrc"
      62             : 
      63             : #include "com/sun/star/uno/Reference.h"
      64             : #include "com/sun/star/awt/XToolkit.hpp"
      65             : #include "com/sun/star/uno/XNamingService.hpp"
      66             : #include "com/sun/star/lang/XMultiServiceFactory.hpp"
      67             : #include "comphelper/solarmutex.hxx"
      68             : #include "osl/process.h"
      69             : 
      70             : #include <cassert>
      71             : #include <utility>
      72             : 
      73             : using namespace ::com::sun::star;
      74             : using namespace ::com::sun::star::uno;
      75             : 
      76             : // keycodes handled internally by VCL
      77             : class ImplReservedKey
      78             : {
      79             : public:
      80           0 :     ImplReservedKey( vcl::KeyCode aKeyCode, sal_uInt16 nResId ) :
      81           0 :       mKeyCode(aKeyCode), mnResId( nResId)
      82           0 :      {}
      83             : 
      84             :     vcl::KeyCode mKeyCode;
      85             :     sal_uInt16  mnResId;
      86             : };
      87             : 
      88             : typedef std::pair<ImplReservedKey*, size_t> ReservedKeys;
      89             : namespace
      90             : {
      91             :     struct ImplReservedKeysImpl
      92             :     {
      93           0 :         ReservedKeys* operator()()
      94             :         {
      95             :             static ImplReservedKey ImplReservedKeys[] =
      96             :             {
      97             :                 ImplReservedKey(vcl::KeyCode(KEY_F1,0),                  SV_SHORTCUT_HELP),
      98             :                 ImplReservedKey(vcl::KeyCode(KEY_F1,KEY_SHIFT),          SV_SHORTCUT_ACTIVEHELP),
      99             :                 ImplReservedKey(vcl::KeyCode(KEY_F1,KEY_MOD1),           SV_SHORTCUT_CONTEXTHELP),
     100             :                 ImplReservedKey(vcl::KeyCode(KEY_F2,KEY_SHIFT),          SV_SHORTCUT_CONTEXTHELP),
     101             :                 ImplReservedKey(vcl::KeyCode(KEY_F4,KEY_MOD1),           SV_SHORTCUT_DOCKUNDOCK),
     102             :                 ImplReservedKey(vcl::KeyCode(KEY_F4,KEY_MOD2),           SV_SHORTCUT_DOCKUNDOCK),
     103             :                 ImplReservedKey(vcl::KeyCode(KEY_F4,KEY_MOD1|KEY_MOD2),  SV_SHORTCUT_DOCKUNDOCK),
     104             :                 ImplReservedKey(vcl::KeyCode(KEY_F6,0),                  SV_SHORTCUT_NEXTSUBWINDOW),
     105             :                 ImplReservedKey(vcl::KeyCode(KEY_F6,KEY_MOD1),           SV_SHORTCUT_TODOCUMENT),
     106             :                 ImplReservedKey(vcl::KeyCode(KEY_F6,KEY_SHIFT),          SV_SHORTCUT_PREVSUBWINDOW),
     107             :                 ImplReservedKey(vcl::KeyCode(KEY_F6,KEY_MOD1|KEY_SHIFT), SV_SHORTCUT_SPLITTER),
     108             :                 ImplReservedKey(vcl::KeyCode(KEY_F10,0),                 SV_SHORTCUT_MENUBAR)
     109             : #ifdef UNX
     110             :                 ,
     111             :                 ImplReservedKey(vcl::KeyCode(KEY_1,KEY_SHIFT|KEY_MOD1), 0),
     112             :                 ImplReservedKey(vcl::KeyCode(KEY_2,KEY_SHIFT|KEY_MOD1), 0),
     113             :                 ImplReservedKey(vcl::KeyCode(KEY_3,KEY_SHIFT|KEY_MOD1), 0),
     114             :                 ImplReservedKey(vcl::KeyCode(KEY_4,KEY_SHIFT|KEY_MOD1), 0),
     115             :                 ImplReservedKey(vcl::KeyCode(KEY_5,KEY_SHIFT|KEY_MOD1), 0),
     116             :                 ImplReservedKey(vcl::KeyCode(KEY_6,KEY_SHIFT|KEY_MOD1), 0),
     117             :                 ImplReservedKey(vcl::KeyCode(KEY_7,KEY_SHIFT|KEY_MOD1), 0),
     118             :                 ImplReservedKey(vcl::KeyCode(KEY_8,KEY_SHIFT|KEY_MOD1), 0),
     119             :                 ImplReservedKey(vcl::KeyCode(KEY_9,KEY_SHIFT|KEY_MOD1), 0),
     120             :                 ImplReservedKey(vcl::KeyCode(KEY_0,KEY_SHIFT|KEY_MOD1), 0),
     121             :                 ImplReservedKey(vcl::KeyCode(KEY_ADD,KEY_SHIFT|KEY_MOD1), 0)
     122             : #endif
     123           0 :             };
     124             :             static ReservedKeys aKeys
     125             :             (
     126             :                 &ImplReservedKeys[0],
     127             :                 sizeof(ImplReservedKeys) / sizeof(ImplReservedKey)
     128             :             );
     129           0 :             return &aKeys;
     130             :         }
     131             :     };
     132             : 
     133             :     struct ImplReservedKeys
     134             :         : public rtl::StaticAggregate<ReservedKeys, ImplReservedKeysImpl> {};
     135             : }
     136             : 
     137             : extern "C" {
     138             :     typedef UnoWrapperBase* (SAL_CALL *FN_TkCreateUnoWrapper)();
     139             : }
     140             : 
     141             : struct ImplHotKey
     142             : {
     143             :     ImplHotKey*             mpNext;
     144             :     void*                   mpUserData;
     145             :     vcl::KeyCode            maKeyCode;
     146             :     Link                    maLink;
     147             : };
     148             : 
     149             : struct ImplEventHook
     150             : {
     151             :     ImplEventHook*          mpNext;
     152             :     void*                   mpUserData;
     153             :     VCLEventHookProc        mpProc;
     154             : };
     155             : 
     156             : struct ImplPostEventData
     157             : {
     158             :     sal_uLong           mnEvent;
     159             :     const vcl::Window*   mpWin;
     160             :     ImplSVEvent *   mnEventId;
     161             :     KeyEvent        maKeyEvent;
     162             :     MouseEvent      maMouseEvent;
     163             :     ZoomEvent       maZoomEvent;
     164             :     ScrollEvent     maScrollEvent;
     165             : 
     166           0 :        ImplPostEventData( sal_uLong nEvent, const vcl::Window* pWin, const KeyEvent& rKeyEvent ) :
     167           0 :         mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maKeyEvent( rKeyEvent ) {}
     168           0 :        ImplPostEventData( sal_uLong nEvent, const vcl::Window* pWin, const MouseEvent& rMouseEvent ) :
     169           0 :         mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maMouseEvent( rMouseEvent ) {}
     170             : #if !HAVE_FEATURE_DESKTOP
     171             :        ImplPostEventData( sal_uLong nEvent, const vcl::Window* pWin, const ZoomEvent& rZoomEvent ) :
     172             :         mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maZoomEvent( rZoomEvent ) {}
     173             :        ImplPostEventData( sal_uLong nEvent, const vcl::Window* pWin, const ScrollEvent& rScrollEvent ) :
     174             :         mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maScrollEvent( rScrollEvent ) {}
     175             : #endif
     176             : 
     177           0 :     ~ImplPostEventData() {}
     178             : };
     179             : 
     180             : typedef ::std::pair< vcl::Window*, ImplPostEventData* > ImplPostEventPair;
     181             : 
     182         411 : static ::std::list< ImplPostEventPair > aPostedEventList;
     183             : 
     184      180248 : Application* GetpApp()
     185             : {
     186      180248 :     ImplSVData* pSVData = ImplGetSVData();
     187      180248 :     if ( !pSVData )
     188           0 :         return NULL;
     189      180248 :     return pSVData->mpApp;
     190             : }
     191             : 
     192         373 : Application::Application()
     193             : {
     194             :     // useful for themes at least, perhaps extensions too
     195         746 :     OUString aVar("LIBO_VERSION"), aValue(LIBO_VERSION_DOTTED);
     196         373 :     osl_setEnvironment(aVar.pData, aValue.pData);
     197             : 
     198         373 :     if( ! ImplGetSVData() )
     199         171 :         ImplInitSVData();
     200         373 :     ImplGetSVData()->mpApp = this;
     201         746 :     InitSalData();
     202         373 : }
     203             : 
     204         367 : Application::~Application()
     205             : {
     206         367 :     ImplDeInitSVData();
     207         367 :     DeInitSalData();
     208         367 :     ImplGetSVData()->mpApp = NULL;
     209         367 :     ImplDestroySVData();
     210         367 : }
     211             : 
     212           0 : bool Application::QueryExit()
     213             : {
     214           0 :     WorkWindow* pAppWin = ImplGetSVData()->maWinData.mpAppWin;
     215             : 
     216             :     // call the close handler of the application window
     217           0 :     if ( pAppWin )
     218           0 :         return pAppWin->Close();
     219             :     else
     220           0 :         return true;
     221             : }
     222             : 
     223       35483 : void Application::FocusChanged()
     224             : {
     225       35483 : }
     226             : 
     227         604 : void Application::DataChanged( const DataChangedEvent& )
     228             : {
     229         604 : }
     230             : 
     231         202 : void Application::Init()
     232             : {
     233         202 : }
     234             : 
     235        4252 : void Application::InitFinished()
     236             : {
     237        4252 : }
     238             : 
     239         196 : void Application::DeInit()
     240             : {
     241         196 : }
     242             : 
     243         132 : sal_uInt16 Application::GetCommandLineParamCount()
     244             : {
     245         132 :     return (sal_uInt16)osl_getCommandArgCount();
     246             : }
     247             : 
     248         165 : OUString Application::GetCommandLineParam( sal_uInt16 nParam )
     249             : {
     250         165 :     OUString aParam;
     251         165 :     osl_getCommandArg( nParam, &aParam.pData );
     252         165 :     return aParam;
     253             : }
     254             : 
     255          11 : OUString Application::GetAppFileName()
     256             : {
     257          11 :     ImplSVData* pSVData = ImplGetSVData();
     258             :     DBG_ASSERT( pSVData->maAppData.mpAppFileName, "AppFileName should be set to something after SVMain!" );
     259          11 :     if ( pSVData->maAppData.mpAppFileName )
     260           0 :         return *pSVData->maAppData.mpAppFileName;
     261             : 
     262             :     /*
     263             :      *  provide a fallback for people without initialized vcl here (like setup
     264             :      *  in responsefile mode)
     265             :      */
     266          11 :     OUString aAppFileName;
     267          22 :     OUString aExeFileName;
     268          11 :     osl_getExecutableFile(&aExeFileName.pData);
     269             : 
     270             :     // convert path to native file format
     271          11 :     osl::FileBase::getSystemPathFromFileURL(aExeFileName, aAppFileName);
     272             : 
     273          22 :     return aAppFileName;
     274             : }
     275             : 
     276           0 : sal_uInt16 Application::Exception( sal_uInt16 nError )
     277             : {
     278           0 :     switch ( nError & EXC_MAJORTYPE )
     279             :     {
     280             :         // System has precedence (so do nothing)
     281             :         case EXC_SYSTEM:
     282           0 :             return 0;
     283             : 
     284             :         case EXC_DISPLAY:
     285             :         case EXC_REMOTE:
     286           0 :             return 0;
     287             : 
     288             : #ifdef DBG_UTIL
     289             :         case EXC_RSCNOTLOADED:
     290             :             Abort(OUString("Resource not loaded"));
     291             :             break;
     292             :         default:
     293             :             Abort(OUString("Unknown Error"));
     294             :             break;
     295             : #else
     296             :         default:
     297           0 :             Abort(OUString());
     298           0 :             break;
     299             : #endif
     300             :     }
     301             : 
     302           0 :     return 0;
     303             : }
     304             : 
     305           0 : void Application::Abort( const OUString& rErrorText )
     306             : {
     307             :     //HACK: Dump core iff --norestore command line argument is given (assuming
     308             :     // this process is run by developers who are interested in cores, vs. end
     309             :     // users who are not):
     310           0 :     bool dumpCore = false;
     311           0 :     sal_uInt16 n = GetCommandLineParamCount();
     312           0 :     for (sal_uInt16 i = 0; i != n; ++i) {
     313           0 :         if (GetCommandLineParam(i).equals("--norestore")) {
     314           0 :             dumpCore = true;
     315           0 :             break;
     316             :         }
     317             :     }
     318             : 
     319           0 :     SalAbort( rErrorText, dumpCore );
     320           0 : }
     321             : 
     322           0 : sal_uLong Application::GetReservedKeyCodeCount()
     323             : {
     324           0 :     return ImplReservedKeys::get()->second;
     325             : }
     326             : 
     327           0 : const vcl::KeyCode* Application::GetReservedKeyCode( sal_uLong i )
     328             : {
     329           0 :     if( i >= GetReservedKeyCodeCount() )
     330           0 :         return NULL;
     331             :     else
     332           0 :         return &ImplReservedKeys::get()->first[i].mKeyCode;
     333             : }
     334             : 
     335          96 : void Application::Execute()
     336             : {
     337          96 :     ImplSVData* pSVData = ImplGetSVData();
     338          96 :     pSVData->maAppData.mbInAppExecute = true;
     339             : 
     340     1184395 :     while ( !pSVData->maAppData.mbAppQuit )
     341     1184203 :         Application::Yield();
     342             : 
     343          96 :     pSVData->maAppData.mbInAppExecute = false;
     344          96 : }
     345             : 
     346     1302043 : inline void ImplYield( bool i_bWait, bool i_bAllEvents )
     347             : {
     348     1302043 :     ImplSVData* pSVData = ImplGetSVData();
     349             : 
     350             :     // run timers that have timed out
     351     1302043 :     if ( !pSVData->mbNoCallTimer )
     352     2604088 :         while ( pSVData->mbNotAllTimerCalled )
     353           2 :             Timer::ImplTimerCallbackProc();
     354             : 
     355     1302043 :     pSVData->maAppData.mnDispatchLevel++;
     356             :     // do not wait for events if application was already quit; in that
     357             :     // case only dispatch events already available
     358             :     // do not wait for events either if the app decided that it is too busy for timers
     359             :     // (feature added for the slideshow)
     360     1302043 :     pSVData->mpDefInst->Yield( i_bWait && !pSVData->maAppData.mbAppQuit && !pSVData->maAppData.mbNoYield, i_bAllEvents );
     361     1302043 :     pSVData->maAppData.mnDispatchLevel--;
     362             : 
     363             :     DBG_TESTSOLARMUTEX(); // must be locked on return from Yield
     364             : 
     365             :     // flush lazy deleted objects
     366     1302043 :     if( pSVData->maAppData.mnDispatchLevel == 0 )
     367     1300914 :         vcl::LazyDelete::flush();
     368             : 
     369             :     // the system timer events will not necessarily come in in non waiting mode
     370             :     // e.g. on OS X; need to trigger timer checks manually
     371     1302043 :     if( pSVData->maAppData.mbNoYield && !pSVData->mbNoCallTimer )
     372             :     {
     373           0 :         do
     374             :         {
     375           0 :             Timer::ImplTimerCallbackProc();
     376             :         }
     377             :         while( pSVData->mbNotAllTimerCalled );
     378             :     }
     379             : 
     380             :     // call post yield listeners
     381     1302043 :     if( pSVData->maAppData.mpPostYieldListeners )
     382           0 :         pSVData->maAppData.mpPostYieldListeners->callListeners( NULL );
     383     1302043 : }
     384             : 
     385       14703 : void Application::Reschedule( bool i_bAllEvents )
     386             : {
     387       14703 :     ImplYield( false, i_bAllEvents );
     388       14703 : }
     389             : 
     390     1287340 : void Application::Yield()
     391             : {
     392     1287340 :     ImplYield( true, false );
     393     1287340 : }
     394             : 
     395         192 : IMPL_STATIC_LINK_NOINSTANCE( ImplSVAppData, ImplQuitMsg, void*, EMPTYARG )
     396             : {
     397          96 :     ImplGetSVData()->maAppData.mbAppQuit = true;
     398          96 :     return 0;
     399             : }
     400             : 
     401         168 : void Application::Quit()
     402             : {
     403         168 :     Application::PostUserEvent( STATIC_LINK( NULL, ImplSVAppData, ImplQuitMsg ) );
     404         168 : }
     405             : 
     406    32556105 : comphelper::SolarMutex& Application::GetSolarMutex()
     407             : {
     408    32556105 :     ImplSVData* pSVData = ImplGetSVData();
     409    32556102 :     return *(pSVData->mpDefInst->GetYieldMutex());
     410             : }
     411             : 
     412           0 : oslThreadIdentifier Application::GetMainThreadIdentifier()
     413             : {
     414           0 :     return ImplGetSVData()->mnMainThreadId;
     415             : }
     416             : 
     417        1229 : sal_uLong Application::ReleaseSolarMutex()
     418             : {
     419        1229 :     ImplSVData* pSVData = ImplGetSVData();
     420        1229 :     return pSVData->mpDefInst->ReleaseYieldMutex();
     421             : }
     422             : 
     423        1229 : void Application::AcquireSolarMutex( sal_uLong nCount )
     424             : {
     425        1229 :     ImplSVData* pSVData = ImplGetSVData();
     426        1229 :     pSVData->mpDefInst->AcquireYieldMutex( nCount );
     427        1229 : }
     428             : 
     429       70776 : bool Application::IsInMain()
     430             : {
     431       70776 :     return ImplGetSVData()->maAppData.mbInAppMain;
     432             : }
     433             : 
     434        5356 : bool Application::IsInExecute()
     435             : {
     436        5356 :     return ImplGetSVData()->maAppData.mbInAppExecute;
     437             : }
     438             : 
     439           0 : bool Application::IsInModalMode()
     440             : {
     441           0 :     return (ImplGetSVData()->maAppData.mnModalMode != 0);
     442             : }
     443             : 
     444           0 : sal_uInt16 Application::GetDispatchLevel()
     445             : {
     446           0 :     return ImplGetSVData()->maAppData.mnDispatchLevel;
     447             : }
     448             : 
     449       88532 : bool Application::AnyInput( sal_uInt16 nType )
     450             : {
     451       88532 :     return ImplGetSVData()->mpDefInst->AnyInput( nType );
     452             : }
     453             : 
     454        1564 : sal_uLong Application::GetLastInputInterval()
     455             : {
     456        1564 :     return (tools::Time::GetSystemTicks()-ImplGetSVData()->maAppData.mnLastInputTime);
     457             : }
     458             : 
     459             : extern int nImplSysDialog;
     460             : 
     461          32 : bool Application::IsUICaptured()
     462             : {
     463          32 :     ImplSVData* pSVData = ImplGetSVData();
     464             : 
     465             :     // If mouse was captured, or if in tracking- or in select-mode of a floatingwindow (e.g. menus
     466             :     // or pulldown toolboxes) another window should be created
     467             :     // D&D active !!!
     468          32 :     if ( pSVData->maWinData.mpCaptureWin || pSVData->maWinData.mpTrackWin ||
     469          32 :          pSVData->maWinData.mpFirstFloat || nImplSysDialog )
     470           0 :         return true;
     471             :     else
     472          32 :         return false;
     473             : }
     474             : 
     475         116 : void Application::OverrideSystemSettings( AllSettings& /*rSettings*/ )
     476             : {
     477         116 : }
     478             : 
     479         864 : void Application::MergeSystemSettings( AllSettings& rSettings )
     480             : {
     481         864 :     vcl::Window* pWindow = ImplGetSVData()->maWinData.mpFirstFrame;
     482         864 :     if( ! pWindow )
     483           2 :         pWindow = ImplGetDefaultWindow();
     484         864 :     if( pWindow )
     485             :     {
     486         864 :         ImplSVData* pSVData = ImplGetSVData();
     487         864 :         if ( !pSVData->maAppData.mbSettingsInit )
     488             :         {
     489             :             // side effect: ImplUpdateGlobalSettings does an ImplGetFrame()->UpdateSettings
     490         168 :             pWindow->ImplUpdateGlobalSettings( *pSVData->maAppData.mpSettings );
     491         168 :             pSVData->maAppData.mbSettingsInit = true;
     492             :         }
     493             :         // side effect: ImplUpdateGlobalSettings does an ImplGetFrame()->UpdateSettings
     494         864 :         pWindow->ImplUpdateGlobalSettings( rSettings, false );
     495             :     }
     496         864 : }
     497             : 
     498           0 : bool Application::ValidateSystemFont()
     499             : {
     500           0 :     vcl::Window* pWindow = ImplGetSVData()->maWinData.mpFirstFrame;
     501           0 :     if( ! pWindow )
     502           0 :         pWindow = ImplGetDefaultWindow();
     503             : 
     504           0 :     if( pWindow )
     505             :     {
     506           0 :         AllSettings aSettings;
     507           0 :         pWindow->ImplGetFrame()->UpdateSettings( aSettings );
     508           0 :         return pWindow->ImplCheckUIFont( aSettings.GetStyleSettings().GetAppFont() );
     509             :     }
     510           0 :     return false;
     511             : }
     512             : 
     513        1179 : void Application::SetSettings( const AllSettings& rSettings )
     514             : {
     515        1179 :     const SolarMutexGuard aGuard;
     516             : 
     517        1179 :     ImplSVData* pSVData = ImplGetSVData();
     518        1179 :     if ( !pSVData->maAppData.mpSettings )
     519             :     {
     520           0 :         InitSettings(pSVData);
     521           0 :         *pSVData->maAppData.mpSettings = rSettings;
     522           0 :         ResMgr::SetDefaultLocale( rSettings.GetUILanguageTag() );
     523             :     }
     524             :     else
     525             :     {
     526        1179 :         AllSettings aOldSettings = *pSVData->maAppData.mpSettings;
     527        1179 :         if( aOldSettings.GetUILanguageTag().getLanguageType() != rSettings.GetUILanguageTag().getLanguageType() &&
     528             :                 pSVData->mpResMgr )
     529             :         {
     530           0 :             delete pSVData->mpResMgr;
     531           0 :             pSVData->mpResMgr = NULL;
     532             :         }
     533        1179 :         ResMgr::SetDefaultLocale( rSettings.GetUILanguageTag() );
     534        1179 :         *pSVData->maAppData.mpSettings = rSettings;
     535        1179 :         sal_uLong nChangeFlags = aOldSettings.GetChangeFlags( *pSVData->maAppData.mpSettings );
     536        1179 :         if ( nChangeFlags )
     537             :         {
     538         604 :             DataChangedEvent aDCEvt( DATACHANGED_SETTINGS, &aOldSettings, nChangeFlags );
     539         604 :             GetpApp()->DataChanged( aDCEvt );
     540             : 
     541             :             // notify data change handler
     542         604 :             ImplCallEventListeners( VCLEVENT_APPLICATION_DATACHANGED, NULL, &aDCEvt);
     543             : 
     544             :             // Update all windows
     545         604 :             vcl::Window* pFirstFrame = pSVData->maWinData.mpFirstFrame;
     546             :             // Reset data that needs to be re-calculated
     547         604 :             long nOldDPIX = 0;
     548         604 :             long nOldDPIY = 0;
     549         604 :             if ( pFirstFrame )
     550             :             {
     551         600 :                 nOldDPIX = pFirstFrame->mnDPIX;
     552         600 :                 nOldDPIY = pFirstFrame->mnDPIY;
     553         600 :                 vcl::Window::ImplInitAppFontData(pFirstFrame);
     554             :             }
     555         604 :             vcl::Window* pFrame = pFirstFrame;
     556        1918 :             while ( pFrame )
     557             :             {
     558             :                 // restore AppFont cache data
     559         710 :                 pFrame->mpWindowImpl->mpFrameData->meMapUnit = MAP_PIXEL;
     560             : 
     561             :                 // call UpdateSettings from ClientWindow in order to prevent updating data twice
     562         710 :                 vcl::Window* pClientWin = pFrame;
     563        2130 :                 while ( pClientWin->ImplGetClientWindow() )
     564         710 :                     pClientWin = pClientWin->ImplGetClientWindow();
     565         710 :                 pClientWin->UpdateSettings( rSettings, true );
     566             : 
     567         710 :                 vcl::Window* pTempWin = pFrame->mpWindowImpl->mpFrameData->mpFirstOverlap;
     568        1420 :                 while ( pTempWin )
     569             :                 {
     570             :                     // call UpdateSettings from ClientWindow in order to prevent updating data twice
     571           0 :                     pClientWin = pTempWin;
     572           0 :                     while ( pClientWin->ImplGetClientWindow() )
     573           0 :                         pClientWin = pClientWin->ImplGetClientWindow();
     574           0 :                     pClientWin->UpdateSettings( rSettings, true );
     575           0 :                     pTempWin = pTempWin->mpWindowImpl->mpNextOverlap;
     576             :                 }
     577             : 
     578         710 :                 pFrame = pFrame->mpWindowImpl->mpFrameData->mpNextFrame;
     579             :             }
     580             : 
     581             :             // if DPI resolution for screen output was changed set the new resolution for all
     582             :             // screen compatible VirDev's
     583         604 :             pFirstFrame = pSVData->maWinData.mpFirstFrame;
     584         604 :             if ( pFirstFrame )
     585             :             {
     586        1200 :                 if ( (pFirstFrame->mnDPIX != nOldDPIX) ||
     587         600 :                      (pFirstFrame->mnDPIY != nOldDPIY) )
     588             :                 {
     589           0 :                     VirtualDevice* pVirDev = pSVData->maGDIData.mpFirstVirDev;
     590           0 :                     while ( pVirDev )
     591             :                     {
     592           0 :                         if ( pVirDev->mbScreenComp &&
     593           0 :                              (pVirDev->mnDPIX == nOldDPIX) &&
     594           0 :                              (pVirDev->mnDPIY == nOldDPIY) )
     595             :                         {
     596           0 :                             pVirDev->mnDPIX = pFirstFrame->mnDPIX;
     597           0 :                             pVirDev->mnDPIY = pFirstFrame->mnDPIY;
     598           0 :                             if ( pVirDev->IsMapMode() )
     599             :                             {
     600           0 :                                 MapMode aMapMode = pVirDev->GetMapMode();
     601           0 :                                 pVirDev->SetMapMode();
     602           0 :                                 pVirDev->SetMapMode( aMapMode );
     603             :                             }
     604             :                         }
     605             : 
     606           0 :                         pVirDev = pVirDev->mpNext;
     607             :                     }
     608             :                 }
     609             :             }
     610        1179 :         }
     611        1179 :     }
     612        1179 : }
     613             : 
     614     7679102 : const AllSettings& Application::GetSettings()
     615             : {
     616     7679102 :     ImplSVData* pSVData = ImplGetSVData();
     617     7679102 :     if ( !pSVData->maAppData.mpSettings )
     618             :     {
     619         337 :         InitSettings(pSVData);
     620             :     }
     621             : 
     622     7679102 :     return *(pSVData->maAppData.mpSettings);
     623             : }
     624             : 
     625         337 : void Application::InitSettings(ImplSVData* pSVData)
     626             : {
     627             :     assert(!pSVData->maAppData.mpSettings && "initialization should not happen twice!");
     628             : 
     629         337 :     pSVData->maAppData.mpCfgListener = new LocaleConfigurationListener;
     630         337 :     pSVData->maAppData.mpSettings = new AllSettings();
     631         337 :     pSVData->maAppData.mpSettings->GetSysLocale().GetOptions().AddListener( pSVData->maAppData.mpCfgListener );
     632         337 : }
     633             : 
     634           0 : void Application::NotifyAllWindows( DataChangedEvent& rDCEvt )
     635             : {
     636           0 :     ImplSVData* pSVData = ImplGetSVData();
     637           0 :     vcl::Window*     pFrame = pSVData->maWinData.mpFirstFrame;
     638           0 :     while ( pFrame )
     639             :     {
     640           0 :         pFrame->NotifyAllChildren( rDCEvt );
     641             : 
     642           0 :         vcl::Window* pSysWin = pFrame->mpWindowImpl->mpFrameData->mpFirstOverlap;
     643           0 :         while ( pSysWin )
     644             :         {
     645           0 :             pSysWin->NotifyAllChildren( rDCEvt );
     646           0 :             pSysWin = pSysWin->mpWindowImpl->mpNextOverlap;
     647             :         }
     648             : 
     649           0 :         pFrame = pFrame->mpWindowImpl->mpFrameData->mpNextFrame;
     650             :     }
     651           0 : }
     652             : 
     653         604 : void Application::ImplCallEventListeners( sal_uLong nEvent, vcl::Window *pWin, void* pData )
     654             : {
     655         604 :     ImplSVData* pSVData = ImplGetSVData();
     656         604 :     VclWindowEvent aEvent( pWin, nEvent, pData );
     657             : 
     658         604 :     if ( pSVData->maAppData.mpEventListeners )
     659         118 :         pSVData->maAppData.mpEventListeners->Call( &aEvent );
     660         604 : }
     661             : 
     662     5429412 : void Application::ImplCallEventListeners( VclSimpleEvent* pEvent )
     663             : {
     664     5429412 :     ImplSVData* pSVData = ImplGetSVData();
     665             : 
     666     5429412 :     if ( pSVData->maAppData.mpEventListeners )
     667     5427428 :         pSVData->maAppData.mpEventListeners->Call( pEvent );
     668     5429412 : }
     669             : 
     670        6108 : void Application::AddEventListener( const Link& rEventListener )
     671             : {
     672        6108 :     ImplSVData* pSVData = ImplGetSVData();
     673        6108 :     if( !pSVData->maAppData.mpEventListeners )
     674         184 :         pSVData->maAppData.mpEventListeners = new VclEventListeners;
     675        6108 :     pSVData->maAppData.mpEventListeners->addListener( rEventListener );
     676        6108 : }
     677             : 
     678        5952 : void Application::RemoveEventListener( const Link& rEventListener )
     679             : {
     680        5952 :     ImplSVData* pSVData = ImplGetSVData();
     681        5952 :     if( pSVData->maAppData.mpEventListeners )
     682        5952 :         pSVData->maAppData.mpEventListeners->removeListener( rEventListener );
     683        5952 : }
     684             : 
     685           0 : void Application::AddKeyListener( const Link& rKeyListener )
     686             : {
     687           0 :     ImplSVData* pSVData = ImplGetSVData();
     688           0 :     if( !pSVData->maAppData.mpKeyListeners )
     689           0 :         pSVData->maAppData.mpKeyListeners = new VclEventListeners;
     690           0 :     pSVData->maAppData.mpKeyListeners->addListener( rKeyListener );
     691           0 : }
     692             : 
     693           0 : void Application::RemoveKeyListener( const Link& rKeyListener )
     694             : {
     695           0 :     ImplSVData* pSVData = ImplGetSVData();
     696           0 :     if( pSVData->maAppData.mpKeyListeners )
     697           0 :         pSVData->maAppData.mpKeyListeners->removeListener( rKeyListener );
     698           0 : }
     699             : 
     700           0 : bool Application::HandleKey( sal_uLong nEvent, vcl::Window *pWin, KeyEvent* pKeyEvent )
     701             : {
     702             :     // let listeners process the key event
     703           0 :     VclWindowEvent aEvent( pWin, nEvent, (void *) pKeyEvent );
     704             : 
     705           0 :     ImplSVData* pSVData = ImplGetSVData();
     706           0 :     bool bProcessed = false;
     707             : 
     708           0 :     if ( pSVData->maAppData.mpKeyListeners )
     709           0 :         bProcessed = pSVData->maAppData.mpKeyListeners->Process( &aEvent );
     710             : 
     711           0 :     return bProcessed;
     712             : }
     713             : 
     714           0 : ImplSVEvent * Application::PostKeyEvent( sal_uLong nEvent, vcl::Window *pWin, KeyEvent* pKeyEvent )
     715             : {
     716           0 :     const SolarMutexGuard aGuard;
     717           0 :     ImplSVEvent * nEventId = 0;
     718             : 
     719           0 :     if( pWin && pKeyEvent )
     720             :     {
     721           0 :         ImplPostEventData* pPostEventData = new ImplPostEventData( nEvent, pWin, *pKeyEvent );
     722             : 
     723             :         nEventId = PostUserEvent(
     724             :                        STATIC_LINK( NULL, Application, PostEventHandler ),
     725           0 :                        pPostEventData );
     726             : 
     727           0 :         if( nEventId )
     728             :         {
     729           0 :             pPostEventData->mnEventId = nEventId;
     730           0 :             aPostedEventList.push_back( ImplPostEventPair( pWin, pPostEventData ) );
     731             :         }
     732             :         else
     733           0 :             delete pPostEventData;
     734             :     }
     735             : 
     736           0 :     return nEventId;
     737             : }
     738             : 
     739           0 : ImplSVEvent * Application::PostMouseEvent( sal_uLong nEvent, vcl::Window *pWin, MouseEvent* pMouseEvent )
     740             : {
     741           0 :     const SolarMutexGuard aGuard;
     742           0 :     ImplSVEvent * nEventId = 0;
     743             : 
     744           0 :     if( pWin && pMouseEvent )
     745             :     {
     746           0 :         Point aTransformedPos( pMouseEvent->GetPosPixel() );
     747             : 
     748           0 :         aTransformedPos.X() += pWin->mnOutOffX;
     749           0 :         aTransformedPos.Y() += pWin->mnOutOffY;
     750             : 
     751           0 :         const MouseEvent aTransformedEvent( aTransformedPos, pMouseEvent->GetClicks(), pMouseEvent->GetMode(),
     752           0 :                                             pMouseEvent->GetButtons(), pMouseEvent->GetModifier() );
     753             : 
     754           0 :         ImplPostEventData* pPostEventData = new ImplPostEventData( nEvent, pWin, aTransformedEvent );
     755             : 
     756             :         nEventId = PostUserEvent(
     757             :                        STATIC_LINK( NULL, Application, PostEventHandler ),
     758           0 :                        pPostEventData );
     759             : 
     760           0 :         if( nEventId )
     761             :         {
     762           0 :             pPostEventData->mnEventId = nEventId;
     763           0 :             aPostedEventList.push_back( ImplPostEventPair( pWin, pPostEventData ) );
     764             :         }
     765             :         else
     766           0 :             delete pPostEventData;
     767             :     }
     768             : 
     769           0 :     return nEventId;
     770             : }
     771             : 
     772             : #if !HAVE_FEATURE_DESKTOP
     773             : 
     774             : ImplSVEvent * Application::PostZoomEvent( sal_uLong nEvent, vcl::Window *pWin, ZoomEvent* pZoomEvent )
     775             : {
     776             :     const SolarMutexGuard aGuard;
     777             :     ImplSVEvent * nEventId = 0;
     778             : 
     779             :     if( pWin && pZoomEvent )
     780             :     {
     781             :         Point aTransformedPos( pZoomEvent->GetCenter() );
     782             : 
     783             :         aTransformedPos.X() += pWin->mnOutOffX;
     784             :         aTransformedPos.Y() += pWin->mnOutOffY;
     785             : 
     786             :         const ZoomEvent aTransformedEvent( aTransformedPos, pZoomEvent->GetScale() );
     787             : 
     788             :         ImplPostEventData* pPostEventData = new ImplPostEventData( nEvent, pWin, aTransformedEvent );
     789             : 
     790             :         nEventId = PostUserEvent(
     791             :                        STATIC_LINK( NULL, Application, PostEventHandler ),
     792             :                        pPostEventData );
     793             : 
     794             :         if( nEventId )
     795             :         {
     796             :             pPostEventData->mnEventId = nEventId;
     797             :             aPostedEventList.push_back( ImplPostEventPair( pWin, pPostEventData ) );
     798             :         }
     799             :         else
     800             :             delete pPostEventData;
     801             :     }
     802             : 
     803             :     return nEventId;
     804             : }
     805             : 
     806             : ImplSVEvent * Application::PostScrollEvent( sal_uLong nEvent, vcl::Window *pWin, ScrollEvent* pScrollEvent )
     807             : {
     808             :     const SolarMutexGuard aGuard;
     809             :     ImplSVEvent * nEventId = 0;
     810             : 
     811             :     if( pWin && pScrollEvent )
     812             :     {
     813             :         ImplPostEventData* pPostEventData = new ImplPostEventData( nEvent, pWin, *pScrollEvent );
     814             : 
     815             :         nEventId = PostUserEvent(
     816             :                        STATIC_LINK( NULL, Application, PostEventHandler ),
     817             :                        pPostEventData );
     818             : 
     819             :         if( nEventId )
     820             :         {
     821             :             pPostEventData->mnEventId = nEventId;
     822             :             aPostedEventList.push_back( ImplPostEventPair( pWin, pPostEventData ) );
     823             :         }
     824             :         else
     825             :             delete pPostEventData;
     826             :     }
     827             : 
     828             :     return nEventId;
     829             : }
     830             : 
     831             : #endif // !HAVE_FEATURE_DESKTOP
     832             : 
     833           0 : IMPL_STATIC_LINK_NOINSTANCE( Application, PostEventHandler, void*, pCallData )
     834             : {
     835           0 :     const SolarMutexGuard aGuard;
     836           0 :     ImplPostEventData*  pData = static_cast< ImplPostEventData * >( pCallData );
     837             :     const void*         pEventData;
     838             :     sal_uLong               nEvent;
     839           0 :     ImplSVEvent * const nEventId = pData->mnEventId;
     840             : 
     841           0 :     switch( pData->mnEvent )
     842             :     {
     843             :         case VCLEVENT_WINDOW_MOUSEMOVE:
     844           0 :             nEvent = SALEVENT_EXTERNALMOUSEMOVE;
     845           0 :             pEventData = &pData->maMouseEvent;
     846           0 :         break;
     847             : 
     848             :         case VCLEVENT_WINDOW_MOUSEBUTTONDOWN:
     849           0 :             nEvent = SALEVENT_EXTERNALMOUSEBUTTONDOWN;
     850           0 :             pEventData = &pData->maMouseEvent;
     851           0 :         break;
     852             : 
     853             :         case VCLEVENT_WINDOW_MOUSEBUTTONUP:
     854           0 :             nEvent = SALEVENT_EXTERNALMOUSEBUTTONUP;
     855           0 :             pEventData = &pData->maMouseEvent;
     856           0 :         break;
     857             : 
     858             :         case VCLEVENT_WINDOW_KEYINPUT:
     859           0 :             nEvent = SALEVENT_EXTERNALKEYINPUT;
     860           0 :             pEventData = &pData->maKeyEvent;
     861           0 :         break;
     862             : 
     863             :         case VCLEVENT_WINDOW_KEYUP:
     864           0 :             nEvent = SALEVENT_EXTERNALKEYUP;
     865           0 :             pEventData = &pData->maKeyEvent;
     866           0 :         break;
     867             : 
     868             :         case VCLEVENT_WINDOW_ZOOM:
     869           0 :             nEvent = SALEVENT_EXTERNALZOOM;
     870           0 :             pEventData = &pData->maZoomEvent;
     871           0 :         break;
     872             : 
     873             :         case VCLEVENT_WINDOW_SCROLL:
     874           0 :             nEvent = SALEVENT_EXTERNALSCROLL;
     875           0 :             pEventData = &pData->maScrollEvent;
     876           0 :         break;
     877             : 
     878             :         default:
     879           0 :             nEvent = 0;
     880           0 :             pEventData = NULL;
     881           0 :         break;
     882             :     };
     883             : 
     884           0 :     if( pData->mpWin && pData->mpWin->mpWindowImpl->mpFrameWindow && pEventData )
     885           0 :         ImplWindowFrameProc( pData->mpWin->mpWindowImpl->mpFrameWindow, NULL, (sal_uInt16) nEvent, pEventData );
     886             : 
     887             :     // remove this event from list of posted events, watch for destruction of internal data
     888           0 :     ::std::list< ImplPostEventPair >::iterator aIter( aPostedEventList.begin() );
     889             : 
     890           0 :     while( aIter != aPostedEventList.end() )
     891             :     {
     892           0 :         if( nEventId == (*aIter).second->mnEventId )
     893             :         {
     894           0 :             delete (*aIter).second;
     895           0 :             aIter = aPostedEventList.erase( aIter );
     896             :         }
     897             :         else
     898           0 :             ++aIter;
     899             :     }
     900             : 
     901           0 :     return 0;
     902             : }
     903             : 
     904      442826 : void Application::RemoveMouseAndKeyEvents( vcl::Window* pWin )
     905             : {
     906      442826 :     const SolarMutexGuard aGuard;
     907             : 
     908             :     // remove all events for specific window, watch for destruction of internal data
     909      442826 :     ::std::list< ImplPostEventPair >::iterator aIter( aPostedEventList.begin() );
     910             : 
     911      885652 :     while( aIter != aPostedEventList.end() )
     912             :     {
     913           0 :         if( pWin == (*aIter).first )
     914             :         {
     915           0 :             if( (*aIter).second->mnEventId )
     916           0 :                 RemoveUserEvent( (*aIter).second->mnEventId );
     917             : 
     918           0 :             delete (*aIter).second;
     919           0 :             aIter = aPostedEventList.erase( aIter );
     920             :         }
     921             :         else
     922           0 :             ++aIter;
     923      442826 :     }
     924      442826 : }
     925             : 
     926       83552 : ImplSVEvent * Application::PostUserEvent( const Link& rLink, void* pCaller )
     927             : {
     928       83552 :     ImplSVEvent* pSVEvent = new ImplSVEvent;
     929       83552 :     pSVEvent->mpData    = pCaller;
     930       83552 :     pSVEvent->mpLink    = new Link( rLink );
     931       83552 :     pSVEvent->mpWindow  = NULL;
     932       83552 :     pSVEvent->mbCall    = true;
     933       83552 :     vcl::Window* pDefWindow = ImplGetDefaultWindow();
     934       83552 :     if ( pDefWindow == 0 || !pDefWindow->ImplGetFrame()->PostEvent( pSVEvent ) )
     935             :     {
     936           0 :         delete pSVEvent->mpLink;
     937           0 :         delete pSVEvent;
     938           0 :         pSVEvent = 0;
     939             :     }
     940       83552 :     return pSVEvent;
     941             : }
     942             : 
     943       50610 : void Application::RemoveUserEvent( ImplSVEvent * nUserEvent )
     944             : {
     945       50610 :     if(nUserEvent)
     946             :     {
     947             :         DBG_ASSERT( !nUserEvent->mpWindow,
     948             :                     "Application::RemoveUserEvent(): Event is send to a window" );
     949             :         DBG_ASSERT( nUserEvent->mbCall,
     950             :                     "Application::RemoveUserEvent(): Event is already removed" );
     951             : 
     952       50610 :         if ( nUserEvent->mpWindow )
     953             :         {
     954           0 :             if( ! nUserEvent->maDelData.IsDead() )
     955           0 :                 nUserEvent->mpWindow->ImplRemoveDel( &(nUserEvent->maDelData) );
     956           0 :             nUserEvent->mpWindow = NULL;
     957             :         }
     958             : 
     959       50610 :         nUserEvent->mbCall = false;
     960             :     }
     961       50610 : }
     962             : 
     963      137959 : bool Application::InsertIdleHdl( const Link& rLink, sal_uInt16 nPrio )
     964             : {
     965      137959 :     ImplSVData* pSVData = ImplGetSVData();
     966             : 
     967             :     // create if does not exist
     968      137959 :     if ( !pSVData->maAppData.mpIdleMgr )
     969         108 :         pSVData->maAppData.mpIdleMgr = new ImplIdleMgr;
     970             : 
     971      137959 :     return pSVData->maAppData.mpIdleMgr->InsertIdleHdl( rLink, nPrio );
     972             : }
     973             : 
     974      137957 : void Application::RemoveIdleHdl( const Link& rLink )
     975             : {
     976      137957 :     ImplSVData* pSVData = ImplGetSVData();
     977             : 
     978      137957 :     if ( pSVData->maAppData.mpIdleMgr )
     979      137957 :         pSVData->maAppData.mpIdleMgr->RemoveIdleHdl( rLink );
     980      137957 : }
     981             : 
     982           0 : void Application::EnableNoYieldMode()
     983             : {
     984           0 :     ImplSVData* pSVData = ImplGetSVData();
     985           0 :     pSVData->maAppData.mbNoYield = true;
     986           0 : }
     987             : 
     988           0 : void Application::DisableNoYieldMode()
     989             : {
     990           0 :     ImplSVData* pSVData = ImplGetSVData();
     991           0 :     pSVData->maAppData.mbNoYield = false;
     992           0 : }
     993             : 
     994           0 : void Application::AddPostYieldListener( const Link& i_rListener )
     995             : {
     996           0 :     ImplSVData* pSVData = ImplGetSVData();
     997           0 :     if( ! pSVData->maAppData.mpPostYieldListeners )
     998           0 :         pSVData->maAppData.mpPostYieldListeners = new VclEventListeners2();
     999           0 :     pSVData->maAppData.mpPostYieldListeners->addListener( i_rListener );
    1000           0 : }
    1001             : 
    1002           0 : void Application::RemovePostYieldListener( const Link& i_rListener )
    1003             : {
    1004           0 :     ImplSVData* pSVData = ImplGetSVData();
    1005           0 :     if( pSVData->maAppData.mpPostYieldListeners )
    1006           0 :         pSVData->maAppData.mpPostYieldListeners->removeListener( i_rListener );
    1007           0 : }
    1008             : 
    1009           0 : WorkWindow* Application::GetAppWindow()
    1010             : {
    1011           0 :     return ImplGetSVData()->maWinData.mpAppWin;
    1012             : }
    1013             : 
    1014      149100 : vcl::Window* Application::GetFocusWindow()
    1015             : {
    1016      149100 :     return ImplGetSVData()->maWinData.mpFocusWin;
    1017             : }
    1018             : 
    1019      472108 : OutputDevice* Application::GetDefaultDevice()
    1020             : {
    1021      472108 :     return ImplGetDefaultWindow();
    1022             : }
    1023             : 
    1024         126 : vcl::Window* Application::GetFirstTopLevelWindow()
    1025             : {
    1026         126 :     ImplSVData* pSVData = ImplGetSVData();
    1027         126 :     return pSVData->maWinData.mpFirstFrame;
    1028             : }
    1029             : 
    1030           0 : vcl::Window* Application::GetNextTopLevelWindow( vcl::Window* pWindow )
    1031             : {
    1032           0 :     return pWindow->mpWindowImpl->mpFrameData->mpNextFrame;
    1033             : }
    1034             : 
    1035           0 : long    Application::GetTopWindowCount()
    1036             : {
    1037           0 :     long nRet = 0;
    1038           0 :     ImplSVData* pSVData = ImplGetSVData();
    1039           0 :     vcl::Window *pWin = pSVData ? pSVData->maWinData.mpFirstFrame : NULL;
    1040           0 :     while( pWin )
    1041             :     {
    1042           0 :         if( pWin->ImplGetWindow()->IsTopWindow() )
    1043           0 :             nRet++;
    1044           0 :         pWin = pWin->mpWindowImpl->mpFrameData->mpNextFrame;
    1045             :     }
    1046           0 :     return nRet;
    1047             : }
    1048             : 
    1049           0 : vcl::Window* Application::GetTopWindow( long nIndex )
    1050             : {
    1051           0 :     long nIdx = 0;
    1052           0 :     ImplSVData* pSVData = ImplGetSVData();
    1053           0 :     vcl::Window *pWin = pSVData ? pSVData->maWinData.mpFirstFrame : NULL;
    1054           0 :     while( pWin )
    1055             :     {
    1056           0 :         if( pWin->ImplGetWindow()->IsTopWindow() )
    1057             :         {
    1058           0 :             if( nIdx == nIndex )
    1059           0 :                 return pWin->ImplGetWindow();
    1060             :             else
    1061           0 :                 nIdx++;
    1062             :         }
    1063           0 :         pWin = pWin->mpWindowImpl->mpFrameData->mpNextFrame;
    1064             :     }
    1065           0 :     return NULL;
    1066             : }
    1067             : 
    1068         160 : vcl::Window* Application::GetActiveTopWindow()
    1069             : {
    1070         160 :     vcl::Window *pWin = ImplGetSVData()->maWinData.mpFocusWin;
    1071         352 :     while( pWin )
    1072             :     {
    1073          66 :         if( pWin->IsTopWindow() )
    1074          34 :             return pWin;
    1075          32 :         pWin = pWin->mpWindowImpl->mpParent;
    1076             :     }
    1077         126 :     return NULL;
    1078             : }
    1079             : 
    1080         160 : void Application::SetAppName( const OUString& rUniqueName )
    1081             : {
    1082         160 :     ImplSVData* pSVData = ImplGetSVData();
    1083             : 
    1084             :     // create if does not exist
    1085         160 :     if ( !pSVData->maAppData.mpAppName )
    1086         160 :         pSVData->maAppData.mpAppName = new OUString( rUniqueName );
    1087             :     else
    1088           0 :         *(pSVData->maAppData.mpAppName) = rUniqueName;
    1089         160 : }
    1090             : 
    1091         178 : OUString Application::GetAppName()
    1092             : {
    1093         178 :     ImplSVData* pSVData = ImplGetSVData();
    1094         178 :     if ( pSVData->maAppData.mpAppName )
    1095          66 :         return *(pSVData->maAppData.mpAppName);
    1096             :     else
    1097         112 :         return OUString();
    1098             : }
    1099             : 
    1100         160 : void Application::SetDisplayName( const OUString& rName )
    1101             : {
    1102         160 :     ImplSVData* pSVData = ImplGetSVData();
    1103             : 
    1104             :     // create if does not exist
    1105         160 :     if ( !pSVData->maAppData.mpDisplayName )
    1106         160 :         pSVData->maAppData.mpDisplayName = new OUString( rName );
    1107             :     else
    1108           0 :         *(pSVData->maAppData.mpDisplayName) = rName;
    1109         160 : }
    1110             : 
    1111           0 : OUString Application::GetDisplayName()
    1112             : {
    1113           0 :     ImplSVData* pSVData = ImplGetSVData();
    1114           0 :     if ( pSVData->maAppData.mpDisplayName )
    1115           0 :         return *(pSVData->maAppData.mpDisplayName);
    1116           0 :     else if ( pSVData->maWinData.mpAppWin )
    1117           0 :         return pSVData->maWinData.mpAppWin->GetText();
    1118             :     else
    1119           0 :         return OUString("");
    1120             : }
    1121             : 
    1122       11248 : unsigned int Application::GetScreenCount()
    1123             : {
    1124       11248 :     SalSystem* pSys = ImplGetSalSystem();
    1125       11248 :     return pSys ? pSys->GetDisplayScreenCount() : 0;
    1126             : }
    1127             : 
    1128       11204 : bool Application::IsUnifiedDisplay()
    1129             : {
    1130       11204 :     SalSystem* pSys = ImplGetSalSystem();
    1131       11204 :     return pSys ? pSys->IsUnifiedDisplay() : true;
    1132             : }
    1133             : 
    1134           6 : unsigned int Application::GetDisplayBuiltInScreen()
    1135             : {
    1136           6 :     SalSystem* pSys = ImplGetSalSystem();
    1137           6 :     return pSys ? pSys->GetDisplayBuiltInScreen() : 0;
    1138             : }
    1139             : 
    1140           0 : unsigned int Application::GetDisplayExternalScreen()
    1141             : {
    1142             :     // This is really unpleasant, in theory we could have multiple
    1143             :     // external displays etc.
    1144           0 :     int nExternal(0);
    1145           0 :     switch (GetDisplayBuiltInScreen())
    1146             :     {
    1147             :     case 0:
    1148           0 :         nExternal = 1;
    1149           0 :         break;
    1150             :     case 1:
    1151           0 :         nExternal = 0;
    1152           0 :         break;
    1153             :     default:
    1154             :         // When the built-in display is neither 0 nor 1
    1155             :         // then place the full-screen presentation on the
    1156             :         // first available screen.
    1157           0 :         nExternal = 0;
    1158           0 :         break;
    1159             :     }
    1160           0 :     return nExternal;
    1161             : }
    1162             : 
    1163       11226 : Rectangle Application::GetScreenPosSizePixel( unsigned int nScreen )
    1164             : {
    1165       11226 :     SalSystem* pSys = ImplGetSalSystem();
    1166       11226 :     return pSys ? pSys->GetDisplayScreenPosSizePixel( nScreen ) : Rectangle();
    1167             : }
    1168             : 
    1169             : namespace {
    1170           0 : unsigned long calcDistSquare( const Point& i_rPoint, const Rectangle& i_rRect )
    1171             : {
    1172           0 :     const Point aRectCenter( (i_rRect.Left() + i_rRect.Right())/2,
    1173           0 :                        (i_rRect.Top() + i_rRect.Bottom())/ 2 );
    1174           0 :     const long nDX = aRectCenter.X() - i_rPoint.X();
    1175           0 :     const long nDY = aRectCenter.Y() - i_rPoint.Y();
    1176           0 :     return nDX*nDX + nDY*nDY;
    1177             : }
    1178             : }
    1179             : 
    1180           0 : unsigned int Application::GetBestScreen( const Rectangle& i_rRect )
    1181             : {
    1182           0 :     if( !IsUnifiedDisplay() )
    1183           0 :         return GetDisplayBuiltInScreen();
    1184             : 
    1185           0 :     const unsigned int nScreens = GetScreenCount();
    1186           0 :     unsigned int nBestMatchScreen = 0;
    1187           0 :     unsigned long nOverlap = 0;
    1188           0 :     for( unsigned int i = 0; i < nScreens; i++ )
    1189             :     {
    1190           0 :         const Rectangle aCurScreenRect( GetScreenPosSizePixel( i ) );
    1191             :         // if a screen contains the rectangle completely it is obviously the best screen
    1192           0 :         if( aCurScreenRect.IsInside( i_rRect ) )
    1193           0 :             return i;
    1194             :         // next the screen which contains most of the area of the rect is the best
    1195           0 :         Rectangle aIntersection( aCurScreenRect.GetIntersection( i_rRect ) );
    1196           0 :         if( ! aIntersection.IsEmpty() )
    1197             :         {
    1198           0 :             const unsigned long nCurOverlap( aIntersection.GetWidth() * aIntersection.GetHeight() );
    1199           0 :             if( nCurOverlap > nOverlap )
    1200             :             {
    1201           0 :                 nOverlap = nCurOverlap;
    1202           0 :                 nBestMatchScreen = i;
    1203             :             }
    1204             :         }
    1205             :     }
    1206           0 :     if( nOverlap > 0 )
    1207           0 :         return nBestMatchScreen;
    1208             : 
    1209             :     // finally the screen which center is nearest to the rect is the best
    1210           0 :     const Point aCenter( (i_rRect.Left() + i_rRect.Right())/2,
    1211           0 :                          (i_rRect.Top() + i_rRect.Bottom())/2 );
    1212           0 :     unsigned long nDist = ULONG_MAX;
    1213           0 :     for( unsigned int i = 0; i < nScreens; i++ )
    1214             :     {
    1215           0 :         const Rectangle aCurScreenRect( GetScreenPosSizePixel( i ) );
    1216           0 :         const unsigned long nCurDist( calcDistSquare( aCenter, aCurScreenRect ) );
    1217           0 :         if( nCurDist < nDist )
    1218             :         {
    1219           0 :             nBestMatchScreen = i;
    1220           0 :             nDist = nCurDist;
    1221             :         }
    1222             :     }
    1223           0 :     return nBestMatchScreen;
    1224             : }
    1225             : 
    1226           0 : bool Application::InsertAccel( Accelerator* pAccel )
    1227             : {
    1228           0 :     ImplSVData* pSVData = ImplGetSVData();
    1229             : 
    1230           0 :     if ( !pSVData->maAppData.mpAccelMgr )
    1231           0 :         pSVData->maAppData.mpAccelMgr = new ImplAccelManager();
    1232           0 :     return pSVData->maAppData.mpAccelMgr->InsertAccel( pAccel );
    1233             : }
    1234             : 
    1235           0 : void Application::RemoveAccel( Accelerator* pAccel )
    1236             : {
    1237           0 :     ImplSVData* pSVData = ImplGetSVData();
    1238             : 
    1239           0 :     if ( pSVData->maAppData.mpAccelMgr )
    1240           0 :         pSVData->maAppData.mpAccelMgr->RemoveAccel( pAccel );
    1241           0 : }
    1242             : 
    1243         471 : void Application::SetHelp( Help* pHelp )
    1244             : {
    1245         471 :     ImplGetSVData()->maAppData.mpHelp = pHelp;
    1246         471 : }
    1247             : 
    1248        4922 : Help* Application::GetHelp()
    1249             : {
    1250        4922 :     return ImplGetSVData()->maAppData.mpHelp;
    1251             : }
    1252             : 
    1253         303 : void Application::EnableAutoHelpId( bool bEnabled )
    1254             : {
    1255         303 :     ImplGetSVData()->maHelpData.mbAutoHelpId = bEnabled;
    1256         303 : }
    1257             : 
    1258       10002 : bool Application::IsAutoHelpIdEnabled()
    1259             : {
    1260       10002 :     return ImplGetSVData()->maHelpData.mbAutoHelpId;
    1261             : }
    1262             : 
    1263         303 : void Application::EnableAutoMnemonic( bool bEnabled )
    1264             : {
    1265         303 :     AllSettings aSettings = GetSettings();
    1266         606 :     StyleSettings aStyle = aSettings.GetStyleSettings();
    1267         303 :     aStyle.SetAutoMnemonic( bEnabled );
    1268         303 :     aSettings.SetStyleSettings( aStyle );
    1269         606 :     SetSettings( aSettings );
    1270         303 : }
    1271             : 
    1272           0 : bool Application::IsAutoMnemonicEnabled()
    1273             : {
    1274           0 :     return GetSettings().GetStyleSettings().GetAutoMnemonic();
    1275             : }
    1276             : 
    1277         303 : void Application::SetDialogScaleX( short nScale )
    1278             : {
    1279         303 :     ImplSVData* pSVData = ImplGetSVData();
    1280         303 :     pSVData->maAppData.mnDialogScaleX = nScale;
    1281         303 :     pSVData->maGDIData.mnAppFontX = pSVData->maGDIData.mnRealAppFontX;
    1282         303 :     if ( nScale )
    1283         303 :         pSVData->maGDIData.mnAppFontX += (pSVData->maGDIData.mnAppFontX*nScale)/100;
    1284         303 : }
    1285             : 
    1286           0 : void Application::SetDefDialogParent( vcl::Window* pWindow )
    1287             : {
    1288           0 :     ImplGetSVData()->maWinData.mpDefDialogParent = pWindow;
    1289           0 : }
    1290             : 
    1291      437358 : vcl::Window* Application::GetDefDialogParent()
    1292             : {
    1293      437358 :     ImplSVData* pSVData = ImplGetSVData();
    1294             :     // #103442# find some useful dialog parent if there
    1295             :     // was no default set
    1296             :     // NOTE: currently even the default is not used
    1297             :     if( false && pSVData->maWinData.mpDefDialogParent != NULL )
    1298             :         return pSVData->maWinData.mpDefDialogParent;
    1299             :     else
    1300             :     {
    1301             :         // always use the topmost parent of the candidate
    1302             :         // window to avoid using dialogs or floaters
    1303             :         // as DefDialogParent
    1304             : 
    1305             :         // current focus frame
    1306      437358 :         vcl::Window *pWin = NULL;
    1307      437358 :         if( (pWin = pSVData->maWinData.mpFocusWin) != NULL )
    1308             :         {
    1309      844184 :             while( pWin->mpWindowImpl && pWin->mpWindowImpl->mpParent )
    1310      444374 :                 pWin = pWin->mpWindowImpl->mpParent;
    1311             : 
    1312             :             // check for corrupted window hierarchy, #122232#, may be we now crash somewhere else
    1313      199905 :             if( !pWin->mpWindowImpl )
    1314             :             {
    1315             :                 OSL_FAIL( "Window hierarchy corrupted!" );
    1316           0 :                 pSVData->maWinData.mpFocusWin = NULL;   // avoid further access
    1317           0 :                 return NULL;
    1318             :             }
    1319             : 
    1320      199905 :             if( (pWin->mpWindowImpl->mnStyle & WB_INTROWIN) == 0 )
    1321             :             {
    1322      199905 :                 return pWin->mpWindowImpl->mpFrameWindow->ImplGetWindow();
    1323             :             }
    1324             :         }
    1325             :         // last active application frame
    1326      237453 :         if( NULL != (pWin = pSVData->maWinData.mpActiveApplicationFrame) )
    1327             :         {
    1328          12 :             return pWin->mpWindowImpl->mpFrameWindow->ImplGetWindow();
    1329             :         }
    1330             :         else
    1331             :         {
    1332             :             // first visible top window (may be totally wrong....)
    1333      237441 :             pWin = pSVData->maWinData.mpFirstFrame;
    1334     1335559 :             while( pWin )
    1335             :             {
    1336     2711334 :                 if( pWin->ImplGetWindow()->IsTopWindow() &&
    1337      958473 :                     pWin->mpWindowImpl->mbReallyVisible &&
    1338       48898 :                     (pWin->mpWindowImpl->mnStyle & WB_INTROWIN) == 0
    1339             :                 )
    1340             :                 {
    1341       97796 :                     while( pWin->mpWindowImpl->mpParent )
    1342           0 :                         pWin = pWin->mpWindowImpl->mpParent;
    1343       48898 :                     return pWin->mpWindowImpl->mpFrameWindow->ImplGetWindow();
    1344             :                 }
    1345      860677 :                 pWin = pWin->mpWindowImpl->mpFrameData->mpNextFrame;
    1346             :             }
    1347             :             // use the desktop
    1348      188543 :             return NULL;
    1349             :         }
    1350             :     }
    1351             : }
    1352             : 
    1353        5568 : Application::DialogCancelMode Application::GetDialogCancelMode()
    1354             : {
    1355        5568 :     return ImplGetSVData()->maAppData.meDialogCancel;
    1356             : }
    1357             : 
    1358       11492 : void Application::SetDialogCancelMode( DialogCancelMode mode )
    1359             : {
    1360       11492 :     ImplGetSVData()->maAppData.meDialogCancel = mode;
    1361       11492 : }
    1362             : 
    1363      346426 : bool Application::IsDialogCancelEnabled()
    1364             : {
    1365      346426 :     return ImplGetSVData()->maAppData.meDialogCancel != DIALOG_CANCEL_OFF;
    1366             : }
    1367             : 
    1368       22092 : void Application::SetSystemWindowMode( sal_uInt16 nMode )
    1369             : {
    1370       22092 :     ImplGetSVData()->maAppData.mnSysWinMode = nMode;
    1371       22092 : }
    1372             : 
    1373       11012 : sal_uInt16 Application::GetSystemWindowMode()
    1374             : {
    1375       11012 :     return ImplGetSVData()->maAppData.mnSysWinMode;
    1376             : }
    1377             : 
    1378         727 : ::com::sun::star::uno::Reference< ::com::sun::star::awt::XToolkit > Application::GetVCLToolkit()
    1379             : {
    1380         727 :     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XToolkit > xT;
    1381         727 :     UnoWrapperBase* pWrapper = Application::GetUnoWrapper( true );
    1382         727 :     if ( pWrapper )
    1383         727 :         xT = pWrapper->GetVCLToolkit();
    1384         727 :     return xT;
    1385             : }
    1386             : 
    1387             : #ifdef DISABLE_DYNLOADING
    1388             : 
    1389             : extern "C" { UnoWrapperBase* CreateUnoWrapper(); }
    1390             : 
    1391             : #else
    1392             : 
    1393           0 : extern "C" { static void SAL_CALL thisModule() {} }
    1394             : 
    1395             : #endif
    1396             : 
    1397      593287 : UnoWrapperBase* Application::GetUnoWrapper( bool bCreateIfNotExist )
    1398             : {
    1399      593287 :     ImplSVData* pSVData = ImplGetSVData();
    1400             :     static bool bAlreadyTriedToCreate = false;
    1401      593287 :     if ( !pSVData->mpUnoWrapper && bCreateIfNotExist && !bAlreadyTriedToCreate )
    1402             :     {
    1403             : #ifndef DISABLE_DYNLOADING
    1404         182 :         osl::Module aTkLib;
    1405         364 :         OUString aLibName(TK_DLL_NAME);
    1406         182 :         aTkLib.loadRelative(&thisModule, aLibName, SAL_LOADMODULE_DEFAULT);
    1407         182 :         if (aTkLib.is())
    1408             :         {
    1409         182 :             FN_TkCreateUnoWrapper fnCreateWrapper = (FN_TkCreateUnoWrapper)aTkLib.getFunctionSymbol("CreateUnoWrapper");
    1410         182 :             if ( fnCreateWrapper )
    1411             :             {
    1412         182 :                 pSVData->mpUnoWrapper = fnCreateWrapper();
    1413             :             }
    1414         182 :             aTkLib.release();
    1415             :         }
    1416             :         DBG_ASSERT( pSVData->mpUnoWrapper, "UnoWrapper could not be created!" );
    1417             : #else
    1418             :         pSVData->mpUnoWrapper = CreateUnoWrapper();
    1419             : #endif
    1420         364 :         bAlreadyTriedToCreate = true;
    1421             :     }
    1422      593287 :     return pSVData->mpUnoWrapper;
    1423             : }
    1424             : 
    1425           0 : void Application::SetUnoWrapper( UnoWrapperBase* pWrapper )
    1426             : {
    1427           0 :     ImplSVData* pSVData = ImplGetSVData();
    1428             :     DBG_ASSERT( !pSVData->mpUnoWrapper, "SetUnoWrapper: Wrapper already exists" );
    1429           0 :     pSVData->mpUnoWrapper = pWrapper;
    1430           0 : }
    1431             : 
    1432       30616 : ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDisplayConnection > Application::GetDisplayConnection()
    1433             : {
    1434       30616 :     ImplSVData* pSVData = ImplGetSVData();
    1435             : 
    1436       30616 :     if( !pSVData->mxDisplayConnection.is() )
    1437             :     {
    1438         164 :         pSVData->mxDisplayConnection.set( new ::vcl::DisplayConnection );
    1439         164 :         pSVData->mxDisplayConnection->start();
    1440             :     }
    1441             : 
    1442       30616 :     return pSVData->mxDisplayConnection.get();
    1443             : }
    1444             : 
    1445        4726 : void Application::SetFilterHdl( const Link& rLink )
    1446             : {
    1447        4726 :     ImplGetSVData()->maGDIData.mpGrfConverter->SetFilterHdl( rLink );
    1448        4726 : }
    1449             : 
    1450           0 : bool ImplCallHotKey( const vcl::KeyCode& rKeyCode )
    1451             : {
    1452           0 :     ImplSVData*     pSVData = ImplGetSVData();
    1453           0 :     ImplHotKey*     pHotKeyData = pSVData->maAppData.mpFirstHotKey;
    1454           0 :     while ( pHotKeyData )
    1455             :     {
    1456           0 :         if ( pHotKeyData->maKeyCode == rKeyCode )
    1457             :         {
    1458           0 :             pHotKeyData->maLink.Call( pHotKeyData->mpUserData );
    1459           0 :             return true;
    1460             :         }
    1461             : 
    1462           0 :         pHotKeyData = pHotKeyData->mpNext;
    1463             :     }
    1464             : 
    1465           0 :     return false;
    1466             : }
    1467             : 
    1468           0 : void ImplFreeHotKeyData()
    1469             : {
    1470           0 :     ImplSVData*     pSVData = ImplGetSVData();
    1471             :     ImplHotKey*     pTempHotKeyData;
    1472           0 :     ImplHotKey*     pHotKeyData = pSVData->maAppData.mpFirstHotKey;
    1473           0 :     while ( pHotKeyData )
    1474             :     {
    1475           0 :         pTempHotKeyData = pHotKeyData->mpNext;
    1476           0 :         delete pHotKeyData;
    1477           0 :         pHotKeyData = pTempHotKeyData;
    1478             :     }
    1479             : 
    1480           0 :     pSVData->maAppData.mpFirstHotKey = NULL;
    1481           0 : }
    1482             : 
    1483           0 : void ImplFreeEventHookData()
    1484             : {
    1485           0 :     ImplSVData*     pSVData = ImplGetSVData();
    1486             :     ImplEventHook*  pTempEventHookData;
    1487           0 :     ImplEventHook*  pEventHookData = pSVData->maAppData.mpFirstEventHook;
    1488           0 :     while ( pEventHookData )
    1489             :     {
    1490           0 :         pTempEventHookData = pEventHookData->mpNext;
    1491           0 :         delete pEventHookData;
    1492           0 :         pEventHookData = pTempEventHookData;
    1493             :     }
    1494             : 
    1495           0 :     pSVData->maAppData.mpFirstEventHook = NULL;
    1496           0 : }
    1497             : 
    1498       55889 : long Application::CallEventHooks( NotifyEvent& rEvt )
    1499             : {
    1500       55889 :     ImplSVData*     pSVData = ImplGetSVData();
    1501       55889 :     long            nRet = 0;
    1502             :     ImplEventHook*  pTempEventHookData;
    1503       55889 :     ImplEventHook*  pEventHookData = pSVData->maAppData.mpFirstEventHook;
    1504      111778 :     while ( pEventHookData )
    1505             :     {
    1506           0 :         pTempEventHookData = pEventHookData->mpNext;
    1507           0 :         nRet = pEventHookData->mpProc( rEvt, pEventHookData->mpUserData );
    1508           0 :         if ( nRet )
    1509           0 :             break;
    1510           0 :         pEventHookData = pTempEventHookData;
    1511             :     }
    1512             : 
    1513       55889 :     return nRet;
    1514             : }
    1515             : 
    1516           0 : const LocaleDataWrapper& Application::GetAppLocaleDataWrapper()
    1517             : {
    1518           0 :     return GetSettings().GetLocaleDataWrapper();
    1519             : }
    1520             : 
    1521         356 : void Application::EnableHeadlessMode( bool dialogsAreFatal )
    1522             : {
    1523             :     SetDialogCancelMode(
    1524         356 :         dialogsAreFatal ? DIALOG_CANCEL_FATAL : DIALOG_CANCEL_SILENT );
    1525         356 : }
    1526             : 
    1527      346426 : bool Application::IsHeadlessModeEnabled()
    1528             : {
    1529      346426 :     return IsDialogCancelEnabled();
    1530             : }
    1531             : 
    1532         627 : bool Application::IsHeadlessModeRequested()
    1533             : {
    1534         627 :     sal_uInt32 n = rtl_getAppCommandArgCount();
    1535        1844 :     for (sal_uInt32 i = 0; i < n; ++i) {
    1536        1807 :         OUString arg;
    1537        1807 :         rtl_getAppCommandArg(i, &arg.pData);
    1538        1807 :         if ( arg == "--headless" || arg == "-headless" ) {
    1539         590 :             return true;
    1540             :         }
    1541        1217 :     }
    1542          37 :     return false;
    1543             : }
    1544             : 
    1545             : static bool bConsoleOnly = false;
    1546             : 
    1547         171 : bool Application::IsConsoleOnly()
    1548             : {
    1549         171 :     return bConsoleOnly;
    1550             : }
    1551             : 
    1552          11 : void Application::EnableConsoleOnly()
    1553             : {
    1554          11 :     bConsoleOnly = true;
    1555          11 : }
    1556             : 
    1557           0 : void Application::ShowNativeErrorBox(const OUString& sTitle  ,
    1558             :                                      const OUString& sMessage)
    1559             : {
    1560           0 :     int btn = ImplGetSalSystem()->ShowNativeMessageBox (
    1561             :             sTitle,
    1562             :             sMessage,
    1563             :             SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK,
    1564           0 :             SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK, false);
    1565             :     if (btn != SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK) {
    1566             :         OSL_TRACE("ShowNativeMessageBox returned %d", btn);
    1567             :     }
    1568           0 : }
    1569             : 
    1570         313 : bool Application::CanToggleImeStatusWindow()
    1571             : {
    1572         313 :     ImplSVData* pSVData = ImplGetSVData();
    1573         313 :     if( ! pSVData->mpImeStatus )
    1574         303 :         pSVData->mpImeStatus  = pSVData->mpDefInst->CreateI18NImeStatus();
    1575         313 :     return pSVData->mpImeStatus->canToggle();
    1576             : }
    1577             : 
    1578           0 : void Application::ShowImeStatusWindow(bool bShow)
    1579             : {
    1580           0 :     ImplGetSVData()->maAppData.meShowImeStatusWindow = bShow
    1581             :         ? ImplSVAppData::ImeStatusWindowMode_SHOW
    1582           0 :         : ImplSVAppData::ImeStatusWindowMode_HIDE;
    1583             : 
    1584           0 :     ImplSVData* pSVData = ImplGetSVData();
    1585           0 :     if( ! pSVData->mpImeStatus )
    1586           0 :         pSVData->mpImeStatus  = pSVData->mpDefInst->CreateI18NImeStatus();
    1587           0 :     pSVData->mpImeStatus->toggle();
    1588           0 : }
    1589             : 
    1590           0 : bool Application::GetShowImeStatusWindowDefault()
    1591             : {
    1592             :     rtl_TextEncodingInfo aInfo;
    1593           0 :     aInfo.StructSize = sizeof aInfo;
    1594           0 :     return rtl_getTextEncodingInfo(osl_getThreadTextEncoding(), &aInfo)
    1595           0 :         && aInfo.MaximumCharSize > 1;
    1596             : }
    1597             : 
    1598         726 : const OUString& Application::GetDesktopEnvironment()
    1599             : {
    1600         726 :     if (IsHeadlessModeEnabled())
    1601             :     {
    1602         714 :         static OUString aNone("none");
    1603         714 :         return aNone;
    1604             :     }
    1605             :     else
    1606          12 :         return SalGetDesktopEnvironment();
    1607             : }
    1608             : 
    1609       10246 : void Application::AddToRecentDocumentList(const OUString& rFileUrl, const OUString& rMimeType, const OUString& rDocumentService)
    1610             : {
    1611       10246 :     ImplSVData* pSVData = ImplGetSVData();
    1612       10246 :     pSVData->mpDefInst->AddToRecentDocumentList(rFileUrl, rMimeType, rDocumentService);
    1613       10246 : }
    1614             : 
    1615           0 : bool InitAccessBridge()
    1616             : {
    1617             : // Disable MSAA bridge on UNIX
    1618             : #if defined UNX
    1619           0 :     return true;
    1620             : #else
    1621             :     bool bRet = ImplInitAccessBridge();
    1622             : 
    1623             :     if( !bRet )
    1624             :     {
    1625             :         // disable accessibility if the user chooses to continue
    1626             :         AllSettings aSettings = Application::GetSettings();
    1627             :         MiscSettings aMisc = aSettings.GetMiscSettings();
    1628             :         aMisc.SetEnableATToolSupport( false );
    1629             :         aSettings.SetMiscSettings( aMisc );
    1630             :         Application::SetSettings( aSettings );
    1631             :     }
    1632             :     return bRet;
    1633             : #endif // !UNX
    1634             : }
    1635             : 
    1636             : // MT: AppEvent was in oldsv.cxx, but is still needed...
    1637           0 : void Application::AppEvent( const ApplicationEvent& /*rAppEvent*/ )
    1638             : {
    1639           0 : }
    1640             : 
    1641           0 : bool Application::hasNativeFileSelection()
    1642             : {
    1643           0 :     ImplSVData* pSVData = ImplGetSVData();
    1644           0 :     return pSVData->mpDefInst->hasNativeFileSelection();
    1645             : }
    1646             : 
    1647             : Reference< ui::dialogs::XFilePicker2 >
    1648           0 : Application::createFilePicker( const Reference< uno::XComponentContext >& xSM )
    1649             : {
    1650           0 :     ImplSVData* pSVData = ImplGetSVData();
    1651           0 :     return pSVData->mpDefInst->createFilePicker( xSM );
    1652             : }
    1653             : 
    1654             : Reference< ui::dialogs::XFolderPicker2 >
    1655           2 : Application::createFolderPicker( const Reference< uno::XComponentContext >& xSM )
    1656             : {
    1657           2 :     ImplSVData* pSVData = ImplGetSVData();
    1658           2 :     return pSVData->mpDefInst->createFolderPicker( xSM );
    1659             : }
    1660             : 
    1661         196 : void Application::setDeInitHook(Link const & hook) {
    1662         196 :     ImplSVData * pSVData = ImplGetSVData();
    1663             :     assert(!pSVData->maDeInitHook.IsSet());
    1664         196 :     pSVData->maDeInitHook = hook;
    1665             :     // Fake this for VCLXToolkit ctor instantiated from
    1666             :     // postprocess/CppunitTest_services.mk:
    1667         196 :     pSVData->maAppData.mbInAppMain = true;
    1668         196 : }
    1669             : 
    1670             : // helper method to allow inline constructor even for pWindow!=NULL case
    1671    13990499 : void ImplDelData::AttachToWindow( const vcl::Window* pWindow )
    1672             : {
    1673    13990499 :     if( pWindow )
    1674    13990499 :         const_cast<vcl::Window*>(pWindow)->ImplAddDel( this );
    1675    13990499 : }
    1676             : 
    1677             : // define dtor for ImplDelData
    1678    19508318 : ImplDelData::~ImplDelData()
    1679             : {
    1680             :     // #112873# auto remove of ImplDelData
    1681             :     // due to this code actively calling ImplRemoveDel() is not mandatory anymore
    1682    19508318 :     if( !mbDel && mpWindow )
    1683             :     {
    1684             :         // the window still exists but we were not removed
    1685    13990499 :         const_cast<vcl::Window*>(mpWindow)->ImplRemoveDel( this );
    1686    13990499 :         mpWindow = NULL;
    1687             :     }
    1688    19509551 : }
    1689             : 
    1690             : 
    1691             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10