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 #include <com/sun/star/accessibility/XAccessible.hpp>
235fdc4257SSteve Yin #include <com/sun/star/accessibility/AccessibleStateType.hpp>
245fdc4257SSteve Yin #include <com/sun/star/accessibility/AccessibleEventId.hpp>
255fdc4257SSteve Yin #include <com/sun/star/accessibility/AccessibleRole.hpp>
265fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
275fdc4257SSteve Yin 
285fdc4257SSteve Yin #include "AccWindowEventListener.hxx"
295fdc4257SSteve Yin #include "AccObjectManagerAgent.hxx"
305fdc4257SSteve Yin #include "unomsaaevent.hxx"
315fdc4257SSteve Yin 
325fdc4257SSteve Yin using namespace com::sun::star::uno;
335fdc4257SSteve Yin using namespace com::sun::star::accessibility;
345fdc4257SSteve Yin 
AccWindowEventListener(com::sun::star::accessibility::XAccessible * pAcc,AccObjectManagerAgent * Agent)355fdc4257SSteve Yin AccWindowEventListener::AccWindowEventListener(com::sun::star::accessibility::XAccessible* pAcc, AccObjectManagerAgent* Agent)
365fdc4257SSteve Yin         :AccEventListener(pAcc, Agent)
375fdc4257SSteve Yin {}
~AccWindowEventListener()385fdc4257SSteve Yin AccWindowEventListener::~AccWindowEventListener()
395fdc4257SSteve Yin {
405fdc4257SSteve Yin }
415fdc4257SSteve Yin 
425fdc4257SSteve Yin /**
435fdc4257SSteve Yin  *	Uno's event notifier when event is captured
445fdc4257SSteve Yin  *	@param AccessibleEventObject: the event object which contains information about event
455fdc4257SSteve Yin  */
notifyEvent(const::com::sun::star::accessibility::AccessibleEventObject & aEvent)465fdc4257SSteve Yin void  AccWindowEventListener::notifyEvent( const ::com::sun::star::accessibility::AccessibleEventObject& aEvent ) throw (::com::sun::star::uno::RuntimeException)
475fdc4257SSteve Yin {
485fdc4257SSteve Yin     switch (aEvent.EventId)
495fdc4257SSteve Yin     {
505fdc4257SSteve Yin     case AccessibleEventId::CHILD:
515fdc4257SSteve Yin         handleChildChangedEvent(aEvent.OldValue, aEvent.NewValue);
525fdc4257SSteve Yin         break;
535fdc4257SSteve Yin     case AccessibleEventId::VISIBLE_DATA_CHANGED:
545fdc4257SSteve Yin         handleVisibleDataChangedEvent();
555fdc4257SSteve Yin         break;
565fdc4257SSteve Yin     case AccessibleEventId::BOUNDRECT_CHANGED:
575fdc4257SSteve Yin         handleBoundrectChangedEvent();
585fdc4257SSteve Yin         break;
595fdc4257SSteve Yin     default:
605fdc4257SSteve Yin         AccEventListener::notifyEvent(aEvent);
615fdc4257SSteve Yin         break;
625fdc4257SSteve Yin     }
635fdc4257SSteve Yin }
645fdc4257SSteve Yin 
655fdc4257SSteve Yin /**
665fdc4257SSteve Yin  *	handle the VISIBLE_DATA_CHANGED event
675fdc4257SSteve Yin  */
handleVisibleDataChangedEvent()685fdc4257SSteve Yin void AccWindowEventListener::handleVisibleDataChangedEvent()
695fdc4257SSteve Yin {
705fdc4257SSteve Yin     AccEventListener::handleVisibleDataChangedEvent();
715fdc4257SSteve Yin }
725fdc4257SSteve Yin 
735fdc4257SSteve Yin /**
745fdc4257SSteve Yin  *	handle the BOUNDRECT_CHANGED event
755fdc4257SSteve Yin  */
handleBoundrectChangedEvent()765fdc4257SSteve Yin void AccWindowEventListener::handleBoundrectChangedEvent()
775fdc4257SSteve Yin {
785fdc4257SSteve Yin     AccEventListener::handleBoundrectChangedEvent();
795fdc4257SSteve Yin }
805fdc4257SSteve Yin 
815fdc4257SSteve Yin /**
825fdc4257SSteve Yin  *	handle the CHILD event
835fdc4257SSteve Yin  *	@param	oldValue	the child to be deleted
845fdc4257SSteve Yin  *	@param	newValue	the child to be added
855fdc4257SSteve Yin  */
handleChildChangedEvent(Any oldValue,Any newValue)865fdc4257SSteve Yin void AccWindowEventListener::handleChildChangedEvent(Any oldValue, Any newValue)
875fdc4257SSteve Yin {
885fdc4257SSteve Yin     Reference< XAccessible > xChild;
895fdc4257SSteve Yin     if( newValue >>= xChild)
905fdc4257SSteve Yin     {
915fdc4257SSteve Yin         //create a new child
925fdc4257SSteve Yin         if(xChild.is())
935fdc4257SSteve Yin         {
945fdc4257SSteve Yin             XAccessible* pAcc = xChild.get();
955fdc4257SSteve Yin             //add this child
965fdc4257SSteve Yin             pAgent->InsertAccObj( pAcc,pAccessible);
975fdc4257SSteve Yin             //add all oldValue's existing children
985fdc4257SSteve Yin             pAgent->InsertChildrenAccObj(pAcc);
995fdc4257SSteve Yin             pAgent->NotifyAccEvent(UM_EVENT_CHILD_ADDED, pAcc);
1005fdc4257SSteve Yin         }
1015fdc4257SSteve Yin         else
1025fdc4257SSteve Yin         {}
1035fdc4257SSteve Yin     }
1045fdc4257SSteve Yin     else if (oldValue >>= xChild)
1055fdc4257SSteve Yin     {
1065fdc4257SSteve Yin         //delete a existing child
1075fdc4257SSteve Yin         if(xChild.is())
1085fdc4257SSteve Yin         {
1095fdc4257SSteve Yin             XAccessible* pAcc = xChild.get();
1105fdc4257SSteve Yin             pAgent->NotifyAccEvent(UM_EVENT_CHILD_REMOVED, pAcc);
1115fdc4257SSteve Yin             pAgent->DeleteChildrenAccObj( pAcc );
1125fdc4257SSteve Yin             //delete this child
1135fdc4257SSteve Yin             pAgent->DeleteAccObj( pAcc );
1145fdc4257SSteve Yin         }
1155fdc4257SSteve Yin         else
1165fdc4257SSteve Yin         {}
1175fdc4257SSteve Yin     }
1185fdc4257SSteve Yin }
1195fdc4257SSteve Yin 
1205fdc4257SSteve Yin /**
1215fdc4257SSteve Yin  *	set the new state and fire the MSAA event
1225fdc4257SSteve Yin  *	@param state	new state id
1235fdc4257SSteve Yin  *	@param enable	true if state is set, false if state is unset
1245fdc4257SSteve Yin  */
setComponentState(short state,bool enable)1255fdc4257SSteve Yin void AccWindowEventListener::setComponentState(short state, bool enable )
1265fdc4257SSteve Yin {
1275fdc4257SSteve Yin     // only the following state can be fired state event.
1285fdc4257SSteve Yin     switch (state)
1295fdc4257SSteve Yin     {
1305fdc4257SSteve Yin     case AccessibleStateType::ICONIFIED:
1315fdc4257SSteve Yin         // no msaa state
1325fdc4257SSteve Yin         break;
1335fdc4257SSteve Yin     case AccessibleStateType::VISIBLE:
1345fdc4257SSteve Yin         // UNO !VISIBLE == MSAA INVISIBLE
1355fdc4257SSteve Yin         if( enable )
1365fdc4257SSteve Yin             pAgent->IncreaseState( pAccessible, AccessibleStateType::VISIBLE );
1375fdc4257SSteve Yin         else
1385fdc4257SSteve Yin             pAgent->DecreaseState( pAccessible, AccessibleStateType::VISIBLE );
1395fdc4257SSteve Yin         break;
1405fdc4257SSteve Yin     case AccessibleStateType::SHOWING:
1415fdc4257SSteve Yin         // UNO !SHOWING == MSAA OFFSCREEN
1425fdc4257SSteve Yin         if( enable )
1435fdc4257SSteve Yin         {
1445fdc4257SSteve Yin             pAgent->IncreaseState( pAccessible, AccessibleStateType::SHOWING );
1455fdc4257SSteve Yin         }
1465fdc4257SSteve Yin         else
1475fdc4257SSteve Yin             pAgent->DecreaseState( pAccessible, AccessibleStateType::SHOWING );
1485fdc4257SSteve Yin         break;
1495fdc4257SSteve Yin     default:
1505fdc4257SSteve Yin         break;
1515fdc4257SSteve Yin     }
1525fdc4257SSteve Yin }
153