xref: /aoo4110/main/vcl/source/app/svdata.cxx (revision b1cdbd2c)
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 
ImplGetSalSystem()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 
ReplaceJavaErrorMessages(String & rString)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 
ImplInitSVData()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 
ImplDeInitSVData()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 
ImplDestroySVData()201 void ImplDestroySVData()
202 {
203     pImplSVData = NULL;
204 }
205 
206 // -----------------------------------------------------------------------
207 
ImplGetDefaultWindow()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 
ImplGetResMgr()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 
VclResId(sal_Int32 nId)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 
ImplGetFieldUnits()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 
ImplGetCleanedFieldUnits()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 
ImplGetDockingManager()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:
AccessBridgeCurrentContext(const com::sun::star::uno::Reference<com::sun::star::uno::XCurrentContext> & context)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 
getValueByName(const rtl::OUString & Name)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
AccessBridgehandleExistingWindow(Window * pWindow,bool bShow)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 
AccessBridgeupdateOldTopWindows()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 
ImplInitAccessBridge(sal_Bool bAllowCancel,sal_Bool & rCancelled)441 bool ImplInitAccessBridge(sal_Bool bAllowCancel, sal_Bool &rCancelled)
442 {
443     rCancelled = sal_False;
444 
445     bool bErrorMessage = 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         bool bSuccess = 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 = 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 = 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 = 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 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 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 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 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 false;
674     }
675 
676     catch (...)
677     {
678         return false;
679     }
680 }
681 
682 // -----------------------------------------------------------------------
683 
ImplFindWindow(const SalFrame * pFrame,::Point & rSalFramePos)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 
ConfigurationChanged(utl::ConfigurationBroadcaster *,sal_uInt32 nHint)704 void LocaleConfigurationListener::ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 nHint )
705 {
706 	AllSettings::LocaleSettingsChanged( nHint );
707 }
708 
709