xref: /trunk/main/sc/source/ui/Accessibility/AccessibleContextBase.cxx (revision e44970e361d561c4fb365c9f2d78a4d8a70d0e0d)
1b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3b3f79822SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4b3f79822SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5b3f79822SAndrew Rist  * distributed with this work for additional information
6b3f79822SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7b3f79822SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8b3f79822SAndrew Rist  * "License"); you may not use this file except in compliance
9b3f79822SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13b3f79822SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14b3f79822SAndrew Rist  * software distributed under the License is distributed on an
15b3f79822SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16b3f79822SAndrew Rist  * KIND, either express or implied.  See the License for the
17b3f79822SAndrew Rist  * specific language governing permissions and limitations
18b3f79822SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20b3f79822SAndrew Rist  *************************************************************/
21b3f79822SAndrew Rist 
22b3f79822SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include "AccessibleContextBase.hxx"
29cdf0e10cSrcweir #include "unoguard.hxx"
30cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleRole.hpp>
31cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp>
32cdf0e10cSrcweir #ifndef _COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLESTATETYPE_HPP_
33cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleStateType.hpp>
34cdf0e10cSrcweir #endif
35cdf0e10cSrcweir #include <com/sun/star/beans/PropertyChangeEvent.hpp>
36cdf0e10cSrcweir #include <rtl/uuid.h>
37cdf0e10cSrcweir #include <tools/debug.hxx>
38cdf0e10cSrcweir #include <tools/gen.hxx>
39cdf0e10cSrcweir #ifndef _UTL_ACCESSIBLESTATESETHELPER_HXX
40cdf0e10cSrcweir #include <unotools/accessiblestatesethelper.hxx>
41cdf0e10cSrcweir #endif
42cdf0e10cSrcweir #include <toolkit/helper/convert.hxx>
43cdf0e10cSrcweir #include <svl/smplhint.hxx>
44cdf0e10cSrcweir #include <comphelper/sequence.hxx>
45cdf0e10cSrcweir #include <unotools/accessiblerelationsethelper.hxx>
46cdf0e10cSrcweir #include <vcl/unohelp.hxx>
47cdf0e10cSrcweir #include <tools/color.hxx>
48cdf0e10cSrcweir #include <comphelper/accessibleeventnotifier.hxx>
49cdf0e10cSrcweir 
50cdf0e10cSrcweir using namespace ::rtl;
51cdf0e10cSrcweir using namespace ::com::sun::star;
52cdf0e10cSrcweir using namespace ::com::sun::star::accessibility;
53cdf0e10cSrcweir 
54cdf0e10cSrcweir //=====  internal  ============================================================
55cdf0e10cSrcweir 
DBG_NAME(ScAccessibleContextBase)56cdf0e10cSrcweir DBG_NAME(ScAccessibleContextBase)
57cdf0e10cSrcweir 
58cdf0e10cSrcweir ScAccessibleContextBase::ScAccessibleContextBase(
59cdf0e10cSrcweir                                                  const uno::Reference<XAccessible>& rxParent,
60cdf0e10cSrcweir                                                  const sal_Int16 aRole)
61cdf0e10cSrcweir                                                  :
62cdf0e10cSrcweir     ScAccessibleContextBaseWeakImpl(m_aMutex),
63cdf0e10cSrcweir     mxParent(rxParent),
64cdf0e10cSrcweir     mnClientId(0),
65cdf0e10cSrcweir     maRole(aRole)
66cdf0e10cSrcweir {
67cdf0e10cSrcweir     DBG_CTOR(ScAccessibleContextBase, NULL);
68cdf0e10cSrcweir }
69cdf0e10cSrcweir 
70cdf0e10cSrcweir 
~ScAccessibleContextBase(void)71cdf0e10cSrcweir ScAccessibleContextBase::~ScAccessibleContextBase(void)
72cdf0e10cSrcweir {
73cdf0e10cSrcweir     DBG_DTOR(ScAccessibleContextBase, NULL);
74cdf0e10cSrcweir 
75cdf0e10cSrcweir     if (!IsDefunc() && !rBHelper.bInDispose)
76cdf0e10cSrcweir     {
77cdf0e10cSrcweir         // increment refcount to prevent double call off dtor
78cdf0e10cSrcweir         osl_incrementInterlockedCount( &m_refCount );
7986e1cf34SPedro Giffuni         // call dispose to inform object which have a weak reference to this object
80cdf0e10cSrcweir         dispose();
81cdf0e10cSrcweir     }
82cdf0e10cSrcweir }
83cdf0e10cSrcweir 
Init()84cdf0e10cSrcweir void ScAccessibleContextBase::Init()
85cdf0e10cSrcweir {
86cdf0e10cSrcweir     // hold reference to make sure that the destructor is not called
87cdf0e10cSrcweir     uno::Reference< XAccessibleContext > xOwnContext(this);
88cdf0e10cSrcweir 
89cdf0e10cSrcweir     if (mxParent.is())
90cdf0e10cSrcweir     {
91cdf0e10cSrcweir         uno::Reference< XAccessibleEventBroadcaster > xBroadcaster (mxParent->getAccessibleContext(), uno::UNO_QUERY);
92cdf0e10cSrcweir         if (xBroadcaster.is())
93cdf0e10cSrcweir             xBroadcaster->addEventListener(this);
94cdf0e10cSrcweir     }
95cdf0e10cSrcweir     msName = createAccessibleName();
96cdf0e10cSrcweir     msDescription = createAccessibleDescription();
97cdf0e10cSrcweir }
98cdf0e10cSrcweir 
disposing()99cdf0e10cSrcweir void SAL_CALL ScAccessibleContextBase::disposing()
100cdf0e10cSrcweir {
101cdf0e10cSrcweir     ScUnoGuard aGuard;
102cdf0e10cSrcweir //  CommitDefunc(); not necessary and should not be send, because it cost a lot of time
103cdf0e10cSrcweir 
104cdf0e10cSrcweir     // hold reference to make sure that the destructor is not called
105cdf0e10cSrcweir     uno::Reference< XAccessibleContext > xOwnContext(this);
106cdf0e10cSrcweir 
107cdf0e10cSrcweir     if ( mnClientId )
108cdf0e10cSrcweir     {
109cdf0e10cSrcweir         sal_Int32 nTemClientId(mnClientId);
110cdf0e10cSrcweir         mnClientId =  0;
111cdf0e10cSrcweir         comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( nTemClientId, *this );
112cdf0e10cSrcweir     }
113cdf0e10cSrcweir 
114cdf0e10cSrcweir     if (mxParent.is())
115cdf0e10cSrcweir     {
116cdf0e10cSrcweir         uno::Reference< XAccessibleEventBroadcaster > xBroadcaster (mxParent->getAccessibleContext(), uno::UNO_QUERY);
117cdf0e10cSrcweir         if (xBroadcaster.is())
118cdf0e10cSrcweir             xBroadcaster->removeEventListener(this);
119cdf0e10cSrcweir         mxParent = NULL;
120cdf0e10cSrcweir     }
121cdf0e10cSrcweir 
122cdf0e10cSrcweir     ScAccessibleContextBaseWeakImpl::disposing();
123cdf0e10cSrcweir }
124cdf0e10cSrcweir 
125cdf0e10cSrcweir //=====  XInterface  =====================================================
126cdf0e10cSrcweir 
queryInterface(uno::Type const & rType)127cdf0e10cSrcweir uno::Any SAL_CALL ScAccessibleContextBase::queryInterface( uno::Type const & rType )
128cdf0e10cSrcweir     throw (uno::RuntimeException)
129cdf0e10cSrcweir {
130cdf0e10cSrcweir     uno::Any aAny (ScAccessibleContextBaseWeakImpl::queryInterface(rType));
131cdf0e10cSrcweir     return aAny.hasValue() ? aAny : ScAccessibleContextBaseImplEvent::queryInterface(rType);
132cdf0e10cSrcweir }
133cdf0e10cSrcweir 
acquire()134cdf0e10cSrcweir void SAL_CALL ScAccessibleContextBase::acquire()
135cdf0e10cSrcweir     throw ()
136cdf0e10cSrcweir {
137cdf0e10cSrcweir     ScAccessibleContextBaseWeakImpl::acquire();
138cdf0e10cSrcweir }
139cdf0e10cSrcweir 
release()140cdf0e10cSrcweir void SAL_CALL ScAccessibleContextBase::release()
141cdf0e10cSrcweir     throw ()
142cdf0e10cSrcweir {
143cdf0e10cSrcweir     ScAccessibleContextBaseWeakImpl::release();
144cdf0e10cSrcweir }
145cdf0e10cSrcweir 
146cdf0e10cSrcweir //=====  SfxListener  =====================================================
147cdf0e10cSrcweir 
Notify(SfxBroadcaster &,const SfxHint & rHint)148cdf0e10cSrcweir void ScAccessibleContextBase::Notify( SfxBroadcaster&, const SfxHint& rHint )
149cdf0e10cSrcweir {
150cdf0e10cSrcweir     if (rHint.ISA( SfxSimpleHint ) )
151cdf0e10cSrcweir     {
152cdf0e10cSrcweir         const SfxSimpleHint& rRef = (const SfxSimpleHint&)rHint;
153cdf0e10cSrcweir         if (rRef.GetId() == SFX_HINT_DYING)
154cdf0e10cSrcweir         {
155cdf0e10cSrcweir             // it seems the Broadcaster is dying, since the view is dying
156cdf0e10cSrcweir             dispose();
157cdf0e10cSrcweir         }
158cdf0e10cSrcweir     }
159cdf0e10cSrcweir }
160cdf0e10cSrcweir 
161cdf0e10cSrcweir //=====  XAccessible  =========================================================
162cdf0e10cSrcweir 
163cdf0e10cSrcweir uno::Reference< XAccessibleContext> SAL_CALL
getAccessibleContext(void)164cdf0e10cSrcweir     ScAccessibleContextBase::getAccessibleContext(void)
165cdf0e10cSrcweir     throw (uno::RuntimeException)
166cdf0e10cSrcweir {
167cdf0e10cSrcweir     return this;
168cdf0e10cSrcweir }
169cdf0e10cSrcweir 
170cdf0e10cSrcweir //=====  XAccessibleComponent  ================================================
171cdf0e10cSrcweir 
containsPoint(const awt::Point & rPoint)172cdf0e10cSrcweir sal_Bool SAL_CALL ScAccessibleContextBase::containsPoint(const awt::Point& rPoint )
173cdf0e10cSrcweir         throw (uno::RuntimeException)
174cdf0e10cSrcweir {
175cdf0e10cSrcweir     ScUnoGuard aGuard;
176cdf0e10cSrcweir     IsObjectValid();
177cdf0e10cSrcweir     return Rectangle (Point(), GetBoundingBox().GetSize()).IsInside(VCLPoint(rPoint));
178cdf0e10cSrcweir }
179cdf0e10cSrcweir 
getAccessibleAtPoint(const awt::Point &)180cdf0e10cSrcweir uno::Reference< XAccessible > SAL_CALL ScAccessibleContextBase::getAccessibleAtPoint(
181cdf0e10cSrcweir         const awt::Point& /* rPoint */ )
182cdf0e10cSrcweir         throw (uno::RuntimeException)
183cdf0e10cSrcweir {
184cdf0e10cSrcweir     DBG_ERROR("not implemented");
185cdf0e10cSrcweir     return uno::Reference<XAccessible>();
186cdf0e10cSrcweir }
187cdf0e10cSrcweir 
getBounds()188cdf0e10cSrcweir awt::Rectangle SAL_CALL ScAccessibleContextBase::getBounds(  )
189cdf0e10cSrcweir         throw (uno::RuntimeException)
190cdf0e10cSrcweir {
191cdf0e10cSrcweir     ScUnoGuard aGuard;
192cdf0e10cSrcweir     IsObjectValid();
193cdf0e10cSrcweir     return AWTRectangle(GetBoundingBox());
194cdf0e10cSrcweir }
195cdf0e10cSrcweir 
getLocation()196cdf0e10cSrcweir awt::Point SAL_CALL ScAccessibleContextBase::getLocation(  )
197cdf0e10cSrcweir         throw (uno::RuntimeException)
198cdf0e10cSrcweir {
199cdf0e10cSrcweir     ScUnoGuard aGuard;
200cdf0e10cSrcweir     IsObjectValid();
201cdf0e10cSrcweir     return AWTPoint(GetBoundingBox().TopLeft());
202cdf0e10cSrcweir }
203cdf0e10cSrcweir 
getLocationOnScreen()204cdf0e10cSrcweir awt::Point SAL_CALL ScAccessibleContextBase::getLocationOnScreen(  )
205cdf0e10cSrcweir         throw (uno::RuntimeException)
206cdf0e10cSrcweir {
207cdf0e10cSrcweir     ScUnoGuard aGuard;
208cdf0e10cSrcweir     IsObjectValid();
209cdf0e10cSrcweir     return AWTPoint(GetBoundingBoxOnScreen().TopLeft());
210cdf0e10cSrcweir }
211cdf0e10cSrcweir 
getSize()212cdf0e10cSrcweir awt::Size SAL_CALL ScAccessibleContextBase::getSize(  )
213cdf0e10cSrcweir         throw (uno::RuntimeException)
214cdf0e10cSrcweir {
215cdf0e10cSrcweir     ScUnoGuard aGuard;
216cdf0e10cSrcweir     IsObjectValid();
217cdf0e10cSrcweir     return AWTSize(GetBoundingBox().GetSize());
218cdf0e10cSrcweir }
219cdf0e10cSrcweir 
isShowing()220cdf0e10cSrcweir sal_Bool SAL_CALL ScAccessibleContextBase::isShowing(  )
221cdf0e10cSrcweir         throw (uno::RuntimeException)
222cdf0e10cSrcweir {
223cdf0e10cSrcweir     ScUnoGuard aGuard;
224cdf0e10cSrcweir     IsObjectValid();
225cdf0e10cSrcweir     sal_Bool bShowing(sal_False);
226cdf0e10cSrcweir     if (mxParent.is())
227cdf0e10cSrcweir     {
228cdf0e10cSrcweir         uno::Reference<XAccessibleComponent> xParentComponent (mxParent->getAccessibleContext(), uno::UNO_QUERY);
229cdf0e10cSrcweir         if (xParentComponent.is())
230cdf0e10cSrcweir         {
231cdf0e10cSrcweir             Rectangle aParentBounds(VCLRectangle(xParentComponent->getBounds()));
232cdf0e10cSrcweir             Rectangle aBounds(VCLRectangle(getBounds()));
233cdf0e10cSrcweir             bShowing = aBounds.IsOver(aParentBounds);
234cdf0e10cSrcweir         }
235cdf0e10cSrcweir     }
236cdf0e10cSrcweir     return bShowing;
237cdf0e10cSrcweir }
238cdf0e10cSrcweir 
isVisible()239cdf0e10cSrcweir sal_Bool SAL_CALL ScAccessibleContextBase::isVisible(  )
240cdf0e10cSrcweir         throw (uno::RuntimeException)
241cdf0e10cSrcweir {
242cdf0e10cSrcweir     return sal_True;
243cdf0e10cSrcweir }
244cdf0e10cSrcweir 
grabFocus()245cdf0e10cSrcweir void SAL_CALL ScAccessibleContextBase::grabFocus(  )
246cdf0e10cSrcweir         throw (uno::RuntimeException)
247cdf0e10cSrcweir {
248cdf0e10cSrcweir     DBG_ERROR("not implemented");
249cdf0e10cSrcweir }
250cdf0e10cSrcweir 
getForeground()251cdf0e10cSrcweir sal_Int32 SAL_CALL ScAccessibleContextBase::getForeground(  )
252cdf0e10cSrcweir         throw (uno::RuntimeException)
253cdf0e10cSrcweir {
254cdf0e10cSrcweir     return COL_BLACK;
255cdf0e10cSrcweir }
256cdf0e10cSrcweir 
getBackground()257cdf0e10cSrcweir sal_Int32 SAL_CALL ScAccessibleContextBase::getBackground(  )
258cdf0e10cSrcweir         throw (uno::RuntimeException)
259cdf0e10cSrcweir {
260cdf0e10cSrcweir     return COL_WHITE;
261cdf0e10cSrcweir }
262cdf0e10cSrcweir 
263cdf0e10cSrcweir //=====  XAccessibleContext  ==================================================
264cdf0e10cSrcweir 
265cdf0e10cSrcweir sal_Int32 SAL_CALL
getAccessibleChildCount(void)266cdf0e10cSrcweir     ScAccessibleContextBase::getAccessibleChildCount(void)
267cdf0e10cSrcweir     throw (uno::RuntimeException)
268cdf0e10cSrcweir {
269cdf0e10cSrcweir     DBG_ERROR("should be implemented in the abrevated class");
270cdf0e10cSrcweir     return 0;
271cdf0e10cSrcweir }
272cdf0e10cSrcweir 
273cdf0e10cSrcweir uno::Reference<XAccessible> SAL_CALL
getAccessibleChild(sal_Int32)274cdf0e10cSrcweir     ScAccessibleContextBase::getAccessibleChild(sal_Int32 /* nIndex */)
275cdf0e10cSrcweir         throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
276cdf0e10cSrcweir {
277cdf0e10cSrcweir     DBG_ERROR("should be implemented in the abrevated class");
278cdf0e10cSrcweir     return uno::Reference<XAccessible>();
279cdf0e10cSrcweir }
280cdf0e10cSrcweir 
281cdf0e10cSrcweir uno::Reference<XAccessible> SAL_CALL
getAccessibleParent(void)282cdf0e10cSrcweir     ScAccessibleContextBase::getAccessibleParent(void)
283cdf0e10cSrcweir     throw (uno::RuntimeException)
284cdf0e10cSrcweir {
285cdf0e10cSrcweir     return mxParent;
286cdf0e10cSrcweir }
287cdf0e10cSrcweir 
288cdf0e10cSrcweir sal_Int32 SAL_CALL
getAccessibleIndexInParent(void)289cdf0e10cSrcweir     ScAccessibleContextBase::getAccessibleIndexInParent(void)
290cdf0e10cSrcweir     throw (uno::RuntimeException)
291cdf0e10cSrcweir {
292cdf0e10cSrcweir     ScUnoGuard aGuard;
293cdf0e10cSrcweir     IsObjectValid();
294cdf0e10cSrcweir     //  Use a simple but slow solution for now.  Optimize later.
295cdf0e10cSrcweir    //   Return -1 to indicate that this object's parent does not know about the
296cdf0e10cSrcweir    //   object.
297cdf0e10cSrcweir     sal_Int32 nIndex(-1);
298cdf0e10cSrcweir 
299cdf0e10cSrcweir     //  Iterate over all the parent's children and search for this object.
300cdf0e10cSrcweir     if (mxParent.is())
301cdf0e10cSrcweir     {
302cdf0e10cSrcweir         uno::Reference<XAccessibleContext> xParentContext (
303cdf0e10cSrcweir             mxParent->getAccessibleContext());
304cdf0e10cSrcweir         if (xParentContext.is())
305cdf0e10cSrcweir         {
306cdf0e10cSrcweir             sal_Int32 nChildCount = xParentContext->getAccessibleChildCount();
307cdf0e10cSrcweir             for (sal_Int32 i=0; i<nChildCount; ++i)
308cdf0e10cSrcweir             {
309cdf0e10cSrcweir                 uno::Reference<XAccessible> xChild (xParentContext->getAccessibleChild (i));
310cdf0e10cSrcweir                 if (xChild.is())
311cdf0e10cSrcweir                 {
312cdf0e10cSrcweir                     if (xChild.get() == this)
313cdf0e10cSrcweir                         nIndex = i;
314cdf0e10cSrcweir                 }
315cdf0e10cSrcweir             }
316cdf0e10cSrcweir         }
317cdf0e10cSrcweir    }
318cdf0e10cSrcweir 
319cdf0e10cSrcweir    return nIndex;
320cdf0e10cSrcweir }
321cdf0e10cSrcweir 
322cdf0e10cSrcweir sal_Int16 SAL_CALL
getAccessibleRole(void)323cdf0e10cSrcweir     ScAccessibleContextBase::getAccessibleRole(void)
324cdf0e10cSrcweir     throw (uno::RuntimeException)
325cdf0e10cSrcweir {
326cdf0e10cSrcweir     return maRole;
327cdf0e10cSrcweir }
328cdf0e10cSrcweir 
329cdf0e10cSrcweir ::rtl::OUString SAL_CALL
getAccessibleDescription(void)330cdf0e10cSrcweir     ScAccessibleContextBase::getAccessibleDescription(void)
331cdf0e10cSrcweir     throw (uno::RuntimeException)
332cdf0e10cSrcweir {
333cdf0e10cSrcweir     ScUnoGuard aGuard;
334cdf0e10cSrcweir     IsObjectValid();
335cdf0e10cSrcweir     if (!msDescription.getLength())
336cdf0e10cSrcweir     {
337cdf0e10cSrcweir         OUString sDescription(createAccessibleDescription());
338*e44970e3SJohn Bampton //      DBG_ASSERT(sDescription.getLength(), "We should give always a description.");
339cdf0e10cSrcweir 
340cdf0e10cSrcweir         if (msDescription != sDescription)
341cdf0e10cSrcweir         {
342cdf0e10cSrcweir             AccessibleEventObject aEvent;
343cdf0e10cSrcweir             aEvent.EventId = AccessibleEventId::DESCRIPTION_CHANGED;
344cdf0e10cSrcweir             aEvent.Source = uno::Reference< XAccessibleContext >(this);
345cdf0e10cSrcweir             aEvent.OldValue <<= msDescription;
346cdf0e10cSrcweir             aEvent.NewValue <<= sDescription;
347cdf0e10cSrcweir 
348cdf0e10cSrcweir             msDescription = sDescription;
349cdf0e10cSrcweir 
350cdf0e10cSrcweir             CommitChange(aEvent);
351cdf0e10cSrcweir         }
352cdf0e10cSrcweir     }
353cdf0e10cSrcweir     return msDescription;
354cdf0e10cSrcweir }
355cdf0e10cSrcweir 
356cdf0e10cSrcweir OUString SAL_CALL
getAccessibleName(void)357cdf0e10cSrcweir     ScAccessibleContextBase::getAccessibleName(void)
358cdf0e10cSrcweir     throw (uno::RuntimeException)
359cdf0e10cSrcweir {
360cdf0e10cSrcweir     ScUnoGuard aGuard;
361cdf0e10cSrcweir     IsObjectValid();
362cdf0e10cSrcweir     if (!msName.getLength())
363cdf0e10cSrcweir     {
364cdf0e10cSrcweir         OUString sName(createAccessibleName());
365cdf0e10cSrcweir         DBG_ASSERT(sName.getLength(), "We should give always a name.");
366cdf0e10cSrcweir 
367cdf0e10cSrcweir         if (msName != sName)
368cdf0e10cSrcweir         {
369cdf0e10cSrcweir             AccessibleEventObject aEvent;
370cdf0e10cSrcweir             aEvent.EventId = AccessibleEventId::NAME_CHANGED;
371cdf0e10cSrcweir             aEvent.Source = uno::Reference< XAccessibleContext >(this);
372cdf0e10cSrcweir             aEvent.OldValue <<= msName;
373cdf0e10cSrcweir             aEvent.NewValue <<= sName;
374cdf0e10cSrcweir 
375cdf0e10cSrcweir             msName = sName;
376cdf0e10cSrcweir 
377cdf0e10cSrcweir             CommitChange(aEvent);
378cdf0e10cSrcweir         }
379cdf0e10cSrcweir     }
380cdf0e10cSrcweir     return msName;
381cdf0e10cSrcweir }
382cdf0e10cSrcweir 
383cdf0e10cSrcweir uno::Reference<XAccessibleRelationSet> SAL_CALL
getAccessibleRelationSet(void)384cdf0e10cSrcweir     ScAccessibleContextBase::getAccessibleRelationSet(void)
385cdf0e10cSrcweir     throw (uno::RuntimeException)
386cdf0e10cSrcweir {
387cdf0e10cSrcweir     return new utl::AccessibleRelationSetHelper();
388cdf0e10cSrcweir }
389cdf0e10cSrcweir 
390cdf0e10cSrcweir uno::Reference<XAccessibleStateSet> SAL_CALL
getAccessibleStateSet(void)391cdf0e10cSrcweir         ScAccessibleContextBase::getAccessibleStateSet(void)
392cdf0e10cSrcweir     throw (uno::RuntimeException)
393cdf0e10cSrcweir {
394cdf0e10cSrcweir     return uno::Reference<XAccessibleStateSet>();
395cdf0e10cSrcweir }
396cdf0e10cSrcweir 
397cdf0e10cSrcweir lang::Locale SAL_CALL
getLocale(void)398cdf0e10cSrcweir     ScAccessibleContextBase::getLocale(void)
399cdf0e10cSrcweir     throw (IllegalAccessibleComponentStateException,
400cdf0e10cSrcweir         uno::RuntimeException)
401cdf0e10cSrcweir {
402cdf0e10cSrcweir     ScUnoGuard aGuard;
403cdf0e10cSrcweir     IsObjectValid();
404cdf0e10cSrcweir     if (mxParent.is())
405cdf0e10cSrcweir     {
406cdf0e10cSrcweir         uno::Reference<XAccessibleContext> xParentContext (
407cdf0e10cSrcweir             mxParent->getAccessibleContext());
408cdf0e10cSrcweir         if (xParentContext.is())
409cdf0e10cSrcweir             return xParentContext->getLocale ();
410cdf0e10cSrcweir     }
411cdf0e10cSrcweir 
412cdf0e10cSrcweir     //  No locale and no parent.  Therefore throw exception to indicate this
413cdf0e10cSrcweir     //  cluelessness.
414cdf0e10cSrcweir     throw IllegalAccessibleComponentStateException ();
415cdf0e10cSrcweir }
416cdf0e10cSrcweir 
417cdf0e10cSrcweir     //=====  XAccessibleEventBroadcaster  =====================================
418cdf0e10cSrcweir 
419cdf0e10cSrcweir void SAL_CALL
addEventListener(const uno::Reference<XAccessibleEventListener> & xListener)420cdf0e10cSrcweir     ScAccessibleContextBase::addEventListener(
421cdf0e10cSrcweir         const uno::Reference<XAccessibleEventListener>& xListener)
422cdf0e10cSrcweir     throw (uno::RuntimeException)
423cdf0e10cSrcweir {
424cdf0e10cSrcweir     if (xListener.is())
425cdf0e10cSrcweir     {
426cdf0e10cSrcweir         ScUnoGuard aGuard;
427cdf0e10cSrcweir         IsObjectValid();
428cdf0e10cSrcweir         if (!IsDefunc())
429cdf0e10cSrcweir         {
430cdf0e10cSrcweir             if (!mnClientId)
431cdf0e10cSrcweir                 mnClientId = comphelper::AccessibleEventNotifier::registerClient( );
432cdf0e10cSrcweir             comphelper::AccessibleEventNotifier::addEventListener( mnClientId, xListener );
433cdf0e10cSrcweir         }
434cdf0e10cSrcweir     }
435cdf0e10cSrcweir }
436cdf0e10cSrcweir 
437cdf0e10cSrcweir void SAL_CALL
removeEventListener(const uno::Reference<XAccessibleEventListener> & xListener)438cdf0e10cSrcweir     ScAccessibleContextBase::removeEventListener(
439cdf0e10cSrcweir         const uno::Reference<XAccessibleEventListener>& xListener)
440cdf0e10cSrcweir     throw (uno::RuntimeException)
441cdf0e10cSrcweir {
442cdf0e10cSrcweir     if (xListener.is())
443cdf0e10cSrcweir     {
444cdf0e10cSrcweir         ScUnoGuard aGuard;
445cdf0e10cSrcweir         if (!IsDefunc() && mnClientId)
446cdf0e10cSrcweir         {
447cdf0e10cSrcweir             sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( mnClientId, xListener );
448cdf0e10cSrcweir             if ( !nListenerCount )
449cdf0e10cSrcweir             {
450cdf0e10cSrcweir                 // no listeners anymore
451cdf0e10cSrcweir                 // -> revoke ourself. This may lead to the notifier thread dying (if we were the last client),
452cdf0e10cSrcweir                 // and at least to us not firing any events anymore, in case somebody calls
453cdf0e10cSrcweir                 // NotifyAccessibleEvent, again
454cdf0e10cSrcweir                 comphelper::AccessibleEventNotifier::revokeClient( mnClientId );
455cdf0e10cSrcweir                 mnClientId = 0;
456cdf0e10cSrcweir             }
457cdf0e10cSrcweir         }
458cdf0e10cSrcweir     }
459cdf0e10cSrcweir }
460cdf0e10cSrcweir 
461cdf0e10cSrcweir     //=====  XAccessibleEventListener  ========================================
462cdf0e10cSrcweir 
disposing(const lang::EventObject & rSource)463cdf0e10cSrcweir void SAL_CALL ScAccessibleContextBase::disposing(
464cdf0e10cSrcweir     const lang::EventObject& rSource )
465cdf0e10cSrcweir         throw (uno::RuntimeException)
466cdf0e10cSrcweir {
467cdf0e10cSrcweir     ScUnoGuard aGuard;
468cdf0e10cSrcweir     if (rSource.Source == mxParent)
469cdf0e10cSrcweir         dispose();
470cdf0e10cSrcweir }
471cdf0e10cSrcweir 
notifyEvent(const AccessibleEventObject &)472cdf0e10cSrcweir void SAL_CALL ScAccessibleContextBase::notifyEvent(
473cdf0e10cSrcweir         const AccessibleEventObject& /* aEvent */ )
474cdf0e10cSrcweir         throw (uno::RuntimeException)
475cdf0e10cSrcweir {
476cdf0e10cSrcweir }
477cdf0e10cSrcweir 
478cdf0e10cSrcweir //=====  XServiceInfo  ========================================================
479cdf0e10cSrcweir 
480cdf0e10cSrcweir ::rtl::OUString SAL_CALL
getImplementationName(void)481cdf0e10cSrcweir     ScAccessibleContextBase::getImplementationName(void)
482cdf0e10cSrcweir     throw (uno::RuntimeException)
483cdf0e10cSrcweir {
484cdf0e10cSrcweir     return OUString(RTL_CONSTASCII_USTRINGPARAM ("ScAccessibleContextBase"));
485cdf0e10cSrcweir }
486cdf0e10cSrcweir 
487cdf0e10cSrcweir sal_Bool SAL_CALL
supportsService(const OUString & sServiceName)488cdf0e10cSrcweir     ScAccessibleContextBase::supportsService(const OUString& sServiceName)
489cdf0e10cSrcweir     throw (uno::RuntimeException)
490cdf0e10cSrcweir {
491cdf0e10cSrcweir     //  Iterate over all supported service names and return true if on of them
492cdf0e10cSrcweir     //  matches the given name.
493cdf0e10cSrcweir     uno::Sequence< ::rtl::OUString> aSupportedServices (
494cdf0e10cSrcweir         getSupportedServiceNames ());
495cdf0e10cSrcweir     sal_Int32 nLength(aSupportedServices.getLength());
496cdf0e10cSrcweir     const OUString* pServiceNames = aSupportedServices.getConstArray();
497cdf0e10cSrcweir     for (int i=0; i<nLength; ++i, ++pServiceNames)
498cdf0e10cSrcweir         if (sServiceName == *pServiceNames)
499cdf0e10cSrcweir             return sal_True;
500cdf0e10cSrcweir     return sal_False;
501cdf0e10cSrcweir }
502cdf0e10cSrcweir 
503cdf0e10cSrcweir uno::Sequence< ::rtl::OUString> SAL_CALL
getSupportedServiceNames(void)504cdf0e10cSrcweir     ScAccessibleContextBase::getSupportedServiceNames(void)
505cdf0e10cSrcweir     throw (uno::RuntimeException)
506cdf0e10cSrcweir {
507cdf0e10cSrcweir     uno::Sequence<OUString> aServiceNames(2);
508cdf0e10cSrcweir     OUString* pServiceNames = aServiceNames.getArray();
509cdf0e10cSrcweir     if (pServiceNames)
510cdf0e10cSrcweir     {
511cdf0e10cSrcweir         pServiceNames[0] = OUString(RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.accessibility.Accessible"));
512cdf0e10cSrcweir         pServiceNames[1] = OUString(RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.accessibility.AccessibleContext"));
513cdf0e10cSrcweir     }
514cdf0e10cSrcweir 
515cdf0e10cSrcweir     return aServiceNames;
516cdf0e10cSrcweir }
517cdf0e10cSrcweir 
518cdf0e10cSrcweir //=====  XTypeProvider  =======================================================
519cdf0e10cSrcweir 
getTypes()520cdf0e10cSrcweir uno::Sequence< uno::Type > SAL_CALL ScAccessibleContextBase::getTypes()
521cdf0e10cSrcweir         throw (uno::RuntimeException)
522cdf0e10cSrcweir {
523cdf0e10cSrcweir     return comphelper::concatSequences(ScAccessibleContextBaseWeakImpl::getTypes(), ScAccessibleContextBaseImplEvent::getTypes());
524cdf0e10cSrcweir }
525cdf0e10cSrcweir 
526cdf0e10cSrcweir uno::Sequence<sal_Int8> SAL_CALL
getImplementationId(void)527cdf0e10cSrcweir     ScAccessibleContextBase::getImplementationId(void)
528cdf0e10cSrcweir     throw (uno::RuntimeException)
529cdf0e10cSrcweir {
530cdf0e10cSrcweir     ScUnoGuard aGuard;
531cdf0e10cSrcweir     IsObjectValid();
532cdf0e10cSrcweir     static uno::Sequence<sal_Int8> aId;
533cdf0e10cSrcweir     if (aId.getLength() == 0)
534cdf0e10cSrcweir     {
535cdf0e10cSrcweir         aId.realloc (16);
536cdf0e10cSrcweir         rtl_createUuid (reinterpret_cast<sal_uInt8 *>(aId.getArray()), 0, sal_True);
537cdf0e10cSrcweir     }
538cdf0e10cSrcweir     return aId;
539cdf0e10cSrcweir }
540cdf0e10cSrcweir 
541cdf0e10cSrcweir //=====  internal  ============================================================
542cdf0e10cSrcweir 
543cdf0e10cSrcweir ::rtl::OUString SAL_CALL
createAccessibleDescription(void)544cdf0e10cSrcweir     ScAccessibleContextBase::createAccessibleDescription(void)
545cdf0e10cSrcweir     throw (uno::RuntimeException)
546cdf0e10cSrcweir {
547cdf0e10cSrcweir     DBG_ERROR("should be implemented in the abrevated class");
548cdf0e10cSrcweir     return rtl::OUString();
549cdf0e10cSrcweir }
550cdf0e10cSrcweir 
551cdf0e10cSrcweir ::rtl::OUString SAL_CALL
createAccessibleName(void)552cdf0e10cSrcweir     ScAccessibleContextBase::createAccessibleName(void)
553cdf0e10cSrcweir     throw (uno::RuntimeException)
554cdf0e10cSrcweir {
555cdf0e10cSrcweir     DBG_ERROR("should be implemented in the abrevated class");
556cdf0e10cSrcweir     return rtl::OUString();
557cdf0e10cSrcweir }
558cdf0e10cSrcweir 
CommitChange(const AccessibleEventObject & rEvent) const559cdf0e10cSrcweir void ScAccessibleContextBase::CommitChange(const AccessibleEventObject& rEvent) const
560cdf0e10cSrcweir {
561cdf0e10cSrcweir     if (mnClientId)
562cdf0e10cSrcweir         comphelper::AccessibleEventNotifier::addEvent( mnClientId, rEvent );
563cdf0e10cSrcweir }
564cdf0e10cSrcweir 
ChangeName()565cdf0e10cSrcweir void ScAccessibleContextBase::ChangeName()
566cdf0e10cSrcweir {
567cdf0e10cSrcweir     AccessibleEventObject aEvent;
568cdf0e10cSrcweir     aEvent.EventId = AccessibleEventId::NAME_CHANGED;
569cdf0e10cSrcweir     aEvent.Source = uno::Reference< XAccessibleContext >(const_cast<ScAccessibleContextBase*>(this));
570cdf0e10cSrcweir     aEvent.OldValue <<= msName;
571cdf0e10cSrcweir 
572cdf0e10cSrcweir     msName = rtl::OUString(); // reset the name so it will be hold again
573cdf0e10cSrcweir     getAccessibleName(); // create the new name
574cdf0e10cSrcweir 
575cdf0e10cSrcweir     aEvent.NewValue <<= msName;
576cdf0e10cSrcweir 
577cdf0e10cSrcweir     CommitChange(aEvent);
578cdf0e10cSrcweir }
579cdf0e10cSrcweir 
CommitFocusGained() const580cdf0e10cSrcweir void ScAccessibleContextBase::CommitFocusGained() const
581cdf0e10cSrcweir {
582cdf0e10cSrcweir     AccessibleEventObject aEvent;
583cdf0e10cSrcweir     aEvent.EventId = AccessibleEventId::STATE_CHANGED;
584cdf0e10cSrcweir     aEvent.Source = uno::Reference< XAccessibleContext >(const_cast<ScAccessibleContextBase*>(this));
585cdf0e10cSrcweir     aEvent.NewValue <<= AccessibleStateType::FOCUSED;
586cdf0e10cSrcweir 
587cdf0e10cSrcweir     CommitChange(aEvent);
588cdf0e10cSrcweir 
589cdf0e10cSrcweir     ::vcl::unohelper::NotifyAccessibleStateEventGlobally(aEvent);
590cdf0e10cSrcweir }
591cdf0e10cSrcweir 
CommitFocusLost() const592cdf0e10cSrcweir void ScAccessibleContextBase::CommitFocusLost() const
593cdf0e10cSrcweir {
594cdf0e10cSrcweir     AccessibleEventObject aEvent;
595cdf0e10cSrcweir     aEvent.EventId = AccessibleEventId::STATE_CHANGED;
596cdf0e10cSrcweir     aEvent.Source = uno::Reference< XAccessibleContext >(const_cast<ScAccessibleContextBase*>(this));
597cdf0e10cSrcweir     aEvent.OldValue <<= AccessibleStateType::FOCUSED;
598cdf0e10cSrcweir 
599cdf0e10cSrcweir     CommitChange(aEvent);
600cdf0e10cSrcweir 
601cdf0e10cSrcweir     vcl::unohelper::NotifyAccessibleStateEventGlobally(aEvent);
602cdf0e10cSrcweir }
603cdf0e10cSrcweir 
GetBoundingBoxOnScreen(void) const604cdf0e10cSrcweir Rectangle ScAccessibleContextBase::GetBoundingBoxOnScreen(void) const
605cdf0e10cSrcweir         throw (uno::RuntimeException)
606cdf0e10cSrcweir {
607cdf0e10cSrcweir     DBG_ERROR("not implemented");
608cdf0e10cSrcweir     return Rectangle();
609cdf0e10cSrcweir }
610cdf0e10cSrcweir 
GetBoundingBox(void) const611cdf0e10cSrcweir Rectangle ScAccessibleContextBase::GetBoundingBox(void) const
612cdf0e10cSrcweir         throw (uno::RuntimeException)
613cdf0e10cSrcweir {
614cdf0e10cSrcweir     DBG_ERROR("not implemented");
615cdf0e10cSrcweir     return Rectangle();
616cdf0e10cSrcweir }
617cdf0e10cSrcweir 
IsObjectValid() const618cdf0e10cSrcweir void ScAccessibleContextBase::IsObjectValid() const
619cdf0e10cSrcweir         throw (lang::DisposedException)
620cdf0e10cSrcweir {
621cdf0e10cSrcweir     if (rBHelper.bDisposed || rBHelper.bInDispose)
622cdf0e10cSrcweir         throw lang::DisposedException();
623cdf0e10cSrcweir }
624