1*b3f79822SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*b3f79822SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*b3f79822SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*b3f79822SAndrew Rist * distributed with this work for additional information 6*b3f79822SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*b3f79822SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*b3f79822SAndrew Rist * "License"); you may not use this file except in compliance 9*b3f79822SAndrew Rist * with the License. You may obtain a copy of the License at 10*b3f79822SAndrew Rist * 11*b3f79822SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*b3f79822SAndrew Rist * 13*b3f79822SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*b3f79822SAndrew Rist * software distributed under the License is distributed on an 15*b3f79822SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b3f79822SAndrew Rist * KIND, either express or implied. See the License for the 17*b3f79822SAndrew Rist * specific language governing permissions and limitations 18*b3f79822SAndrew Rist * under the License. 19*b3f79822SAndrew Rist * 20*b3f79822SAndrew Rist *************************************************************/ 21*b3f79822SAndrew Rist 22*b3f79822SAndrew 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 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 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 ); 79cdf0e10cSrcweir // call dispose to inform object wich have a weak reference to this object 80cdf0e10cSrcweir dispose(); 81cdf0e10cSrcweir } 82cdf0e10cSrcweir } 83cdf0e10cSrcweir 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 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 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 134cdf0e10cSrcweir void SAL_CALL ScAccessibleContextBase::acquire() 135cdf0e10cSrcweir throw () 136cdf0e10cSrcweir { 137cdf0e10cSrcweir ScAccessibleContextBaseWeakImpl::acquire(); 138cdf0e10cSrcweir } 139cdf0e10cSrcweir 140cdf0e10cSrcweir void SAL_CALL ScAccessibleContextBase::release() 141cdf0e10cSrcweir throw () 142cdf0e10cSrcweir { 143cdf0e10cSrcweir ScAccessibleContextBaseWeakImpl::release(); 144cdf0e10cSrcweir } 145cdf0e10cSrcweir 146cdf0e10cSrcweir //===== SfxListener ===================================================== 147cdf0e10cSrcweir 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 164cdf0e10cSrcweir ScAccessibleContextBase::getAccessibleContext(void) 165cdf0e10cSrcweir throw (uno::RuntimeException) 166cdf0e10cSrcweir { 167cdf0e10cSrcweir return this; 168cdf0e10cSrcweir } 169cdf0e10cSrcweir 170cdf0e10cSrcweir //===== XAccessibleComponent ================================================ 171cdf0e10cSrcweir 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 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 188cdf0e10cSrcweir awt::Rectangle SAL_CALL ScAccessibleContextBase::getBounds( ) 189cdf0e10cSrcweir throw (uno::RuntimeException) 190cdf0e10cSrcweir { 191cdf0e10cSrcweir ScUnoGuard aGuard; 192cdf0e10cSrcweir IsObjectValid(); 193cdf0e10cSrcweir return AWTRectangle(GetBoundingBox()); 194cdf0e10cSrcweir } 195cdf0e10cSrcweir 196cdf0e10cSrcweir awt::Point SAL_CALL ScAccessibleContextBase::getLocation( ) 197cdf0e10cSrcweir throw (uno::RuntimeException) 198cdf0e10cSrcweir { 199cdf0e10cSrcweir ScUnoGuard aGuard; 200cdf0e10cSrcweir IsObjectValid(); 201cdf0e10cSrcweir return AWTPoint(GetBoundingBox().TopLeft()); 202cdf0e10cSrcweir } 203cdf0e10cSrcweir 204cdf0e10cSrcweir awt::Point SAL_CALL ScAccessibleContextBase::getLocationOnScreen( ) 205cdf0e10cSrcweir throw (uno::RuntimeException) 206cdf0e10cSrcweir { 207cdf0e10cSrcweir ScUnoGuard aGuard; 208cdf0e10cSrcweir IsObjectValid(); 209cdf0e10cSrcweir return AWTPoint(GetBoundingBoxOnScreen().TopLeft()); 210cdf0e10cSrcweir } 211cdf0e10cSrcweir 212cdf0e10cSrcweir awt::Size SAL_CALL ScAccessibleContextBase::getSize( ) 213cdf0e10cSrcweir throw (uno::RuntimeException) 214cdf0e10cSrcweir { 215cdf0e10cSrcweir ScUnoGuard aGuard; 216cdf0e10cSrcweir IsObjectValid(); 217cdf0e10cSrcweir return AWTSize(GetBoundingBox().GetSize()); 218cdf0e10cSrcweir } 219cdf0e10cSrcweir 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 239cdf0e10cSrcweir sal_Bool SAL_CALL ScAccessibleContextBase::isVisible( ) 240cdf0e10cSrcweir throw (uno::RuntimeException) 241cdf0e10cSrcweir { 242cdf0e10cSrcweir return sal_True; 243cdf0e10cSrcweir } 244cdf0e10cSrcweir 245cdf0e10cSrcweir void SAL_CALL ScAccessibleContextBase::grabFocus( ) 246cdf0e10cSrcweir throw (uno::RuntimeException) 247cdf0e10cSrcweir { 248cdf0e10cSrcweir DBG_ERROR("not implemented"); 249cdf0e10cSrcweir } 250cdf0e10cSrcweir 251cdf0e10cSrcweir sal_Int32 SAL_CALL ScAccessibleContextBase::getForeground( ) 252cdf0e10cSrcweir throw (uno::RuntimeException) 253cdf0e10cSrcweir { 254cdf0e10cSrcweir return COL_BLACK; 255cdf0e10cSrcweir } 256cdf0e10cSrcweir 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 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 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 282cdf0e10cSrcweir ScAccessibleContextBase::getAccessibleParent(void) 283cdf0e10cSrcweir throw (uno::RuntimeException) 284cdf0e10cSrcweir { 285cdf0e10cSrcweir return mxParent; 286cdf0e10cSrcweir } 287cdf0e10cSrcweir 288cdf0e10cSrcweir sal_Int32 SAL_CALL 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 323cdf0e10cSrcweir ScAccessibleContextBase::getAccessibleRole(void) 324cdf0e10cSrcweir throw (uno::RuntimeException) 325cdf0e10cSrcweir { 326cdf0e10cSrcweir return maRole; 327cdf0e10cSrcweir } 328cdf0e10cSrcweir 329cdf0e10cSrcweir ::rtl::OUString SAL_CALL 330cdf0e10cSrcweir ScAccessibleContextBase::getAccessibleDescription(void) 331cdf0e10cSrcweir throw (uno::RuntimeException) 332cdf0e10cSrcweir { 333cdf0e10cSrcweir ScUnoGuard aGuard; 334cdf0e10cSrcweir IsObjectValid(); 335cdf0e10cSrcweir if (!msDescription.getLength()) 336cdf0e10cSrcweir { 337cdf0e10cSrcweir OUString sDescription(createAccessibleDescription()); 338cdf0e10cSrcweir // DBG_ASSERT(sDescription.getLength(), "We should give always a descripition."); 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 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 384cdf0e10cSrcweir ScAccessibleContextBase::getAccessibleRelationSet(void) 385cdf0e10cSrcweir throw (uno::RuntimeException) 386cdf0e10cSrcweir { 387cdf0e10cSrcweir return new utl::AccessibleRelationSetHelper(); 388cdf0e10cSrcweir } 389cdf0e10cSrcweir 390cdf0e10cSrcweir uno::Reference<XAccessibleStateSet> SAL_CALL 391cdf0e10cSrcweir ScAccessibleContextBase::getAccessibleStateSet(void) 392cdf0e10cSrcweir throw (uno::RuntimeException) 393cdf0e10cSrcweir { 394cdf0e10cSrcweir return uno::Reference<XAccessibleStateSet>(); 395cdf0e10cSrcweir } 396cdf0e10cSrcweir 397cdf0e10cSrcweir lang::Locale SAL_CALL 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 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 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 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 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 481cdf0e10cSrcweir ScAccessibleContextBase::getImplementationName(void) 482cdf0e10cSrcweir throw (uno::RuntimeException) 483cdf0e10cSrcweir { 484cdf0e10cSrcweir return OUString(RTL_CONSTASCII_USTRINGPARAM ("ScAccessibleContextBase")); 485cdf0e10cSrcweir } 486cdf0e10cSrcweir 487cdf0e10cSrcweir sal_Bool SAL_CALL 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 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 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 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 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 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 559cdf0e10cSrcweir void ScAccessibleContextBase::CommitChange(const AccessibleEventObject& rEvent) const 560cdf0e10cSrcweir { 561cdf0e10cSrcweir if (mnClientId) 562cdf0e10cSrcweir comphelper::AccessibleEventNotifier::addEvent( mnClientId, rEvent ); 563cdf0e10cSrcweir } 564cdf0e10cSrcweir 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 580cdf0e10cSrcweir 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 592cdf0e10cSrcweir 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 604cdf0e10cSrcweir Rectangle ScAccessibleContextBase::GetBoundingBoxOnScreen(void) const 605cdf0e10cSrcweir throw (uno::RuntimeException) 606cdf0e10cSrcweir { 607cdf0e10cSrcweir DBG_ERROR("not implemented"); 608cdf0e10cSrcweir return Rectangle(); 609cdf0e10cSrcweir } 610cdf0e10cSrcweir 611cdf0e10cSrcweir Rectangle ScAccessibleContextBase::GetBoundingBox(void) const 612cdf0e10cSrcweir throw (uno::RuntimeException) 613cdf0e10cSrcweir { 614cdf0e10cSrcweir DBG_ERROR("not implemented"); 615cdf0e10cSrcweir return Rectangle(); 616cdf0e10cSrcweir } 617cdf0e10cSrcweir 618cdf0e10cSrcweir void ScAccessibleContextBase::IsObjectValid() const 619cdf0e10cSrcweir throw (lang::DisposedException) 620cdf0e10cSrcweir { 621cdf0e10cSrcweir if (rBHelper.bDisposed || rBHelper.bInDispose) 622cdf0e10cSrcweir throw lang::DisposedException(); 623cdf0e10cSrcweir } 624cdf0e10cSrcweir 625