2002-02-04 13:10:18 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
|
|
|
* $RCSfile: accmap.cxx,v $
|
|
|
|
*
|
2002-04-05 11:18:25 +00:00
|
|
|
* $Revision: 1.14 $
|
2002-02-04 13:10:18 +00:00
|
|
|
*
|
2002-04-05 11:18:25 +00:00
|
|
|
* last change: $Author: mib $ $Date: 2002-04-05 12:10:10 $
|
2002-02-04 13:10:18 +00:00
|
|
|
*
|
|
|
|
* The Contents of this file are made available subject to the terms of
|
|
|
|
* either of the following licenses
|
|
|
|
*
|
|
|
|
* - GNU Lesser General Public License Version 2.1
|
|
|
|
* - Sun Industry Standards Source License Version 1.1
|
|
|
|
*
|
|
|
|
* Sun Microsystems Inc., October, 2000
|
|
|
|
*
|
|
|
|
* GNU Lesser General Public License Version 2.1
|
|
|
|
* =============================================
|
|
|
|
* Copyright 2000 by Sun Microsystems, Inc.
|
|
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License version 2.1, as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
|
|
* MA 02111-1307 USA
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Sun Industry Standards Source License Version 1.1
|
|
|
|
* =================================================
|
|
|
|
* The contents of this file are subject to the Sun Industry Standards
|
|
|
|
* Source License Version 1.1 (the "License"); You may not use this file
|
|
|
|
* except in compliance with the License. You may obtain a copy of the
|
|
|
|
* License at http://www.openoffice.org/license.html.
|
|
|
|
*
|
|
|
|
* Software provided under this License is provided on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
|
|
|
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
|
|
|
|
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
|
|
|
|
* See the License for the specific provisions governing your rights and
|
|
|
|
* obligations concerning the Software.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
|
|
|
|
*
|
|
|
|
* Copyright: 2000 by Sun Microsystems, Inc.
|
|
|
|
*
|
|
|
|
* All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s): _______________________________________
|
|
|
|
*
|
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
#ifdef PRECOMPILED
|
|
|
|
#include "core_pch.hxx"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#pragma hdrstop
|
|
|
|
|
|
|
|
#ifndef _VOS_REF_HXX_
|
|
|
|
#include <vos/ref.hxx>
|
|
|
|
#endif
|
2002-02-05 14:52:06 +00:00
|
|
|
#ifndef _CPPUHELPER_WEAKREF_HXX_
|
|
|
|
#include <cppuhelper/weakref.hxx>
|
|
|
|
#endif
|
2002-02-04 13:10:18 +00:00
|
|
|
|
|
|
|
#include <map>
|
2002-03-08 12:26:29 +00:00
|
|
|
#include <list>
|
2002-02-04 13:10:18 +00:00
|
|
|
#ifndef _ACCMAP_HXX
|
|
|
|
#include <accmap.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _ACCCONTEXT_HXX
|
|
|
|
#include <acccontext.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _ACCDOC_HXX
|
|
|
|
#include <accdoc.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _ACCPARA_HXX
|
|
|
|
#include <accpara.hxx>
|
|
|
|
#endif
|
2002-02-27 08:32:33 +00:00
|
|
|
#ifndef _ACCHEADERFOOTER_HXX
|
|
|
|
#include <accheaderfooter.hxx>
|
|
|
|
#endif
|
2002-03-06 07:15:41 +00:00
|
|
|
#ifndef _ACCFOOTNOTE_HXX
|
|
|
|
#include <accfootnote.hxx>
|
|
|
|
#endif
|
2002-04-05 11:18:25 +00:00
|
|
|
#ifndef _ACCTEXTFRAME_HXX
|
|
|
|
#include <acctextframe.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _ACCGRAPHIC_HXX
|
|
|
|
#include <accgraphic.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _ACCEMBEDDED_HXX
|
|
|
|
#include <accembedded.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _FESH_HXX
|
|
|
|
#include "fesh.hxx"
|
2002-02-20 16:55:57 +00:00
|
|
|
#endif
|
2002-02-04 13:10:18 +00:00
|
|
|
#ifndef _ROOTFRM_HXX
|
|
|
|
#include <rootfrm.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _TXTFRM_HXX
|
|
|
|
#include <txtfrm.hxx>
|
|
|
|
#endif
|
2002-02-27 08:32:33 +00:00
|
|
|
#ifndef _HFFRM_HXX
|
|
|
|
#include <hffrm.hxx>
|
|
|
|
#endif
|
2002-03-06 07:15:41 +00:00
|
|
|
#ifndef _FTNFRM_HXX
|
|
|
|
#include <ftnfrm.hxx>
|
|
|
|
#endif
|
2002-04-05 11:18:25 +00:00
|
|
|
#ifndef _NDTYP_HXX
|
|
|
|
#include <ndtyp.hxx>
|
|
|
|
#endif
|
2002-02-04 13:10:18 +00:00
|
|
|
|
|
|
|
using namespace ::com::sun::star::uno;
|
|
|
|
using namespace ::drafts::com::sun::star::accessibility;
|
|
|
|
using namespace ::rtl;
|
|
|
|
|
|
|
|
struct SwFrmFunc
|
|
|
|
{
|
|
|
|
sal_Bool operator()( const SwFrm * p1,
|
|
|
|
const SwFrm * p2) const
|
|
|
|
{
|
|
|
|
return p1 < p2;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2002-03-08 12:26:29 +00:00
|
|
|
typedef ::std::map < const SwFrm *, WeakReference < XAccessible >, SwFrmFunc > _SwAccessibleContextMap_Impl;
|
|
|
|
|
|
|
|
class SwAccessibleContextMap_Impl: public _SwAccessibleContextMap_Impl
|
|
|
|
{
|
2002-03-18 11:49:59 +00:00
|
|
|
public:
|
2002-03-21 11:50:31 +00:00
|
|
|
|
|
|
|
#ifndef PRODUCT
|
2002-03-18 11:49:59 +00:00
|
|
|
sal_Bool bLocked;
|
2002-03-21 11:50:31 +00:00
|
|
|
#endif
|
2002-04-05 11:18:25 +00:00
|
|
|
WeakReference < XAccessible > xCursorContext;
|
2002-03-21 11:50:31 +00:00
|
|
|
|
2002-03-26 10:28:07 +00:00
|
|
|
SwAccessibleContextMap_Impl()
|
2002-03-21 11:50:31 +00:00
|
|
|
#ifndef PRODUCT
|
2002-03-26 10:28:07 +00:00
|
|
|
: bLocked( sal_False )
|
2002-03-21 11:50:31 +00:00
|
|
|
#endif
|
|
|
|
{}
|
|
|
|
|
2002-03-08 12:26:29 +00:00
|
|
|
};
|
2002-02-04 13:10:18 +00:00
|
|
|
|
2002-03-08 12:26:29 +00:00
|
|
|
struct SwAccessibleEvent_Impl
|
2002-02-04 13:10:18 +00:00
|
|
|
{
|
2002-03-08 12:26:29 +00:00
|
|
|
public:
|
2002-03-18 11:49:59 +00:00
|
|
|
enum EventType { INVALID_CONTENT, POS_CHANGED, CHILD_POS_CHANGED, DISPOSE,
|
2002-03-19 11:49:27 +00:00
|
|
|
CARET_OR_STATES };
|
2002-03-08 12:26:29 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
SwRect aOldFrm; // the old bounds for CHILD_POS_CHANGED
|
2002-03-18 11:49:59 +00:00
|
|
|
WeakReference < XAccessible > xAcc; // The object that fires the event
|
2002-03-08 12:26:29 +00:00
|
|
|
const SwFrm *pFrm; // the child for CHILD_POS_CHANGED and
|
|
|
|
// the same as xAcc for any other
|
|
|
|
// event type
|
2002-03-18 11:49:59 +00:00
|
|
|
EventType eType; // The event type
|
2002-03-19 11:49:27 +00:00
|
|
|
sal_uInt8 nStates; // check states or update caret pos
|
2002-03-18 11:49:59 +00:00
|
|
|
|
|
|
|
SwAccessibleEvent_Impl& operator==( const SwAccessibleEvent_Impl& );
|
2002-03-08 12:26:29 +00:00
|
|
|
|
|
|
|
public:
|
2002-03-11 10:54:46 +00:00
|
|
|
SwAccessibleEvent_Impl( EventType eT, SwAccessibleContext *pA,
|
|
|
|
const SwFrm *pF ) :
|
2002-03-19 11:49:27 +00:00
|
|
|
eType( eT ), xAcc( pA ), pFrm( pF ), nStates( 0 )
|
2002-03-18 11:49:59 +00:00
|
|
|
{}
|
2002-03-08 12:26:29 +00:00
|
|
|
SwAccessibleEvent_Impl( EventType eT, const SwFrm *pF ) :
|
2002-03-19 11:49:27 +00:00
|
|
|
eType( eT ), pFrm( pF ), nStates( 0 )
|
|
|
|
{
|
|
|
|
ASSERT( SwAccessibleEvent_Impl::DISPOSE == eType,
|
|
|
|
"wrong event constructor, DISPOSE only" );
|
|
|
|
}
|
2002-03-08 12:26:29 +00:00
|
|
|
SwAccessibleEvent_Impl( EventType eT, SwAccessibleContext *pA,
|
|
|
|
const SwFrm *pF, const SwRect& rR ) :
|
2002-03-19 11:49:27 +00:00
|
|
|
eType( eT ), xAcc( pA ), pFrm( pF ), aOldFrm( rR ), nStates( 0 )
|
|
|
|
{
|
|
|
|
ASSERT( SwAccessibleEvent_Impl::CHILD_POS_CHANGED == eType,
|
|
|
|
"wrong event constructor, CHILD_POS_CHANGED only" );
|
|
|
|
}
|
|
|
|
SwAccessibleEvent_Impl( EventType eT, SwAccessibleContext *pA,
|
|
|
|
const SwFrm *pF, sal_uInt8 nSt ) :
|
|
|
|
eType( eT ), xAcc( pA ), pFrm( pF ), nStates( nSt )
|
|
|
|
{
|
|
|
|
ASSERT( SwAccessibleEvent_Impl::CARET_OR_STATES == eType,
|
|
|
|
"wrong event constructor, CARET_OR_STATES only" );
|
|
|
|
}
|
2002-03-08 12:26:29 +00:00
|
|
|
|
2002-03-19 11:49:27 +00:00
|
|
|
inline void SetType( EventType eT ){ eType = eT; }
|
2002-03-08 12:26:29 +00:00
|
|
|
inline EventType GetType() const { return eType; }
|
2002-03-19 11:49:27 +00:00
|
|
|
|
2002-03-08 12:26:29 +00:00
|
|
|
inline ::vos::ORef < SwAccessibleContext > GetContext() const;
|
2002-03-19 11:49:27 +00:00
|
|
|
|
2002-03-08 12:26:29 +00:00
|
|
|
inline const SwRect& GetOldFrm() const { return aOldFrm; }
|
2002-03-19 11:49:27 +00:00
|
|
|
|
2002-03-08 12:26:29 +00:00
|
|
|
inline const SwFrm *GetFrm() const { return pFrm; }
|
2002-03-18 11:49:59 +00:00
|
|
|
|
2002-03-21 11:50:31 +00:00
|
|
|
inline void SetStates( sal_uInt8 nSt ) { nStates |= nSt; }
|
2002-04-05 11:18:25 +00:00
|
|
|
inline sal_Bool IsUpdateCursorPos() const { return (nStates & ACC_STATE_CARET) != 0; }
|
2002-03-19 11:49:27 +00:00
|
|
|
inline sal_Bool IsCheckStates() const { return (nStates & ACC_STATE_MASK) != 0; }
|
|
|
|
inline sal_uInt8 GetStates() const { return nStates & ACC_STATE_MASK; }
|
|
|
|
inline sal_uInt8 GetAllStates() const { return nStates; }
|
2002-02-04 13:10:18 +00:00
|
|
|
};
|
|
|
|
|
2002-03-08 12:26:29 +00:00
|
|
|
inline ::vos::ORef < SwAccessibleContext >
|
|
|
|
SwAccessibleEvent_Impl::GetContext() const
|
|
|
|
{
|
|
|
|
Reference < XAccessible > xTmp( xAcc );
|
|
|
|
::vos::ORef < SwAccessibleContext > xAccImpl(
|
|
|
|
static_cast< SwAccessibleContext * >( xTmp.get() ) );
|
|
|
|
|
|
|
|
return xAccImpl;
|
|
|
|
}
|
|
|
|
|
2002-03-18 11:49:59 +00:00
|
|
|
|
2002-03-08 12:26:29 +00:00
|
|
|
typedef ::std::list < SwAccessibleEvent_Impl > _SwAccessibleEventList_Impl;
|
|
|
|
|
|
|
|
class SwAccessibleEventList_Impl: public _SwAccessibleEventList_Impl
|
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
sal_Bool bFiring;
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
SwAccessibleEventList_Impl() : bFiring( sal_False ) {}
|
|
|
|
|
|
|
|
inline void SetFiring() { bFiring = sal_True; }
|
|
|
|
inline sal_Bool IsFiring() const { return bFiring; }
|
2002-03-08 12:26:29 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
typedef ::std::map < const SwFrm *, SwAccessibleEventList_Impl::iterator, SwFrmFunc > _SwAccessibleEventMap_Impl;
|
|
|
|
|
|
|
|
class SwAccessibleEventMap_Impl: public _SwAccessibleEventMap_Impl
|
|
|
|
{
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2002-02-20 16:55:57 +00:00
|
|
|
SwAccessibleMap::SwAccessibleMap( ViewShell *pSh ) :
|
2002-02-11 11:51:16 +00:00
|
|
|
pMap( 0 ),
|
2002-03-08 12:26:29 +00:00
|
|
|
pEvents( 0 ),
|
|
|
|
pEventMap( 0 ),
|
2002-02-20 16:55:57 +00:00
|
|
|
pVSh( pSh ),
|
2002-03-06 07:15:41 +00:00
|
|
|
nPara( 1 ),
|
|
|
|
nFootnote( 1 ),
|
|
|
|
nEndnote( 1 )
|
2002-02-04 13:10:18 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
SwAccessibleMap::~SwAccessibleMap()
|
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
Reference < XAccessible > xAcc;
|
2002-02-20 16:55:57 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
vos::OGuard aGuard( aMutex );
|
|
|
|
if( pMap )
|
|
|
|
{
|
|
|
|
const SwRootFrm *pRootFrm = GetShell()->GetLayout();
|
|
|
|
SwAccessibleContextMap_Impl::iterator aIter = pMap->find( pRootFrm );
|
|
|
|
if( aIter != pMap->end() )
|
|
|
|
xAcc = (*aIter).second;
|
|
|
|
if( !xAcc.is() )
|
|
|
|
xAcc = new SwAccessibleDocument( this );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SwAccessibleDocument *pAcc =
|
|
|
|
static_cast< SwAccessibleDocument * >( xAcc.get() );
|
|
|
|
pAcc->Dispose( sal_True );
|
2002-03-08 12:26:29 +00:00
|
|
|
|
2002-03-21 11:50:31 +00:00
|
|
|
{
|
|
|
|
vos::OGuard aGuard( aMutex );
|
2002-04-05 11:18:25 +00:00
|
|
|
#ifndef PRODUCT
|
2002-03-08 12:26:29 +00:00
|
|
|
ASSERT( !pMap || pMap->empty(),
|
|
|
|
"Map should be empty after disposing the root frame" );
|
2002-04-05 11:18:25 +00:00
|
|
|
if( pMap )
|
|
|
|
{
|
|
|
|
SwAccessibleContextMap_Impl::iterator aIter = pMap->begin();
|
|
|
|
while( aIter != pMap->end() )
|
|
|
|
{
|
|
|
|
Reference < XAccessible > xTmp = (*aIter).second;
|
|
|
|
if( xTmp.is() )
|
|
|
|
{
|
|
|
|
SwAccessibleContext *pTmp =
|
|
|
|
static_cast< SwAccessibleContext * >( xTmp.get() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
2002-03-21 11:50:31 +00:00
|
|
|
delete pMap;
|
|
|
|
pMap = 0;
|
2002-02-20 16:55:57 +00:00
|
|
|
}
|
|
|
|
|
2002-03-21 11:50:31 +00:00
|
|
|
{
|
|
|
|
vos::OGuard aGuard( aEventMutex );
|
|
|
|
ASSERT( !(pEvents || pEventMap), "pending events" );
|
|
|
|
delete pEventMap;
|
|
|
|
pEventMap = 0;
|
|
|
|
delete pEvents;
|
|
|
|
pEvents = 0;
|
|
|
|
}
|
2002-03-08 12:26:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void SwAccessibleMap::AppendEvent( const SwAccessibleEvent_Impl& rEvent )
|
|
|
|
{
|
|
|
|
vos::OGuard aGuard( aEventMutex );
|
|
|
|
|
|
|
|
if( !pEvents )
|
|
|
|
pEvents = new SwAccessibleEventList_Impl;
|
|
|
|
if( !pEventMap )
|
|
|
|
pEventMap = new SwAccessibleEventMap_Impl;
|
|
|
|
|
2002-03-21 11:50:31 +00:00
|
|
|
if( pEvents->IsFiring() )
|
|
|
|
{
|
|
|
|
// While events are fired new ones are generated. They have to be fired
|
|
|
|
// now. This does not work for DISPOSE events!
|
|
|
|
ASSERT( rEvent.GetType() != SwAccessibleEvent_Impl::DISPOSE,
|
|
|
|
"dispose event while firing events" );
|
|
|
|
FireEvent( rEvent );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
|
|
|
|
SwAccessibleEventMap_Impl::iterator aIter =
|
|
|
|
pEventMap->find( rEvent.GetFrm() );
|
|
|
|
if( aIter != pEventMap->end() )
|
|
|
|
{
|
|
|
|
SwAccessibleEvent_Impl aEvent( *(*aIter).second );
|
|
|
|
sal_Bool bAppendEvent = sal_True;
|
|
|
|
switch( rEvent.GetType() )
|
|
|
|
{
|
|
|
|
case SwAccessibleEvent_Impl::CARET_OR_STATES:
|
|
|
|
// A CARET_POS or CHECK_STATES event is added to any other
|
|
|
|
// event only. It is broadcasted after any other event, so the
|
|
|
|
// event should be put to the back.
|
|
|
|
ASSERT( aEvent.GetType()!=SwAccessibleEvent_Impl::CHILD_POS_CHANGED,
|
|
|
|
"invalid event combination" );
|
|
|
|
ASSERT( aEvent.GetType() != SwAccessibleEvent_Impl::DISPOSE,
|
|
|
|
"dispose events should not be stored" );
|
|
|
|
aEvent.SetStates( rEvent.GetAllStates() );
|
|
|
|
break;
|
|
|
|
case SwAccessibleEvent_Impl::INVALID_CONTENT:
|
|
|
|
// All events except CARET_OR_STATES include a INVALID_CONTENT,
|
|
|
|
// so the only action that needs to be done is to put the event
|
|
|
|
// to the back. That's done automatically.
|
|
|
|
ASSERT( aEvent.GetType()!=SwAccessibleEvent_Impl::CHILD_POS_CHANGED,
|
|
|
|
"invalid event combination" );
|
|
|
|
ASSERT( aEvent.GetType() != SwAccessibleEvent_Impl::DISPOSE,
|
|
|
|
"dispose events should not be stored" );
|
|
|
|
if( aEvent.GetType() == SwAccessibleEvent_Impl::CARET_OR_STATES )
|
|
|
|
aEvent.SetType( SwAccessibleEvent_Impl::INVALID_CONTENT );
|
|
|
|
break;
|
|
|
|
case SwAccessibleEvent_Impl::POS_CHANGED:
|
|
|
|
// If the the old event is not a DISPOSE event, the new event
|
|
|
|
// includes the old one.
|
|
|
|
ASSERT( aEvent.GetType()!=SwAccessibleEvent_Impl::CHILD_POS_CHANGED,
|
|
|
|
"invalid event combination" );
|
|
|
|
ASSERT( aEvent.GetType() != SwAccessibleEvent_Impl::DISPOSE,
|
|
|
|
"dispose events should not be stored" );
|
|
|
|
aEvent.SetType( SwAccessibleEvent_Impl::POS_CHANGED );
|
|
|
|
break;
|
|
|
|
case SwAccessibleEvent_Impl::CHILD_POS_CHANGED:
|
|
|
|
// CHILD_POS_CHANGED events can only follow CHILD_POS_CHANGED
|
|
|
|
// events. The only action that needs to be done again is
|
|
|
|
// to put the old event to the back. The new one cannot be used,
|
|
|
|
// because we are interested in the old frame bounds.
|
|
|
|
ASSERT( aEvent.GetType()==SwAccessibleEvent_Impl::CHILD_POS_CHANGED,
|
|
|
|
"invalid event combination" );
|
|
|
|
break;
|
|
|
|
case SwAccessibleEvent_Impl::DISPOSE:
|
|
|
|
// DISPOSE events overwrite all others. They are not stored
|
|
|
|
// but executed immidiatly to avoid broadcasting of defuntional
|
|
|
|
// objects. So what needs to be done here is to remove all
|
|
|
|
// events for the frame in question.
|
|
|
|
ASSERT( aEvent.GetType()!=SwAccessibleEvent_Impl::CHILD_POS_CHANGED,
|
|
|
|
"invalid event combination" );
|
|
|
|
ASSERT( aEvent.GetType() != SwAccessibleEvent_Impl::DISPOSE,
|
|
|
|
"dispose events should not be stored" );
|
|
|
|
bAppendEvent = sal_False;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if( bAppendEvent )
|
|
|
|
{
|
|
|
|
pEvents->erase( (*aIter).second );
|
|
|
|
(*aIter).second = pEvents->insert( pEvents->end(), aEvent );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pEvents->erase( (*aIter).second );
|
|
|
|
pEventMap->erase( aIter );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if( SwAccessibleEvent_Impl::DISPOSE != rEvent.GetType() )
|
|
|
|
{
|
|
|
|
SwAccessibleEventMap_Impl::value_type aEntry( rEvent.GetFrm(),
|
|
|
|
pEvents->insert( pEvents->end(), rEvent ) );
|
|
|
|
pEventMap->insert( aEntry );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwAccessibleMap::FireEvent( const SwAccessibleEvent_Impl& rEvent )
|
|
|
|
{
|
|
|
|
::vos::ORef < SwAccessibleContext > xAccImpl( rEvent.GetContext() );
|
|
|
|
if( xAccImpl.isValid() )
|
2002-03-08 12:26:29 +00:00
|
|
|
{
|
|
|
|
switch( rEvent.GetType() )
|
|
|
|
{
|
|
|
|
case SwAccessibleEvent_Impl::INVALID_CONTENT:
|
2002-03-21 11:50:31 +00:00
|
|
|
xAccImpl->InvalidateContent();
|
2002-03-08 12:26:29 +00:00
|
|
|
break;
|
|
|
|
case SwAccessibleEvent_Impl::POS_CHANGED:
|
2002-03-21 11:50:31 +00:00
|
|
|
xAccImpl->PosChanged();
|
2002-03-08 12:26:29 +00:00
|
|
|
break;
|
|
|
|
case SwAccessibleEvent_Impl::CHILD_POS_CHANGED:
|
2002-03-21 11:50:31 +00:00
|
|
|
xAccImpl->ChildPosChanged( rEvent.GetFrm(),
|
|
|
|
rEvent.GetOldFrm() );
|
2002-03-08 12:26:29 +00:00
|
|
|
break;
|
|
|
|
case SwAccessibleEvent_Impl::DISPOSE:
|
2002-03-21 11:50:31 +00:00
|
|
|
ASSERT( xAccImpl.isValid(),
|
|
|
|
"dispose event has been stored" );
|
2002-03-08 12:26:29 +00:00
|
|
|
break;
|
|
|
|
}
|
2002-03-21 11:50:31 +00:00
|
|
|
if( SwAccessibleEvent_Impl::DISPOSE != rEvent.GetType() )
|
2002-03-08 12:26:29 +00:00
|
|
|
{
|
2002-04-05 11:18:25 +00:00
|
|
|
if( rEvent.IsUpdateCursorPos() )
|
|
|
|
xAccImpl->InvalidateCursorPos();
|
2002-03-21 11:50:31 +00:00
|
|
|
if( rEvent.IsCheckStates() )
|
|
|
|
xAccImpl->CheckStates( rEvent.GetStates() );
|
2002-03-08 12:26:29 +00:00
|
|
|
}
|
|
|
|
}
|
2002-03-21 11:50:31 +00:00
|
|
|
}
|
|
|
|
|
2002-04-05 11:18:25 +00:00
|
|
|
void SwAccessibleMap::InvalidateCursorPosition(
|
2002-03-21 11:50:31 +00:00
|
|
|
const Reference< XAccessible >& rAcc )
|
|
|
|
{
|
|
|
|
SwAccessibleContext *pAccImpl =
|
|
|
|
static_cast< SwAccessibleContext *>( rAcc.get() );
|
|
|
|
ASSERT( pAccImpl, "no caret context" );
|
|
|
|
ASSERT( pAccImpl->GetFrm(), "caret context is disposed" );
|
|
|
|
if( GetShell()->ActionPend() )
|
2002-03-08 12:26:29 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
SwAccessibleEvent_Impl aEvent(
|
|
|
|
SwAccessibleEvent_Impl::CARET_OR_STATES, pAccImpl,
|
|
|
|
pAccImpl->GetFrm(), ACC_STATE_CARET );
|
|
|
|
AppendEvent( aEvent );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-04-05 11:18:25 +00:00
|
|
|
pAccImpl->InvalidateCursorPos();
|
2002-03-08 12:26:29 +00:00
|
|
|
}
|
2002-02-04 13:10:18 +00:00
|
|
|
}
|
|
|
|
|
2002-02-20 16:55:57 +00:00
|
|
|
Reference< XAccessible > SwAccessibleMap::GetDocumentView()
|
2002-02-04 13:10:18 +00:00
|
|
|
{
|
2002-02-05 14:52:06 +00:00
|
|
|
Reference < XAccessible > xAcc;
|
2002-03-21 11:50:31 +00:00
|
|
|
sal_Bool bSetVisArea = sal_False;
|
2002-02-04 13:10:18 +00:00
|
|
|
|
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
vos::OGuard aGuard( aMutex );
|
|
|
|
|
|
|
|
if( !pMap )
|
|
|
|
{
|
|
|
|
pMap = new SwAccessibleContextMap_Impl;
|
2002-03-26 10:28:07 +00:00
|
|
|
#ifndef PRODUCT
|
2002-03-21 11:50:31 +00:00
|
|
|
pMap->bLocked = sal_False;
|
2002-03-26 10:28:07 +00:00
|
|
|
#endif
|
2002-03-21 11:50:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef PRODUCT
|
|
|
|
ASSERT( !pMap->bLocked, "Map is locked" );
|
|
|
|
pMap->bLocked = sal_True;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
const SwRootFrm *pRootFrm = GetShell()->GetLayout();
|
|
|
|
SwAccessibleContextMap_Impl::iterator aIter = pMap->find( pRootFrm );
|
2002-02-05 14:52:06 +00:00
|
|
|
if( aIter != pMap->end() )
|
2002-03-21 11:50:31 +00:00
|
|
|
xAcc = (*aIter).second;
|
|
|
|
if( xAcc.is() )
|
2002-02-05 14:52:06 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
bSetVisArea = sal_True; // Set VisArea when map mutex is not
|
|
|
|
// locked
|
2002-02-05 14:52:06 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
xAcc = new SwAccessibleDocument( this );
|
|
|
|
if( aIter != pMap->end() )
|
|
|
|
{
|
|
|
|
(*aIter).second = xAcc;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
SwAccessibleContextMap_Impl::value_type aEntry( pRootFrm, xAcc );
|
|
|
|
pMap->insert( aEntry );
|
|
|
|
}
|
2002-02-05 14:52:06 +00:00
|
|
|
}
|
2002-03-21 11:50:31 +00:00
|
|
|
|
|
|
|
#ifndef PRODUCT
|
|
|
|
pMap->bLocked = sal_False;
|
|
|
|
#endif
|
2002-02-04 13:10:18 +00:00
|
|
|
}
|
|
|
|
|
2002-03-21 11:50:31 +00:00
|
|
|
if( bSetVisArea )
|
|
|
|
{
|
|
|
|
SwAccessibleDocument *pAcc =
|
|
|
|
static_cast< SwAccessibleDocument * >( xAcc.get() );
|
|
|
|
pAcc->SetVisArea( GetShell()->VisArea().SVRect() );
|
|
|
|
}
|
2002-03-18 11:49:59 +00:00
|
|
|
|
2002-02-05 14:52:06 +00:00
|
|
|
return xAcc;
|
2002-02-04 13:10:18 +00:00
|
|
|
}
|
|
|
|
|
2002-02-20 16:55:57 +00:00
|
|
|
Reference< XAccessible> SwAccessibleMap::GetContext( const SwFrm *pFrm,
|
2002-02-11 11:51:16 +00:00
|
|
|
sal_Bool bCreate )
|
2002-02-04 13:10:18 +00:00
|
|
|
{
|
2002-02-05 14:52:06 +00:00
|
|
|
Reference < XAccessible > xAcc;
|
2002-04-05 11:18:25 +00:00
|
|
|
Reference < XAccessible > xOldCursorAcc;
|
2002-02-04 13:10:18 +00:00
|
|
|
|
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
vos::OGuard aGuard( aMutex );
|
2002-02-04 13:10:18 +00:00
|
|
|
|
2002-03-21 11:50:31 +00:00
|
|
|
if( !pMap && bCreate )
|
|
|
|
pMap = new SwAccessibleContextMap_Impl;
|
|
|
|
if( pMap )
|
2002-02-04 13:10:18 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
SwAccessibleContextMap_Impl::iterator aIter = pMap->find( pFrm );
|
|
|
|
if( aIter != pMap->end() )
|
|
|
|
xAcc = (*aIter).second;
|
2002-02-20 16:55:57 +00:00
|
|
|
|
2002-03-21 11:50:31 +00:00
|
|
|
if( !xAcc.is() && bCreate )
|
2002-02-05 14:52:06 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
SwAccessibleContext *pAcc = 0;
|
|
|
|
switch( pFrm->GetType() )
|
2002-02-20 16:55:57 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
case FRM_TXT:
|
|
|
|
pAcc = new SwAccessibleParagraph( this, nPara++,
|
|
|
|
static_cast< const SwTxtFrm * >( pFrm ) );
|
|
|
|
break;
|
|
|
|
case FRM_HEADER:
|
|
|
|
pAcc = new SwAccessibleHeaderFooter( this,
|
|
|
|
static_cast< const SwHeaderFrm *>( pFrm ) );
|
|
|
|
break;
|
|
|
|
case FRM_FOOTER:
|
|
|
|
pAcc = new SwAccessibleHeaderFooter( this,
|
|
|
|
static_cast< const SwFooterFrm *>( pFrm ) );
|
|
|
|
break;
|
|
|
|
case FRM_FTN:
|
|
|
|
{
|
|
|
|
const SwFtnFrm *pFtnFrm =
|
|
|
|
static_cast < const SwFtnFrm * >( pFrm );
|
|
|
|
sal_Bool bIsEndnote =
|
|
|
|
SwAccessibleFootnote::IsEndnote( pFtnFrm );
|
|
|
|
pAcc = new SwAccessibleFootnote( this, bIsEndnote,
|
|
|
|
(bIsEndnote ? nEndnote++ : nFootnote++),
|
|
|
|
pFtnFrm );
|
|
|
|
}
|
|
|
|
break;
|
2002-04-05 11:18:25 +00:00
|
|
|
case FRM_FLY:
|
|
|
|
{
|
|
|
|
const SwFlyFrm *pFlyFrm =
|
|
|
|
static_cast < const SwFlyFrm * >( pFrm );
|
|
|
|
switch( SwAccessibleFrameBase::GetNodeType( pFlyFrm ) )
|
|
|
|
{
|
|
|
|
case ND_GRFNODE:
|
|
|
|
pAcc = new SwAccessibleGraphic( this, pFlyFrm );
|
|
|
|
break;
|
|
|
|
case ND_OLENODE:
|
|
|
|
pAcc = new SwAccessibleEmbeddedObject( this, pFlyFrm );
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
pAcc = new SwAccessibleTextFrame( this, pFlyFrm );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2002-02-20 16:55:57 +00:00
|
|
|
}
|
2002-03-21 11:50:31 +00:00
|
|
|
xAcc = pAcc;
|
|
|
|
|
|
|
|
ASSERT( xAcc.is(), "unknown frame type" );
|
|
|
|
if( xAcc.is() )
|
2002-02-20 16:55:57 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
if( aIter != pMap->end() )
|
|
|
|
{
|
|
|
|
(*aIter).second = xAcc;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
SwAccessibleContextMap_Impl::value_type aEntry( pFrm, xAcc );
|
|
|
|
pMap->insert( aEntry );
|
|
|
|
}
|
|
|
|
|
2002-04-05 11:18:25 +00:00
|
|
|
if( pAcc->HasCursor() )
|
2002-03-21 11:50:31 +00:00
|
|
|
{
|
|
|
|
// If the new context has the focus, and if we know
|
|
|
|
// another context that had the focus, then the focus
|
|
|
|
// just moves from the old context to the new one. We
|
|
|
|
// have to send a focus event and a caret event for
|
|
|
|
// the old context then. We have to to that know,
|
|
|
|
// because after we have left this method, anyone might
|
|
|
|
// call getStates for the new context and will get a
|
|
|
|
// focused state then. Sending the focus changes event
|
|
|
|
// after that seems to be strange. However, we cannot
|
|
|
|
// send a focus event fo the new context now, because
|
|
|
|
// noone except us knows it. In any case, we remeber
|
|
|
|
// the new context as the one that has the focus
|
|
|
|
// currently.
|
|
|
|
|
2002-04-05 11:18:25 +00:00
|
|
|
xOldCursorAcc = pMap->xCursorContext;
|
|
|
|
pMap->xCursorContext = xAcc;
|
2002-03-21 11:50:31 +00:00
|
|
|
}
|
2002-02-20 16:55:57 +00:00
|
|
|
}
|
2002-02-05 14:52:06 +00:00
|
|
|
}
|
2002-02-04 13:10:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-03-21 11:50:31 +00:00
|
|
|
// Invalidate focus for old object when map is not locked
|
2002-04-05 11:18:25 +00:00
|
|
|
if( xOldCursorAcc.is() )
|
|
|
|
InvalidateCursorPosition( xOldCursorAcc );
|
2002-03-21 11:50:31 +00:00
|
|
|
|
2002-02-05 14:52:06 +00:00
|
|
|
return xAcc;
|
|
|
|
}
|
|
|
|
|
|
|
|
::vos::ORef < SwAccessibleContext > SwAccessibleMap::GetContextImpl(
|
2002-02-11 11:51:16 +00:00
|
|
|
const SwFrm *pFrm,
|
|
|
|
sal_Bool bCreate )
|
2002-02-05 14:52:06 +00:00
|
|
|
{
|
2002-02-20 16:55:57 +00:00
|
|
|
Reference < XAccessible > xAcc( GetContext( pFrm, bCreate ) );
|
2002-02-05 14:52:06 +00:00
|
|
|
|
|
|
|
::vos::ORef < SwAccessibleContext > xAccImpl(
|
2002-03-06 07:15:41 +00:00
|
|
|
static_cast< SwAccessibleContext * >( xAcc.get() ) );
|
2002-02-05 14:52:06 +00:00
|
|
|
|
|
|
|
return xAccImpl;
|
2002-02-04 13:10:18 +00:00
|
|
|
}
|
|
|
|
|
2002-03-11 10:54:46 +00:00
|
|
|
void SwAccessibleMap::RemoveContext( const SwFrm *pFrm )
|
2002-02-04 13:10:18 +00:00
|
|
|
{
|
2002-02-05 14:52:06 +00:00
|
|
|
vos::OGuard aGuard( aMutex );
|
|
|
|
|
2002-02-11 11:51:16 +00:00
|
|
|
if( pMap )
|
|
|
|
{
|
2002-03-08 12:26:29 +00:00
|
|
|
SwAccessibleContextMap_Impl::iterator aIter =
|
2002-03-11 10:54:46 +00:00
|
|
|
pMap->find( pFrm );
|
2002-02-11 11:51:16 +00:00
|
|
|
if( aIter != pMap->end() )
|
|
|
|
{
|
|
|
|
pMap->erase( aIter );
|
2002-03-19 05:53:03 +00:00
|
|
|
|
|
|
|
// Remove reference to old caret object
|
2002-04-05 11:18:25 +00:00
|
|
|
Reference < XAccessible > xOldAcc( pMap->xCursorContext );
|
2002-03-19 05:53:03 +00:00
|
|
|
if( xOldAcc.is() )
|
|
|
|
{
|
|
|
|
SwAccessibleContext *pOldAccImpl =
|
|
|
|
static_cast< SwAccessibleContext *>( xOldAcc.get() );
|
|
|
|
ASSERT( pOldAccImpl->GetFrm(), "old caret context is disposed" );
|
|
|
|
if( pOldAccImpl->GetFrm() == pFrm )
|
|
|
|
{
|
|
|
|
xOldAcc.clear(); // get an empty ref
|
2002-04-05 11:18:25 +00:00
|
|
|
pMap->xCursorContext = xOldAcc;
|
2002-03-19 05:53:03 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-02-11 11:51:16 +00:00
|
|
|
if( pMap->empty() )
|
|
|
|
{
|
|
|
|
delete pMap;
|
|
|
|
pMap = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-04-05 11:18:25 +00:00
|
|
|
void SwAccessibleMap::DisposeFrm( const SwFrm *pFrm, sal_Bool bRecursive )
|
2002-02-11 11:51:16 +00:00
|
|
|
{
|
2002-02-27 08:32:33 +00:00
|
|
|
if( pFrm->IsAccessibleFrm() )
|
2002-02-11 11:51:16 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
Reference < XAccessible > xAcc;
|
2002-02-11 11:51:16 +00:00
|
|
|
|
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
vos::OGuard aGuard( aMutex );
|
|
|
|
|
|
|
|
if( pMap )
|
2002-02-11 11:51:16 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
SwAccessibleContextMap_Impl::iterator aIter = pMap->find( pFrm );
|
|
|
|
if( aIter != pMap->end() )
|
|
|
|
xAcc = (*aIter).second;
|
2002-03-08 12:26:29 +00:00
|
|
|
}
|
|
|
|
}
|
2002-03-21 11:50:31 +00:00
|
|
|
|
2002-03-08 12:26:29 +00:00
|
|
|
{
|
|
|
|
vos::OGuard aGuard( aEventMutex );
|
2002-03-21 11:50:31 +00:00
|
|
|
if( pEvents )
|
2002-03-08 12:26:29 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
SwAccessibleEventMap_Impl::iterator aIter =
|
|
|
|
pEventMap->find( pFrm );
|
|
|
|
if( aIter != pEventMap->end() )
|
|
|
|
{
|
|
|
|
SwAccessibleEvent_Impl aEvent(
|
|
|
|
SwAccessibleEvent_Impl::DISPOSE, pFrm );
|
|
|
|
AppendEvent( aEvent );
|
|
|
|
}
|
2002-02-11 11:51:16 +00:00
|
|
|
}
|
|
|
|
}
|
2002-03-21 11:50:31 +00:00
|
|
|
|
|
|
|
// Dispose when map mutex is not locked
|
|
|
|
if( xAcc.is() )
|
|
|
|
{
|
|
|
|
SwAccessibleContext *pAccImpl =
|
|
|
|
static_cast< SwAccessibleContext *>( xAcc.get() );
|
2002-04-05 11:18:25 +00:00
|
|
|
pAccImpl->Dispose( bRecursive );
|
2002-03-21 11:50:31 +00:00
|
|
|
}
|
2002-02-11 11:51:16 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwAccessibleMap::MoveFrm( const SwFrm *pFrm, const SwRect& rOldFrm )
|
|
|
|
{
|
2002-02-27 08:32:33 +00:00
|
|
|
if( pFrm->IsAccessibleFrm() )
|
2002-02-11 11:51:16 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
Reference < XAccessible > xAcc;
|
|
|
|
Reference < XAccessible > xParentAcc;
|
2002-02-11 11:51:16 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
vos::OGuard aGuard( aMutex );
|
|
|
|
|
|
|
|
if( pMap )
|
2002-02-11 11:51:16 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
SwAccessibleContextMap_Impl::iterator aIter = pMap->find( pFrm );
|
|
|
|
if( aIter != pMap->end() )
|
2002-03-08 12:26:29 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
// If there is an accesible object already it is
|
|
|
|
// notified directly.
|
|
|
|
xAcc = (*aIter).second;
|
2002-03-08 12:26:29 +00:00
|
|
|
}
|
2002-03-21 11:50:31 +00:00
|
|
|
else
|
2002-02-11 11:51:16 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
// Otherwise we look if the parent is accessible.
|
|
|
|
// If not, there is nothing to do.
|
2002-04-05 11:18:25 +00:00
|
|
|
const SwFrm *pParent = SwAccessibleFrame::GetParent( pFrm );
|
2002-03-21 11:50:31 +00:00
|
|
|
|
2002-04-05 11:18:25 +00:00
|
|
|
if( pParent )
|
2002-02-11 11:51:16 +00:00
|
|
|
{
|
2002-04-05 11:18:25 +00:00
|
|
|
aIter = pMap->find( pParent );
|
2002-03-21 11:50:31 +00:00
|
|
|
if( aIter != pMap->end() )
|
2002-03-08 12:26:29 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
xParentAcc = (*aIter).second;
|
2002-03-08 12:26:29 +00:00
|
|
|
}
|
2002-02-11 11:51:16 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2002-03-21 11:50:31 +00:00
|
|
|
|
|
|
|
if( xAcc.is() )
|
|
|
|
{
|
2002-04-05 11:18:25 +00:00
|
|
|
ASSERT( !rOldFrm.IsEmpty(),
|
|
|
|
"new context has already a size" );
|
2002-03-21 11:50:31 +00:00
|
|
|
SwAccessibleContext *pAccImpl =
|
|
|
|
static_cast< SwAccessibleContext *>( xAcc.get() );
|
|
|
|
if( GetShell()->ActionPend() )
|
|
|
|
{
|
|
|
|
SwAccessibleEvent_Impl aEvent(
|
|
|
|
SwAccessibleEvent_Impl::POS_CHANGED, pAccImpl,
|
|
|
|
pFrm );
|
|
|
|
AppendEvent( aEvent );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pAccImpl->PosChanged();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if( xParentAcc.is() )
|
|
|
|
{
|
|
|
|
SwAccessibleContext *pAccImpl =
|
|
|
|
static_cast< SwAccessibleContext *>(xParentAcc.get());
|
|
|
|
if( GetShell()->ActionPend() )
|
|
|
|
{
|
|
|
|
SwAccessibleEvent_Impl aEvent(
|
|
|
|
SwAccessibleEvent_Impl::CHILD_POS_CHANGED,
|
|
|
|
pAccImpl, pFrm, rOldFrm );
|
|
|
|
AppendEvent( aEvent );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pAccImpl->ChildPosChanged( pFrm, rOldFrm );
|
|
|
|
}
|
|
|
|
}
|
2002-02-11 11:51:16 +00:00
|
|
|
}
|
2002-02-04 13:10:18 +00:00
|
|
|
}
|
2002-03-08 12:26:29 +00:00
|
|
|
|
|
|
|
void SwAccessibleMap::InvalidateFrmContent( const SwFrm *pFrm )
|
|
|
|
{
|
|
|
|
if( pFrm->IsAccessibleFrm() )
|
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
Reference < XAccessible > xAcc;
|
|
|
|
{
|
|
|
|
vos::OGuard aGuard( aMutex );
|
2002-03-08 12:26:29 +00:00
|
|
|
|
2002-03-21 11:50:31 +00:00
|
|
|
if( pMap )
|
|
|
|
{
|
|
|
|
SwAccessibleContextMap_Impl::iterator aIter = pMap->find( pFrm );
|
|
|
|
if( aIter != pMap->end() )
|
|
|
|
xAcc = (*aIter).second;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( xAcc.is() )
|
2002-03-08 12:26:29 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
SwAccessibleContext *pAccImpl =
|
|
|
|
static_cast< SwAccessibleContext *>( xAcc.get() );
|
|
|
|
if( GetShell()->ActionPend() )
|
2002-03-08 12:26:29 +00:00
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
SwAccessibleEvent_Impl aEvent(
|
|
|
|
SwAccessibleEvent_Impl::INVALID_CONTENT, pAccImpl,
|
|
|
|
pFrm );
|
|
|
|
AppendEvent( aEvent );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pAccImpl->InvalidateContent();
|
2002-03-08 12:26:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-04-05 11:18:25 +00:00
|
|
|
void SwAccessibleMap::InvalidateCursorPosition( const SwFrm *pFrm )
|
2002-03-18 11:49:59 +00:00
|
|
|
{
|
2002-04-05 11:18:25 +00:00
|
|
|
ViewShell *pVSh = GetShell();
|
|
|
|
if( pVSh->ISA( SwFEShell ) )
|
|
|
|
{
|
|
|
|
sal_uInt16 nObjCount;
|
|
|
|
SwFEShell *pFESh = static_cast< SwFEShell * >( pVSh );
|
|
|
|
const SwFrm *pFlyFrm = pFESh->GetCurrFlyFrm();
|
|
|
|
if( pFlyFrm )
|
|
|
|
{
|
|
|
|
pFrm = pFlyFrm;
|
|
|
|
}
|
|
|
|
else if( (nObjCount = pFESh->IsObjSelected()) > 0 )
|
|
|
|
{
|
|
|
|
pFrm = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ASSERT( !pFrm || pFrm->IsAccessibleFrm(), "frame is not accessible" );
|
|
|
|
|
|
|
|
Reference < XAccessible > xOldAcc;
|
|
|
|
Reference < XAccessible > xAcc;
|
2002-03-18 11:49:59 +00:00
|
|
|
|
|
|
|
{
|
2002-04-05 11:18:25 +00:00
|
|
|
vos::OGuard aGuard( aMutex );
|
2002-03-18 11:49:59 +00:00
|
|
|
|
2002-04-05 11:18:25 +00:00
|
|
|
if( pMap )
|
2002-03-18 11:49:59 +00:00
|
|
|
{
|
2002-04-05 11:18:25 +00:00
|
|
|
xOldAcc = pMap->xCursorContext;
|
|
|
|
pMap->xCursorContext = xAcc; // clear reference
|
2002-03-18 11:49:59 +00:00
|
|
|
|
2002-04-05 11:18:25 +00:00
|
|
|
if( pFrm && pFrm->IsAccessibleFrm() )
|
2002-03-18 11:49:59 +00:00
|
|
|
{
|
|
|
|
SwAccessibleContextMap_Impl::iterator aIter =
|
|
|
|
pMap->find( pFrm );
|
|
|
|
if( aIter != pMap->end() )
|
|
|
|
xAcc = (*aIter).second;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2002-04-05 11:18:25 +00:00
|
|
|
|
|
|
|
if( xOldAcc.is() && xOldAcc != xAcc )
|
|
|
|
InvalidateCursorPosition( xOldAcc );
|
|
|
|
if( xAcc.is() )
|
|
|
|
InvalidateCursorPosition( xAcc );
|
2002-03-18 11:49:59 +00:00
|
|
|
}
|
|
|
|
|
2002-04-05 11:18:25 +00:00
|
|
|
void SwAccessibleMap::SetCursorContext(
|
|
|
|
const ::vos::ORef < SwAccessibleContext >& rCursorContext )
|
2002-03-18 11:49:59 +00:00
|
|
|
{
|
|
|
|
vos::OGuard aGuard( aMutex );
|
|
|
|
if( pMap )
|
|
|
|
{
|
2002-04-05 11:18:25 +00:00
|
|
|
Reference < XAccessible > xAcc( rCursorContext.getBodyPtr() );
|
|
|
|
pMap->xCursorContext = xAcc;
|
2002-03-18 11:49:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-03-19 11:49:27 +00:00
|
|
|
void SwAccessibleMap::InvalidateStates( sal_uInt8 nStates )
|
|
|
|
{
|
|
|
|
Reference< XAccessible > xAcc( GetDocumentView() );
|
|
|
|
SwAccessibleContext *pAccImpl =
|
|
|
|
static_cast< SwAccessibleContext *>( xAcc.get() );
|
|
|
|
if( GetShell()->ActionPend() )
|
|
|
|
{
|
|
|
|
SwAccessibleEvent_Impl aEvent(
|
|
|
|
SwAccessibleEvent_Impl::CARET_OR_STATES, pAccImpl,
|
|
|
|
pAccImpl->GetFrm(), nStates );
|
|
|
|
AppendEvent( aEvent );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pAccImpl->CheckStates( nStates );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-03-08 12:26:29 +00:00
|
|
|
void SwAccessibleMap::FireEvents()
|
|
|
|
{
|
|
|
|
vos::OGuard aGuard( aEventMutex );
|
|
|
|
if( pEvents )
|
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
pEvents->SetFiring();
|
2002-03-08 12:26:29 +00:00
|
|
|
SwAccessibleEventList_Impl::iterator aIter = pEvents->begin();
|
|
|
|
while( aIter != pEvents->end() )
|
|
|
|
{
|
2002-03-21 11:50:31 +00:00
|
|
|
FireEvent( *aIter );
|
2002-03-08 12:26:29 +00:00
|
|
|
aIter++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
delete pEventMap;
|
|
|
|
pEventMap = 0;
|
|
|
|
|
|
|
|
delete pEvents;
|
|
|
|
pEvents = 0;
|
|
|
|
}
|