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  *************************************************************/
215fdc4257SSteve Yin 
225fdc4257SSteve Yin #ifndef __ACCOBJECTWINMANAGER_HXX
235fdc4257SSteve Yin #define __ACCOBJECTWINMANAGER_HXX
245fdc4257SSteve Yin 
255fdc4257SSteve Yin #ifndef _COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLE_HPP_
265fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessible.hpp>
275fdc4257SSteve Yin #endif
285fdc4257SSteve Yin #include <map>
295fdc4257SSteve Yin #include <windows.h>
305fdc4257SSteve Yin #include <vos/mutex.hxx>
31*3a700b0aSSteve Yin #include <vcl/dllapi.h>
325fdc4257SSteve Yin #include "ResIDGenerator.hxx"
335fdc4257SSteve Yin #include "UAccCOM2.h"
345fdc4257SSteve Yin 
355fdc4257SSteve Yin class ResIDGenerator;
365fdc4257SSteve Yin class AccObjectManagerAgent;
375fdc4257SSteve Yin class AccEventListener;
385fdc4257SSteve Yin class AccObject;
395fdc4257SSteve Yin 
405fdc4257SSteve Yin /*******************************************************************
415fdc4257SSteve Yin AccObjectWinManager complete the functions:
425fdc4257SSteve Yin 1. Insert, delete,query,update Acc objects
435fdc4257SSteve Yin 2. Create, delete,fire AccEventLister, the lifecycle of AccEventListener is as same as
445fdc4257SSteve Yin    Acc Object
455fdc4257SSteve Yin  3.Return COM interface for AT,by the call back in salframe
465fdc4257SSteve Yin  4.Pass accessible information to Acc objects
475fdc4257SSteve Yin  *******************************************************************/
485fdc4257SSteve Yin class AccObjectWinManager
495fdc4257SSteve Yin {
505fdc4257SSteve Yin     friend class AccObjectManagerAgent;
515fdc4257SSteve Yin 
525fdc4257SSteve Yin private:
535fdc4257SSteve Yin     struct ltstr1
545fdc4257SSteve Yin     {
555fdc4257SSteve Yin         bool operator()(const void*  s1, const void*  s2) const
565fdc4257SSteve Yin         {
575fdc4257SSteve Yin             return long(s1)<long(s2);
585fdc4257SSteve Yin         }
595fdc4257SSteve Yin     };
605fdc4257SSteve Yin     struct ltstr2
615fdc4257SSteve Yin     {
625fdc4257SSteve Yin         bool operator()(const HWND  s1, const HWND  s2) const
635fdc4257SSteve Yin         {
645fdc4257SSteve Yin             return long(s1)<long(s2);
655fdc4257SSteve Yin         }
665fdc4257SSteve Yin     };
675fdc4257SSteve Yin     struct ltstr3
685fdc4257SSteve Yin     {
695fdc4257SSteve Yin         bool operator()(const long  s1, const long  s2) const
705fdc4257SSteve Yin         {
715fdc4257SSteve Yin             return long(s1)<long(s2);
725fdc4257SSteve Yin         }
735fdc4257SSteve Yin     };
745fdc4257SSteve Yin     typedef std::map< void*, AccObject,ltstr1 > XIdToAccObjHash;
755fdc4257SSteve Yin     typedef std::map< HWND,void*,ltstr2 > XHWNDToXAccHash;
765fdc4257SSteve Yin     typedef std::map< const long, AccObject*,ltstr3 > XResIdToAccObjHash;
775fdc4257SSteve Yin 
785fdc4257SSteve Yin     typedef std::map< const long, com::sun::star::accessibility::XAccessible*,ltstr3 > XHWNDToDocumentHash;
795fdc4257SSteve Yin 
805fdc4257SSteve Yin 
815fdc4257SSteve Yin     //XAccessible to AccObject
825fdc4257SSteve Yin     XIdToAccObjHash  XIdAccList;
835fdc4257SSteve Yin 
845fdc4257SSteve Yin     //HWND to All XAccessible pointer
855fdc4257SSteve Yin     XHWNDToXAccHash  HwndXAcc;
865fdc4257SSteve Yin 
875fdc4257SSteve Yin     //id_Child to AccObject
885fdc4257SSteve Yin     XResIdToAccObjHash XResIdAccList;
895fdc4257SSteve Yin 
905fdc4257SSteve Yin     //for file name support
915fdc4257SSteve Yin     XHWNDToDocumentHash XHWNDDocList;
925fdc4257SSteve Yin 
935fdc4257SSteve Yin     com::sun::star::accessibility::XAccessible* oldFocus;
945fdc4257SSteve Yin 
955fdc4257SSteve Yin     AccObjectManagerAgent*	 pAgent;
965fdc4257SSteve Yin     static AccObjectWinManager* me;
975fdc4257SSteve Yin     ResIDGenerator ResIdGen;
985fdc4257SSteve Yin     mutable ::vos::OMutex aDeleteMutex;
995fdc4257SSteve Yin     mutable ::vos::OMutex aNotifyMutex;
1005fdc4257SSteve Yin     mutable ::vos::OMutex maATInterfaceMutex;
1015fdc4257SSteve Yin 
1025fdc4257SSteve Yin     AccObjectWinManager(AccObjectManagerAgent* Agent=NULL);
1035fdc4257SSteve Yin 	bool m_bBridgeRegistered;
1045fdc4257SSteve Yin 
1055fdc4257SSteve Yin private:
1065fdc4257SSteve Yin     long ImpleGenerateResID();
1075fdc4257SSteve Yin     AccObject* GetAccObjByXAcc( com::sun::star::accessibility::XAccessible* pXAcc);
1085fdc4257SSteve Yin 
1095fdc4257SSteve Yin     com::sun::star::accessibility::XAccessible* GetXAccByAccObj(AccObject* pAccObj);
1105fdc4257SSteve Yin 
1115fdc4257SSteve Yin     AccObject* GetTopWindowAccObj(HWND hWnd);
1125fdc4257SSteve Yin 
1135fdc4257SSteve Yin     com::sun::star::accessibility::XAccessible* GetAccDocByHWND( long pWnd );
1145fdc4257SSteve Yin 
1155fdc4257SSteve Yin     void       DeleteAccListener( AccObject* pAccObj );
1165fdc4257SSteve Yin     void       InsertAccChildNode(AccObject* pCurObj,AccObject* pParentObj,HWND pWnd);
1175fdc4257SSteve Yin     void       DeleteAccChildNode(AccObject* pChild);
1185fdc4257SSteve Yin     void       DeleteFromHwndXAcc(com::sun::star::accessibility::XAccessible* pXAcc );
1195fdc4257SSteve Yin     int  UpdateAccSelection(com::sun::star::accessibility::XAccessible* pXAcc);
1205fdc4257SSteve Yin 
1215fdc4257SSteve Yin     AccEventListener* createAccEventListener(com::sun::star::accessibility::XAccessible* pXAcc, AccObjectManagerAgent* Agent);
1225fdc4257SSteve Yin public:
1235fdc4257SSteve Yin     virtual ~AccObjectWinManager();
1245fdc4257SSteve Yin     sal_Bool InsertAccObj( com::sun::star::accessibility::XAccessible* pXAcc,com::sun::star::accessibility::XAccessible* pParentXAcc,HWND pWnd);
1255fdc4257SSteve Yin     sal_Bool InsertChildrenAccObj( com::sun::star::accessibility::XAccessible* pXAcc,HWND pWnd=0);
1265fdc4257SSteve Yin     void DeleteAccObj( com::sun::star::accessibility::XAccessible* pXAcc );
1275fdc4257SSteve Yin     void DeleteChildrenAccObj(com::sun::star::accessibility::XAccessible* pAccObj);
1285fdc4257SSteve Yin 
1295fdc4257SSteve Yin     static  AccObjectWinManager* CreateAccObjectWinManagerInstance(AccObjectManagerAgent* Agent);
1305fdc4257SSteve Yin 
1315fdc4257SSteve Yin     sal_Bool NotifyAccEvent( com::sun::star::accessibility::XAccessible* pXAcc,short state = 0 );
1325fdc4257SSteve Yin 
1335fdc4257SSteve Yin     long Get_ToATInterface( HWND hWnd, long lParam, long wParam);
1345fdc4257SSteve Yin 
1355fdc4257SSteve Yin     void  DecreaseState( com::sun::star::accessibility::XAccessible* pXAcc,unsigned short pState );
1365fdc4257SSteve Yin     void  IncreaseState( com::sun::star::accessibility::XAccessible* pXAcc,unsigned short pState );
1375fdc4257SSteve Yin     void  UpdateState( com::sun::star::accessibility::XAccessible* pXAcc );
1385fdc4257SSteve Yin     void  SetLocation( com::sun::star::accessibility::XAccessible* pXAcc,
1395fdc4257SSteve Yin                        long Top = 0,long left = 0,long width = 0,long height = 0);
1405fdc4257SSteve Yin 
1415fdc4257SSteve Yin     void  SetValue( com::sun::star::accessibility::XAccessible* pXAcc, com::sun::star::uno::Any pAny );
1425fdc4257SSteve Yin     void  UpdateValue( com::sun::star::accessibility::XAccessible* pXAcc );
1435fdc4257SSteve Yin 
1445fdc4257SSteve Yin     void  SetAccName( com::sun::star::accessibility::XAccessible* pXAcc, com::sun::star::uno::Any newName);
1455fdc4257SSteve Yin     void  UpdateAccName( com::sun::star::accessibility::XAccessible* pXAcc );
1465fdc4257SSteve Yin 
1475fdc4257SSteve Yin     void  SetDescription( com::sun::star::accessibility::XAccessible* pXAcc, com::sun::star::uno::Any newDesc );
1485fdc4257SSteve Yin     void UpdateDescription( com::sun::star::accessibility::XAccessible* pXAcc );
1495fdc4257SSteve Yin 
1505fdc4257SSteve Yin     void  SetRole( com::sun::star::accessibility::XAccessible* pXAcc, long Role );
1515fdc4257SSteve Yin 
1525fdc4257SSteve Yin     void  UpdateAccFocus( com::sun::star::accessibility::XAccessible* newFocus );
1535fdc4257SSteve Yin     void  UpdateAction( com::sun::star::accessibility::XAccessible* pXAcc );
1545fdc4257SSteve Yin 
1555fdc4257SSteve Yin     sal_Bool IsContainer( com::sun::star::accessibility::XAccessible* pAccessible );
1565fdc4257SSteve Yin 
1575fdc4257SSteve Yin     IMAccessible* GetIMAccByXAcc( com::sun::star::accessibility::XAccessible* pXAcc );
1585fdc4257SSteve Yin     IMAccessible* GetIAccessibleFromResID(long resID);
1595fdc4257SSteve Yin 
1605fdc4257SSteve Yin     void NotifyDestroy( com::sun::star::accessibility::XAccessible* pXAcc );
1615fdc4257SSteve Yin     com::sun::star::accessibility::XAccessible* GetParentXAccessible( com::sun::star::accessibility::XAccessible* pXAcc );
1625fdc4257SSteve Yin     short GetParentRole( com::sun::star::accessibility::XAccessible* pXAcc );
1635fdc4257SSteve Yin 
1645fdc4257SSteve Yin     void SaveTopWindowHandle(HWND hWnd, com::sun::star::accessibility::XAccessible* pXAcc);
1655fdc4257SSteve Yin 
1665fdc4257SSteve Yin     void UpdateChildState(com::sun::star::accessibility::XAccessible* pXAcc);
1675fdc4257SSteve Yin 
1685fdc4257SSteve Yin     bool IsSpecialToolboItem(com::sun::star::accessibility::XAccessible* pXAcc);
1695fdc4257SSteve Yin 
1705fdc4257SSteve Yin     short GetRole(com::sun::star::accessibility::XAccessible* pXAcc);
1715fdc4257SSteve Yin 
1725fdc4257SSteve Yin     com::sun::star::accessibility::XAccessible* GetAccDocByAccTopWin( com::sun::star::accessibility::XAccessible* pXAcc );
1735fdc4257SSteve Yin     bool IsTopWinAcc( com::sun::star::accessibility::XAccessible* pXAcc );
1745fdc4257SSteve Yin 
1755fdc4257SSteve Yin     bool IsStateManageDescendant(com::sun::star::accessibility::XAccessible* pAccessible);
1765fdc4257SSteve Yin 
1775fdc4257SSteve Yin };
1785fdc4257SSteve Yin #endif
179