1*cde9e8dcSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*cde9e8dcSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*cde9e8dcSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*cde9e8dcSAndrew Rist * distributed with this work for additional information 6*cde9e8dcSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*cde9e8dcSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*cde9e8dcSAndrew Rist * "License"); you may not use this file except in compliance 9*cde9e8dcSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*cde9e8dcSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*cde9e8dcSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*cde9e8dcSAndrew Rist * software distributed under the License is distributed on an 15*cde9e8dcSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*cde9e8dcSAndrew Rist * KIND, either express or implied. See the License for the 17*cde9e8dcSAndrew Rist * specific language governing permissions and limitations 18*cde9e8dcSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*cde9e8dcSAndrew Rist *************************************************************/ 21*cde9e8dcSAndrew Rist 22*cde9e8dcSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_chart2.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include "AccessibleBase.hxx" 28cdf0e10cSrcweir #include "AccessibleChartShape.hxx" 29cdf0e10cSrcweir #include "ObjectHierarchy.hxx" 30cdf0e10cSrcweir #include "ObjectIdentifier.hxx" 31cdf0e10cSrcweir #include "chartview/ExplicitValueProvider.hxx" 32cdf0e10cSrcweir #include "macros.hxx" 33cdf0e10cSrcweir 34cdf0e10cSrcweir #include <com/sun/star/awt/XDevice.hpp> 35cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp> 36cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventObject.hpp> 37cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleStateType.hpp> 38cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleRole.hpp> 39cdf0e10cSrcweir #include <comphelper/serviceinfohelper.hxx> 40cdf0e10cSrcweir #include <com/sun/star/drawing/LineStyle.hpp> 41cdf0e10cSrcweir #include <com/sun/star/drawing/FillStyle.hpp> 42cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 43cdf0e10cSrcweir // for SolarMutex 44cdf0e10cSrcweir #include <vcl/svapp.hxx> 45cdf0e10cSrcweir #include <rtl/uuid.h> 46cdf0e10cSrcweir #include <cppuhelper/queryinterface.hxx> 47cdf0e10cSrcweir #include <svl/itemset.hxx> 48cdf0e10cSrcweir #include <editeng/unofdesc.hxx> 49cdf0e10cSrcweir #include <editeng/outliner.hxx> 50cdf0e10cSrcweir #include <svx/svdoutl.hxx> 51cdf0e10cSrcweir #include <svx/svdetc.hxx> 52cdf0e10cSrcweir #include <svx/unoshape.hxx> 53cdf0e10cSrcweir #include <svx/unoprov.hxx> 54cdf0e10cSrcweir #include <vcl/unohelp.hxx> 55cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx> 56cdf0e10cSrcweir #include <vcl/window.hxx> 57cdf0e10cSrcweir 58cdf0e10cSrcweir #include <algorithm> 59cdf0e10cSrcweir 60cdf0e10cSrcweir #include "ChartElementFactory.hxx" 61cdf0e10cSrcweir 62cdf0e10cSrcweir using namespace ::com::sun::star; 63cdf0e10cSrcweir using namespace ::com::sun::star::accessibility; 64cdf0e10cSrcweir 65cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY; 66cdf0e10cSrcweir using ::rtl::OUString; 67cdf0e10cSrcweir using ::rtl::OUStringBuffer; 68cdf0e10cSrcweir using ::com::sun::star::uno::Reference; 69cdf0e10cSrcweir using ::osl::MutexGuard; 70cdf0e10cSrcweir using ::osl::ClearableMutexGuard; 71cdf0e10cSrcweir using ::osl::ResettableMutexGuard; 72cdf0e10cSrcweir using ::com::sun::star::uno::RuntimeException; 73cdf0e10cSrcweir using ::com::sun::star::uno::Any; 74cdf0e10cSrcweir 75cdf0e10cSrcweir namespace chart 76cdf0e10cSrcweir { 77cdf0e10cSrcweir 78cdf0e10cSrcweir /** @param bMayHaveChildren is false per default 79cdf0e10cSrcweir */ 80cdf0e10cSrcweir AccessibleBase::AccessibleBase( 81cdf0e10cSrcweir const AccessibleElementInfo & rAccInfo, 82cdf0e10cSrcweir bool bMayHaveChildren, 83cdf0e10cSrcweir bool bAlwaysTransparent /* default: false */ ) : 84cdf0e10cSrcweir impl::AccessibleBase_Base( m_aMutex ), 85cdf0e10cSrcweir m_bIsDisposed( false ), 86cdf0e10cSrcweir m_bMayHaveChildren( bMayHaveChildren ), 87cdf0e10cSrcweir m_bChildrenInitialized( false ), 88cdf0e10cSrcweir m_nEventNotifierId(0), 89cdf0e10cSrcweir m_pStateSetHelper( new ::utl::AccessibleStateSetHelper() ), 90cdf0e10cSrcweir m_aStateSet( m_pStateSetHelper ), 91cdf0e10cSrcweir m_aAccInfo( rAccInfo ), 92cdf0e10cSrcweir m_bAlwaysTransparent( bAlwaysTransparent ), 93cdf0e10cSrcweir m_bStateSetInitialized( false ) 94cdf0e10cSrcweir { 95cdf0e10cSrcweir // initialize some states 96cdf0e10cSrcweir OSL_ASSERT( m_pStateSetHelper ); 97cdf0e10cSrcweir m_pStateSetHelper->AddState( AccessibleStateType::ENABLED ); 98cdf0e10cSrcweir m_pStateSetHelper->AddState( AccessibleStateType::SHOWING ); 99cdf0e10cSrcweir m_pStateSetHelper->AddState( AccessibleStateType::VISIBLE ); 100cdf0e10cSrcweir m_pStateSetHelper->AddState( AccessibleStateType::SELECTABLE ); 101cdf0e10cSrcweir m_pStateSetHelper->AddState( AccessibleStateType::FOCUSABLE ); 102cdf0e10cSrcweir } 103cdf0e10cSrcweir 104cdf0e10cSrcweir AccessibleBase::~AccessibleBase() 105cdf0e10cSrcweir { 106cdf0e10cSrcweir OSL_ASSERT( m_bIsDisposed ); 107cdf0e10cSrcweir } 108cdf0e10cSrcweir 109cdf0e10cSrcweir // ________ public ________ 110cdf0e10cSrcweir 111cdf0e10cSrcweir bool AccessibleBase::CheckDisposeState( bool bThrowException /* default: true */ ) const 112cdf0e10cSrcweir throw (lang::DisposedException) 113cdf0e10cSrcweir { 114cdf0e10cSrcweir if( bThrowException && 115cdf0e10cSrcweir m_bIsDisposed ) 116cdf0e10cSrcweir { 117cdf0e10cSrcweir throw lang::DisposedException( 118cdf0e10cSrcweir C2U("component has state DEFUNC" ), 119cdf0e10cSrcweir static_cast< uno::XWeak * >( const_cast< AccessibleBase * >( this ))); 120cdf0e10cSrcweir } 121cdf0e10cSrcweir return m_bIsDisposed; 122cdf0e10cSrcweir } 123cdf0e10cSrcweir 124cdf0e10cSrcweir bool AccessibleBase::NotifyEvent( EventType eEventType, const AccessibleUniqueId & rId ) 125cdf0e10cSrcweir { 126cdf0e10cSrcweir if( GetId() == rId ) 127cdf0e10cSrcweir { 128cdf0e10cSrcweir // event is addressed to this object 129cdf0e10cSrcweir 130cdf0e10cSrcweir ::com::sun::star::uno::Any aEmpty; 131cdf0e10cSrcweir ::com::sun::star::uno::Any aSelected; 132cdf0e10cSrcweir aSelected <<= AccessibleStateType::SELECTED; 133cdf0e10cSrcweir switch( eEventType ) 134cdf0e10cSrcweir { 135cdf0e10cSrcweir case OBJECT_CHANGE: 136cdf0e10cSrcweir { 137cdf0e10cSrcweir BroadcastAccEvent( AccessibleEventId::VISIBLE_DATA_CHANGED, aEmpty, aEmpty ); 138cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 139cdf0e10cSrcweir OSL_TRACE( 140cdf0e10cSrcweir ::rtl::OUStringToOString( 141cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( 142cdf0e10cSrcweir "Visible data event sent by: " )) + 143cdf0e10cSrcweir getAccessibleName(), 144cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).getStr() ); 145cdf0e10cSrcweir #endif 146cdf0e10cSrcweir } 147cdf0e10cSrcweir break; 148cdf0e10cSrcweir 149cdf0e10cSrcweir case GOT_SELECTION: 150cdf0e10cSrcweir { 151cdf0e10cSrcweir AddState( AccessibleStateType::SELECTED ); 152cdf0e10cSrcweir BroadcastAccEvent( AccessibleEventId::STATE_CHANGED, aSelected, aEmpty ); 153cdf0e10cSrcweir 154cdf0e10cSrcweir AddState( AccessibleStateType::FOCUSED ); 155cdf0e10cSrcweir aSelected <<= AccessibleStateType::FOCUSED; 156cdf0e10cSrcweir BroadcastAccEvent( AccessibleEventId::STATE_CHANGED, aSelected, aEmpty, true ); 157cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 158cdf0e10cSrcweir OSL_TRACE( 159cdf0e10cSrcweir ::rtl::OUStringToOString( 160cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( 161cdf0e10cSrcweir "Selection acquired by: " )) + 162cdf0e10cSrcweir getAccessibleName(), 163cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).getStr() ); 164cdf0e10cSrcweir #endif 165cdf0e10cSrcweir } 166cdf0e10cSrcweir break; 167cdf0e10cSrcweir 168cdf0e10cSrcweir case LOST_SELECTION: 169cdf0e10cSrcweir { 170cdf0e10cSrcweir RemoveState( AccessibleStateType::SELECTED ); 171cdf0e10cSrcweir BroadcastAccEvent( AccessibleEventId::STATE_CHANGED, aEmpty, aSelected ); 172cdf0e10cSrcweir 173cdf0e10cSrcweir AddState( AccessibleStateType::FOCUSED ); 174cdf0e10cSrcweir aSelected <<= AccessibleStateType::FOCUSED; 175cdf0e10cSrcweir BroadcastAccEvent( AccessibleEventId::STATE_CHANGED, aEmpty, aSelected, true ); 176cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 177cdf0e10cSrcweir OSL_TRACE( 178cdf0e10cSrcweir ::rtl::OUStringToOString( 179cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( 180cdf0e10cSrcweir "Selection lost by: " )) + 181cdf0e10cSrcweir getAccessibleName(), 182cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).getStr() ); 183cdf0e10cSrcweir #endif 184cdf0e10cSrcweir } 185cdf0e10cSrcweir break; 186cdf0e10cSrcweir 187cdf0e10cSrcweir case PROPERTY_CHANGE: 188cdf0e10cSrcweir { 189cdf0e10cSrcweir //not implemented --> rebuild all 190cdf0e10cSrcweir } 191cdf0e10cSrcweir break; 192cdf0e10cSrcweir } 193cdf0e10cSrcweir return true; 194cdf0e10cSrcweir } 195cdf0e10cSrcweir else if( m_bMayHaveChildren ) 196cdf0e10cSrcweir { 197cdf0e10cSrcweir bool bStop = false; 198cdf0e10cSrcweir // /-- 199cdf0e10cSrcweir ClearableMutexGuard aGuard( GetMutex() ); 200cdf0e10cSrcweir // make local copy for notification 201cdf0e10cSrcweir ChildListVectorType aLocalChildList( m_aChildList ); 202cdf0e10cSrcweir aGuard.clear(); 203cdf0e10cSrcweir // \-- 204cdf0e10cSrcweir 205cdf0e10cSrcweir ChildListVectorType::iterator aEndIter = aLocalChildList.end(); 206cdf0e10cSrcweir for( ChildListVectorType::iterator aIter = aLocalChildList.begin() ; 207cdf0e10cSrcweir ( aIter != aEndIter ) && ( ! bStop ) ; 208cdf0e10cSrcweir ++aIter ) 209cdf0e10cSrcweir { 210cdf0e10cSrcweir // Note: at this place we must be sure to have an AccessibleBase 211cdf0e10cSrcweir // object in the UNO reference to XAccessible ! 212cdf0e10cSrcweir bStop = (*static_cast< AccessibleBase * > 213cdf0e10cSrcweir ( (*aIter).get() )).NotifyEvent( eEventType, rId ); 214cdf0e10cSrcweir } 215cdf0e10cSrcweir return bStop; 216cdf0e10cSrcweir } 217cdf0e10cSrcweir 218cdf0e10cSrcweir return false; 219cdf0e10cSrcweir } 220cdf0e10cSrcweir 221cdf0e10cSrcweir void AccessibleBase::AddState( sal_Int16 aState ) 222cdf0e10cSrcweir throw (RuntimeException) 223cdf0e10cSrcweir { 224cdf0e10cSrcweir CheckDisposeState(); 225cdf0e10cSrcweir OSL_ASSERT( m_pStateSetHelper ); 226cdf0e10cSrcweir m_pStateSetHelper->AddState( aState ); 227cdf0e10cSrcweir } 228cdf0e10cSrcweir 229cdf0e10cSrcweir void AccessibleBase::RemoveState( sal_Int16 aState ) 230cdf0e10cSrcweir throw (RuntimeException) 231cdf0e10cSrcweir { 232cdf0e10cSrcweir CheckDisposeState(); 233cdf0e10cSrcweir OSL_ASSERT( m_pStateSetHelper ); 234cdf0e10cSrcweir m_pStateSetHelper->RemoveState( aState ); 235cdf0e10cSrcweir } 236cdf0e10cSrcweir 237cdf0e10cSrcweir // ________ protected ________ 238cdf0e10cSrcweir 239cdf0e10cSrcweir bool AccessibleBase::UpdateChildren() 240cdf0e10cSrcweir { 241cdf0e10cSrcweir bool bMustUpdateChildren = false; 242cdf0e10cSrcweir { 243cdf0e10cSrcweir // /-- 244cdf0e10cSrcweir MutexGuard aGuard( GetMutex() ); 245cdf0e10cSrcweir if( ! m_bMayHaveChildren || 246cdf0e10cSrcweir m_bIsDisposed ) 247cdf0e10cSrcweir return false; 248cdf0e10cSrcweir 249cdf0e10cSrcweir bMustUpdateChildren = ( m_bMayHaveChildren && 250cdf0e10cSrcweir ! m_bChildrenInitialized ); 251cdf0e10cSrcweir // \-- 252cdf0e10cSrcweir } 253cdf0e10cSrcweir 254cdf0e10cSrcweir // update unguarded 255cdf0e10cSrcweir if( bMustUpdateChildren ) 256cdf0e10cSrcweir m_bChildrenInitialized = ImplUpdateChildren(); 257cdf0e10cSrcweir 258cdf0e10cSrcweir return m_bChildrenInitialized; 259cdf0e10cSrcweir } 260cdf0e10cSrcweir 261cdf0e10cSrcweir bool AccessibleBase::ImplUpdateChildren() 262cdf0e10cSrcweir { 263cdf0e10cSrcweir bool bResult = false; 264cdf0e10cSrcweir 265cdf0e10cSrcweir if( m_aAccInfo.m_spObjectHierarchy ) 266cdf0e10cSrcweir { 267cdf0e10cSrcweir ObjectHierarchy::tChildContainer aModelChildren( 268cdf0e10cSrcweir m_aAccInfo.m_spObjectHierarchy->getChildren( GetId() )); 269cdf0e10cSrcweir ::std::vector< ChildOIDMap::key_type > aAccChildren; 270cdf0e10cSrcweir aAccChildren.reserve( aModelChildren.size()); 271cdf0e10cSrcweir ::std::transform( m_aChildOIDMap.begin(), m_aChildOIDMap.end(), 272cdf0e10cSrcweir ::std::back_inserter( aAccChildren ), 273cdf0e10cSrcweir ::std::select1st< ChildOIDMap::value_type >()); 274cdf0e10cSrcweir 275cdf0e10cSrcweir ::std::sort( aModelChildren.begin(), aModelChildren.end()); 276cdf0e10cSrcweir 277cdf0e10cSrcweir ::std::vector< ObjectHierarchy::tOID > aChildrenToRemove, aChildrenToAdd; 278cdf0e10cSrcweir ::std::set_difference( aModelChildren.begin(), aModelChildren.end(), 279cdf0e10cSrcweir aAccChildren.begin(), aAccChildren.end(), 280cdf0e10cSrcweir ::std::back_inserter( aChildrenToAdd )); 281cdf0e10cSrcweir ::std::set_difference( aAccChildren.begin(), aAccChildren.end(), 282cdf0e10cSrcweir aModelChildren.begin(), aModelChildren.end(), 283cdf0e10cSrcweir ::std::back_inserter( aChildrenToRemove )); 284cdf0e10cSrcweir 285cdf0e10cSrcweir ::std::vector< ObjectHierarchy::tOID >::const_iterator aIt( aChildrenToRemove.begin()); 286cdf0e10cSrcweir for( ; aIt != aChildrenToRemove.end(); ++aIt ) 287cdf0e10cSrcweir { 288cdf0e10cSrcweir RemoveChildByOId( *aIt ); 289cdf0e10cSrcweir } 290cdf0e10cSrcweir 291cdf0e10cSrcweir AccessibleElementInfo aAccInfo( GetInfo()); 292cdf0e10cSrcweir aAccInfo.m_pParent = this; 293cdf0e10cSrcweir 294cdf0e10cSrcweir for( aIt = aChildrenToAdd.begin(); aIt != aChildrenToAdd.end(); ++aIt ) 295cdf0e10cSrcweir { 296cdf0e10cSrcweir aAccInfo.m_aOID = *aIt; 297cdf0e10cSrcweir if ( aIt->isAutoGeneratedObject() ) 298cdf0e10cSrcweir { 299cdf0e10cSrcweir AddChild( ChartElementFactory::CreateChartElement( aAccInfo ) ); 300cdf0e10cSrcweir } 301cdf0e10cSrcweir else if ( aIt->isAdditionalShape() ) 302cdf0e10cSrcweir { 303cdf0e10cSrcweir AddChild( new AccessibleChartShape( aAccInfo, true, false ) ); 304cdf0e10cSrcweir } 305cdf0e10cSrcweir } 306cdf0e10cSrcweir bResult = true; 307cdf0e10cSrcweir } 308cdf0e10cSrcweir 309cdf0e10cSrcweir return bResult; 310cdf0e10cSrcweir } 311cdf0e10cSrcweir 312cdf0e10cSrcweir void AccessibleBase::AddChild( AccessibleBase * pChild ) 313cdf0e10cSrcweir { 314cdf0e10cSrcweir OSL_ENSURE( pChild != NULL, "Invalid Child" ); 315cdf0e10cSrcweir if( pChild ) 316cdf0e10cSrcweir { 317cdf0e10cSrcweir // /-- 318cdf0e10cSrcweir ClearableMutexGuard aGuard( GetMutex() ); 319cdf0e10cSrcweir 320cdf0e10cSrcweir Reference< XAccessible > xChild( pChild ); 321cdf0e10cSrcweir m_aChildList.push_back( xChild ); 322cdf0e10cSrcweir 323cdf0e10cSrcweir m_aChildOIDMap[ pChild->GetId() ] = xChild; 324cdf0e10cSrcweir 325cdf0e10cSrcweir // inform listeners of new child 326cdf0e10cSrcweir if( m_bChildrenInitialized ) 327cdf0e10cSrcweir { 328cdf0e10cSrcweir Any aEmpty, aNew; 329cdf0e10cSrcweir aNew <<= xChild; 330cdf0e10cSrcweir 331cdf0e10cSrcweir aGuard.clear(); 332cdf0e10cSrcweir // \-- (1st) 333cdf0e10cSrcweir BroadcastAccEvent( AccessibleEventId::CHILD, aNew, aEmpty ); 334cdf0e10cSrcweir } 335cdf0e10cSrcweir // \-- (2nd) 336cdf0e10cSrcweir } 337cdf0e10cSrcweir } 338cdf0e10cSrcweir 339cdf0e10cSrcweir /** in this method we imply that the Reference< XAccessible > elements in the 340cdf0e10cSrcweir vector are AccessibleBase objects ! 341cdf0e10cSrcweir */ 342cdf0e10cSrcweir void AccessibleBase::RemoveChildByOId( const ObjectIdentifier& rOId ) 343cdf0e10cSrcweir { 344cdf0e10cSrcweir // /-- 345cdf0e10cSrcweir ClearableMutexGuard aGuard( GetMutex() ); 346cdf0e10cSrcweir 347cdf0e10cSrcweir ChildOIDMap::iterator aIt( m_aChildOIDMap.find( rOId )); 348cdf0e10cSrcweir if( aIt != m_aChildOIDMap.end()) 349cdf0e10cSrcweir { 350cdf0e10cSrcweir Reference< XAccessible > xChild( aIt->second ); 351cdf0e10cSrcweir 352cdf0e10cSrcweir // remove from map 353cdf0e10cSrcweir m_aChildOIDMap.erase( aIt ); 354cdf0e10cSrcweir 355cdf0e10cSrcweir // search child in vector 356cdf0e10cSrcweir ChildListVectorType::iterator aVecIter = 357cdf0e10cSrcweir ::std::find( m_aChildList.begin(), m_aChildList.end(), xChild ); 358cdf0e10cSrcweir 359cdf0e10cSrcweir OSL_ENSURE( aVecIter != m_aChildList.end(), 360cdf0e10cSrcweir "Inconsistent ChildMap" ); 361cdf0e10cSrcweir 362cdf0e10cSrcweir // remove child from vector 363cdf0e10cSrcweir m_aChildList.erase( aVecIter ); 364cdf0e10cSrcweir bool bInitialized = m_bChildrenInitialized; 365cdf0e10cSrcweir 366cdf0e10cSrcweir // call listeners unguarded 367cdf0e10cSrcweir aGuard.clear(); 368cdf0e10cSrcweir // \-- (1st) 369cdf0e10cSrcweir 370cdf0e10cSrcweir // inform listeners of removed child 371cdf0e10cSrcweir if( bInitialized ) 372cdf0e10cSrcweir { 373cdf0e10cSrcweir Any aEmpty, aOld; 374cdf0e10cSrcweir aOld <<= xChild; 375cdf0e10cSrcweir 376cdf0e10cSrcweir BroadcastAccEvent( AccessibleEventId::CHILD, aEmpty, aOld ); 377cdf0e10cSrcweir } 378cdf0e10cSrcweir 379cdf0e10cSrcweir // dispose the child 380cdf0e10cSrcweir Reference< lang::XComponent > xComp( xChild, UNO_QUERY ); 381cdf0e10cSrcweir if( xComp.is()) 382cdf0e10cSrcweir xComp->dispose(); 383cdf0e10cSrcweir } 384cdf0e10cSrcweir } 385cdf0e10cSrcweir 386cdf0e10cSrcweir awt::Point AccessibleBase::GetUpperLeftOnScreen() const 387cdf0e10cSrcweir { 388cdf0e10cSrcweir awt::Point aResult; 389cdf0e10cSrcweir if( m_aAccInfo.m_pParent ) 390cdf0e10cSrcweir { 391cdf0e10cSrcweir // /-- 392cdf0e10cSrcweir ClearableMutexGuard aGuard( GetMutex() ); 393cdf0e10cSrcweir AccessibleBase * pParent = m_aAccInfo.m_pParent; 394cdf0e10cSrcweir aGuard.clear(); 395cdf0e10cSrcweir // \-- 396cdf0e10cSrcweir 397cdf0e10cSrcweir if( pParent ) 398cdf0e10cSrcweir { 399cdf0e10cSrcweir aResult = pParent->GetUpperLeftOnScreen(); 400cdf0e10cSrcweir } 401cdf0e10cSrcweir else 402cdf0e10cSrcweir OSL_ENSURE( false, "Default position used is probably incorrect." ); 403cdf0e10cSrcweir } 404cdf0e10cSrcweir 405cdf0e10cSrcweir return aResult; 406cdf0e10cSrcweir } 407cdf0e10cSrcweir 408cdf0e10cSrcweir void AccessibleBase::BroadcastAccEvent( 409cdf0e10cSrcweir sal_Int16 nId, 410cdf0e10cSrcweir const Any & rNew, 411cdf0e10cSrcweir const Any & rOld, 412cdf0e10cSrcweir bool bSendGlobally ) const 413cdf0e10cSrcweir { 414cdf0e10cSrcweir // /-- 415cdf0e10cSrcweir ClearableMutexGuard aGuard( GetMutex() ); 416cdf0e10cSrcweir 417cdf0e10cSrcweir if ( !m_nEventNotifierId && !bSendGlobally ) 418cdf0e10cSrcweir return; 419cdf0e10cSrcweir // if we don't have a client id for the notifier, then we don't have listeners, then 420cdf0e10cSrcweir // we don't need to notify anything 421cdf0e10cSrcweir //except SendGlobally for focus handling? 422cdf0e10cSrcweir 423cdf0e10cSrcweir // the const cast is needed, because UNO parameters are never const 424cdf0e10cSrcweir const AccessibleEventObject aEvent( 425cdf0e10cSrcweir const_cast< uno::XWeak * >( static_cast< const uno::XWeak * >( this )), 426cdf0e10cSrcweir nId, rNew, rOld ); 427cdf0e10cSrcweir 428cdf0e10cSrcweir if ( m_nEventNotifierId ) // let the notifier handle this event 429cdf0e10cSrcweir ::comphelper::AccessibleEventNotifier::addEvent( m_nEventNotifierId, aEvent ); 430cdf0e10cSrcweir 431cdf0e10cSrcweir aGuard.clear(); 432cdf0e10cSrcweir // \-- 433cdf0e10cSrcweir 434cdf0e10cSrcweir // send event to global message queue 435cdf0e10cSrcweir if( bSendGlobally ) 436cdf0e10cSrcweir { 437cdf0e10cSrcweir ::vcl::unohelper::NotifyAccessibleStateEventGlobally( aEvent ); 438cdf0e10cSrcweir } 439cdf0e10cSrcweir } 440cdf0e10cSrcweir 441cdf0e10cSrcweir void AccessibleBase::KillAllChildren() 442cdf0e10cSrcweir { 443cdf0e10cSrcweir // /-- 444cdf0e10cSrcweir ClearableMutexGuard aGuard( GetMutex() ); 445cdf0e10cSrcweir 446cdf0e10cSrcweir // make local copy for notification 447cdf0e10cSrcweir ChildListVectorType aLocalChildList( m_aChildList ); 448cdf0e10cSrcweir 449cdf0e10cSrcweir // remove all children 450cdf0e10cSrcweir m_aChildList.clear(); 451cdf0e10cSrcweir m_aChildOIDMap.clear(); 452cdf0e10cSrcweir 453cdf0e10cSrcweir aGuard.clear(); 454cdf0e10cSrcweir // \-- 455cdf0e10cSrcweir 456cdf0e10cSrcweir // call dispose for all children 457cdf0e10cSrcweir // and notify listeners 458cdf0e10cSrcweir Reference< lang::XComponent > xComp; 459cdf0e10cSrcweir Any aEmpty, aOld; 460cdf0e10cSrcweir ChildListVectorType::const_iterator aEndIter = aLocalChildList.end(); 461cdf0e10cSrcweir for( ChildListVectorType::const_iterator aIter = aLocalChildList.begin(); 462cdf0e10cSrcweir aIter != aEndIter; ++aIter ) 463cdf0e10cSrcweir { 464cdf0e10cSrcweir aOld <<= (*aIter); 465cdf0e10cSrcweir BroadcastAccEvent( AccessibleEventId::CHILD, aEmpty, aOld ); 466cdf0e10cSrcweir 467cdf0e10cSrcweir xComp.set( *aIter, UNO_QUERY ); 468cdf0e10cSrcweir if( xComp.is()) 469cdf0e10cSrcweir xComp->dispose(); 470cdf0e10cSrcweir } 471cdf0e10cSrcweir m_bChildrenInitialized = false; 472cdf0e10cSrcweir } 473cdf0e10cSrcweir 474cdf0e10cSrcweir AccessibleElementInfo AccessibleBase::GetInfo() const 475cdf0e10cSrcweir { 476cdf0e10cSrcweir return m_aAccInfo; 477cdf0e10cSrcweir } 478cdf0e10cSrcweir 479cdf0e10cSrcweir void AccessibleBase::SetInfo( const AccessibleElementInfo & rNewInfo ) 480cdf0e10cSrcweir { 481cdf0e10cSrcweir m_aAccInfo = rNewInfo; 482cdf0e10cSrcweir if( m_bMayHaveChildren ) 483cdf0e10cSrcweir { 484cdf0e10cSrcweir KillAllChildren(); 485cdf0e10cSrcweir } 486cdf0e10cSrcweir BroadcastAccEvent( AccessibleEventId::INVALIDATE_ALL_CHILDREN, uno::Any(), uno::Any(), 487cdf0e10cSrcweir true /* global notification */ ); 488cdf0e10cSrcweir } 489cdf0e10cSrcweir 490cdf0e10cSrcweir AccessibleUniqueId AccessibleBase::GetId() const 491cdf0e10cSrcweir { 492cdf0e10cSrcweir return m_aAccInfo.m_aOID; 493cdf0e10cSrcweir } 494cdf0e10cSrcweir 495cdf0e10cSrcweir // ____________________________________ 496cdf0e10cSrcweir // ____________________________________ 497cdf0e10cSrcweir // 498cdf0e10cSrcweir // Interfaces 499cdf0e10cSrcweir // ____________________________________ 500cdf0e10cSrcweir // ____________________________________ 501cdf0e10cSrcweir 502cdf0e10cSrcweir // ________ (XComponent::dispose) ________ 503cdf0e10cSrcweir void SAL_CALL AccessibleBase::disposing() 504cdf0e10cSrcweir { 505cdf0e10cSrcweir // /-- 506cdf0e10cSrcweir ClearableMutexGuard aGuard( GetMutex() ); 507cdf0e10cSrcweir OSL_ENSURE( ! m_bIsDisposed, "dispose() called twice" ); 508cdf0e10cSrcweir 509cdf0e10cSrcweir // notify disposing to all AccessibleEvent listeners asynchron 510cdf0e10cSrcweir if ( m_nEventNotifierId ) 511cdf0e10cSrcweir { 512cdf0e10cSrcweir ::comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( m_nEventNotifierId, *this ); 513cdf0e10cSrcweir m_nEventNotifierId = 0; 514cdf0e10cSrcweir } 515cdf0e10cSrcweir 516cdf0e10cSrcweir // reset pointers 517cdf0e10cSrcweir m_aAccInfo.m_pParent = NULL; 518cdf0e10cSrcweir 519cdf0e10cSrcweir // invalidate implementation for helper, but keep UNO reference to still 520cdf0e10cSrcweir // allow a tool to query the DEFUNC state. 521cdf0e10cSrcweir // Note: The object will be deleted when the last reference is released 522cdf0e10cSrcweir m_pStateSetHelper = NULL; 523cdf0e10cSrcweir 524cdf0e10cSrcweir // attach new empty state set helper to member reference 525cdf0e10cSrcweir ::utl::AccessibleStateSetHelper * pHelper = new ::utl::AccessibleStateSetHelper(); 526cdf0e10cSrcweir pHelper->AddState( AccessibleStateType::DEFUNC ); 527cdf0e10cSrcweir // release old helper and attach new one 528cdf0e10cSrcweir m_aStateSet.set( pHelper ); 529cdf0e10cSrcweir 530cdf0e10cSrcweir m_bIsDisposed = true; 531cdf0e10cSrcweir 532cdf0e10cSrcweir // call listeners unguarded 533cdf0e10cSrcweir aGuard.clear(); 534cdf0e10cSrcweir // \-- 535cdf0e10cSrcweir 536cdf0e10cSrcweir if( m_bMayHaveChildren ) 537cdf0e10cSrcweir { 538cdf0e10cSrcweir KillAllChildren(); 539cdf0e10cSrcweir } 540cdf0e10cSrcweir else 541cdf0e10cSrcweir OSL_ENSURE( m_aChildList.empty(), "Child list should be empty" ); 542cdf0e10cSrcweir } 543cdf0e10cSrcweir 544cdf0e10cSrcweir // ________ XAccessible ________ 545cdf0e10cSrcweir Reference< XAccessibleContext > SAL_CALL AccessibleBase::getAccessibleContext() 546cdf0e10cSrcweir throw (RuntimeException) 547cdf0e10cSrcweir { 548cdf0e10cSrcweir return this; 549cdf0e10cSrcweir } 550cdf0e10cSrcweir 551cdf0e10cSrcweir // ________ AccessibleBase::XAccessibleContext ________ 552cdf0e10cSrcweir sal_Int32 SAL_CALL AccessibleBase::getAccessibleChildCount() 553cdf0e10cSrcweir throw (RuntimeException) 554cdf0e10cSrcweir { 555cdf0e10cSrcweir // /-- 556cdf0e10cSrcweir ClearableMutexGuard aGuard( GetMutex() ); 557cdf0e10cSrcweir if( ! m_bMayHaveChildren || 558cdf0e10cSrcweir m_bIsDisposed ) 559cdf0e10cSrcweir return 0; 560cdf0e10cSrcweir 561cdf0e10cSrcweir bool bMustUpdateChildren = ( m_bMayHaveChildren && 562cdf0e10cSrcweir ! m_bChildrenInitialized ); 563cdf0e10cSrcweir 564cdf0e10cSrcweir aGuard.clear(); 565cdf0e10cSrcweir // \-- 566cdf0e10cSrcweir 567cdf0e10cSrcweir // update unguarded 568cdf0e10cSrcweir if( bMustUpdateChildren ) 569cdf0e10cSrcweir UpdateChildren(); 570cdf0e10cSrcweir 571cdf0e10cSrcweir return ImplGetAccessibleChildCount(); 572cdf0e10cSrcweir } 573cdf0e10cSrcweir 574cdf0e10cSrcweir sal_Int32 AccessibleBase::ImplGetAccessibleChildCount() const 575cdf0e10cSrcweir throw (RuntimeException) 576cdf0e10cSrcweir { 577cdf0e10cSrcweir return m_aChildList.size(); 578cdf0e10cSrcweir } 579cdf0e10cSrcweir 580cdf0e10cSrcweir Reference< XAccessible > SAL_CALL AccessibleBase::getAccessibleChild( sal_Int32 i ) 581cdf0e10cSrcweir throw (lang::IndexOutOfBoundsException, RuntimeException) 582cdf0e10cSrcweir { 583cdf0e10cSrcweir CheckDisposeState(); 584cdf0e10cSrcweir Reference< XAccessible > xResult; 585cdf0e10cSrcweir 586cdf0e10cSrcweir // /-- 587cdf0e10cSrcweir ResettableMutexGuard aGuard( GetMutex() ); 588cdf0e10cSrcweir bool bMustUpdateChildren = ( m_bMayHaveChildren && 589cdf0e10cSrcweir ! m_bChildrenInitialized ); 590cdf0e10cSrcweir 591cdf0e10cSrcweir aGuard.clear(); 592cdf0e10cSrcweir // \-- 593cdf0e10cSrcweir 594cdf0e10cSrcweir if( bMustUpdateChildren ) 595cdf0e10cSrcweir UpdateChildren(); 596cdf0e10cSrcweir 597cdf0e10cSrcweir xResult.set( ImplGetAccessibleChildById( i )); 598cdf0e10cSrcweir 599cdf0e10cSrcweir return xResult; 600cdf0e10cSrcweir // \-- 601cdf0e10cSrcweir } 602cdf0e10cSrcweir 603cdf0e10cSrcweir Reference< XAccessible > AccessibleBase::ImplGetAccessibleChildById( sal_Int32 i ) const 604cdf0e10cSrcweir throw (lang::IndexOutOfBoundsException, RuntimeException) 605cdf0e10cSrcweir { 606cdf0e10cSrcweir Reference< XAccessible > xResult; 607cdf0e10cSrcweir // /-- 608cdf0e10cSrcweir MutexGuard aGuard( GetMutex()); 609cdf0e10cSrcweir if( ! m_bMayHaveChildren || 610cdf0e10cSrcweir i < 0 || 611cdf0e10cSrcweir static_cast< ChildListVectorType::size_type >( i ) >= m_aChildList.size() ) 612cdf0e10cSrcweir { 613cdf0e10cSrcweir OUStringBuffer aBuf; 614cdf0e10cSrcweir aBuf.appendAscii( RTL_CONSTASCII_STRINGPARAM( "Index " )); 615cdf0e10cSrcweir aBuf.append( i ); 616cdf0e10cSrcweir aBuf.appendAscii( RTL_CONSTASCII_STRINGPARAM( " is invalid for range [ 0, " )); 617cdf0e10cSrcweir aBuf.append( static_cast< sal_Int32 >( m_aChildList.size() - 1 ) ); 618cdf0e10cSrcweir aBuf.appendAscii( RTL_CONSTASCII_STRINGPARAM( " ]" ) ); 619cdf0e10cSrcweir lang::IndexOutOfBoundsException aEx( aBuf.makeStringAndClear(), 620cdf0e10cSrcweir const_cast< ::cppu::OWeakObject * >( 621cdf0e10cSrcweir static_cast< const ::cppu::OWeakObject * >( this ))); 622cdf0e10cSrcweir throw aEx; 623cdf0e10cSrcweir } 624cdf0e10cSrcweir else 625cdf0e10cSrcweir xResult.set( m_aChildList[ i ] ); 626cdf0e10cSrcweir 627cdf0e10cSrcweir return xResult; 628cdf0e10cSrcweir } 629cdf0e10cSrcweir 630cdf0e10cSrcweir Reference< XAccessible > SAL_CALL AccessibleBase::getAccessibleParent() 631cdf0e10cSrcweir throw (RuntimeException) 632cdf0e10cSrcweir { 633cdf0e10cSrcweir CheckDisposeState(); 634cdf0e10cSrcweir Reference< XAccessible > aResult; 635cdf0e10cSrcweir if( m_aAccInfo.m_pParent ) 636cdf0e10cSrcweir aResult.set( m_aAccInfo.m_pParent ); 637cdf0e10cSrcweir 638cdf0e10cSrcweir return aResult; 639cdf0e10cSrcweir } 640cdf0e10cSrcweir 641cdf0e10cSrcweir sal_Int32 SAL_CALL AccessibleBase::getAccessibleIndexInParent() 642cdf0e10cSrcweir throw (RuntimeException) 643cdf0e10cSrcweir { 644cdf0e10cSrcweir CheckDisposeState(); 645cdf0e10cSrcweir 646cdf0e10cSrcweir if( m_aAccInfo.m_spObjectHierarchy ) 647cdf0e10cSrcweir return m_aAccInfo.m_spObjectHierarchy->getIndexInParent( GetId() ); 648cdf0e10cSrcweir return -1; 649cdf0e10cSrcweir } 650cdf0e10cSrcweir 651cdf0e10cSrcweir sal_Int16 SAL_CALL AccessibleBase::getAccessibleRole() 652cdf0e10cSrcweir throw (RuntimeException) 653cdf0e10cSrcweir { 654cdf0e10cSrcweir return AccessibleRole::LIST_ITEM; // #i73747# role SHAPE seems more appropriate, but is not read 655cdf0e10cSrcweir } 656cdf0e10cSrcweir 657cdf0e10cSrcweir Reference< XAccessibleRelationSet > SAL_CALL AccessibleBase::getAccessibleRelationSet() 658cdf0e10cSrcweir throw (RuntimeException) 659cdf0e10cSrcweir { 660cdf0e10cSrcweir Reference< XAccessibleRelationSet > aResult; 661cdf0e10cSrcweir return aResult; 662cdf0e10cSrcweir } 663cdf0e10cSrcweir 664cdf0e10cSrcweir Reference< XAccessibleStateSet > SAL_CALL AccessibleBase::getAccessibleStateSet() 665cdf0e10cSrcweir throw (RuntimeException) 666cdf0e10cSrcweir { 667cdf0e10cSrcweir if( ! m_bStateSetInitialized ) 668cdf0e10cSrcweir { 669cdf0e10cSrcweir Reference< view::XSelectionSupplier > xSelSupp( GetInfo().m_xSelectionSupplier ); 670cdf0e10cSrcweir if ( xSelSupp.is() ) 671cdf0e10cSrcweir { 672cdf0e10cSrcweir ObjectIdentifier aOID( xSelSupp->getSelection() ); 673cdf0e10cSrcweir if ( aOID.isValid() && GetId() == aOID ) 674cdf0e10cSrcweir { 675cdf0e10cSrcweir AddState( AccessibleStateType::SELECTED ); 676cdf0e10cSrcweir AddState( AccessibleStateType::FOCUSED ); 677cdf0e10cSrcweir } 678cdf0e10cSrcweir } 679cdf0e10cSrcweir m_bStateSetInitialized = true; 680cdf0e10cSrcweir } 681cdf0e10cSrcweir 682cdf0e10cSrcweir return m_aStateSet; 683cdf0e10cSrcweir } 684cdf0e10cSrcweir 685cdf0e10cSrcweir 686cdf0e10cSrcweir lang::Locale SAL_CALL AccessibleBase::getLocale() 687cdf0e10cSrcweir throw (IllegalAccessibleComponentStateException, RuntimeException) 688cdf0e10cSrcweir { 689cdf0e10cSrcweir CheckDisposeState(); 690cdf0e10cSrcweir 691cdf0e10cSrcweir return Application::GetSettings().GetLocale(); 692cdf0e10cSrcweir } 693cdf0e10cSrcweir 694cdf0e10cSrcweir // ________ AccessibleBase::XAccessibleComponent ________ 695cdf0e10cSrcweir sal_Bool SAL_CALL AccessibleBase::containsPoint( const awt::Point& aPoint ) 696cdf0e10cSrcweir throw (RuntimeException) 697cdf0e10cSrcweir { 698cdf0e10cSrcweir awt::Rectangle aRect( getBounds() ); 699cdf0e10cSrcweir 700cdf0e10cSrcweir // contains() works with relative coordinates 701cdf0e10cSrcweir aRect.X = 0; 702cdf0e10cSrcweir aRect.Y = 0; 703cdf0e10cSrcweir 704cdf0e10cSrcweir return ( aPoint.X >= aRect.X && 705cdf0e10cSrcweir aPoint.Y >= aRect.Y && 706cdf0e10cSrcweir aPoint.X < (aRect.X + aRect.Width) && 707cdf0e10cSrcweir aPoint.Y < (aRect.Y + aRect.Height) ); 708cdf0e10cSrcweir } 709cdf0e10cSrcweir 710cdf0e10cSrcweir Reference< XAccessible > SAL_CALL AccessibleBase::getAccessibleAtPoint( const awt::Point& aPoint ) 711cdf0e10cSrcweir throw (RuntimeException) 712cdf0e10cSrcweir { 713cdf0e10cSrcweir CheckDisposeState(); 714cdf0e10cSrcweir Reference< XAccessible > aResult; 715cdf0e10cSrcweir awt::Rectangle aRect( getBounds()); 716cdf0e10cSrcweir 717cdf0e10cSrcweir // children are positioned relative to this object, so translate bound rect 718cdf0e10cSrcweir aRect.X = 0; 719cdf0e10cSrcweir aRect.Y = 0; 720cdf0e10cSrcweir 721cdf0e10cSrcweir // children must be inside the own bound rect 722cdf0e10cSrcweir if( ( aRect.X <= aPoint.X && aPoint.X <= (aRect.X + aRect.Width) ) && 723cdf0e10cSrcweir ( aRect.Y <= aPoint.Y && aPoint.Y <= (aRect.Y + aRect.Height))) 724cdf0e10cSrcweir { 725cdf0e10cSrcweir // /-- 726cdf0e10cSrcweir ClearableMutexGuard aGuard( GetMutex() ); 727cdf0e10cSrcweir ChildListVectorType aLocalChildList( m_aChildList ); 728cdf0e10cSrcweir aGuard.clear(); 729cdf0e10cSrcweir // \-- 730cdf0e10cSrcweir 731cdf0e10cSrcweir Reference< XAccessibleComponent > aComp; 732cdf0e10cSrcweir for( ChildListVectorType::const_iterator aIter = aLocalChildList.begin(); 733cdf0e10cSrcweir aIter != aLocalChildList.end(); ++aIter ) 734cdf0e10cSrcweir { 735cdf0e10cSrcweir aComp.set( *aIter, UNO_QUERY ); 736cdf0e10cSrcweir if( aComp.is()) 737cdf0e10cSrcweir { 738cdf0e10cSrcweir aRect = aComp->getBounds(); 739cdf0e10cSrcweir if( ( aRect.X <= aPoint.X && aPoint.X <= (aRect.X + aRect.Width) ) && 740cdf0e10cSrcweir ( aRect.Y <= aPoint.Y && aPoint.Y <= (aRect.Y + aRect.Height))) 741cdf0e10cSrcweir { 742cdf0e10cSrcweir aResult = (*aIter); 743cdf0e10cSrcweir break; 744cdf0e10cSrcweir } 745cdf0e10cSrcweir } 746cdf0e10cSrcweir } 747cdf0e10cSrcweir } 748cdf0e10cSrcweir 749cdf0e10cSrcweir return aResult; 750cdf0e10cSrcweir } 751cdf0e10cSrcweir 752cdf0e10cSrcweir awt::Rectangle SAL_CALL AccessibleBase::getBounds() 753cdf0e10cSrcweir throw (RuntimeException) 754cdf0e10cSrcweir { 755cdf0e10cSrcweir ExplicitValueProvider *pExplicitValueProvider( 756cdf0e10cSrcweir ExplicitValueProvider::getExplicitValueProvider( m_aAccInfo.m_xView )); 757cdf0e10cSrcweir if( pExplicitValueProvider ) 758cdf0e10cSrcweir { 759cdf0e10cSrcweir Window* pWindow( VCLUnoHelper::GetWindow( m_aAccInfo.m_xWindow )); 760cdf0e10cSrcweir awt::Rectangle aLogicRect( pExplicitValueProvider->getRectangleOfObject( m_aAccInfo.m_aOID.getObjectCID() )); 761cdf0e10cSrcweir if( pWindow ) 762cdf0e10cSrcweir { 763cdf0e10cSrcweir Rectangle aRect( aLogicRect.X, aLogicRect.Y, 764cdf0e10cSrcweir aLogicRect.X + aLogicRect.Width, 765cdf0e10cSrcweir aLogicRect.Y + aLogicRect.Height ); 766cdf0e10cSrcweir // /-- solar 767cdf0e10cSrcweir ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); 768cdf0e10cSrcweir aRect = pWindow->LogicToPixel( aRect ); 769cdf0e10cSrcweir 770cdf0e10cSrcweir // aLogicRect ist relative to the page, but we need a value relative 771cdf0e10cSrcweir // to the parent object 772cdf0e10cSrcweir awt::Point aParentLocOnScreen; 773cdf0e10cSrcweir uno::Reference< XAccessibleComponent > xParent( getAccessibleParent(), uno::UNO_QUERY ); 774cdf0e10cSrcweir if( xParent.is() ) 775cdf0e10cSrcweir aParentLocOnScreen = xParent->getLocationOnScreen(); 776cdf0e10cSrcweir 777cdf0e10cSrcweir // aOffset = aParentLocOnScreen - GetUpperLeftOnScreen() 778cdf0e10cSrcweir awt::Point aULOnScreen = GetUpperLeftOnScreen(); 779cdf0e10cSrcweir awt::Point aOffset( aParentLocOnScreen.X - aULOnScreen.X, 780cdf0e10cSrcweir aParentLocOnScreen.Y - aULOnScreen.Y ); 781cdf0e10cSrcweir 782cdf0e10cSrcweir return awt::Rectangle( aRect.getX() - aOffset.X, aRect.getY() - aOffset.Y, 783cdf0e10cSrcweir aRect.getWidth(), aRect.getHeight()); 784cdf0e10cSrcweir // \-- solar 785cdf0e10cSrcweir } 786cdf0e10cSrcweir } 787cdf0e10cSrcweir 788cdf0e10cSrcweir return awt::Rectangle(); 789cdf0e10cSrcweir } 790cdf0e10cSrcweir 791cdf0e10cSrcweir awt::Point SAL_CALL AccessibleBase::getLocation() 792cdf0e10cSrcweir throw (RuntimeException) 793cdf0e10cSrcweir { 794cdf0e10cSrcweir CheckDisposeState(); 795cdf0e10cSrcweir awt::Rectangle aBBox( getBounds() ); 796cdf0e10cSrcweir return awt::Point( aBBox.X, aBBox.Y ); 797cdf0e10cSrcweir } 798cdf0e10cSrcweir 799cdf0e10cSrcweir awt::Point SAL_CALL AccessibleBase::getLocationOnScreen() 800cdf0e10cSrcweir throw (RuntimeException) 801cdf0e10cSrcweir { 802cdf0e10cSrcweir CheckDisposeState(); 803cdf0e10cSrcweir 804cdf0e10cSrcweir if( m_aAccInfo.m_pParent != NULL ) 805cdf0e10cSrcweir { 806cdf0e10cSrcweir AccessibleBase * pParent = m_aAccInfo.m_pParent; 807cdf0e10cSrcweir awt::Point aLocThisRel( getLocation()); 808cdf0e10cSrcweir awt::Point aUpperLeft; 809cdf0e10cSrcweir 810cdf0e10cSrcweir if( pParent != NULL ) 811cdf0e10cSrcweir aUpperLeft = pParent->getLocationOnScreen(); 812cdf0e10cSrcweir 813cdf0e10cSrcweir return awt::Point( aUpperLeft.X + aLocThisRel.X, 814cdf0e10cSrcweir aUpperLeft.Y + aLocThisRel.Y ); 815cdf0e10cSrcweir } 816cdf0e10cSrcweir else 817cdf0e10cSrcweir return getLocation(); 818cdf0e10cSrcweir } 819cdf0e10cSrcweir 820cdf0e10cSrcweir awt::Size SAL_CALL AccessibleBase::getSize() 821cdf0e10cSrcweir throw (RuntimeException) 822cdf0e10cSrcweir { 823cdf0e10cSrcweir CheckDisposeState(); 824cdf0e10cSrcweir awt::Rectangle aBBox( getBounds() ); 825cdf0e10cSrcweir return awt::Size( aBBox.Width, aBBox.Height ); 826cdf0e10cSrcweir } 827cdf0e10cSrcweir 828cdf0e10cSrcweir void SAL_CALL AccessibleBase::grabFocus() 829cdf0e10cSrcweir throw (RuntimeException) 830cdf0e10cSrcweir { 831cdf0e10cSrcweir CheckDisposeState(); 832cdf0e10cSrcweir 833cdf0e10cSrcweir Reference< view::XSelectionSupplier > xSelSupp( GetInfo().m_xSelectionSupplier ); 834cdf0e10cSrcweir if ( xSelSupp.is() ) 835cdf0e10cSrcweir { 836cdf0e10cSrcweir xSelSupp->select( GetId().getAny() ); 837cdf0e10cSrcweir } 838cdf0e10cSrcweir } 839cdf0e10cSrcweir 840cdf0e10cSrcweir sal_Int32 SAL_CALL AccessibleBase::getForeground() 841cdf0e10cSrcweir throw (RuntimeException) 842cdf0e10cSrcweir { 843cdf0e10cSrcweir return getColor( ACC_BASE_FOREGROUND ); 844cdf0e10cSrcweir } 845cdf0e10cSrcweir 846cdf0e10cSrcweir sal_Int32 SAL_CALL AccessibleBase::getBackground() 847cdf0e10cSrcweir throw (RuntimeException) 848cdf0e10cSrcweir { 849cdf0e10cSrcweir return getColor( ACC_BASE_BACKGROUND ); 850cdf0e10cSrcweir } 851cdf0e10cSrcweir 852cdf0e10cSrcweir sal_Int32 AccessibleBase::getColor( eColorType eColType ) 853cdf0e10cSrcweir { 854cdf0e10cSrcweir sal_Int32 nResult = static_cast< sal_Int32 >( Color( COL_TRANSPARENT ).GetColor()); 855cdf0e10cSrcweir if( m_bAlwaysTransparent ) 856cdf0e10cSrcweir return nResult; 857cdf0e10cSrcweir 858cdf0e10cSrcweir ObjectIdentifier aOID( m_aAccInfo.m_aOID ); 859cdf0e10cSrcweir ObjectType eType( aOID.getObjectType() ); 860cdf0e10cSrcweir Reference< beans::XPropertySet > xObjProp; 861cdf0e10cSrcweir OUString aObjectCID = aOID.getObjectCID(); 862cdf0e10cSrcweir if( eType == OBJECTTYPE_LEGEND_ENTRY ) 863cdf0e10cSrcweir { 864cdf0e10cSrcweir // for colors get the data series/point properties 865cdf0e10cSrcweir OUString aParentParticle( ObjectIdentifier::getFullParentParticle( aObjectCID )); 866cdf0e10cSrcweir aObjectCID = ObjectIdentifier::createClassifiedIdentifierForParticle( aParentParticle ); 867cdf0e10cSrcweir } 868cdf0e10cSrcweir 869cdf0e10cSrcweir xObjProp.set( 870cdf0e10cSrcweir ObjectIdentifier::getObjectPropertySet( 871cdf0e10cSrcweir aObjectCID, Reference< chart2::XChartDocument >( m_aAccInfo.m_xChartDocument )), uno::UNO_QUERY ); 872cdf0e10cSrcweir if( xObjProp.is()) 873cdf0e10cSrcweir { 874cdf0e10cSrcweir try 875cdf0e10cSrcweir { 876cdf0e10cSrcweir OUString aPropName; 877cdf0e10cSrcweir OUString aStylePropName; 878cdf0e10cSrcweir 879cdf0e10cSrcweir switch( eType ) 880cdf0e10cSrcweir { 881cdf0e10cSrcweir case OBJECTTYPE_LEGEND_ENTRY: 882cdf0e10cSrcweir case OBJECTTYPE_DATA_SERIES: 883cdf0e10cSrcweir case OBJECTTYPE_DATA_POINT: 884cdf0e10cSrcweir if( eColType == ACC_BASE_FOREGROUND ) 885cdf0e10cSrcweir { 886cdf0e10cSrcweir aPropName = C2U("BorderColor"); 887cdf0e10cSrcweir aStylePropName = C2U("BorderTransparency"); 888cdf0e10cSrcweir } 889cdf0e10cSrcweir else 890cdf0e10cSrcweir { 891cdf0e10cSrcweir aPropName = C2U("Color"); 892cdf0e10cSrcweir aStylePropName = C2U("Transparency"); 893cdf0e10cSrcweir } 894cdf0e10cSrcweir break; 895cdf0e10cSrcweir default: 896cdf0e10cSrcweir if( eColType == ACC_BASE_FOREGROUND ) 897cdf0e10cSrcweir { 898cdf0e10cSrcweir aPropName = C2U("LineColor"); 899cdf0e10cSrcweir aStylePropName = C2U("LineTransparence"); 900cdf0e10cSrcweir } 901cdf0e10cSrcweir else 902cdf0e10cSrcweir { 903cdf0e10cSrcweir aPropName = C2U("FillColor"); 904cdf0e10cSrcweir aStylePropName = C2U("FillTransparence"); 905cdf0e10cSrcweir } 906cdf0e10cSrcweir break; 907cdf0e10cSrcweir } 908cdf0e10cSrcweir 909cdf0e10cSrcweir bool bTransparent = m_bAlwaysTransparent; 910cdf0e10cSrcweir Reference< beans::XPropertySetInfo > xInfo( xObjProp->getPropertySetInfo(), uno::UNO_QUERY ); 911cdf0e10cSrcweir if( xInfo.is() && 912cdf0e10cSrcweir xInfo->hasPropertyByName( aStylePropName )) 913cdf0e10cSrcweir { 914cdf0e10cSrcweir if( eColType == ACC_BASE_FOREGROUND ) 915cdf0e10cSrcweir { 916cdf0e10cSrcweir drawing::LineStyle aLStyle; 917cdf0e10cSrcweir if( xObjProp->getPropertyValue( aStylePropName ) >>= aLStyle ) 918cdf0e10cSrcweir bTransparent = (aLStyle == drawing::LineStyle_NONE); 919cdf0e10cSrcweir } 920cdf0e10cSrcweir else 921cdf0e10cSrcweir { 922cdf0e10cSrcweir drawing::FillStyle aFStyle; 923cdf0e10cSrcweir if( xObjProp->getPropertyValue( aStylePropName ) >>= aFStyle ) 924cdf0e10cSrcweir bTransparent = (aFStyle == drawing::FillStyle_NONE); 925cdf0e10cSrcweir } 926cdf0e10cSrcweir } 927cdf0e10cSrcweir 928cdf0e10cSrcweir if( !bTransparent && 929cdf0e10cSrcweir xInfo.is() && 930cdf0e10cSrcweir xInfo->hasPropertyByName( aPropName )) 931cdf0e10cSrcweir { 932cdf0e10cSrcweir xObjProp->getPropertyValue( aPropName ) >>= nResult; 933cdf0e10cSrcweir } 934cdf0e10cSrcweir } 935cdf0e10cSrcweir catch( const uno::Exception & ex ) 936cdf0e10cSrcweir { 937cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 938cdf0e10cSrcweir } 939cdf0e10cSrcweir } 940cdf0e10cSrcweir 941cdf0e10cSrcweir return nResult; 942cdf0e10cSrcweir } 943cdf0e10cSrcweir 944cdf0e10cSrcweir // ________ AccessibleBase::XServiceInfo ________ 945cdf0e10cSrcweir OUString SAL_CALL AccessibleBase::getImplementationName() 946cdf0e10cSrcweir throw (RuntimeException) 947cdf0e10cSrcweir { 948cdf0e10cSrcweir return OUString( RTL_CONSTASCII_USTRINGPARAM( "AccessibleBase" )); 949cdf0e10cSrcweir } 950cdf0e10cSrcweir 951cdf0e10cSrcweir sal_Bool SAL_CALL AccessibleBase::supportsService( const OUString& ServiceName ) 952cdf0e10cSrcweir throw (RuntimeException) 953cdf0e10cSrcweir { 954cdf0e10cSrcweir return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() ); 955cdf0e10cSrcweir } 956cdf0e10cSrcweir 957cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL AccessibleBase::getSupportedServiceNames() 958cdf0e10cSrcweir throw (RuntimeException) 959cdf0e10cSrcweir { 960cdf0e10cSrcweir uno::Sequence< ::rtl::OUString > aSeq( 2 ); 961cdf0e10cSrcweir ::rtl::OUString* pStr = aSeq.getArray(); 962cdf0e10cSrcweir pStr[ 0 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.accessibility.Accessible" )); 963cdf0e10cSrcweir pStr[ 1 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.accessibility.AccessibleContext" )); 964cdf0e10cSrcweir 965cdf0e10cSrcweir return aSeq; 966cdf0e10cSrcweir } 967cdf0e10cSrcweir 968cdf0e10cSrcweir // ________ AccessibleBase::XEventListener ________ 969cdf0e10cSrcweir void SAL_CALL AccessibleBase::disposing( const lang::EventObject& /*Source*/ ) 970cdf0e10cSrcweir throw (RuntimeException) 971cdf0e10cSrcweir { 972cdf0e10cSrcweir } 973cdf0e10cSrcweir 974cdf0e10cSrcweir // ________ XAccessibleEventBroadcasters ________ 975cdf0e10cSrcweir void SAL_CALL AccessibleBase::addEventListener( const Reference< XAccessibleEventListener >& xListener ) 976cdf0e10cSrcweir throw (RuntimeException) 977cdf0e10cSrcweir { 978cdf0e10cSrcweir MutexGuard aGuard( GetMutex() ); 979cdf0e10cSrcweir 980cdf0e10cSrcweir if ( xListener.is() ) 981cdf0e10cSrcweir { 982cdf0e10cSrcweir if ( !m_nEventNotifierId ) 983cdf0e10cSrcweir m_nEventNotifierId = ::comphelper::AccessibleEventNotifier::registerClient(); 984cdf0e10cSrcweir 985cdf0e10cSrcweir ::comphelper::AccessibleEventNotifier::addEventListener( m_nEventNotifierId, xListener ); 986cdf0e10cSrcweir } 987cdf0e10cSrcweir } 988cdf0e10cSrcweir 989cdf0e10cSrcweir void SAL_CALL AccessibleBase::removeEventListener( const Reference< XAccessibleEventListener >& xListener ) 990cdf0e10cSrcweir throw (RuntimeException) 991cdf0e10cSrcweir { 992cdf0e10cSrcweir MutexGuard aGuard( GetMutex() ); 993cdf0e10cSrcweir 994cdf0e10cSrcweir if ( xListener.is() ) 995cdf0e10cSrcweir { 996cdf0e10cSrcweir sal_Int32 nListenerCount = ::comphelper::AccessibleEventNotifier::removeEventListener( m_nEventNotifierId, xListener ); 997cdf0e10cSrcweir if ( !nListenerCount ) 998cdf0e10cSrcweir { 999cdf0e10cSrcweir // no listeners anymore 1000cdf0e10cSrcweir ::comphelper::AccessibleEventNotifier::revokeClient( m_nEventNotifierId ); 1001cdf0e10cSrcweir m_nEventNotifierId = 0; 1002cdf0e10cSrcweir } 1003cdf0e10cSrcweir } 1004cdf0e10cSrcweir } 1005cdf0e10cSrcweir 1006cdf0e10cSrcweir } // namespace chart 1007