1*5fdc4257SSteve Yin /************************************************************************* 2*5fdc4257SSteve Yin * 3*5fdc4257SSteve Yin * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*5fdc4257SSteve Yin * 5*5fdc4257SSteve Yin * Copyright IBM Corporation 2010. 6*5fdc4257SSteve Yin * Copyright 2000, 2010 Oracle and/or its affiliates. 7*5fdc4257SSteve Yin * 8*5fdc4257SSteve Yin * OpenOffice.org - a multi-platform office productivity suite 9*5fdc4257SSteve Yin * 10*5fdc4257SSteve Yin * This file is part of OpenOffice.org. 11*5fdc4257SSteve Yin * 12*5fdc4257SSteve Yin * OpenOffice.org is free software: you can redistribute it and/or modify 13*5fdc4257SSteve Yin * it under the terms of the GNU Lesser General Public License version 3 14*5fdc4257SSteve Yin * only, as published by the Free Software Foundation. 15*5fdc4257SSteve Yin * 16*5fdc4257SSteve Yin * OpenOffice.org is distributed in the hope that it will be useful, 17*5fdc4257SSteve Yin * but WITHOUT ANY WARRANTY; without even the implied warranty of 18*5fdc4257SSteve Yin * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19*5fdc4257SSteve Yin * GNU Lesser General Public License version 3 for more details 20*5fdc4257SSteve Yin * (a copy is included in the LICENSE file that accompanied this code). 21*5fdc4257SSteve Yin * 22*5fdc4257SSteve Yin * You should have received a copy of the GNU Lesser General Public License 23*5fdc4257SSteve Yin * version 3 along with OpenOffice.org. If not, see 24*5fdc4257SSteve Yin * <http://www.openoffice.org/license.html> 25*5fdc4257SSteve Yin * for a copy of the LGPLv3 License. 26*5fdc4257SSteve Yin * 27*5fdc4257SSteve Yin ************************************************************************/ 28*5fdc4257SSteve Yin 29*5fdc4257SSteve Yin #include <cassert> 30*5fdc4257SSteve Yin 31*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp> 32*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleEventListener.hpp> 33*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleComponent.hpp> 34*5fdc4257SSteve Yin #include <com/sun/star/accessibility/AccessibleStateType.hpp> 35*5fdc4257SSteve Yin 36*5fdc4257SSteve Yin #include <oleacc.h> 37*5fdc4257SSteve Yin #ifndef _SV_AccObjectWinManager_HXX 38*5fdc4257SSteve Yin #include "AccObjectWinManager.hxx" 39*5fdc4257SSteve Yin #endif 40*5fdc4257SSteve Yin #include "AccEventListener.hxx" 41*5fdc4257SSteve Yin #include "AccComponentEventListener.hxx" 42*5fdc4257SSteve Yin #include "AccContainerEventListener.hxx" 43*5fdc4257SSteve Yin #include "AccDialogEventListener.hxx" 44*5fdc4257SSteve Yin #include "AccWindowEventListener.hxx" 45*5fdc4257SSteve Yin #include "AccFrameEventListener.hxx" 46*5fdc4257SSteve Yin #include "AccMenuEventListener.hxx" 47*5fdc4257SSteve Yin #include "AccObjectContainerEventListener.hxx" 48*5fdc4257SSteve Yin #include "AccParagraphEventListener.hxx" 49*5fdc4257SSteve Yin #include "AccTextComponentEventListener.hxx" 50*5fdc4257SSteve Yin #include "AccListEventListener.hxx" 51*5fdc4257SSteve Yin #include "AccTreeEventListener.hxx" 52*5fdc4257SSteve Yin #include "AccTableEventListener.hxx" 53*5fdc4257SSteve Yin #include "AccObject.hxx" 54*5fdc4257SSteve Yin #include "AccessibleEventId.h" 55*5fdc4257SSteve Yin #include "AccessibleApplication.h" 56*5fdc4257SSteve Yin #include "AccessibleApplication_i.c" 57*5fdc4257SSteve Yin #include "unomsaaevent.hxx" 58*5fdc4257SSteve Yin #include "checkmt.hxx" 59*5fdc4257SSteve Yin 60*5fdc4257SSteve Yin #define CHILDID_SELF 0 61*5fdc4257SSteve Yin 62*5fdc4257SSteve Yin 63*5fdc4257SSteve Yin using namespace std; 64*5fdc4257SSteve Yin using namespace com::sun::star::accessibility; 65*5fdc4257SSteve Yin using namespace com::sun::star::uno; 66*5fdc4257SSteve Yin 67*5fdc4257SSteve Yin AccObjectWinManager* g_acc_manager = NULL; 68*5fdc4257SSteve Yin AccObjectWinManager* AccObjectWinManager::me = NULL; 69*5fdc4257SSteve Yin 70*5fdc4257SSteve Yin /** 71*5fdc4257SSteve Yin * Implementation of interface XMSAAService's method getAccObjectPtr() that return the 72*5fdc4257SSteve Yin * corresponding com interface with the MS event. 73*5fdc4257SSteve Yin * 74*5fdc4257SSteve Yin * @param 75*5fdc4257SSteve Yin * @return Com interface. 76*5fdc4257SSteve Yin */ 77*5fdc4257SSteve Yin long GetMSComPtr(long hWnd, long lParam, long wParam) 78*5fdc4257SSteve Yin { 79*5fdc4257SSteve Yin if( g_acc_manager ) 80*5fdc4257SSteve Yin return (long)g_acc_manager->Get_ToATInterface(HWND((void*)hWnd),lParam,wParam ); 81*5fdc4257SSteve Yin return NULL; 82*5fdc4257SSteve Yin } 83*5fdc4257SSteve Yin 84*5fdc4257SSteve Yin /** 85*5fdc4257SSteve Yin * constructor 86*5fdc4257SSteve Yin * @param Agent The agent kept in all listeners,it's the sole interface by which 87*5fdc4257SSteve Yin * listener communicate with windows manager. 88*5fdc4257SSteve Yin * pEventAccObj The present event accobject. 89*5fdc4257SSteve Yin * oldFocus Last focused object. 90*5fdc4257SSteve Yin * isSelectionChanged flag that identifies if there is selection changed. 91*5fdc4257SSteve Yin * selectionChildObj Selected object. 92*5fdc4257SSteve Yin * dChildID Chile resource ID. 93*5fdc4257SSteve Yin * hAcc TopWindowHWND 94*5fdc4257SSteve Yin * @return 95*5fdc4257SSteve Yin */ 96*5fdc4257SSteve Yin AccObjectWinManager::AccObjectWinManager( AccObjectManagerAgent* Agent ): 97*5fdc4257SSteve Yin pAgent( Agent ), 98*5fdc4257SSteve Yin oldFocus( NULL ) 99*5fdc4257SSteve Yin { 100*5fdc4257SSteve Yin m_bBridgeRegistered =IsBridgeRegisteredAcc(); 101*5fdc4257SSteve Yin } 102*5fdc4257SSteve Yin 103*5fdc4257SSteve Yin /** 104*5fdc4257SSteve Yin * Public method to produce manager 105*5fdc4257SSteve Yin * @param Agent The agent kept in all listeners,it's the sole interface by which 106*5fdc4257SSteve Yin * listener communicate with windows manager. 107*5fdc4257SSteve Yin * @return 108*5fdc4257SSteve Yin */ 109*5fdc4257SSteve Yin AccObjectWinManager* AccObjectWinManager::CreateAccObjectWinManagerInstance( AccObjectManagerAgent* Agent ) 110*5fdc4257SSteve Yin { 111*5fdc4257SSteve Yin if( me == NULL ) 112*5fdc4257SSteve Yin { 113*5fdc4257SSteve Yin me = new AccObjectWinManager( Agent ); 114*5fdc4257SSteve Yin g_acc_manager = me; 115*5fdc4257SSteve Yin return me; 116*5fdc4257SSteve Yin } 117*5fdc4257SSteve Yin 118*5fdc4257SSteve Yin return me; 119*5fdc4257SSteve Yin } 120*5fdc4257SSteve Yin 121*5fdc4257SSteve Yin 122*5fdc4257SSteve Yin /** 123*5fdc4257SSteve Yin * Destructor,clear all resource. 124*5fdc4257SSteve Yin * @param 125*5fdc4257SSteve Yin * @return 126*5fdc4257SSteve Yin */ 127*5fdc4257SSteve Yin AccObjectWinManager::~AccObjectWinManager() 128*5fdc4257SSteve Yin { 129*5fdc4257SSteve Yin XIdAccList.clear(); 130*5fdc4257SSteve Yin HwndXAcc.clear(); 131*5fdc4257SSteve Yin XResIdAccList.clear(); 132*5fdc4257SSteve Yin XHWNDDocList.clear(); 133*5fdc4257SSteve Yin #ifdef ACC_DEBUG 134*5fdc4257SSteve Yin 135*5fdc4257SSteve Yin fclose( pFile ); 136*5fdc4257SSteve Yin #endif 137*5fdc4257SSteve Yin } 138*5fdc4257SSteve Yin 139*5fdc4257SSteve Yin 140*5fdc4257SSteve Yin /** 141*5fdc4257SSteve Yin * Get valid com object interface when notifying some MSAA event 142*5fdc4257SSteve Yin * @param pWND The top window handle that contains that event control. 143*5fdc4257SSteve Yin * @param wParam Windows system interface. 144*5fdc4257SSteve Yin * @return Com interface with event. 145*5fdc4257SSteve Yin */ 146*5fdc4257SSteve Yin 147*5fdc4257SSteve Yin long AccObjectWinManager::Get_ToATInterface( HWND hWnd, long lParam, long wParam) 148*5fdc4257SSteve Yin { 149*5fdc4257SSteve Yin vos::OGuard localGuard(maATInterfaceMutex);// 150*5fdc4257SSteve Yin 151*5fdc4257SSteve Yin IMAccessible* pRetIMAcc = NULL; 152*5fdc4257SSteve Yin 153*5fdc4257SSteve Yin if(lParam == OBJID_CLIENT ) 154*5fdc4257SSteve Yin { 155*5fdc4257SSteve Yin AccObject* topWindowAccObj = GetTopWindowAccObj(hWnd); 156*5fdc4257SSteve Yin if(topWindowAccObj) 157*5fdc4257SSteve Yin { 158*5fdc4257SSteve Yin pRetIMAcc = topWindowAccObj->GetIMAccessible(); 159*5fdc4257SSteve Yin if(pRetIMAcc) 160*5fdc4257SSteve Yin pRetIMAcc->AddRef();//increase COM reference count 161*5fdc4257SSteve Yin } 162*5fdc4257SSteve Yin } 163*5fdc4257SSteve Yin 164*5fdc4257SSteve Yin if ( pRetIMAcc && lParam == OBJID_CLIENT ) 165*5fdc4257SSteve Yin { 166*5fdc4257SSteve Yin IAccessible* pTemp = dynamic_cast<IAccessible*>( pRetIMAcc ); 167*5fdc4257SSteve Yin HRESULT result = LresultFromObject(IID_IAccessible, wParam, pTemp); 168*5fdc4257SSteve Yin pTemp->Release(); 169*5fdc4257SSteve Yin return result; 170*5fdc4257SSteve Yin } 171*5fdc4257SSteve Yin return 0; 172*5fdc4257SSteve Yin } 173*5fdc4257SSteve Yin 174*5fdc4257SSteve Yin /** 175*5fdc4257SSteve Yin * Search AccObject by XAccessible pointer from our container. 176*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 177*5fdc4257SSteve Yin * @return Pointer of accObject that is found. 178*5fdc4257SSteve Yin */ 179*5fdc4257SSteve Yin AccObject* AccObjectWinManager::GetAccObjByXAcc( XAccessible* pXAcc) 180*5fdc4257SSteve Yin { 181*5fdc4257SSteve Yin if( pXAcc == NULL) 182*5fdc4257SSteve Yin return NULL; 183*5fdc4257SSteve Yin 184*5fdc4257SSteve Yin XIdToAccObjHash::iterator pIndTemp = XIdAccList.find( (void*)pXAcc ); 185*5fdc4257SSteve Yin if ( pIndTemp == XIdAccList.end() ) 186*5fdc4257SSteve Yin return NULL; 187*5fdc4257SSteve Yin 188*5fdc4257SSteve Yin return &(pIndTemp->second); 189*5fdc4257SSteve Yin } 190*5fdc4257SSteve Yin 191*5fdc4257SSteve Yin /** 192*5fdc4257SSteve Yin * Search XAccessible by AccObject pointer from our container. 193*5fdc4257SSteve Yin * @param pAccObj AccObject pointer. 194*5fdc4257SSteve Yin * @return Pointer of XAccessible Interface. 195*5fdc4257SSteve Yin */ 196*5fdc4257SSteve Yin XAccessible* AccObjectWinManager::GetXAccByAccObj(AccObject* pAccObj) 197*5fdc4257SSteve Yin { 198*5fdc4257SSteve Yin XIdToAccObjHash::iterator iter = XIdAccList.begin(); 199*5fdc4257SSteve Yin while(iter!=XIdAccList.end()) 200*5fdc4257SSteve Yin { 201*5fdc4257SSteve Yin AccObject* tmp = &(iter->second); 202*5fdc4257SSteve Yin if(tmp== pAccObj) 203*5fdc4257SSteve Yin return (XAccessible*)(iter->first); 204*5fdc4257SSteve Yin iter++; 205*5fdc4257SSteve Yin } 206*5fdc4257SSteve Yin return NULL; 207*5fdc4257SSteve Yin } 208*5fdc4257SSteve Yin 209*5fdc4257SSteve Yin /** 210*5fdc4257SSteve Yin * get acc object of top window by its handle 211*5fdc4257SSteve Yin * @param hWnd, top window handle 212*5fdc4257SSteve Yin * @return pointer to AccObject 213*5fdc4257SSteve Yin */ 214*5fdc4257SSteve Yin AccObject* AccObjectWinManager::GetTopWindowAccObj(HWND hWnd) 215*5fdc4257SSteve Yin { 216*5fdc4257SSteve Yin XHWNDToXAccHash::iterator iterResult =HwndXAcc.find(hWnd); 217*5fdc4257SSteve Yin if(iterResult == HwndXAcc.end()) 218*5fdc4257SSteve Yin return NULL; 219*5fdc4257SSteve Yin XAccessible* pXAcc = (XAccessible*)(iterResult->second); 220*5fdc4257SSteve Yin return GetAccObjByXAcc(pXAcc); 221*5fdc4257SSteve Yin } 222*5fdc4257SSteve Yin 223*5fdc4257SSteve Yin /** 224*5fdc4257SSteve Yin * Simulate MSAA event via XAccessible interface and event type. 225*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 226*5fdc4257SSteve Yin * @param state Customize Interface 227*5fdc4257SSteve Yin * @return The terminate result that identifies if the call is successful. 228*5fdc4257SSteve Yin */ 229*5fdc4257SSteve Yin sal_Bool AccObjectWinManager::NotifyAccEvent(XAccessible* pXAcc,short state) 230*5fdc4257SSteve Yin { 231*5fdc4257SSteve Yin vos::OGuard aGuard(aNotifyMutex); 232*5fdc4257SSteve Yin 233*5fdc4257SSteve Yin if (!m_bBridgeRegistered) 234*5fdc4257SSteve Yin { 235*5fdc4257SSteve Yin return sal_False; 236*5fdc4257SSteve Yin } 237*5fdc4257SSteve Yin if (!IsInMainThread()) 238*5fdc4257SSteve Yin { 239*5fdc4257SSteve Yin return sal_False; 240*5fdc4257SSteve Yin } 241*5fdc4257SSteve Yin 242*5fdc4257SSteve Yin Reference< XAccessibleContext > pRContext; 243*5fdc4257SSteve Yin 244*5fdc4257SSteve Yin if( pXAcc == NULL) 245*5fdc4257SSteve Yin return sal_False; 246*5fdc4257SSteve Yin 247*5fdc4257SSteve Yin 248*5fdc4257SSteve Yin pRContext = pXAcc->getAccessibleContext(); 249*5fdc4257SSteve Yin if( !pRContext.is() ) 250*5fdc4257SSteve Yin return sal_False; 251*5fdc4257SSteve Yin 252*5fdc4257SSteve Yin 253*5fdc4257SSteve Yin AccObject* selfAccObj= GetAccObjByXAcc(pXAcc); 254*5fdc4257SSteve Yin 255*5fdc4257SSteve Yin if(selfAccObj==NULL) 256*5fdc4257SSteve Yin return sal_False; 257*5fdc4257SSteve Yin 258*5fdc4257SSteve Yin int selectNum =0; 259*5fdc4257SSteve Yin 260*5fdc4257SSteve Yin long dChildID = selfAccObj->GetResID(); 261*5fdc4257SSteve Yin HWND hAcc = selfAccObj->GetParentHWND(); 262*5fdc4257SSteve Yin 263*5fdc4257SSteve Yin switch(state) 264*5fdc4257SSteve Yin { 265*5fdc4257SSteve Yin case UM_EVENT_STATE_FOCUSED: 266*5fdc4257SSteve Yin { 267*5fdc4257SSteve Yin UpdateAccFocus(pXAcc); 268*5fdc4257SSteve Yin if( selfAccObj ) 269*5fdc4257SSteve Yin selfAccObj->UpdateDefaultAction( ); 270*5fdc4257SSteve Yin UpdateValue(pXAcc); 271*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_FOCUS,hAcc, OBJID_CLIENT,dChildID ); 272*5fdc4257SSteve Yin break; 273*5fdc4257SSteve Yin } 274*5fdc4257SSteve Yin case UM_EVENT_STATE_BUSY: 275*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_STATECHANGE,hAcc, OBJID_CLIENT,dChildID ); 276*5fdc4257SSteve Yin break; 277*5fdc4257SSteve Yin case UM_EVENT_STATE_CHECKED: 278*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_STATECHANGE,hAcc, OBJID_CLIENT,dChildID ); 279*5fdc4257SSteve Yin break; 280*5fdc4257SSteve Yin case UM_EVENT_STATE_PRESSED: 281*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_STATECHANGE,hAcc, OBJID_CLIENT,dChildID ); 282*5fdc4257SSteve Yin break; 283*5fdc4257SSteve Yin 284*5fdc4257SSteve Yin //Removed fire out selected event 285*5fdc4257SSteve Yin //case UM_EVENT_STATE_SELECTED: 286*5fdc4257SSteve Yin // NotifyWinEvent( EVENT_OBJECT_STATECHANGE,hAcc, OBJID_CLIENT,dChildID ); 287*5fdc4257SSteve Yin // break; 288*5fdc4257SSteve Yin case UM_EVENT_STATE_ARMED: 289*5fdc4257SSteve Yin UpdateAccFocus(pXAcc); 290*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_FOCUS,hAcc, OBJID_CLIENT,dChildID ); 291*5fdc4257SSteve Yin break; 292*5fdc4257SSteve Yin case UM_EVENT_MENU_START: 293*5fdc4257SSteve Yin NotifyWinEvent( EVENT_SYSTEM_MENUSTART,hAcc, OBJID_CLIENT,dChildID ); 294*5fdc4257SSteve Yin break; 295*5fdc4257SSteve Yin case UM_EVENT_MENU_END: 296*5fdc4257SSteve Yin NotifyWinEvent( EVENT_SYSTEM_MENUEND,hAcc, OBJID_CLIENT,dChildID ); 297*5fdc4257SSteve Yin break; 298*5fdc4257SSteve Yin case UM_EVENT_MENUPOPUPSTART: 299*5fdc4257SSteve Yin NotifyWinEvent( EVENT_SYSTEM_MENUPOPUPSTART,hAcc, OBJID_CLIENT,dChildID ); 300*5fdc4257SSteve Yin break; 301*5fdc4257SSteve Yin case UM_EVENT_MENUPOPUPEND: 302*5fdc4257SSteve Yin NotifyWinEvent( EVENT_SYSTEM_MENUPOPUPEND,hAcc, OBJID_CLIENT,dChildID ); 303*5fdc4257SSteve Yin break; 304*5fdc4257SSteve Yin case UM_EVENT_SELECTION_CHANGED: 305*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_SELECTION,hAcc, OBJID_CLIENT,dChildID ); 306*5fdc4257SSteve Yin break; 307*5fdc4257SSteve Yin case UM_EVENT_SELECTION_CHANGED_ADD: 308*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_SELECTIONADD,hAcc, OBJID_CLIENT,dChildID ); 309*5fdc4257SSteve Yin break; 310*5fdc4257SSteve Yin case UM_EVENT_SELECTION_CHANGED_REMOVE: 311*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_SELECTIONREMOVE,hAcc, OBJID_CLIENT,dChildID ); 312*5fdc4257SSteve Yin break; 313*5fdc4257SSteve Yin case UM_EVENT_SELECTION_CHANGED_WITHIN: 314*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_SELECTIONWITHIN,hAcc, OBJID_CLIENT,dChildID ); 315*5fdc4257SSteve Yin break; 316*5fdc4257SSteve Yin case UM_EVENT_OBJECT_VALUECHANGE: 317*5fdc4257SSteve Yin UpdateValue(pXAcc); 318*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_VALUECHANGE,hAcc, OBJID_CLIENT,dChildID ); 319*5fdc4257SSteve Yin break; 320*5fdc4257SSteve Yin case UM_EVENT_OBJECT_NAMECHANGE: 321*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_NAMECHANGE,hAcc, OBJID_CLIENT,dChildID ); 322*5fdc4257SSteve Yin break; 323*5fdc4257SSteve Yin case UM_EVENT_OBJECT_DESCRIPTIONCHANGE: 324*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_DESCRIPTIONCHANGE,hAcc, OBJID_CLIENT,dChildID ); 325*5fdc4257SSteve Yin break; 326*5fdc4257SSteve Yin case UM_EVENT_OBJECT_DEFACTIONCHANGE: 327*5fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_ACTION_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 328*5fdc4257SSteve Yin break; 329*5fdc4257SSteve Yin case UM_EVENT_OBJECT_CARETCHANGE: 330*5fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TEXT_CARET_MOVED,hAcc, OBJID_CLIENT,dChildID ); 331*5fdc4257SSteve Yin break; 332*5fdc4257SSteve Yin case UM_EVENT_OBJECT_TEXTCHANGE: 333*5fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TEXT_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 334*5fdc4257SSteve Yin break; 335*5fdc4257SSteve Yin case UM_EVENT_ACTIVE_DESCENDANT_CHANGED: 336*5fdc4257SSteve Yin UpdateAccFocus(pXAcc); 337*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_FOCUS,hAcc, OBJID_CLIENT,dChildID ); 338*5fdc4257SSteve Yin break; 339*5fdc4257SSteve Yin case UM_EVENT_BOUNDRECT_CHANGED: 340*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_LOCATIONCHANGE,hAcc, OBJID_CLIENT,dChildID ); 341*5fdc4257SSteve Yin break; 342*5fdc4257SSteve Yin case UM_EVENT_VISIBLE_DATA_CHANGED: 343*5fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_VISIBLE_DATA_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 344*5fdc4257SSteve Yin break; 345*5fdc4257SSteve Yin case UM_EVENT_SHOW : 346*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_SHOW,hAcc, OBJID_CLIENT,dChildID ); 347*5fdc4257SSteve Yin NotifyWinEvent( EVENT_SYSTEM_FOREGROUND,hAcc, OBJID_CLIENT,dChildID ); 348*5fdc4257SSteve Yin break; 349*5fdc4257SSteve Yin case UM_EVENT_TABLE_CAPTION_CHANGED: 350*5fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TABLE_CAPTION_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 351*5fdc4257SSteve Yin break; 352*5fdc4257SSteve Yin case UM_EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED: 353*5fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 354*5fdc4257SSteve Yin break; 355*5fdc4257SSteve Yin case UM_EVENT_TABLE_COLUMN_HEADER_CHANGED: 356*5fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TABLE_COLUMN_HEADER_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 357*5fdc4257SSteve Yin break; 358*5fdc4257SSteve Yin case UM_EVENT_TABLE_MODEL_CHANGED: 359*5fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TABLE_MODEL_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 360*5fdc4257SSteve Yin break; 361*5fdc4257SSteve Yin case UM_EVENT_TABLE_ROW_HEADER_CHANGED: 362*5fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TABLE_ROW_HEADER_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 363*5fdc4257SSteve Yin break; 364*5fdc4257SSteve Yin case UM_EVENT_TABLE_SUMMARY_CHANGED: 365*5fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TABLE_SUMMARY_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 366*5fdc4257SSteve Yin break; 367*5fdc4257SSteve Yin case UM_EVENT_TABLE_ROW_DESCRIPTION_CHANGED: 368*5fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TABLE_ROW_DESCRIPTION_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 369*5fdc4257SSteve Yin break; 370*5fdc4257SSteve Yin case UM_EVENT_OBJECT_REORDER: 371*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_REORDER,hAcc, OBJID_CLIENT,dChildID ); 372*5fdc4257SSteve Yin break; 373*5fdc4257SSteve Yin case UM_EVENT_PAGE_CHANGED: 374*5fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_PAGE_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 375*5fdc4257SSteve Yin break; 376*5fdc4257SSteve Yin case UM_EVENT_CHILD_REMOVED: 377*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_DESTROY,hAcc, OBJID_CLIENT,dChildID ); 378*5fdc4257SSteve Yin break; 379*5fdc4257SSteve Yin case UM_EVENT_CHILD_ADDED: 380*5fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_CREATE ,hAcc, OBJID_CLIENT,dChildID ); 381*5fdc4257SSteve Yin break; 382*5fdc4257SSteve Yin case UM_EVENT_OBJECT_PAGECHANGED: 383*5fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_PAGE_CHANGED ,hAcc, OBJID_CLIENT,dChildID ); 384*5fdc4257SSteve Yin break; 385*5fdc4257SSteve Yin case UM_EVENT_TEXT_SELECTION_CHANGED: 386*5fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TEXT_SELECTION_CHANGED ,hAcc, OBJID_CLIENT,dChildID ); 387*5fdc4257SSteve Yin break; 388*5fdc4257SSteve Yin case UM_EVENT_SECTION_CHANGED: 389*5fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_SECTION_CHANGED ,hAcc, OBJID_CLIENT,dChildID ); 390*5fdc4257SSteve Yin break; 391*5fdc4257SSteve Yin case UM_EVENT_COLUMN_CHANGED: 392*5fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TEXT_COLUMN_CHANGED ,hAcc, OBJID_CLIENT,dChildID ); 393*5fdc4257SSteve Yin break; 394*5fdc4257SSteve Yin default: 395*5fdc4257SSteve Yin break; 396*5fdc4257SSteve Yin } 397*5fdc4257SSteve Yin 398*5fdc4257SSteve Yin return sal_True; 399*5fdc4257SSteve Yin } 400*5fdc4257SSteve Yin 401*5fdc4257SSteve Yin /** 402*5fdc4257SSteve Yin * Get Parent XAccessible interface by XAccessible interface. 403*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 404*5fdc4257SSteve Yin * @return Parent XAccessible interface. 405*5fdc4257SSteve Yin */ 406*5fdc4257SSteve Yin XAccessible* AccObjectWinManager::GetParentXAccessible( XAccessible* pXAcc ) 407*5fdc4257SSteve Yin { 408*5fdc4257SSteve Yin AccObject* pObj= GetAccObjByXAcc(pXAcc); 409*5fdc4257SSteve Yin if( pObj ==NULL ) 410*5fdc4257SSteve Yin return NULL; 411*5fdc4257SSteve Yin if(pObj->GetParentObj()) 412*5fdc4257SSteve Yin { 413*5fdc4257SSteve Yin pObj = pObj->GetParentObj(); 414*5fdc4257SSteve Yin return pObj->GetXAccessible().get(); 415*5fdc4257SSteve Yin } 416*5fdc4257SSteve Yin return NULL; 417*5fdc4257SSteve Yin } 418*5fdc4257SSteve Yin 419*5fdc4257SSteve Yin /** 420*5fdc4257SSteve Yin * Get Parent role by XAccessible interface. 421*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 422*5fdc4257SSteve Yin * @return Parent role. 423*5fdc4257SSteve Yin */ 424*5fdc4257SSteve Yin short AccObjectWinManager::GetParentRole( XAccessible* pXAcc ) 425*5fdc4257SSteve Yin { 426*5fdc4257SSteve Yin AccObject* pObj= GetAccObjByXAcc(pXAcc); 427*5fdc4257SSteve Yin if( pObj ==NULL ) 428*5fdc4257SSteve Yin return -1; 429*5fdc4257SSteve Yin if(pObj->GetParentObj()) 430*5fdc4257SSteve Yin { 431*5fdc4257SSteve Yin pObj = pObj->GetParentObj(); 432*5fdc4257SSteve Yin if(pObj->GetXAccessible().is()) 433*5fdc4257SSteve Yin { 434*5fdc4257SSteve Yin XAccessible* pXAcc = pObj->GetXAccessible().get(); 435*5fdc4257SSteve Yin Reference< XAccessibleContext > pRContext = pXAcc->getAccessibleContext(); 436*5fdc4257SSteve Yin if(pRContext.is()) 437*5fdc4257SSteve Yin return pRContext->getAccessibleRole(); 438*5fdc4257SSteve Yin } 439*5fdc4257SSteve Yin } 440*5fdc4257SSteve Yin return -1; 441*5fdc4257SSteve Yin } 442*5fdc4257SSteve Yin 443*5fdc4257SSteve Yin /** 444*5fdc4257SSteve Yin * Update focus objcet by new focused XAccessible interface. 445*5fdc4257SSteve Yin * @param newFocus New XAccessible interface that gets focus. 446*5fdc4257SSteve Yin * @return 447*5fdc4257SSteve Yin */ 448*5fdc4257SSteve Yin void AccObjectWinManager::UpdateAccFocus(XAccessible* newFocus) 449*5fdc4257SSteve Yin { 450*5fdc4257SSteve Yin AccObject* pAccObjNew = GetAccObjByXAcc(newFocus); 451*5fdc4257SSteve Yin if(pAccObjNew) 452*5fdc4257SSteve Yin { 453*5fdc4257SSteve Yin AccObject* pAccObjOld = GetAccObjByXAcc(oldFocus); 454*5fdc4257SSteve Yin oldFocus = newFocus; 455*5fdc4257SSteve Yin pAccObjNew->setFocus(); 456*5fdc4257SSteve Yin //if old == new, the pAccObjNew will be without focused state 457*5fdc4257SSteve Yin if (pAccObjOld && pAccObjOld != pAccObjNew) 458*5fdc4257SSteve Yin pAccObjOld->unsetFocus(); 459*5fdc4257SSteve Yin } 460*5fdc4257SSteve Yin } 461*5fdc4257SSteve Yin 462*5fdc4257SSteve Yin /** 463*5fdc4257SSteve Yin * Update selected objcet by new focused XAccessible interface. 464*5fdc4257SSteve Yin * @param pXAcc XAccessible interface that has selected child changed. 465*5fdc4257SSteve Yin * @return Selected children count. 466*5fdc4257SSteve Yin */ 467*5fdc4257SSteve Yin int AccObjectWinManager::UpdateAccSelection(XAccessible* pXAcc) 468*5fdc4257SSteve Yin { 469*5fdc4257SSteve Yin XAccessibleSelection* pSelection = NULL; 470*5fdc4257SSteve Yin Reference< XAccessibleContext > pRContext; 471*5fdc4257SSteve Yin 472*5fdc4257SSteve Yin if( pXAcc == NULL) 473*5fdc4257SSteve Yin return sal_False; 474*5fdc4257SSteve Yin 475*5fdc4257SSteve Yin pRContext = pXAcc->getAccessibleContext(); 476*5fdc4257SSteve Yin if( !pRContext.is() ) 477*5fdc4257SSteve Yin return sal_False; 478*5fdc4257SSteve Yin 479*5fdc4257SSteve Yin Reference< XAccessibleSelection > pRSelection(pRContext,UNO_QUERY); 480*5fdc4257SSteve Yin if( !pRSelection.is() ) 481*5fdc4257SSteve Yin return sal_False; 482*5fdc4257SSteve Yin 483*5fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc(pXAcc); 484*5fdc4257SSteve Yin if(pAccObj==NULL) 485*5fdc4257SSteve Yin return sal_False; 486*5fdc4257SSteve Yin 487*5fdc4257SSteve Yin Reference<XAccessible> pRChild = NULL; 488*5fdc4257SSteve Yin AccObject* pAccChildObj = NULL; 489*5fdc4257SSteve Yin int selectNum= pRSelection->getSelectedAccessibleChildCount(); 490*5fdc4257SSteve Yin 491*5fdc4257SSteve Yin IAccSelectionList oldSelection = pAccObj->GetSelection(); 492*5fdc4257SSteve Yin 493*5fdc4257SSteve Yin if(selectNum > 4)//for selected. 494*5fdc4257SSteve Yin return selectNum; 495*5fdc4257SSteve Yin if(selectNum == 1 && oldSelection.size() == 0) 496*5fdc4257SSteve Yin return 1; 497*5fdc4257SSteve Yin 498*5fdc4257SSteve Yin for (int i=0;i<selectNum;i++) 499*5fdc4257SSteve Yin { 500*5fdc4257SSteve Yin pRChild = pRSelection->getSelectedAccessibleChild(i); 501*5fdc4257SSteve Yin if(!pRChild.is()) 502*5fdc4257SSteve Yin { 503*5fdc4257SSteve Yin continue; 504*5fdc4257SSteve Yin } 505*5fdc4257SSteve Yin Reference<XAccessibleContext> pRChildContext = pRChild->getAccessibleContext(); 506*5fdc4257SSteve Yin if(!pRChildContext.is()) 507*5fdc4257SSteve Yin { 508*5fdc4257SSteve Yin continue; 509*5fdc4257SSteve Yin } 510*5fdc4257SSteve Yin long index = pRChildContext->getAccessibleIndexInParent(); 511*5fdc4257SSteve Yin IAccSelectionList::iterator temp = oldSelection.find(index); 512*5fdc4257SSteve Yin if ( temp != oldSelection.end() ) 513*5fdc4257SSteve Yin { 514*5fdc4257SSteve Yin oldSelection.erase(index); 515*5fdc4257SSteve Yin continue; 516*5fdc4257SSteve Yin } 517*5fdc4257SSteve Yin 518*5fdc4257SSteve Yin pAccChildObj = NULL; 519*5fdc4257SSteve Yin pAccChildObj = GetAccObjByXAcc(pRChild.get()); 520*5fdc4257SSteve Yin if(!pAccChildObj) 521*5fdc4257SSteve Yin { 522*5fdc4257SSteve Yin InsertAccObj(pRChild.get(), pXAcc,pAccObj->GetParentHWND()); 523*5fdc4257SSteve Yin pAccChildObj = GetAccObjByXAcc(pRChild.get()); 524*5fdc4257SSteve Yin } 525*5fdc4257SSteve Yin 526*5fdc4257SSteve Yin pAccObj->AddSelect(index, pAccChildObj); 527*5fdc4257SSteve Yin 528*5fdc4257SSteve Yin if(pAccChildObj != NULL) 529*5fdc4257SSteve Yin NotifyWinEvent(EVENT_OBJECT_SELECTIONADD,pAccObj->GetParentHWND(), OBJID_CLIENT,pAccChildObj->GetResID()); 530*5fdc4257SSteve Yin } 531*5fdc4257SSteve Yin 532*5fdc4257SSteve Yin IAccSelectionList::iterator iter = oldSelection.begin(); 533*5fdc4257SSteve Yin while(iter!=oldSelection.end()) 534*5fdc4257SSteve Yin { 535*5fdc4257SSteve Yin pAccObj->GetSelection().erase(iter->first); 536*5fdc4257SSteve Yin pAccChildObj = (AccObject*)(iter->second); 537*5fdc4257SSteve Yin if(pAccChildObj != NULL) 538*5fdc4257SSteve Yin NotifyWinEvent(EVENT_OBJECT_SELECTIONREMOVE,pAccObj->GetParentHWND(), OBJID_CLIENT,pAccChildObj->GetResID()); 539*5fdc4257SSteve Yin iter++; 540*5fdc4257SSteve Yin } 541*5fdc4257SSteve Yin return 0; 542*5fdc4257SSteve Yin 543*5fdc4257SSteve Yin } 544*5fdc4257SSteve Yin 545*5fdc4257SSteve Yin /** 546*5fdc4257SSteve Yin * Delete child element from children list. 547*5fdc4257SSteve Yin * @param pObj Child element that should be removed from parant child list. 548*5fdc4257SSteve Yin * @return 549*5fdc4257SSteve Yin */ 550*5fdc4257SSteve Yin void AccObjectWinManager::DeleteAccChildNode( AccObject* pObj ) 551*5fdc4257SSteve Yin { 552*5fdc4257SSteve Yin AccObject *parentAccObj = pObj->GetParentObj(); 553*5fdc4257SSteve Yin if( parentAccObj ) 554*5fdc4257SSteve Yin parentAccObj->DeleteChild( pObj ); 555*5fdc4257SSteve Yin } 556*5fdc4257SSteve Yin 557*5fdc4257SSteve Yin /** 558*5fdc4257SSteve Yin * Delete XAccessible items in top window handle hashtable 559*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 560*5fdc4257SSteve Yin * @return 561*5fdc4257SSteve Yin */ 562*5fdc4257SSteve Yin void AccObjectWinManager::DeleteFromHwndXAcc(XAccessible* pXAcc ) 563*5fdc4257SSteve Yin { 564*5fdc4257SSteve Yin XHWNDToXAccHash::iterator iter = HwndXAcc.begin(); 565*5fdc4257SSteve Yin while(iter!=HwndXAcc.end()) 566*5fdc4257SSteve Yin { 567*5fdc4257SSteve Yin if(iter->second == pXAcc ) 568*5fdc4257SSteve Yin { 569*5fdc4257SSteve Yin HwndXAcc.erase(iter); 570*5fdc4257SSteve Yin return; 571*5fdc4257SSteve Yin } 572*5fdc4257SSteve Yin iter++; 573*5fdc4257SSteve Yin } 574*5fdc4257SSteve Yin } 575*5fdc4257SSteve Yin 576*5fdc4257SSteve Yin /** 577*5fdc4257SSteve Yin * Delete Delete all children with the tree root of XAccessible pointer 578*5fdc4257SSteve Yin * @param pXAcc Tree root XAccessible interface. 579*5fdc4257SSteve Yin * @return 580*5fdc4257SSteve Yin */ 581*5fdc4257SSteve Yin void AccObjectWinManager::DeleteChildrenAccObj(XAccessible* pXAcc) 582*5fdc4257SSteve Yin { 583*5fdc4257SSteve Yin vos::OGuard aGuard( aDeleteMutex ); 584*5fdc4257SSteve Yin AccObject* currentObj=NULL; 585*5fdc4257SSteve Yin AccObject* childObj=NULL; 586*5fdc4257SSteve Yin XAccessible* pTmpXAcc=NULL; 587*5fdc4257SSteve Yin 588*5fdc4257SSteve Yin currentObj = GetAccObjByXAcc( pXAcc); 589*5fdc4257SSteve Yin if(currentObj) 590*5fdc4257SSteve Yin { 591*5fdc4257SSteve Yin childObj = currentObj->NextChild(); 592*5fdc4257SSteve Yin while(childObj) 593*5fdc4257SSteve Yin { 594*5fdc4257SSteve Yin pTmpXAcc = GetXAccByAccObj(childObj); 595*5fdc4257SSteve Yin if(pTmpXAcc) 596*5fdc4257SSteve Yin { 597*5fdc4257SSteve Yin DeleteChildrenAccObj(pTmpXAcc); 598*5fdc4257SSteve Yin DeleteAccObj(pTmpXAcc); 599*5fdc4257SSteve Yin } 600*5fdc4257SSteve Yin childObj = currentObj->NextChild(); 601*5fdc4257SSteve Yin } 602*5fdc4257SSteve Yin } 603*5fdc4257SSteve Yin } 604*5fdc4257SSteve Yin 605*5fdc4257SSteve Yin /** 606*5fdc4257SSteve Yin * Delete Delete Acc object self. 607*5fdc4257SSteve Yin * @param pXAcc The XAccessible interface. 608*5fdc4257SSteve Yin * @return 609*5fdc4257SSteve Yin */ 610*5fdc4257SSteve Yin void AccObjectWinManager::DeleteAccObj( XAccessible* pXAcc ) 611*5fdc4257SSteve Yin { 612*5fdc4257SSteve Yin vos::OGuard aGuard( aDeleteMutex ); 613*5fdc4257SSteve Yin if( pXAcc == NULL ) 614*5fdc4257SSteve Yin return; 615*5fdc4257SSteve Yin XIdToAccObjHash::iterator temp = XIdAccList.find(pXAcc); 616*5fdc4257SSteve Yin if( temp != XIdAccList.end() ) 617*5fdc4257SSteve Yin { 618*5fdc4257SSteve Yin ResIdGen.SetSub( temp->second.GetResID() ); 619*5fdc4257SSteve Yin } 620*5fdc4257SSteve Yin else 621*5fdc4257SSteve Yin { 622*5fdc4257SSteve Yin return; 623*5fdc4257SSteve Yin } 624*5fdc4257SSteve Yin 625*5fdc4257SSteve Yin AccObject& accObj = temp->second; 626*5fdc4257SSteve Yin DeleteAccChildNode( &accObj ); 627*5fdc4257SSteve Yin DeleteAccListener( &accObj ); 628*5fdc4257SSteve Yin if( accObj.GetIMAccessible() ) 629*5fdc4257SSteve Yin { 630*5fdc4257SSteve Yin accObj.GetIMAccessible()->Release(); 631*5fdc4257SSteve Yin } 632*5fdc4257SSteve Yin XIdAccList.erase( pXAcc ); 633*5fdc4257SSteve Yin XResIdAccList.erase( accObj.GetResID() ); 634*5fdc4257SSteve Yin DeleteFromHwndXAcc(pXAcc); 635*5fdc4257SSteve Yin } 636*5fdc4257SSteve Yin 637*5fdc4257SSteve Yin /** 638*5fdc4257SSteve Yin * Delete listener that inspects some XAccessible object 639*5fdc4257SSteve Yin * @param pAccObj Accobject pointer. 640*5fdc4257SSteve Yin * @return 641*5fdc4257SSteve Yin */ 642*5fdc4257SSteve Yin void AccObjectWinManager::DeleteAccListener( AccObject* pAccObj ) 643*5fdc4257SSteve Yin { 644*5fdc4257SSteve Yin AccEventListener* listener = pAccObj->getListener(); 645*5fdc4257SSteve Yin if( listener==NULL ) 646*5fdc4257SSteve Yin return; 647*5fdc4257SSteve Yin listener->removeMeFromBroadcaster(); 648*5fdc4257SSteve Yin pAccObj->SetListener(NULL); 649*5fdc4257SSteve Yin } 650*5fdc4257SSteve Yin 651*5fdc4257SSteve Yin /** 652*5fdc4257SSteve Yin * Generate a child ID, which is used for AT 653*5fdc4257SSteve Yin * @param 654*5fdc4257SSteve Yin * @return New resource ID. 655*5fdc4257SSteve Yin */ 656*5fdc4257SSteve Yin inline long AccObjectWinManager::ImpleGenerateResID() 657*5fdc4257SSteve Yin { 658*5fdc4257SSteve Yin return ResIdGen.GenerateNewResID(); 659*5fdc4257SSteve Yin } 660*5fdc4257SSteve Yin 661*5fdc4257SSteve Yin /** 662*5fdc4257SSteve Yin * Insert all children of the current acc object 663*5fdc4257SSteve Yin * @param pXAcc XAccessible interface 664*5fdc4257SSteve Yin * @param pWnd Top Window handle 665*5fdc4257SSteve Yin * @return The calling result. 666*5fdc4257SSteve Yin */ 667*5fdc4257SSteve Yin sal_Bool AccObjectWinManager::InsertChildrenAccObj( com::sun::star::accessibility::XAccessible* pXAcc, 668*5fdc4257SSteve Yin HWND pWnd) 669*5fdc4257SSteve Yin { 670*5fdc4257SSteve Yin if(!IsContainer(pXAcc)) 671*5fdc4257SSteve Yin return sal_False; 672*5fdc4257SSteve Yin 673*5fdc4257SSteve Yin Reference< XAccessibleContext > pRContext; 674*5fdc4257SSteve Yin 675*5fdc4257SSteve Yin if( pXAcc == NULL) 676*5fdc4257SSteve Yin return sal_False; 677*5fdc4257SSteve Yin pRContext = pXAcc->getAccessibleContext(); 678*5fdc4257SSteve Yin if( !pRContext.is() ) 679*5fdc4257SSteve Yin return sal_False; 680*5fdc4257SSteve Yin 681*5fdc4257SSteve Yin short role = pRContext->getAccessibleRole(); 682*5fdc4257SSteve Yin 683*5fdc4257SSteve Yin if(com::sun::star::accessibility::AccessibleRole::DOCUMENT == role ) 684*5fdc4257SSteve Yin { 685*5fdc4257SSteve Yin if(IsStateManageDescendant(pXAcc)) 686*5fdc4257SSteve Yin { 687*5fdc4257SSteve Yin return sal_True; 688*5fdc4257SSteve Yin } 689*5fdc4257SSteve Yin } 690*5fdc4257SSteve Yin 691*5fdc4257SSteve Yin int count = pRContext->getAccessibleChildCount(); 692*5fdc4257SSteve Yin for (int i=0;i<count;i++) 693*5fdc4257SSteve Yin { 694*5fdc4257SSteve Yin Reference<XAccessible> mxAccessible 695*5fdc4257SSteve Yin = pRContext->getAccessibleChild(i); 696*5fdc4257SSteve Yin XAccessible* mpAccessible = mxAccessible.get(); 697*5fdc4257SSteve Yin if(mpAccessible != NULL) 698*5fdc4257SSteve Yin { 699*5fdc4257SSteve Yin InsertAccObj( mpAccessible,pXAcc,pWnd ); 700*5fdc4257SSteve Yin InsertChildrenAccObj(mpAccessible,pWnd); 701*5fdc4257SSteve Yin } 702*5fdc4257SSteve Yin } 703*5fdc4257SSteve Yin 704*5fdc4257SSteve Yin return sal_True; 705*5fdc4257SSteve Yin } 706*5fdc4257SSteve Yin 707*5fdc4257SSteve Yin /** 708*5fdc4257SSteve Yin * Insert child object. 709*5fdc4257SSteve Yin * @param pCurObj The child object 710*5fdc4257SSteve Yin * @param pParentObj The parant object 711*5fdc4257SSteve Yin * @param pWnd Top window handle. 712*5fdc4257SSteve Yin * @return 713*5fdc4257SSteve Yin */ 714*5fdc4257SSteve Yin void AccObjectWinManager::InsertAccChildNode( AccObject* pCurObj, AccObject* pParentObj, HWND /* pWnd */ ) 715*5fdc4257SSteve Yin { 716*5fdc4257SSteve Yin if(pCurObj) 717*5fdc4257SSteve Yin { 718*5fdc4257SSteve Yin if(pParentObj) 719*5fdc4257SSteve Yin { 720*5fdc4257SSteve Yin pParentObj->InsertChild(pCurObj); 721*5fdc4257SSteve Yin } 722*5fdc4257SSteve Yin else 723*5fdc4257SSteve Yin { 724*5fdc4257SSteve Yin pCurObj->UpdateValidWindow(); 725*5fdc4257SSteve Yin } 726*5fdc4257SSteve Yin } 727*5fdc4257SSteve Yin } 728*5fdc4257SSteve Yin 729*5fdc4257SSteve Yin /** 730*5fdc4257SSteve Yin * Insert child object. 731*5fdc4257SSteve Yin * @param pCurObj The child object 732*5fdc4257SSteve Yin * @param pParentObj The parant object 733*5fdc4257SSteve Yin * @param pWnd Top window handle. 734*5fdc4257SSteve Yin * @return 735*5fdc4257SSteve Yin */ 736*5fdc4257SSteve Yin sal_Bool AccObjectWinManager::InsertAccObj( XAccessible* pXAcc,XAccessible* pParentXAcc,HWND pWnd ) 737*5fdc4257SSteve Yin { 738*5fdc4257SSteve Yin if (!m_bBridgeRegistered) 739*5fdc4257SSteve Yin { 740*5fdc4257SSteve Yin return sal_False; 741*5fdc4257SSteve Yin } 742*5fdc4257SSteve Yin XIdToAccObjHash::iterator itXacc = XIdAccList.find( (void*)pXAcc ); 743*5fdc4257SSteve Yin if (itXacc != XIdAccList.end() ) 744*5fdc4257SSteve Yin { 745*5fdc4257SSteve Yin short nCurRole =GetRole(pXAcc); 746*5fdc4257SSteve Yin if (AccessibleRole::SHAPE == nCurRole) 747*5fdc4257SSteve Yin { 748*5fdc4257SSteve Yin AccObject &objXacc = itXacc->second; 749*5fdc4257SSteve Yin AccObject *pObjParent = objXacc.GetParentObj(); 750*5fdc4257SSteve Yin if (pObjParent && 751*5fdc4257SSteve Yin pObjParent->GetXAccessible().is() && 752*5fdc4257SSteve Yin pObjParent->GetXAccessible().get() != pParentXAcc) 753*5fdc4257SSteve Yin { 754*5fdc4257SSteve Yin XIdToAccObjHash::iterator itXaccParent = XIdAccList.find( (void*)pParentXAcc ); 755*5fdc4257SSteve Yin if(itXaccParent != XIdAccList.end()) 756*5fdc4257SSteve Yin { 757*5fdc4257SSteve Yin objXacc.SetParentObj(&(itXaccParent->second)); 758*5fdc4257SSteve Yin } 759*5fdc4257SSteve Yin } 760*5fdc4257SSteve Yin } 761*5fdc4257SSteve Yin return sal_False; 762*5fdc4257SSteve Yin } 763*5fdc4257SSteve Yin 764*5fdc4257SSteve Yin 765*5fdc4257SSteve Yin Reference< XAccessibleContext > pRContext; 766*5fdc4257SSteve Yin 767*5fdc4257SSteve Yin if( pXAcc == NULL) 768*5fdc4257SSteve Yin return sal_False; 769*5fdc4257SSteve Yin 770*5fdc4257SSteve Yin pRContext = pXAcc->getAccessibleContext(); 771*5fdc4257SSteve Yin if( !pRContext.is() ) 772*5fdc4257SSteve Yin return sal_False; 773*5fdc4257SSteve Yin 774*5fdc4257SSteve Yin if( pWnd == NULL ) 775*5fdc4257SSteve Yin { 776*5fdc4257SSteve Yin if(pParentXAcc) 777*5fdc4257SSteve Yin { 778*5fdc4257SSteve Yin AccObject* pObj = GetAccObjByXAcc(pParentXAcc); 779*5fdc4257SSteve Yin if(pObj) 780*5fdc4257SSteve Yin pWnd = pObj->GetParentHWND(); 781*5fdc4257SSteve Yin } 782*5fdc4257SSteve Yin if( pWnd == NULL ) 783*5fdc4257SSteve Yin return sal_False; 784*5fdc4257SSteve Yin } 785*5fdc4257SSteve Yin 786*5fdc4257SSteve Yin AccObject pObj( pXAcc,pAgent ); 787*5fdc4257SSteve Yin if( pObj.GetIMAccessible() == NULL ) 788*5fdc4257SSteve Yin return sal_False; 789*5fdc4257SSteve Yin pObj.SetResID( this->ImpleGenerateResID()); 790*5fdc4257SSteve Yin pObj.SetParentHWND( pWnd ); 791*5fdc4257SSteve Yin 792*5fdc4257SSteve Yin //for file name support 793*5fdc4257SSteve Yin if ( pObj.GetRole() == DOCUMENT ) 794*5fdc4257SSteve Yin { 795*5fdc4257SSteve Yin XHWNDToDocumentHash::iterator aIter = XHWNDDocList.find( (long)pWnd ); 796*5fdc4257SSteve Yin if ( aIter != XHWNDDocList.end() ) 797*5fdc4257SSteve Yin { 798*5fdc4257SSteve Yin XHWNDDocList.erase( aIter ); 799*5fdc4257SSteve Yin } 800*5fdc4257SSteve Yin XHWNDDocList.insert( XHWNDToDocumentHash::value_type( (long)pWnd, pXAcc ) ); 801*5fdc4257SSteve Yin 802*5fdc4257SSteve Yin } 803*5fdc4257SSteve Yin //end of file name 804*5fdc4257SSteve Yin 805*5fdc4257SSteve Yin AccEventListener* listener = createAccEventListener(pXAcc, pAgent); 806*5fdc4257SSteve Yin if(listener==NULL) 807*5fdc4257SSteve Yin return sal_False; 808*5fdc4257SSteve Yin Reference<XAccessibleComponent> xComponent(pRContext,UNO_QUERY); 809*5fdc4257SSteve Yin Reference<XAccessibleEventBroadcaster> broadcaster(xComponent,UNO_QUERY); 810*5fdc4257SSteve Yin if (broadcaster.is()) 811*5fdc4257SSteve Yin { 812*5fdc4257SSteve Yin Reference <XAccessibleEventListener> pp ( 813*5fdc4257SSteve Yin static_cast< XAccessibleEventListener* >(listener),UNO_QUERY ); 814*5fdc4257SSteve Yin if(pp.is()) 815*5fdc4257SSteve Yin { 816*5fdc4257SSteve Yin broadcaster->addEventListener(pp); 817*5fdc4257SSteve Yin } 818*5fdc4257SSteve Yin else 819*5fdc4257SSteve Yin { 820*5fdc4257SSteve Yin delete listener; 821*5fdc4257SSteve Yin return sal_False; 822*5fdc4257SSteve Yin } 823*5fdc4257SSteve Yin } 824*5fdc4257SSteve Yin else 825*5fdc4257SSteve Yin return sal_False; 826*5fdc4257SSteve Yin 827*5fdc4257SSteve Yin XIdAccList.insert( XIdToAccObjHash::value_type( (void*)pXAcc, pObj )); 828*5fdc4257SSteve Yin XIdToAccObjHash::iterator pIndTemp = XIdAccList.find( (void*)pXAcc ); 829*5fdc4257SSteve Yin XResIdAccList.insert(XResIdToAccObjHash::value_type(pObj.GetResID(),&(pIndTemp->second))); 830*5fdc4257SSteve Yin 831*5fdc4257SSteve Yin AccObject* pCurObj = GetAccObjByXAcc(pXAcc); 832*5fdc4257SSteve Yin if( pCurObj ) 833*5fdc4257SSteve Yin { 834*5fdc4257SSteve Yin pCurObj->SetListener( listener ); 835*5fdc4257SSteve Yin if(listener != NULL) 836*5fdc4257SSteve Yin listener->acquire(); 837*5fdc4257SSteve Yin } 838*5fdc4257SSteve Yin 839*5fdc4257SSteve Yin AccObject* pParentObj = GetAccObjByXAcc(pParentXAcc); 840*5fdc4257SSteve Yin InsertAccChildNode(pCurObj,pParentObj,pWnd); 841*5fdc4257SSteve Yin if( pCurObj ) 842*5fdc4257SSteve Yin pCurObj->UpdateAccessibleInfoFromUnoToMSAA(); 843*5fdc4257SSteve Yin return sal_True; 844*5fdc4257SSteve Yin } 845*5fdc4257SSteve Yin 846*5fdc4257SSteve Yin 847*5fdc4257SSteve Yin /** 848*5fdc4257SSteve Yin * save the pair <topwindowhandle, XAccessible> 849*5fdc4257SSteve Yin * @param hWnd, top window handle 850*5fdc4257SSteve Yin * @param pXAcc XAccessible interface for top window 851*5fdc4257SSteve Yin * @return void 852*5fdc4257SSteve Yin */ 853*5fdc4257SSteve Yin void AccObjectWinManager::SaveTopWindowHandle(HWND hWnd, com::sun::star::accessibility::XAccessible* pXAcc) 854*5fdc4257SSteve Yin { 855*5fdc4257SSteve Yin HwndXAcc.insert( XHWNDToXAccHash::value_type( hWnd,(void*)pXAcc ) ); 856*5fdc4257SSteve Yin } 857*5fdc4257SSteve Yin 858*5fdc4257SSteve Yin 859*5fdc4257SSteve Yin /** 860*5fdc4257SSteve Yin * create the corresponding listener. 861*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 862*5fdc4257SSteve Yin * @param Agent The agent kept in all listeners,it's the sole interface by which 863*5fdc4257SSteve Yin * listener communicate with windows manager. 864*5fdc4257SSteve Yin * @return 865*5fdc4257SSteve Yin */ 866*5fdc4257SSteve Yin AccEventListener* AccObjectWinManager::createAccEventListener(XAccessible* pXAcc, AccObjectManagerAgent* /* Agent */ ) 867*5fdc4257SSteve Yin { 868*5fdc4257SSteve Yin AccEventListener* listener = NULL; 869*5fdc4257SSteve Yin Reference<XAccessibleContext> xContext(pXAcc->getAccessibleContext(),UNO_QUERY); 870*5fdc4257SSteve Yin if(xContext.is()) 871*5fdc4257SSteve Yin { 872*5fdc4257SSteve Yin switch( xContext->getAccessibleRole() ) 873*5fdc4257SSteve Yin { 874*5fdc4257SSteve Yin case /*AccessibleRole::*/DIALOG: 875*5fdc4257SSteve Yin listener = new AccDialogEventListener(pXAcc,pAgent); 876*5fdc4257SSteve Yin break; 877*5fdc4257SSteve Yin case /*AccessibleRole::*/FRAME: 878*5fdc4257SSteve Yin listener = new AccFrameEventListener(pXAcc,pAgent); 879*5fdc4257SSteve Yin break; 880*5fdc4257SSteve Yin case /*AccessibleRole::*/WINDOW: 881*5fdc4257SSteve Yin listener = new AccWindowEventListener(pXAcc,pAgent); 882*5fdc4257SSteve Yin break; 883*5fdc4257SSteve Yin case /*AccessibleRole::*/ROOT_PANE: 884*5fdc4257SSteve Yin listener = new AccFrameEventListener(pXAcc,pAgent); 885*5fdc4257SSteve Yin break; 886*5fdc4257SSteve Yin //Container 887*5fdc4257SSteve Yin case /*AccessibleRole::*/CANVAS: 888*5fdc4257SSteve Yin case /*AccessibleRole::*/COMBO_BOX: 889*5fdc4257SSteve Yin case /*AccessibleRole::*/DOCUMENT: 890*5fdc4257SSteve Yin case /*AccessibleRole::*/END_NOTE: 891*5fdc4257SSteve Yin case /*AccessibleRole::*/FILLER: 892*5fdc4257SSteve Yin case /*AccessibleRole::*/FOOTNOTE: 893*5fdc4257SSteve Yin case /*AccessibleRole::*/FOOTER: 894*5fdc4257SSteve Yin case /*AccessibleRole::*/HEADER: 895*5fdc4257SSteve Yin case /*AccessibleRole::*/LAYERED_PANE: 896*5fdc4257SSteve Yin case /*AccessibleRole::*/MENU_BAR: 897*5fdc4257SSteve Yin case /*AccessibleRole::*/POPUP_MENU: 898*5fdc4257SSteve Yin case /*AccessibleRole::*/OPTION_PANE: 899*5fdc4257SSteve Yin case /*AccessibleRole::*/PAGE_TAB: 900*5fdc4257SSteve Yin case /*AccessibleRole::*/PAGE_TAB_LIST: 901*5fdc4257SSteve Yin case /*AccessibleRole::*/PANEL: 902*5fdc4257SSteve Yin case /*AccessibleRole::*/SCROLL_PANE: 903*5fdc4257SSteve Yin case /*AccessibleRole::*/SPLIT_PANE: 904*5fdc4257SSteve Yin case /*AccessibleRole::*/STATUS_BAR: 905*5fdc4257SSteve Yin case /*AccessibleRole::*/TABLE_CELL: 906*5fdc4257SSteve Yin case /*AccessibleRole::*/TOOL_BAR: 907*5fdc4257SSteve Yin case /*AccessibleRole::*/VIEW_PORT: 908*5fdc4257SSteve Yin listener = new AccContainerEventListener(pXAcc,pAgent); 909*5fdc4257SSteve Yin break; 910*5fdc4257SSteve Yin case /*AccessibleRole::*/PARAGRAPH: 911*5fdc4257SSteve Yin case /*AccessibleRole::*/HEADING: 912*5fdc4257SSteve Yin listener = new AccParagraphEventListener(pXAcc,pAgent); 913*5fdc4257SSteve Yin break; 914*5fdc4257SSteve Yin //Component 915*5fdc4257SSteve Yin case /*AccessibleRole::*/CHECK_BOX: 916*5fdc4257SSteve Yin case /*AccessibleRole::*/ICON: 917*5fdc4257SSteve Yin case /*AccessibleRole::*/LABEL: 918*5fdc4257SSteve Yin case /*AccessibleRole::*/MENU_ITEM: 919*5fdc4257SSteve Yin case /*AccessibleRole::*/CHECK_MENU_ITEM: 920*5fdc4257SSteve Yin case /*AccessibleRole::*/RADIO_MENU_ITEM: 921*5fdc4257SSteve Yin case /*AccessibleRole::*/PUSH_BUTTON: 922*5fdc4257SSteve Yin case /*AccessibleRole::*/RADIO_BUTTON: 923*5fdc4257SSteve Yin case /*AccessibleRole::*/SCROLL_BAR: 924*5fdc4257SSteve Yin case /*AccessibleRole::*/SEPARATOR: 925*5fdc4257SSteve Yin case /*AccessibleRole::*/TOGGLE_BUTTON: 926*5fdc4257SSteve Yin case /*AccessibleRole::*/BUTTON_DROPDOWN: 927*5fdc4257SSteve Yin case /*AccessibleRole::*/TOOL_TIP: 928*5fdc4257SSteve Yin case /*AccessibleRole::*/SPIN_BOX: 929*5fdc4257SSteve Yin case DATE_EDITOR: 930*5fdc4257SSteve Yin listener = new AccComponentEventListener(pXAcc,pAgent); 931*5fdc4257SSteve Yin break; 932*5fdc4257SSteve Yin //text component 933*5fdc4257SSteve Yin case /*AccessibleRole::*/TEXT: 934*5fdc4257SSteve Yin listener = new AccTextComponentEventListener(pXAcc,pAgent); 935*5fdc4257SSteve Yin break; 936*5fdc4257SSteve Yin //menu 937*5fdc4257SSteve Yin case /*AccessibleRole::*/MENU: 938*5fdc4257SSteve Yin listener = new AccMenuEventListener(pXAcc,pAgent); 939*5fdc4257SSteve Yin break; 940*5fdc4257SSteve Yin //object container 941*5fdc4257SSteve Yin case /*AccessibleRole::*/SHAPE: 942*5fdc4257SSteve Yin 943*5fdc4257SSteve Yin case /*AccessibleRole::*/EMBEDDED_OBJECT: 944*5fdc4257SSteve Yin case /*AccessibleRole::*/GRAPHIC: 945*5fdc4257SSteve Yin case /*AccessibleRole::*/TEXT_FRAME: 946*5fdc4257SSteve Yin listener = new AccObjectContainerEventListener(pXAcc,pAgent); 947*5fdc4257SSteve Yin break; 948*5fdc4257SSteve Yin //descendmanager 949*5fdc4257SSteve Yin case /*AccessibleRole::*/LIST: 950*5fdc4257SSteve Yin listener = new AccListEventListener(pXAcc,pAgent); 951*5fdc4257SSteve Yin break; 952*5fdc4257SSteve Yin case /*AccessibleRole::*/TREE: 953*5fdc4257SSteve Yin listener = new AccTreeEventListener(pXAcc,pAgent); 954*5fdc4257SSteve Yin break; 955*5fdc4257SSteve Yin //special 956*5fdc4257SSteve Yin case /*AccessibleRole::*/COLUMN_HEADER: 957*5fdc4257SSteve Yin case /*AccessibleRole::*/TABLE: 958*5fdc4257SSteve Yin listener = new AccTableEventListener(pXAcc,pAgent); 959*5fdc4257SSteve Yin break; 960*5fdc4257SSteve Yin default: 961*5fdc4257SSteve Yin listener = new AccContainerEventListener(pXAcc,pAgent); 962*5fdc4257SSteve Yin break; 963*5fdc4257SSteve Yin } 964*5fdc4257SSteve Yin } 965*5fdc4257SSteve Yin 966*5fdc4257SSteve Yin return listener; 967*5fdc4257SSteve Yin } 968*5fdc4257SSteve Yin 969*5fdc4257SSteve Yin /** 970*5fdc4257SSteve Yin * state is a combination integer, each bit of which represents a single state, 971*5fdc4257SSteve Yin * such as focused,1 for the state on,0 for the state off. Here call COM interface 972*5fdc4257SSteve Yin * to modify the state value, including DecreaseState. 973*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 974*5fdc4257SSteve Yin * @param pState Changed state. 975*5fdc4257SSteve Yin * @return 976*5fdc4257SSteve Yin */ 977*5fdc4257SSteve Yin void AccObjectWinManager::DecreaseState( XAccessible* pXAcc,unsigned short pState ) 978*5fdc4257SSteve Yin { 979*5fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 980*5fdc4257SSteve Yin if( pAccObj ) 981*5fdc4257SSteve Yin pAccObj->DecreaseState( pState ); 982*5fdc4257SSteve Yin } 983*5fdc4257SSteve Yin 984*5fdc4257SSteve Yin /** 985*5fdc4257SSteve Yin * state is a combination integer, each bit of which represents a single state,such as focused,1 for 986*5fdc4257SSteve Yin * the state on,0 for the state off. Here call COM interface to modify the state value, including 987*5fdc4257SSteve Yin * IncreaseState. 988*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 989*5fdc4257SSteve Yin * @param pState Changed state. 990*5fdc4257SSteve Yin * @return 991*5fdc4257SSteve Yin */ 992*5fdc4257SSteve Yin void AccObjectWinManager::IncreaseState( XAccessible* pXAcc,unsigned short pState ) 993*5fdc4257SSteve Yin { 994*5fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 995*5fdc4257SSteve Yin if( pAccObj ) 996*5fdc4257SSteve Yin pAccObj->IncreaseState( pState ); 997*5fdc4257SSteve Yin } 998*5fdc4257SSteve Yin 999*5fdc4257SSteve Yin void AccObjectWinManager::UpdateState( com::sun::star::accessibility::XAccessible* pXAcc ) 1000*5fdc4257SSteve Yin { 1001*5fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 1002*5fdc4257SSteve Yin if( pAccObj ) 1003*5fdc4257SSteve Yin pAccObj->UpdateState( ); 1004*5fdc4257SSteve Yin } 1005*5fdc4257SSteve Yin 1006*5fdc4257SSteve Yin /** 1007*5fdc4257SSteve Yin * Set corresponding com object's accessible name via XAccessilbe interface and new 1008*5fdc4257SSteve Yin * name 1009*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 1010*5fdc4257SSteve Yin * @return 1011*5fdc4257SSteve Yin */ 1012*5fdc4257SSteve Yin void AccObjectWinManager::UpdateAccName( XAccessible* pXAcc ) 1013*5fdc4257SSteve Yin { 1014*5fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 1015*5fdc4257SSteve Yin if( pAccObj ) 1016*5fdc4257SSteve Yin pAccObj->UpdateName(); 1017*5fdc4257SSteve Yin } 1018*5fdc4257SSteve Yin 1019*5fdc4257SSteve Yin void AccObjectWinManager::UpdateAction( XAccessible* pXAcc ) 1020*5fdc4257SSteve Yin { 1021*5fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 1022*5fdc4257SSteve Yin if( pAccObj ) 1023*5fdc4257SSteve Yin pAccObj->UpdateAction(); 1024*5fdc4257SSteve Yin } 1025*5fdc4257SSteve Yin 1026*5fdc4257SSteve Yin void AccObjectWinManager::UpdateDescription( XAccessible* pXAcc ) 1027*5fdc4257SSteve Yin { 1028*5fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 1029*5fdc4257SSteve Yin if ( pAccObj ) 1030*5fdc4257SSteve Yin pAccObj->UpdateDescription(); 1031*5fdc4257SSteve Yin } 1032*5fdc4257SSteve Yin 1033*5fdc4257SSteve Yin /** 1034*5fdc4257SSteve Yin * Set corresponding com object's accessible location via XAccessilbe interface and new 1035*5fdc4257SSteve Yin * location. 1036*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 1037*5fdc4257SSteve Yin * @return 1038*5fdc4257SSteve Yin */ 1039*5fdc4257SSteve Yin void AccObjectWinManager::SetLocation( XAccessible* pXAcc, long /*top*/, long /*left*/, long /*width*/, long /*height*/ ) 1040*5fdc4257SSteve Yin { 1041*5fdc4257SSteve Yin AccObject* pObj = GetAccObjByXAcc( pXAcc ); 1042*5fdc4257SSteve Yin //get the location from XComponent. 1043*5fdc4257SSteve Yin Reference< XAccessibleContext > pRContext = pXAcc->getAccessibleContext(); 1044*5fdc4257SSteve Yin if( pObj ) 1045*5fdc4257SSteve Yin pObj->UpdateLocation(); 1046*5fdc4257SSteve Yin } 1047*5fdc4257SSteve Yin 1048*5fdc4257SSteve Yin /** 1049*5fdc4257SSteve Yin * Set corresponding com object's value via XAccessilbe interface and new value. 1050*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 1051*5fdc4257SSteve Yin * @param pAny new value. 1052*5fdc4257SSteve Yin * @return 1053*5fdc4257SSteve Yin */ 1054*5fdc4257SSteve Yin void AccObjectWinManager::SetValue( XAccessible* pXAcc, Any pAny ) 1055*5fdc4257SSteve Yin { 1056*5fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 1057*5fdc4257SSteve Yin if( pAccObj ) 1058*5fdc4257SSteve Yin pAccObj->SetValue( pAny ); 1059*5fdc4257SSteve Yin } 1060*5fdc4257SSteve Yin 1061*5fdc4257SSteve Yin /** 1062*5fdc4257SSteve Yin * Set corresponding com object's value via XAccessilbe interface. 1063*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 1064*5fdc4257SSteve Yin * @return 1065*5fdc4257SSteve Yin */ 1066*5fdc4257SSteve Yin void AccObjectWinManager::UpdateValue( XAccessible* pXAcc ) 1067*5fdc4257SSteve Yin { 1068*5fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 1069*5fdc4257SSteve Yin if( pAccObj ) 1070*5fdc4257SSteve Yin pAccObj->UpdateValue(); 1071*5fdc4257SSteve Yin } 1072*5fdc4257SSteve Yin 1073*5fdc4257SSteve Yin /** 1074*5fdc4257SSteve Yin * Set corresponding com object's name via XAccessilbe interface and new name. 1075*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 1076*5fdc4257SSteve Yin * @param newName new name 1077*5fdc4257SSteve Yin * @return 1078*5fdc4257SSteve Yin */ 1079*5fdc4257SSteve Yin void AccObjectWinManager::SetAccName( XAccessible* pXAcc, Any newName) 1080*5fdc4257SSteve Yin { 1081*5fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 1082*5fdc4257SSteve Yin if( pAccObj ) 1083*5fdc4257SSteve Yin pAccObj->SetName( newName ); 1084*5fdc4257SSteve Yin } 1085*5fdc4257SSteve Yin 1086*5fdc4257SSteve Yin /** 1087*5fdc4257SSteve Yin * Set corresponding com object's description via XAccessilbe interface and new description. 1088*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 1089*5fdc4257SSteve Yin * @param newDesc new description 1090*5fdc4257SSteve Yin * @return 1091*5fdc4257SSteve Yin */ 1092*5fdc4257SSteve Yin void AccObjectWinManager::SetDescription( XAccessible* pXAcc, Any newDesc ) 1093*5fdc4257SSteve Yin { 1094*5fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 1095*5fdc4257SSteve Yin if( pAccObj ) 1096*5fdc4257SSteve Yin pAccObj->SetDescription( newDesc ); 1097*5fdc4257SSteve Yin } 1098*5fdc4257SSteve Yin 1099*5fdc4257SSteve Yin /** 1100*5fdc4257SSteve Yin * Set corresponding com object's role via XAccessilbe interface and new role. 1101*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 1102*5fdc4257SSteve Yin * @param Role new role 1103*5fdc4257SSteve Yin * @return 1104*5fdc4257SSteve Yin */ 1105*5fdc4257SSteve Yin void AccObjectWinManager::SetRole( XAccessible* pXAcc, long Role ) 1106*5fdc4257SSteve Yin { 1107*5fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 1108*5fdc4257SSteve Yin if( pAccObj ) 1109*5fdc4257SSteve Yin pAccObj->SetRole( (short)Role ); 1110*5fdc4257SSteve Yin } 1111*5fdc4257SSteve Yin 1112*5fdc4257SSteve Yin /** 1113*5fdc4257SSteve Yin * Judge if a XAccessible object is a container object. 1114*5fdc4257SSteve Yin * @param pAccessible XAccessible interface. 1115*5fdc4257SSteve Yin * @return If XAccessible object is container. 1116*5fdc4257SSteve Yin */ 1117*5fdc4257SSteve Yin sal_Bool AccObjectWinManager::IsContainer(XAccessible* pAccessible) 1118*5fdc4257SSteve Yin { 1119*5fdc4257SSteve Yin try 1120*5fdc4257SSteve Yin { 1121*5fdc4257SSteve Yin if(pAccessible) 1122*5fdc4257SSteve Yin { 1123*5fdc4257SSteve Yin Reference<XAccessibleContext> xContext(pAccessible->getAccessibleContext(),UNO_QUERY); 1124*5fdc4257SSteve Yin if(xContext.is()) 1125*5fdc4257SSteve Yin { 1126*5fdc4257SSteve Yin switch( xContext->getAccessibleRole() ) 1127*5fdc4257SSteve Yin { 1128*5fdc4257SSteve Yin case /*AccessibleRole::*/DIALOG: 1129*5fdc4257SSteve Yin case /*AccessibleRole::*/FRAME: 1130*5fdc4257SSteve Yin case /*AccessibleRole::*/WINDOW: 1131*5fdc4257SSteve Yin case /*AccessibleRole::*/ROOT_PANE: 1132*5fdc4257SSteve Yin case /*AccessibleRole::*/CANVAS: 1133*5fdc4257SSteve Yin case /*AccessibleRole::*/COMBO_BOX: 1134*5fdc4257SSteve Yin case /*AccessibleRole::*/DOCUMENT: 1135*5fdc4257SSteve Yin case /*AccessibleRole::*/EMBEDDED_OBJECT: 1136*5fdc4257SSteve Yin case /*AccessibleRole::*/END_NOTE: 1137*5fdc4257SSteve Yin case /*AccessibleRole::*/FILLER: 1138*5fdc4257SSteve Yin case /*AccessibleRole::*/FOOTNOTE: 1139*5fdc4257SSteve Yin case /*AccessibleRole::*/FOOTER: 1140*5fdc4257SSteve Yin case /*AccessibleRole::*/GRAPHIC: 1141*5fdc4257SSteve Yin case /*AccessibleRole::*/GROUP_BOX: 1142*5fdc4257SSteve Yin case /*AccessibleRole::*/HEADER: 1143*5fdc4257SSteve Yin case /*AccessibleRole::*/LAYERED_PANE: 1144*5fdc4257SSteve Yin case /*AccessibleRole::*/MENU_BAR: 1145*5fdc4257SSteve Yin case /*AccessibleRole::*/POPUP_MENU: 1146*5fdc4257SSteve Yin case /*AccessibleRole::*/OPTION_PANE: 1147*5fdc4257SSteve Yin case /*AccessibleRole::*/PAGE_TAB: 1148*5fdc4257SSteve Yin case /*AccessibleRole::*/PAGE_TAB_LIST: 1149*5fdc4257SSteve Yin case /*AccessibleRole::*/PANEL: 1150*5fdc4257SSteve Yin case /*AccessibleRole::*/SCROLL_PANE: 1151*5fdc4257SSteve Yin case /*AccessibleRole::*/SPLIT_PANE: 1152*5fdc4257SSteve Yin case /*AccessibleRole::*/STATUS_BAR: 1153*5fdc4257SSteve Yin case /*AccessibleRole::*/TABLE_CELL: 1154*5fdc4257SSteve Yin case /*AccessibleRole::*/TEXT_FRAME: 1155*5fdc4257SSteve Yin case /*AccessibleRole::*/TOOL_BAR: 1156*5fdc4257SSteve Yin case /*AccessibleRole::*/VIEW_PORT: 1157*5fdc4257SSteve Yin case /*AccessibleRole::*/SHAPE: 1158*5fdc4257SSteve Yin return sal_True; 1159*5fdc4257SSteve Yin break; 1160*5fdc4257SSteve Yin case /*AccessibleRole::*/COLUMN_HEADER: 1161*5fdc4257SSteve Yin case /*AccessibleRole::*/TABLE: 1162*5fdc4257SSteve Yin if(!IsStateManageDescendant(pAccessible)) 1163*5fdc4257SSteve Yin return sal_True; 1164*5fdc4257SSteve Yin break; 1165*5fdc4257SSteve Yin case /*AccessibleRole::*/MENU: 1166*5fdc4257SSteve Yin return sal_True; 1167*5fdc4257SSteve Yin break; 1168*5fdc4257SSteve Yin default: 1169*5fdc4257SSteve Yin return sal_False; 1170*5fdc4257SSteve Yin } 1171*5fdc4257SSteve Yin } 1172*5fdc4257SSteve Yin } 1173*5fdc4257SSteve Yin } 1174*5fdc4257SSteve Yin catch(...) 1175*5fdc4257SSteve Yin { 1176*5fdc4257SSteve Yin return sal_False; 1177*5fdc4257SSteve Yin } 1178*5fdc4257SSteve Yin return sal_False; 1179*5fdc4257SSteve Yin } 1180*5fdc4257SSteve Yin 1181*5fdc4257SSteve Yin /** 1182*5fdc4257SSteve Yin * Judge if a XAccessible object has ManageDescendant event. 1183*5fdc4257SSteve Yin * @param pAccessible XAccessible interface. 1184*5fdc4257SSteve Yin * @return If XAccessible object is managedescendant. 1185*5fdc4257SSteve Yin */ 1186*5fdc4257SSteve Yin bool AccObjectWinManager::IsStateManageDescendant(XAccessible* pAccessible) 1187*5fdc4257SSteve Yin { 1188*5fdc4257SSteve Yin if(pAccessible) 1189*5fdc4257SSteve Yin { 1190*5fdc4257SSteve Yin Reference<XAccessibleContext> xContext(pAccessible->getAccessibleContext(),UNO_QUERY); 1191*5fdc4257SSteve Yin if(xContext.is()) 1192*5fdc4257SSteve Yin { 1193*5fdc4257SSteve Yin Reference< XAccessibleStateSet > pRState = xContext->getAccessibleStateSet(); 1194*5fdc4257SSteve Yin if( !pRState.is() ) 1195*5fdc4257SSteve Yin return sal_False; 1196*5fdc4257SSteve Yin 1197*5fdc4257SSteve Yin Sequence<short> pStates = pRState->getStates(); 1198*5fdc4257SSteve Yin int count = pStates.getLength(); 1199*5fdc4257SSteve Yin for( int iIndex = 0;iIndex < count;iIndex++ ) 1200*5fdc4257SSteve Yin { 1201*5fdc4257SSteve Yin if(pStates[iIndex] == /*AccessibleStateType::*/MANAGES_DESCENDANTS) 1202*5fdc4257SSteve Yin return sal_True; 1203*5fdc4257SSteve Yin } 1204*5fdc4257SSteve Yin } 1205*5fdc4257SSteve Yin } 1206*5fdc4257SSteve Yin return sal_False; 1207*5fdc4257SSteve Yin } 1208*5fdc4257SSteve Yin 1209*5fdc4257SSteve Yin /** 1210*5fdc4257SSteve Yin * Query and get IAccessible interface by XAccessible interface from list. 1211*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 1212*5fdc4257SSteve Yin * @return Com accobject interface. 1213*5fdc4257SSteve Yin */ 1214*5fdc4257SSteve Yin IMAccessible* AccObjectWinManager::GetIMAccByXAcc(XAccessible* pXAcc) 1215*5fdc4257SSteve Yin { 1216*5fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc(pXAcc); 1217*5fdc4257SSteve Yin if(pAccObj) 1218*5fdc4257SSteve Yin { 1219*5fdc4257SSteve Yin return pAccObj->GetIMAccessible(); 1220*5fdc4257SSteve Yin } 1221*5fdc4257SSteve Yin else 1222*5fdc4257SSteve Yin { 1223*5fdc4257SSteve Yin return NULL; 1224*5fdc4257SSteve Yin } 1225*5fdc4257SSteve Yin } 1226*5fdc4257SSteve Yin 1227*5fdc4257SSteve Yin /** 1228*5fdc4257SSteve Yin * Query and get IAccessible interface by child id from list. 1229*5fdc4257SSteve Yin * @param resID, childID. 1230*5fdc4257SSteve Yin * @return Com accobject interface. 1231*5fdc4257SSteve Yin */ 1232*5fdc4257SSteve Yin IMAccessible * AccObjectWinManager::GetIAccessibleFromResID(long resID) 1233*5fdc4257SSteve Yin { 1234*5fdc4257SSteve Yin XResIdToAccObjHash::iterator pIndTemp = XResIdAccList.find( resID ); 1235*5fdc4257SSteve Yin if ( pIndTemp == XResIdAccList.end() ) 1236*5fdc4257SSteve Yin return NULL; 1237*5fdc4257SSteve Yin 1238*5fdc4257SSteve Yin AccObject* pObj = pIndTemp->second; 1239*5fdc4257SSteve Yin 1240*5fdc4257SSteve Yin if(pObj->GetIMAccessible()) 1241*5fdc4257SSteve Yin return pObj->GetIMAccessible(); 1242*5fdc4257SSteve Yin return NULL; 1243*5fdc4257SSteve Yin } 1244*5fdc4257SSteve Yin /** 1245*5fdc4257SSteve Yin * Notify some object will be destroyed. 1246*5fdc4257SSteve Yin * @param pXAcc XAccessible interface. 1247*5fdc4257SSteve Yin * @return Com accobject interface. 1248*5fdc4257SSteve Yin */ 1249*5fdc4257SSteve Yin void AccObjectWinManager::NotifyDestroy(XAccessible* pXAcc) 1250*5fdc4257SSteve Yin { 1251*5fdc4257SSteve Yin AccObject* accObj = GetAccObjByXAcc(pXAcc); 1252*5fdc4257SSteve Yin if(accObj) 1253*5fdc4257SSteve Yin { 1254*5fdc4257SSteve Yin accObj->NotifyDestroy(sal_True); 1255*5fdc4257SSteve Yin } 1256*5fdc4257SSteve Yin } 1257*5fdc4257SSteve Yin 1258*5fdc4257SSteve Yin 1259*5fdc4257SSteve Yin void AccObjectWinManager::UpdateChildState(com::sun::star::accessibility::XAccessible* pAccSubMenu) 1260*5fdc4257SSteve Yin { 1261*5fdc4257SSteve Yin Reference<com::sun::star::accessibility::XAccessibleContext> xContext(pAccSubMenu,UNO_QUERY); 1262*5fdc4257SSteve Yin if (!xContext.is()) 1263*5fdc4257SSteve Yin { 1264*5fdc4257SSteve Yin return; 1265*5fdc4257SSteve Yin } 1266*5fdc4257SSteve Yin sal_Int32 nCount = xContext->getAccessibleChildCount(); 1267*5fdc4257SSteve Yin for (sal_Int32 i = 0 ; i < nCount ; ++i) 1268*5fdc4257SSteve Yin { 1269*5fdc4257SSteve Yin Reference<com::sun::star::accessibility::XAccessible> xChild = xContext->getAccessibleChild(i); 1270*5fdc4257SSteve Yin if (xChild.is()) 1271*5fdc4257SSteve Yin { 1272*5fdc4257SSteve Yin AccObject *pObj = GetAccObjByXAcc(xChild.get()); 1273*5fdc4257SSteve Yin if (pObj) 1274*5fdc4257SSteve Yin { 1275*5fdc4257SSteve Yin pObj->UpdateState(); 1276*5fdc4257SSteve Yin } 1277*5fdc4257SSteve Yin } 1278*5fdc4257SSteve Yin } 1279*5fdc4257SSteve Yin } 1280*5fdc4257SSteve Yin 1281*5fdc4257SSteve Yin 1282*5fdc4257SSteve Yin bool AccObjectWinManager::IsSpecialToolboItem(com::sun::star::accessibility::XAccessible* pXAcc) 1283*5fdc4257SSteve Yin { 1284*5fdc4257SSteve Yin if (pXAcc && oldFocus != pXAcc) 1285*5fdc4257SSteve Yin { 1286*5fdc4257SSteve Yin if(GetParentRole(pXAcc) == TOOL_BAR) 1287*5fdc4257SSteve Yin { 1288*5fdc4257SSteve Yin Reference< XAccessibleContext > pRContext(pXAcc->getAccessibleContext()); 1289*5fdc4257SSteve Yin if (pRContext.is()) 1290*5fdc4257SSteve Yin { 1291*5fdc4257SSteve Yin if(pRContext->getAccessibleRole() == TOGGLE_BUTTON) 1292*5fdc4257SSteve Yin { 1293*5fdc4257SSteve Yin return true; 1294*5fdc4257SSteve Yin } 1295*5fdc4257SSteve Yin } 1296*5fdc4257SSteve Yin } 1297*5fdc4257SSteve Yin } 1298*5fdc4257SSteve Yin return false; 1299*5fdc4257SSteve Yin } 1300*5fdc4257SSteve Yin 1301*5fdc4257SSteve Yin short AccObjectWinManager::GetRole(com::sun::star::accessibility::XAccessible* pXAcc) 1302*5fdc4257SSteve Yin { 1303*5fdc4257SSteve Yin assert(pXAcc != NULL); 1304*5fdc4257SSteve Yin Reference<com::sun::star::accessibility::XAccessibleContext> xContext(pXAcc->getAccessibleContext(),UNO_QUERY); 1305*5fdc4257SSteve Yin if(xContext.is()) 1306*5fdc4257SSteve Yin { 1307*5fdc4257SSteve Yin return xContext->getAccessibleRole(); 1308*5fdc4257SSteve Yin } 1309*5fdc4257SSteve Yin return -1; 1310*5fdc4257SSteve Yin } 1311*5fdc4257SSteve Yin 1312*5fdc4257SSteve Yin XAccessible* AccObjectWinManager::GetAccDocByHWND( long pWnd ) 1313*5fdc4257SSteve Yin { 1314*5fdc4257SSteve Yin XHWNDToDocumentHash::iterator aIter; 1315*5fdc4257SSteve Yin aIter = XHWNDDocList.find( pWnd ); 1316*5fdc4257SSteve Yin if ( aIter != XHWNDDocList.end() ) 1317*5fdc4257SSteve Yin { 1318*5fdc4257SSteve Yin return aIter->second; 1319*5fdc4257SSteve Yin } 1320*5fdc4257SSteve Yin 1321*5fdc4257SSteve Yin return NULL; 1322*5fdc4257SSteve Yin } 1323*5fdc4257SSteve Yin 1324*5fdc4257SSteve Yin XAccessible* AccObjectWinManager::GetAccDocByAccTopWin( XAccessible* pXAcc ) 1325*5fdc4257SSteve Yin { 1326*5fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 1327*5fdc4257SSteve Yin long pWnd = (long)( pAccObj->GetParentHWND() ); 1328*5fdc4257SSteve Yin return GetAccDocByHWND( pWnd ); 1329*5fdc4257SSteve Yin } 1330*5fdc4257SSteve Yin 1331*5fdc4257SSteve Yin bool AccObjectWinManager::IsTopWinAcc( com::sun::star::accessibility::XAccessible* pXAcc ) 1332*5fdc4257SSteve Yin { 1333*5fdc4257SSteve Yin bool bRet = false; 1334*5fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 1335*5fdc4257SSteve Yin if ( pAccObj ) 1336*5fdc4257SSteve Yin { 1337*5fdc4257SSteve Yin bRet = ( pAccObj->GetParentObj() == NULL ); 1338*5fdc4257SSteve Yin } 1339*5fdc4257SSteve Yin return bRet; 1340*5fdc4257SSteve Yin } 1341