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