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