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