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 #include "AccessibleDataPilotControl.hxx" 27cdf0e10cSrcweir #include "unoguard.hxx" 28cdf0e10cSrcweir #include "fieldwnd.hxx" 29cdf0e10cSrcweir 30cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleRole.hpp> 31cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleStateType.hpp> 32cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp> 33cdf0e10cSrcweir 340deba7fbSSteve Yin #include <com/sun/star/accessibility/XAccessibleAction.hpp> 350deba7fbSSteve Yin #include <comphelper/accessiblekeybindinghelper.hxx> 360deba7fbSSteve Yin #include <com/sun/star/awt/KeyModifier.hpp> 370deba7fbSSteve Yin #include <vcl/keycodes.hxx> 380deba7fbSSteve Yin #ifndef _UTL_ACCESSIBLESTATESETHELPER_HXX 39cdf0e10cSrcweir #include <unotools/accessiblestatesethelper.hxx> 400deba7fbSSteve Yin #endif 41cdf0e10cSrcweir #include <rtl/uuid.h> 42cdf0e10cSrcweir #include <tools/gen.hxx> 43cdf0e10cSrcweir #include <toolkit/helper/convert.hxx> 44cdf0e10cSrcweir #include <tools/debug.hxx> 45cdf0e10cSrcweir 460deba7fbSSteve Yin #include <com/sun/star/accessibility/AccessibleRelationType.hpp> 470deba7fbSSteve Yin #include <unotools/accessiblerelationsethelper.hxx> 48cdf0e10cSrcweir using namespace ::com::sun::star; 49cdf0e10cSrcweir using namespace ::com::sun::star::accessibility; 50cdf0e10cSrcweir 51cdf0e10cSrcweir class ScAccessibleDataPilotButton 52cdf0e10cSrcweir : public ScAccessibleContextBase 530deba7fbSSteve Yin , public ::com::sun::star::accessibility::XAccessibleAction 54cdf0e10cSrcweir { 55cdf0e10cSrcweir public: 56cdf0e10cSrcweir //===== internal ======================================================== 57cdf0e10cSrcweir ScAccessibleDataPilotButton( 58cdf0e10cSrcweir const ::com::sun::star::uno::Reference< 59cdf0e10cSrcweir ::com::sun::star::accessibility::XAccessible>& rxParent, 60cdf0e10cSrcweir ScPivotFieldWindow* pFieldWindow, 61cdf0e10cSrcweir sal_Int32 nIndex); 62cdf0e10cSrcweir 63cdf0e10cSrcweir virtual void Init(); 64cdf0e10cSrcweir 65cdf0e10cSrcweir using ScAccessibleContextBase::disposing; 66cdf0e10cSrcweir virtual void SAL_CALL disposing(); 67cdf0e10cSrcweir 68cdf0e10cSrcweir void SetIndex(sal_Int32 nIndex) { mnIndex = nIndex; } 69cdf0e10cSrcweir void NameChanged(); 70cdf0e10cSrcweir void SetFocused(); 71cdf0e10cSrcweir void ResetFocused(); 72cdf0e10cSrcweir protected: 73cdf0e10cSrcweir virtual ~ScAccessibleDataPilotButton(void); 74cdf0e10cSrcweir public: 750deba7fbSSteve Yin // XAccessibleAction 760deba7fbSSteve Yin virtual sal_Int32 SAL_CALL getAccessibleActionCount( ) throw (::com::sun::star::uno::RuntimeException); 770deba7fbSSteve Yin virtual sal_Bool SAL_CALL doAccessibleAction ( sal_Int32 nIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 780deba7fbSSteve Yin virtual ::rtl::OUString SAL_CALL getAccessibleActionDescription ( sal_Int32 nIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 790deba7fbSSteve Yin virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleKeyBinding > SAL_CALL getAccessibleActionKeyBinding( sal_Int32 nIndex ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 800deba7fbSSteve Yin ///===== XInterface ===================================================== 810deba7fbSSteve Yin virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( 820deba7fbSSteve Yin ::com::sun::star::uno::Type const & rType ) 830deba7fbSSteve Yin throw (::com::sun::star::uno::RuntimeException); 840deba7fbSSteve Yin virtual void SAL_CALL acquire() throw (); 850deba7fbSSteve Yin virtual void SAL_CALL release() throw (); 86cdf0e10cSrcweir ///===== XAccessibleComponent ============================================ 87cdf0e10cSrcweir 88cdf0e10cSrcweir virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > 89cdf0e10cSrcweir SAL_CALL getAccessibleAtPoint( 90cdf0e10cSrcweir const ::com::sun::star::awt::Point& rPoint ) 91cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException); 92cdf0e10cSrcweir 93cdf0e10cSrcweir virtual sal_Bool SAL_CALL isVisible( ) 94cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException); 95cdf0e10cSrcweir 96cdf0e10cSrcweir virtual void SAL_CALL grabFocus( ) 97cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException); 98cdf0e10cSrcweir 99cdf0e10cSrcweir virtual sal_Int32 SAL_CALL getForeground( ) 100cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException); 101cdf0e10cSrcweir 102cdf0e10cSrcweir virtual sal_Int32 SAL_CALL getBackground( ) 103cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException); 104cdf0e10cSrcweir 105cdf0e10cSrcweir ///===== XAccessibleContext ============================================== 106cdf0e10cSrcweir 107cdf0e10cSrcweir /// Return the number of currently visible children. 108cdf0e10cSrcweir virtual sal_Int32 SAL_CALL 109cdf0e10cSrcweir getAccessibleChildCount(void) throw (::com::sun::star::uno::RuntimeException); 110cdf0e10cSrcweir 111cdf0e10cSrcweir /// Return the specified child or NULL if index is invalid. 112cdf0e10cSrcweir virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible> SAL_CALL 113cdf0e10cSrcweir getAccessibleChild(sal_Int32 nIndex) 114cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException, 115cdf0e10cSrcweir ::com::sun::star::lang::IndexOutOfBoundsException); 116cdf0e10cSrcweir 117cdf0e10cSrcweir /// Return this objects index among the parents children. 118cdf0e10cSrcweir virtual sal_Int32 SAL_CALL 119cdf0e10cSrcweir getAccessibleIndexInParent(void) 120cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException); 121cdf0e10cSrcweir 122cdf0e10cSrcweir /// Return the set of current states. 123cdf0e10cSrcweir virtual ::com::sun::star::uno::Reference< 124cdf0e10cSrcweir ::com::sun::star::accessibility::XAccessibleStateSet> SAL_CALL 125cdf0e10cSrcweir getAccessibleStateSet(void) 126cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException); 1270deba7fbSSteve Yin ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleRelationSet > 1280deba7fbSSteve Yin SAL_CALL getAccessibleRelationSet( ) throw (::com::sun::star::uno::RuntimeException); 129cdf0e10cSrcweir ///===== XServiceInfo ==================================================== 130cdf0e10cSrcweir 131cdf0e10cSrcweir /** Returns an identifier for the implementation of this object. 132cdf0e10cSrcweir */ 133cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL 134cdf0e10cSrcweir getImplementationName(void) 135cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException); 136cdf0e10cSrcweir 137cdf0e10cSrcweir ///===== XTypeProvider =================================================== 138cdf0e10cSrcweir 139cdf0e10cSrcweir /** Returns a implementation id. 140cdf0e10cSrcweir */ 141cdf0e10cSrcweir virtual ::com::sun::star::uno::Sequence<sal_Int8> SAL_CALL 142cdf0e10cSrcweir getImplementationId(void) 143cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException); 144cdf0e10cSrcweir 145cdf0e10cSrcweir protected: 146cdf0e10cSrcweir /// Return this object's description. 147cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL 148cdf0e10cSrcweir createAccessibleDescription(void) 149cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException); 150cdf0e10cSrcweir 151cdf0e10cSrcweir /// Return the object's current name. 152cdf0e10cSrcweir virtual ::rtl::OUString SAL_CALL 153cdf0e10cSrcweir createAccessibleName(void) 154cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException); 155cdf0e10cSrcweir 156cdf0e10cSrcweir /// Return the object's current bounding box relative to the desktop. 157cdf0e10cSrcweir virtual Rectangle GetBoundingBoxOnScreen(void) const 158cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException); 159cdf0e10cSrcweir 160cdf0e10cSrcweir /// Return the object's current bounding box relative to the parent object. 161cdf0e10cSrcweir virtual Rectangle GetBoundingBox(void) const 162cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException); 163cdf0e10cSrcweir 164cdf0e10cSrcweir private: 165cdf0e10cSrcweir ScPivotFieldWindow* mpFieldWindow; 166cdf0e10cSrcweir sal_Int32 mnIndex; 167cdf0e10cSrcweir }; 168cdf0e10cSrcweir 169cdf0e10cSrcweir //===== internal ======================================================== 170cdf0e10cSrcweir ScAccessibleDataPilotControl::ScAccessibleDataPilotControl( 171cdf0e10cSrcweir const uno::Reference<XAccessible>& rxParent, 172cdf0e10cSrcweir ScPivotFieldWindow* pFieldWindow) 173cdf0e10cSrcweir : 174cdf0e10cSrcweir ScAccessibleContextBase(rxParent, AccessibleRole::GROUP_BOX), 175cdf0e10cSrcweir mpFieldWindow(pFieldWindow) 176cdf0e10cSrcweir { 177cdf0e10cSrcweir if (mpFieldWindow) 178cdf0e10cSrcweir maChildren.resize(mpFieldWindow->GetFieldCount()); 179cdf0e10cSrcweir } 180cdf0e10cSrcweir 181cdf0e10cSrcweir ScAccessibleDataPilotControl::~ScAccessibleDataPilotControl(void) 182cdf0e10cSrcweir { 183cdf0e10cSrcweir if (!IsDefunc() && !rBHelper.bInDispose) 184cdf0e10cSrcweir { 185cdf0e10cSrcweir // increment refcount to prevent double call off dtor 186cdf0e10cSrcweir osl_incrementInterlockedCount( &m_refCount ); 187*86e1cf34SPedro Giffuni // call dispose to inform object which have a weak reference to this object 188cdf0e10cSrcweir dispose(); 189cdf0e10cSrcweir } 190cdf0e10cSrcweir } 191cdf0e10cSrcweir 192cdf0e10cSrcweir void ScAccessibleDataPilotControl::Init() 193cdf0e10cSrcweir { 194cdf0e10cSrcweir } 195cdf0e10cSrcweir 196cdf0e10cSrcweir void SAL_CALL ScAccessibleDataPilotControl::disposing() 197cdf0e10cSrcweir { 198cdf0e10cSrcweir ScUnoGuard aGuard; 199cdf0e10cSrcweir mpFieldWindow = NULL; 200cdf0e10cSrcweir 201cdf0e10cSrcweir ScAccessibleContextBase::disposing(); 202cdf0e10cSrcweir } 203cdf0e10cSrcweir 204cdf0e10cSrcweir void ScAccessibleDataPilotControl::AddField(sal_Int32 nNewIndex) 205cdf0e10cSrcweir { 206cdf0e10cSrcweir sal_Bool bAdded(sal_False); 207cdf0e10cSrcweir if (static_cast<size_t>(nNewIndex) == maChildren.size()) 208cdf0e10cSrcweir { 209cdf0e10cSrcweir maChildren.push_back(AccessibleWeak()); 210cdf0e10cSrcweir bAdded = sal_True; 211cdf0e10cSrcweir } 212cdf0e10cSrcweir else if (static_cast<size_t>(nNewIndex) < maChildren.size()) 213cdf0e10cSrcweir { 214cdf0e10cSrcweir ::std::vector < AccessibleWeak >::iterator aItr = maChildren.begin() + nNewIndex; 215cdf0e10cSrcweir maChildren.insert(aItr, AccessibleWeak()); 216cdf0e10cSrcweir 217cdf0e10cSrcweir ::std::vector < AccessibleWeak >::iterator aEndItr = maChildren.end(); 218cdf0e10cSrcweir aItr = maChildren.begin() + nNewIndex + 1; 219cdf0e10cSrcweir uno::Reference< XAccessible > xTempAcc; 220cdf0e10cSrcweir sal_Int32 nIndex = nNewIndex + 1; 221cdf0e10cSrcweir while (aItr != aEndItr) 222cdf0e10cSrcweir { 223cdf0e10cSrcweir xTempAcc = aItr->xWeakAcc; 224cdf0e10cSrcweir if (xTempAcc.is() && aItr->pAcc) 225cdf0e10cSrcweir aItr->pAcc->SetIndex(nIndex); 226cdf0e10cSrcweir ++nIndex; 227cdf0e10cSrcweir ++aItr; 228cdf0e10cSrcweir } 229cdf0e10cSrcweir bAdded = sal_True; 230cdf0e10cSrcweir } 231cdf0e10cSrcweir else 232cdf0e10cSrcweir { 233cdf0e10cSrcweir DBG_ERRORFILE("did not recognize a child count change"); 234cdf0e10cSrcweir } 235cdf0e10cSrcweir 236cdf0e10cSrcweir if (bAdded) 237cdf0e10cSrcweir { 238cdf0e10cSrcweir AccessibleEventObject aEvent; 239cdf0e10cSrcweir aEvent.EventId = AccessibleEventId::CHILD; 240cdf0e10cSrcweir aEvent.Source = uno::Reference< XAccessibleContext >(this); 241cdf0e10cSrcweir aEvent.NewValue <<= getAccessibleChild(nNewIndex); 242cdf0e10cSrcweir 243cdf0e10cSrcweir CommitChange(aEvent); // new child - event 244cdf0e10cSrcweir } 245cdf0e10cSrcweir } 246cdf0e10cSrcweir 247cdf0e10cSrcweir void ScAccessibleDataPilotControl::RemoveField(sal_Int32 nOldIndex) 248cdf0e10cSrcweir { 249cdf0e10cSrcweir sal_Bool bRemoved(sal_False); 250cdf0e10cSrcweir uno::Reference< XAccessible > xTempAcc; 251cdf0e10cSrcweir ScAccessibleDataPilotButton* pField = NULL; 252cdf0e10cSrcweir if (static_cast<size_t>(nOldIndex) < maChildren.size()) 253cdf0e10cSrcweir { 254cdf0e10cSrcweir xTempAcc = getAccessibleChild(nOldIndex); 255cdf0e10cSrcweir pField = maChildren[nOldIndex].pAcc; 256cdf0e10cSrcweir 257cdf0e10cSrcweir ::std::vector < AccessibleWeak >::iterator aItr = maChildren.begin() + nOldIndex; 258cdf0e10cSrcweir aItr = maChildren.erase(aItr); 259cdf0e10cSrcweir 260cdf0e10cSrcweir ::std::vector < AccessibleWeak >::iterator aEndItr = maChildren.end(); 261cdf0e10cSrcweir uno::Reference< XAccessible > xItrAcc; 262cdf0e10cSrcweir while (aItr != aEndItr) 263cdf0e10cSrcweir { 264cdf0e10cSrcweir xItrAcc = aItr->xWeakAcc; 265cdf0e10cSrcweir if (xItrAcc.is() && aItr->pAcc) 266cdf0e10cSrcweir aItr->pAcc->SetIndex(nOldIndex); 267cdf0e10cSrcweir ++nOldIndex; 268cdf0e10cSrcweir ++aItr; 269cdf0e10cSrcweir } 270cdf0e10cSrcweir bRemoved = sal_True; 271cdf0e10cSrcweir } 272cdf0e10cSrcweir else 273cdf0e10cSrcweir { 274cdf0e10cSrcweir DBG_ERRORFILE("did not recognize a child count change"); 275cdf0e10cSrcweir } 276cdf0e10cSrcweir 277cdf0e10cSrcweir if (bRemoved) 278cdf0e10cSrcweir { 279cdf0e10cSrcweir AccessibleEventObject aEvent; 280cdf0e10cSrcweir aEvent.EventId = AccessibleEventId::CHILD; 281cdf0e10cSrcweir aEvent.Source = uno::Reference< XAccessibleContext >(this); 282cdf0e10cSrcweir aEvent.NewValue <<= xTempAcc; 283cdf0e10cSrcweir 284cdf0e10cSrcweir CommitChange(aEvent); // gone child - event 285cdf0e10cSrcweir 286cdf0e10cSrcweir if (pField) 287cdf0e10cSrcweir pField->dispose(); 288cdf0e10cSrcweir } 289cdf0e10cSrcweir } 290cdf0e10cSrcweir 291cdf0e10cSrcweir void ScAccessibleDataPilotControl::FieldFocusChange(sal_Int32 nOldIndex, sal_Int32 nNewIndex) 292cdf0e10cSrcweir { 293cdf0e10cSrcweir DBG_ASSERT(static_cast<size_t>(nOldIndex) < maChildren.size() && 294cdf0e10cSrcweir static_cast<size_t>(nNewIndex) < maChildren.size(), "did not recognize a child count change"); 295cdf0e10cSrcweir 296cdf0e10cSrcweir uno::Reference < XAccessible > xTempAcc = maChildren[nOldIndex].xWeakAcc; 297cdf0e10cSrcweir if (xTempAcc.is() && maChildren[nOldIndex].pAcc) 298cdf0e10cSrcweir maChildren[nOldIndex].pAcc->ResetFocused(); 299cdf0e10cSrcweir 300cdf0e10cSrcweir xTempAcc = maChildren[nNewIndex].xWeakAcc; 301cdf0e10cSrcweir if (xTempAcc.is() && maChildren[nNewIndex].pAcc) 302cdf0e10cSrcweir maChildren[nNewIndex].pAcc->SetFocused(); 303cdf0e10cSrcweir } 304cdf0e10cSrcweir 305cdf0e10cSrcweir void ScAccessibleDataPilotControl::FieldNameChange(sal_Int32 nIndex) 306cdf0e10cSrcweir { 307cdf0e10cSrcweir DBG_ASSERT(static_cast<size_t>(nIndex) < maChildren.size(), "did not recognize a child count change"); 308cdf0e10cSrcweir 309cdf0e10cSrcweir uno::Reference < XAccessible > xTempAcc = maChildren[nIndex].xWeakAcc; 310cdf0e10cSrcweir if (xTempAcc.is() && maChildren[nIndex].pAcc) 311cdf0e10cSrcweir maChildren[nIndex].pAcc->ChangeName(); 312cdf0e10cSrcweir } 313cdf0e10cSrcweir 314cdf0e10cSrcweir void ScAccessibleDataPilotControl::GotFocus() 315cdf0e10cSrcweir { 316cdf0e10cSrcweir if (mpFieldWindow) 317cdf0e10cSrcweir { 318cdf0e10cSrcweir DBG_ASSERT(mpFieldWindow->GetFieldCount() == maChildren.size(), "did not recognize a child count change"); 319cdf0e10cSrcweir 3200deba7fbSSteve Yin if(maChildren.size()==0) 3210deba7fbSSteve Yin return ; 322cdf0e10cSrcweir sal_Int32 nIndex(mpFieldWindow->GetSelectedIndex()); 323cdf0e10cSrcweir uno::Reference < XAccessible > xTempAcc = maChildren[nIndex].xWeakAcc; 324cdf0e10cSrcweir if (xTempAcc.is() && maChildren[nIndex].pAcc) 325cdf0e10cSrcweir maChildren[nIndex].pAcc->SetFocused(); 326cdf0e10cSrcweir } 327cdf0e10cSrcweir } 328cdf0e10cSrcweir 329cdf0e10cSrcweir void ScAccessibleDataPilotControl::LostFocus() 330cdf0e10cSrcweir { 331cdf0e10cSrcweir if (mpFieldWindow) 332cdf0e10cSrcweir { 333cdf0e10cSrcweir DBG_ASSERT(mpFieldWindow->GetFieldCount() == maChildren.size(), "did not recognize a child count change"); 3340deba7fbSSteve Yin if(maChildren.size()==0) 3350deba7fbSSteve Yin return ; 336cdf0e10cSrcweir sal_Int32 nIndex(mpFieldWindow->GetSelectedIndex()); 337cdf0e10cSrcweir uno::Reference < XAccessible > xTempAcc = maChildren[nIndex].xWeakAcc; 338cdf0e10cSrcweir if (xTempAcc.is() && maChildren[nIndex].pAcc) 339cdf0e10cSrcweir maChildren[nIndex].pAcc->ResetFocused(); 340cdf0e10cSrcweir } 341cdf0e10cSrcweir } 342cdf0e10cSrcweir 343cdf0e10cSrcweir ///===== XAccessibleComponent ============================================ 344cdf0e10cSrcweir 345cdf0e10cSrcweir uno::Reference< XAccessible > SAL_CALL ScAccessibleDataPilotControl::getAccessibleAtPoint( 346cdf0e10cSrcweir const awt::Point& rPoint ) 347cdf0e10cSrcweir throw (uno::RuntimeException) 348cdf0e10cSrcweir { 349cdf0e10cSrcweir uno::Reference<XAccessible> xAcc; 350cdf0e10cSrcweir if (containsPoint(rPoint)) 351cdf0e10cSrcweir { 352cdf0e10cSrcweir ScUnoGuard aGuard; 353cdf0e10cSrcweir IsObjectValid(); 354cdf0e10cSrcweir if (mpFieldWindow) 355cdf0e10cSrcweir { 356cdf0e10cSrcweir Point aAbsPoint(VCLPoint(rPoint)); 357cdf0e10cSrcweir Point aControlEdge(GetBoundingBoxOnScreen().TopLeft()); 358cdf0e10cSrcweir Point aRelPoint(aAbsPoint - aControlEdge); 359cdf0e10cSrcweir size_t nChildIndex = mpFieldWindow->GetFieldIndex( aRelPoint ); 360cdf0e10cSrcweir if( nChildIndex != PIVOTFIELD_INVALID ) 361cdf0e10cSrcweir xAcc = getAccessibleChild(static_cast< long >( nChildIndex )); 362cdf0e10cSrcweir } 363cdf0e10cSrcweir } 364cdf0e10cSrcweir return xAcc; 365cdf0e10cSrcweir } 366cdf0e10cSrcweir 367cdf0e10cSrcweir sal_Bool SAL_CALL ScAccessibleDataPilotControl::isVisible( ) 368cdf0e10cSrcweir throw (uno::RuntimeException) 369cdf0e10cSrcweir { 370cdf0e10cSrcweir return sal_True; 371cdf0e10cSrcweir } 372cdf0e10cSrcweir 373cdf0e10cSrcweir void SAL_CALL ScAccessibleDataPilotControl::grabFocus( ) 374cdf0e10cSrcweir throw (uno::RuntimeException) 375cdf0e10cSrcweir { 376cdf0e10cSrcweir ScUnoGuard aGuard; 377cdf0e10cSrcweir IsObjectValid(); 378cdf0e10cSrcweir if (mpFieldWindow) 379cdf0e10cSrcweir mpFieldWindow->GrabFocus(); 380cdf0e10cSrcweir } 381cdf0e10cSrcweir 382cdf0e10cSrcweir sal_Int32 SAL_CALL ScAccessibleDataPilotControl::getForeground( ) 383cdf0e10cSrcweir throw (uno::RuntimeException) 384cdf0e10cSrcweir { 385cdf0e10cSrcweir ScUnoGuard aGuard; 386cdf0e10cSrcweir IsObjectValid(); 387cdf0e10cSrcweir sal_Int32 nColor(0); 388cdf0e10cSrcweir if (mpFieldWindow) 389cdf0e10cSrcweir { 390cdf0e10cSrcweir nColor = mpFieldWindow->GetSettings().GetStyleSettings().GetWindowTextColor().GetColor(); 391cdf0e10cSrcweir } 392cdf0e10cSrcweir return nColor; 393cdf0e10cSrcweir } 394cdf0e10cSrcweir 395cdf0e10cSrcweir sal_Int32 SAL_CALL ScAccessibleDataPilotControl::getBackground( ) 396cdf0e10cSrcweir throw (uno::RuntimeException) 397cdf0e10cSrcweir { 398cdf0e10cSrcweir ScUnoGuard aGuard; 399cdf0e10cSrcweir IsObjectValid(); 400cdf0e10cSrcweir sal_Int32 nColor(0); 401cdf0e10cSrcweir if (mpFieldWindow) 402cdf0e10cSrcweir { 403cdf0e10cSrcweir const StyleSettings& rStyleSett = mpFieldWindow->GetSettings().GetStyleSettings(); 404cdf0e10cSrcweir nColor = (mpFieldWindow->GetType() == PIVOTFIELDTYPE_SELECT) ? rStyleSett.GetFaceColor().GetColor() : rStyleSett.GetWindowColor().GetColor(); 405cdf0e10cSrcweir } 406cdf0e10cSrcweir return nColor; 407cdf0e10cSrcweir } 408cdf0e10cSrcweir 409cdf0e10cSrcweir ///===== XAccessibleContext ============================================== 410cdf0e10cSrcweir 411cdf0e10cSrcweir sal_Int32 SAL_CALL ScAccessibleDataPilotControl::getAccessibleChildCount(void) 412cdf0e10cSrcweir throw (uno::RuntimeException) 413cdf0e10cSrcweir { 414cdf0e10cSrcweir ScUnoGuard aGuard; 415cdf0e10cSrcweir IsObjectValid(); 416cdf0e10cSrcweir if (mpFieldWindow) 417cdf0e10cSrcweir return mpFieldWindow->GetFieldCount(); 418cdf0e10cSrcweir else 419cdf0e10cSrcweir return 0; 420cdf0e10cSrcweir } 421cdf0e10cSrcweir 422cdf0e10cSrcweir uno::Reference< XAccessible> SAL_CALL ScAccessibleDataPilotControl::getAccessibleChild(sal_Int32 nIndex) 423cdf0e10cSrcweir throw (uno::RuntimeException, lang::IndexOutOfBoundsException) 424cdf0e10cSrcweir { 425cdf0e10cSrcweir ScUnoGuard aGuard; 426cdf0e10cSrcweir IsObjectValid(); 427cdf0e10cSrcweir uno::Reference<XAccessible> xAcc; 428cdf0e10cSrcweir if (mpFieldWindow) 429cdf0e10cSrcweir { 430cdf0e10cSrcweir if (nIndex < 0 || static_cast< size_t >( nIndex ) >= mpFieldWindow->GetFieldCount()) 431cdf0e10cSrcweir throw lang::IndexOutOfBoundsException(); 432cdf0e10cSrcweir 433cdf0e10cSrcweir DBG_ASSERT(mpFieldWindow->GetFieldCount() == maChildren.size(), "did not recognize a child count change"); 434cdf0e10cSrcweir 435cdf0e10cSrcweir uno::Reference < XAccessible > xTempAcc = maChildren[nIndex].xWeakAcc; 436cdf0e10cSrcweir if (!xTempAcc.is()) 437cdf0e10cSrcweir { 438cdf0e10cSrcweir maChildren[nIndex].pAcc = new ScAccessibleDataPilotButton(this, mpFieldWindow, nIndex); 439cdf0e10cSrcweir xTempAcc = maChildren[nIndex].pAcc; 440cdf0e10cSrcweir maChildren[nIndex].xWeakAcc = xTempAcc; 441cdf0e10cSrcweir } 442cdf0e10cSrcweir 443cdf0e10cSrcweir xAcc = xTempAcc; 444cdf0e10cSrcweir } 445cdf0e10cSrcweir return xAcc; 446cdf0e10cSrcweir } 447cdf0e10cSrcweir 448cdf0e10cSrcweir uno::Reference<XAccessibleStateSet> SAL_CALL ScAccessibleDataPilotControl::getAccessibleStateSet(void) 449cdf0e10cSrcweir throw (uno::RuntimeException) 450cdf0e10cSrcweir { 451cdf0e10cSrcweir ScUnoGuard aGuard; 452cdf0e10cSrcweir IsObjectValid(); 453cdf0e10cSrcweir 454cdf0e10cSrcweir utl::AccessibleStateSetHelper* pStateSet = new utl::AccessibleStateSetHelper(); 455cdf0e10cSrcweir 456cdf0e10cSrcweir if (IsDefunc()) 457cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::DEFUNC); 458cdf0e10cSrcweir else 459cdf0e10cSrcweir { 460cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::ENABLED); 461cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::OPAQUE); 462cdf0e10cSrcweir if (isShowing()) 463cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::SHOWING); 464cdf0e10cSrcweir if (isVisible()) 465cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::VISIBLE); 466cdf0e10cSrcweir } 467cdf0e10cSrcweir 468cdf0e10cSrcweir return pStateSet; 469cdf0e10cSrcweir } 470cdf0e10cSrcweir 471cdf0e10cSrcweir ///===== XServiceInfo ==================================================== 472cdf0e10cSrcweir 473cdf0e10cSrcweir ::rtl::OUString SAL_CALL ScAccessibleDataPilotControl::getImplementationName(void) 474cdf0e10cSrcweir throw (uno::RuntimeException) 475cdf0e10cSrcweir { 476cdf0e10cSrcweir return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("ScAccessibleDataPilotControl")); 477cdf0e10cSrcweir } 478cdf0e10cSrcweir 479cdf0e10cSrcweir ///===== XTypeProvider =================================================== 480cdf0e10cSrcweir 481cdf0e10cSrcweir uno::Sequence<sal_Int8> SAL_CALL ScAccessibleDataPilotControl::getImplementationId(void) 482cdf0e10cSrcweir throw (uno::RuntimeException) 483cdf0e10cSrcweir { 484cdf0e10cSrcweir ScUnoGuard aGuard; 485cdf0e10cSrcweir IsObjectValid(); 486cdf0e10cSrcweir static uno::Sequence<sal_Int8> aId; 487cdf0e10cSrcweir if (aId.getLength() == 0) 488cdf0e10cSrcweir { 489cdf0e10cSrcweir aId.realloc (16); 490cdf0e10cSrcweir rtl_createUuid (reinterpret_cast<sal_uInt8 *>(aId.getArray()), 0, sal_True); 491cdf0e10cSrcweir } 492cdf0e10cSrcweir return aId; 493cdf0e10cSrcweir } 494cdf0e10cSrcweir 495cdf0e10cSrcweir //===== internal ======================================================== 496cdf0e10cSrcweir 497cdf0e10cSrcweir ::rtl::OUString SAL_CALL ScAccessibleDataPilotControl::createAccessibleDescription(void) 498cdf0e10cSrcweir throw (uno::RuntimeException) 499cdf0e10cSrcweir { 500cdf0e10cSrcweir ScUnoGuard aGuard; 501cdf0e10cSrcweir IsObjectValid(); 502cdf0e10cSrcweir if (mpFieldWindow) 503cdf0e10cSrcweir return mpFieldWindow->GetDescription(); 504cdf0e10cSrcweir 505cdf0e10cSrcweir return rtl::OUString(); 506cdf0e10cSrcweir } 507cdf0e10cSrcweir 508cdf0e10cSrcweir ::rtl::OUString SAL_CALL ScAccessibleDataPilotControl::createAccessibleName(void) 509cdf0e10cSrcweir throw (uno::RuntimeException) 510cdf0e10cSrcweir { 511cdf0e10cSrcweir ScUnoGuard aGuard; 512cdf0e10cSrcweir IsObjectValid(); 513cdf0e10cSrcweir if (mpFieldWindow) 514cdf0e10cSrcweir return mpFieldWindow->GetName(); 515cdf0e10cSrcweir 516cdf0e10cSrcweir return rtl::OUString(); 517cdf0e10cSrcweir } 518cdf0e10cSrcweir 519cdf0e10cSrcweir Rectangle ScAccessibleDataPilotControl::GetBoundingBoxOnScreen(void) const 520cdf0e10cSrcweir throw (uno::RuntimeException) 521cdf0e10cSrcweir { 522cdf0e10cSrcweir if (mpFieldWindow) 523cdf0e10cSrcweir return mpFieldWindow->GetWindowExtentsRelative(NULL); 524cdf0e10cSrcweir else 525cdf0e10cSrcweir return Rectangle(); 526cdf0e10cSrcweir } 527cdf0e10cSrcweir 528cdf0e10cSrcweir Rectangle ScAccessibleDataPilotControl::GetBoundingBox(void) const 529cdf0e10cSrcweir throw (uno::RuntimeException) 530cdf0e10cSrcweir { 531cdf0e10cSrcweir if (mpFieldWindow) 532cdf0e10cSrcweir return mpFieldWindow->GetWindowExtentsRelative(mpFieldWindow->GetAccessibleParentWindow()); 533cdf0e10cSrcweir else 534cdf0e10cSrcweir return Rectangle(); 535cdf0e10cSrcweir } 536cdf0e10cSrcweir 537cdf0e10cSrcweir 538cdf0e10cSrcweir //=============================================================================== 539cdf0e10cSrcweir 540cdf0e10cSrcweir ScAccessibleDataPilotButton::ScAccessibleDataPilotButton( 541cdf0e10cSrcweir const ::com::sun::star::uno::Reference< 542cdf0e10cSrcweir ::com::sun::star::accessibility::XAccessible>& rxParent, 543cdf0e10cSrcweir ScPivotFieldWindow* pFieldWindow, 544cdf0e10cSrcweir sal_Int32 nIndex) 545*86e1cf34SPedro Giffuni //change role from PUSH_BUTTON to BUTTON_MENU 5460deba7fbSSteve Yin : ScAccessibleContextBase(rxParent, AccessibleRole::BUTTON_MENU), 547cdf0e10cSrcweir mpFieldWindow(pFieldWindow), 548cdf0e10cSrcweir mnIndex(nIndex) 549cdf0e10cSrcweir { 550cdf0e10cSrcweir } 551cdf0e10cSrcweir 552cdf0e10cSrcweir ScAccessibleDataPilotButton::~ScAccessibleDataPilotButton(void) 553cdf0e10cSrcweir { 554cdf0e10cSrcweir if (!IsDefunc() && !rBHelper.bInDispose) 555cdf0e10cSrcweir { 556cdf0e10cSrcweir // increment refcount to prevent double call off dtor 557cdf0e10cSrcweir osl_incrementInterlockedCount( &m_refCount ); 558*86e1cf34SPedro Giffuni // call dispose to inform object which have a weak reference to this object 559cdf0e10cSrcweir dispose(); 560cdf0e10cSrcweir } 561cdf0e10cSrcweir } 562cdf0e10cSrcweir 563cdf0e10cSrcweir void ScAccessibleDataPilotButton::Init() 564cdf0e10cSrcweir { 565cdf0e10cSrcweir } 566cdf0e10cSrcweir 567cdf0e10cSrcweir void SAL_CALL ScAccessibleDataPilotButton::disposing() 568cdf0e10cSrcweir { 569cdf0e10cSrcweir ScUnoGuard aGuard; 570cdf0e10cSrcweir mpFieldWindow = NULL; 571cdf0e10cSrcweir 572cdf0e10cSrcweir ScAccessibleContextBase::disposing(); 573cdf0e10cSrcweir } 574cdf0e10cSrcweir 575cdf0e10cSrcweir void ScAccessibleDataPilotButton::SetFocused() 576cdf0e10cSrcweir { 577cdf0e10cSrcweir CommitFocusGained(); 578cdf0e10cSrcweir } 579cdf0e10cSrcweir 580cdf0e10cSrcweir void ScAccessibleDataPilotButton::ResetFocused() 581cdf0e10cSrcweir { 582cdf0e10cSrcweir CommitFocusLost(); 583cdf0e10cSrcweir } 584cdf0e10cSrcweir 585cdf0e10cSrcweir ///===== XAccessibleComponent ============================================ 586cdf0e10cSrcweir 587cdf0e10cSrcweir uno::Reference< XAccessible > SAL_CALL ScAccessibleDataPilotButton::getAccessibleAtPoint( 588cdf0e10cSrcweir const ::com::sun::star::awt::Point& /* rPoint */ ) 589cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 590cdf0e10cSrcweir { 591cdf0e10cSrcweir return NULL; 592cdf0e10cSrcweir } 593cdf0e10cSrcweir 594cdf0e10cSrcweir sal_Bool SAL_CALL ScAccessibleDataPilotButton::isVisible( ) 595cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 596cdf0e10cSrcweir { 597cdf0e10cSrcweir return sal_True; 598cdf0e10cSrcweir } 599cdf0e10cSrcweir 600cdf0e10cSrcweir void SAL_CALL ScAccessibleDataPilotButton::grabFocus( ) 601cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 602cdf0e10cSrcweir { 603cdf0e10cSrcweir ScUnoGuard aGuard; 604cdf0e10cSrcweir IsObjectValid(); 605cdf0e10cSrcweir if (mpFieldWindow) 606cdf0e10cSrcweir { 607cdf0e10cSrcweir mpFieldWindow->GrabFocusAndSelect(getAccessibleIndexInParent()); 608cdf0e10cSrcweir } 609cdf0e10cSrcweir } 610cdf0e10cSrcweir 611cdf0e10cSrcweir sal_Int32 SAL_CALL ScAccessibleDataPilotButton::getForeground( ) 612cdf0e10cSrcweir throw (uno::RuntimeException) 613cdf0e10cSrcweir { 614cdf0e10cSrcweir ScUnoGuard aGuard; 615cdf0e10cSrcweir IsObjectValid(); 616cdf0e10cSrcweir sal_Int32 nColor(0); 617cdf0e10cSrcweir if (mpFieldWindow) 618cdf0e10cSrcweir { 619cdf0e10cSrcweir nColor = mpFieldWindow->GetSettings().GetStyleSettings().GetButtonTextColor().GetColor(); 620cdf0e10cSrcweir } 621cdf0e10cSrcweir return nColor; 622cdf0e10cSrcweir } 623cdf0e10cSrcweir 624cdf0e10cSrcweir sal_Int32 SAL_CALL ScAccessibleDataPilotButton::getBackground( ) 625cdf0e10cSrcweir throw (uno::RuntimeException) 626cdf0e10cSrcweir { 627cdf0e10cSrcweir ScUnoGuard aGuard; 628cdf0e10cSrcweir IsObjectValid(); 629cdf0e10cSrcweir sal_Int32 nColor(0); 630cdf0e10cSrcweir if (mpFieldWindow) 631cdf0e10cSrcweir { 632cdf0e10cSrcweir nColor = mpFieldWindow->GetSettings().GetStyleSettings().GetFaceColor().GetColor(); 633cdf0e10cSrcweir } 634cdf0e10cSrcweir return nColor; 635cdf0e10cSrcweir } 636cdf0e10cSrcweir 637cdf0e10cSrcweir ///===== XAccessibleContext ============================================== 638cdf0e10cSrcweir 639cdf0e10cSrcweir sal_Int32 SAL_CALL ScAccessibleDataPilotButton::getAccessibleChildCount(void) 640cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 641cdf0e10cSrcweir { 642cdf0e10cSrcweir return 0; 643cdf0e10cSrcweir } 644cdf0e10cSrcweir 645cdf0e10cSrcweir uno::Reference< XAccessible> SAL_CALL ScAccessibleDataPilotButton::getAccessibleChild(sal_Int32 /* nIndex */) 646cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException, 647cdf0e10cSrcweir ::com::sun::star::lang::IndexOutOfBoundsException) 648cdf0e10cSrcweir { 649cdf0e10cSrcweir throw lang::IndexOutOfBoundsException(); 650cdf0e10cSrcweir } 651cdf0e10cSrcweir 652cdf0e10cSrcweir sal_Int32 SAL_CALL ScAccessibleDataPilotButton::getAccessibleIndexInParent(void) 653cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 654cdf0e10cSrcweir { 655cdf0e10cSrcweir ScUnoGuard aGuard; 656cdf0e10cSrcweir IsObjectValid(); 657cdf0e10cSrcweir return mnIndex; 658cdf0e10cSrcweir } 659cdf0e10cSrcweir 660cdf0e10cSrcweir uno::Reference<XAccessibleStateSet> SAL_CALL ScAccessibleDataPilotButton::getAccessibleStateSet(void) 661cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 662cdf0e10cSrcweir { 663cdf0e10cSrcweir ScUnoGuard aGuard; 664cdf0e10cSrcweir IsObjectValid(); 665cdf0e10cSrcweir 666cdf0e10cSrcweir utl::AccessibleStateSetHelper* pStateSet = new utl::AccessibleStateSetHelper(); 667cdf0e10cSrcweir 668cdf0e10cSrcweir if (IsDefunc()) 669cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::DEFUNC); 670cdf0e10cSrcweir else 671cdf0e10cSrcweir { 672cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::ENABLED); 673cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::OPAQUE); 674cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::FOCUSABLE); 675cdf0e10cSrcweir if (mpFieldWindow && (sal::static_int_cast<sal_Int32>(mpFieldWindow->GetSelectedIndex()) == mnIndex)) 676cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::FOCUSED); 677cdf0e10cSrcweir if (isShowing()) 678cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::SHOWING); 679cdf0e10cSrcweir if (isVisible()) 680cdf0e10cSrcweir pStateSet->AddState(AccessibleStateType::VISIBLE); 681cdf0e10cSrcweir } 682cdf0e10cSrcweir 683cdf0e10cSrcweir return pStateSet; 684cdf0e10cSrcweir } 6850deba7fbSSteve Yin ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleRelationSet > 6860deba7fbSSteve Yin SAL_CALL ScAccessibleDataPilotButton::getAccessibleRelationSet( ) throw (::com::sun::star::uno::RuntimeException) 6870deba7fbSSteve Yin { 6880deba7fbSSteve Yin utl::AccessibleRelationSetHelper* pRelationSetHelper = new utl::AccessibleRelationSetHelper; 6890deba7fbSSteve Yin uno::Reference< accessibility::XAccessibleRelationSet > xSet = pRelationSetHelper; 6900deba7fbSSteve Yin if(mxParent.is()) 6910deba7fbSSteve Yin { 6920deba7fbSSteve Yin uno::Sequence< uno::Reference< uno::XInterface > > aSequence(1); 6930deba7fbSSteve Yin aSequence[0] = mxParent; 6940deba7fbSSteve Yin pRelationSetHelper->AddRelation( accessibility::AccessibleRelation( accessibility::AccessibleRelationType::MEMBER_OF, aSequence ) ); 6950deba7fbSSteve Yin } 696cdf0e10cSrcweir 6970deba7fbSSteve Yin return xSet; 6980deba7fbSSteve Yin 6990deba7fbSSteve Yin } 700cdf0e10cSrcweir ///===== XServiceInfo ==================================================== 701cdf0e10cSrcweir 702cdf0e10cSrcweir ::rtl::OUString SAL_CALL ScAccessibleDataPilotButton::getImplementationName(void) 703cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 704cdf0e10cSrcweir { 705cdf0e10cSrcweir return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("ScAccessibleDataPilotButton")); 706cdf0e10cSrcweir } 707cdf0e10cSrcweir 708cdf0e10cSrcweir ///===== XTypeProvider =================================================== 709cdf0e10cSrcweir 710cdf0e10cSrcweir uno::Sequence<sal_Int8> SAL_CALL ScAccessibleDataPilotButton::getImplementationId(void) 711cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 712cdf0e10cSrcweir { 713cdf0e10cSrcweir ScUnoGuard aGuard; 714cdf0e10cSrcweir IsObjectValid(); 715cdf0e10cSrcweir static uno::Sequence<sal_Int8> aId; 716cdf0e10cSrcweir if (aId.getLength() == 0) 717cdf0e10cSrcweir { 718cdf0e10cSrcweir aId.realloc (16); 719cdf0e10cSrcweir rtl_createUuid (reinterpret_cast<sal_uInt8 *>(aId.getArray()), 0, sal_True); 720cdf0e10cSrcweir } 721cdf0e10cSrcweir return aId; 722cdf0e10cSrcweir } 723cdf0e10cSrcweir 724cdf0e10cSrcweir ::rtl::OUString SAL_CALL ScAccessibleDataPilotButton::createAccessibleDescription(void) 725cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 726cdf0e10cSrcweir { 7270deba7fbSSteve Yin if (mpFieldWindow) 7280deba7fbSSteve Yin return mpFieldWindow->GetHelpText(); 729cdf0e10cSrcweir return rtl::OUString(); 730cdf0e10cSrcweir } 731cdf0e10cSrcweir 732cdf0e10cSrcweir ::rtl::OUString SAL_CALL ScAccessibleDataPilotButton::createAccessibleName(void) 733cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 734cdf0e10cSrcweir { 735cdf0e10cSrcweir ScUnoGuard aGuard; 736cdf0e10cSrcweir IsObjectValid(); 737cdf0e10cSrcweir if (mpFieldWindow) 738cdf0e10cSrcweir return mpFieldWindow->GetFieldText(getAccessibleIndexInParent()); 739cdf0e10cSrcweir 740cdf0e10cSrcweir return rtl::OUString(); 741cdf0e10cSrcweir } 742cdf0e10cSrcweir 743cdf0e10cSrcweir Rectangle ScAccessibleDataPilotButton::GetBoundingBoxOnScreen(void) const 744cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 745cdf0e10cSrcweir { 746cdf0e10cSrcweir Rectangle aRect(GetBoundingBox()); 747cdf0e10cSrcweir 748cdf0e10cSrcweir if (mpFieldWindow) 749cdf0e10cSrcweir { 750cdf0e10cSrcweir Point aParentPos(mpFieldWindow->GetWindowExtentsRelative(NULL).TopLeft()); 751cdf0e10cSrcweir aRect.Move(aParentPos.getX(), aParentPos.getY()); 752cdf0e10cSrcweir } 753cdf0e10cSrcweir 754cdf0e10cSrcweir return aRect; 755cdf0e10cSrcweir } 756cdf0e10cSrcweir 757cdf0e10cSrcweir Rectangle ScAccessibleDataPilotButton::GetBoundingBox(void) const 758cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 759cdf0e10cSrcweir { 760cdf0e10cSrcweir if (mpFieldWindow) 761cdf0e10cSrcweir return Rectangle (mpFieldWindow->GetFieldPosition(const_cast<ScAccessibleDataPilotButton*> (this)->getAccessibleIndexInParent()), mpFieldWindow->GetFieldSize()); 762cdf0e10cSrcweir else 763cdf0e10cSrcweir return Rectangle(); 764cdf0e10cSrcweir } 7650deba7fbSSteve Yin // ----------------------------------------------------------------------------- 7660deba7fbSSteve Yin // XAccessibleAction 7670deba7fbSSteve Yin // ----------------------------------------------------------------------------- 7680deba7fbSSteve Yin sal_Int32 ScAccessibleDataPilotButton::getAccessibleActionCount( ) throw (uno::RuntimeException) 7690deba7fbSSteve Yin { 7700deba7fbSSteve Yin return 1; 7710deba7fbSSteve Yin } 7720deba7fbSSteve Yin // ----------------------------------------------------------------------------- 7730deba7fbSSteve Yin sal_Bool ScAccessibleDataPilotButton::doAccessibleAction ( sal_Int32 nIndex ) throw (lang::IndexOutOfBoundsException, uno::RuntimeException) 7740deba7fbSSteve Yin { 7750deba7fbSSteve Yin if ( nIndex < 0 || nIndex >= getAccessibleActionCount() ) 7760deba7fbSSteve Yin throw lang::IndexOutOfBoundsException(); 7770deba7fbSSteve Yin return sal_True; 7780deba7fbSSteve Yin } 7790deba7fbSSteve Yin // ----------------------------------------------------------------------------- 7800deba7fbSSteve Yin ::rtl::OUString ScAccessibleDataPilotButton::getAccessibleActionDescription ( sal_Int32 nIndex ) throw (lang::IndexOutOfBoundsException, uno::RuntimeException) 7810deba7fbSSteve Yin { 7820deba7fbSSteve Yin if ( nIndex < 0 || nIndex >= getAccessibleActionCount() ) 7830deba7fbSSteve Yin throw lang::IndexOutOfBoundsException(); 7840deba7fbSSteve Yin return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "press" ) ); 7850deba7fbSSteve Yin } 7860deba7fbSSteve Yin // ----------------------------------------------------------------------------- 7870deba7fbSSteve Yin ::com::sun::star::uno::Reference< XAccessibleKeyBinding > ScAccessibleDataPilotButton::getAccessibleActionKeyBinding( sal_Int32 nIndex ) throw (lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException) 7880deba7fbSSteve Yin { 7890deba7fbSSteve Yin if ( nIndex < 0 || nIndex >= getAccessibleActionCount() ) 7900deba7fbSSteve Yin throw lang::IndexOutOfBoundsException(); 7910deba7fbSSteve Yin comphelper::OAccessibleKeyBindingHelper* pKeyBindingHelper = new comphelper::OAccessibleKeyBindingHelper(); 7920deba7fbSSteve Yin ::com::sun::star::uno::Reference< XAccessibleKeyBinding > xKeyBinding = pKeyBindingHelper; 7930deba7fbSSteve Yin ScPivotFieldWindow* pWindow = mpFieldWindow; 7940deba7fbSSteve Yin if ( pWindow ) 7950deba7fbSSteve Yin { 7960deba7fbSSteve Yin awt::KeyStroke aKeyStroke; 7970deba7fbSSteve Yin aKeyStroke.Modifiers = 0; 7980deba7fbSSteve Yin aKeyStroke.KeyCode = KEY_SPACE; 7990deba7fbSSteve Yin pKeyBindingHelper->AddKeyBinding( aKeyStroke ); 8000deba7fbSSteve Yin } 8010deba7fbSSteve Yin return xKeyBinding; 8020deba7fbSSteve Yin } 8030deba7fbSSteve Yin //===== XInterface ===================================================== 8040deba7fbSSteve Yin uno::Any SAL_CALL ScAccessibleDataPilotButton::queryInterface( uno::Type const & rType ) 8050deba7fbSSteve Yin throw (::com::sun::star::uno::RuntimeException) 8060deba7fbSSteve Yin { 8070deba7fbSSteve Yin uno::Any aAny (ScAccessibleContextBase::queryInterface(rType)); 8080deba7fbSSteve Yin if(!aAny.hasValue()) 8090deba7fbSSteve Yin { 8100deba7fbSSteve Yin aAny = ::cppu::queryInterface (rType, 8110deba7fbSSteve Yin static_cast<XAccessibleAction*>(this) 8120deba7fbSSteve Yin ); 8130deba7fbSSteve Yin } 8140deba7fbSSteve Yin return aAny; 8150deba7fbSSteve Yin } 8160deba7fbSSteve Yin void SAL_CALL ScAccessibleDataPilotButton::acquire() 8170deba7fbSSteve Yin throw () 8180deba7fbSSteve Yin { 8190deba7fbSSteve Yin ScAccessibleContextBase::acquire(); 8200deba7fbSSteve Yin } 8210deba7fbSSteve Yin void SAL_CALL ScAccessibleDataPilotButton::release() 8220deba7fbSSteve Yin throw () 8230deba7fbSSteve Yin { 8240deba7fbSSteve Yin ScAccessibleContextBase::release(); 8250deba7fbSSteve Yin } 8260deba7fbSSteve Yin 827