2002-05-16 15:12:20 +00:00
/*************************************************************************
*
* $ RCSfile : AccessibleTextHelper . cxx , v $
*
2002-10-02 16:09:36 +00:00
* $ Revision : 1.28 $
2002-05-16 15:12:20 +00:00
*
2002-10-02 16:09:36 +00:00
* last change : $ Author : thb $ $ Date : 2002 - 10 - 02 17 : 09 : 36 $
2002-05-16 15:12:20 +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 ) : _______________________________________
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# pragma hdrstop
//------------------------------------------------------------------------
//
// Global header
//
//------------------------------------------------------------------------
# include <limits.h>
# include <memory>
# include <algorithm>
# ifndef _VOS_MUTEX_HXX_
# include <vos/mutex.hxx>
# endif
# ifndef _COM_SUN_STAR_UNO_ANY_HXX_
# include <com/sun/star/uno/Any.hxx>
# endif
# ifndef _COM_SUN_STAR_UNO_REFERENCE_HXX_
# include <com/sun/star/uno/Reference.hxx>
# endif
# ifndef _CPPUHELPER_WEAKREF_HXX_
# include <cppuhelper/weakref.hxx>
# endif
# ifndef _COM_SUN_STAR_AWT_POINT_HPP_
# include <com/sun/star/awt/Point.hpp>
# endif
# ifndef _COM_SUN_STAR_AWT_RECTANGLE_HPP_
# include <com/sun/star/awt/Rectangle.hpp>
# endif
2002-06-04 17:44:27 +00:00
# ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_
# include <com/sun/star/lang/DisposedException.hpp>
# endif
2002-05-16 15:12:20 +00:00
# ifndef _DRAFTS_COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEEVENTID_HPP_
# include <drafts/com/sun/star/accessibility/AccessibleEventId.hpp>
# endif
# ifndef _DRAFTS_COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLE_HPP_
# include <drafts/com/sun/star/accessibility/XAccessible.hpp>
# endif
# ifndef _DRAFTS_COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLECONTEXT_HPP_
# include <drafts/com/sun/star/accessibility/XAccessibleContext.hpp>
# endif
# ifndef _DRAFTS_COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLECOMPONENT_HPP_
# include <drafts/com/sun/star/accessibility/XAccessibleComponent.hpp>
# endif
# ifndef _DRAFTS_COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEROLE_HPP_
# include <drafts/com/sun/star/accessibility/AccessibleRole.hpp>
# endif
# ifndef _DRAFTS_COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLETEXTTYPE_HPP_
# include <drafts/com/sun/star/accessibility/AccessibleTextType.hpp>
# endif
# ifndef _DRAFTS_COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLETEXT_HPP_
# include <drafts/com/sun/star/accessibility/XAccessibleText.hpp>
# endif
# ifndef _DRAFTS_COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLEEDITABLETEXT_HPP_
# include <drafts/com/sun/star/accessibility/XAccessibleEditableText.hpp>
# endif
# ifndef _DRAFTS_COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLESTATETYPE_HPP_
# include <drafts/com/sun/star/accessibility/AccessibleStateType.hpp>
# endif
# ifndef _UTL_ACCESSIBLESTATESETHELPER_HXX_
# include <unotools/accessiblestatesethelper.hxx>
# endif
2002-08-23 16:50:51 +00:00
# ifndef _VCL_UNOHELP_HXX
# include <vcl/unohelp.hxx>
# endif
2002-05-16 15:12:20 +00:00
//------------------------------------------------------------------------
//
// Project-local header
//
//------------------------------------------------------------------------
2002-05-17 18:12:44 +00:00
# ifndef _SVX_ACCESSILE_TEXT_HELPER_HXX_
# include "AccessibleTextHelper.hxx"
2002-05-16 15:12:20 +00:00
# endif
# ifndef _SVX_UNOSHAPE_HXX
# include "unoshape.hxx"
# endif
# ifndef _UNO_LINGU_HXX
# include "unolingu.hxx"
# endif
# ifndef _SVX_UNOTEXT_HXX
# include "unotext.hxx"
# endif
# include "unoedhlp.hxx"
# include "unopracc.hxx"
# include "AccessibleParaManager.hxx"
# include "AccessibleEditableTextPara.hxx"
# include "svdmodel.hxx"
# include "svdpntv.hxx"
# include "editdata.hxx"
# include "editeng.hxx"
# include "editview.hxx"
using namespace : : com : : sun : : star ;
using namespace : : drafts : : com : : sun : : star : : accessibility ;
2002-05-17 18:12:44 +00:00
namespace accessibility
{
2002-05-16 15:12:20 +00:00
//------------------------------------------------------------------------
//
2002-05-17 18:12:44 +00:00
// AccessibleTextHelper_Impl declaration
2002-05-16 15:12:20 +00:00
//
//------------------------------------------------------------------------
2002-05-17 18:12:44 +00:00
class AccessibleTextHelper_Impl : public SfxListener
{
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
public :
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// receive pointer to our frontend class and view window
2002-06-26 10:38:03 +00:00
AccessibleTextHelper_Impl ( ) ;
2002-05-17 18:12:44 +00:00
~ AccessibleTextHelper_Impl ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// XAccessibleContext child handling methods
2002-06-26 10:38:03 +00:00
sal_Int32 SAL_CALL getAccessibleChildCount ( ) SAL_THROW ( ( uno : : RuntimeException ) ) ;
uno : : Reference < XAccessible > SAL_CALL getAccessibleChild ( sal_Int32 i ) SAL_THROW ( ( lang : : IndexOutOfBoundsException , uno : : RuntimeException ) ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// XAccessibleEventBroadcaster child related methods
2002-06-26 10:38:03 +00:00
void SAL_CALL addEventListener ( const uno : : Reference < XAccessibleEventListener > & xListener ) SAL_THROW ( ( uno : : RuntimeException ) ) ;
void SAL_CALL removeEventListener ( const uno : : Reference < XAccessibleEventListener > & xListener ) SAL_THROW ( ( uno : : RuntimeException ) ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// XAccessibleComponent child related methods
2002-06-26 10:38:03 +00:00
uno : : Reference < XAccessible > SAL_CALL getAccessibleAt ( const awt : : Point & aPoint ) SAL_THROW ( ( uno : : RuntimeException ) ) ;
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
SvxEditSourceAdapter & GetEditSource ( ) const SAL_THROW ( ( uno : : RuntimeException ) ) ;
void SetEditSource ( : : std : : auto_ptr < SvxEditSource > pEditSource ) SAL_THROW ( ( uno : : RuntimeException ) ) ;
void SetEventSource ( const uno : : Reference < XAccessible > & rInterface ) { mxFrontEnd = rInterface ; }
uno : : Reference < XAccessible > GetEventSource ( ) const { return mxFrontEnd ; }
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
void SetOffset ( const Point & ) ;
2002-06-07 11:19:53 +00:00
Point GetOffset ( ) const { : : osl : : MutexGuard aGuard ( maMutex ) ; Point aPoint ( maOffset ) ; return aPoint ; }
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
void SetStartIndex ( sal_Int32 nOffset ) ;
sal_Int32 GetStartIndex ( ) const
2002-06-07 11:19:53 +00:00
{
// Strictly correct only with locked solar mutex, // but
// here we rely on the fact that sal_Int32 access is
// atomic
return mnStartIndex ;
}
2002-05-23 11:46:18 +00:00
2002-05-17 18:12:44 +00:00
sal_Bool IsSelected ( ) const ;
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
void Dispose ( ) ;
2002-05-17 18:12:44 +00:00
// do NOT hold object mutex when calling this! Danger of deadlock
void FireEvent ( const sal_Int16 nEventId , const uno : : Any & rNewValue = uno : : Any ( ) , const uno : : Any & rOldValue = uno : : Any ( ) ) const ;
2002-06-12 16:20:45 +00:00
void FireEvent ( const AccessibleEventObject & rEvent ) const ;
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
void SetFocus ( sal_Bool bHaveFocus ) SAL_THROW ( ( : : com : : sun : : star : : uno : : RuntimeException ) ) ;
sal_Bool HaveFocus ( ) SAL_THROW ( ( : : com : : sun : : star : : uno : : RuntimeException ) ) ;
void SetChildFocus ( sal_Int32 nChild , sal_Bool bHaveFocus ) SAL_THROW ( ( : : com : : sun : : star : : uno : : RuntimeException ) ) ;
void SetShapeFocus ( sal_Bool bHaveFocus ) SAL_THROW ( ( : : com : : sun : : star : : uno : : RuntimeException ) ) ;
void ChangeChildFocus ( sal_Int32 nNewChild ) SAL_THROW ( ( : : com : : sun : : star : : uno : : RuntimeException ) ) ;
2002-05-23 11:46:18 +00:00
2002-05-16 15:12:20 +00:00
# ifdef DBG_UTIL
2002-05-17 18:12:44 +00:00
void CheckInvariants ( ) const ;
2002-05-16 15:12:20 +00:00
# endif
2002-05-17 18:12:44 +00:00
// checks all children for visibility, throws away invisible ones
void UpdateVisibleChildren ( ) ;
2002-05-16 15:12:20 +00:00
2002-06-06 13:06:17 +00:00
// check all children for changes in posit<69> on and size
2002-08-02 10:35:10 +00:00
void UpdateBoundRect ( ) ;
2002-06-06 13:06:17 +00:00
2002-06-12 12:41:41 +00:00
// calls SetSelection on the forwarder and updates maLastSelection
// cache.
void UpdateSelection ( ) ;
2002-05-17 18:12:44 +00:00
private :
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// syntactic sugar for FireEvent
void GotPropertyEvent ( const uno : : Any & rNewValue , const sal_Int16 nEventId ) const { FireEvent ( nEventId , rNewValue ) ; }
void LostPropertyEvent ( const uno : : Any & rOldValue , const sal_Int16 nEventId ) const { FireEvent ( nEventId , uno : : Any ( ) , rOldValue ) ; }
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// shutdown usage of current edit source on myself and the children.
2002-06-26 10:38:03 +00:00
void ShutdownEditSource ( ) SAL_THROW ( ( uno : : RuntimeException ) ) ;
2002-05-16 15:12:20 +00:00
2002-06-12 12:41:41 +00:00
void ParagraphsMoved ( sal_Int32 nFirst , sal_Int32 nMiddle , sal_Int32 nLast ) ;
void ParagraphsInserted ( sal_Int32 nFirst ) ;
void ParagraphsRemoved ( sal_Int32 nFirst ) ;
2002-05-23 11:46:18 +00:00
2002-05-17 18:12:44 +00:00
virtual void Notify ( SfxBroadcaster & rBC , const SfxHint & rHint ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// lock solar mutex before
2002-06-26 10:38:03 +00:00
SvxTextForwarder & GetTextForwarder ( ) const SAL_THROW ( ( uno : : RuntimeException ) ) ;
2002-05-17 18:12:44 +00:00
// lock solar mutex before
2002-06-26 10:38:03 +00:00
SvxViewForwarder & GetViewForwarder ( ) const SAL_THROW ( ( uno : : RuntimeException ) ) ;
2002-05-17 18:12:44 +00:00
// lock solar mutex before
2002-06-26 10:38:03 +00:00
SvxEditViewForwarder & GetEditViewForwarder ( sal_Bool bCreate = sal_False ) const SAL_THROW ( ( uno : : RuntimeException ) ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// are we in edit mode?
2002-06-26 10:38:03 +00:00
sal_Bool IsActive ( ) const SAL_THROW ( ( uno : : RuntimeException ) ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// our frontend class (the one implementing the actual
// interface). That's not necessarily the one containing the impl
// pointer!
2002-06-26 10:38:03 +00:00
uno : : Reference < XAccessible > mxFrontEnd ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// a wrapper for the text forwarders (guarded by solar mutex)
mutable SvxEditSourceAdapter maEditSource ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// store last selection (to correctly report selection changes, guarded by solar mutex)
ESelection maLastSelection ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// cache range of visible children (guarded by solar mutex)
sal_Int32 mnFirstVisibleChild ;
sal_Int32 mnLastVisibleChild ;
2002-05-17 16:35:10 +00:00
2002-06-07 11:19:53 +00:00
// offset to add to all our children (unguarded, relying on
// the fact that sal_Int32 access is atomic)
2002-05-23 11:46:18 +00:00
sal_Int32 mnStartIndex ;
2002-05-17 18:12:44 +00:00
// the object handling our children (guarded by solar mutex)
accessibility : : AccessibleParaManager maParaManager ;
2002-05-16 15:12:20 +00:00
2002-05-23 11:46:18 +00:00
// spin lock to prevent notify in notify (guarded by solar mutex)
2002-05-17 18:12:44 +00:00
sal_Bool mbInNotify ;
2002-05-16 15:12:20 +00:00
2002-06-04 17:44:27 +00:00
// whether the object or it's children has the focus set (guarded by solar mutex)
sal_Bool mbGroupHasFocus ;
// whether we (this object) has the focus set (guarded by solar mutex)
sal_Bool mbThisHasFocus ;
2002-05-23 11:46:18 +00:00
2002-06-12 12:41:41 +00:00
// whether the children are active and editable (guarded by solar mutex)
sal_Bool mbChildrenActive ;
// the internal paragraph number of the child with the focus (guarded by solar mutex)
sal_Int32 mnFocusedChild ;
2002-05-17 18:12:44 +00:00
// must be before maStateListeners, has to live longer
mutable : : osl : : Mutex maMutex ;
2002-05-16 15:12:20 +00:00
2002-06-07 11:19:53 +00:00
/// our current offset to the containing shape/cell (guarded by maMutex)
Point maOffset ;
2002-05-17 18:12:44 +00:00
// handles our event listeners (guarded by maMutex)
: : cppu : : OInterfaceContainerHelper maStateListeners ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
} ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
//------------------------------------------------------------------------
//
// AccessibleTextHelper_Impl implementation
//
//------------------------------------------------------------------------
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
AccessibleTextHelper_Impl : : AccessibleTextHelper_Impl ( ) :
mxFrontEnd ( NULL ) ,
2002-06-06 13:06:17 +00:00
maLastSelection ( EE_PARA_NOT_FOUND , EE_PARA_NOT_FOUND , EE_PARA_NOT_FOUND , EE_PARA_NOT_FOUND ) ,
2002-05-17 18:12:44 +00:00
mnFirstVisibleChild ( - 1 ) ,
mnLastVisibleChild ( - 2 ) ,
2002-05-23 11:46:18 +00:00
mnStartIndex ( 0 ) ,
2002-05-17 18:12:44 +00:00
mbInNotify ( sal_False ) ,
2002-06-04 17:44:27 +00:00
mbGroupHasFocus ( sal_False ) ,
mbThisHasFocus ( sal_False ) ,
2002-06-12 12:41:41 +00:00
mbChildrenActive ( sal_False ) ,
mnFocusedChild ( - 1 ) ,
2002-06-07 11:19:53 +00:00
maOffset ( 0 , 0 ) ,
2002-05-17 18:12:44 +00:00
maStateListeners ( maMutex )
2002-05-16 15:12:20 +00:00
{
}
2002-05-17 18:12:44 +00:00
AccessibleTextHelper_Impl : : ~ AccessibleTextHelper_Impl ( )
{
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
try
{
2002-07-25 07:35:13 +00:00
Dispose ( ) ;
2002-05-17 18:12:44 +00:00
}
2002-05-23 11:46:18 +00:00
catch ( const uno : : Exception & ) { }
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
SvxTextForwarder & AccessibleTextHelper_Impl : : GetTextForwarder ( ) const SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
if ( ! maEditSource . IsValid ( ) )
throw uno : : RuntimeException ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Unknown edit source " ) ) , mxFrontEnd ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
SvxTextForwarder * pTextForwarder = maEditSource . GetTextForwarder ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
if ( ! pTextForwarder )
throw uno : : RuntimeException ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Unable to fetch text forwarder, model might be dead " ) ) , mxFrontEnd ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
if ( pTextForwarder - > IsValid ( ) )
return * pTextForwarder ;
else
throw uno : : RuntimeException ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Text forwarder is invalid, model might be dead " ) ) , mxFrontEnd ) ;
}
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
SvxViewForwarder & AccessibleTextHelper_Impl : : GetViewForwarder ( ) const SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
if ( ! maEditSource . IsValid ( ) )
throw uno : : RuntimeException ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Unknown edit source " ) ) , mxFrontEnd ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
SvxViewForwarder * pViewForwarder = maEditSource . GetViewForwarder ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
if ( ! pViewForwarder )
throw uno : : RuntimeException ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Unable to fetch view forwarder, model might be dead " ) ) , mxFrontEnd ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
if ( pViewForwarder - > IsValid ( ) )
return * pViewForwarder ;
else
throw uno : : RuntimeException ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " View forwarder is invalid, model might be dead " ) ) , mxFrontEnd ) ;
}
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
SvxEditViewForwarder & AccessibleTextHelper_Impl : : GetEditViewForwarder ( sal_Bool bCreate ) const SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-16 15:12:20 +00:00
{
2002-05-17 18:12:44 +00:00
if ( ! maEditSource . IsValid ( ) )
throw uno : : RuntimeException ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Unknown edit source " ) ) , mxFrontEnd ) ;
SvxEditViewForwarder * pViewForwarder = maEditSource . GetEditViewForwarder ( bCreate ) ;
if ( ! pViewForwarder )
{
if ( bCreate )
throw uno : : RuntimeException ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Unable to fetch edit view forwarder, model might be dead " ) ) , mxFrontEnd ) ;
else
throw uno : : RuntimeException ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " No edit view forwarder, object not in edit mode " ) ) , mxFrontEnd ) ;
}
if ( pViewForwarder - > IsValid ( ) )
return * pViewForwarder ;
2002-05-16 15:12:20 +00:00
else
2002-05-17 18:12:44 +00:00
{
if ( bCreate )
throw uno : : RuntimeException ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " View forwarder is invalid, model might be dead " ) ) , mxFrontEnd ) ;
else
throw uno : : RuntimeException ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " View forwarder is invalid, object not in edit mode " ) ) , mxFrontEnd ) ;
}
2002-05-16 15:12:20 +00:00
}
2002-06-26 10:38:03 +00:00
SvxEditSourceAdapter & AccessibleTextHelper_Impl : : GetEditSource ( ) const SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-16 15:12:20 +00:00
{
2002-05-17 18:12:44 +00:00
if ( maEditSource . IsValid ( ) )
return maEditSource ;
2002-05-16 15:12:20 +00:00
else
2002-05-17 18:12:44 +00:00
throw uno : : RuntimeException ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " AccessibleTextHelper_Impl::GetEditSource: no edit source " ) ) , mxFrontEnd ) ;
2002-05-16 15:12:20 +00:00
}
2002-05-17 18:12:44 +00:00
sal_Bool AccessibleTextHelper_Impl : : IsSelected ( ) const
{
sal_Bool bRet = sal_False ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
try
{
ESelection aSelection ;
bRet = GetEditViewForwarder ( ) . GetSelection ( aSelection ) ;
}
2002-05-23 11:46:18 +00:00
catch ( const uno : : Exception & ) { }
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
return bRet ;
2002-05-16 15:12:20 +00:00
}
2002-05-23 11:46:18 +00:00
// functor for sending child events (no stand-alone function, they are maybe not inlined)
class AccessibleTextHelper_OffsetChildIndex : public : : std : : unary_function < accessibility : : AccessibleEditableTextPara & , void >
{
public :
AccessibleTextHelper_OffsetChildIndex ( sal_Int32 nDifference ) : mnDifference ( nDifference ) { }
void operator ( ) ( accessibility : : AccessibleEditableTextPara & rPara )
{
rPara . SetIndexInParent ( rPara . GetIndexInParent ( ) + mnDifference ) ;
}
private :
const sal_Int32 mnDifference ;
} ;
2002-06-26 10:38:03 +00:00
void AccessibleTextHelper_Impl : : SetStartIndex ( sal_Int32 nOffset )
2002-05-23 11:46:18 +00:00
{
sal_Int32 nOldOffset ( mnStartIndex ) ;
mnStartIndex = nOffset ;
if ( nOldOffset ! = nOffset )
{
// update children
AccessibleTextHelper_OffsetChildIndex aFunctor ( nOffset - nOldOffset ) ;
: : std : : for_each ( maParaManager . begin ( ) , maParaManager . end ( ) ,
AccessibleParaManager : : WeakChildAdapter < AccessibleTextHelper_OffsetChildIndex > ( aFunctor ) ) ;
}
}
2002-06-26 10:38:03 +00:00
void AccessibleTextHelper_Impl : : SetChildFocus ( sal_Int32 nChild , sal_Bool bHaveFocus ) SAL_THROW ( ( : : com : : sun : : star : : uno : : RuntimeException ) )
2002-06-04 17:44:27 +00:00
{
if ( bHaveFocus )
{
if ( mbThisHasFocus )
SetShapeFocus ( sal_False ) ;
2002-06-12 12:41:41 +00:00
maParaManager . SetFocus ( nChild ) ;
2002-06-13 17:46:17 +00:00
// we just received the focus, also send caret event then
UpdateSelection ( ) ;
2002-06-04 17:44:27 +00:00
}
else
{
2002-06-12 12:41:41 +00:00
maParaManager . SetFocus ( - 1 ) ;
2002-06-04 17:44:27 +00:00
if ( mbGroupHasFocus )
SetShapeFocus ( sal_True ) ;
}
}
2002-06-26 10:38:03 +00:00
void AccessibleTextHelper_Impl : : ChangeChildFocus ( sal_Int32 nNewChild ) SAL_THROW ( ( : : com : : sun : : star : : uno : : RuntimeException ) )
2002-06-12 12:41:41 +00:00
{
if ( mbThisHasFocus )
SetShapeFocus ( sal_False ) ;
mbGroupHasFocus = sal_True ;
maParaManager . SetFocus ( nNewChild ) ;
}
2002-06-26 10:38:03 +00:00
void AccessibleTextHelper_Impl : : SetShapeFocus ( sal_Bool bHaveFocus ) SAL_THROW ( ( : : com : : sun : : star : : uno : : RuntimeException ) )
2002-06-04 17:44:27 +00:00
{
sal_Bool bOldFocus ( mbThisHasFocus ) ;
mbThisHasFocus = bHaveFocus ;
if ( bOldFocus ! = bHaveFocus )
{
if ( bHaveFocus )
GotPropertyEvent ( uno : : makeAny ( AccessibleStateType : : FOCUSED ) , AccessibleEventId : : ACCESSIBLE_STATE_EVENT ) ;
else
LostPropertyEvent ( uno : : makeAny ( AccessibleStateType : : FOCUSED ) , AccessibleEventId : : ACCESSIBLE_STATE_EVENT ) ;
}
}
2002-06-26 10:38:03 +00:00
void AccessibleTextHelper_Impl : : SetFocus ( sal_Bool bHaveFocus ) SAL_THROW ( ( : : com : : sun : : star : : uno : : RuntimeException ) )
2002-05-23 11:46:18 +00:00
{
2002-06-04 17:44:27 +00:00
sal_Bool bOldFocus ( mbGroupHasFocus ) ;
2002-05-23 11:46:18 +00:00
2002-06-04 17:44:27 +00:00
mbGroupHasFocus = bHaveFocus ;
2002-05-23 11:46:18 +00:00
if ( IsActive ( ) )
{
try
{
// find the one with the cursor and get/set focus accordingly
ESelection aSelection ;
if ( GetEditViewForwarder ( ) . GetSelection ( aSelection ) )
2002-06-04 17:44:27 +00:00
SetChildFocus ( aSelection . nEndPara , bHaveFocus ) ;
2002-05-23 11:46:18 +00:00
}
catch ( const uno : : Exception & ) { }
}
else if ( bOldFocus ! = bHaveFocus )
{
2002-06-04 17:44:27 +00:00
SetShapeFocus ( bHaveFocus ) ;
2002-05-23 11:46:18 +00:00
}
2002-07-05 09:39:58 +00:00
DBG_TRACE2 ( " AccessibleTextHelper_Impl::SetFocus: focus changed, Object %d, state: %s " , this , bHaveFocus ? " focused " : " not focused " ) ;
2002-05-23 11:46:18 +00:00
}
2002-06-26 10:38:03 +00:00
sal_Bool AccessibleTextHelper_Impl : : HaveFocus ( ) SAL_THROW ( ( : : com : : sun : : star : : uno : : RuntimeException ) )
2002-05-23 11:46:18 +00:00
{
2002-06-07 11:19:53 +00:00
// No locking of solar mutex here, since we rely on the fact
// that sal_Bool access is atomic
2002-06-04 17:44:27 +00:00
return mbThisHasFocus ;
2002-05-23 11:46:18 +00:00
}
2002-06-26 10:38:03 +00:00
sal_Bool AccessibleTextHelper_Impl : : IsActive ( ) const SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
2002-06-14 11:16:33 +00:00
try
{
SvxEditSource & rEditSource = GetEditSource ( ) ;
SvxEditViewForwarder * pViewForwarder = rEditSource . GetEditViewForwarder ( ) ;
2002-05-16 15:12:20 +00:00
2002-06-14 11:16:33 +00:00
if ( ! pViewForwarder )
return sal_False ;
2002-05-16 15:12:20 +00:00
2002-06-14 11:16:33 +00:00
if ( pViewForwarder - > IsValid ( ) )
return sal_True ;
else
return sal_False ;
}
catch ( const uno : : RuntimeException & )
{
2002-05-17 18:12:44 +00:00
return sal_False ;
2002-06-14 11:16:33 +00:00
}
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
2002-06-12 12:41:41 +00:00
void AccessibleTextHelper_Impl : : UpdateSelection ( )
2002-05-16 15:12:20 +00:00
{
2002-06-14 11:16:33 +00:00
try
2002-05-17 18:12:44 +00:00
{
2002-06-14 11:16:33 +00:00
ESelection aSelection ;
if ( GetEditViewForwarder ( ) . GetSelection ( aSelection ) )
2002-06-04 17:44:27 +00:00
{
2002-06-14 11:16:33 +00:00
if ( ! maLastSelection . IsEqual ( aSelection ) )
2002-06-06 13:06:17 +00:00
{
2002-07-15 15:40:43 +00:00
DBG_ASSERT ( ! mbThisHasFocus , " AccessibleTextHelper_Impl::UpdateSelection: editing, but focus on parent " ) ;
2002-05-16 15:12:20 +00:00
2002-06-14 11:16:33 +00:00
// notify all affected paragraphs (TODO: may be suboptimal,
// since some paragraphs might stay selected)
if ( maLastSelection . nStartPara ! = EE_PARA_NOT_FOUND )
{
// Did the caret move from one paragraph to another?
2002-07-05 09:39:58 +00:00
// #100530# no caret events if not focused.
if ( mbGroupHasFocus & &
maLastSelection . nEndPara ! = aSelection . nEndPara )
2002-06-14 11:16:33 +00:00
{
maParaManager . FireEvent ( maLastSelection . nEndPara ,
maLastSelection . nEndPara + 1 ,
AccessibleEventId : : ACCESSIBLE_CARET_EVENT ,
uno : : makeAny ( static_cast < sal_Int32 > ( - 1 ) ) ,
uno : : makeAny ( static_cast < sal_Int32 > ( maLastSelection . nEndPos ) ) ) ;
ChangeChildFocus ( aSelection . nEndPara ) ;
2002-07-05 09:39:58 +00:00
DBG_TRACE3 ( " AccessibleTextHelper_Impl::UpdateSelection(): focus changed, Object: %d, Paragraph: %d, Last paragraph: %d " ,
this , aSelection . nEndPara , maLastSelection . nEndPara ) ;
2002-06-14 11:16:33 +00:00
}
2002-06-12 12:41:41 +00:00
}
2002-06-06 13:06:17 +00:00
2002-06-14 11:16:33 +00:00
uno : : Any aOldCursor ;
2002-06-06 13:06:17 +00:00
2002-06-14 11:16:33 +00:00
if ( maLastSelection . nStartPara ! = EE_PARA_NOT_FOUND )
aOldCursor < < = static_cast < sal_Int32 > ( maLastSelection . nEndPos ) ;
else
aOldCursor < < = static_cast < sal_Int32 > ( - 1 ) ;
2002-06-04 17:44:27 +00:00
2002-07-05 09:39:58 +00:00
// #100530# no caret events if not focused.
if ( mbGroupHasFocus )
{
maParaManager . FireEvent ( aSelection . nEndPara ,
aSelection . nEndPara + 1 ,
AccessibleEventId : : ACCESSIBLE_CARET_EVENT ,
uno : : makeAny ( static_cast < sal_Int32 > ( aSelection . nEndPos ) ) ,
aOldCursor ) ;
}
2002-06-04 17:44:27 +00:00
2002-06-14 11:16:33 +00:00
maLastSelection = aSelection ;
2002-07-05 09:39:58 +00:00
DBG_TRACE5 ( " AccessibleTextHelper_Impl::UpdateSelection(): caret changed, Object: %d, New pos: %d, Old pos: %d, New para: %d, Old para: %d " ,
this , aSelection . nEndPos , maLastSelection . nEndPos , aSelection . nEndPara , maLastSelection . nEndPara ) ;
2002-06-14 11:16:33 +00:00
}
2002-06-06 13:06:17 +00:00
}
2002-05-17 18:12:44 +00:00
}
2002-06-14 11:16:33 +00:00
// no selection? no update actions
catch ( const uno : : RuntimeException & ) { }
2002-05-16 15:12:20 +00:00
}
2002-06-26 10:38:03 +00:00
void AccessibleTextHelper_Impl : : ShutdownEditSource ( ) SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
// This should only be called with solar mutex locked, i.e. from the main office thread
2002-05-16 15:12:20 +00:00
2002-06-13 08:46:38 +00:00
// This here is somewhat clumsy: As soon as our children have
// a NULL EditSource (maParaManager.SetEditSource()), they
// enter the disposed state and cannot be reanimated. Thus, it
// is unavoidable and a hard requirement to let go and create
// from scratch each and every child.
2002-05-17 18:12:44 +00:00
// invalidate children
2002-07-24 15:19:19 +00:00
maParaManager . Dispose ( ) ;
2002-08-02 10:35:10 +00:00
maParaManager . SetNum ( 0 ) ;
2002-05-16 15:12:20 +00:00
2002-07-24 15:19:19 +00:00
// lost all children
2002-08-02 10:35:10 +00:00
if ( mxFrontEnd . is ( ) )
FireEvent ( AccessibleEventId : : ACCESSIBLE_ALL_CHILDREN_CHANGED_EVENT ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// quit listen on stale edit source
if ( maEditSource . IsValid ( ) )
EndListening ( maEditSource . GetBroadcaster ( ) ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
maEditSource . SetEditSource ( : : std : : auto_ptr < SvxEditSource > ( NULL ) ) ;
}
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
void AccessibleTextHelper_Impl : : SetEditSource ( : : std : : auto_ptr < SvxEditSource > pEditSource ) SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
// This should only be called with solar mutex locked, i.e. from the main office thread
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// shutdown old edit source
ShutdownEditSource ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// set new edit source
maEditSource . SetEditSource ( pEditSource ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// init child vector to the current child count
if ( maEditSource . IsValid ( ) )
{
maParaManager . SetNum ( GetTextForwarder ( ) . GetParagraphCount ( ) ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// listen on new edit source
StartListening ( maEditSource . GetBroadcaster ( ) ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
UpdateVisibleChildren ( ) ;
}
2002-05-16 15:12:20 +00:00
}
2002-05-17 18:12:44 +00:00
void AccessibleTextHelper_Impl : : SetOffset ( const Point & rPoint )
{
2002-06-07 11:19:53 +00:00
// guard against non-atomic access to maOffset data structure
{
: : osl : : MutexGuard aGuard ( maMutex ) ;
maOffset = rPoint ;
}
2002-05-17 18:12:44 +00:00
maParaManager . SetEEOffset ( rPoint ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// in all cases, check visibility afterwards.
UpdateVisibleChildren ( ) ;
2002-08-02 10:35:10 +00:00
UpdateBoundRect ( ) ;
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
void AccessibleTextHelper_Impl : : UpdateVisibleChildren ( )
2002-05-16 15:12:20 +00:00
{
2002-05-17 18:12:44 +00:00
try
{
SvxTextForwarder & rCacheTF = GetTextForwarder ( ) ;
SvxViewForwarder & rCacheVF = GetViewForwarder ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
Rectangle aViewArea = rCacheVF . GetVisArea ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
if ( IsActive ( ) )
{
// maybe the edit view scrolls, adapt aViewArea
Rectangle aEditViewArea = GetEditViewForwarder ( ) . GetVisArea ( ) ;
aViewArea + = aEditViewArea . TopLeft ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// now determine intersection
aViewArea . Intersection ( aEditViewArea ) ;
}
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
Rectangle aTmpBB , aParaBB ;
sal_Bool bFirstChild = sal_True ;
sal_Int32 nCurrPara ;
sal_Int32 nParas = rCacheTF . GetParagraphCount ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mnFirstVisibleChild = - 1 ;
mnLastVisibleChild = - 2 ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
for ( nCurrPara = 0 ; nCurrPara < nParas ; + + nCurrPara )
{
DBG_ASSERT ( nCurrPara > = 0 & & nCurrPara < = USHRT_MAX ,
" AccessibleTextHelper_Impl::UpdateVisibleChildren: index value overflow " ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
aTmpBB = rCacheTF . GetParaBounds ( static_cast < USHORT > ( nCurrPara ) ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// convert to screen coordinates
aParaBB = accessibility : : AccessibleEditableTextPara : : LogicToPixel ( aTmpBB , rCacheTF . GetMapMode ( ) , rCacheVF ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
if ( aParaBB . IsOver ( aViewArea ) )
2002-05-16 15:12:20 +00:00
{
2002-05-17 18:12:44 +00:00
// at least partially visible
if ( bFirstChild )
{
bFirstChild = sal_False ;
mnFirstVisibleChild = nCurrPara ;
}
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mnLastVisibleChild = nCurrPara ;
2002-05-16 15:12:20 +00:00
2002-06-06 13:06:17 +00:00
// child not yet created?
accessibility : : AccessibleParaManager : : WeakChild aChild ( maParaManager . GetChild ( nCurrPara ) ) ;
if ( aChild . second . Width = = 0 & &
2002-06-26 10:38:03 +00:00
aChild . second . Height = = 0 & &
mxFrontEnd . is ( ) )
2002-06-06 13:06:17 +00:00
{
GotPropertyEvent ( uno : : makeAny ( maParaManager . CreateChild ( nCurrPara - mnFirstVisibleChild ,
mxFrontEnd , GetEditSource ( ) , nCurrPara ) . first ) ,
AccessibleEventId : : ACCESSIBLE_CHILD_EVENT ) ;
}
2002-05-17 18:12:44 +00:00
}
else
2002-05-16 15:12:20 +00:00
{
2002-05-17 18:12:44 +00:00
// not or no longer visible
if ( maParaManager . IsReferencable ( nCurrPara ) )
{
2002-05-29 15:09:56 +00:00
LostPropertyEvent ( uno : : makeAny ( maParaManager . GetChild ( nCurrPara ) . first . get ( ) . getRef ( ) ) ,
AccessibleEventId : : ACCESSIBLE_CHILD_EVENT ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// clear reference
maParaManager . Release ( nCurrPara ) ;
}
2002-05-16 15:12:20 +00:00
}
}
}
2002-05-23 11:46:18 +00:00
catch ( const uno : : Exception & )
2002-05-17 18:12:44 +00:00
{
DBG_ERROR ( " AccessibleTextHelper_Impl::UpdateVisibleChildren error while determining visible children " ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// something failed - currently no children
mnFirstVisibleChild = - 1 ;
mnLastVisibleChild = - 2 ;
maParaManager . SetNum ( 0 ) ;
2002-08-02 10:35:10 +00:00
// lost all children
FireEvent ( AccessibleEventId : : ACCESSIBLE_ALL_CHILDREN_CHANGED_EVENT ) ;
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
}
2002-05-23 11:46:18 +00:00
// functor for checking changes in paragraph bounding boxes (no stand-alone function, maybe not inlined)
2002-05-17 18:12:44 +00:00
class AccessibleTextHelper_UpdateChildBounds : public : : std : : unary_function < const accessibility : : AccessibleParaManager : : WeakChild & ,
accessibility : : AccessibleParaManager : : WeakChild >
2002-05-16 15:12:20 +00:00
{
2002-05-17 18:12:44 +00:00
public :
AccessibleTextHelper_UpdateChildBounds ( AccessibleTextHelper_Impl & rImpl ) : mrImpl ( rImpl ) { }
accessibility : : AccessibleParaManager : : WeakChild operator ( ) ( const accessibility : : AccessibleParaManager : : WeakChild & rChild )
2002-05-16 15:12:20 +00:00
{
2002-05-17 18:12:44 +00:00
// retrieve hard reference from weak one
accessibility : : AccessibleParaManager : : WeakPara : : HardRefType aHardRef ( rChild . first . get ( ) ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
if ( aHardRef . is ( ) )
2002-05-16 15:12:20 +00:00
{
2002-05-17 18:12:44 +00:00
awt : : Rectangle aNewRect = aHardRef - > getBounds ( ) ;
const awt : : Rectangle & aOldRect = rChild . second ;
if ( aNewRect . X ! = aOldRect . X | |
aNewRect . Y ! = aOldRect . Y | |
aNewRect . Width ! = aOldRect . Width | |
aNewRect . Height ! = aOldRect . Height )
{
2002-08-13 10:54:00 +00:00
// visible data changed
aHardRef - > FireEvent ( AccessibleEventId : : ACCESSIBLE_BOUNDRECT_EVENT ) ;
// update internal bounds
2002-05-17 18:12:44 +00:00
return accessibility : : AccessibleParaManager : : WeakChild ( rChild . first , aNewRect ) ;
}
2002-05-16 15:12:20 +00:00
}
2002-05-17 18:12:44 +00:00
// identity transform
return rChild ;
}
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
private :
AccessibleTextHelper_Impl & mrImpl ;
} ;
2002-05-16 15:12:20 +00:00
2002-08-02 10:35:10 +00:00
void AccessibleTextHelper_Impl : : UpdateBoundRect ( )
2002-05-17 18:12:44 +00:00
{
2002-08-02 10:35:10 +00:00
// send ACCESSIBLE_BOUNDRECT_EVENT to affected children
2002-05-21 13:58:45 +00:00
AccessibleTextHelper_UpdateChildBounds aFunctor ( * this ) ;
2002-05-29 15:09:56 +00:00
: : std : : transform ( maParaManager . begin ( ) , maParaManager . end ( ) , maParaManager . begin ( ) , aFunctor ) ;
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
# ifdef DBG_UTIL
2002-05-17 18:12:44 +00:00
void AccessibleTextHelper_Impl : : CheckInvariants ( ) const
{
if ( mnFirstVisibleChild > = 0 & &
mnFirstVisibleChild > mnLastVisibleChild )
{
DBG_ERROR ( " AccessibleTextHelper: range invalid " ) ;
}
2002-05-16 15:12:20 +00:00
}
# endif
2002-08-02 10:35:10 +00:00
// functor for sending child events (no stand-alone function, they are maybe not inlined)
class AccessibleTextHelper_LostChildEvent : public : : std : : unary_function < const accessibility : : AccessibleParaManager : : WeakChild & , void >
{
public :
AccessibleTextHelper_LostChildEvent ( AccessibleTextHelper_Impl & rImpl ) : mrImpl ( rImpl ) { }
void operator ( ) ( const accessibility : : AccessibleParaManager : : WeakChild & rPara )
{
// retrieve hard reference from weak one
accessibility : : AccessibleParaManager : : WeakPara : : HardRefType aHardRef ( rPara . first . get ( ) ) ;
if ( aHardRef . is ( ) )
mrImpl . FireEvent ( AccessibleEventId : : ACCESSIBLE_CHILD_EVENT , uno : : Any ( ) , uno : : makeAny ( aHardRef . getRef ( ) ) ) ;
}
private :
AccessibleTextHelper_Impl & mrImpl ;
} ;
2002-06-12 12:41:41 +00:00
void AccessibleTextHelper_Impl : : ParagraphsMoved ( sal_Int32 nFirst , sal_Int32 nMiddle , sal_Int32 nLast )
2002-05-29 16:01:52 +00:00
{
2002-06-12 12:41:41 +00:00
const sal_Int32 nParas = GetTextForwarder ( ) . GetParagraphCount ( ) ;
/* rotate paragraphs
* = = = = = = = = = = = = = = = = =
*
* Three cases :
*
* 1.
* . . . nParagraph . . . nParam1 . . . nParam2 . . .
* | ______________ [ xxxxxxxxxxx ]
* becomes
* [ xxxxxxxxxxx ] | ______________
*
* tail is 0
*
* 2.
* . . . nParam1 . . . nParagraph . . . nParam2 . . .
* [ xxxxxxxxxxx | xxxxxxxxxxxxxx ] ____________
* becomes
* ____________ [ xxxxxxxxxxx | xxxxxxxxxxxxxx ]
*
* tail is nParagraph - nParam1
*
* 3.
* . . . nParam1 . . . nParam2 . . . nParagraph . . .
* [ xxxxxxxxxxx ] ___________ | ____________
* becomes
* ___________ | ____________ [ xxxxxxxxxxx ]
*
* tail is nParam2 - nParam1
*/
2002-05-29 16:01:52 +00:00
2002-06-12 12:41:41 +00:00
// sort nParagraph, nParam1 and nParam2 in ascending order, calc range
if ( nMiddle < nFirst )
{
: : std : : swap ( nFirst , nMiddle ) ;
}
else if ( nMiddle < nLast )
{
nLast = nLast + nMiddle - nFirst ;
}
else
{
: : std : : swap ( nMiddle , nLast ) ;
nLast = nLast + nMiddle - nFirst ;
}
2002-05-29 16:01:52 +00:00
2002-06-12 12:41:41 +00:00
if ( nFirst < nParas & & nMiddle < nParas & & nLast < nParas )
{
// since we have no "paragraph index
// changed" event on UAA, remove
// [first,last] and insert again later (in
// UpdateVisibleChildren)
// maParaManager.Rotate( nFirst, nMiddle, nLast );
// send CHILD_EVENT to affected children
: : accessibility : : AccessibleParaManager : : VectorOfChildren : : const_iterator begin = maParaManager . begin ( ) ;
: : accessibility : : AccessibleParaManager : : VectorOfChildren : : const_iterator end = begin ;
: : std : : advance ( begin , nFirst ) ;
: : std : : advance ( end , nLast + 1 ) ;
2002-08-02 10:35:10 +00:00
// TODO: maybe optimize here in the following way. If the
// number of removed children exceeds a certain threshold,
// use ACCESSIBLE_ALL_CHILDREN_CHANGED_EVENT
2002-06-12 12:41:41 +00:00
AccessibleTextHelper_LostChildEvent aFunctor ( * this ) ;
: : std : : for_each ( begin , end , aFunctor ) ;
maParaManager . Release ( nFirst , nLast + 1 ) ;
2002-08-02 10:35:10 +00:00
// should be no need for UpdateBoundRect, since all affected children are cleared.
2002-06-12 12:41:41 +00:00
}
2002-05-29 16:01:52 +00:00
}
2002-06-12 12:41:41 +00:00
void AccessibleTextHelper_Impl : : ParagraphsInserted ( sal_Int32 nFirst )
2002-05-23 11:46:18 +00:00
{
2002-06-12 12:41:41 +00:00
const sal_Int32 nParas = GetTextForwarder ( ) . GetParagraphCount ( ) ;
const sal_Int32 nOldNumParas ( maParaManager . GetNum ( ) ) ;
const sal_Int32 nLast ( nParas - 1 ) ;
// resize child vector to the current child count
maParaManager . SetNum ( nParas ) ;
if ( nFirst < nOldNumParas & & nFirst < nParas & & nLast < nParas )
{
// since we have no "paragraph index
// changed" event on UAA, remove
// [first,last] and insert again later (in
// UpdateVisibleChildren)
// move successors of inserted paragraph one position further
//maParaManager.MoveRightFrom( pTextHint->GetValue() );
// send CHILD_EVENT to affected children
: : accessibility : : AccessibleParaManager : : VectorOfChildren : : const_iterator begin = maParaManager . begin ( ) ;
: : accessibility : : AccessibleParaManager : : VectorOfChildren : : const_iterator end = begin ;
: : std : : advance ( begin , nFirst ) ;
: : std : : advance ( end , nLast + 1 ) ;
2002-08-02 10:35:10 +00:00
// TODO: maybe optimize here in the following way. If the
// number of removed children exceeds a certain threshold,
// use ACCESSIBLE_ALL_CHILDREN_CHANGED_EVENT
2002-06-12 12:41:41 +00:00
AccessibleTextHelper_LostChildEvent aFunctor ( * this ) ;
: : std : : for_each ( begin , end , aFunctor ) ;
2002-08-13 10:54:00 +00:00
// release everything from the insertion position until the end
// #102235# Perform the release after the CHILD_EVENT notification
maParaManager . Release ( nFirst , nLast + 1 ) ;
2002-06-12 12:41:41 +00:00
}
2002-05-23 11:46:18 +00:00
}
2002-06-12 12:41:41 +00:00
void AccessibleTextHelper_Impl : : ParagraphsRemoved ( sal_Int32 nFirst )
2002-05-29 16:01:52 +00:00
{
2002-06-12 12:41:41 +00:00
const sal_Int32 nParas = GetTextForwarder ( ) . GetParagraphCount ( ) ;
const sal_Int32 nLast ( maParaManager . GetNum ( ) - 1 ) ;
// since we have no "paragraph index
// changed" event on UAA, remove
// [first,last] and insert again later (in
// UpdateVisibleChildren)
// move successors of removed paragraph one position closer
// maParaManager.MoveLeftFrom( pTextHint->GetValue() );
// send CHILD_EVENT to affected children
2002-05-29 16:01:52 +00:00
: : accessibility : : AccessibleParaManager : : VectorOfChildren : : const_iterator begin = maParaManager . begin ( ) ;
: : accessibility : : AccessibleParaManager : : VectorOfChildren : : const_iterator end = begin ;
2002-06-12 12:41:41 +00:00
: : std : : advance ( begin , nFirst ) ;
: : std : : advance ( end , nLast + 1 ) ;
2002-05-29 16:01:52 +00:00
2002-08-02 10:35:10 +00:00
// TODO: maybe optimize here in the following way. If the
// number of removed children exceeds a certain threshold,
// use ACCESSIBLE_ALL_CHILDREN_CHANGED_EVENT
2002-06-12 12:41:41 +00:00
AccessibleTextHelper_LostChildEvent aFunctor ( * this ) ;
: : std : : for_each ( begin , end , aFunctor ) ;
2002-05-29 16:01:52 +00:00
2002-08-13 10:54:00 +00:00
// release everything from the remove position until the end
// #102235# Perform the release after the CHILD_EVENT notification
maParaManager . Release ( nFirst , nLast + 1 ) ;
2002-06-12 12:41:41 +00:00
// resize child vector to the current child count
maParaManager . SetNum ( nParas ) ;
2002-05-23 11:46:18 +00:00
}
2002-05-17 18:12:44 +00:00
void AccessibleTextHelper_Impl : : Notify ( SfxBroadcaster & rBC , const SfxHint & rHint )
{
2002-06-12 12:41:41 +00:00
// precondition: solar mutex locked
DBG_TESTSOLARMUTEX ( ) ;
// precondition: not in a recursion
2002-05-17 18:12:44 +00:00
if ( mbInNotify )
return ;
2002-05-17 16:35:10 +00:00
2002-05-17 18:12:44 +00:00
mbInNotify = sal_True ;
2002-05-17 16:35:10 +00:00
2002-06-12 12:41:41 +00:00
// determine hint type
2002-05-23 11:46:18 +00:00
const SdrHint * pSdrHint = PTR_CAST ( SdrHint , & rHint ) ;
2002-05-17 18:12:44 +00:00
const SfxSimpleHint * pSimpleHint = PTR_CAST ( SfxSimpleHint , & rHint ) ;
const TextHint * pTextHint = PTR_CAST ( TextHint , & rHint ) ;
const SvxViewHint * pViewHint = PTR_CAST ( SvxViewHint , & rHint ) ;
const SvxEditSourceHint * pEditSourceHint = PTR_CAST ( SvxEditSourceHint , & rHint ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
try
2002-05-16 15:12:20 +00:00
{
2002-06-04 17:44:27 +00:00
const sal_Int32 nParas = GetTextForwarder ( ) . GetParagraphCount ( ) ;
2002-06-12 12:41:41 +00:00
// precondition: edit engine and para manager consistent
/* The problem here is the fact that the EditEngine events
* do not always arrive in a logical order . For example ,
* when inserting a paragraph by pressing return at the
* end of a line , currently the TEXT_MODIFIED hint arrives
* before the PARAGRAPH_INSERTED hint . Therefore , we have
* to update our paragraph count proactively here .
*/
sal_Int32 nFirstParaInsert ( 0 ) ; // default range is pessimization, don't know where to add
if ( ( ! pEditSourceHint & & pTextHint & & pTextHint - > GetId ( ) = = TEXT_HINT_PARAINSERTED ) )
nFirstParaInsert = pTextHint - > GetValue ( ) = = EE_PARA_ALL ? 0 : pTextHint - > GetValue ( ) ;
if ( nFirstParaInsert ! = 0 | |
maParaManager . GetNum ( ) < static_cast < sal_uInt32 > ( nParas ) )
{
ParagraphsInserted ( nFirstParaInsert ) ;
UpdateVisibleChildren ( ) ;
2002-08-02 10:35:10 +00:00
UpdateBoundRect ( ) ;
2002-06-12 12:41:41 +00:00
}
sal_Int32 nFirstParaRemove ( 0 ) ; // default range is pessimization, don't know where to add
if ( ( ! pEditSourceHint & & pTextHint & & pTextHint - > GetId ( ) = = TEXT_HINT_PARAREMOVED ) )
nFirstParaRemove = pTextHint - > GetValue ( ) = = EE_PARA_ALL ? 0 : pTextHint - > GetValue ( ) ;
if ( nFirstParaRemove ! = 0 | |
maParaManager . GetNum ( ) > static_cast < sal_uInt32 > ( nParas ) )
{
// remove excess paragraphs (range is pessimization, don't know where to remove)
ParagraphsRemoved ( nFirstParaRemove ) ;
UpdateVisibleChildren ( ) ;
2002-08-02 10:35:10 +00:00
UpdateBoundRect ( ) ;
2002-06-12 12:41:41 +00:00
}
2002-05-17 18:12:44 +00:00
if ( pEditSourceHint )
2002-05-16 15:12:20 +00:00
{
2002-05-27 15:43:06 +00:00
switch ( pEditSourceHint - > GetId ( ) )
2002-05-16 15:12:20 +00:00
{
2002-05-27 15:43:06 +00:00
case EDITSOURCE_HINT_PARASMOVED :
2002-05-16 15:12:20 +00:00
{
2002-05-27 15:43:06 +00:00
DBG_ASSERT ( pEditSourceHint - > GetStartValue ( ) < GetTextForwarder ( ) . GetParagraphCount ( ) & &
pEditSourceHint - > GetEndValue ( ) < GetTextForwarder ( ) . GetParagraphCount ( ) ,
" AccessibleTextHelper_Impl::NotifyHdl: Invalid notification " ) ;
2002-06-12 12:41:41 +00:00
ParagraphsMoved ( pEditSourceHint - > GetStartValue ( ) ,
pEditSourceHint - > GetValue ( ) ,
pEditSourceHint - > GetEndValue ( ) ) ;
2002-05-17 18:12:44 +00:00
2002-06-06 13:06:17 +00:00
// in all cases, check visibility afterwards.
UpdateVisibleChildren ( ) ;
2002-05-27 15:43:06 +00:00
break ;
2002-05-17 18:12:44 +00:00
}
2002-05-27 15:43:06 +00:00
case EDITSOURCE_HINT_SELECTIONCHANGED :
// notify listeners
try
{
2002-06-12 12:41:41 +00:00
UpdateSelection ( ) ;
2002-05-27 15:43:06 +00:00
}
// maybe we're not in edit mode (this is not an error)
catch ( const uno : : Exception & ) { }
break ;
2002-05-17 18:12:44 +00:00
}
}
else if ( pTextHint )
{
2002-05-27 15:43:06 +00:00
switch ( pTextHint - > GetId ( ) )
2002-05-17 18:12:44 +00:00
{
2002-05-27 15:43:06 +00:00
case TEXT_HINT_MODIFIED :
2002-06-04 17:44:27 +00:00
{
2002-05-27 15:43:06 +00:00
// notify listeners
2002-06-04 17:44:27 +00:00
sal_Int32 nPara ( pTextHint - > GetValue ( ) ) ;
2002-06-13 08:46:38 +00:00
if ( nPara = = static_cast < sal_Int32 > ( EE_PARA_ALL ) )
maParaManager . FireEvent ( 0 , GetTextForwarder ( ) . GetParagraphCount ( ) , AccessibleEventId : : ACCESSIBLE_TEXT_EVENT ) ;
else
if ( nPara < nParas )
2002-06-04 17:44:27 +00:00
maParaManager . FireEvent ( nPara , AccessibleEventId : : ACCESSIBLE_TEXT_EVENT ) ;
2002-05-27 15:43:06 +00:00
break ;
2002-06-04 17:44:27 +00:00
}
2002-05-17 18:12:44 +00:00
2002-05-27 15:43:06 +00:00
case TEXT_HINT_PARAINSERTED :
2002-06-12 12:41:41 +00:00
// already happened above
2002-05-27 15:43:06 +00:00
break ;
2002-05-16 15:12:20 +00:00
2002-05-27 15:43:06 +00:00
case TEXT_HINT_PARAREMOVED :
2002-06-12 12:41:41 +00:00
// already happened above
2002-05-27 15:43:06 +00:00
break ;
2002-05-16 15:12:20 +00:00
2002-05-27 15:43:06 +00:00
case TEXT_HINT_TEXTHEIGHTCHANGED :
break ;
2002-05-16 15:12:20 +00:00
2002-05-27 15:43:06 +00:00
case TEXT_HINT_VIEWSCROLLED :
break ;
2002-05-16 15:12:20 +00:00
}
2002-05-27 15:43:06 +00:00
// in all cases, check visibility afterwards.
UpdateVisibleChildren ( ) ;
2002-08-02 10:35:10 +00:00
UpdateBoundRect ( ) ;
2002-05-17 18:12:44 +00:00
}
else if ( pViewHint )
2002-05-16 15:12:20 +00:00
{
2002-05-17 18:12:44 +00:00
switch ( pViewHint - > GetId ( ) )
{
case SVX_HINT_VIEWCHANGED :
// just check visibility
UpdateVisibleChildren ( ) ;
2002-08-02 10:35:10 +00:00
UpdateBoundRect ( ) ;
2002-05-17 18:12:44 +00:00
break ;
}
2002-05-16 15:12:20 +00:00
}
2002-05-23 11:46:18 +00:00
else if ( pSdrHint )
{
switch ( pSdrHint - > GetKind ( ) )
{
case HINT_BEGEDIT :
{
// change children state
2002-06-12 12:41:41 +00:00
maParaManager . SetActive ( ) ;
2002-05-23 11:46:18 +00:00
2002-06-13 17:46:17 +00:00
// per definition, edit mode text has the focus
SetFocus ( sal_True ) ;
2002-05-23 11:46:18 +00:00
break ;
}
case HINT_ENDEDIT :
2002-06-04 17:44:27 +00:00
// focused child now looses focus
ESelection aSelection ;
if ( GetEditViewForwarder ( ) . GetSelection ( aSelection ) )
SetChildFocus ( aSelection . nEndPara , sal_False ) ;
2002-05-23 11:46:18 +00:00
// change children state
2002-06-12 12:41:41 +00:00
maParaManager . SetActive ( sal_False ) ;
2002-06-06 13:06:17 +00:00
maLastSelection = ESelection ( EE_PARA_NOT_FOUND , EE_PARA_NOT_FOUND ,
EE_PARA_NOT_FOUND , EE_PARA_NOT_FOUND ) ;
2002-05-23 11:46:18 +00:00
break ;
}
}
2002-05-17 18:12:44 +00:00
// it's VITAL to keep the SfxSimpleHint last! It's the base of some classes above!
else if ( pSimpleHint )
2002-05-16 15:12:20 +00:00
{
2002-05-17 18:12:44 +00:00
switch ( pSimpleHint - > GetId ( ) )
{
case SFX_HINT_DYING :
// edit source is dying under us, become defunc then
try
{
// make edit source inaccessible
// Note: cannot destroy it here, since we're called from there!
ShutdownEditSource ( ) ;
}
2002-05-23 11:46:18 +00:00
catch ( const uno : : Exception & ) { }
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
break ;
}
2002-05-16 15:12:20 +00:00
}
}
2002-05-23 11:46:18 +00:00
catch ( const uno : : Exception & )
2002-05-17 18:12:44 +00:00
{
2002-05-16 15:12:20 +00:00
# ifdef DBG_UTIL
2002-06-12 12:41:41 +00:00
OSL_TRACE ( " AccessibleTextHelper_Impl::Notify: Unhandled exception. " ) ;
2002-05-16 15:12:20 +00:00
# endif
2002-06-04 17:44:27 +00:00
mbInNotify = sal_False ;
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mbInNotify = sal_False ;
}
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
void AccessibleTextHelper_Impl : : Dispose ( )
{
2002-07-24 15:19:19 +00:00
// dispose children
maParaManager . Dispose ( ) ;
// quit listen on stale edit source
if ( maEditSource . IsValid ( ) )
EndListening ( maEditSource . GetBroadcaster ( ) ) ;
// clear references
maEditSource . SetEditSource ( : : std : : auto_ptr < SvxEditSource > ( NULL ) ) ;
2002-06-26 10:38:03 +00:00
mxFrontEnd = NULL ;
}
2002-05-17 18:12:44 +00:00
void AccessibleTextHelper_Impl : : FireEvent ( const sal_Int16 nEventId , const uno : : Any & rNewValue , const uno : : Any & rOldValue ) const
{
// -- object locked --
: : osl : : ClearableMutexGuard aGuard ( maMutex ) ;
2002-05-16 15:12:20 +00:00
2002-05-27 15:43:06 +00:00
AccessibleEventObject aEvent ;
2002-06-26 10:38:03 +00:00
DBG_ASSERT ( mxFrontEnd . is ( ) , " AccessibleTextHelper::FireEvent: no event source set " ) ;
2002-05-27 15:43:06 +00:00
if ( mxFrontEnd . is ( ) )
aEvent = AccessibleEventObject ( mxFrontEnd - > getAccessibleContext ( ) , nEventId , rNewValue , rOldValue ) ;
else
aEvent = AccessibleEventObject ( uno : : Reference < uno : : XInterface > ( ) , nEventId , rNewValue , rOldValue ) ;
2002-05-16 15:12:20 +00:00
2002-06-12 16:20:45 +00:00
// no locking necessary, OInterfaceIteratorHelper copies listeners if someone removes/adds in between
// Further locking, actually, might lead to deadlocks, since we're calling out of this object
aGuard . clear ( ) ;
// -- until here --
FireEvent ( aEvent ) ;
}
void AccessibleTextHelper_Impl : : FireEvent ( const AccessibleEventObject & rEvent ) const
{
// -- object locked --
: : osl : : ClearableMutexGuard aGuard ( maMutex ) ;
2002-05-17 18:12:44 +00:00
: : cppu : : OInterfaceIteratorHelper aIter ( const_cast < AccessibleTextHelper_Impl * > ( this ) - > maStateListeners ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// no locking necessary, OInterfaceIteratorHelper copies listeners if someone removes/adds in between
// Further locking, actually, might lead to deadlocks, since we're calling out of this object
aGuard . clear ( ) ;
// -- until here --
2002-05-16 15:12:20 +00:00
2002-08-23 16:50:51 +00:00
// #102261# Call global queue for focus events
if ( rEvent . EventId = = AccessibleStateType : : FOCUSED )
vcl : : unohelper : : NotifyAccessibleStateEventGlobally ( rEvent ) ;
2002-05-17 18:12:44 +00:00
while ( aIter . hasMoreElements ( ) )
2002-05-16 15:12:20 +00:00
{
2002-05-17 18:12:44 +00:00
uno : : Reference < XAccessibleEventListener > xListener ( aIter . next ( ) , uno : : UNO_QUERY ) ;
if ( xListener . is ( ) )
2002-05-16 15:12:20 +00:00
{
2002-05-17 18:12:44 +00:00
try
{
2002-06-12 16:20:45 +00:00
xListener - > notifyEvent ( rEvent ) ;
2002-05-17 18:12:44 +00:00
}
2002-06-04 17:44:27 +00:00
catch ( const lang : : DisposedException & e )
2002-05-17 18:12:44 +00:00
{
2002-06-04 17:44:27 +00:00
// DisposedExceptions from the listener might indicate a
// broken connection to a different environment.
OSL_ENSURE ( e . Context . is ( ) , " AccessibleTextHelper::FireEvent: caught dispose exception with empty Context field " ) ;
// If the exception stems from the listener then remove it
// from the list of listeners. If the Context field of the
// exception is empty this is interpreted to indicate the
// listener as well.
if ( e . Context = = xListener
| | ! e . Context . is ( ) )
aIter . remove ( ) ;
}
catch ( const uno : : Exception & e )
{
DBG_WARNING1 ( " AccessibleTextHelper::FireEvent: exception %s from listener " ,
: : rtl : : OUStringToOString ( e . Message , RTL_TEXTENCODING_DONTKNOW ) . getStr ( ) ) ;
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
}
}
}
2002-05-17 18:12:44 +00:00
// XAccessibleContext
2002-06-26 10:38:03 +00:00
sal_Int32 SAL_CALL AccessibleTextHelper_Impl : : getAccessibleChildCount ( ) SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-16 15:12:20 +00:00
{
2002-05-17 18:12:44 +00:00
return mnLastVisibleChild - mnFirstVisibleChild + 1 ;
2002-05-16 15:12:20 +00:00
}
2002-06-26 10:38:03 +00:00
uno : : Reference < XAccessible > SAL_CALL AccessibleTextHelper_Impl : : getAccessibleChild ( sal_Int32 i ) SAL_THROW ( ( lang : : IndexOutOfBoundsException , uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
2002-06-26 10:38:03 +00:00
i - = GetStartIndex ( ) ;
2002-05-23 11:46:18 +00:00
2002-07-31 08:24:19 +00:00
if ( 0 > i | | i > = getAccessibleChildCount ( ) | |
2002-05-17 18:12:44 +00:00
GetTextForwarder ( ) . GetParagraphCount ( ) < = i )
{
throw lang : : IndexOutOfBoundsException ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " Invalid child index " ) ) , mxFrontEnd ) ;
}
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
DBG_ASSERT ( mxFrontEnd . is ( ) , " AccessibleTextHelper_Impl::UpdateVisibleChildren: no frontend set " ) ;
if ( mxFrontEnd . is ( ) )
return maParaManager . CreateChild ( i , mxFrontEnd , GetEditSource ( ) , mnFirstVisibleChild + i ) . first ;
else
return NULL ;
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
void SAL_CALL AccessibleTextHelper_Impl : : addEventListener ( const uno : : Reference < XAccessibleEventListener > & xListener ) SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
maStateListeners . addInterface ( xListener ) ;
}
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
void SAL_CALL AccessibleTextHelper_Impl : : removeEventListener ( const uno : : Reference < XAccessibleEventListener > & xListener ) SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
maStateListeners . removeInterface ( xListener ) ;
}
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
uno : : Reference < XAccessible > SAL_CALL AccessibleTextHelper_Impl : : getAccessibleAt ( const awt : : Point & _aPoint ) SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
// make given position relative
if ( ! mxFrontEnd . is ( ) )
throw uno : : RuntimeException ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " AccessibleTextHelper_Impl::getAccessibleAt: frontend invalid " ) ) , mxFrontEnd ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
uno : : Reference < XAccessibleContext > xFrontEndContext = mxFrontEnd - > getAccessibleContext ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
if ( ! xFrontEndContext . is ( ) )
throw uno : : RuntimeException ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " AccessibleTextHelper_Impl::getAccessibleAt: frontend invalid " ) ) , mxFrontEnd ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
uno : : Reference < XAccessibleComponent > xFrontEndComponent ( xFrontEndContext , uno : : UNO_QUERY ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
if ( ! xFrontEndComponent . is ( ) )
throw uno : : RuntimeException ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " AccessibleTextHelper_Impl::getAccessibleAt: frontend is no XAccessibleComponent " ) ) ,
mxFrontEnd ) ;
2002-05-16 15:12:20 +00:00
2002-10-02 16:09:36 +00:00
// #103862# No longer need to make given position relative
2002-05-17 18:12:44 +00:00
Point aPoint ( _aPoint . X , _aPoint . Y ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// respect EditEngine offset to surrounding shape/cell
aPoint - = GetOffset ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// convert to EditEngine coordinate system
SvxTextForwarder & rCacheTF = GetTextForwarder ( ) ;
Point aLogPoint ( GetViewForwarder ( ) . PixelToLogic ( aPoint , rCacheTF . GetMapMode ( ) ) ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// iterate over all visible children (including those not yet created)
sal_Int32 nChild ;
for ( nChild = mnFirstVisibleChild ; nChild < = mnLastVisibleChild ; + + nChild )
2002-05-16 15:12:20 +00:00
{
2002-05-17 18:12:44 +00:00
DBG_ASSERT ( nChild > = 0 & & nChild < = USHRT_MAX ,
" AccessibleTextHelper_Impl::getAccessibleAt: index value overflow " ) ;
Rectangle aParaBounds ( rCacheTF . GetParaBounds ( static_cast < USHORT > ( nChild ) ) ) ;
if ( aParaBounds . IsInside ( aLogPoint ) )
{
DBG_ASSERT ( nChild - mnFirstVisibleChild > = 0 & & nChild - mnFirstVisibleChild < = USHRT_MAX ,
" AccessibleTextHelper_Impl::getAccessibleAt: index value overflow " ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
return getAccessibleChild ( static_cast < USHORT > ( nChild - mnFirstVisibleChild ) ) ;
}
2002-05-16 15:12:20 +00:00
}
2002-05-17 18:12:44 +00:00
// found none
2002-06-26 10:38:03 +00:00
return NULL ;
2002-05-16 15:12:20 +00:00
}
2002-05-17 18:12:44 +00:00
//------------------------------------------------------------------------
//
// AccessibleTextHelper implementation (simply forwards to impl)
//
//------------------------------------------------------------------------
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
AccessibleTextHelper : : AccessibleTextHelper ( : : std : : auto_ptr < SvxEditSource > pEditSource ) :
mpImpl ( new AccessibleTextHelper_Impl ( ) )
2002-05-17 18:12:44 +00:00
{
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
SetEditSource ( pEditSource ) ;
}
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
AccessibleTextHelper : : ~ AccessibleTextHelper ( )
{
}
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
const SvxEditSource & AccessibleTextHelper : : GetEditSource ( ) const SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
2002-05-16 15:12:20 +00:00
# ifdef DBG_UTIL
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
2002-06-07 11:19:53 +00:00
const SvxEditSource & aEditSource = mpImpl - > GetEditSource ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
return aEditSource ;
2002-05-16 15:12:20 +00:00
# else
2002-05-17 18:12:44 +00:00
return mpImpl - > GetEditSource ( ) ;
2002-05-16 15:12:20 +00:00
# endif
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
void AccessibleTextHelper : : SetEditSource ( : : std : : auto_ptr < SvxEditSource > pEditSource ) SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
2002-05-16 15:12:20 +00:00
# ifdef DBG_UTIL
2002-06-12 12:41:41 +00:00
// precondition: solar mutex locked
DBG_TESTSOLARMUTEX ( ) ;
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-06-12 12:41:41 +00:00
# endif
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mpImpl - > SetEditSource ( pEditSource ) ;
2002-05-16 15:12:20 +00:00
2002-06-12 12:41:41 +00:00
# ifdef DBG_UTIL
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
# endif
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
void AccessibleTextHelper : : SetEventSource ( const uno : : Reference < XAccessible > & rInterface )
{
# ifdef DBG_UTIL
mpImpl - > CheckInvariants ( ) ;
# endif
mpImpl - > SetEventSource ( rInterface ) ;
# ifdef DBG_UTIL
mpImpl - > CheckInvariants ( ) ;
# endif
}
uno : : Reference < XAccessible > AccessibleTextHelper : : GetEventSource ( ) const
{
# ifdef DBG_UTIL
mpImpl - > CheckInvariants ( ) ;
uno : : Reference < XAccessible > xRet ( mpImpl - > GetEventSource ( ) ) ;
mpImpl - > CheckInvariants ( ) ;
return xRet ;
# else
return mpImpl - > GetEventSource ( ) ;
# endif
}
void AccessibleTextHelper : : SetFocus ( sal_Bool bHaveFocus ) SAL_THROW ( ( : : com : : sun : : star : : uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
2002-05-23 11:46:18 +00:00
# ifdef DBG_UTIL
2002-06-12 12:41:41 +00:00
// precondition: solar mutex locked
DBG_TESTSOLARMUTEX ( ) ;
2002-05-23 11:46:18 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-06-12 12:41:41 +00:00
# endif
2002-05-23 11:46:18 +00:00
mpImpl - > SetFocus ( bHaveFocus ) ;
2002-06-12 12:41:41 +00:00
# ifdef DBG_UTIL
2002-05-23 11:46:18 +00:00
mpImpl - > CheckInvariants ( ) ;
# endif
2002-05-17 18:12:44 +00:00
}
2002-06-26 10:38:03 +00:00
sal_Bool AccessibleTextHelper : : HaveFocus ( ) SAL_THROW ( ( : : com : : sun : : star : : uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
2002-05-23 11:46:18 +00:00
# ifdef DBG_UTIL
mpImpl - > CheckInvariants ( ) ;
sal_Bool bRet ( mpImpl - > HaveFocus ( ) ) ;
mpImpl - > CheckInvariants ( ) ;
return bRet ;
# else
return mpImpl - > HaveFocus ( ) ;
# endif
2002-05-17 18:12:44 +00:00
}
void AccessibleTextHelper : : FireEvent ( const sal_Int16 nEventId , const uno : : Any & rNewValue , const uno : : Any & rOldValue ) const
{
2002-05-16 15:12:20 +00:00
# ifdef DBG_UTIL
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-06-12 12:41:41 +00:00
# endif
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mpImpl - > FireEvent ( nEventId , rNewValue , rOldValue ) ;
2002-05-16 15:12:20 +00:00
2002-06-12 16:20:45 +00:00
# ifdef DBG_UTIL
mpImpl - > CheckInvariants ( ) ;
# endif
}
void AccessibleTextHelper : : FireEvent ( const AccessibleEventObject & rEvent ) const
{
# ifdef DBG_UTIL
mpImpl - > CheckInvariants ( ) ;
# endif
mpImpl - > FireEvent ( rEvent ) ;
2002-06-12 12:41:41 +00:00
# ifdef DBG_UTIL
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
# endif
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
void AccessibleTextHelper : : SetOffset ( const Point & rPoint )
{
2002-05-16 15:12:20 +00:00
# ifdef DBG_UTIL
2002-06-12 12:41:41 +00:00
// precondition: solar mutex locked
DBG_TESTSOLARMUTEX ( ) ;
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-06-12 12:41:41 +00:00
# endif
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mpImpl - > SetOffset ( rPoint ) ;
2002-05-16 15:12:20 +00:00
2002-06-12 12:41:41 +00:00
# ifdef DBG_UTIL
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
# endif
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
2002-06-07 11:19:53 +00:00
Point AccessibleTextHelper : : GetOffset ( ) const
2002-05-17 18:12:44 +00:00
{
2002-05-16 15:12:20 +00:00
# ifdef DBG_UTIL
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
2002-06-07 11:19:53 +00:00
Point aPoint ( mpImpl - > GetOffset ( ) ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
2002-06-07 11:19:53 +00:00
return aPoint ;
2002-05-16 15:12:20 +00:00
# else
2002-05-17 18:12:44 +00:00
return mpImpl - > GetOffset ( ) ;
2002-05-16 15:12:20 +00:00
# endif
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
void AccessibleTextHelper : : SetStartIndex ( sal_Int32 nOffset )
2002-05-17 18:12:44 +00:00
{
2002-05-23 11:46:18 +00:00
# ifdef DBG_UTIL
2002-06-12 12:41:41 +00:00
// precondition: solar mutex locked
DBG_TESTSOLARMUTEX ( ) ;
2002-05-23 11:46:18 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-06-12 12:41:41 +00:00
# endif
2002-05-23 11:46:18 +00:00
2002-06-26 10:38:03 +00:00
mpImpl - > SetStartIndex ( nOffset ) ;
2002-05-23 11:46:18 +00:00
2002-06-12 12:41:41 +00:00
# ifdef DBG_UTIL
2002-05-23 11:46:18 +00:00
mpImpl - > CheckInvariants ( ) ;
# endif
2002-05-17 18:12:44 +00:00
}
2002-06-26 10:38:03 +00:00
sal_Int32 AccessibleTextHelper : : GetStartIndex ( ) const
2002-05-17 18:12:44 +00:00
{
2002-05-23 11:46:18 +00:00
# ifdef DBG_UTIL
mpImpl - > CheckInvariants ( ) ;
2002-06-26 10:38:03 +00:00
sal_Int32 nOffset = mpImpl - > GetStartIndex ( ) ;
2002-05-23 11:46:18 +00:00
mpImpl - > CheckInvariants ( ) ;
return nOffset ;
# else
2002-06-26 10:38:03 +00:00
return mpImpl - > GetStartIndex ( ) ;
2002-05-23 11:46:18 +00:00
# endif
2002-05-17 18:12:44 +00:00
}
2002-06-26 10:38:03 +00:00
void AccessibleTextHelper : : UpdateChildren ( ) SAL_THROW ( ( : : com : : sun : : star : : uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
2002-05-16 15:12:20 +00:00
# ifdef DBG_UTIL
2002-06-12 12:41:41 +00:00
// precondition: solar mutex locked
DBG_TESTSOLARMUTEX ( ) ;
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-06-12 12:41:41 +00:00
# endif
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mpImpl - > UpdateVisibleChildren ( ) ;
2002-08-02 10:35:10 +00:00
mpImpl - > UpdateBoundRect ( ) ;
2002-05-16 15:12:20 +00:00
2002-06-12 12:41:41 +00:00
mpImpl - > UpdateSelection ( ) ;
2002-06-26 10:38:03 +00:00
# ifdef DBG_UTIL
mpImpl - > CheckInvariants ( ) ;
# endif
}
void AccessibleTextHelper : : Dispose ( )
{
2002-07-05 12:51:38 +00:00
// As Dispose calls ShutdownEditSource, which in turn
// deregisters as listener on the edit source, have to lock
// here
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
2002-06-26 10:38:03 +00:00
# ifdef DBG_UTIL
mpImpl - > CheckInvariants ( ) ;
# endif
mpImpl - > Dispose ( ) ;
2002-06-12 12:41:41 +00:00
# ifdef DBG_UTIL
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
# endif
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
sal_Bool AccessibleTextHelper : : IsSelected ( ) const
{
2002-06-07 11:19:53 +00:00
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
2002-05-16 15:12:20 +00:00
# ifdef DBG_UTIL
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
sal_Bool aRet = mpImpl - > IsSelected ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
return aRet ;
2002-05-16 15:12:20 +00:00
# else
2002-05-17 18:12:44 +00:00
return mpImpl - > IsSelected ( ) ;
2002-05-16 15:12:20 +00:00
# endif
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// XAccessibleContext
2002-06-26 10:38:03 +00:00
sal_Int32 AccessibleTextHelper : : GetChildCount ( ) SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
2002-06-07 11:19:53 +00:00
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
2002-05-16 15:12:20 +00:00
# ifdef DBG_UTIL
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
sal_Int32 nRet = mpImpl - > getAccessibleChildCount ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
return nRet ;
2002-05-16 15:12:20 +00:00
# else
2002-05-17 18:12:44 +00:00
return mpImpl - > getAccessibleChildCount ( ) ;
2002-05-16 15:12:20 +00:00
# endif
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
uno : : Reference < XAccessible > AccessibleTextHelper : : GetChild ( sal_Int32 i ) SAL_THROW ( ( lang : : IndexOutOfBoundsException , uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
2002-06-07 11:19:53 +00:00
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
2002-05-16 15:12:20 +00:00
# ifdef DBG_UTIL
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
uno : : Reference < XAccessible > xRet = mpImpl - > getAccessibleChild ( i ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
return xRet ;
2002-05-16 15:12:20 +00:00
# else
2002-05-17 18:12:44 +00:00
return mpImpl - > getAccessibleChild ( i ) ;
2002-05-16 15:12:20 +00:00
# endif
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
void AccessibleTextHelper : : AddEventListener ( const uno : : Reference < XAccessibleEventListener > & xListener ) SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
2002-05-16 15:12:20 +00:00
# ifdef DBG_UTIL
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mpImpl - > addEventListener ( xListener ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
# else
2002-05-17 18:12:44 +00:00
mpImpl - > addEventListener ( xListener ) ;
2002-05-16 15:12:20 +00:00
# endif
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
2002-06-26 10:38:03 +00:00
void AccessibleTextHelper : : RemoveEventListener ( const uno : : Reference < XAccessibleEventListener > & xListener ) SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
2002-05-16 15:12:20 +00:00
# ifdef DBG_UTIL
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mpImpl - > removeEventListener ( xListener ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
# else
2002-05-17 18:12:44 +00:00
mpImpl - > removeEventListener ( xListener ) ;
2002-05-16 15:12:20 +00:00
# endif
2002-05-17 18:12:44 +00:00
}
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
// XAccessibleComponent
2002-06-26 10:38:03 +00:00
uno : : Reference < XAccessible > AccessibleTextHelper : : GetAt ( const awt : : Point & aPoint ) SAL_THROW ( ( uno : : RuntimeException ) )
2002-05-17 18:12:44 +00:00
{
2002-06-07 11:19:53 +00:00
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
2002-05-16 15:12:20 +00:00
# ifdef DBG_UTIL
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
uno : : Reference < XAccessible > xChild = mpImpl - > getAccessibleAt ( aPoint ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
mpImpl - > CheckInvariants ( ) ;
2002-05-16 15:12:20 +00:00
2002-05-17 18:12:44 +00:00
return xChild ;
2002-05-16 15:12:20 +00:00
# else
2002-05-17 18:12:44 +00:00
return mpImpl - > getAccessibleAt ( aPoint ) ;
2002-05-16 15:12:20 +00:00
# endif
2002-05-17 18:12:44 +00:00
}
} // end of namespace accessibility
2002-05-16 15:12:20 +00:00
//------------------------------------------------------------------------