1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_vcl.hxx" 26 27 #include <string.h> 28 29 #include "rtl/instance.hxx" 30 31 #include "osl/process.h" 32 #include "osl/file.hxx" 33 34 #include "tools/debug.hxx" 35 #include "tools/resary.hxx" 36 37 #include "unotools/fontcfg.hxx" 38 39 #ifdef WNT 40 #ifndef _COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLE_HPP_ 41 #include <com/sun/star/accessibility/XAccessible.hpp> 42 #endif 43 #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEROLE_HPP_ 44 #include <com/sun/star/accessibility/AccessibleRole.hpp> 45 #endif 46 #endif 47 #include "vos/mutex.hxx" 48 49 #include "cppuhelper/implbase1.hxx" 50 51 #include "uno/current_context.hxx" 52 53 #include "vcl/configsettings.hxx" 54 #include "vcl/svapp.hxx" 55 #include "vcl/wrkwin.hxx" 56 #include "vcl/msgbox.hxx" 57 #include "vcl/unohelp.hxx" 58 #include "vcl/button.hxx" // for Button::GetStandardText 59 #include "vcl/dockwin.hxx" // for DockingManager 60 61 #include "salinst.hxx" 62 #include "salframe.hxx" 63 #include "svdata.hxx" 64 #include "window.h" 65 #include "salimestatus.hxx" 66 #include "salsys.hxx" 67 #include "svids.hrc" 68 69 #include "com/sun/star/lang/XMultiServiceFactory.hpp" 70 #include "com/sun/star/lang/XComponent.hpp" 71 #include "com/sun/star/awt/XExtendedToolkit.hpp" 72 #include "com/sun/star/java/JavaNotConfiguredException.hpp" 73 #include "com/sun/star/java/JavaVMCreationFailureException.hpp" 74 #include "com/sun/star/java/MissingJavaRuntimeException.hpp" 75 #include "com/sun/star/java/JavaDisabledException.hpp" 76 77 #include <stdio.h> 78 #ifdef WNT 79 #include <unotools/processfactory.hxx> 80 #include <com/sun/star/accessibility/XMSAAService.hpp> 81 #include <win/g_msaasvc.h> 82 #endif 83 84 namespace { 85 86 namespace css = com::sun::star; 87 88 } 89 90 using namespace com::sun::star::uno; 91 using namespace com::sun::star::lang; 92 using namespace com::sun::star::awt; 93 using namespace rtl; 94 95 // ======================================================================= 96 97 namespace 98 { 99 struct private_aImplSVData : 100 public rtl::Static<ImplSVData, private_aImplSVData> {}; 101 } 102 103 // static SV-Data 104 ImplSVData* pImplSVData = NULL; 105 106 SalSystem* ImplGetSalSystem() 107 { 108 ImplSVData* pSVData = ImplGetSVData(); 109 if( ! pSVData->mpSalSystem ) 110 pSVData->mpSalSystem = pSVData->mpDefInst->CreateSalSystem(); 111 return pSVData->mpSalSystem; 112 } 113 114 115 static String& ReplaceJavaErrorMessages( String& rString ) 116 { 117 rString.SearchAndReplaceAllAscii( "%OK", Button::GetStandardText( BUTTON_OK ) ); 118 rString.SearchAndReplaceAllAscii( "%IGNORE", Button::GetStandardText( BUTTON_IGNORE ) ); 119 rString.SearchAndReplaceAllAscii( "%CANCEL", Button::GetStandardText( BUTTON_CANCEL ) ); 120 121 return rString; 122 } 123 124 // ======================================================================= 125 126 void ImplInitSVData() 127 { 128 pImplSVData = &private_aImplSVData::get(); 129 130 // init global instance data 131 memset( pImplSVData, 0, sizeof( ImplSVData ) ); 132 pImplSVData->maHelpData.mbAutoHelpId = sal_True; 133 pImplSVData->maNWFData.maMenuBarHighlightTextColor = Color( COL_TRANSPARENT ); 134 135 // find out whether we are running in the testtool 136 // in this case we need some special workarounds 137 sal_uInt32 nArgs = osl_getCommandArgCount(); 138 for( sal_uInt32 i = 0; i < nArgs; i++ ) 139 { 140 rtl::OUString aArg; 141 osl_getCommandArg( i, &aArg.pData ); 142 if( aArg.equalsAscii( "-enableautomation" ) ) 143 { 144 pImplSVData->mbIsTestTool = true; 145 break; 146 } 147 } 148 #ifdef WNT 149 //Default enable the acc bridge interface 150 pImplSVData->maAppData.m_bEnableAccessInterface =true; 151 #endif 152 153 // mark default layout border as unitialized 154 pImplSVData->maAppData.mnDefaultLayoutBorder = -1; 155 } 156 157 // ----------------------------------------------------------------------- 158 159 void ImplDeInitSVData() 160 { 161 ImplSVData* pSVData = ImplGetSVData(); 162 163 // delete global instance data 164 if( pSVData->mpSettingsConfigItem ) 165 delete pSVData->mpSettingsConfigItem; 166 167 if( pSVData->mpDockingManager ) 168 delete pSVData->mpDockingManager; 169 170 if( pSVData->maGDIData.mpDefaultFontConfiguration ) 171 delete pSVData->maGDIData.mpDefaultFontConfiguration; 172 if( pSVData->maGDIData.mpFontSubstConfiguration ) 173 delete pSVData->maGDIData.mpFontSubstConfiguration; 174 175 if ( pSVData->maAppData.mpMSFTempFileName ) 176 { 177 if ( pSVData->maAppData.mxMSF.is() ) 178 { 179 ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > xComp( pSVData->maAppData.mxMSF, ::com::sun::star::uno::UNO_QUERY ); 180 xComp->dispose(); 181 pSVData->maAppData.mxMSF = NULL; 182 } 183 184 ::rtl::OUString aFileUrl; 185 ::osl::File::getFileURLFromSystemPath( *pSVData->maAppData.mpMSFTempFileName, aFileUrl ); 186 osl::File::remove( aFileUrl ); 187 delete pSVData->maAppData.mpMSFTempFileName; 188 pSVData->maAppData.mpMSFTempFileName = NULL; 189 } 190 191 if( pSVData->maCtrlData.mpFieldUnitStrings ) 192 delete pSVData->maCtrlData.mpFieldUnitStrings, pSVData->maCtrlData.mpFieldUnitStrings = NULL; 193 if( pSVData->maCtrlData.mpCleanUnitStrings ) 194 delete pSVData->maCtrlData.mpCleanUnitStrings, pSVData->maCtrlData.mpCleanUnitStrings = NULL; 195 if( pSVData->mpPaperNames ) 196 delete pSVData->mpPaperNames, pSVData->mpPaperNames = NULL; 197 } 198 199 // ----------------------------------------------------------------------- 200 201 void ImplDestroySVData() 202 { 203 pImplSVData = NULL; 204 } 205 206 // ----------------------------------------------------------------------- 207 208 Window* ImplGetDefaultWindow() 209 { 210 ImplSVData* pSVData = ImplGetSVData(); 211 if ( pSVData->maWinData.mpAppWin ) 212 return pSVData->maWinData.mpAppWin; 213 214 // First test if we already have a default window. 215 // Don't only place a single if..else inside solar mutex lockframe 216 // because then we might have to wait for the solar mutex what is not neccessary 217 // if we already have a default window. 218 219 if ( !pSVData->mpDefaultWin ) 220 { 221 Application::GetSolarMutex().acquire(); 222 223 // Test again because the thread who released the solar mutex could have called 224 // the same method 225 226 if ( !pSVData->mpDefaultWin && !pSVData->mbDeInit ) 227 { 228 DBG_WARNING( "ImplGetDefaultWindow(): No AppWindow" ); 229 pSVData->mpDefaultWin = new WorkWindow( 0, WB_DEFAULTWIN ); 230 pSVData->mpDefaultWin->SetText( OUString( RTL_CONSTASCII_USTRINGPARAM( "VCL ImplGetDefaultWindow" ) ) ); 231 } 232 Application::GetSolarMutex().release(); 233 } 234 235 return pSVData->mpDefaultWin; 236 } 237 238 // ----------------------------------------------------------------------- 239 240 #define VCL_CREATERESMGR_NAME( Name ) #Name 241 242 ResMgr* ImplGetResMgr() 243 { 244 ImplSVData* pSVData = ImplGetSVData(); 245 if ( !pSVData->mpResMgr ) 246 { 247 ::com::sun::star::lang::Locale aLocale = Application::GetSettings().GetUILocale(); 248 pSVData->mpResMgr = ResMgr::SearchCreateResMgr( VCL_CREATERESMGR_NAME( vcl ), aLocale ); 249 250 static bool bMessageOnce = false; 251 if( !pSVData->mpResMgr && ! bMessageOnce ) 252 { 253 bMessageOnce = true; 254 const char* pMsg = 255 "Missing vcl resource. This indicates that files vital to localization are missing. " 256 "You might have a corrupt installation."; 257 fprintf( stderr, "%s\n", pMsg ); 258 ErrorBox aBox( NULL, WB_OK | WB_DEF_OK, rtl::OUString( pMsg, strlen( pMsg ), RTL_TEXTENCODING_ASCII_US ) ); 259 aBox.Execute(); 260 } 261 } 262 return pSVData->mpResMgr; 263 } 264 265 ResId VclResId( sal_Int32 nId ) 266 { 267 ResMgr* pMgr = ImplGetResMgr(); 268 if( ! pMgr ) 269 throw std::bad_alloc(); 270 271 return ResId( nId, *pMgr ); 272 } 273 274 FieldUnitStringList* ImplGetFieldUnits() 275 { 276 ImplSVData* pSVData = ImplGetSVData(); 277 if( ! pSVData->maCtrlData.mpFieldUnitStrings ) 278 { 279 ResMgr* pResMgr = ImplGetResMgr(); 280 if( pResMgr ) 281 { 282 ResStringArray aUnits( ResId (SV_FUNIT_STRINGS, *pResMgr) ); 283 sal_uInt32 nUnits = aUnits.Count(); 284 pSVData->maCtrlData.mpFieldUnitStrings = new FieldUnitStringList(); 285 pSVData->maCtrlData.mpFieldUnitStrings->reserve( nUnits ); 286 for( sal_uInt32 i = 0; i < nUnits; i++ ) 287 { 288 std::pair< String, FieldUnit > aElement( aUnits.GetString(i), static_cast<FieldUnit>(aUnits.GetValue(i)) ); 289 pSVData->maCtrlData.mpFieldUnitStrings->push_back( aElement ); 290 } 291 } 292 } 293 return pSVData->maCtrlData.mpFieldUnitStrings; 294 } 295 296 FieldUnitStringList* ImplGetCleanedFieldUnits() 297 { 298 ImplSVData* pSVData = ImplGetSVData(); 299 if( ! pSVData->maCtrlData.mpCleanUnitStrings ) 300 { 301 FieldUnitStringList* pUnits = ImplGetFieldUnits(); 302 if( pUnits ) 303 { 304 size_t nUnits = pUnits->size(); 305 pSVData->maCtrlData.mpCleanUnitStrings = new FieldUnitStringList(); 306 pSVData->maCtrlData.mpCleanUnitStrings->reserve( nUnits ); 307 for( size_t i = 0; i < nUnits; i++ ) 308 { 309 String aUnit( (*pUnits)[i].first ); 310 aUnit.EraseAllChars( sal_Unicode( ' ' ) ); 311 aUnit.ToLowerAscii(); 312 std::pair< String, FieldUnit > aElement( aUnit, (*pUnits)[i].second ); 313 pSVData->maCtrlData.mpCleanUnitStrings->push_back( aElement ); 314 } 315 } 316 } 317 return pSVData->maCtrlData.mpCleanUnitStrings; 318 } 319 320 DockingManager* ImplGetDockingManager() 321 { 322 ImplSVData* pSVData = ImplGetSVData(); 323 if ( !pSVData->mpDockingManager ) 324 pSVData->mpDockingManager = new DockingManager(); 325 326 return pSVData->mpDockingManager; 327 } 328 329 class AccessBridgeCurrentContext: public cppu::WeakImplHelper1< com::sun::star::uno::XCurrentContext > 330 { 331 public: 332 AccessBridgeCurrentContext( 333 const com::sun::star::uno::Reference< com::sun::star::uno::XCurrentContext > &context ) : 334 m_prevContext( context ) {} 335 336 // XCurrentContext 337 virtual com::sun::star::uno::Any SAL_CALL getValueByName( const rtl::OUString& Name ) 338 throw (com::sun::star::uno::RuntimeException); 339 private: 340 com::sun::star::uno::Reference< com::sun::star::uno::XCurrentContext > m_prevContext; 341 }; 342 343 com::sun::star::uno::Any AccessBridgeCurrentContext::getValueByName( const rtl::OUString & Name ) 344 throw (com::sun::star::uno::RuntimeException) 345 { 346 com::sun::star::uno::Any ret; 347 if( Name.equalsAscii( "java-vm.interaction-handler" ) ) 348 { 349 // Currently, for accessbility no interaction handler shall be offered. 350 // There may be introduced later on a handler using native toolkits 351 // jbu->obr: Instantiate here your interaction handler 352 } 353 else if( m_prevContext.is() ) 354 { 355 ret = m_prevContext->getValueByName( Name ); 356 } 357 return ret; 358 } 359 #ifdef WNT 360 void AccessBridgehandleExistingWindow(Window * pWindow, bool bShow) 361 { 362 if ( pWindow ) 363 { 364 css::uno::Reference< css::accessibility::XAccessible > xAccessible; 365 366 // Test for combo box - drop down floating windows first 367 Window * pParentWindow = pWindow->GetParent(); 368 369 if ( pParentWindow ) 370 { 371 try 372 { 373 // The parent window of a combo box floating window should have the role COMBO_BOX 374 css::uno::Reference< css::accessibility::XAccessible > xParentAccessible(pParentWindow->GetAccessible()); 375 if ( xParentAccessible.is() ) 376 { 377 css::uno::Reference< css::accessibility::XAccessibleContext > xParentAC( xParentAccessible->getAccessibleContext() ); 378 if ( xParentAC.is() && (css::accessibility::AccessibleRole::COMBO_BOX == xParentAC->getAccessibleRole()) ) 379 { 380 // O.k. - this is a combo box floating window corresponding to the child of role LIST of the parent. 381 // Let's not rely on a specific child order, just search for the child with the role LIST 382 sal_Int32 nCount = xParentAC->getAccessibleChildCount(); 383 for ( sal_Int32 n = 0; (n < nCount) && !xAccessible.is(); n++) 384 { 385 css::uno::Reference< css::accessibility::XAccessible > xChild = xParentAC->getAccessibleChild(n); 386 if ( xChild.is() ) 387 { 388 css::uno::Reference< css::accessibility::XAccessibleContext > xChildAC = xChild->getAccessibleContext(); 389 if ( xChildAC.is() && (css::accessibility::AccessibleRole::LIST == xChildAC->getAccessibleRole()) ) 390 { 391 xAccessible = xChild; 392 } 393 } 394 } 395 } 396 } 397 } 398 catch (::com::sun::star::uno::RuntimeException e) 399 { 400 // Ignore show events that throw DisposedExceptions in getAccessibleContext(), 401 // but keep revoking these windows in hide(s). 402 if (bShow) 403 return; 404 } 405 } 406 407 // We have to rely on the fact that Window::GetAccessible()->getAccessibleContext() returns a valid XAccessibleContext 408 // also for other menus than menubar or toplevel popup window. Otherwise we had to traverse the hierarchy to find the 409 // context object to this menu floater. This makes the call to Window->IsMenuFloatingWindow() obsolete. 410 if ( ! xAccessible.is() ) 411 xAccessible = pWindow->GetAccessible(); 412 413 if ( xAccessible.is() && g_acc_manager1 ) 414 { 415 g_acc_manager1->handleWindowOpened( (long)(xAccessible.get())); 416 } 417 } 418 } 419 420 void AccessBridgeupdateOldTopWindows() 421 { 422 sal_uInt16 nTopWindowCount = (sal_uInt16)Application::GetTopWindowCount(); 423 for (sal_uInt16 i = 0; i < nTopWindowCount; i++) 424 { 425 Window* pTopWindow = Application::GetTopWindow( i ); 426 css::uno::Reference< css::accessibility::XAccessible > xAccessible = pTopWindow->GetAccessible(); 427 if ( xAccessible.is() ) 428 { 429 css::uno::Reference< css::accessibility::XAccessibleContext > xAC(xAccessible->getAccessibleContext()); 430 if ( xAC.is()) 431 { 432 short role = xAC->getAccessibleRole(); 433 if(xAC->getAccessibleName().getLength() > 0) 434 AccessBridgehandleExistingWindow(pTopWindow, true); 435 } 436 } 437 } 438 } 439 #endif 440 441 bool ImplInitAccessBridge(sal_Bool bAllowCancel, sal_Bool &rCancelled) 442 { 443 rCancelled = sal_False; 444 445 sal_Bool bErrorMessage = sal_True; 446 447 // Note: 448 // if bAllowCancel is sal_True we were called from application startup 449 // where we will disable any Java errorboxes and show our own accessibility dialog if Java throws an exception 450 // if bAllowCancel is sal_False we were called from Tools->Options 451 // where we will see Java errorboxes, se we do not show our dialogs in addition to Java's 452 453 try 454 { 455 sal_Bool bSuccess = sal_True; 456 457 // No error messages when env var is set .. 458 static const char* pEnv = getenv("SAL_ACCESSIBILITY_ENABLED" ); 459 if( pEnv && *pEnv ) 460 { 461 bErrorMessage = sal_False; 462 } 463 464 ImplSVData* pSVData = ImplGetSVData(); 465 if( ! pSVData->mxAccessBridge.is() ) 466 { 467 css::uno::Reference< XMultiServiceFactory > xFactory(vcl::unohelper::GetMultiServiceFactory()); 468 469 if( xFactory.is() ) 470 { 471 #ifdef WNT 472 pSVData->mxAccessBridge = xFactory->createInstance( 473 OUString::createFromAscii( "com.sun.star.accessibility.MSAAService" ) ); 474 if( pSVData->mxAccessBridge.is() ) 475 { 476 css::uno::Reference< css::uno::XInterface > pRManager= pSVData->mxAccessBridge; 477 g_acc_manager1 = (css::accessibility::XMSAAService*)(pRManager.get()); 478 AccessBridgeupdateOldTopWindows(); 479 } 480 481 if( !pSVData->mxAccessBridge.is() ) 482 bSuccess = sal_False; 483 return bSuccess; 484 #endif 485 css::uno::Reference< XExtendedToolkit > xToolkit = 486 css::uno::Reference< XExtendedToolkit >(Application::GetVCLToolkit(), UNO_QUERY); 487 488 Sequence< Any > arguments(1); 489 arguments[0] = makeAny(xToolkit); 490 491 // Disable default java error messages on startup, because they were probably unreadable 492 // for a disabled user. Use native message boxes which are accessible without java support. 493 // No need to do this when activated by Tools-Options dialog .. 494 if( bAllowCancel ) 495 { 496 // customize the java-not-available-interaction-handler entry within the 497 // current context when called at startup. 498 com::sun::star::uno::ContextLayer layer( 499 new AccessBridgeCurrentContext( com::sun::star::uno::getCurrentContext() ) ); 500 501 pSVData->mxAccessBridge = xFactory->createInstanceWithArguments( 502 OUString::createFromAscii( "com.sun.star.accessibility.AccessBridge" ), 503 arguments 504 ); 505 } 506 else 507 { 508 pSVData->mxAccessBridge = xFactory->createInstanceWithArguments( 509 OUString::createFromAscii( "com.sun.star.accessibility.AccessBridge" ), 510 arguments 511 ); 512 } 513 514 if( !pSVData->mxAccessBridge.is() ) 515 bSuccess = sal_False; 516 } 517 } 518 519 return bSuccess; 520 } 521 522 catch(::com::sun::star::java::JavaNotConfiguredException&) 523 { 524 ResMgr *pResMgr = ImplGetResMgr(); 525 if( bErrorMessage && bAllowCancel && pResMgr ) 526 { 527 String aTitle(ResId(SV_ACCESSERROR_JAVA_NOT_CONFIGURED, *pResMgr)); 528 String aMessage(ResId(SV_ACCESSERROR_JAVA_MSG, *pResMgr)); 529 530 aMessage += String(" ", 1, RTL_TEXTENCODING_ASCII_US); 531 aMessage += String(ResId(SV_ACCESSERROR_OK_CANCEL_MSG, *pResMgr)); 532 533 int ret = ImplGetSalSystem()->ShowNativeMessageBox( 534 aTitle, 535 ReplaceJavaErrorMessages(aMessage), 536 SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL, 537 SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL); 538 539 // Do not change the setting in case the user chooses to cancel 540 if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret ) 541 rCancelled = sal_True; 542 } 543 544 return sal_False; 545 } 546 547 catch(::com::sun::star::java::JavaVMCreationFailureException&) 548 { 549 ResMgr *pResMgr = ImplGetResMgr(); 550 if( bErrorMessage && bAllowCancel && pResMgr ) 551 { 552 String aTitle(ResId(SV_ACCESSERROR_FAULTY_JAVA, *pResMgr)); 553 String aMessage(ResId(SV_ACCESSERROR_JAVA_MSG, *pResMgr)); 554 555 aMessage += String(" ", 1, RTL_TEXTENCODING_ASCII_US); 556 aMessage += String(ResId(SV_ACCESSERROR_OK_CANCEL_MSG, *pResMgr)); 557 558 int ret = ImplGetSalSystem()->ShowNativeMessageBox( 559 aTitle, 560 ReplaceJavaErrorMessages(aMessage), 561 SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL, 562 SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL); 563 564 // Do not change the setting in case the user chooses to cancel 565 if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret ) 566 rCancelled = sal_True; 567 } 568 569 return sal_False; 570 } 571 572 catch(::com::sun::star::java::MissingJavaRuntimeException&) 573 { 574 ResMgr *pResMgr = ImplGetResMgr(); 575 if( bErrorMessage && bAllowCancel && pResMgr ) 576 { 577 String aTitle(ResId(SV_ACCESSERROR_MISSING_JAVA, *pResMgr)); 578 String aMessage(ResId(SV_ACCESSERROR_JAVA_MSG, *pResMgr)); 579 580 aMessage += String(" ", 1, RTL_TEXTENCODING_ASCII_US); 581 aMessage += String(ResId(SV_ACCESSERROR_OK_CANCEL_MSG, *pResMgr)); 582 583 int ret = ImplGetSalSystem()->ShowNativeMessageBox( 584 aTitle, 585 ReplaceJavaErrorMessages(aMessage), 586 SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL, 587 SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL); 588 589 // Do not change the setting in case the user chooses to cancel 590 if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret ) 591 rCancelled = sal_True; 592 } 593 594 return sal_False; 595 } 596 597 catch(::com::sun::star::java::JavaDisabledException&) 598 { 599 ResMgr *pResMgr = ImplGetResMgr(); 600 if( bErrorMessage && bAllowCancel && pResMgr ) 601 { 602 String aTitle(ResId(SV_ACCESSERROR_JAVA_DISABLED, *pResMgr)); 603 String aMessage(ResId(SV_ACCESSERROR_JAVA_MSG, *pResMgr)); 604 605 aMessage += String(" ", 1, RTL_TEXTENCODING_ASCII_US); 606 aMessage += String(ResId(SV_ACCESSERROR_OK_CANCEL_MSG, *pResMgr)); 607 608 int ret = ImplGetSalSystem()->ShowNativeMessageBox( 609 aTitle, 610 ReplaceJavaErrorMessages(aMessage), 611 SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL, 612 SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL); 613 614 // Do not change the setting in case the user chooses to cancel 615 if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret ) 616 rCancelled = sal_True; 617 } 618 619 return sal_False; 620 } 621 622 623 catch(::com::sun::star::uno::RuntimeException& e) 624 { 625 ResMgr *pResMgr = ImplGetResMgr(); 626 if( bErrorMessage && pResMgr ) 627 { 628 String aTitle; 629 String aMessage(ResId(SV_ACCESSERROR_BRIDGE_MSG, *pResMgr)); 630 631 if( 0 == e.Message.compareTo(::rtl::OUString::createFromAscii("ClassNotFound"), 13) ) 632 { 633 aTitle = String(ResId(SV_ACCESSERROR_MISSING_BRIDGE, *pResMgr)); 634 } 635 else if( 0 == e.Message.compareTo(::rtl::OUString::createFromAscii("NoSuchMethod"), 12) ) 636 { 637 aTitle = String(ResId(SV_ACCESSERROR_WRONG_VERSION, *pResMgr)); 638 } 639 640 if( aTitle.Len() != 0 ) 641 { 642 if( bAllowCancel ) 643 { 644 // Something went wrong initializing the Java AccessBridge (on Windows) during the 645 // startup. Since the office will be probably unusable for a disabled user, we offer 646 // to terminate directly. 647 aMessage += String(" ", 1, RTL_TEXTENCODING_ASCII_US); 648 aMessage += String(ResId(SV_ACCESSERROR_OK_CANCEL_MSG, *pResMgr)); 649 650 int ret = ImplGetSalSystem()->ShowNativeMessageBox( 651 aTitle, 652 ReplaceJavaErrorMessages(aMessage), 653 SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL, 654 SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL); 655 656 // Do not change the setting in case the user chooses to cancel 657 if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret ) 658 rCancelled = sal_True; 659 } 660 else 661 { 662 // The user tried to activate accessibility support using Tools-Options dialog, 663 // so we don't offer to terminate here ! 664 ImplGetSalSystem()->ShowNativeMessageBox( 665 aTitle, 666 ReplaceJavaErrorMessages(aMessage), 667 SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK, 668 SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK); 669 } 670 } 671 } 672 673 return sal_False; 674 } 675 676 catch (...) 677 { 678 return sal_False; 679 } 680 } 681 682 // ----------------------------------------------------------------------- 683 684 Window* ImplFindWindow( const SalFrame* pFrame, ::Point& rSalFramePos ) 685 { 686 ImplSVData* pSVData = ImplGetSVData(); 687 Window* pFrameWindow = pSVData->maWinData.mpFirstFrame; 688 while ( pFrameWindow ) 689 { 690 if ( pFrameWindow->ImplGetFrame() == pFrame ) 691 { 692 Window* pWindow = pFrameWindow->ImplFindWindow( rSalFramePos ); 693 if ( !pWindow ) 694 pWindow = pFrameWindow->ImplGetWindow(); 695 rSalFramePos = pWindow->ImplFrameToOutput( rSalFramePos ); 696 return pWindow; 697 } 698 pFrameWindow = pFrameWindow->ImplGetFrameData()->mpNextFrame; 699 } 700 701 return NULL; 702 } 703 704 void LocaleConfigurationListener::ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 nHint ) 705 { 706 AllSettings::LocaleSettingsChanged( nHint ); 707 } 708 709