1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_toolkit.hxx"
26*b1cdbd2cSJim Jagielski #include <toolkit/controls/accessiblecontrolcontext.hxx>
27*b1cdbd2cSJim Jagielski #include <unotools/accessiblestatesethelper.hxx>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XControl.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XWindow.hpp>
30*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleStateType.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleRole.hpp>
33*b1cdbd2cSJim Jagielski #include <toolkit/helper/vclunohelper.hxx>
34*b1cdbd2cSJim Jagielski #include <vcl/window.hxx>
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski //........................................................................
37*b1cdbd2cSJim Jagielski namespace toolkit
38*b1cdbd2cSJim Jagielski {
39*b1cdbd2cSJim Jagielski //........................................................................
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski 	using ::comphelper::OContextEntryGuard;
42*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star;
43*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::uno;
44*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::lang;
45*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::beans;
46*b1cdbd2cSJim Jagielski 	using namespace ::com::sun::star::accessibility;
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski 	//====================================================================
49*b1cdbd2cSJim Jagielski 	//= OAccessibleControlContext
50*b1cdbd2cSJim Jagielski 	//====================================================================
51*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
OAccessibleControlContext()52*b1cdbd2cSJim Jagielski 	OAccessibleControlContext::OAccessibleControlContext()
53*b1cdbd2cSJim Jagielski 		:OAccessibleControlContext_Base( )
54*b1cdbd2cSJim Jagielski 	{
55*b1cdbd2cSJim Jagielski 		// nothing to do here, we have a late ctor
56*b1cdbd2cSJim Jagielski 	}
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
~OAccessibleControlContext()59*b1cdbd2cSJim Jagielski 	OAccessibleControlContext::~OAccessibleControlContext()
60*b1cdbd2cSJim Jagielski 	{
61*b1cdbd2cSJim Jagielski 		ensureDisposed();
62*b1cdbd2cSJim Jagielski 	}
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
IMPLEMENT_FORWARD_XINTERFACE3(OAccessibleControlContext,OAccessibleControlContext_Base,OAccessibleImplementationAccess,OAccessibleControlContext_IBase)65*b1cdbd2cSJim Jagielski 	IMPLEMENT_FORWARD_XINTERFACE3( OAccessibleControlContext, OAccessibleControlContext_Base, OAccessibleImplementationAccess, OAccessibleControlContext_IBase )
66*b1cdbd2cSJim Jagielski 	IMPLEMENT_FORWARD_XTYPEPROVIDER3( OAccessibleControlContext, OAccessibleControlContext_Base, OAccessibleImplementationAccess, OAccessibleControlContext_IBase )
67*b1cdbd2cSJim Jagielski 		// (order matters: the first is the class name, the second is the class doing the ref counting)
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
70*b1cdbd2cSJim Jagielski 	void OAccessibleControlContext::Init( const Reference< XAccessible >& _rxCreator ) SAL_THROW( ( Exception ) )
71*b1cdbd2cSJim Jagielski 	{
72*b1cdbd2cSJim Jagielski 		OContextEntryGuard aGuard( this );
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski 		// retrieve the model of the control
75*b1cdbd2cSJim Jagielski 		OSL_ENSURE( !m_xControlModel.is(), "OAccessibleControlContext::Init: already know a control model....!???" );
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski 		Reference< awt::XControl > xControl( _rxCreator, UNO_QUERY );
78*b1cdbd2cSJim Jagielski 		if ( xControl.is() )
79*b1cdbd2cSJim Jagielski 			m_xControlModel = m_xControlModel.query( xControl->getModel() );
80*b1cdbd2cSJim Jagielski 		OSL_ENSURE( m_xControlModel.is(), "OAccessibleControlContext::Init: invalid creator (no control, or control without model!" );
81*b1cdbd2cSJim Jagielski 		if ( !m_xControlModel.is() )
82*b1cdbd2cSJim Jagielski 			throw DisposedException();	// caught by the caller (the create method)
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski 		// start listening at the model
85*b1cdbd2cSJim Jagielski 		startModelListening();
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski 		// announce the XAccessible to our base class
88*b1cdbd2cSJim Jagielski 		OAccessibleControlContext_Base::lateInit( _rxCreator );
89*b1cdbd2cSJim Jagielski 	}
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
create(const Reference<XAccessible> & _rxCreator)92*b1cdbd2cSJim Jagielski 	OAccessibleControlContext* OAccessibleControlContext::create( const Reference< XAccessible >& _rxCreator ) SAL_THROW( ( ) )
93*b1cdbd2cSJim Jagielski 	{
94*b1cdbd2cSJim Jagielski 		OAccessibleControlContext* pNew = NULL;
95*b1cdbd2cSJim Jagielski 		try
96*b1cdbd2cSJim Jagielski 		{
97*b1cdbd2cSJim Jagielski 			pNew = new OAccessibleControlContext;
98*b1cdbd2cSJim Jagielski 			pNew->Init( _rxCreator );
99*b1cdbd2cSJim Jagielski 		}
100*b1cdbd2cSJim Jagielski 		catch( const Exception& )
101*b1cdbd2cSJim Jagielski 		{
102*b1cdbd2cSJim Jagielski 			OSL_ENSURE( sal_False, "OAccessibleControlContext::create: caught an exception from the late ctor!" );
103*b1cdbd2cSJim Jagielski 		}
104*b1cdbd2cSJim Jagielski 		return pNew;
105*b1cdbd2cSJim Jagielski 	}
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
startModelListening()108*b1cdbd2cSJim Jagielski 	void OAccessibleControlContext::startModelListening( ) SAL_THROW( ( Exception ) )
109*b1cdbd2cSJim Jagielski 	{
110*b1cdbd2cSJim Jagielski 		Reference< XComponent > xModelComp( m_xControlModel, UNO_QUERY );
111*b1cdbd2cSJim Jagielski 		OSL_ENSURE( xModelComp.is(), "OAccessibleControlContext::startModelListening: invalid model!" );
112*b1cdbd2cSJim Jagielski 		if ( xModelComp.is() )
113*b1cdbd2cSJim Jagielski 			xModelComp->addEventListener( this );
114*b1cdbd2cSJim Jagielski 	}
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
stopModelListening()117*b1cdbd2cSJim Jagielski 	void OAccessibleControlContext::stopModelListening( ) SAL_THROW( ( Exception ) )
118*b1cdbd2cSJim Jagielski 	{
119*b1cdbd2cSJim Jagielski 		Reference< XComponent > xModelComp( m_xControlModel, UNO_QUERY );
120*b1cdbd2cSJim Jagielski 		OSL_ENSURE( xModelComp.is(), "OAccessibleControlContext::stopModelListening: invalid model!" );
121*b1cdbd2cSJim Jagielski 		if ( xModelComp.is() )
122*b1cdbd2cSJim Jagielski 			xModelComp->removeEventListener( this );
123*b1cdbd2cSJim Jagielski 	}
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getAccessibleChildCount()126*b1cdbd2cSJim Jagielski 	sal_Int32 SAL_CALL OAccessibleControlContext::getAccessibleChildCount(  ) throw (RuntimeException)
127*b1cdbd2cSJim Jagielski 	{
128*b1cdbd2cSJim Jagielski 		// we do not have children
129*b1cdbd2cSJim Jagielski 		return 0;
130*b1cdbd2cSJim Jagielski 	}
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getAccessibleChild(sal_Int32)133*b1cdbd2cSJim Jagielski 	Reference< XAccessible > SAL_CALL OAccessibleControlContext::getAccessibleChild( sal_Int32 ) throw (IndexOutOfBoundsException, RuntimeException)
134*b1cdbd2cSJim Jagielski 	{
135*b1cdbd2cSJim Jagielski 		// we do not have children
136*b1cdbd2cSJim Jagielski 		throw IndexOutOfBoundsException();
137*b1cdbd2cSJim Jagielski 	}
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getAccessibleParent()140*b1cdbd2cSJim Jagielski 	Reference< XAccessible > SAL_CALL OAccessibleControlContext::getAccessibleParent(  ) throw (RuntimeException)
141*b1cdbd2cSJim Jagielski 	{
142*b1cdbd2cSJim Jagielski 		OContextEntryGuard aGuard( this );
143*b1cdbd2cSJim Jagielski 		OSL_ENSURE( implGetForeignControlledParent().is(), "OAccessibleControlContext::getAccessibleParent: somebody forgot to set a parent!" );
144*b1cdbd2cSJim Jagielski 			// this parent of us is foreign controlled - somebody has to set it using the OAccessibleImplementationAccess
145*b1cdbd2cSJim Jagielski 			// class, before integrating our instance into an AccessibleDocumentModel
146*b1cdbd2cSJim Jagielski 		return implGetForeignControlledParent();
147*b1cdbd2cSJim Jagielski 	}
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getAccessibleRole()150*b1cdbd2cSJim Jagielski 	sal_Int16 SAL_CALL OAccessibleControlContext::getAccessibleRole(  ) throw (RuntimeException)
151*b1cdbd2cSJim Jagielski 	{
152*b1cdbd2cSJim Jagielski 		return AccessibleRole::SHAPE;
153*b1cdbd2cSJim Jagielski 	}
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getAccessibleDescription()156*b1cdbd2cSJim Jagielski 	::rtl::OUString SAL_CALL OAccessibleControlContext::getAccessibleDescription(  ) throw (RuntimeException)
157*b1cdbd2cSJim Jagielski 	{
158*b1cdbd2cSJim Jagielski 		OContextEntryGuard aGuard( this );
159*b1cdbd2cSJim Jagielski 		return getModelStringProperty( "HelpText" );
160*b1cdbd2cSJim Jagielski 	}
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getAccessibleName()163*b1cdbd2cSJim Jagielski 	::rtl::OUString SAL_CALL OAccessibleControlContext::getAccessibleName(  ) throw (RuntimeException)
164*b1cdbd2cSJim Jagielski 	{
165*b1cdbd2cSJim Jagielski 		OContextEntryGuard aGuard( this );
166*b1cdbd2cSJim Jagielski 		return getModelStringProperty( "Name" );
167*b1cdbd2cSJim Jagielski 	}
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getAccessibleRelationSet()170*b1cdbd2cSJim Jagielski 	Reference< XAccessibleRelationSet > SAL_CALL OAccessibleControlContext::getAccessibleRelationSet(  ) throw (RuntimeException)
171*b1cdbd2cSJim Jagielski 	{
172*b1cdbd2cSJim Jagielski 		return NULL;
173*b1cdbd2cSJim Jagielski 	}
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getAccessibleStateSet()176*b1cdbd2cSJim Jagielski 	Reference< XAccessibleStateSet > SAL_CALL OAccessibleControlContext::getAccessibleStateSet(  ) throw (RuntimeException)
177*b1cdbd2cSJim Jagielski 	{
178*b1cdbd2cSJim Jagielski 		::osl::MutexGuard aGuard( GetMutex() );
179*b1cdbd2cSJim Jagielski 			// no OContextEntryGuard here, as we do not want to throw an exception in case we're not alive anymore
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski 		::utl::AccessibleStateSetHelper* pStateSet = NULL;
182*b1cdbd2cSJim Jagielski 		if ( isAlive() )
183*b1cdbd2cSJim Jagielski 		{
184*b1cdbd2cSJim Jagielski 			// no own states, only the ones which are foreign controlled
185*b1cdbd2cSJim Jagielski 			pStateSet = new ::utl::AccessibleStateSetHelper( implGetForeignControlledStates() );
186*b1cdbd2cSJim Jagielski 		}
187*b1cdbd2cSJim Jagielski 		else
188*b1cdbd2cSJim Jagielski 		{	// only the DEFUNC state if we're already disposed
189*b1cdbd2cSJim Jagielski 			pStateSet = new ::utl::AccessibleStateSetHelper;
190*b1cdbd2cSJim Jagielski 			pStateSet->AddState( AccessibleStateType::DEFUNC );
191*b1cdbd2cSJim Jagielski 		}
192*b1cdbd2cSJim Jagielski 		return pStateSet;
193*b1cdbd2cSJim Jagielski 	}
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
disposing(const EventObject & _rSource)196*b1cdbd2cSJim Jagielski 	void SAL_CALL OAccessibleControlContext::disposing( const EventObject&
197*b1cdbd2cSJim Jagielski     #if OSL_DEBUG_LEVEL > 0
198*b1cdbd2cSJim Jagielski     _rSource
199*b1cdbd2cSJim Jagielski     #endif
200*b1cdbd2cSJim Jagielski     ) throw ( RuntimeException )
201*b1cdbd2cSJim Jagielski 	{
202*b1cdbd2cSJim Jagielski 		OSL_ENSURE( Reference< XPropertySet >( _rSource.Source, UNO_QUERY ).get() == m_xControlModel.get(),
203*b1cdbd2cSJim Jagielski 			"OAccessibleControlContext::disposing: where did this come from?" );
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski 		stopModelListening( );
206*b1cdbd2cSJim Jagielski 		m_xControlModel.clear();
207*b1cdbd2cSJim Jagielski 		m_xModelPropsInfo.clear();
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski 		OAccessibleControlContext_Base::disposing();
210*b1cdbd2cSJim Jagielski 	}
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getModelStringProperty(const sal_Char * _pPropertyName)213*b1cdbd2cSJim Jagielski 	::rtl::OUString	OAccessibleControlContext::getModelStringProperty( const sal_Char* _pPropertyName )
214*b1cdbd2cSJim Jagielski 	{
215*b1cdbd2cSJim Jagielski 		::rtl::OUString sReturn;
216*b1cdbd2cSJim Jagielski 		try
217*b1cdbd2cSJim Jagielski 		{
218*b1cdbd2cSJim Jagielski 			if ( !m_xModelPropsInfo.is() && m_xControlModel.is() )
219*b1cdbd2cSJim Jagielski 				m_xModelPropsInfo = m_xControlModel->getPropertySetInfo();
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski 			::rtl::OUString sPropertyName( ::rtl::OUString::createFromAscii( _pPropertyName ) );
222*b1cdbd2cSJim Jagielski 			if ( m_xModelPropsInfo.is() && m_xModelPropsInfo->hasPropertyByName( sPropertyName ) )
223*b1cdbd2cSJim Jagielski 				m_xControlModel->getPropertyValue( sPropertyName ) >>= sReturn;
224*b1cdbd2cSJim Jagielski 		}
225*b1cdbd2cSJim Jagielski 		catch( const Exception& )
226*b1cdbd2cSJim Jagielski 		{
227*b1cdbd2cSJim Jagielski 			OSL_ENSURE( sal_False, "OAccessibleControlContext::getModelStringProperty: caught an exception!" );
228*b1cdbd2cSJim Jagielski 		}
229*b1cdbd2cSJim Jagielski 		return sReturn;
230*b1cdbd2cSJim Jagielski 	}
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
implGetWindow(Reference<awt::XWindow> * _pxUNOWindow) const233*b1cdbd2cSJim Jagielski 	Window*	OAccessibleControlContext::implGetWindow( Reference< awt::XWindow >* _pxUNOWindow ) const
234*b1cdbd2cSJim Jagielski 	{
235*b1cdbd2cSJim Jagielski 		Reference< awt::XControl > xControl( getAccessibleCreator(), UNO_QUERY );
236*b1cdbd2cSJim Jagielski 		Reference< awt::XWindow > xWindow;
237*b1cdbd2cSJim Jagielski 		if ( xControl.is() )
238*b1cdbd2cSJim Jagielski 			xWindow = xWindow.query( xControl->getPeer() );
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski 		Window* pWindow = xWindow.is() ? VCLUnoHelper::GetWindow( xWindow ) : NULL;
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski 		if ( _pxUNOWindow )
243*b1cdbd2cSJim Jagielski 			*_pxUNOWindow = xWindow;
244*b1cdbd2cSJim Jagielski 		return pWindow;
245*b1cdbd2cSJim Jagielski 	}
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
implGetBounds()248*b1cdbd2cSJim Jagielski 	awt::Rectangle SAL_CALL OAccessibleControlContext::implGetBounds(  ) throw (RuntimeException)
249*b1cdbd2cSJim Jagielski 	{
250*b1cdbd2cSJim Jagielski 		::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
251*b1cdbd2cSJim Jagielski 			// want to do some VCL stuff here ...
252*b1cdbd2cSJim Jagielski 		OContextEntryGuard aGuard( this );
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski 		OSL_ENSURE( sal_False, "OAccessibleControlContext::implGetBounds: performance issue: forced to calc the size myself!" );
255*b1cdbd2cSJim Jagielski 		// In design mode (and this is what this class is for), the surrounding shape (if any) should handle this call
256*b1cdbd2cSJim Jagielski 		// The problem is that in design mode, our size may not be correct (in the drawing layer, controls are
257*b1cdbd2cSJim Jagielski 		// positioned/sized for painting only), and that calculation of our position is expensive
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski 		// what we know (or can obtain from somewhere):
260*b1cdbd2cSJim Jagielski 		// * the PosSize of our peer, relative to it's parent window
261*b1cdbd2cSJim Jagielski 		// * the parent window which the PosSize is relative to
262*b1cdbd2cSJim Jagielski 		// * our foreign controlled accessible parent
263*b1cdbd2cSJim Jagielski 		// from this info, we can determine the the position of our peer relative to the foreign parent
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski 		// our control
266*b1cdbd2cSJim Jagielski 		Reference< awt::XWindow > xWindow;
267*b1cdbd2cSJim Jagielski 		Window* pVCLWindow = implGetWindow( &xWindow );
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski 		awt::Rectangle aBounds( 0, 0, 0, 0 );
270*b1cdbd2cSJim Jagielski 		if ( xWindow.is() )
271*b1cdbd2cSJim Jagielski 		{
272*b1cdbd2cSJim Jagielski 			// ugly, but .... though the XWindow has a getPosSize, it is impossible to determine the
273*b1cdbd2cSJim Jagielski 			// parent which this position/size is relative to. This means we must tunnel UNO and ask the
274*b1cdbd2cSJim Jagielski 			// implementation
275*b1cdbd2cSJim Jagielski 			Window* pVCLParent = pVCLWindow ? pVCLWindow->GetParent() : NULL;
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski 			// the relative location of the window
278*b1cdbd2cSJim Jagielski 			::Point aWindowRelativePos( 0, 0);
279*b1cdbd2cSJim Jagielski 			if ( pVCLWindow )
280*b1cdbd2cSJim Jagielski 				aWindowRelativePos = pVCLWindow->GetPosPixel();
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski 			// the screnn position of the "window parent" of the control
283*b1cdbd2cSJim Jagielski 			::Point aVCLParentScreenPos( 0, 0 );
284*b1cdbd2cSJim Jagielski 			if ( pVCLParent )
285*b1cdbd2cSJim Jagielski 				aVCLParentScreenPos = pVCLParent->GetPosPixel();
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski 			// the screen position of the "accessible parent" of the control
288*b1cdbd2cSJim Jagielski 			Reference< XAccessible > xParentAcc( implGetForeignControlledParent() );
289*b1cdbd2cSJim Jagielski 			Reference< XAccessibleComponent > xParentAccComponent;
290*b1cdbd2cSJim Jagielski 			if ( xParentAcc.is() )
291*b1cdbd2cSJim Jagielski 				xParentAccComponent = xParentAccComponent.query( xParentAcc->getAccessibleContext() );
292*b1cdbd2cSJim Jagielski 			awt::Point aAccParentScreenPos( 0, 0 );
293*b1cdbd2cSJim Jagielski 			if ( xParentAccComponent.is() )
294*b1cdbd2cSJim Jagielski 				aAccParentScreenPos = xParentAccComponent->getLocationOnScreen();
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski 			// now the size of the control
297*b1cdbd2cSJim Jagielski 			aBounds = xWindow->getPosSize();
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski 			// correct the pos
300*b1cdbd2cSJim Jagielski 			aBounds.X = aWindowRelativePos.X() + aVCLParentScreenPos.X() - aAccParentScreenPos.X;
301*b1cdbd2cSJim Jagielski 			aBounds.Y = aWindowRelativePos.Y() + aVCLParentScreenPos.Y() - aAccParentScreenPos.Y;
302*b1cdbd2cSJim Jagielski 		}
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski 		return aBounds;
305*b1cdbd2cSJim Jagielski 	}
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getAccessibleAtPoint(const awt::Point &)308*b1cdbd2cSJim Jagielski 	Reference< XAccessible > SAL_CALL OAccessibleControlContext::getAccessibleAtPoint( const awt::Point& /* _rPoint */ ) throw (RuntimeException)
309*b1cdbd2cSJim Jagielski 	{
310*b1cdbd2cSJim Jagielski 		// no children at all
311*b1cdbd2cSJim Jagielski 		return NULL;
312*b1cdbd2cSJim Jagielski 	}
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
grabFocus()315*b1cdbd2cSJim Jagielski 	void SAL_CALL OAccessibleControlContext::grabFocus(  ) throw (RuntimeException)
316*b1cdbd2cSJim Jagielski 	{
317*b1cdbd2cSJim Jagielski 		OSL_ENSURE( sal_False, "OAccessibleControlContext::grabFocus: !isFocusTraversable, but grabFocus!" );
318*b1cdbd2cSJim Jagielski 	}
319*b1cdbd2cSJim Jagielski 
320*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getAccessibleKeyBinding()321*b1cdbd2cSJim Jagielski 	Any SAL_CALL OAccessibleControlContext::getAccessibleKeyBinding(  ) throw (RuntimeException)
322*b1cdbd2cSJim Jagielski 	{
323*b1cdbd2cSJim Jagielski 		// we do not have any key bindings to activate a UNO control in design mode
324*b1cdbd2cSJim Jagielski 		return Any();
325*b1cdbd2cSJim Jagielski 	}
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getForeground()328*b1cdbd2cSJim Jagielski 	sal_Int32 SAL_CALL OAccessibleControlContext::getForeground(  ) throw (::com::sun::star::uno::RuntimeException)
329*b1cdbd2cSJim Jagielski 	{
330*b1cdbd2cSJim Jagielski 		::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
331*b1cdbd2cSJim Jagielski 			// want to do some VCL stuff here ...
332*b1cdbd2cSJim Jagielski 		OContextEntryGuard aGuard( this );
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski 		Window* pWindow = implGetWindow( );
335*b1cdbd2cSJim Jagielski 		sal_Int32 nColor = 0;
336*b1cdbd2cSJim Jagielski 		if ( pWindow )
337*b1cdbd2cSJim Jagielski 		{
338*b1cdbd2cSJim Jagielski 			if ( pWindow->IsControlForeground() )
339*b1cdbd2cSJim Jagielski 				nColor = pWindow->GetControlForeground().GetColor();
340*b1cdbd2cSJim Jagielski 			else
341*b1cdbd2cSJim Jagielski 			{
342*b1cdbd2cSJim Jagielski 				Font aFont;
343*b1cdbd2cSJim Jagielski 				if ( pWindow->IsControlFont() )
344*b1cdbd2cSJim Jagielski 					aFont = pWindow->GetControlFont();
345*b1cdbd2cSJim Jagielski 				else
346*b1cdbd2cSJim Jagielski 					aFont = pWindow->GetFont();
347*b1cdbd2cSJim Jagielski 				nColor = aFont.GetColor().GetColor();
348*b1cdbd2cSJim Jagielski 			}
349*b1cdbd2cSJim Jagielski 		}
350*b1cdbd2cSJim Jagielski 		return nColor;
351*b1cdbd2cSJim Jagielski 	}
352*b1cdbd2cSJim Jagielski 
353*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getBackground()354*b1cdbd2cSJim Jagielski 	sal_Int32 SAL_CALL OAccessibleControlContext::getBackground(  ) throw (::com::sun::star::uno::RuntimeException)
355*b1cdbd2cSJim Jagielski 	{
356*b1cdbd2cSJim Jagielski 		::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
357*b1cdbd2cSJim Jagielski 			// want to do some VCL stuff here ...
358*b1cdbd2cSJim Jagielski 		OContextEntryGuard aGuard( this );
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski 		Window* pWindow = implGetWindow( );
361*b1cdbd2cSJim Jagielski 		sal_Int32 nColor = 0;
362*b1cdbd2cSJim Jagielski 		if ( pWindow )
363*b1cdbd2cSJim Jagielski 		{
364*b1cdbd2cSJim Jagielski 			if ( pWindow->IsControlBackground() )
365*b1cdbd2cSJim Jagielski 				nColor = pWindow->GetControlBackground().GetColor();
366*b1cdbd2cSJim Jagielski 			else
367*b1cdbd2cSJim Jagielski 				nColor = pWindow->GetBackground().GetColor().GetColor();
368*b1cdbd2cSJim Jagielski 		}
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski 		return nColor;
371*b1cdbd2cSJim Jagielski 	}
372*b1cdbd2cSJim Jagielski 
373*b1cdbd2cSJim Jagielski //........................................................................
374*b1cdbd2cSJim Jagielski }	//namespace toolkit
375*b1cdbd2cSJim Jagielski //........................................................................
376*b1cdbd2cSJim Jagielski 
377