1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski #ifndef __ACCOBJECTWINMANAGER_HXX
23*b1cdbd2cSJim Jagielski #define __ACCOBJECTWINMANAGER_HXX
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLE_HPP_
26*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/XAccessible.hpp>
27*b1cdbd2cSJim Jagielski #endif
28*b1cdbd2cSJim Jagielski #include <map>
29*b1cdbd2cSJim Jagielski #include <windows.h>
30*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx>
31*b1cdbd2cSJim Jagielski #include <vcl/dllapi.h>
32*b1cdbd2cSJim Jagielski #include "ResIDGenerator.hxx"
33*b1cdbd2cSJim Jagielski #include "UAccCOM2.h"
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski class ResIDGenerator;
36*b1cdbd2cSJim Jagielski class AccObjectManagerAgent;
37*b1cdbd2cSJim Jagielski class AccEventListener;
38*b1cdbd2cSJim Jagielski class AccObject;
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski /*******************************************************************
41*b1cdbd2cSJim Jagielski AccObjectWinManager complete the functions:
42*b1cdbd2cSJim Jagielski 1. Insert, delete,query,update Acc objects
43*b1cdbd2cSJim Jagielski 2. Create, delete,fire AccEventLister, the lifecycle of AccEventListener is as same as
44*b1cdbd2cSJim Jagielski    Acc Object
45*b1cdbd2cSJim Jagielski  3.Return COM interface for AT,by the call back in salframe
46*b1cdbd2cSJim Jagielski  4.Pass accessible information to Acc objects
47*b1cdbd2cSJim Jagielski  *******************************************************************/
48*b1cdbd2cSJim Jagielski class AccObjectWinManager
49*b1cdbd2cSJim Jagielski {
50*b1cdbd2cSJim Jagielski     friend class AccObjectManagerAgent;
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski private:
53*b1cdbd2cSJim Jagielski     struct ltstr1
54*b1cdbd2cSJim Jagielski     {
operator ()AccObjectWinManager::ltstr155*b1cdbd2cSJim Jagielski         bool operator()(const void*  s1, const void*  s2) const
56*b1cdbd2cSJim Jagielski         {
57*b1cdbd2cSJim Jagielski             return long(s1)<long(s2);
58*b1cdbd2cSJim Jagielski         }
59*b1cdbd2cSJim Jagielski     };
60*b1cdbd2cSJim Jagielski     struct ltstr2
61*b1cdbd2cSJim Jagielski     {
operator ()AccObjectWinManager::ltstr262*b1cdbd2cSJim Jagielski         bool operator()(const HWND  s1, const HWND  s2) const
63*b1cdbd2cSJim Jagielski         {
64*b1cdbd2cSJim Jagielski             return long(s1)<long(s2);
65*b1cdbd2cSJim Jagielski         }
66*b1cdbd2cSJim Jagielski     };
67*b1cdbd2cSJim Jagielski     struct ltstr3
68*b1cdbd2cSJim Jagielski     {
operator ()AccObjectWinManager::ltstr369*b1cdbd2cSJim Jagielski         bool operator()(const long  s1, const long  s2) const
70*b1cdbd2cSJim Jagielski         {
71*b1cdbd2cSJim Jagielski             return long(s1)<long(s2);
72*b1cdbd2cSJim Jagielski         }
73*b1cdbd2cSJim Jagielski     };
74*b1cdbd2cSJim Jagielski     typedef std::map< void*, AccObject,ltstr1 > XIdToAccObjHash;
75*b1cdbd2cSJim Jagielski     typedef std::map< HWND,void*,ltstr2 > XHWNDToXAccHash;
76*b1cdbd2cSJim Jagielski     typedef std::map< const long, AccObject*,ltstr3 > XResIdToAccObjHash;
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski     typedef std::map< const long, com::sun::star::accessibility::XAccessible*,ltstr3 > XHWNDToDocumentHash;
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski     //XAccessible to AccObject
82*b1cdbd2cSJim Jagielski     XIdToAccObjHash  XIdAccList;
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski     //HWND to All XAccessible pointer
85*b1cdbd2cSJim Jagielski     XHWNDToXAccHash  HwndXAcc;
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski     //id_Child to AccObject
88*b1cdbd2cSJim Jagielski     XResIdToAccObjHash XResIdAccList;
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski     //for file name support
91*b1cdbd2cSJim Jagielski     XHWNDToDocumentHash XHWNDDocList;
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski     com::sun::star::accessibility::XAccessible* oldFocus;
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski     AccObjectManagerAgent*	 pAgent;
96*b1cdbd2cSJim Jagielski     static AccObjectWinManager* me;
97*b1cdbd2cSJim Jagielski     ResIDGenerator ResIdGen;
98*b1cdbd2cSJim Jagielski     mutable ::vos::OMutex aDeleteMutex;
99*b1cdbd2cSJim Jagielski     mutable ::vos::OMutex aNotifyMutex;
100*b1cdbd2cSJim Jagielski     mutable ::vos::OMutex maATInterfaceMutex;
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski     AccObjectWinManager(AccObjectManagerAgent* Agent=NULL);
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski private:
105*b1cdbd2cSJim Jagielski     long ImpleGenerateResID();
106*b1cdbd2cSJim Jagielski     AccObject* GetAccObjByXAcc( com::sun::star::accessibility::XAccessible* pXAcc);
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski     com::sun::star::accessibility::XAccessible* GetXAccByAccObj(AccObject* pAccObj);
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski     AccObject* GetTopWindowAccObj(HWND hWnd);
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski     com::sun::star::accessibility::XAccessible* GetAccDocByHWND( long pWnd );
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski     void       DeleteAccListener( AccObject* pAccObj );
115*b1cdbd2cSJim Jagielski     void       InsertAccChildNode(AccObject* pCurObj,AccObject* pParentObj,HWND pWnd);
116*b1cdbd2cSJim Jagielski     void       DeleteAccChildNode(AccObject* pChild);
117*b1cdbd2cSJim Jagielski     void       DeleteFromHwndXAcc(com::sun::star::accessibility::XAccessible* pXAcc );
118*b1cdbd2cSJim Jagielski     int  UpdateAccSelection(com::sun::star::accessibility::XAccessible* pXAcc);
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski     AccEventListener* createAccEventListener(com::sun::star::accessibility::XAccessible* pXAcc, AccObjectManagerAgent* Agent);
121*b1cdbd2cSJim Jagielski public:
122*b1cdbd2cSJim Jagielski     virtual ~AccObjectWinManager();
123*b1cdbd2cSJim Jagielski     sal_Bool InsertAccObj( com::sun::star::accessibility::XAccessible* pXAcc,com::sun::star::accessibility::XAccessible* pParentXAcc,HWND pWnd);
124*b1cdbd2cSJim Jagielski     sal_Bool InsertChildrenAccObj( com::sun::star::accessibility::XAccessible* pXAcc,HWND pWnd=0);
125*b1cdbd2cSJim Jagielski     void DeleteAccObj( com::sun::star::accessibility::XAccessible* pXAcc );
126*b1cdbd2cSJim Jagielski     void DeleteChildrenAccObj(com::sun::star::accessibility::XAccessible* pAccObj);
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski     static  AccObjectWinManager* CreateAccObjectWinManagerInstance(AccObjectManagerAgent* Agent);
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski     sal_Bool NotifyAccEvent( com::sun::star::accessibility::XAccessible* pXAcc,short state = 0 );
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski     long Get_ToATInterface( HWND hWnd, long lParam, long wParam);
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski     void  DecreaseState( com::sun::star::accessibility::XAccessible* pXAcc,unsigned short pState );
135*b1cdbd2cSJim Jagielski     void  IncreaseState( com::sun::star::accessibility::XAccessible* pXAcc,unsigned short pState );
136*b1cdbd2cSJim Jagielski     void  UpdateState( com::sun::star::accessibility::XAccessible* pXAcc );
137*b1cdbd2cSJim Jagielski     void  SetLocation( com::sun::star::accessibility::XAccessible* pXAcc,
138*b1cdbd2cSJim Jagielski                        long Top = 0,long left = 0,long width = 0,long height = 0);
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski     void  SetValue( com::sun::star::accessibility::XAccessible* pXAcc, com::sun::star::uno::Any pAny );
141*b1cdbd2cSJim Jagielski     void  UpdateValue( com::sun::star::accessibility::XAccessible* pXAcc );
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski     void  SetAccName( com::sun::star::accessibility::XAccessible* pXAcc, com::sun::star::uno::Any newName);
144*b1cdbd2cSJim Jagielski     void  UpdateAccName( com::sun::star::accessibility::XAccessible* pXAcc );
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski     void  SetDescription( com::sun::star::accessibility::XAccessible* pXAcc, com::sun::star::uno::Any newDesc );
147*b1cdbd2cSJim Jagielski     void UpdateDescription( com::sun::star::accessibility::XAccessible* pXAcc );
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski     void  SetRole( com::sun::star::accessibility::XAccessible* pXAcc, long Role );
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski     void  UpdateAccFocus( com::sun::star::accessibility::XAccessible* newFocus );
152*b1cdbd2cSJim Jagielski     void  UpdateAction( com::sun::star::accessibility::XAccessible* pXAcc );
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski     sal_Bool IsContainer( com::sun::star::accessibility::XAccessible* pAccessible );
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski     IMAccessible* GetIMAccByXAcc( com::sun::star::accessibility::XAccessible* pXAcc );
157*b1cdbd2cSJim Jagielski     IMAccessible* GetIAccessibleFromResID(long resID);
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski     void NotifyDestroy( com::sun::star::accessibility::XAccessible* pXAcc );
160*b1cdbd2cSJim Jagielski     com::sun::star::accessibility::XAccessible* GetParentXAccessible( com::sun::star::accessibility::XAccessible* pXAcc );
161*b1cdbd2cSJim Jagielski     short GetParentRole( com::sun::star::accessibility::XAccessible* pXAcc );
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski     void SaveTopWindowHandle(HWND hWnd, com::sun::star::accessibility::XAccessible* pXAcc);
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski     void UpdateChildState(com::sun::star::accessibility::XAccessible* pXAcc);
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski     bool IsSpecialToolboItem(com::sun::star::accessibility::XAccessible* pXAcc);
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski     short GetRole(com::sun::star::accessibility::XAccessible* pXAcc);
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski     com::sun::star::accessibility::XAccessible* GetAccDocByAccTopWin( com::sun::star::accessibility::XAccessible* pXAcc );
172*b1cdbd2cSJim Jagielski     bool IsTopWinAcc( com::sun::star::accessibility::XAccessible* pXAcc );
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski     bool IsStateManageDescendant(com::sun::star::accessibility::XAccessible* pAccessible);
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski };
177*b1cdbd2cSJim Jagielski #endif
178