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