1*3a700b0aSSteve Yin /************************************************************** 25fdc4257SSteve Yin * 3*3a700b0aSSteve Yin * Licensed to the Apache Software Foundation (ASF) under one 4*3a700b0aSSteve Yin * or more contributor license agreements. See the NOTICE file 5*3a700b0aSSteve Yin * distributed with this work for additional information 6*3a700b0aSSteve Yin * regarding copyright ownership. The ASF licenses this file 7*3a700b0aSSteve Yin * to you under the Apache License, Version 2.0 (the 8*3a700b0aSSteve Yin * "License"); you may not use this file except in compliance 9*3a700b0aSSteve Yin * with the License. You may obtain a copy of the License at 105fdc4257SSteve Yin * 11*3a700b0aSSteve Yin * http://www.apache.org/licenses/LICENSE-2.0 125fdc4257SSteve Yin * 13*3a700b0aSSteve Yin * Unless required by applicable law or agreed to in writing, 14*3a700b0aSSteve Yin * software distributed under the License is distributed on an 15*3a700b0aSSteve Yin * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*3a700b0aSSteve Yin * KIND, either express or implied. See the License for the 17*3a700b0aSSteve Yin * specific language governing permissions and limitations 18*3a700b0aSSteve Yin * under the License. 195fdc4257SSteve Yin * 20*3a700b0aSSteve Yin *************************************************************/ 215fdc4257SSteve Yin 225fdc4257SSteve Yin #include <cassert> 235fdc4257SSteve Yin 245fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp> 255fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleEventListener.hpp> 265fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleComponent.hpp> 275fdc4257SSteve Yin #include <com/sun/star/accessibility/AccessibleStateType.hpp> 285fdc4257SSteve Yin 295fdc4257SSteve Yin #include <oleacc.h> 305fdc4257SSteve Yin #ifndef _SV_AccObjectWinManager_HXX 315fdc4257SSteve Yin #include "AccObjectWinManager.hxx" 325fdc4257SSteve Yin #endif 335fdc4257SSteve Yin #include "AccEventListener.hxx" 345fdc4257SSteve Yin #include "AccComponentEventListener.hxx" 355fdc4257SSteve Yin #include "AccContainerEventListener.hxx" 365fdc4257SSteve Yin #include "AccDialogEventListener.hxx" 375fdc4257SSteve Yin #include "AccWindowEventListener.hxx" 385fdc4257SSteve Yin #include "AccFrameEventListener.hxx" 395fdc4257SSteve Yin #include "AccMenuEventListener.hxx" 405fdc4257SSteve Yin #include "AccObjectContainerEventListener.hxx" 415fdc4257SSteve Yin #include "AccParagraphEventListener.hxx" 425fdc4257SSteve Yin #include "AccTextComponentEventListener.hxx" 435fdc4257SSteve Yin #include "AccListEventListener.hxx" 445fdc4257SSteve Yin #include "AccTreeEventListener.hxx" 455fdc4257SSteve Yin #include "AccTableEventListener.hxx" 465fdc4257SSteve Yin #include "AccObject.hxx" 475fdc4257SSteve Yin #include "AccessibleEventId.h" 485fdc4257SSteve Yin #include "AccessibleApplication.h" 495fdc4257SSteve Yin #include "AccessibleApplication_i.c" 505fdc4257SSteve Yin #include "unomsaaevent.hxx" 515fdc4257SSteve Yin #include "checkmt.hxx" 525fdc4257SSteve Yin 535fdc4257SSteve Yin #define CHILDID_SELF 0 545fdc4257SSteve Yin 555fdc4257SSteve Yin 565fdc4257SSteve Yin using namespace std; 575fdc4257SSteve Yin using namespace com::sun::star::accessibility; 585fdc4257SSteve Yin using namespace com::sun::star::uno; 595fdc4257SSteve Yin 605fdc4257SSteve Yin AccObjectWinManager* g_acc_manager = NULL; 615fdc4257SSteve Yin AccObjectWinManager* AccObjectWinManager::me = NULL; 625fdc4257SSteve Yin 635fdc4257SSteve Yin /** 645fdc4257SSteve Yin * Implementation of interface XMSAAService's method getAccObjectPtr() that return the 655fdc4257SSteve Yin * corresponding com interface with the MS event. 665fdc4257SSteve Yin * 675fdc4257SSteve Yin * @param 685fdc4257SSteve Yin * @return Com interface. 695fdc4257SSteve Yin */ 705fdc4257SSteve Yin long GetMSComPtr(long hWnd, long lParam, long wParam) 715fdc4257SSteve Yin { 725fdc4257SSteve Yin if( g_acc_manager ) 735fdc4257SSteve Yin return (long)g_acc_manager->Get_ToATInterface(HWND((void*)hWnd),lParam,wParam ); 745fdc4257SSteve Yin return NULL; 755fdc4257SSteve Yin } 765fdc4257SSteve Yin 775fdc4257SSteve Yin /** 785fdc4257SSteve Yin * constructor 795fdc4257SSteve Yin * @param Agent The agent kept in all listeners,it's the sole interface by which 805fdc4257SSteve Yin * listener communicate with windows manager. 815fdc4257SSteve Yin * pEventAccObj The present event accobject. 825fdc4257SSteve Yin * oldFocus Last focused object. 835fdc4257SSteve Yin * isSelectionChanged flag that identifies if there is selection changed. 845fdc4257SSteve Yin * selectionChildObj Selected object. 855fdc4257SSteve Yin * dChildID Chile resource ID. 865fdc4257SSteve Yin * hAcc TopWindowHWND 875fdc4257SSteve Yin * @return 885fdc4257SSteve Yin */ 895fdc4257SSteve Yin AccObjectWinManager::AccObjectWinManager( AccObjectManagerAgent* Agent ): 905fdc4257SSteve Yin pAgent( Agent ), 915fdc4257SSteve Yin oldFocus( NULL ) 925fdc4257SSteve Yin { 935fdc4257SSteve Yin m_bBridgeRegistered =IsBridgeRegisteredAcc(); 945fdc4257SSteve Yin } 955fdc4257SSteve Yin 965fdc4257SSteve Yin /** 975fdc4257SSteve Yin * Public method to produce manager 985fdc4257SSteve Yin * @param Agent The agent kept in all listeners,it's the sole interface by which 995fdc4257SSteve Yin * listener communicate with windows manager. 1005fdc4257SSteve Yin * @return 1015fdc4257SSteve Yin */ 1025fdc4257SSteve Yin AccObjectWinManager* AccObjectWinManager::CreateAccObjectWinManagerInstance( AccObjectManagerAgent* Agent ) 1035fdc4257SSteve Yin { 1045fdc4257SSteve Yin if( me == NULL ) 1055fdc4257SSteve Yin { 1065fdc4257SSteve Yin me = new AccObjectWinManager( Agent ); 1075fdc4257SSteve Yin g_acc_manager = me; 1085fdc4257SSteve Yin return me; 1095fdc4257SSteve Yin } 1105fdc4257SSteve Yin 1115fdc4257SSteve Yin return me; 1125fdc4257SSteve Yin } 1135fdc4257SSteve Yin 1145fdc4257SSteve Yin 1155fdc4257SSteve Yin /** 1165fdc4257SSteve Yin * Destructor,clear all resource. 1175fdc4257SSteve Yin * @param 1185fdc4257SSteve Yin * @return 1195fdc4257SSteve Yin */ 1205fdc4257SSteve Yin AccObjectWinManager::~AccObjectWinManager() 1215fdc4257SSteve Yin { 1225fdc4257SSteve Yin XIdAccList.clear(); 1235fdc4257SSteve Yin HwndXAcc.clear(); 1245fdc4257SSteve Yin XResIdAccList.clear(); 1255fdc4257SSteve Yin XHWNDDocList.clear(); 1265fdc4257SSteve Yin #ifdef ACC_DEBUG 1275fdc4257SSteve Yin 1285fdc4257SSteve Yin fclose( pFile ); 1295fdc4257SSteve Yin #endif 1305fdc4257SSteve Yin } 1315fdc4257SSteve Yin 1325fdc4257SSteve Yin 1335fdc4257SSteve Yin /** 1345fdc4257SSteve Yin * Get valid com object interface when notifying some MSAA event 1355fdc4257SSteve Yin * @param pWND The top window handle that contains that event control. 1365fdc4257SSteve Yin * @param wParam Windows system interface. 1375fdc4257SSteve Yin * @return Com interface with event. 1385fdc4257SSteve Yin */ 1395fdc4257SSteve Yin 1405fdc4257SSteve Yin long AccObjectWinManager::Get_ToATInterface( HWND hWnd, long lParam, long wParam) 1415fdc4257SSteve Yin { 1425fdc4257SSteve Yin vos::OGuard localGuard(maATInterfaceMutex);// 1435fdc4257SSteve Yin 1445fdc4257SSteve Yin IMAccessible* pRetIMAcc = NULL; 1455fdc4257SSteve Yin 1465fdc4257SSteve Yin if(lParam == OBJID_CLIENT ) 1475fdc4257SSteve Yin { 1485fdc4257SSteve Yin AccObject* topWindowAccObj = GetTopWindowAccObj(hWnd); 1495fdc4257SSteve Yin if(topWindowAccObj) 1505fdc4257SSteve Yin { 1515fdc4257SSteve Yin pRetIMAcc = topWindowAccObj->GetIMAccessible(); 1525fdc4257SSteve Yin if(pRetIMAcc) 1535fdc4257SSteve Yin pRetIMAcc->AddRef();//increase COM reference count 1545fdc4257SSteve Yin } 1555fdc4257SSteve Yin } 1565fdc4257SSteve Yin 1575fdc4257SSteve Yin if ( pRetIMAcc && lParam == OBJID_CLIENT ) 1585fdc4257SSteve Yin { 1595fdc4257SSteve Yin IAccessible* pTemp = dynamic_cast<IAccessible*>( pRetIMAcc ); 1605fdc4257SSteve Yin HRESULT result = LresultFromObject(IID_IAccessible, wParam, pTemp); 1615fdc4257SSteve Yin pTemp->Release(); 1625fdc4257SSteve Yin return result; 1635fdc4257SSteve Yin } 1645fdc4257SSteve Yin return 0; 1655fdc4257SSteve Yin } 1665fdc4257SSteve Yin 1675fdc4257SSteve Yin /** 1685fdc4257SSteve Yin * Search AccObject by XAccessible pointer from our container. 1695fdc4257SSteve Yin * @param pXAcc XAccessible interface. 1705fdc4257SSteve Yin * @return Pointer of accObject that is found. 1715fdc4257SSteve Yin */ 1725fdc4257SSteve Yin AccObject* AccObjectWinManager::GetAccObjByXAcc( XAccessible* pXAcc) 1735fdc4257SSteve Yin { 1745fdc4257SSteve Yin if( pXAcc == NULL) 1755fdc4257SSteve Yin return NULL; 1765fdc4257SSteve Yin 1775fdc4257SSteve Yin XIdToAccObjHash::iterator pIndTemp = XIdAccList.find( (void*)pXAcc ); 1785fdc4257SSteve Yin if ( pIndTemp == XIdAccList.end() ) 1795fdc4257SSteve Yin return NULL; 1805fdc4257SSteve Yin 1815fdc4257SSteve Yin return &(pIndTemp->second); 1825fdc4257SSteve Yin } 1835fdc4257SSteve Yin 1845fdc4257SSteve Yin /** 1855fdc4257SSteve Yin * Search XAccessible by AccObject pointer from our container. 1865fdc4257SSteve Yin * @param pAccObj AccObject pointer. 1875fdc4257SSteve Yin * @return Pointer of XAccessible Interface. 1885fdc4257SSteve Yin */ 1895fdc4257SSteve Yin XAccessible* AccObjectWinManager::GetXAccByAccObj(AccObject* pAccObj) 1905fdc4257SSteve Yin { 1915fdc4257SSteve Yin XIdToAccObjHash::iterator iter = XIdAccList.begin(); 1925fdc4257SSteve Yin while(iter!=XIdAccList.end()) 1935fdc4257SSteve Yin { 1945fdc4257SSteve Yin AccObject* tmp = &(iter->second); 1955fdc4257SSteve Yin if(tmp== pAccObj) 1965fdc4257SSteve Yin return (XAccessible*)(iter->first); 1975fdc4257SSteve Yin iter++; 1985fdc4257SSteve Yin } 1995fdc4257SSteve Yin return NULL; 2005fdc4257SSteve Yin } 2015fdc4257SSteve Yin 2025fdc4257SSteve Yin /** 2035fdc4257SSteve Yin * get acc object of top window by its handle 2045fdc4257SSteve Yin * @param hWnd, top window handle 2055fdc4257SSteve Yin * @return pointer to AccObject 2065fdc4257SSteve Yin */ 2075fdc4257SSteve Yin AccObject* AccObjectWinManager::GetTopWindowAccObj(HWND hWnd) 2085fdc4257SSteve Yin { 2095fdc4257SSteve Yin XHWNDToXAccHash::iterator iterResult =HwndXAcc.find(hWnd); 2105fdc4257SSteve Yin if(iterResult == HwndXAcc.end()) 2115fdc4257SSteve Yin return NULL; 2125fdc4257SSteve Yin XAccessible* pXAcc = (XAccessible*)(iterResult->second); 2135fdc4257SSteve Yin return GetAccObjByXAcc(pXAcc); 2145fdc4257SSteve Yin } 2155fdc4257SSteve Yin 2165fdc4257SSteve Yin /** 2175fdc4257SSteve Yin * Simulate MSAA event via XAccessible interface and event type. 2185fdc4257SSteve Yin * @param pXAcc XAccessible interface. 2195fdc4257SSteve Yin * @param state Customize Interface 2205fdc4257SSteve Yin * @return The terminate result that identifies if the call is successful. 2215fdc4257SSteve Yin */ 2225fdc4257SSteve Yin sal_Bool AccObjectWinManager::NotifyAccEvent(XAccessible* pXAcc,short state) 2235fdc4257SSteve Yin { 2245fdc4257SSteve Yin vos::OGuard aGuard(aNotifyMutex); 2255fdc4257SSteve Yin 2265fdc4257SSteve Yin if (!m_bBridgeRegistered) 2275fdc4257SSteve Yin { 2285fdc4257SSteve Yin return sal_False; 2295fdc4257SSteve Yin } 2305fdc4257SSteve Yin if (!IsInMainThread()) 2315fdc4257SSteve Yin { 2325fdc4257SSteve Yin return sal_False; 2335fdc4257SSteve Yin } 2345fdc4257SSteve Yin 2355fdc4257SSteve Yin Reference< XAccessibleContext > pRContext; 2365fdc4257SSteve Yin 2375fdc4257SSteve Yin if( pXAcc == NULL) 2385fdc4257SSteve Yin return sal_False; 2395fdc4257SSteve Yin 2405fdc4257SSteve Yin 2415fdc4257SSteve Yin pRContext = pXAcc->getAccessibleContext(); 2425fdc4257SSteve Yin if( !pRContext.is() ) 2435fdc4257SSteve Yin return sal_False; 2445fdc4257SSteve Yin 2455fdc4257SSteve Yin 2465fdc4257SSteve Yin AccObject* selfAccObj= GetAccObjByXAcc(pXAcc); 2475fdc4257SSteve Yin 2485fdc4257SSteve Yin if(selfAccObj==NULL) 2495fdc4257SSteve Yin return sal_False; 2505fdc4257SSteve Yin 2515fdc4257SSteve Yin int selectNum =0; 2525fdc4257SSteve Yin 2535fdc4257SSteve Yin long dChildID = selfAccObj->GetResID(); 2545fdc4257SSteve Yin HWND hAcc = selfAccObj->GetParentHWND(); 2555fdc4257SSteve Yin 2565fdc4257SSteve Yin switch(state) 2575fdc4257SSteve Yin { 2585fdc4257SSteve Yin case UM_EVENT_STATE_FOCUSED: 2595fdc4257SSteve Yin { 2605fdc4257SSteve Yin UpdateAccFocus(pXAcc); 2615fdc4257SSteve Yin if( selfAccObj ) 2625fdc4257SSteve Yin selfAccObj->UpdateDefaultAction( ); 2635fdc4257SSteve Yin UpdateValue(pXAcc); 2645fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_FOCUS,hAcc, OBJID_CLIENT,dChildID ); 2655fdc4257SSteve Yin break; 2665fdc4257SSteve Yin } 2675fdc4257SSteve Yin case UM_EVENT_STATE_BUSY: 2685fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_STATECHANGE,hAcc, OBJID_CLIENT,dChildID ); 2695fdc4257SSteve Yin break; 2705fdc4257SSteve Yin case UM_EVENT_STATE_CHECKED: 2715fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_STATECHANGE,hAcc, OBJID_CLIENT,dChildID ); 2725fdc4257SSteve Yin break; 2735fdc4257SSteve Yin case UM_EVENT_STATE_PRESSED: 2745fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_STATECHANGE,hAcc, OBJID_CLIENT,dChildID ); 2755fdc4257SSteve Yin break; 2765fdc4257SSteve Yin 2775fdc4257SSteve Yin //Removed fire out selected event 2785fdc4257SSteve Yin //case UM_EVENT_STATE_SELECTED: 2795fdc4257SSteve Yin // NotifyWinEvent( EVENT_OBJECT_STATECHANGE,hAcc, OBJID_CLIENT,dChildID ); 2805fdc4257SSteve Yin // break; 2815fdc4257SSteve Yin case UM_EVENT_STATE_ARMED: 2825fdc4257SSteve Yin UpdateAccFocus(pXAcc); 2835fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_FOCUS,hAcc, OBJID_CLIENT,dChildID ); 2845fdc4257SSteve Yin break; 2855fdc4257SSteve Yin case UM_EVENT_MENU_START: 2865fdc4257SSteve Yin NotifyWinEvent( EVENT_SYSTEM_MENUSTART,hAcc, OBJID_CLIENT,dChildID ); 2875fdc4257SSteve Yin break; 2885fdc4257SSteve Yin case UM_EVENT_MENU_END: 2895fdc4257SSteve Yin NotifyWinEvent( EVENT_SYSTEM_MENUEND,hAcc, OBJID_CLIENT,dChildID ); 2905fdc4257SSteve Yin break; 2915fdc4257SSteve Yin case UM_EVENT_MENUPOPUPSTART: 2925fdc4257SSteve Yin NotifyWinEvent( EVENT_SYSTEM_MENUPOPUPSTART,hAcc, OBJID_CLIENT,dChildID ); 2935fdc4257SSteve Yin break; 2945fdc4257SSteve Yin case UM_EVENT_MENUPOPUPEND: 2955fdc4257SSteve Yin NotifyWinEvent( EVENT_SYSTEM_MENUPOPUPEND,hAcc, OBJID_CLIENT,dChildID ); 2965fdc4257SSteve Yin break; 2975fdc4257SSteve Yin case UM_EVENT_SELECTION_CHANGED: 2985fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_SELECTION,hAcc, OBJID_CLIENT,dChildID ); 2995fdc4257SSteve Yin break; 3005fdc4257SSteve Yin case UM_EVENT_SELECTION_CHANGED_ADD: 3015fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_SELECTIONADD,hAcc, OBJID_CLIENT,dChildID ); 3025fdc4257SSteve Yin break; 3035fdc4257SSteve Yin case UM_EVENT_SELECTION_CHANGED_REMOVE: 3045fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_SELECTIONREMOVE,hAcc, OBJID_CLIENT,dChildID ); 3055fdc4257SSteve Yin break; 3065fdc4257SSteve Yin case UM_EVENT_SELECTION_CHANGED_WITHIN: 3075fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_SELECTIONWITHIN,hAcc, OBJID_CLIENT,dChildID ); 3085fdc4257SSteve Yin break; 3095fdc4257SSteve Yin case UM_EVENT_OBJECT_VALUECHANGE: 3105fdc4257SSteve Yin UpdateValue(pXAcc); 3115fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_VALUECHANGE,hAcc, OBJID_CLIENT,dChildID ); 3125fdc4257SSteve Yin break; 3135fdc4257SSteve Yin case UM_EVENT_OBJECT_NAMECHANGE: 3145fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_NAMECHANGE,hAcc, OBJID_CLIENT,dChildID ); 3155fdc4257SSteve Yin break; 3165fdc4257SSteve Yin case UM_EVENT_OBJECT_DESCRIPTIONCHANGE: 3175fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_DESCRIPTIONCHANGE,hAcc, OBJID_CLIENT,dChildID ); 3185fdc4257SSteve Yin break; 3195fdc4257SSteve Yin case UM_EVENT_OBJECT_DEFACTIONCHANGE: 3205fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_ACTION_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 3215fdc4257SSteve Yin break; 3225fdc4257SSteve Yin case UM_EVENT_OBJECT_CARETCHANGE: 3235fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TEXT_CARET_MOVED,hAcc, OBJID_CLIENT,dChildID ); 3245fdc4257SSteve Yin break; 3255fdc4257SSteve Yin case UM_EVENT_OBJECT_TEXTCHANGE: 3265fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TEXT_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 3275fdc4257SSteve Yin break; 3285fdc4257SSteve Yin case UM_EVENT_ACTIVE_DESCENDANT_CHANGED: 3295fdc4257SSteve Yin UpdateAccFocus(pXAcc); 3305fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_FOCUS,hAcc, OBJID_CLIENT,dChildID ); 3315fdc4257SSteve Yin break; 3325fdc4257SSteve Yin case UM_EVENT_BOUNDRECT_CHANGED: 3335fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_LOCATIONCHANGE,hAcc, OBJID_CLIENT,dChildID ); 3345fdc4257SSteve Yin break; 3355fdc4257SSteve Yin case UM_EVENT_VISIBLE_DATA_CHANGED: 3365fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_VISIBLE_DATA_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 3375fdc4257SSteve Yin break; 3385fdc4257SSteve Yin case UM_EVENT_SHOW : 3395fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_SHOW,hAcc, OBJID_CLIENT,dChildID ); 3405fdc4257SSteve Yin NotifyWinEvent( EVENT_SYSTEM_FOREGROUND,hAcc, OBJID_CLIENT,dChildID ); 3415fdc4257SSteve Yin break; 3425fdc4257SSteve Yin case UM_EVENT_TABLE_CAPTION_CHANGED: 3435fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TABLE_CAPTION_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 3445fdc4257SSteve Yin break; 3455fdc4257SSteve Yin case UM_EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED: 3465fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 3475fdc4257SSteve Yin break; 3485fdc4257SSteve Yin case UM_EVENT_TABLE_COLUMN_HEADER_CHANGED: 3495fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TABLE_COLUMN_HEADER_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 3505fdc4257SSteve Yin break; 3515fdc4257SSteve Yin case UM_EVENT_TABLE_MODEL_CHANGED: 3525fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TABLE_MODEL_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 3535fdc4257SSteve Yin break; 3545fdc4257SSteve Yin case UM_EVENT_TABLE_ROW_HEADER_CHANGED: 3555fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TABLE_ROW_HEADER_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 3565fdc4257SSteve Yin break; 3575fdc4257SSteve Yin case UM_EVENT_TABLE_SUMMARY_CHANGED: 3585fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TABLE_SUMMARY_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 3595fdc4257SSteve Yin break; 3605fdc4257SSteve Yin case UM_EVENT_TABLE_ROW_DESCRIPTION_CHANGED: 3615fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TABLE_ROW_DESCRIPTION_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 3625fdc4257SSteve Yin break; 3635fdc4257SSteve Yin case UM_EVENT_OBJECT_REORDER: 3645fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_REORDER,hAcc, OBJID_CLIENT,dChildID ); 3655fdc4257SSteve Yin break; 3665fdc4257SSteve Yin case UM_EVENT_PAGE_CHANGED: 3675fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_PAGE_CHANGED,hAcc, OBJID_CLIENT,dChildID ); 3685fdc4257SSteve Yin break; 3695fdc4257SSteve Yin case UM_EVENT_CHILD_REMOVED: 3705fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_DESTROY,hAcc, OBJID_CLIENT,dChildID ); 3715fdc4257SSteve Yin break; 3725fdc4257SSteve Yin case UM_EVENT_CHILD_ADDED: 3735fdc4257SSteve Yin NotifyWinEvent( EVENT_OBJECT_CREATE ,hAcc, OBJID_CLIENT,dChildID ); 3745fdc4257SSteve Yin break; 3755fdc4257SSteve Yin case UM_EVENT_OBJECT_PAGECHANGED: 3765fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_PAGE_CHANGED ,hAcc, OBJID_CLIENT,dChildID ); 3775fdc4257SSteve Yin break; 3785fdc4257SSteve Yin case UM_EVENT_TEXT_SELECTION_CHANGED: 3795fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TEXT_SELECTION_CHANGED ,hAcc, OBJID_CLIENT,dChildID ); 3805fdc4257SSteve Yin break; 3815fdc4257SSteve Yin case UM_EVENT_SECTION_CHANGED: 3825fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_SECTION_CHANGED ,hAcc, OBJID_CLIENT,dChildID ); 3835fdc4257SSteve Yin break; 3845fdc4257SSteve Yin case UM_EVENT_COLUMN_CHANGED: 3855fdc4257SSteve Yin NotifyWinEvent( IA2_EVENT_TEXT_COLUMN_CHANGED ,hAcc, OBJID_CLIENT,dChildID ); 3865fdc4257SSteve Yin break; 3875fdc4257SSteve Yin default: 3885fdc4257SSteve Yin break; 3895fdc4257SSteve Yin } 3905fdc4257SSteve Yin 3915fdc4257SSteve Yin return sal_True; 3925fdc4257SSteve Yin } 3935fdc4257SSteve Yin 3945fdc4257SSteve Yin /** 3955fdc4257SSteve Yin * Get Parent XAccessible interface by XAccessible interface. 3965fdc4257SSteve Yin * @param pXAcc XAccessible interface. 3975fdc4257SSteve Yin * @return Parent XAccessible interface. 3985fdc4257SSteve Yin */ 3995fdc4257SSteve Yin XAccessible* AccObjectWinManager::GetParentXAccessible( XAccessible* pXAcc ) 4005fdc4257SSteve Yin { 4015fdc4257SSteve Yin AccObject* pObj= GetAccObjByXAcc(pXAcc); 4025fdc4257SSteve Yin if( pObj ==NULL ) 4035fdc4257SSteve Yin return NULL; 4045fdc4257SSteve Yin if(pObj->GetParentObj()) 4055fdc4257SSteve Yin { 4065fdc4257SSteve Yin pObj = pObj->GetParentObj(); 4075fdc4257SSteve Yin return pObj->GetXAccessible().get(); 4085fdc4257SSteve Yin } 4095fdc4257SSteve Yin return NULL; 4105fdc4257SSteve Yin } 4115fdc4257SSteve Yin 4125fdc4257SSteve Yin /** 4135fdc4257SSteve Yin * Get Parent role by XAccessible interface. 4145fdc4257SSteve Yin * @param pXAcc XAccessible interface. 4155fdc4257SSteve Yin * @return Parent role. 4165fdc4257SSteve Yin */ 4175fdc4257SSteve Yin short AccObjectWinManager::GetParentRole( XAccessible* pXAcc ) 4185fdc4257SSteve Yin { 4195fdc4257SSteve Yin AccObject* pObj= GetAccObjByXAcc(pXAcc); 4205fdc4257SSteve Yin if( pObj ==NULL ) 4215fdc4257SSteve Yin return -1; 4225fdc4257SSteve Yin if(pObj->GetParentObj()) 4235fdc4257SSteve Yin { 4245fdc4257SSteve Yin pObj = pObj->GetParentObj(); 4255fdc4257SSteve Yin if(pObj->GetXAccessible().is()) 4265fdc4257SSteve Yin { 4275fdc4257SSteve Yin XAccessible* pXAcc = pObj->GetXAccessible().get(); 4285fdc4257SSteve Yin Reference< XAccessibleContext > pRContext = pXAcc->getAccessibleContext(); 4295fdc4257SSteve Yin if(pRContext.is()) 4305fdc4257SSteve Yin return pRContext->getAccessibleRole(); 4315fdc4257SSteve Yin } 4325fdc4257SSteve Yin } 4335fdc4257SSteve Yin return -1; 4345fdc4257SSteve Yin } 4355fdc4257SSteve Yin 4365fdc4257SSteve Yin /** 4375fdc4257SSteve Yin * Update focus objcet by new focused XAccessible interface. 4385fdc4257SSteve Yin * @param newFocus New XAccessible interface that gets focus. 4395fdc4257SSteve Yin * @return 4405fdc4257SSteve Yin */ 4415fdc4257SSteve Yin void AccObjectWinManager::UpdateAccFocus(XAccessible* newFocus) 4425fdc4257SSteve Yin { 4435fdc4257SSteve Yin AccObject* pAccObjNew = GetAccObjByXAcc(newFocus); 4445fdc4257SSteve Yin if(pAccObjNew) 4455fdc4257SSteve Yin { 4465fdc4257SSteve Yin AccObject* pAccObjOld = GetAccObjByXAcc(oldFocus); 4475fdc4257SSteve Yin oldFocus = newFocus; 4485fdc4257SSteve Yin pAccObjNew->setFocus(); 4495fdc4257SSteve Yin //if old == new, the pAccObjNew will be without focused state 4505fdc4257SSteve Yin if (pAccObjOld && pAccObjOld != pAccObjNew) 4515fdc4257SSteve Yin pAccObjOld->unsetFocus(); 4525fdc4257SSteve Yin } 4535fdc4257SSteve Yin } 4545fdc4257SSteve Yin 4555fdc4257SSteve Yin /** 4565fdc4257SSteve Yin * Update selected objcet by new focused XAccessible interface. 4575fdc4257SSteve Yin * @param pXAcc XAccessible interface that has selected child changed. 4585fdc4257SSteve Yin * @return Selected children count. 4595fdc4257SSteve Yin */ 4605fdc4257SSteve Yin int AccObjectWinManager::UpdateAccSelection(XAccessible* pXAcc) 4615fdc4257SSteve Yin { 4625fdc4257SSteve Yin XAccessibleSelection* pSelection = NULL; 4635fdc4257SSteve Yin Reference< XAccessibleContext > pRContext; 4645fdc4257SSteve Yin 4655fdc4257SSteve Yin if( pXAcc == NULL) 4665fdc4257SSteve Yin return sal_False; 4675fdc4257SSteve Yin 4685fdc4257SSteve Yin pRContext = pXAcc->getAccessibleContext(); 4695fdc4257SSteve Yin if( !pRContext.is() ) 4705fdc4257SSteve Yin return sal_False; 4715fdc4257SSteve Yin 4725fdc4257SSteve Yin Reference< XAccessibleSelection > pRSelection(pRContext,UNO_QUERY); 4735fdc4257SSteve Yin if( !pRSelection.is() ) 4745fdc4257SSteve Yin return sal_False; 4755fdc4257SSteve Yin 4765fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc(pXAcc); 4775fdc4257SSteve Yin if(pAccObj==NULL) 4785fdc4257SSteve Yin return sal_False; 4795fdc4257SSteve Yin 4805fdc4257SSteve Yin Reference<XAccessible> pRChild = NULL; 4815fdc4257SSteve Yin AccObject* pAccChildObj = NULL; 4825fdc4257SSteve Yin int selectNum= pRSelection->getSelectedAccessibleChildCount(); 4835fdc4257SSteve Yin 4845fdc4257SSteve Yin IAccSelectionList oldSelection = pAccObj->GetSelection(); 4855fdc4257SSteve Yin 4865fdc4257SSteve Yin if(selectNum > 4)//for selected. 4875fdc4257SSteve Yin return selectNum; 4885fdc4257SSteve Yin if(selectNum == 1 && oldSelection.size() == 0) 4895fdc4257SSteve Yin return 1; 4905fdc4257SSteve Yin 4915fdc4257SSteve Yin for (int i=0;i<selectNum;i++) 4925fdc4257SSteve Yin { 4935fdc4257SSteve Yin pRChild = pRSelection->getSelectedAccessibleChild(i); 4945fdc4257SSteve Yin if(!pRChild.is()) 4955fdc4257SSteve Yin { 4965fdc4257SSteve Yin continue; 4975fdc4257SSteve Yin } 4985fdc4257SSteve Yin Reference<XAccessibleContext> pRChildContext = pRChild->getAccessibleContext(); 4995fdc4257SSteve Yin if(!pRChildContext.is()) 5005fdc4257SSteve Yin { 5015fdc4257SSteve Yin continue; 5025fdc4257SSteve Yin } 5035fdc4257SSteve Yin long index = pRChildContext->getAccessibleIndexInParent(); 5045fdc4257SSteve Yin IAccSelectionList::iterator temp = oldSelection.find(index); 5055fdc4257SSteve Yin if ( temp != oldSelection.end() ) 5065fdc4257SSteve Yin { 5075fdc4257SSteve Yin oldSelection.erase(index); 5085fdc4257SSteve Yin continue; 5095fdc4257SSteve Yin } 5105fdc4257SSteve Yin 5115fdc4257SSteve Yin pAccChildObj = NULL; 5125fdc4257SSteve Yin pAccChildObj = GetAccObjByXAcc(pRChild.get()); 5135fdc4257SSteve Yin if(!pAccChildObj) 5145fdc4257SSteve Yin { 5155fdc4257SSteve Yin InsertAccObj(pRChild.get(), pXAcc,pAccObj->GetParentHWND()); 5165fdc4257SSteve Yin pAccChildObj = GetAccObjByXAcc(pRChild.get()); 5175fdc4257SSteve Yin } 5185fdc4257SSteve Yin 5195fdc4257SSteve Yin pAccObj->AddSelect(index, pAccChildObj); 5205fdc4257SSteve Yin 5215fdc4257SSteve Yin if(pAccChildObj != NULL) 5225fdc4257SSteve Yin NotifyWinEvent(EVENT_OBJECT_SELECTIONADD,pAccObj->GetParentHWND(), OBJID_CLIENT,pAccChildObj->GetResID()); 5235fdc4257SSteve Yin } 5245fdc4257SSteve Yin 5255fdc4257SSteve Yin IAccSelectionList::iterator iter = oldSelection.begin(); 5265fdc4257SSteve Yin while(iter!=oldSelection.end()) 5275fdc4257SSteve Yin { 5285fdc4257SSteve Yin pAccObj->GetSelection().erase(iter->first); 5295fdc4257SSteve Yin pAccChildObj = (AccObject*)(iter->second); 5305fdc4257SSteve Yin if(pAccChildObj != NULL) 5315fdc4257SSteve Yin NotifyWinEvent(EVENT_OBJECT_SELECTIONREMOVE,pAccObj->GetParentHWND(), OBJID_CLIENT,pAccChildObj->GetResID()); 5325fdc4257SSteve Yin iter++; 5335fdc4257SSteve Yin } 5345fdc4257SSteve Yin return 0; 5355fdc4257SSteve Yin 5365fdc4257SSteve Yin } 5375fdc4257SSteve Yin 5385fdc4257SSteve Yin /** 5395fdc4257SSteve Yin * Delete child element from children list. 5405fdc4257SSteve Yin * @param pObj Child element that should be removed from parant child list. 5415fdc4257SSteve Yin * @return 5425fdc4257SSteve Yin */ 5435fdc4257SSteve Yin void AccObjectWinManager::DeleteAccChildNode( AccObject* pObj ) 5445fdc4257SSteve Yin { 5455fdc4257SSteve Yin AccObject *parentAccObj = pObj->GetParentObj(); 5465fdc4257SSteve Yin if( parentAccObj ) 5475fdc4257SSteve Yin parentAccObj->DeleteChild( pObj ); 5485fdc4257SSteve Yin } 5495fdc4257SSteve Yin 5505fdc4257SSteve Yin /** 5515fdc4257SSteve Yin * Delete XAccessible items in top window handle hashtable 5525fdc4257SSteve Yin * @param pXAcc XAccessible interface. 5535fdc4257SSteve Yin * @return 5545fdc4257SSteve Yin */ 5555fdc4257SSteve Yin void AccObjectWinManager::DeleteFromHwndXAcc(XAccessible* pXAcc ) 5565fdc4257SSteve Yin { 5575fdc4257SSteve Yin XHWNDToXAccHash::iterator iter = HwndXAcc.begin(); 5585fdc4257SSteve Yin while(iter!=HwndXAcc.end()) 5595fdc4257SSteve Yin { 5605fdc4257SSteve Yin if(iter->second == pXAcc ) 5615fdc4257SSteve Yin { 5625fdc4257SSteve Yin HwndXAcc.erase(iter); 5635fdc4257SSteve Yin return; 5645fdc4257SSteve Yin } 5655fdc4257SSteve Yin iter++; 5665fdc4257SSteve Yin } 5675fdc4257SSteve Yin } 5685fdc4257SSteve Yin 5695fdc4257SSteve Yin /** 5705fdc4257SSteve Yin * Delete Delete all children with the tree root of XAccessible pointer 5715fdc4257SSteve Yin * @param pXAcc Tree root XAccessible interface. 5725fdc4257SSteve Yin * @return 5735fdc4257SSteve Yin */ 5745fdc4257SSteve Yin void AccObjectWinManager::DeleteChildrenAccObj(XAccessible* pXAcc) 5755fdc4257SSteve Yin { 5765fdc4257SSteve Yin vos::OGuard aGuard( aDeleteMutex ); 5775fdc4257SSteve Yin AccObject* currentObj=NULL; 5785fdc4257SSteve Yin AccObject* childObj=NULL; 5795fdc4257SSteve Yin XAccessible* pTmpXAcc=NULL; 5805fdc4257SSteve Yin 5815fdc4257SSteve Yin currentObj = GetAccObjByXAcc( pXAcc); 5825fdc4257SSteve Yin if(currentObj) 5835fdc4257SSteve Yin { 5845fdc4257SSteve Yin childObj = currentObj->NextChild(); 5855fdc4257SSteve Yin while(childObj) 5865fdc4257SSteve Yin { 5875fdc4257SSteve Yin pTmpXAcc = GetXAccByAccObj(childObj); 5885fdc4257SSteve Yin if(pTmpXAcc) 5895fdc4257SSteve Yin { 5905fdc4257SSteve Yin DeleteChildrenAccObj(pTmpXAcc); 5915fdc4257SSteve Yin DeleteAccObj(pTmpXAcc); 5925fdc4257SSteve Yin } 5935fdc4257SSteve Yin childObj = currentObj->NextChild(); 5945fdc4257SSteve Yin } 5955fdc4257SSteve Yin } 5965fdc4257SSteve Yin } 5975fdc4257SSteve Yin 5985fdc4257SSteve Yin /** 5995fdc4257SSteve Yin * Delete Delete Acc object self. 6005fdc4257SSteve Yin * @param pXAcc The XAccessible interface. 6015fdc4257SSteve Yin * @return 6025fdc4257SSteve Yin */ 6035fdc4257SSteve Yin void AccObjectWinManager::DeleteAccObj( XAccessible* pXAcc ) 6045fdc4257SSteve Yin { 6055fdc4257SSteve Yin vos::OGuard aGuard( aDeleteMutex ); 6065fdc4257SSteve Yin if( pXAcc == NULL ) 6075fdc4257SSteve Yin return; 6085fdc4257SSteve Yin XIdToAccObjHash::iterator temp = XIdAccList.find(pXAcc); 6095fdc4257SSteve Yin if( temp != XIdAccList.end() ) 6105fdc4257SSteve Yin { 6115fdc4257SSteve Yin ResIdGen.SetSub( temp->second.GetResID() ); 6125fdc4257SSteve Yin } 6135fdc4257SSteve Yin else 6145fdc4257SSteve Yin { 6155fdc4257SSteve Yin return; 6165fdc4257SSteve Yin } 6175fdc4257SSteve Yin 6185fdc4257SSteve Yin AccObject& accObj = temp->second; 6195fdc4257SSteve Yin DeleteAccChildNode( &accObj ); 6205fdc4257SSteve Yin DeleteAccListener( &accObj ); 6215fdc4257SSteve Yin if( accObj.GetIMAccessible() ) 6225fdc4257SSteve Yin { 6235fdc4257SSteve Yin accObj.GetIMAccessible()->Release(); 6245fdc4257SSteve Yin } 6255fdc4257SSteve Yin XIdAccList.erase( pXAcc ); 6265fdc4257SSteve Yin XResIdAccList.erase( accObj.GetResID() ); 6275fdc4257SSteve Yin DeleteFromHwndXAcc(pXAcc); 6285fdc4257SSteve Yin } 6295fdc4257SSteve Yin 6305fdc4257SSteve Yin /** 6315fdc4257SSteve Yin * Delete listener that inspects some XAccessible object 6325fdc4257SSteve Yin * @param pAccObj Accobject pointer. 6335fdc4257SSteve Yin * @return 6345fdc4257SSteve Yin */ 6355fdc4257SSteve Yin void AccObjectWinManager::DeleteAccListener( AccObject* pAccObj ) 6365fdc4257SSteve Yin { 6375fdc4257SSteve Yin AccEventListener* listener = pAccObj->getListener(); 6385fdc4257SSteve Yin if( listener==NULL ) 6395fdc4257SSteve Yin return; 6405fdc4257SSteve Yin listener->removeMeFromBroadcaster(); 6415fdc4257SSteve Yin pAccObj->SetListener(NULL); 6425fdc4257SSteve Yin } 6435fdc4257SSteve Yin 6445fdc4257SSteve Yin /** 6455fdc4257SSteve Yin * Generate a child ID, which is used for AT 6465fdc4257SSteve Yin * @param 6475fdc4257SSteve Yin * @return New resource ID. 6485fdc4257SSteve Yin */ 6495fdc4257SSteve Yin inline long AccObjectWinManager::ImpleGenerateResID() 6505fdc4257SSteve Yin { 6515fdc4257SSteve Yin return ResIdGen.GenerateNewResID(); 6525fdc4257SSteve Yin } 6535fdc4257SSteve Yin 6545fdc4257SSteve Yin /** 6555fdc4257SSteve Yin * Insert all children of the current acc object 6565fdc4257SSteve Yin * @param pXAcc XAccessible interface 6575fdc4257SSteve Yin * @param pWnd Top Window handle 6585fdc4257SSteve Yin * @return The calling result. 6595fdc4257SSteve Yin */ 6605fdc4257SSteve Yin sal_Bool AccObjectWinManager::InsertChildrenAccObj( com::sun::star::accessibility::XAccessible* pXAcc, 6615fdc4257SSteve Yin HWND pWnd) 6625fdc4257SSteve Yin { 6635fdc4257SSteve Yin if(!IsContainer(pXAcc)) 6645fdc4257SSteve Yin return sal_False; 6655fdc4257SSteve Yin 6665fdc4257SSteve Yin Reference< XAccessibleContext > pRContext; 6675fdc4257SSteve Yin 6685fdc4257SSteve Yin if( pXAcc == NULL) 6695fdc4257SSteve Yin return sal_False; 6705fdc4257SSteve Yin pRContext = pXAcc->getAccessibleContext(); 6715fdc4257SSteve Yin if( !pRContext.is() ) 6725fdc4257SSteve Yin return sal_False; 6735fdc4257SSteve Yin 6745fdc4257SSteve Yin short role = pRContext->getAccessibleRole(); 6755fdc4257SSteve Yin 6765fdc4257SSteve Yin if(com::sun::star::accessibility::AccessibleRole::DOCUMENT == role ) 6775fdc4257SSteve Yin { 6785fdc4257SSteve Yin if(IsStateManageDescendant(pXAcc)) 6795fdc4257SSteve Yin { 6805fdc4257SSteve Yin return sal_True; 6815fdc4257SSteve Yin } 6825fdc4257SSteve Yin } 6835fdc4257SSteve Yin 6845fdc4257SSteve Yin int count = pRContext->getAccessibleChildCount(); 6855fdc4257SSteve Yin for (int i=0;i<count;i++) 6865fdc4257SSteve Yin { 6875fdc4257SSteve Yin Reference<XAccessible> mxAccessible 6885fdc4257SSteve Yin = pRContext->getAccessibleChild(i); 6895fdc4257SSteve Yin XAccessible* mpAccessible = mxAccessible.get(); 6905fdc4257SSteve Yin if(mpAccessible != NULL) 6915fdc4257SSteve Yin { 6925fdc4257SSteve Yin InsertAccObj( mpAccessible,pXAcc,pWnd ); 6935fdc4257SSteve Yin InsertChildrenAccObj(mpAccessible,pWnd); 6945fdc4257SSteve Yin } 6955fdc4257SSteve Yin } 6965fdc4257SSteve Yin 6975fdc4257SSteve Yin return sal_True; 6985fdc4257SSteve Yin } 6995fdc4257SSteve Yin 7005fdc4257SSteve Yin /** 7015fdc4257SSteve Yin * Insert child object. 7025fdc4257SSteve Yin * @param pCurObj The child object 7035fdc4257SSteve Yin * @param pParentObj The parant object 7045fdc4257SSteve Yin * @param pWnd Top window handle. 7055fdc4257SSteve Yin * @return 7065fdc4257SSteve Yin */ 7075fdc4257SSteve Yin void AccObjectWinManager::InsertAccChildNode( AccObject* pCurObj, AccObject* pParentObj, HWND /* pWnd */ ) 7085fdc4257SSteve Yin { 7095fdc4257SSteve Yin if(pCurObj) 7105fdc4257SSteve Yin { 7115fdc4257SSteve Yin if(pParentObj) 7125fdc4257SSteve Yin { 7135fdc4257SSteve Yin pParentObj->InsertChild(pCurObj); 7145fdc4257SSteve Yin } 7155fdc4257SSteve Yin else 7165fdc4257SSteve Yin { 7175fdc4257SSteve Yin pCurObj->UpdateValidWindow(); 7185fdc4257SSteve Yin } 7195fdc4257SSteve Yin } 7205fdc4257SSteve Yin } 7215fdc4257SSteve Yin 7225fdc4257SSteve Yin /** 7235fdc4257SSteve Yin * Insert child object. 7245fdc4257SSteve Yin * @param pCurObj The child object 7255fdc4257SSteve Yin * @param pParentObj The parant object 7265fdc4257SSteve Yin * @param pWnd Top window handle. 7275fdc4257SSteve Yin * @return 7285fdc4257SSteve Yin */ 7295fdc4257SSteve Yin sal_Bool AccObjectWinManager::InsertAccObj( XAccessible* pXAcc,XAccessible* pParentXAcc,HWND pWnd ) 7305fdc4257SSteve Yin { 7315fdc4257SSteve Yin if (!m_bBridgeRegistered) 7325fdc4257SSteve Yin { 7335fdc4257SSteve Yin return sal_False; 7345fdc4257SSteve Yin } 7355fdc4257SSteve Yin XIdToAccObjHash::iterator itXacc = XIdAccList.find( (void*)pXAcc ); 7365fdc4257SSteve Yin if (itXacc != XIdAccList.end() ) 7375fdc4257SSteve Yin { 7385fdc4257SSteve Yin short nCurRole =GetRole(pXAcc); 7395fdc4257SSteve Yin if (AccessibleRole::SHAPE == nCurRole) 7405fdc4257SSteve Yin { 7415fdc4257SSteve Yin AccObject &objXacc = itXacc->second; 7425fdc4257SSteve Yin AccObject *pObjParent = objXacc.GetParentObj(); 7435fdc4257SSteve Yin if (pObjParent && 7445fdc4257SSteve Yin pObjParent->GetXAccessible().is() && 7455fdc4257SSteve Yin pObjParent->GetXAccessible().get() != pParentXAcc) 7465fdc4257SSteve Yin { 7475fdc4257SSteve Yin XIdToAccObjHash::iterator itXaccParent = XIdAccList.find( (void*)pParentXAcc ); 7485fdc4257SSteve Yin if(itXaccParent != XIdAccList.end()) 7495fdc4257SSteve Yin { 7505fdc4257SSteve Yin objXacc.SetParentObj(&(itXaccParent->second)); 7515fdc4257SSteve Yin } 7525fdc4257SSteve Yin } 7535fdc4257SSteve Yin } 7545fdc4257SSteve Yin return sal_False; 7555fdc4257SSteve Yin } 7565fdc4257SSteve Yin 7575fdc4257SSteve Yin 7585fdc4257SSteve Yin Reference< XAccessibleContext > pRContext; 7595fdc4257SSteve Yin 7605fdc4257SSteve Yin if( pXAcc == NULL) 7615fdc4257SSteve Yin return sal_False; 7625fdc4257SSteve Yin 7635fdc4257SSteve Yin pRContext = pXAcc->getAccessibleContext(); 7645fdc4257SSteve Yin if( !pRContext.is() ) 7655fdc4257SSteve Yin return sal_False; 7665fdc4257SSteve Yin 7675fdc4257SSteve Yin if( pWnd == NULL ) 7685fdc4257SSteve Yin { 7695fdc4257SSteve Yin if(pParentXAcc) 7705fdc4257SSteve Yin { 7715fdc4257SSteve Yin AccObject* pObj = GetAccObjByXAcc(pParentXAcc); 7725fdc4257SSteve Yin if(pObj) 7735fdc4257SSteve Yin pWnd = pObj->GetParentHWND(); 7745fdc4257SSteve Yin } 7755fdc4257SSteve Yin if( pWnd == NULL ) 7765fdc4257SSteve Yin return sal_False; 7775fdc4257SSteve Yin } 7785fdc4257SSteve Yin 7795fdc4257SSteve Yin AccObject pObj( pXAcc,pAgent ); 7805fdc4257SSteve Yin if( pObj.GetIMAccessible() == NULL ) 7815fdc4257SSteve Yin return sal_False; 7825fdc4257SSteve Yin pObj.SetResID( this->ImpleGenerateResID()); 7835fdc4257SSteve Yin pObj.SetParentHWND( pWnd ); 7845fdc4257SSteve Yin 7855fdc4257SSteve Yin //for file name support 7865fdc4257SSteve Yin if ( pObj.GetRole() == DOCUMENT ) 7875fdc4257SSteve Yin { 7885fdc4257SSteve Yin XHWNDToDocumentHash::iterator aIter = XHWNDDocList.find( (long)pWnd ); 7895fdc4257SSteve Yin if ( aIter != XHWNDDocList.end() ) 7905fdc4257SSteve Yin { 7915fdc4257SSteve Yin XHWNDDocList.erase( aIter ); 7925fdc4257SSteve Yin } 7935fdc4257SSteve Yin XHWNDDocList.insert( XHWNDToDocumentHash::value_type( (long)pWnd, pXAcc ) ); 7945fdc4257SSteve Yin 7955fdc4257SSteve Yin } 7965fdc4257SSteve Yin //end of file name 7975fdc4257SSteve Yin 7985fdc4257SSteve Yin AccEventListener* listener = createAccEventListener(pXAcc, pAgent); 7995fdc4257SSteve Yin if(listener==NULL) 8005fdc4257SSteve Yin return sal_False; 8015fdc4257SSteve Yin Reference<XAccessibleComponent> xComponent(pRContext,UNO_QUERY); 8025fdc4257SSteve Yin Reference<XAccessibleEventBroadcaster> broadcaster(xComponent,UNO_QUERY); 8035fdc4257SSteve Yin if (broadcaster.is()) 8045fdc4257SSteve Yin { 8055fdc4257SSteve Yin Reference <XAccessibleEventListener> pp ( 8065fdc4257SSteve Yin static_cast< XAccessibleEventListener* >(listener),UNO_QUERY ); 8075fdc4257SSteve Yin if(pp.is()) 8085fdc4257SSteve Yin { 8095fdc4257SSteve Yin broadcaster->addEventListener(pp); 8105fdc4257SSteve Yin } 8115fdc4257SSteve Yin else 8125fdc4257SSteve Yin { 8135fdc4257SSteve Yin delete listener; 8145fdc4257SSteve Yin return sal_False; 8155fdc4257SSteve Yin } 8165fdc4257SSteve Yin } 8175fdc4257SSteve Yin else 8185fdc4257SSteve Yin return sal_False; 8195fdc4257SSteve Yin 8205fdc4257SSteve Yin XIdAccList.insert( XIdToAccObjHash::value_type( (void*)pXAcc, pObj )); 8215fdc4257SSteve Yin XIdToAccObjHash::iterator pIndTemp = XIdAccList.find( (void*)pXAcc ); 8225fdc4257SSteve Yin XResIdAccList.insert(XResIdToAccObjHash::value_type(pObj.GetResID(),&(pIndTemp->second))); 8235fdc4257SSteve Yin 8245fdc4257SSteve Yin AccObject* pCurObj = GetAccObjByXAcc(pXAcc); 8255fdc4257SSteve Yin if( pCurObj ) 8265fdc4257SSteve Yin { 8275fdc4257SSteve Yin pCurObj->SetListener( listener ); 8285fdc4257SSteve Yin if(listener != NULL) 8295fdc4257SSteve Yin listener->acquire(); 8305fdc4257SSteve Yin } 8315fdc4257SSteve Yin 8325fdc4257SSteve Yin AccObject* pParentObj = GetAccObjByXAcc(pParentXAcc); 8335fdc4257SSteve Yin InsertAccChildNode(pCurObj,pParentObj,pWnd); 8345fdc4257SSteve Yin if( pCurObj ) 8355fdc4257SSteve Yin pCurObj->UpdateAccessibleInfoFromUnoToMSAA(); 8365fdc4257SSteve Yin return sal_True; 8375fdc4257SSteve Yin } 8385fdc4257SSteve Yin 8395fdc4257SSteve Yin 8405fdc4257SSteve Yin /** 8415fdc4257SSteve Yin * save the pair <topwindowhandle, XAccessible> 8425fdc4257SSteve Yin * @param hWnd, top window handle 8435fdc4257SSteve Yin * @param pXAcc XAccessible interface for top window 8445fdc4257SSteve Yin * @return void 8455fdc4257SSteve Yin */ 8465fdc4257SSteve Yin void AccObjectWinManager::SaveTopWindowHandle(HWND hWnd, com::sun::star::accessibility::XAccessible* pXAcc) 8475fdc4257SSteve Yin { 8485fdc4257SSteve Yin HwndXAcc.insert( XHWNDToXAccHash::value_type( hWnd,(void*)pXAcc ) ); 8495fdc4257SSteve Yin } 8505fdc4257SSteve Yin 8515fdc4257SSteve Yin 8525fdc4257SSteve Yin /** 8535fdc4257SSteve Yin * create the corresponding listener. 8545fdc4257SSteve Yin * @param pXAcc XAccessible interface. 8555fdc4257SSteve Yin * @param Agent The agent kept in all listeners,it's the sole interface by which 8565fdc4257SSteve Yin * listener communicate with windows manager. 8575fdc4257SSteve Yin * @return 8585fdc4257SSteve Yin */ 8595fdc4257SSteve Yin AccEventListener* AccObjectWinManager::createAccEventListener(XAccessible* pXAcc, AccObjectManagerAgent* /* Agent */ ) 8605fdc4257SSteve Yin { 8615fdc4257SSteve Yin AccEventListener* listener = NULL; 8625fdc4257SSteve Yin Reference<XAccessibleContext> xContext(pXAcc->getAccessibleContext(),UNO_QUERY); 8635fdc4257SSteve Yin if(xContext.is()) 8645fdc4257SSteve Yin { 8655fdc4257SSteve Yin switch( xContext->getAccessibleRole() ) 8665fdc4257SSteve Yin { 8675fdc4257SSteve Yin case /*AccessibleRole::*/DIALOG: 8685fdc4257SSteve Yin listener = new AccDialogEventListener(pXAcc,pAgent); 8695fdc4257SSteve Yin break; 8705fdc4257SSteve Yin case /*AccessibleRole::*/FRAME: 8715fdc4257SSteve Yin listener = new AccFrameEventListener(pXAcc,pAgent); 8725fdc4257SSteve Yin break; 8735fdc4257SSteve Yin case /*AccessibleRole::*/WINDOW: 8745fdc4257SSteve Yin listener = new AccWindowEventListener(pXAcc,pAgent); 8755fdc4257SSteve Yin break; 8765fdc4257SSteve Yin case /*AccessibleRole::*/ROOT_PANE: 8775fdc4257SSteve Yin listener = new AccFrameEventListener(pXAcc,pAgent); 8785fdc4257SSteve Yin break; 8795fdc4257SSteve Yin //Container 8805fdc4257SSteve Yin case /*AccessibleRole::*/CANVAS: 8815fdc4257SSteve Yin case /*AccessibleRole::*/COMBO_BOX: 8825fdc4257SSteve Yin case /*AccessibleRole::*/DOCUMENT: 8835fdc4257SSteve Yin case /*AccessibleRole::*/END_NOTE: 8845fdc4257SSteve Yin case /*AccessibleRole::*/FILLER: 8855fdc4257SSteve Yin case /*AccessibleRole::*/FOOTNOTE: 8865fdc4257SSteve Yin case /*AccessibleRole::*/FOOTER: 8875fdc4257SSteve Yin case /*AccessibleRole::*/HEADER: 8885fdc4257SSteve Yin case /*AccessibleRole::*/LAYERED_PANE: 8895fdc4257SSteve Yin case /*AccessibleRole::*/MENU_BAR: 8905fdc4257SSteve Yin case /*AccessibleRole::*/POPUP_MENU: 8915fdc4257SSteve Yin case /*AccessibleRole::*/OPTION_PANE: 8925fdc4257SSteve Yin case /*AccessibleRole::*/PAGE_TAB: 8935fdc4257SSteve Yin case /*AccessibleRole::*/PAGE_TAB_LIST: 8945fdc4257SSteve Yin case /*AccessibleRole::*/PANEL: 8955fdc4257SSteve Yin case /*AccessibleRole::*/SCROLL_PANE: 8965fdc4257SSteve Yin case /*AccessibleRole::*/SPLIT_PANE: 8975fdc4257SSteve Yin case /*AccessibleRole::*/STATUS_BAR: 8985fdc4257SSteve Yin case /*AccessibleRole::*/TABLE_CELL: 8995fdc4257SSteve Yin case /*AccessibleRole::*/TOOL_BAR: 9005fdc4257SSteve Yin case /*AccessibleRole::*/VIEW_PORT: 9015fdc4257SSteve Yin listener = new AccContainerEventListener(pXAcc,pAgent); 9025fdc4257SSteve Yin break; 9035fdc4257SSteve Yin case /*AccessibleRole::*/PARAGRAPH: 9045fdc4257SSteve Yin case /*AccessibleRole::*/HEADING: 9055fdc4257SSteve Yin listener = new AccParagraphEventListener(pXAcc,pAgent); 9065fdc4257SSteve Yin break; 9075fdc4257SSteve Yin //Component 9085fdc4257SSteve Yin case /*AccessibleRole::*/CHECK_BOX: 9095fdc4257SSteve Yin case /*AccessibleRole::*/ICON: 9105fdc4257SSteve Yin case /*AccessibleRole::*/LABEL: 9115fdc4257SSteve Yin case /*AccessibleRole::*/MENU_ITEM: 9125fdc4257SSteve Yin case /*AccessibleRole::*/CHECK_MENU_ITEM: 9135fdc4257SSteve Yin case /*AccessibleRole::*/RADIO_MENU_ITEM: 9145fdc4257SSteve Yin case /*AccessibleRole::*/PUSH_BUTTON: 9155fdc4257SSteve Yin case /*AccessibleRole::*/RADIO_BUTTON: 9165fdc4257SSteve Yin case /*AccessibleRole::*/SCROLL_BAR: 9175fdc4257SSteve Yin case /*AccessibleRole::*/SEPARATOR: 9185fdc4257SSteve Yin case /*AccessibleRole::*/TOGGLE_BUTTON: 9195fdc4257SSteve Yin case /*AccessibleRole::*/BUTTON_DROPDOWN: 9205fdc4257SSteve Yin case /*AccessibleRole::*/TOOL_TIP: 9215fdc4257SSteve Yin case /*AccessibleRole::*/SPIN_BOX: 9225fdc4257SSteve Yin case DATE_EDITOR: 9235fdc4257SSteve Yin listener = new AccComponentEventListener(pXAcc,pAgent); 9245fdc4257SSteve Yin break; 9255fdc4257SSteve Yin //text component 9265fdc4257SSteve Yin case /*AccessibleRole::*/TEXT: 9275fdc4257SSteve Yin listener = new AccTextComponentEventListener(pXAcc,pAgent); 9285fdc4257SSteve Yin break; 9295fdc4257SSteve Yin //menu 9305fdc4257SSteve Yin case /*AccessibleRole::*/MENU: 9315fdc4257SSteve Yin listener = new AccMenuEventListener(pXAcc,pAgent); 9325fdc4257SSteve Yin break; 9335fdc4257SSteve Yin //object container 9345fdc4257SSteve Yin case /*AccessibleRole::*/SHAPE: 9355fdc4257SSteve Yin 9365fdc4257SSteve Yin case /*AccessibleRole::*/EMBEDDED_OBJECT: 9375fdc4257SSteve Yin case /*AccessibleRole::*/GRAPHIC: 9385fdc4257SSteve Yin case /*AccessibleRole::*/TEXT_FRAME: 9395fdc4257SSteve Yin listener = new AccObjectContainerEventListener(pXAcc,pAgent); 9405fdc4257SSteve Yin break; 9415fdc4257SSteve Yin //descendmanager 9425fdc4257SSteve Yin case /*AccessibleRole::*/LIST: 9435fdc4257SSteve Yin listener = new AccListEventListener(pXAcc,pAgent); 9445fdc4257SSteve Yin break; 9455fdc4257SSteve Yin case /*AccessibleRole::*/TREE: 9465fdc4257SSteve Yin listener = new AccTreeEventListener(pXAcc,pAgent); 9475fdc4257SSteve Yin break; 9485fdc4257SSteve Yin //special 9495fdc4257SSteve Yin case /*AccessibleRole::*/COLUMN_HEADER: 9505fdc4257SSteve Yin case /*AccessibleRole::*/TABLE: 9515fdc4257SSteve Yin listener = new AccTableEventListener(pXAcc,pAgent); 9525fdc4257SSteve Yin break; 9535fdc4257SSteve Yin default: 9545fdc4257SSteve Yin listener = new AccContainerEventListener(pXAcc,pAgent); 9555fdc4257SSteve Yin break; 9565fdc4257SSteve Yin } 9575fdc4257SSteve Yin } 9585fdc4257SSteve Yin 9595fdc4257SSteve Yin return listener; 9605fdc4257SSteve Yin } 9615fdc4257SSteve Yin 9625fdc4257SSteve Yin /** 9635fdc4257SSteve Yin * state is a combination integer, each bit of which represents a single state, 9645fdc4257SSteve Yin * such as focused,1 for the state on,0 for the state off. Here call COM interface 9655fdc4257SSteve Yin * to modify the state value, including DecreaseState. 9665fdc4257SSteve Yin * @param pXAcc XAccessible interface. 9675fdc4257SSteve Yin * @param pState Changed state. 9685fdc4257SSteve Yin * @return 9695fdc4257SSteve Yin */ 9705fdc4257SSteve Yin void AccObjectWinManager::DecreaseState( XAccessible* pXAcc,unsigned short pState ) 9715fdc4257SSteve Yin { 9725fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 9735fdc4257SSteve Yin if( pAccObj ) 9745fdc4257SSteve Yin pAccObj->DecreaseState( pState ); 9755fdc4257SSteve Yin } 9765fdc4257SSteve Yin 9775fdc4257SSteve Yin /** 9785fdc4257SSteve Yin * state is a combination integer, each bit of which represents a single state,such as focused,1 for 9795fdc4257SSteve Yin * the state on,0 for the state off. Here call COM interface to modify the state value, including 9805fdc4257SSteve Yin * IncreaseState. 9815fdc4257SSteve Yin * @param pXAcc XAccessible interface. 9825fdc4257SSteve Yin * @param pState Changed state. 9835fdc4257SSteve Yin * @return 9845fdc4257SSteve Yin */ 9855fdc4257SSteve Yin void AccObjectWinManager::IncreaseState( XAccessible* pXAcc,unsigned short pState ) 9865fdc4257SSteve Yin { 9875fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 9885fdc4257SSteve Yin if( pAccObj ) 9895fdc4257SSteve Yin pAccObj->IncreaseState( pState ); 9905fdc4257SSteve Yin } 9915fdc4257SSteve Yin 9925fdc4257SSteve Yin void AccObjectWinManager::UpdateState( com::sun::star::accessibility::XAccessible* pXAcc ) 9935fdc4257SSteve Yin { 9945fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 9955fdc4257SSteve Yin if( pAccObj ) 9965fdc4257SSteve Yin pAccObj->UpdateState( ); 9975fdc4257SSteve Yin } 9985fdc4257SSteve Yin 9995fdc4257SSteve Yin /** 10005fdc4257SSteve Yin * Set corresponding com object's accessible name via XAccessilbe interface and new 10015fdc4257SSteve Yin * name 10025fdc4257SSteve Yin * @param pXAcc XAccessible interface. 10035fdc4257SSteve Yin * @return 10045fdc4257SSteve Yin */ 10055fdc4257SSteve Yin void AccObjectWinManager::UpdateAccName( XAccessible* pXAcc ) 10065fdc4257SSteve Yin { 10075fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 10085fdc4257SSteve Yin if( pAccObj ) 10095fdc4257SSteve Yin pAccObj->UpdateName(); 10105fdc4257SSteve Yin } 10115fdc4257SSteve Yin 10125fdc4257SSteve Yin void AccObjectWinManager::UpdateAction( XAccessible* pXAcc ) 10135fdc4257SSteve Yin { 10145fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 10155fdc4257SSteve Yin if( pAccObj ) 10165fdc4257SSteve Yin pAccObj->UpdateAction(); 10175fdc4257SSteve Yin } 10185fdc4257SSteve Yin 10195fdc4257SSteve Yin void AccObjectWinManager::UpdateDescription( XAccessible* pXAcc ) 10205fdc4257SSteve Yin { 10215fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 10225fdc4257SSteve Yin if ( pAccObj ) 10235fdc4257SSteve Yin pAccObj->UpdateDescription(); 10245fdc4257SSteve Yin } 10255fdc4257SSteve Yin 10265fdc4257SSteve Yin /** 10275fdc4257SSteve Yin * Set corresponding com object's accessible location via XAccessilbe interface and new 10285fdc4257SSteve Yin * location. 10295fdc4257SSteve Yin * @param pXAcc XAccessible interface. 10305fdc4257SSteve Yin * @return 10315fdc4257SSteve Yin */ 10325fdc4257SSteve Yin void AccObjectWinManager::SetLocation( XAccessible* pXAcc, long /*top*/, long /*left*/, long /*width*/, long /*height*/ ) 10335fdc4257SSteve Yin { 10345fdc4257SSteve Yin AccObject* pObj = GetAccObjByXAcc( pXAcc ); 10355fdc4257SSteve Yin //get the location from XComponent. 10365fdc4257SSteve Yin Reference< XAccessibleContext > pRContext = pXAcc->getAccessibleContext(); 10375fdc4257SSteve Yin if( pObj ) 10385fdc4257SSteve Yin pObj->UpdateLocation(); 10395fdc4257SSteve Yin } 10405fdc4257SSteve Yin 10415fdc4257SSteve Yin /** 10425fdc4257SSteve Yin * Set corresponding com object's value via XAccessilbe interface and new value. 10435fdc4257SSteve Yin * @param pXAcc XAccessible interface. 10445fdc4257SSteve Yin * @param pAny new value. 10455fdc4257SSteve Yin * @return 10465fdc4257SSteve Yin */ 10475fdc4257SSteve Yin void AccObjectWinManager::SetValue( XAccessible* pXAcc, Any pAny ) 10485fdc4257SSteve Yin { 10495fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 10505fdc4257SSteve Yin if( pAccObj ) 10515fdc4257SSteve Yin pAccObj->SetValue( pAny ); 10525fdc4257SSteve Yin } 10535fdc4257SSteve Yin 10545fdc4257SSteve Yin /** 10555fdc4257SSteve Yin * Set corresponding com object's value via XAccessilbe interface. 10565fdc4257SSteve Yin * @param pXAcc XAccessible interface. 10575fdc4257SSteve Yin * @return 10585fdc4257SSteve Yin */ 10595fdc4257SSteve Yin void AccObjectWinManager::UpdateValue( XAccessible* pXAcc ) 10605fdc4257SSteve Yin { 10615fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 10625fdc4257SSteve Yin if( pAccObj ) 10635fdc4257SSteve Yin pAccObj->UpdateValue(); 10645fdc4257SSteve Yin } 10655fdc4257SSteve Yin 10665fdc4257SSteve Yin /** 10675fdc4257SSteve Yin * Set corresponding com object's name via XAccessilbe interface and new name. 10685fdc4257SSteve Yin * @param pXAcc XAccessible interface. 10695fdc4257SSteve Yin * @param newName new name 10705fdc4257SSteve Yin * @return 10715fdc4257SSteve Yin */ 10725fdc4257SSteve Yin void AccObjectWinManager::SetAccName( XAccessible* pXAcc, Any newName) 10735fdc4257SSteve Yin { 10745fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 10755fdc4257SSteve Yin if( pAccObj ) 10765fdc4257SSteve Yin pAccObj->SetName( newName ); 10775fdc4257SSteve Yin } 10785fdc4257SSteve Yin 10795fdc4257SSteve Yin /** 10805fdc4257SSteve Yin * Set corresponding com object's description via XAccessilbe interface and new description. 10815fdc4257SSteve Yin * @param pXAcc XAccessible interface. 10825fdc4257SSteve Yin * @param newDesc new description 10835fdc4257SSteve Yin * @return 10845fdc4257SSteve Yin */ 10855fdc4257SSteve Yin void AccObjectWinManager::SetDescription( XAccessible* pXAcc, Any newDesc ) 10865fdc4257SSteve Yin { 10875fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 10885fdc4257SSteve Yin if( pAccObj ) 10895fdc4257SSteve Yin pAccObj->SetDescription( newDesc ); 10905fdc4257SSteve Yin } 10915fdc4257SSteve Yin 10925fdc4257SSteve Yin /** 10935fdc4257SSteve Yin * Set corresponding com object's role via XAccessilbe interface and new role. 10945fdc4257SSteve Yin * @param pXAcc XAccessible interface. 10955fdc4257SSteve Yin * @param Role new role 10965fdc4257SSteve Yin * @return 10975fdc4257SSteve Yin */ 10985fdc4257SSteve Yin void AccObjectWinManager::SetRole( XAccessible* pXAcc, long Role ) 10995fdc4257SSteve Yin { 11005fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 11015fdc4257SSteve Yin if( pAccObj ) 11025fdc4257SSteve Yin pAccObj->SetRole( (short)Role ); 11035fdc4257SSteve Yin } 11045fdc4257SSteve Yin 11055fdc4257SSteve Yin /** 11065fdc4257SSteve Yin * Judge if a XAccessible object is a container object. 11075fdc4257SSteve Yin * @param pAccessible XAccessible interface. 11085fdc4257SSteve Yin * @return If XAccessible object is container. 11095fdc4257SSteve Yin */ 11105fdc4257SSteve Yin sal_Bool AccObjectWinManager::IsContainer(XAccessible* pAccessible) 11115fdc4257SSteve Yin { 11125fdc4257SSteve Yin try 11135fdc4257SSteve Yin { 11145fdc4257SSteve Yin if(pAccessible) 11155fdc4257SSteve Yin { 11165fdc4257SSteve Yin Reference<XAccessibleContext> xContext(pAccessible->getAccessibleContext(),UNO_QUERY); 11175fdc4257SSteve Yin if(xContext.is()) 11185fdc4257SSteve Yin { 11195fdc4257SSteve Yin switch( xContext->getAccessibleRole() ) 11205fdc4257SSteve Yin { 11215fdc4257SSteve Yin case /*AccessibleRole::*/DIALOG: 11225fdc4257SSteve Yin case /*AccessibleRole::*/FRAME: 11235fdc4257SSteve Yin case /*AccessibleRole::*/WINDOW: 11245fdc4257SSteve Yin case /*AccessibleRole::*/ROOT_PANE: 11255fdc4257SSteve Yin case /*AccessibleRole::*/CANVAS: 11265fdc4257SSteve Yin case /*AccessibleRole::*/COMBO_BOX: 11275fdc4257SSteve Yin case /*AccessibleRole::*/DOCUMENT: 11285fdc4257SSteve Yin case /*AccessibleRole::*/EMBEDDED_OBJECT: 11295fdc4257SSteve Yin case /*AccessibleRole::*/END_NOTE: 11305fdc4257SSteve Yin case /*AccessibleRole::*/FILLER: 11315fdc4257SSteve Yin case /*AccessibleRole::*/FOOTNOTE: 11325fdc4257SSteve Yin case /*AccessibleRole::*/FOOTER: 11335fdc4257SSteve Yin case /*AccessibleRole::*/GRAPHIC: 11345fdc4257SSteve Yin case /*AccessibleRole::*/GROUP_BOX: 11355fdc4257SSteve Yin case /*AccessibleRole::*/HEADER: 11365fdc4257SSteve Yin case /*AccessibleRole::*/LAYERED_PANE: 11375fdc4257SSteve Yin case /*AccessibleRole::*/MENU_BAR: 11385fdc4257SSteve Yin case /*AccessibleRole::*/POPUP_MENU: 11395fdc4257SSteve Yin case /*AccessibleRole::*/OPTION_PANE: 11405fdc4257SSteve Yin case /*AccessibleRole::*/PAGE_TAB: 11415fdc4257SSteve Yin case /*AccessibleRole::*/PAGE_TAB_LIST: 11425fdc4257SSteve Yin case /*AccessibleRole::*/PANEL: 11435fdc4257SSteve Yin case /*AccessibleRole::*/SCROLL_PANE: 11445fdc4257SSteve Yin case /*AccessibleRole::*/SPLIT_PANE: 11455fdc4257SSteve Yin case /*AccessibleRole::*/STATUS_BAR: 11465fdc4257SSteve Yin case /*AccessibleRole::*/TABLE_CELL: 11475fdc4257SSteve Yin case /*AccessibleRole::*/TEXT_FRAME: 11485fdc4257SSteve Yin case /*AccessibleRole::*/TOOL_BAR: 11495fdc4257SSteve Yin case /*AccessibleRole::*/VIEW_PORT: 11505fdc4257SSteve Yin case /*AccessibleRole::*/SHAPE: 11515fdc4257SSteve Yin return sal_True; 11525fdc4257SSteve Yin break; 11535fdc4257SSteve Yin case /*AccessibleRole::*/COLUMN_HEADER: 11545fdc4257SSteve Yin case /*AccessibleRole::*/TABLE: 11555fdc4257SSteve Yin if(!IsStateManageDescendant(pAccessible)) 11565fdc4257SSteve Yin return sal_True; 11575fdc4257SSteve Yin break; 11585fdc4257SSteve Yin case /*AccessibleRole::*/MENU: 11595fdc4257SSteve Yin return sal_True; 11605fdc4257SSteve Yin break; 11615fdc4257SSteve Yin default: 11625fdc4257SSteve Yin return sal_False; 11635fdc4257SSteve Yin } 11645fdc4257SSteve Yin } 11655fdc4257SSteve Yin } 11665fdc4257SSteve Yin } 11675fdc4257SSteve Yin catch(...) 11685fdc4257SSteve Yin { 11695fdc4257SSteve Yin return sal_False; 11705fdc4257SSteve Yin } 11715fdc4257SSteve Yin return sal_False; 11725fdc4257SSteve Yin } 11735fdc4257SSteve Yin 11745fdc4257SSteve Yin /** 11755fdc4257SSteve Yin * Judge if a XAccessible object has ManageDescendant event. 11765fdc4257SSteve Yin * @param pAccessible XAccessible interface. 11775fdc4257SSteve Yin * @return If XAccessible object is managedescendant. 11785fdc4257SSteve Yin */ 11795fdc4257SSteve Yin bool AccObjectWinManager::IsStateManageDescendant(XAccessible* pAccessible) 11805fdc4257SSteve Yin { 11815fdc4257SSteve Yin if(pAccessible) 11825fdc4257SSteve Yin { 11835fdc4257SSteve Yin Reference<XAccessibleContext> xContext(pAccessible->getAccessibleContext(),UNO_QUERY); 11845fdc4257SSteve Yin if(xContext.is()) 11855fdc4257SSteve Yin { 11865fdc4257SSteve Yin Reference< XAccessibleStateSet > pRState = xContext->getAccessibleStateSet(); 11875fdc4257SSteve Yin if( !pRState.is() ) 11885fdc4257SSteve Yin return sal_False; 11895fdc4257SSteve Yin 11905fdc4257SSteve Yin Sequence<short> pStates = pRState->getStates(); 11915fdc4257SSteve Yin int count = pStates.getLength(); 11925fdc4257SSteve Yin for( int iIndex = 0;iIndex < count;iIndex++ ) 11935fdc4257SSteve Yin { 11945fdc4257SSteve Yin if(pStates[iIndex] == /*AccessibleStateType::*/MANAGES_DESCENDANTS) 11955fdc4257SSteve Yin return sal_True; 11965fdc4257SSteve Yin } 11975fdc4257SSteve Yin } 11985fdc4257SSteve Yin } 11995fdc4257SSteve Yin return sal_False; 12005fdc4257SSteve Yin } 12015fdc4257SSteve Yin 12025fdc4257SSteve Yin /** 12035fdc4257SSteve Yin * Query and get IAccessible interface by XAccessible interface from list. 12045fdc4257SSteve Yin * @param pXAcc XAccessible interface. 12055fdc4257SSteve Yin * @return Com accobject interface. 12065fdc4257SSteve Yin */ 12075fdc4257SSteve Yin IMAccessible* AccObjectWinManager::GetIMAccByXAcc(XAccessible* pXAcc) 12085fdc4257SSteve Yin { 12095fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc(pXAcc); 12105fdc4257SSteve Yin if(pAccObj) 12115fdc4257SSteve Yin { 12125fdc4257SSteve Yin return pAccObj->GetIMAccessible(); 12135fdc4257SSteve Yin } 12145fdc4257SSteve Yin else 12155fdc4257SSteve Yin { 12165fdc4257SSteve Yin return NULL; 12175fdc4257SSteve Yin } 12185fdc4257SSteve Yin } 12195fdc4257SSteve Yin 12205fdc4257SSteve Yin /** 12215fdc4257SSteve Yin * Query and get IAccessible interface by child id from list. 12225fdc4257SSteve Yin * @param resID, childID. 12235fdc4257SSteve Yin * @return Com accobject interface. 12245fdc4257SSteve Yin */ 12255fdc4257SSteve Yin IMAccessible * AccObjectWinManager::GetIAccessibleFromResID(long resID) 12265fdc4257SSteve Yin { 12275fdc4257SSteve Yin XResIdToAccObjHash::iterator pIndTemp = XResIdAccList.find( resID ); 12285fdc4257SSteve Yin if ( pIndTemp == XResIdAccList.end() ) 12295fdc4257SSteve Yin return NULL; 12305fdc4257SSteve Yin 12315fdc4257SSteve Yin AccObject* pObj = pIndTemp->second; 12325fdc4257SSteve Yin 12335fdc4257SSteve Yin if(pObj->GetIMAccessible()) 12345fdc4257SSteve Yin return pObj->GetIMAccessible(); 12355fdc4257SSteve Yin return NULL; 12365fdc4257SSteve Yin } 12375fdc4257SSteve Yin /** 12385fdc4257SSteve Yin * Notify some object will be destroyed. 12395fdc4257SSteve Yin * @param pXAcc XAccessible interface. 12405fdc4257SSteve Yin * @return Com accobject interface. 12415fdc4257SSteve Yin */ 12425fdc4257SSteve Yin void AccObjectWinManager::NotifyDestroy(XAccessible* pXAcc) 12435fdc4257SSteve Yin { 12445fdc4257SSteve Yin AccObject* accObj = GetAccObjByXAcc(pXAcc); 12455fdc4257SSteve Yin if(accObj) 12465fdc4257SSteve Yin { 12475fdc4257SSteve Yin accObj->NotifyDestroy(sal_True); 12485fdc4257SSteve Yin } 12495fdc4257SSteve Yin } 12505fdc4257SSteve Yin 12515fdc4257SSteve Yin 12525fdc4257SSteve Yin void AccObjectWinManager::UpdateChildState(com::sun::star::accessibility::XAccessible* pAccSubMenu) 12535fdc4257SSteve Yin { 12545fdc4257SSteve Yin Reference<com::sun::star::accessibility::XAccessibleContext> xContext(pAccSubMenu,UNO_QUERY); 12555fdc4257SSteve Yin if (!xContext.is()) 12565fdc4257SSteve Yin { 12575fdc4257SSteve Yin return; 12585fdc4257SSteve Yin } 12595fdc4257SSteve Yin sal_Int32 nCount = xContext->getAccessibleChildCount(); 12605fdc4257SSteve Yin for (sal_Int32 i = 0 ; i < nCount ; ++i) 12615fdc4257SSteve Yin { 12625fdc4257SSteve Yin Reference<com::sun::star::accessibility::XAccessible> xChild = xContext->getAccessibleChild(i); 12635fdc4257SSteve Yin if (xChild.is()) 12645fdc4257SSteve Yin { 12655fdc4257SSteve Yin AccObject *pObj = GetAccObjByXAcc(xChild.get()); 12665fdc4257SSteve Yin if (pObj) 12675fdc4257SSteve Yin { 12685fdc4257SSteve Yin pObj->UpdateState(); 12695fdc4257SSteve Yin } 12705fdc4257SSteve Yin } 12715fdc4257SSteve Yin } 12725fdc4257SSteve Yin } 12735fdc4257SSteve Yin 12745fdc4257SSteve Yin 12755fdc4257SSteve Yin bool AccObjectWinManager::IsSpecialToolboItem(com::sun::star::accessibility::XAccessible* pXAcc) 12765fdc4257SSteve Yin { 12775fdc4257SSteve Yin if (pXAcc && oldFocus != pXAcc) 12785fdc4257SSteve Yin { 12795fdc4257SSteve Yin if(GetParentRole(pXAcc) == TOOL_BAR) 12805fdc4257SSteve Yin { 12815fdc4257SSteve Yin Reference< XAccessibleContext > pRContext(pXAcc->getAccessibleContext()); 12825fdc4257SSteve Yin if (pRContext.is()) 12835fdc4257SSteve Yin { 12845fdc4257SSteve Yin if(pRContext->getAccessibleRole() == TOGGLE_BUTTON) 12855fdc4257SSteve Yin { 12865fdc4257SSteve Yin return true; 12875fdc4257SSteve Yin } 12885fdc4257SSteve Yin } 12895fdc4257SSteve Yin } 12905fdc4257SSteve Yin } 12915fdc4257SSteve Yin return false; 12925fdc4257SSteve Yin } 12935fdc4257SSteve Yin 12945fdc4257SSteve Yin short AccObjectWinManager::GetRole(com::sun::star::accessibility::XAccessible* pXAcc) 12955fdc4257SSteve Yin { 12965fdc4257SSteve Yin assert(pXAcc != NULL); 12975fdc4257SSteve Yin Reference<com::sun::star::accessibility::XAccessibleContext> xContext(pXAcc->getAccessibleContext(),UNO_QUERY); 12985fdc4257SSteve Yin if(xContext.is()) 12995fdc4257SSteve Yin { 13005fdc4257SSteve Yin return xContext->getAccessibleRole(); 13015fdc4257SSteve Yin } 13025fdc4257SSteve Yin return -1; 13035fdc4257SSteve Yin } 13045fdc4257SSteve Yin 13055fdc4257SSteve Yin XAccessible* AccObjectWinManager::GetAccDocByHWND( long pWnd ) 13065fdc4257SSteve Yin { 13075fdc4257SSteve Yin XHWNDToDocumentHash::iterator aIter; 13085fdc4257SSteve Yin aIter = XHWNDDocList.find( pWnd ); 13095fdc4257SSteve Yin if ( aIter != XHWNDDocList.end() ) 13105fdc4257SSteve Yin { 13115fdc4257SSteve Yin return aIter->second; 13125fdc4257SSteve Yin } 13135fdc4257SSteve Yin 13145fdc4257SSteve Yin return NULL; 13155fdc4257SSteve Yin } 13165fdc4257SSteve Yin 13175fdc4257SSteve Yin XAccessible* AccObjectWinManager::GetAccDocByAccTopWin( XAccessible* pXAcc ) 13185fdc4257SSteve Yin { 13195fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 13205fdc4257SSteve Yin long pWnd = (long)( pAccObj->GetParentHWND() ); 13215fdc4257SSteve Yin return GetAccDocByHWND( pWnd ); 13225fdc4257SSteve Yin } 13235fdc4257SSteve Yin 13245fdc4257SSteve Yin bool AccObjectWinManager::IsTopWinAcc( com::sun::star::accessibility::XAccessible* pXAcc ) 13255fdc4257SSteve Yin { 13265fdc4257SSteve Yin bool bRet = false; 13275fdc4257SSteve Yin AccObject* pAccObj = GetAccObjByXAcc( pXAcc ); 13285fdc4257SSteve Yin if ( pAccObj ) 13295fdc4257SSteve Yin { 13305fdc4257SSteve Yin bRet = ( pAccObj->GetParentObj() == NULL ); 13315fdc4257SSteve Yin } 13325fdc4257SSteve Yin return bRet; 13335fdc4257SSteve Yin }