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