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_accessibility.hxx"
26*b1cdbd2cSJim Jagielski #include "accessibility/extended/AccessibleGridControlBase.hxx"
27*b1cdbd2cSJim Jagielski #include <svtools/accessibletable.hxx>
28*b1cdbd2cSJim Jagielski #include <rtl/uuid.h>
29*b1cdbd2cSJim Jagielski //
30*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleEventId.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleStateType.hpp>
32*b1cdbd2cSJim Jagielski #include <unotools/accessiblerelationsethelper.hxx>
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski // ============================================================================
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski using ::rtl::OUString;
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference;
39*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Sequence;
40*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Any;
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
43*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::accessibility;
44*b1cdbd2cSJim Jagielski using namespace ::comphelper;
45*b1cdbd2cSJim Jagielski using namespace ::svt;
46*b1cdbd2cSJim Jagielski using namespace ::svt::table;
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski // ============================================================================
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski namespace accessibility {
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski using namespace com::sun::star::accessibility::AccessibleStateType;
54*b1cdbd2cSJim Jagielski // ============================================================================
55*b1cdbd2cSJim Jagielski 
DBG_NAME(AccessibleGridControlBase)56*b1cdbd2cSJim Jagielski DBG_NAME( AccessibleGridControlBase )
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski AccessibleGridControlBase::AccessibleGridControlBase(
59*b1cdbd2cSJim Jagielski         const Reference< XAccessible >& rxParent,
60*b1cdbd2cSJim Jagielski 		svt::table::IAccessibleTable& rTable,
61*b1cdbd2cSJim Jagielski         AccessibleTableControlObjType      eObjType ) :
62*b1cdbd2cSJim Jagielski     AccessibleGridControlImplHelper( m_aMutex ),
63*b1cdbd2cSJim Jagielski     m_xParent( rxParent ),
64*b1cdbd2cSJim Jagielski     m_aTable( rTable),
65*b1cdbd2cSJim Jagielski     m_eObjType( eObjType ),
66*b1cdbd2cSJim Jagielski     m_aName( rTable.GetAccessibleObjectName( eObjType, 0, 0 ) ),
67*b1cdbd2cSJim Jagielski     m_aDescription( rTable.GetAccessibleObjectDescription( eObjType ) ),
68*b1cdbd2cSJim Jagielski     m_aClientId(0)
69*b1cdbd2cSJim Jagielski {
70*b1cdbd2cSJim Jagielski }
71*b1cdbd2cSJim Jagielski 
~AccessibleGridControlBase()72*b1cdbd2cSJim Jagielski AccessibleGridControlBase::~AccessibleGridControlBase()
73*b1cdbd2cSJim Jagielski {
74*b1cdbd2cSJim Jagielski     if( isAlive() )
75*b1cdbd2cSJim Jagielski     {
76*b1cdbd2cSJim Jagielski         // increment ref count to prevent double call of Dtor
77*b1cdbd2cSJim Jagielski         osl_incrementInterlockedCount( &m_refCount );
78*b1cdbd2cSJim Jagielski         dispose();
79*b1cdbd2cSJim Jagielski     }
80*b1cdbd2cSJim Jagielski }
81*b1cdbd2cSJim Jagielski 
disposing()82*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleGridControlBase::disposing()
83*b1cdbd2cSJim Jagielski {
84*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getOslMutex() );
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski 	if ( getClientId( ) )
87*b1cdbd2cSJim Jagielski 	{
88*b1cdbd2cSJim Jagielski 		AccessibleEventNotifier::TClientId nId( getClientId( ) );
89*b1cdbd2cSJim Jagielski 	    setClientId( 0 );
90*b1cdbd2cSJim Jagielski 	    AccessibleEventNotifier::revokeClientNotifyDisposing( nId, *this );
91*b1cdbd2cSJim Jagielski 	}
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski     m_xParent = NULL;
94*b1cdbd2cSJim Jagielski     //m_aTable = NULL;
95*b1cdbd2cSJim Jagielski }
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski // XAccessibleContext ---------------------------------------------------------
98*b1cdbd2cSJim Jagielski 
getAccessibleParent()99*b1cdbd2cSJim Jagielski Reference< XAccessible > SAL_CALL AccessibleGridControlBase::getAccessibleParent()
100*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
101*b1cdbd2cSJim Jagielski {
102*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getOslMutex() );
103*b1cdbd2cSJim Jagielski     ensureIsAlive();
104*b1cdbd2cSJim Jagielski     return m_xParent;
105*b1cdbd2cSJim Jagielski }
106*b1cdbd2cSJim Jagielski 
getAccessibleIndexInParent()107*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleGridControlBase::getAccessibleIndexInParent()
108*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
109*b1cdbd2cSJim Jagielski {
110*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getOslMutex() );
111*b1cdbd2cSJim Jagielski     ensureIsAlive();
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski     // -1 for child not found/no parent (according to specification)
114*b1cdbd2cSJim Jagielski     sal_Int32 nRet = -1;
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski     Reference< uno::XInterface > xMeMyselfAndI( static_cast< XAccessibleContext* >( this ), uno::UNO_QUERY );
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski     //  iterate over parent's children and search for this object
119*b1cdbd2cSJim Jagielski     if( m_xParent.is() )
120*b1cdbd2cSJim Jagielski     {
121*b1cdbd2cSJim Jagielski         Reference< XAccessibleContext >
122*b1cdbd2cSJim Jagielski             xParentContext( m_xParent->getAccessibleContext() );
123*b1cdbd2cSJim Jagielski         if( xParentContext.is() )
124*b1cdbd2cSJim Jagielski         {
125*b1cdbd2cSJim Jagielski 	    Reference< uno::XInterface > xChild;
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski             sal_Int32 nChildCount = xParentContext->getAccessibleChildCount();
128*b1cdbd2cSJim Jagielski             for( sal_Int32 nChild = 0; nChild < nChildCount; ++nChild )
129*b1cdbd2cSJim Jagielski             {
130*b1cdbd2cSJim Jagielski 		    xChild = xChild.query( xParentContext->getAccessibleChild( nChild ) );
131*b1cdbd2cSJim Jagielski 		    if ( xMeMyselfAndI.get() == xChild.get() )
132*b1cdbd2cSJim Jagielski 		    {
133*b1cdbd2cSJim Jagielski 			    nRet = nChild;
134*b1cdbd2cSJim Jagielski 			    break;
135*b1cdbd2cSJim Jagielski 		    }
136*b1cdbd2cSJim Jagielski 	    }
137*b1cdbd2cSJim Jagielski         }
138*b1cdbd2cSJim Jagielski    }
139*b1cdbd2cSJim Jagielski    return nRet;
140*b1cdbd2cSJim Jagielski }
141*b1cdbd2cSJim Jagielski 
getAccessibleDescription()142*b1cdbd2cSJim Jagielski OUString SAL_CALL AccessibleGridControlBase::getAccessibleDescription()
143*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
144*b1cdbd2cSJim Jagielski {
145*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getOslMutex() );
146*b1cdbd2cSJim Jagielski     ensureIsAlive();
147*b1cdbd2cSJim Jagielski     return m_aDescription;
148*b1cdbd2cSJim Jagielski }
149*b1cdbd2cSJim Jagielski 
getAccessibleName()150*b1cdbd2cSJim Jagielski OUString SAL_CALL AccessibleGridControlBase::getAccessibleName()
151*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
152*b1cdbd2cSJim Jagielski {
153*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getOslMutex() );
154*b1cdbd2cSJim Jagielski     ensureIsAlive();
155*b1cdbd2cSJim Jagielski     return m_aName;
156*b1cdbd2cSJim Jagielski }
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski Reference< XAccessibleRelationSet > SAL_CALL
getAccessibleRelationSet()159*b1cdbd2cSJim Jagielski AccessibleGridControlBase::getAccessibleRelationSet()
160*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
161*b1cdbd2cSJim Jagielski {
162*b1cdbd2cSJim Jagielski    ensureIsAlive();
163*b1cdbd2cSJim Jagielski    // GridControl does not have relations.
164*b1cdbd2cSJim Jagielski    return new utl::AccessibleRelationSetHelper;
165*b1cdbd2cSJim Jagielski }
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski Reference< XAccessibleStateSet > SAL_CALL
getAccessibleStateSet()168*b1cdbd2cSJim Jagielski AccessibleGridControlBase::getAccessibleStateSet()
169*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
170*b1cdbd2cSJim Jagielski {
171*b1cdbd2cSJim Jagielski     TCSolarGuard aSolarGuard;
172*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getOslMutex() );
173*b1cdbd2cSJim Jagielski     // don't check whether alive -> StateSet may contain DEFUNC
174*b1cdbd2cSJim Jagielski     return implCreateStateSetHelper();
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski 
getLocale()177*b1cdbd2cSJim Jagielski lang::Locale SAL_CALL AccessibleGridControlBase::getLocale()
178*b1cdbd2cSJim Jagielski     throw ( IllegalAccessibleComponentStateException, uno::RuntimeException )
179*b1cdbd2cSJim Jagielski {
180*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getOslMutex() );
181*b1cdbd2cSJim Jagielski     ensureIsAlive();
182*b1cdbd2cSJim Jagielski     if( m_xParent.is() )
183*b1cdbd2cSJim Jagielski     {
184*b1cdbd2cSJim Jagielski         Reference< XAccessibleContext >
185*b1cdbd2cSJim Jagielski             xParentContext( m_xParent->getAccessibleContext() );
186*b1cdbd2cSJim Jagielski         if( xParentContext.is() )
187*b1cdbd2cSJim Jagielski 		return xParentContext->getLocale();
188*b1cdbd2cSJim Jagielski     }
189*b1cdbd2cSJim Jagielski     throw IllegalAccessibleComponentStateException();
190*b1cdbd2cSJim Jagielski }
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski // XAccessibleComponent -------------------------------------------------------
193*b1cdbd2cSJim Jagielski 
containsPoint(const awt::Point & rPoint)194*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleGridControlBase::containsPoint( const awt::Point& rPoint )
195*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski    return Rectangle( Point(), getBoundingBox().GetSize() ).IsInside( VCLPoint( rPoint ) );
198*b1cdbd2cSJim Jagielski }
199*b1cdbd2cSJim Jagielski 
getBounds()200*b1cdbd2cSJim Jagielski awt::Rectangle SAL_CALL AccessibleGridControlBase::getBounds()
201*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
202*b1cdbd2cSJim Jagielski {
203*b1cdbd2cSJim Jagielski    return AWTRectangle( getBoundingBox() );
204*b1cdbd2cSJim Jagielski }
205*b1cdbd2cSJim Jagielski 
getLocation()206*b1cdbd2cSJim Jagielski awt::Point SAL_CALL AccessibleGridControlBase::getLocation()
207*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
208*b1cdbd2cSJim Jagielski {
209*b1cdbd2cSJim Jagielski     return AWTPoint( getBoundingBox().TopLeft() );
210*b1cdbd2cSJim Jagielski }
211*b1cdbd2cSJim Jagielski 
getLocationOnScreen()212*b1cdbd2cSJim Jagielski awt::Point SAL_CALL AccessibleGridControlBase::getLocationOnScreen()
213*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
214*b1cdbd2cSJim Jagielski {
215*b1cdbd2cSJim Jagielski     return AWTPoint( getBoundingBoxOnScreen().TopLeft() );
216*b1cdbd2cSJim Jagielski }
217*b1cdbd2cSJim Jagielski 
getSize()218*b1cdbd2cSJim Jagielski awt::Size SAL_CALL AccessibleGridControlBase::getSize()
219*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
220*b1cdbd2cSJim Jagielski {
221*b1cdbd2cSJim Jagielski     return AWTSize( getBoundingBox().GetSize() );
222*b1cdbd2cSJim Jagielski }
223*b1cdbd2cSJim Jagielski 
isShowing()224*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleGridControlBase::isShowing()
225*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
226*b1cdbd2cSJim Jagielski {
227*b1cdbd2cSJim Jagielski     TCSolarGuard aSolarGuard;
228*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getOslMutex() );
229*b1cdbd2cSJim Jagielski     ensureIsAlive();
230*b1cdbd2cSJim Jagielski     return implIsShowing();
231*b1cdbd2cSJim Jagielski }
232*b1cdbd2cSJim Jagielski 
isVisible()233*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleGridControlBase::isVisible()
234*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
235*b1cdbd2cSJim Jagielski {
236*b1cdbd2cSJim Jagielski     Reference< XAccessibleStateSet > xStateSet = getAccessibleStateSet();
237*b1cdbd2cSJim Jagielski     return xStateSet.is() ?
238*b1cdbd2cSJim Jagielski         xStateSet->contains( AccessibleStateType::VISIBLE ) : sal_False;
239*b1cdbd2cSJim Jagielski }
240*b1cdbd2cSJim Jagielski 
isFocusTraversable()241*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleGridControlBase::isFocusTraversable()
242*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
243*b1cdbd2cSJim Jagielski {
244*b1cdbd2cSJim Jagielski     Reference< XAccessibleStateSet > xStateSet = getAccessibleStateSet();
245*b1cdbd2cSJim Jagielski     return xStateSet.is() ?
246*b1cdbd2cSJim Jagielski         xStateSet->contains( AccessibleStateType::FOCUSABLE ) : sal_False;
247*b1cdbd2cSJim Jagielski }
248*b1cdbd2cSJim Jagielski // XAccessibleEventBroadcaster ------------------------------------------------
249*b1cdbd2cSJim Jagielski 
addEventListener(const Reference<XAccessibleEventListener> & _rxListener)250*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleGridControlBase::addEventListener(
251*b1cdbd2cSJim Jagielski         const Reference< XAccessibleEventListener>& _rxListener )
252*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
253*b1cdbd2cSJim Jagielski {
254*b1cdbd2cSJim Jagielski 	if ( _rxListener.is() )
255*b1cdbd2cSJim Jagielski 	{
256*b1cdbd2cSJim Jagielski 		::osl::MutexGuard aGuard( getOslMutex() );
257*b1cdbd2cSJim Jagielski 		if ( !getClientId( ) )
258*b1cdbd2cSJim Jagielski 			setClientId( AccessibleEventNotifier::registerClient( ) );
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski 		AccessibleEventNotifier::addEventListener( getClientId( ), _rxListener );
261*b1cdbd2cSJim Jagielski 	}
262*b1cdbd2cSJim Jagielski }
263*b1cdbd2cSJim Jagielski 
removeEventListener(const Reference<XAccessibleEventListener> & _rxListener)264*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleGridControlBase::removeEventListener(
265*b1cdbd2cSJim Jagielski         const Reference< XAccessibleEventListener>& _rxListener )
266*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
267*b1cdbd2cSJim Jagielski {
268*b1cdbd2cSJim Jagielski     if( _rxListener.is() && getClientId( ) )
269*b1cdbd2cSJim Jagielski     {
270*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( getOslMutex() );
271*b1cdbd2cSJim Jagielski         sal_Int32 nListenerCount = AccessibleEventNotifier::removeEventListener( getClientId( ), _rxListener );
272*b1cdbd2cSJim Jagielski 	if ( !nListenerCount )
273*b1cdbd2cSJim Jagielski 	{
274*b1cdbd2cSJim Jagielski 		// no listeners anymore
275*b1cdbd2cSJim Jagielski 		// -> revoke ourself. This may lead to the notifier thread dying (if we were the last client),
276*b1cdbd2cSJim Jagielski 		// and at least to us not firing any events anymore, in case somebody calls
277*b1cdbd2cSJim Jagielski 		// NotifyAccessibleEvent, again
278*b1cdbd2cSJim Jagielski 		AccessibleEventNotifier::TClientId nId( getClientId( ) );
279*b1cdbd2cSJim Jagielski 		setClientId( 0 );
280*b1cdbd2cSJim Jagielski 		AccessibleEventNotifier::revokeClient( nId );
281*b1cdbd2cSJim Jagielski 	}
282*b1cdbd2cSJim Jagielski     }
283*b1cdbd2cSJim Jagielski }
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski // XTypeProvider --------------------------------------------------------------
286*b1cdbd2cSJim Jagielski 
getImplementationId()287*b1cdbd2cSJim Jagielski Sequence< sal_Int8 > SAL_CALL AccessibleGridControlBase::getImplementationId()
288*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
289*b1cdbd2cSJim Jagielski {
290*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getOslGlobalMutex() );
291*b1cdbd2cSJim Jagielski     static Sequence< sal_Int8 > aId;
292*b1cdbd2cSJim Jagielski     implCreateUuid( aId );
293*b1cdbd2cSJim Jagielski     return aId;
294*b1cdbd2cSJim Jagielski }
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski // XServiceInfo ---------------------------------------------------------------
297*b1cdbd2cSJim Jagielski 
supportsService(const OUString & rServiceName)298*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleGridControlBase::supportsService(
299*b1cdbd2cSJim Jagielski         const OUString& rServiceName )
300*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
301*b1cdbd2cSJim Jagielski {
302*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getOslMutex() );
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski     Sequence< OUString > aSupportedServices( getSupportedServiceNames() );
305*b1cdbd2cSJim Jagielski     const OUString* pArrBegin = aSupportedServices.getConstArray();
306*b1cdbd2cSJim Jagielski     const OUString* pArrEnd = pArrBegin + aSupportedServices.getLength();
307*b1cdbd2cSJim Jagielski     const OUString* pString = pArrBegin;
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski     for( ; ( pString != pArrEnd ) && ( rServiceName != *pString ); ++pString )
310*b1cdbd2cSJim Jagielski 		;
311*b1cdbd2cSJim Jagielski     return pString != pArrEnd;
312*b1cdbd2cSJim Jagielski }
313*b1cdbd2cSJim Jagielski 
getSupportedServiceNames()314*b1cdbd2cSJim Jagielski Sequence< OUString > SAL_CALL AccessibleGridControlBase::getSupportedServiceNames()
315*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
316*b1cdbd2cSJim Jagielski {
317*b1cdbd2cSJim Jagielski     const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.accessibility.AccessibleContext" ) );
318*b1cdbd2cSJim Jagielski     return Sequence< OUString >( &aServiceName, 1 );
319*b1cdbd2cSJim Jagielski }
320*b1cdbd2cSJim Jagielski // internal virtual methods ---------------------------------------------------
321*b1cdbd2cSJim Jagielski 
implIsShowing()322*b1cdbd2cSJim Jagielski sal_Bool AccessibleGridControlBase::implIsShowing()
323*b1cdbd2cSJim Jagielski {
324*b1cdbd2cSJim Jagielski     sal_Bool bShowing = sal_False;
325*b1cdbd2cSJim Jagielski     if( m_xParent.is() )
326*b1cdbd2cSJim Jagielski     {
327*b1cdbd2cSJim Jagielski         Reference< XAccessibleComponent >
328*b1cdbd2cSJim Jagielski             xParentComp( m_xParent->getAccessibleContext(), uno::UNO_QUERY );
329*b1cdbd2cSJim Jagielski         if( xParentComp.is() )
330*b1cdbd2cSJim Jagielski             bShowing = implGetBoundingBox().IsOver(
331*b1cdbd2cSJim Jagielski                 VCLRectangle( xParentComp->getBounds() ) );
332*b1cdbd2cSJim Jagielski     }
333*b1cdbd2cSJim Jagielski     return bShowing;
334*b1cdbd2cSJim Jagielski }
335*b1cdbd2cSJim Jagielski 
implCreateStateSetHelper()336*b1cdbd2cSJim Jagielski ::utl::AccessibleStateSetHelper* AccessibleGridControlBase::implCreateStateSetHelper()
337*b1cdbd2cSJim Jagielski {
338*b1cdbd2cSJim Jagielski     ::utl::AccessibleStateSetHelper*
339*b1cdbd2cSJim Jagielski         pStateSetHelper = new ::utl::AccessibleStateSetHelper;
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski     if( isAlive() )
342*b1cdbd2cSJim Jagielski     {
343*b1cdbd2cSJim Jagielski 	    // SHOWING done with m_xParent
344*b1cdbd2cSJim Jagielski 	    if( implIsShowing() )
345*b1cdbd2cSJim Jagielski 		    pStateSetHelper->AddState( AccessibleStateType::SHOWING );
346*b1cdbd2cSJim Jagielski 	    // GridControl fills StateSet with states depending on object type
347*b1cdbd2cSJim Jagielski 	    m_aTable.FillAccessibleStateSet( *pStateSetHelper, getType() );
348*b1cdbd2cSJim Jagielski     }
349*b1cdbd2cSJim Jagielski     else
350*b1cdbd2cSJim Jagielski 	    pStateSetHelper->AddState( AccessibleStateType::DEFUNC );
351*b1cdbd2cSJim Jagielski     return pStateSetHelper;
352*b1cdbd2cSJim Jagielski }
353*b1cdbd2cSJim Jagielski 
354*b1cdbd2cSJim Jagielski // internal helper methods ----------------------------------------------------
355*b1cdbd2cSJim Jagielski 
isAlive() const356*b1cdbd2cSJim Jagielski sal_Bool AccessibleGridControlBase::isAlive() const
357*b1cdbd2cSJim Jagielski {
358*b1cdbd2cSJim Jagielski     return !rBHelper.bDisposed && !rBHelper.bInDispose && &m_aTable;
359*b1cdbd2cSJim Jagielski }
360*b1cdbd2cSJim Jagielski 
ensureIsAlive() const361*b1cdbd2cSJim Jagielski void AccessibleGridControlBase::ensureIsAlive() const
362*b1cdbd2cSJim Jagielski     throw ( lang::DisposedException )
363*b1cdbd2cSJim Jagielski {
364*b1cdbd2cSJim Jagielski     if( !isAlive() )
365*b1cdbd2cSJim Jagielski         throw lang::DisposedException();
366*b1cdbd2cSJim Jagielski }
367*b1cdbd2cSJim Jagielski 
getBoundingBox()368*b1cdbd2cSJim Jagielski Rectangle AccessibleGridControlBase::getBoundingBox()
369*b1cdbd2cSJim Jagielski     throw ( lang::DisposedException )
370*b1cdbd2cSJim Jagielski {
371*b1cdbd2cSJim Jagielski     TCSolarGuard aSolarGuard;
372*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getOslMutex() );
373*b1cdbd2cSJim Jagielski     ensureIsAlive();
374*b1cdbd2cSJim Jagielski     Rectangle aRect = implGetBoundingBox();
375*b1cdbd2cSJim Jagielski     if ( 0 == aRect.Left() && 0 == aRect.Top() && 0 == aRect.Right() && 0 == aRect.Bottom() )
376*b1cdbd2cSJim Jagielski     {
377*b1cdbd2cSJim Jagielski 	    DBG_ERRORFILE( "rectangle doesn't exist" );
378*b1cdbd2cSJim Jagielski     }
379*b1cdbd2cSJim Jagielski     return aRect;
380*b1cdbd2cSJim Jagielski }
381*b1cdbd2cSJim Jagielski 
getBoundingBoxOnScreen()382*b1cdbd2cSJim Jagielski Rectangle AccessibleGridControlBase::getBoundingBoxOnScreen()
383*b1cdbd2cSJim Jagielski     throw ( lang::DisposedException )
384*b1cdbd2cSJim Jagielski {
385*b1cdbd2cSJim Jagielski     TCSolarGuard aSolarGuard;
386*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getOslMutex() );
387*b1cdbd2cSJim Jagielski     ensureIsAlive();
388*b1cdbd2cSJim Jagielski     Rectangle aRect = implGetBoundingBoxOnScreen();
389*b1cdbd2cSJim Jagielski     if ( 0 == aRect.Left() && 0 == aRect.Top() && 0 == aRect.Right() && 0 == aRect.Bottom() )
390*b1cdbd2cSJim Jagielski     {
391*b1cdbd2cSJim Jagielski 	    DBG_ERRORFILE( "rectangle doesn't exist" );
392*b1cdbd2cSJim Jagielski     }
393*b1cdbd2cSJim Jagielski     return aRect;
394*b1cdbd2cSJim Jagielski }
395*b1cdbd2cSJim Jagielski 
commitEvent(sal_Int16 _nEventId,const Any & _rNewValue,const Any & _rOldValue)396*b1cdbd2cSJim Jagielski void AccessibleGridControlBase::commitEvent(
397*b1cdbd2cSJim Jagielski         sal_Int16 _nEventId, const Any& _rNewValue, const Any& _rOldValue )
398*b1cdbd2cSJim Jagielski {
399*b1cdbd2cSJim Jagielski     ::osl::ClearableMutexGuard aGuard( getOslMutex() );
400*b1cdbd2cSJim Jagielski 	if ( !getClientId( ) )
401*b1cdbd2cSJim Jagielski 	        // if we don't have a client id for the notifier, then we don't have listeners, then
402*b1cdbd2cSJim Jagielski 	        // we don't need to notify anything
403*b1cdbd2cSJim Jagielski 	        return;
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski 	// build an event object
406*b1cdbd2cSJim Jagielski 	AccessibleEventObject aEvent;
407*b1cdbd2cSJim Jagielski 	aEvent.Source = *this;
408*b1cdbd2cSJim Jagielski 	aEvent.EventId = _nEventId;
409*b1cdbd2cSJim Jagielski 	aEvent.OldValue = _rOldValue;
410*b1cdbd2cSJim Jagielski 	aEvent.NewValue = _rNewValue;
411*b1cdbd2cSJim Jagielski 
412*b1cdbd2cSJim Jagielski 	// let the notifier handle this event
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski 	AccessibleEventNotifier::addEvent( getClientId( ), aEvent );
415*b1cdbd2cSJim Jagielski }
416*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
417*b1cdbd2cSJim Jagielski 
implCreateUuid(Sequence<sal_Int8> & rId)418*b1cdbd2cSJim Jagielski void AccessibleGridControlBase::implCreateUuid( Sequence< sal_Int8 >& rId )
419*b1cdbd2cSJim Jagielski {
420*b1cdbd2cSJim Jagielski     if( !rId.hasElements() )
421*b1cdbd2cSJim Jagielski     {
422*b1cdbd2cSJim Jagielski         rId.realloc( 16 );
423*b1cdbd2cSJim Jagielski         rtl_createUuid( reinterpret_cast< sal_uInt8* >( rId.getArray() ), 0, sal_True );
424*b1cdbd2cSJim Jagielski     }
425*b1cdbd2cSJim Jagielski }
426*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getAccessibleRole()427*b1cdbd2cSJim Jagielski sal_Int16 SAL_CALL AccessibleGridControlBase::getAccessibleRole()
428*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
429*b1cdbd2cSJim Jagielski {
430*b1cdbd2cSJim Jagielski     ensureIsAlive();
431*b1cdbd2cSJim Jagielski 	sal_Int16 nRole = AccessibleRole::UNKNOWN;
432*b1cdbd2cSJim Jagielski 	switch ( m_eObjType )
433*b1cdbd2cSJim Jagielski 	{
434*b1cdbd2cSJim Jagielski         case TCTYPE_ROWHEADERCELL:
435*b1cdbd2cSJim Jagielski 		nRole = AccessibleRole::ROW_HEADER;
436*b1cdbd2cSJim Jagielski 		break;
437*b1cdbd2cSJim Jagielski 	case TCTYPE_COLUMNHEADERCELL:
438*b1cdbd2cSJim Jagielski 		nRole = AccessibleRole::COLUMN_HEADER;
439*b1cdbd2cSJim Jagielski 		break;
440*b1cdbd2cSJim Jagielski 	case TCTYPE_COLUMNHEADERBAR:
441*b1cdbd2cSJim Jagielski 	case TCTYPE_ROWHEADERBAR:
442*b1cdbd2cSJim Jagielski 	case TCTYPE_TABLE:
443*b1cdbd2cSJim Jagielski 		nRole = AccessibleRole::TABLE;
444*b1cdbd2cSJim Jagielski 		break;
445*b1cdbd2cSJim Jagielski 	case TCTYPE_TABLECELL:
446*b1cdbd2cSJim Jagielski 		nRole = AccessibleRole::TABLE_CELL;
447*b1cdbd2cSJim Jagielski 		break;
448*b1cdbd2cSJim Jagielski 	case TCTYPE_GRIDCONTROL:
449*b1cdbd2cSJim Jagielski 		nRole = AccessibleRole::PANEL;
450*b1cdbd2cSJim Jagielski 		break;
451*b1cdbd2cSJim Jagielski 	}
452*b1cdbd2cSJim Jagielski     return nRole;
453*b1cdbd2cSJim Jagielski }
454*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getAccessibleKeyBinding()455*b1cdbd2cSJim Jagielski Any SAL_CALL AccessibleGridControlBase::getAccessibleKeyBinding()
456*b1cdbd2cSJim Jagielski         throw ( uno::RuntimeException )
457*b1cdbd2cSJim Jagielski {
458*b1cdbd2cSJim Jagielski 	return Any();
459*b1cdbd2cSJim Jagielski }
460*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getAccessibleAtPoint(const::com::sun::star::awt::Point &)461*b1cdbd2cSJim Jagielski Reference<XAccessible > SAL_CALL AccessibleGridControlBase::getAccessibleAtPoint( const ::com::sun::star::awt::Point& )
462*b1cdbd2cSJim Jagielski         throw ( uno::RuntimeException )
463*b1cdbd2cSJim Jagielski {
464*b1cdbd2cSJim Jagielski 	return NULL;
465*b1cdbd2cSJim Jagielski }
466*b1cdbd2cSJim Jagielski //// -----------------------------------------------------------------------------
getForeground()467*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleGridControlBase::getForeground(  ) throw (::com::sun::star::uno::RuntimeException)
468*b1cdbd2cSJim Jagielski {
469*b1cdbd2cSJim Jagielski     TCSolarGuard aSolarGuard;
470*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getOslMutex() );
471*b1cdbd2cSJim Jagielski     ensureIsAlive();
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski     sal_Int32 nColor = 0;
474*b1cdbd2cSJim Jagielski     Window* pInst = m_aTable.GetWindowInstance();
475*b1cdbd2cSJim Jagielski     if ( pInst )
476*b1cdbd2cSJim Jagielski     {
477*b1cdbd2cSJim Jagielski         if ( pInst->IsControlForeground() )
478*b1cdbd2cSJim Jagielski             nColor = pInst->GetControlForeground().GetColor();
479*b1cdbd2cSJim Jagielski 	else
480*b1cdbd2cSJim Jagielski 	{
481*b1cdbd2cSJim Jagielski 		Font aFont;
482*b1cdbd2cSJim Jagielski 		if ( pInst->IsControlFont() )
483*b1cdbd2cSJim Jagielski 			aFont = pInst->GetControlFont();
484*b1cdbd2cSJim Jagielski 		else
485*b1cdbd2cSJim Jagielski 			aFont = pInst->GetFont();
486*b1cdbd2cSJim Jagielski 		nColor = aFont.GetColor().GetColor();
487*b1cdbd2cSJim Jagielski 	}
488*b1cdbd2cSJim Jagielski     }
489*b1cdbd2cSJim Jagielski     return nColor;
490*b1cdbd2cSJim Jagielski }
491*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getBackground()492*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleGridControlBase::getBackground(  ) throw (::com::sun::star::uno::RuntimeException)
493*b1cdbd2cSJim Jagielski {
494*b1cdbd2cSJim Jagielski     TCSolarGuard aSolarGuard;
495*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getOslMutex() );
496*b1cdbd2cSJim Jagielski     ensureIsAlive();
497*b1cdbd2cSJim Jagielski     sal_Int32 nColor = 0;
498*b1cdbd2cSJim Jagielski     Window* pInst = m_aTable.GetWindowInstance();
499*b1cdbd2cSJim Jagielski     if ( pInst )
500*b1cdbd2cSJim Jagielski     {
501*b1cdbd2cSJim Jagielski         if ( pInst->IsControlBackground() )
502*b1cdbd2cSJim Jagielski             nColor = pInst->GetControlBackground().GetColor();
503*b1cdbd2cSJim Jagielski 	else
504*b1cdbd2cSJim Jagielski             nColor = pInst->GetBackground().GetColor().GetColor();
505*b1cdbd2cSJim Jagielski     }
506*b1cdbd2cSJim Jagielski     return nColor;
507*b1cdbd2cSJim Jagielski }
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski //// ============================================================================
GridControlAccessibleElement(const Reference<XAccessible> & rxParent,IAccessibleTable & rTable,AccessibleTableControlObjType eObjType)510*b1cdbd2cSJim Jagielski GridControlAccessibleElement::GridControlAccessibleElement( const Reference< XAccessible >& rxParent,
511*b1cdbd2cSJim Jagielski 						IAccessibleTable& rTable,
512*b1cdbd2cSJim Jagielski 						AccessibleTableControlObjType  eObjType )
513*b1cdbd2cSJim Jagielski 	:AccessibleGridControlBase( rxParent, rTable, eObjType )
514*b1cdbd2cSJim Jagielski {
515*b1cdbd2cSJim Jagielski }
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski // XInterface -----------------------------------------------------------------
IMPLEMENT_FORWARD_XINTERFACE2(GridControlAccessibleElement,AccessibleGridControlBase,GridControlAccessibleElement_Base)518*b1cdbd2cSJim Jagielski IMPLEMENT_FORWARD_XINTERFACE2( GridControlAccessibleElement, AccessibleGridControlBase, GridControlAccessibleElement_Base)
519*b1cdbd2cSJim Jagielski 
520*b1cdbd2cSJim Jagielski // XTypeProvider --------------------------------------------------------------
521*b1cdbd2cSJim Jagielski IMPLEMENT_FORWARD_XTYPEPROVIDER2( GridControlAccessibleElement, AccessibleGridControlBase, GridControlAccessibleElement_Base )
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski // XAccessible ----------------------------------------------------------------
524*b1cdbd2cSJim Jagielski 
525*b1cdbd2cSJim Jagielski Reference< XAccessibleContext > SAL_CALL GridControlAccessibleElement::getAccessibleContext() throw ( uno::RuntimeException )
526*b1cdbd2cSJim Jagielski {
527*b1cdbd2cSJim Jagielski     ensureIsAlive();
528*b1cdbd2cSJim Jagielski     return this;
529*b1cdbd2cSJim Jagielski }
530*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
~GridControlAccessibleElement()531*b1cdbd2cSJim Jagielski GridControlAccessibleElement::~GridControlAccessibleElement( )
532*b1cdbd2cSJim Jagielski {
533*b1cdbd2cSJim Jagielski }
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski // ============================================================================
536*b1cdbd2cSJim Jagielski 
537*b1cdbd2cSJim Jagielski } // namespace accessibility
538*b1cdbd2cSJim Jagielski 
539*b1cdbd2cSJim Jagielski // ============================================================================
540*b1cdbd2cSJim Jagielski 
541