1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_vcl.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include <string.h> 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir #include "rtl/instance.hxx" 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir #include "osl/process.h" 36*cdf0e10cSrcweir #include "osl/file.hxx" 37*cdf0e10cSrcweir 38*cdf0e10cSrcweir #include "tools/debug.hxx" 39*cdf0e10cSrcweir #include "tools/resary.hxx" 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir #include "unotools/fontcfg.hxx" 42*cdf0e10cSrcweir 43*cdf0e10cSrcweir #include "vos/mutex.hxx" 44*cdf0e10cSrcweir 45*cdf0e10cSrcweir #include "cppuhelper/implbase1.hxx" 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir #include "uno/current_context.hxx" 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir #include "vcl/configsettings.hxx" 50*cdf0e10cSrcweir #include "vcl/svapp.hxx" 51*cdf0e10cSrcweir #include "vcl/wrkwin.hxx" 52*cdf0e10cSrcweir #include "vcl/msgbox.hxx" 53*cdf0e10cSrcweir #include "vcl/unohelp.hxx" 54*cdf0e10cSrcweir #include "vcl/button.hxx" // for Button::GetStandardText 55*cdf0e10cSrcweir #include "vcl/dockwin.hxx" // for DockingManager 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir #include "salinst.hxx" 58*cdf0e10cSrcweir #include "salframe.hxx" 59*cdf0e10cSrcweir #include "svdata.hxx" 60*cdf0e10cSrcweir #include "window.h" 61*cdf0e10cSrcweir #include "salimestatus.hxx" 62*cdf0e10cSrcweir #include "salsys.hxx" 63*cdf0e10cSrcweir #include "svids.hrc" 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir #include "com/sun/star/lang/XMultiServiceFactory.hpp" 66*cdf0e10cSrcweir #include "com/sun/star/lang/XComponent.hpp" 67*cdf0e10cSrcweir #include "com/sun/star/awt/XExtendedToolkit.hpp" 68*cdf0e10cSrcweir #include "com/sun/star/java/JavaNotConfiguredException.hpp" 69*cdf0e10cSrcweir #include "com/sun/star/java/JavaVMCreationFailureException.hpp" 70*cdf0e10cSrcweir #include "com/sun/star/java/MissingJavaRuntimeException.hpp" 71*cdf0e10cSrcweir #include "com/sun/star/java/JavaDisabledException.hpp" 72*cdf0e10cSrcweir 73*cdf0e10cSrcweir #include <stdio.h> 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir namespace { 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir namespace css = com::sun::star; 78*cdf0e10cSrcweir 79*cdf0e10cSrcweir } 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir using namespace com::sun::star::uno; 82*cdf0e10cSrcweir using namespace com::sun::star::lang; 83*cdf0e10cSrcweir using namespace com::sun::star::awt; 84*cdf0e10cSrcweir using namespace rtl; 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir // ======================================================================= 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir namespace 89*cdf0e10cSrcweir { 90*cdf0e10cSrcweir struct private_aImplSVData : 91*cdf0e10cSrcweir public rtl::Static<ImplSVData, private_aImplSVData> {}; 92*cdf0e10cSrcweir } 93*cdf0e10cSrcweir 94*cdf0e10cSrcweir // static SV-Data 95*cdf0e10cSrcweir ImplSVData* pImplSVData = NULL; 96*cdf0e10cSrcweir 97*cdf0e10cSrcweir SalSystem* ImplGetSalSystem() 98*cdf0e10cSrcweir { 99*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 100*cdf0e10cSrcweir if( ! pSVData->mpSalSystem ) 101*cdf0e10cSrcweir pSVData->mpSalSystem = pSVData->mpDefInst->CreateSalSystem(); 102*cdf0e10cSrcweir return pSVData->mpSalSystem; 103*cdf0e10cSrcweir } 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir 106*cdf0e10cSrcweir static String& ReplaceJavaErrorMessages( String& rString ) 107*cdf0e10cSrcweir { 108*cdf0e10cSrcweir rString.SearchAndReplaceAllAscii( "%OK", Button::GetStandardText( BUTTON_OK ) ); 109*cdf0e10cSrcweir rString.SearchAndReplaceAllAscii( "%IGNORE", Button::GetStandardText( BUTTON_IGNORE ) ); 110*cdf0e10cSrcweir rString.SearchAndReplaceAllAscii( "%CANCEL", Button::GetStandardText( BUTTON_CANCEL ) ); 111*cdf0e10cSrcweir 112*cdf0e10cSrcweir return rString; 113*cdf0e10cSrcweir } 114*cdf0e10cSrcweir 115*cdf0e10cSrcweir // ======================================================================= 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir void ImplInitSVData() 118*cdf0e10cSrcweir { 119*cdf0e10cSrcweir pImplSVData = &private_aImplSVData::get(); 120*cdf0e10cSrcweir 121*cdf0e10cSrcweir // init global instance data 122*cdf0e10cSrcweir memset( pImplSVData, 0, sizeof( ImplSVData ) ); 123*cdf0e10cSrcweir pImplSVData->maHelpData.mbAutoHelpId = sal_True; 124*cdf0e10cSrcweir pImplSVData->maNWFData.maMenuBarHighlightTextColor = Color( COL_TRANSPARENT ); 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir // find out whether we are running in the testtool 127*cdf0e10cSrcweir // in this case we need some special workarounds 128*cdf0e10cSrcweir sal_uInt32 nArgs = osl_getCommandArgCount(); 129*cdf0e10cSrcweir for( sal_uInt32 i = 0; i < nArgs; i++ ) 130*cdf0e10cSrcweir { 131*cdf0e10cSrcweir rtl::OUString aArg; 132*cdf0e10cSrcweir osl_getCommandArg( i, &aArg.pData ); 133*cdf0e10cSrcweir if( aArg.equalsAscii( "-enableautomation" ) ) 134*cdf0e10cSrcweir { 135*cdf0e10cSrcweir pImplSVData->mbIsTestTool = true; 136*cdf0e10cSrcweir break; 137*cdf0e10cSrcweir } 138*cdf0e10cSrcweir } 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir // mark default layout border as unitialized 141*cdf0e10cSrcweir pImplSVData->maAppData.mnDefaultLayoutBorder = -1; 142*cdf0e10cSrcweir } 143*cdf0e10cSrcweir 144*cdf0e10cSrcweir // ----------------------------------------------------------------------- 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir void ImplDeInitSVData() 147*cdf0e10cSrcweir { 148*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 149*cdf0e10cSrcweir 150*cdf0e10cSrcweir // delete global instance data 151*cdf0e10cSrcweir if( pSVData->mpSettingsConfigItem ) 152*cdf0e10cSrcweir delete pSVData->mpSettingsConfigItem; 153*cdf0e10cSrcweir 154*cdf0e10cSrcweir if( pSVData->mpDockingManager ) 155*cdf0e10cSrcweir delete pSVData->mpDockingManager; 156*cdf0e10cSrcweir 157*cdf0e10cSrcweir if( pSVData->maGDIData.mpDefaultFontConfiguration ) 158*cdf0e10cSrcweir delete pSVData->maGDIData.mpDefaultFontConfiguration; 159*cdf0e10cSrcweir if( pSVData->maGDIData.mpFontSubstConfiguration ) 160*cdf0e10cSrcweir delete pSVData->maGDIData.mpFontSubstConfiguration; 161*cdf0e10cSrcweir 162*cdf0e10cSrcweir if ( pSVData->maAppData.mpMSFTempFileName ) 163*cdf0e10cSrcweir { 164*cdf0e10cSrcweir if ( pSVData->maAppData.mxMSF.is() ) 165*cdf0e10cSrcweir { 166*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > xComp( pSVData->maAppData.mxMSF, ::com::sun::star::uno::UNO_QUERY ); 167*cdf0e10cSrcweir xComp->dispose(); 168*cdf0e10cSrcweir pSVData->maAppData.mxMSF = NULL; 169*cdf0e10cSrcweir } 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir ::rtl::OUString aFileUrl; 172*cdf0e10cSrcweir ::osl::File::getFileURLFromSystemPath( *pSVData->maAppData.mpMSFTempFileName, aFileUrl ); 173*cdf0e10cSrcweir osl::File::remove( aFileUrl ); 174*cdf0e10cSrcweir delete pSVData->maAppData.mpMSFTempFileName; 175*cdf0e10cSrcweir pSVData->maAppData.mpMSFTempFileName = NULL; 176*cdf0e10cSrcweir } 177*cdf0e10cSrcweir 178*cdf0e10cSrcweir if( pSVData->maCtrlData.mpFieldUnitStrings ) 179*cdf0e10cSrcweir delete pSVData->maCtrlData.mpFieldUnitStrings, pSVData->maCtrlData.mpFieldUnitStrings = NULL; 180*cdf0e10cSrcweir if( pSVData->maCtrlData.mpCleanUnitStrings ) 181*cdf0e10cSrcweir delete pSVData->maCtrlData.mpCleanUnitStrings, pSVData->maCtrlData.mpCleanUnitStrings = NULL; 182*cdf0e10cSrcweir if( pSVData->mpPaperNames ) 183*cdf0e10cSrcweir delete pSVData->mpPaperNames, pSVData->mpPaperNames = NULL; 184*cdf0e10cSrcweir } 185*cdf0e10cSrcweir 186*cdf0e10cSrcweir // ----------------------------------------------------------------------- 187*cdf0e10cSrcweir 188*cdf0e10cSrcweir void ImplDestroySVData() 189*cdf0e10cSrcweir { 190*cdf0e10cSrcweir pImplSVData = NULL; 191*cdf0e10cSrcweir } 192*cdf0e10cSrcweir 193*cdf0e10cSrcweir // ----------------------------------------------------------------------- 194*cdf0e10cSrcweir 195*cdf0e10cSrcweir Window* ImplGetDefaultWindow() 196*cdf0e10cSrcweir { 197*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 198*cdf0e10cSrcweir if ( pSVData->maWinData.mpAppWin ) 199*cdf0e10cSrcweir return pSVData->maWinData.mpAppWin; 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir // First test if we already have a default window. 202*cdf0e10cSrcweir // Don't only place a single if..else inside solar mutex lockframe 203*cdf0e10cSrcweir // because then we might have to wait for the solar mutex what is not neccessary 204*cdf0e10cSrcweir // if we already have a default window. 205*cdf0e10cSrcweir 206*cdf0e10cSrcweir if ( !pSVData->mpDefaultWin ) 207*cdf0e10cSrcweir { 208*cdf0e10cSrcweir Application::GetSolarMutex().acquire(); 209*cdf0e10cSrcweir 210*cdf0e10cSrcweir // Test again because the thread who released the solar mutex could have called 211*cdf0e10cSrcweir // the same method 212*cdf0e10cSrcweir 213*cdf0e10cSrcweir if ( !pSVData->mpDefaultWin && !pSVData->mbDeInit ) 214*cdf0e10cSrcweir { 215*cdf0e10cSrcweir DBG_WARNING( "ImplGetDefaultWindow(): No AppWindow" ); 216*cdf0e10cSrcweir pSVData->mpDefaultWin = new WorkWindow( 0, WB_DEFAULTWIN ); 217*cdf0e10cSrcweir pSVData->mpDefaultWin->SetText( OUString( RTL_CONSTASCII_USTRINGPARAM( "VCL ImplGetDefaultWindow" ) ) ); 218*cdf0e10cSrcweir } 219*cdf0e10cSrcweir Application::GetSolarMutex().release(); 220*cdf0e10cSrcweir } 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir return pSVData->mpDefaultWin; 223*cdf0e10cSrcweir } 224*cdf0e10cSrcweir 225*cdf0e10cSrcweir // ----------------------------------------------------------------------- 226*cdf0e10cSrcweir 227*cdf0e10cSrcweir #define VCL_CREATERESMGR_NAME( Name ) #Name 228*cdf0e10cSrcweir 229*cdf0e10cSrcweir ResMgr* ImplGetResMgr() 230*cdf0e10cSrcweir { 231*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 232*cdf0e10cSrcweir if ( !pSVData->mpResMgr ) 233*cdf0e10cSrcweir { 234*cdf0e10cSrcweir ::com::sun::star::lang::Locale aLocale = Application::GetSettings().GetUILocale(); 235*cdf0e10cSrcweir pSVData->mpResMgr = ResMgr::SearchCreateResMgr( VCL_CREATERESMGR_NAME( vcl ), aLocale ); 236*cdf0e10cSrcweir 237*cdf0e10cSrcweir static bool bMessageOnce = false; 238*cdf0e10cSrcweir if( !pSVData->mpResMgr && ! bMessageOnce ) 239*cdf0e10cSrcweir { 240*cdf0e10cSrcweir bMessageOnce = true; 241*cdf0e10cSrcweir const char* pMsg = 242*cdf0e10cSrcweir "Missing vcl resource. This indicates that files vital to localization are missing. " 243*cdf0e10cSrcweir "You might have a corrupt installation."; 244*cdf0e10cSrcweir fprintf( stderr, "%s\n", pMsg ); 245*cdf0e10cSrcweir ErrorBox aBox( NULL, WB_OK | WB_DEF_OK, rtl::OUString( pMsg, strlen( pMsg ), RTL_TEXTENCODING_ASCII_US ) ); 246*cdf0e10cSrcweir aBox.Execute(); 247*cdf0e10cSrcweir } 248*cdf0e10cSrcweir } 249*cdf0e10cSrcweir return pSVData->mpResMgr; 250*cdf0e10cSrcweir } 251*cdf0e10cSrcweir 252*cdf0e10cSrcweir ResId VclResId( sal_Int32 nId ) 253*cdf0e10cSrcweir { 254*cdf0e10cSrcweir ResMgr* pMgr = ImplGetResMgr(); 255*cdf0e10cSrcweir if( ! pMgr ) 256*cdf0e10cSrcweir throw std::bad_alloc(); 257*cdf0e10cSrcweir 258*cdf0e10cSrcweir return ResId( nId, *pMgr ); 259*cdf0e10cSrcweir } 260*cdf0e10cSrcweir 261*cdf0e10cSrcweir FieldUnitStringList* ImplGetFieldUnits() 262*cdf0e10cSrcweir { 263*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 264*cdf0e10cSrcweir if( ! pSVData->maCtrlData.mpFieldUnitStrings ) 265*cdf0e10cSrcweir { 266*cdf0e10cSrcweir ResMgr* pResMgr = ImplGetResMgr(); 267*cdf0e10cSrcweir if( pResMgr ) 268*cdf0e10cSrcweir { 269*cdf0e10cSrcweir ResStringArray aUnits( ResId (SV_FUNIT_STRINGS, *pResMgr) ); 270*cdf0e10cSrcweir sal_uInt32 nUnits = aUnits.Count(); 271*cdf0e10cSrcweir pSVData->maCtrlData.mpFieldUnitStrings = new FieldUnitStringList(); 272*cdf0e10cSrcweir pSVData->maCtrlData.mpFieldUnitStrings->reserve( nUnits ); 273*cdf0e10cSrcweir for( sal_uInt32 i = 0; i < nUnits; i++ ) 274*cdf0e10cSrcweir { 275*cdf0e10cSrcweir std::pair< String, FieldUnit > aElement( aUnits.GetString(i), static_cast<FieldUnit>(aUnits.GetValue(i)) ); 276*cdf0e10cSrcweir pSVData->maCtrlData.mpFieldUnitStrings->push_back( aElement ); 277*cdf0e10cSrcweir } 278*cdf0e10cSrcweir } 279*cdf0e10cSrcweir } 280*cdf0e10cSrcweir return pSVData->maCtrlData.mpFieldUnitStrings; 281*cdf0e10cSrcweir } 282*cdf0e10cSrcweir 283*cdf0e10cSrcweir FieldUnitStringList* ImplGetCleanedFieldUnits() 284*cdf0e10cSrcweir { 285*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 286*cdf0e10cSrcweir if( ! pSVData->maCtrlData.mpCleanUnitStrings ) 287*cdf0e10cSrcweir { 288*cdf0e10cSrcweir FieldUnitStringList* pUnits = ImplGetFieldUnits(); 289*cdf0e10cSrcweir if( pUnits ) 290*cdf0e10cSrcweir { 291*cdf0e10cSrcweir size_t nUnits = pUnits->size(); 292*cdf0e10cSrcweir pSVData->maCtrlData.mpCleanUnitStrings = new FieldUnitStringList(); 293*cdf0e10cSrcweir pSVData->maCtrlData.mpCleanUnitStrings->reserve( nUnits ); 294*cdf0e10cSrcweir for( size_t i = 0; i < nUnits; i++ ) 295*cdf0e10cSrcweir { 296*cdf0e10cSrcweir String aUnit( (*pUnits)[i].first ); 297*cdf0e10cSrcweir aUnit.EraseAllChars( sal_Unicode( ' ' ) ); 298*cdf0e10cSrcweir aUnit.ToLowerAscii(); 299*cdf0e10cSrcweir std::pair< String, FieldUnit > aElement( aUnit, (*pUnits)[i].second ); 300*cdf0e10cSrcweir pSVData->maCtrlData.mpCleanUnitStrings->push_back( aElement ); 301*cdf0e10cSrcweir } 302*cdf0e10cSrcweir } 303*cdf0e10cSrcweir } 304*cdf0e10cSrcweir return pSVData->maCtrlData.mpCleanUnitStrings; 305*cdf0e10cSrcweir } 306*cdf0e10cSrcweir 307*cdf0e10cSrcweir DockingManager* ImplGetDockingManager() 308*cdf0e10cSrcweir { 309*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 310*cdf0e10cSrcweir if ( !pSVData->mpDockingManager ) 311*cdf0e10cSrcweir pSVData->mpDockingManager = new DockingManager(); 312*cdf0e10cSrcweir 313*cdf0e10cSrcweir return pSVData->mpDockingManager; 314*cdf0e10cSrcweir } 315*cdf0e10cSrcweir 316*cdf0e10cSrcweir class AccessBridgeCurrentContext: public cppu::WeakImplHelper1< com::sun::star::uno::XCurrentContext > 317*cdf0e10cSrcweir { 318*cdf0e10cSrcweir public: 319*cdf0e10cSrcweir AccessBridgeCurrentContext( 320*cdf0e10cSrcweir const com::sun::star::uno::Reference< com::sun::star::uno::XCurrentContext > &context ) : 321*cdf0e10cSrcweir m_prevContext( context ) {} 322*cdf0e10cSrcweir 323*cdf0e10cSrcweir // XCurrentContext 324*cdf0e10cSrcweir virtual com::sun::star::uno::Any SAL_CALL getValueByName( const rtl::OUString& Name ) 325*cdf0e10cSrcweir throw (com::sun::star::uno::RuntimeException); 326*cdf0e10cSrcweir private: 327*cdf0e10cSrcweir com::sun::star::uno::Reference< com::sun::star::uno::XCurrentContext > m_prevContext; 328*cdf0e10cSrcweir }; 329*cdf0e10cSrcweir 330*cdf0e10cSrcweir com::sun::star::uno::Any AccessBridgeCurrentContext::getValueByName( const rtl::OUString & Name ) 331*cdf0e10cSrcweir throw (com::sun::star::uno::RuntimeException) 332*cdf0e10cSrcweir { 333*cdf0e10cSrcweir com::sun::star::uno::Any ret; 334*cdf0e10cSrcweir if( Name.equalsAscii( "java-vm.interaction-handler" ) ) 335*cdf0e10cSrcweir { 336*cdf0e10cSrcweir // Currently, for accessbility no interaction handler shall be offered. 337*cdf0e10cSrcweir // There may be introduced later on a handler using native toolkits 338*cdf0e10cSrcweir // jbu->obr: Instantiate here your interaction handler 339*cdf0e10cSrcweir } 340*cdf0e10cSrcweir else if( m_prevContext.is() ) 341*cdf0e10cSrcweir { 342*cdf0e10cSrcweir ret = m_prevContext->getValueByName( Name ); 343*cdf0e10cSrcweir } 344*cdf0e10cSrcweir return ret; 345*cdf0e10cSrcweir } 346*cdf0e10cSrcweir 347*cdf0e10cSrcweir 348*cdf0e10cSrcweir bool ImplInitAccessBridge(sal_Bool bAllowCancel, sal_Bool &rCancelled) 349*cdf0e10cSrcweir { 350*cdf0e10cSrcweir rCancelled = sal_False; 351*cdf0e10cSrcweir 352*cdf0e10cSrcweir bool bErrorMessage = true; 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir // Note: 355*cdf0e10cSrcweir // if bAllowCancel is sal_True we were called from application startup 356*cdf0e10cSrcweir // where we will disable any Java errorboxes and show our own accessibility dialog if Java throws an exception 357*cdf0e10cSrcweir // if bAllowCancel is sal_False we were called from Tools->Options 358*cdf0e10cSrcweir // where we will see Java errorboxes, se we do not show our dialogs in addition to Java's 359*cdf0e10cSrcweir 360*cdf0e10cSrcweir try 361*cdf0e10cSrcweir { 362*cdf0e10cSrcweir bool bSuccess = true; 363*cdf0e10cSrcweir 364*cdf0e10cSrcweir // No error messages when env var is set .. 365*cdf0e10cSrcweir static const char* pEnv = getenv("SAL_ACCESSIBILITY_ENABLED" ); 366*cdf0e10cSrcweir if( pEnv && *pEnv ) 367*cdf0e10cSrcweir { 368*cdf0e10cSrcweir bErrorMessage = false; 369*cdf0e10cSrcweir } 370*cdf0e10cSrcweir 371*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 372*cdf0e10cSrcweir if( ! pSVData->mxAccessBridge.is() ) 373*cdf0e10cSrcweir { 374*cdf0e10cSrcweir css::uno::Reference< XMultiServiceFactory > xFactory(vcl::unohelper::GetMultiServiceFactory()); 375*cdf0e10cSrcweir 376*cdf0e10cSrcweir if( xFactory.is() ) 377*cdf0e10cSrcweir { 378*cdf0e10cSrcweir css::uno::Reference< XExtendedToolkit > xToolkit = 379*cdf0e10cSrcweir css::uno::Reference< XExtendedToolkit >(Application::GetVCLToolkit(), UNO_QUERY); 380*cdf0e10cSrcweir 381*cdf0e10cSrcweir Sequence< Any > arguments(1); 382*cdf0e10cSrcweir arguments[0] = makeAny(xToolkit); 383*cdf0e10cSrcweir 384*cdf0e10cSrcweir // Disable default java error messages on startup, because they were probably unreadable 385*cdf0e10cSrcweir // for a disabled user. Use native message boxes which are accessible without java support. 386*cdf0e10cSrcweir // No need to do this when activated by Tools-Options dialog .. 387*cdf0e10cSrcweir if( bAllowCancel ) 388*cdf0e10cSrcweir { 389*cdf0e10cSrcweir // customize the java-not-available-interaction-handler entry within the 390*cdf0e10cSrcweir // current context when called at startup. 391*cdf0e10cSrcweir com::sun::star::uno::ContextLayer layer( 392*cdf0e10cSrcweir new AccessBridgeCurrentContext( com::sun::star::uno::getCurrentContext() ) ); 393*cdf0e10cSrcweir 394*cdf0e10cSrcweir pSVData->mxAccessBridge = xFactory->createInstanceWithArguments( 395*cdf0e10cSrcweir OUString::createFromAscii( "com.sun.star.accessibility.AccessBridge" ), 396*cdf0e10cSrcweir arguments 397*cdf0e10cSrcweir ); 398*cdf0e10cSrcweir } 399*cdf0e10cSrcweir else 400*cdf0e10cSrcweir { 401*cdf0e10cSrcweir pSVData->mxAccessBridge = xFactory->createInstanceWithArguments( 402*cdf0e10cSrcweir OUString::createFromAscii( "com.sun.star.accessibility.AccessBridge" ), 403*cdf0e10cSrcweir arguments 404*cdf0e10cSrcweir ); 405*cdf0e10cSrcweir } 406*cdf0e10cSrcweir 407*cdf0e10cSrcweir if( !pSVData->mxAccessBridge.is() ) 408*cdf0e10cSrcweir bSuccess = false; 409*cdf0e10cSrcweir } 410*cdf0e10cSrcweir } 411*cdf0e10cSrcweir 412*cdf0e10cSrcweir return bSuccess; 413*cdf0e10cSrcweir } 414*cdf0e10cSrcweir 415*cdf0e10cSrcweir catch(::com::sun::star::java::JavaNotConfiguredException e) 416*cdf0e10cSrcweir { 417*cdf0e10cSrcweir ResMgr *pResMgr = ImplGetResMgr(); 418*cdf0e10cSrcweir if( bErrorMessage && bAllowCancel && pResMgr ) 419*cdf0e10cSrcweir { 420*cdf0e10cSrcweir String aTitle(ResId(SV_ACCESSERROR_JAVA_NOT_CONFIGURED, *pResMgr)); 421*cdf0e10cSrcweir String aMessage(ResId(SV_ACCESSERROR_JAVA_MSG, *pResMgr)); 422*cdf0e10cSrcweir 423*cdf0e10cSrcweir aMessage += String(" ", 1, RTL_TEXTENCODING_ASCII_US); 424*cdf0e10cSrcweir aMessage += String(ResId(SV_ACCESSERROR_OK_CANCEL_MSG, *pResMgr)); 425*cdf0e10cSrcweir 426*cdf0e10cSrcweir int ret = ImplGetSalSystem()->ShowNativeMessageBox( 427*cdf0e10cSrcweir aTitle, 428*cdf0e10cSrcweir ReplaceJavaErrorMessages(aMessage), 429*cdf0e10cSrcweir SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL, 430*cdf0e10cSrcweir SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL); 431*cdf0e10cSrcweir 432*cdf0e10cSrcweir // Do not change the setting in case the user chooses to cancel 433*cdf0e10cSrcweir if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret ) 434*cdf0e10cSrcweir rCancelled = sal_True; 435*cdf0e10cSrcweir } 436*cdf0e10cSrcweir 437*cdf0e10cSrcweir return false; 438*cdf0e10cSrcweir } 439*cdf0e10cSrcweir 440*cdf0e10cSrcweir catch(::com::sun::star::java::JavaVMCreationFailureException e) 441*cdf0e10cSrcweir { 442*cdf0e10cSrcweir ResMgr *pResMgr = ImplGetResMgr(); 443*cdf0e10cSrcweir if( bErrorMessage && bAllowCancel && pResMgr ) 444*cdf0e10cSrcweir { 445*cdf0e10cSrcweir String aTitle(ResId(SV_ACCESSERROR_FAULTY_JAVA, *pResMgr)); 446*cdf0e10cSrcweir String aMessage(ResId(SV_ACCESSERROR_JAVA_MSG, *pResMgr)); 447*cdf0e10cSrcweir 448*cdf0e10cSrcweir aMessage += String(" ", 1, RTL_TEXTENCODING_ASCII_US); 449*cdf0e10cSrcweir aMessage += String(ResId(SV_ACCESSERROR_OK_CANCEL_MSG, *pResMgr)); 450*cdf0e10cSrcweir 451*cdf0e10cSrcweir int ret = ImplGetSalSystem()->ShowNativeMessageBox( 452*cdf0e10cSrcweir aTitle, 453*cdf0e10cSrcweir ReplaceJavaErrorMessages(aMessage), 454*cdf0e10cSrcweir SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL, 455*cdf0e10cSrcweir SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL); 456*cdf0e10cSrcweir 457*cdf0e10cSrcweir // Do not change the setting in case the user chooses to cancel 458*cdf0e10cSrcweir if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret ) 459*cdf0e10cSrcweir rCancelled = sal_True; 460*cdf0e10cSrcweir } 461*cdf0e10cSrcweir 462*cdf0e10cSrcweir return false; 463*cdf0e10cSrcweir } 464*cdf0e10cSrcweir 465*cdf0e10cSrcweir catch(::com::sun::star::java::MissingJavaRuntimeException e) 466*cdf0e10cSrcweir { 467*cdf0e10cSrcweir ResMgr *pResMgr = ImplGetResMgr(); 468*cdf0e10cSrcweir if( bErrorMessage && bAllowCancel && pResMgr ) 469*cdf0e10cSrcweir { 470*cdf0e10cSrcweir String aTitle(ResId(SV_ACCESSERROR_MISSING_JAVA, *pResMgr)); 471*cdf0e10cSrcweir String aMessage(ResId(SV_ACCESSERROR_JAVA_MSG, *pResMgr)); 472*cdf0e10cSrcweir 473*cdf0e10cSrcweir aMessage += String(" ", 1, RTL_TEXTENCODING_ASCII_US); 474*cdf0e10cSrcweir aMessage += String(ResId(SV_ACCESSERROR_OK_CANCEL_MSG, *pResMgr)); 475*cdf0e10cSrcweir 476*cdf0e10cSrcweir int ret = ImplGetSalSystem()->ShowNativeMessageBox( 477*cdf0e10cSrcweir aTitle, 478*cdf0e10cSrcweir ReplaceJavaErrorMessages(aMessage), 479*cdf0e10cSrcweir SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL, 480*cdf0e10cSrcweir SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL); 481*cdf0e10cSrcweir 482*cdf0e10cSrcweir // Do not change the setting in case the user chooses to cancel 483*cdf0e10cSrcweir if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret ) 484*cdf0e10cSrcweir rCancelled = sal_True; 485*cdf0e10cSrcweir } 486*cdf0e10cSrcweir 487*cdf0e10cSrcweir return false; 488*cdf0e10cSrcweir } 489*cdf0e10cSrcweir 490*cdf0e10cSrcweir catch(::com::sun::star::java::JavaDisabledException e) 491*cdf0e10cSrcweir { 492*cdf0e10cSrcweir ResMgr *pResMgr = ImplGetResMgr(); 493*cdf0e10cSrcweir if( bErrorMessage && bAllowCancel && pResMgr ) 494*cdf0e10cSrcweir { 495*cdf0e10cSrcweir String aTitle(ResId(SV_ACCESSERROR_JAVA_DISABLED, *pResMgr)); 496*cdf0e10cSrcweir String aMessage(ResId(SV_ACCESSERROR_JAVA_MSG, *pResMgr)); 497*cdf0e10cSrcweir 498*cdf0e10cSrcweir aMessage += String(" ", 1, RTL_TEXTENCODING_ASCII_US); 499*cdf0e10cSrcweir aMessage += String(ResId(SV_ACCESSERROR_OK_CANCEL_MSG, *pResMgr)); 500*cdf0e10cSrcweir 501*cdf0e10cSrcweir int ret = ImplGetSalSystem()->ShowNativeMessageBox( 502*cdf0e10cSrcweir aTitle, 503*cdf0e10cSrcweir ReplaceJavaErrorMessages(aMessage), 504*cdf0e10cSrcweir SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL, 505*cdf0e10cSrcweir SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL); 506*cdf0e10cSrcweir 507*cdf0e10cSrcweir // Do not change the setting in case the user chooses to cancel 508*cdf0e10cSrcweir if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret ) 509*cdf0e10cSrcweir rCancelled = sal_True; 510*cdf0e10cSrcweir } 511*cdf0e10cSrcweir 512*cdf0e10cSrcweir return false; 513*cdf0e10cSrcweir } 514*cdf0e10cSrcweir 515*cdf0e10cSrcweir 516*cdf0e10cSrcweir catch(::com::sun::star::uno::RuntimeException e) 517*cdf0e10cSrcweir { 518*cdf0e10cSrcweir ResMgr *pResMgr = ImplGetResMgr(); 519*cdf0e10cSrcweir if( bErrorMessage && pResMgr ) 520*cdf0e10cSrcweir { 521*cdf0e10cSrcweir String aTitle; 522*cdf0e10cSrcweir String aMessage(ResId(SV_ACCESSERROR_BRIDGE_MSG, *pResMgr)); 523*cdf0e10cSrcweir 524*cdf0e10cSrcweir if( 0 == e.Message.compareTo(::rtl::OUString::createFromAscii("ClassNotFound"), 13) ) 525*cdf0e10cSrcweir { 526*cdf0e10cSrcweir aTitle = String(ResId(SV_ACCESSERROR_MISSING_BRIDGE, *pResMgr)); 527*cdf0e10cSrcweir } 528*cdf0e10cSrcweir else if( 0 == e.Message.compareTo(::rtl::OUString::createFromAscii("NoSuchMethod"), 12) ) 529*cdf0e10cSrcweir { 530*cdf0e10cSrcweir aTitle = String(ResId(SV_ACCESSERROR_WRONG_VERSION, *pResMgr)); 531*cdf0e10cSrcweir } 532*cdf0e10cSrcweir 533*cdf0e10cSrcweir if( aTitle.Len() != 0 ) 534*cdf0e10cSrcweir { 535*cdf0e10cSrcweir if( bAllowCancel ) 536*cdf0e10cSrcweir { 537*cdf0e10cSrcweir // Something went wrong initializing the Java AccessBridge (on Windows) during the 538*cdf0e10cSrcweir // startup. Since the office will be probably unusable for a disabled user, we offer 539*cdf0e10cSrcweir // to terminate directly. 540*cdf0e10cSrcweir aMessage += String(" ", 1, RTL_TEXTENCODING_ASCII_US); 541*cdf0e10cSrcweir aMessage += String(ResId(SV_ACCESSERROR_OK_CANCEL_MSG, *pResMgr)); 542*cdf0e10cSrcweir 543*cdf0e10cSrcweir int ret = ImplGetSalSystem()->ShowNativeMessageBox( 544*cdf0e10cSrcweir aTitle, 545*cdf0e10cSrcweir ReplaceJavaErrorMessages(aMessage), 546*cdf0e10cSrcweir SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL, 547*cdf0e10cSrcweir SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL); 548*cdf0e10cSrcweir 549*cdf0e10cSrcweir // Do not change the setting in case the user chooses to cancel 550*cdf0e10cSrcweir if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret ) 551*cdf0e10cSrcweir rCancelled = sal_True; 552*cdf0e10cSrcweir } 553*cdf0e10cSrcweir else 554*cdf0e10cSrcweir { 555*cdf0e10cSrcweir // The user tried to activate accessibility support using Tools-Options dialog, 556*cdf0e10cSrcweir // so we don't offer to terminate here ! 557*cdf0e10cSrcweir ImplGetSalSystem()->ShowNativeMessageBox( 558*cdf0e10cSrcweir aTitle, 559*cdf0e10cSrcweir ReplaceJavaErrorMessages(aMessage), 560*cdf0e10cSrcweir SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK, 561*cdf0e10cSrcweir SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK); 562*cdf0e10cSrcweir } 563*cdf0e10cSrcweir } 564*cdf0e10cSrcweir } 565*cdf0e10cSrcweir 566*cdf0e10cSrcweir return false; 567*cdf0e10cSrcweir } 568*cdf0e10cSrcweir 569*cdf0e10cSrcweir catch (...) 570*cdf0e10cSrcweir { 571*cdf0e10cSrcweir return false; 572*cdf0e10cSrcweir } 573*cdf0e10cSrcweir } 574*cdf0e10cSrcweir 575*cdf0e10cSrcweir // ----------------------------------------------------------------------- 576*cdf0e10cSrcweir 577*cdf0e10cSrcweir Window* ImplFindWindow( const SalFrame* pFrame, Point& rSalFramePos ) 578*cdf0e10cSrcweir { 579*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 580*cdf0e10cSrcweir Window* pFrameWindow = pSVData->maWinData.mpFirstFrame; 581*cdf0e10cSrcweir while ( pFrameWindow ) 582*cdf0e10cSrcweir { 583*cdf0e10cSrcweir if ( pFrameWindow->ImplGetFrame() == pFrame ) 584*cdf0e10cSrcweir { 585*cdf0e10cSrcweir Window* pWindow = pFrameWindow->ImplFindWindow( rSalFramePos ); 586*cdf0e10cSrcweir if ( !pWindow ) 587*cdf0e10cSrcweir pWindow = pFrameWindow->ImplGetWindow(); 588*cdf0e10cSrcweir rSalFramePos = pWindow->ImplFrameToOutput( rSalFramePos ); 589*cdf0e10cSrcweir return pWindow; 590*cdf0e10cSrcweir } 591*cdf0e10cSrcweir pFrameWindow = pFrameWindow->ImplGetFrameData()->mpNextFrame; 592*cdf0e10cSrcweir } 593*cdf0e10cSrcweir 594*cdf0e10cSrcweir return NULL; 595*cdf0e10cSrcweir } 596*cdf0e10cSrcweir 597*cdf0e10cSrcweir void LocaleConfigurationListener::ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 nHint ) 598*cdf0e10cSrcweir { 599*cdf0e10cSrcweir AllSettings::LocaleSettingsChanged( nHint ); 600*cdf0e10cSrcweir } 601*cdf0e10cSrcweir 602