xref: /AOO41X/main/editeng/source/accessibility/AccessibleParaManager.cxx (revision ffad8df045fe8db79e3e50f731c1fa6ab6501c83)
1190118d0SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3190118d0SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4190118d0SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5190118d0SAndrew Rist  * distributed with this work for additional information
6190118d0SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7190118d0SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8190118d0SAndrew Rist  * "License"); you may not use this file except in compliance
9190118d0SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11190118d0SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13190118d0SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14190118d0SAndrew Rist  * software distributed under the License is distributed on an
15190118d0SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16190118d0SAndrew Rist  * KIND, either express or implied.  See the License for the
17190118d0SAndrew Rist  * specific language governing permissions and limitations
18190118d0SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20190118d0SAndrew Rist  *************************************************************/
21190118d0SAndrew Rist 
22190118d0SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_editeng.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir //------------------------------------------------------------------------
28cdf0e10cSrcweir //
29cdf0e10cSrcweir // Global header
30cdf0e10cSrcweir //
31cdf0e10cSrcweir //------------------------------------------------------------------------
32cdf0e10cSrcweir #include <com/sun/star/uno/Any.hxx>
33cdf0e10cSrcweir #include <com/sun/star/uno/Reference.hxx>
34cdf0e10cSrcweir #include <cppuhelper/weakref.hxx>
35cdf0e10cSrcweir #include <com/sun/star/accessibility/XAccessible.hpp>
36cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleStateType.hpp>
37cdf0e10cSrcweir 
38cdf0e10cSrcweir //------------------------------------------------------------------------
39cdf0e10cSrcweir //
40cdf0e10cSrcweir // Project-local header
41cdf0e10cSrcweir //
42cdf0e10cSrcweir //------------------------------------------------------------------------
43cdf0e10cSrcweir 
44cdf0e10cSrcweir #include <editeng/unoedhlp.hxx>
45cdf0e10cSrcweir #include <editeng/unopracc.hxx>
46cdf0e10cSrcweir #include <editeng/unoedsrc.hxx>
47cdf0e10cSrcweir #include "editeng/AccessibleParaManager.hxx"
48cdf0e10cSrcweir #include "editeng/AccessibleEditableTextPara.hxx"
49cdf0e10cSrcweir 
50cdf0e10cSrcweir 
51cdf0e10cSrcweir using namespace ::com::sun::star;
52cdf0e10cSrcweir using namespace ::com::sun::star::accessibility;
53cdf0e10cSrcweir 
54cdf0e10cSrcweir 
55cdf0e10cSrcweir 
56cdf0e10cSrcweir namespace accessibility
57cdf0e10cSrcweir {
AccessibleParaManager()58cdf0e10cSrcweir     AccessibleParaManager::AccessibleParaManager() :
59cdf0e10cSrcweir         maChildren(1),
60cdf0e10cSrcweir         maEEOffset( 0, 0 ),
61cdf0e10cSrcweir         mnFocusedChild( -1 ),
62cdf0e10cSrcweir         mbActive( sal_False )
63cdf0e10cSrcweir     {
64cdf0e10cSrcweir     }
65cdf0e10cSrcweir 
~AccessibleParaManager()66cdf0e10cSrcweir     AccessibleParaManager::~AccessibleParaManager()
67cdf0e10cSrcweir     {
68cdf0e10cSrcweir         // owner is responsible for possible child defuncs
69cdf0e10cSrcweir     }
70cdf0e10cSrcweir 
SetAdditionalChildStates(const VectorOfStates & rChildStates)71cdf0e10cSrcweir     void AccessibleParaManager::SetAdditionalChildStates( const VectorOfStates& rChildStates )
72cdf0e10cSrcweir     {
73cdf0e10cSrcweir         maChildStates = rChildStates;
74cdf0e10cSrcweir     }
75cdf0e10cSrcweir 
GetAdditionalChildStates() const76cdf0e10cSrcweir     const AccessibleParaManager::VectorOfStates& AccessibleParaManager::GetAdditionalChildStates() const
77cdf0e10cSrcweir     {
78cdf0e10cSrcweir         return maChildStates;
79cdf0e10cSrcweir     }
80cdf0e10cSrcweir 
SetNum(sal_Int32 nNumParas)81cdf0e10cSrcweir     void AccessibleParaManager::SetNum( sal_Int32 nNumParas )
82cdf0e10cSrcweir     {
83cdf0e10cSrcweir         if( (size_t)nNumParas < maChildren.size() )
84cdf0e10cSrcweir             Release( nNumParas, maChildren.size() );
85cdf0e10cSrcweir 
86cdf0e10cSrcweir         maChildren.resize( nNumParas );
87cdf0e10cSrcweir 
88cdf0e10cSrcweir         if( mnFocusedChild >= nNumParas )
89cdf0e10cSrcweir             mnFocusedChild = -1;
90cdf0e10cSrcweir     }
91cdf0e10cSrcweir 
GetNum() const92cdf0e10cSrcweir     sal_uInt32 AccessibleParaManager::GetNum() const
93cdf0e10cSrcweir     {
94cdf0e10cSrcweir         return maChildren.size();
95cdf0e10cSrcweir     }
96cdf0e10cSrcweir 
begin()97cdf0e10cSrcweir     AccessibleParaManager::VectorOfChildren::iterator AccessibleParaManager::begin()
98cdf0e10cSrcweir     {
99cdf0e10cSrcweir         return maChildren.begin();
100cdf0e10cSrcweir     }
101cdf0e10cSrcweir 
end()102cdf0e10cSrcweir     AccessibleParaManager::VectorOfChildren::iterator AccessibleParaManager::end()
103cdf0e10cSrcweir     {
104cdf0e10cSrcweir         return maChildren.end();
105cdf0e10cSrcweir     }
106cdf0e10cSrcweir 
begin() const107cdf0e10cSrcweir     AccessibleParaManager::VectorOfChildren::const_iterator AccessibleParaManager::begin() const
108cdf0e10cSrcweir     {
109cdf0e10cSrcweir         return maChildren.begin();
110cdf0e10cSrcweir     }
111cdf0e10cSrcweir 
end() const112cdf0e10cSrcweir     AccessibleParaManager::VectorOfChildren::const_iterator AccessibleParaManager::end() const
113cdf0e10cSrcweir     {
114cdf0e10cSrcweir         return maChildren.end();
115cdf0e10cSrcweir     }
116cdf0e10cSrcweir 
Release(sal_uInt32 nPara)117cdf0e10cSrcweir     void AccessibleParaManager::Release( sal_uInt32 nPara )
118cdf0e10cSrcweir     {
119cdf0e10cSrcweir         DBG_ASSERT( maChildren.size() > nPara, "AccessibleParaManager::Release: invalid index" );
120cdf0e10cSrcweir 
121cdf0e10cSrcweir         if( maChildren.size() > nPara )
122cdf0e10cSrcweir         {
123cdf0e10cSrcweir             ShutdownPara( GetChild( nPara ) );
124cdf0e10cSrcweir 
125cdf0e10cSrcweir             // clear reference and rect
126cdf0e10cSrcweir             maChildren[ nPara ] = WeakChild();
127cdf0e10cSrcweir         }
128cdf0e10cSrcweir     }
129cdf0e10cSrcweir 
FireEvent(sal_uInt32 nPara,const sal_Int16 nEventId,const uno::Any & rNewValue,const uno::Any & rOldValue) const130cdf0e10cSrcweir     void AccessibleParaManager::FireEvent( sal_uInt32 nPara,
131cdf0e10cSrcweir                                            const sal_Int16 nEventId,
132cdf0e10cSrcweir                                            const uno::Any& rNewValue,
133cdf0e10cSrcweir                                            const uno::Any& rOldValue ) const
134cdf0e10cSrcweir     {
135cdf0e10cSrcweir         DBG_ASSERT( maChildren.size() > nPara, "AccessibleParaManager::FireEvent: invalid index" );
136cdf0e10cSrcweir 
137cdf0e10cSrcweir         if( maChildren.size() > nPara )
138cdf0e10cSrcweir         {
139cdf0e10cSrcweir             WeakPara::HardRefType maChild( GetChild( nPara ).first.get() );
140cdf0e10cSrcweir             if( maChild.is() )
141cdf0e10cSrcweir                 maChild->FireEvent( nEventId, rNewValue, rOldValue );
142cdf0e10cSrcweir         }
143cdf0e10cSrcweir     }
144cdf0e10cSrcweir 
IsReferencable(WeakPara::HardRefType aChild)145cdf0e10cSrcweir     sal_Bool AccessibleParaManager::IsReferencable( WeakPara::HardRefType aChild )
146cdf0e10cSrcweir     {
147cdf0e10cSrcweir         return aChild.is();
148cdf0e10cSrcweir     }
149cdf0e10cSrcweir 
IsReferencable(sal_uInt32 nChild) const150cdf0e10cSrcweir     sal_Bool AccessibleParaManager::IsReferencable( sal_uInt32 nChild ) const
151cdf0e10cSrcweir     {
152cdf0e10cSrcweir         DBG_ASSERT( maChildren.size() > nChild, "AccessibleParaManager::IsReferencable: invalid index" );
153cdf0e10cSrcweir 
154cdf0e10cSrcweir         if( maChildren.size() > nChild )
155cdf0e10cSrcweir         {
156cdf0e10cSrcweir             // retrieve hard reference from weak one
157cdf0e10cSrcweir             return IsReferencable( GetChild( nChild ).first.get() );
158cdf0e10cSrcweir         }
159cdf0e10cSrcweir         else
160cdf0e10cSrcweir         {
161cdf0e10cSrcweir             return sal_False;
162cdf0e10cSrcweir         }
163cdf0e10cSrcweir     }
164cdf0e10cSrcweir 
GetChild(sal_uInt32 nParagraphIndex) const165cdf0e10cSrcweir     AccessibleParaManager::WeakChild AccessibleParaManager::GetChild( sal_uInt32 nParagraphIndex ) const
166cdf0e10cSrcweir     {
167cdf0e10cSrcweir         DBG_ASSERT( maChildren.size() > nParagraphIndex, "AccessibleParaManager::GetChild: invalid index" );
168cdf0e10cSrcweir 
169cdf0e10cSrcweir         if( maChildren.size() > nParagraphIndex )
170cdf0e10cSrcweir         {
171cdf0e10cSrcweir             return maChildren[ nParagraphIndex ];
172cdf0e10cSrcweir         }
173cdf0e10cSrcweir         else
174cdf0e10cSrcweir         {
175cdf0e10cSrcweir             return WeakChild();
176cdf0e10cSrcweir         }
177cdf0e10cSrcweir     }
178cdf0e10cSrcweir 
CreateChild(sal_Int32 nChild,const uno::Reference<XAccessible> & xFrontEnd,SvxEditSourceAdapter & rEditSource,sal_uInt32 nParagraphIndex)179cdf0e10cSrcweir     AccessibleParaManager::Child AccessibleParaManager::CreateChild( sal_Int32 								nChild,
180cdf0e10cSrcweir                                                                      const uno::Reference< XAccessible >& 	xFrontEnd,
181cdf0e10cSrcweir                                                                      SvxEditSourceAdapter& 					rEditSource,
182cdf0e10cSrcweir                                                                      sal_uInt32 							nParagraphIndex	)
183cdf0e10cSrcweir     {
184cdf0e10cSrcweir         DBG_ASSERT( maChildren.size() > nParagraphIndex, "AccessibleParaManager::CreateChild: invalid index" );
185cdf0e10cSrcweir 
186cdf0e10cSrcweir         if( maChildren.size() > nParagraphIndex )
187cdf0e10cSrcweir         {
188cdf0e10cSrcweir             // retrieve hard reference from weak one
189cdf0e10cSrcweir             WeakPara::HardRefType aChild( GetChild( nParagraphIndex ).first.get() );
190cdf0e10cSrcweir 
191cdf0e10cSrcweir             if( !IsReferencable( nParagraphIndex ) )
192cdf0e10cSrcweir             {
193cdf0e10cSrcweir                 // there is no hard reference available, create object then
194cdf0e10cSrcweir                 // --> OD 2006-01-11 #i27138#
195cdf0e10cSrcweir                 AccessibleEditableTextPara* pChild = new AccessibleEditableTextPara( xFrontEnd, this );
196cdf0e10cSrcweir                 // <--
197cdf0e10cSrcweir                 uno::Reference< XAccessible > xChild( static_cast< ::cppu::OWeakObject* > (pChild), uno::UNO_QUERY );
198cdf0e10cSrcweir 
199cdf0e10cSrcweir                 if( !xChild.is() )
200cdf0e10cSrcweir                     throw uno::RuntimeException(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Child creation failed")), xFrontEnd);
201cdf0e10cSrcweir 
202cdf0e10cSrcweir                 aChild = WeakPara::HardRefType( xChild, pChild );
203cdf0e10cSrcweir 
204cdf0e10cSrcweir                 InitChild( *aChild, rEditSource, nChild, nParagraphIndex );
205cdf0e10cSrcweir 
206cdf0e10cSrcweir                 maChildren[ nParagraphIndex ] = WeakChild( aChild, pChild->getBounds() );
207cdf0e10cSrcweir             }
208cdf0e10cSrcweir 
209cdf0e10cSrcweir             return Child( aChild.getRef(), GetChild( nParagraphIndex ).second );
210cdf0e10cSrcweir         }
211cdf0e10cSrcweir         else
212cdf0e10cSrcweir         {
213cdf0e10cSrcweir             return Child();
214cdf0e10cSrcweir         }
215cdf0e10cSrcweir     }
216cdf0e10cSrcweir 
SetEEOffset(const Point & rOffset)217cdf0e10cSrcweir     void AccessibleParaManager::SetEEOffset( const Point& rOffset )
218cdf0e10cSrcweir     {
219cdf0e10cSrcweir         maEEOffset = rOffset;
220cdf0e10cSrcweir 
221cdf0e10cSrcweir         MemFunAdapter< const Point& > aAdapter( &::accessibility::AccessibleEditableTextPara::SetEEOffset, rOffset );
222cdf0e10cSrcweir         ::std::for_each( begin(), end(), aAdapter );
223cdf0e10cSrcweir     }
224cdf0e10cSrcweir 
SetActive(sal_Bool bActive)225cdf0e10cSrcweir     void AccessibleParaManager::SetActive( sal_Bool bActive )
226cdf0e10cSrcweir     {
227cdf0e10cSrcweir         mbActive = bActive;
228cdf0e10cSrcweir 
229cdf0e10cSrcweir         if( bActive )
230cdf0e10cSrcweir         {
231cdf0e10cSrcweir             SetState( AccessibleStateType::ACTIVE );
232cdf0e10cSrcweir             SetState( AccessibleStateType::EDITABLE );
233cdf0e10cSrcweir         }
234cdf0e10cSrcweir         else
235cdf0e10cSrcweir         {
236cdf0e10cSrcweir             UnSetState( AccessibleStateType::ACTIVE );
237cdf0e10cSrcweir             UnSetState( AccessibleStateType::EDITABLE );
238cdf0e10cSrcweir         }
239cdf0e10cSrcweir     }
240cdf0e10cSrcweir 
SetFocus(sal_Int32 nChild)241cdf0e10cSrcweir     void AccessibleParaManager::SetFocus( sal_Int32 nChild )
242cdf0e10cSrcweir     {
243cdf0e10cSrcweir         if( mnFocusedChild != -1 )
244cdf0e10cSrcweir             UnSetState( mnFocusedChild, AccessibleStateType::FOCUSED );
245cdf0e10cSrcweir 
246cdf0e10cSrcweir         mnFocusedChild = nChild;
247cdf0e10cSrcweir 
248cdf0e10cSrcweir         if( mnFocusedChild != -1 )
249cdf0e10cSrcweir             SetState( mnFocusedChild, AccessibleStateType::FOCUSED );
250cdf0e10cSrcweir     }
251cdf0e10cSrcweir 
InitChild(AccessibleEditableTextPara & rChild,SvxEditSourceAdapter & rEditSource,sal_Int32 nChild,sal_uInt32 nParagraphIndex) const252cdf0e10cSrcweir     void AccessibleParaManager::InitChild( AccessibleEditableTextPara& 	rChild,
253cdf0e10cSrcweir                                            SvxEditSourceAdapter& 		rEditSource,
254cdf0e10cSrcweir                                            sal_Int32 					nChild,
255cdf0e10cSrcweir                                            sal_uInt32 					nParagraphIndex ) const
256cdf0e10cSrcweir     {
257cdf0e10cSrcweir         rChild.SetEditSource( &rEditSource );
258cdf0e10cSrcweir         rChild.SetIndexInParent( nChild );
259cdf0e10cSrcweir         rChild.SetParagraphIndex( nParagraphIndex );
260cdf0e10cSrcweir 
261cdf0e10cSrcweir         rChild.SetEEOffset( maEEOffset );
262cdf0e10cSrcweir 
263cdf0e10cSrcweir         if( mbActive )
264cdf0e10cSrcweir         {
265cdf0e10cSrcweir             rChild.SetState( AccessibleStateType::ACTIVE );
266cdf0e10cSrcweir             rChild.SetState( AccessibleStateType::EDITABLE );
267cdf0e10cSrcweir         }
268cdf0e10cSrcweir 
269cdf0e10cSrcweir         if( mnFocusedChild == static_cast<sal_Int32>(nParagraphIndex) )
270cdf0e10cSrcweir             rChild.SetState( AccessibleStateType::FOCUSED );
271cdf0e10cSrcweir 
272cdf0e10cSrcweir         // add states passed from outside
273cdf0e10cSrcweir         for( VectorOfStates::const_iterator aIt = maChildStates.begin(), aEnd = maChildStates.end(); aIt != aEnd; ++aIt )
274cdf0e10cSrcweir             rChild.SetState( *aIt );
275cdf0e10cSrcweir     }
276cdf0e10cSrcweir 
SetState(sal_Int32 nChild,const sal_Int16 nStateId)277cdf0e10cSrcweir     void AccessibleParaManager::SetState( sal_Int32 nChild, const sal_Int16 nStateId )
278cdf0e10cSrcweir     {
279cdf0e10cSrcweir         MemFunAdapter< const sal_Int16 > aFunc( &AccessibleEditableTextPara::SetState,
280cdf0e10cSrcweir                                                 nStateId );
281cdf0e10cSrcweir         aFunc( GetChild(nChild) );
282cdf0e10cSrcweir     }
283cdf0e10cSrcweir 
SetState(const sal_Int16 nStateId)284cdf0e10cSrcweir     void AccessibleParaManager::SetState( const sal_Int16 nStateId )
285cdf0e10cSrcweir     {
286cdf0e10cSrcweir         ::std::for_each( begin(), end(),
287cdf0e10cSrcweir                          MemFunAdapter< const sal_Int16 >( &AccessibleEditableTextPara::SetState,
288cdf0e10cSrcweir                                                            nStateId ) );
289cdf0e10cSrcweir     }
290cdf0e10cSrcweir 
UnSetState(sal_Int32 nChild,const sal_Int16 nStateId)291cdf0e10cSrcweir     void AccessibleParaManager::UnSetState( sal_Int32 nChild, const sal_Int16 nStateId )
292cdf0e10cSrcweir     {
293cdf0e10cSrcweir         MemFunAdapter< const sal_Int16 > aFunc( &AccessibleEditableTextPara::UnSetState,
294cdf0e10cSrcweir                                                 nStateId );
295cdf0e10cSrcweir         aFunc( GetChild(nChild) );
296cdf0e10cSrcweir     }
297cdf0e10cSrcweir 
UnSetState(const sal_Int16 nStateId)298cdf0e10cSrcweir     void AccessibleParaManager::UnSetState( const sal_Int16 nStateId )
299cdf0e10cSrcweir     {
300cdf0e10cSrcweir         ::std::for_each( begin(), end(),
301cdf0e10cSrcweir                          MemFunAdapter< const sal_Int16 >( &AccessibleEditableTextPara::UnSetState,
302cdf0e10cSrcweir                                                            nStateId ) );
303cdf0e10cSrcweir     }
304cdf0e10cSrcweir 
SetEditSource(SvxEditSourceAdapter * pEditSource)305cdf0e10cSrcweir     void AccessibleParaManager::SetEditSource( SvxEditSourceAdapter* pEditSource )
306cdf0e10cSrcweir     {
307cdf0e10cSrcweir         MemFunAdapter< SvxEditSourceAdapter* > aAdapter( &::accessibility::AccessibleEditableTextPara::SetEditSource, pEditSource );
308cdf0e10cSrcweir         ::std::for_each( begin(), end(), aAdapter );
309cdf0e10cSrcweir     }
310cdf0e10cSrcweir 
311cdf0e10cSrcweir     // not generic yet, no arguments...
312cdf0e10cSrcweir     class AccessibleParaManager_DisposeChildren : public ::std::unary_function< ::accessibility::AccessibleEditableTextPara&, void >
313cdf0e10cSrcweir     {
314cdf0e10cSrcweir     public:
AccessibleParaManager_DisposeChildren()315cdf0e10cSrcweir         AccessibleParaManager_DisposeChildren() {}
operator ()(::accessibility::AccessibleEditableTextPara & rPara)316cdf0e10cSrcweir         void operator()( ::accessibility::AccessibleEditableTextPara& rPara )
317cdf0e10cSrcweir         {
318cdf0e10cSrcweir             rPara.Dispose();
319cdf0e10cSrcweir         }
320cdf0e10cSrcweir     };
321cdf0e10cSrcweir 
Dispose()322cdf0e10cSrcweir     void AccessibleParaManager::Dispose()
323cdf0e10cSrcweir     {
324cdf0e10cSrcweir         AccessibleParaManager_DisposeChildren aFunctor;
325cdf0e10cSrcweir 
326cdf0e10cSrcweir         ::std::for_each( begin(), end(),
327cdf0e10cSrcweir                          WeakChildAdapter< AccessibleParaManager_DisposeChildren > (aFunctor) );
328cdf0e10cSrcweir     }
329cdf0e10cSrcweir 
330cdf0e10cSrcweir     // not generic yet, too many method arguments...
331cdf0e10cSrcweir     class StateChangeEvent : public ::std::unary_function< ::accessibility::AccessibleEditableTextPara&, void >
332cdf0e10cSrcweir     {
333cdf0e10cSrcweir     public:
334cdf0e10cSrcweir         typedef void return_type;
StateChangeEvent(const sal_Int16 nEventId,const uno::Any & rNewValue,const uno::Any & rOldValue)335cdf0e10cSrcweir         StateChangeEvent( const sal_Int16 nEventId,
336cdf0e10cSrcweir                           const uno::Any& rNewValue,
337cdf0e10cSrcweir                           const uno::Any& rOldValue ) :
338cdf0e10cSrcweir             mnEventId( nEventId ),
339cdf0e10cSrcweir             mrNewValue( rNewValue ),
340cdf0e10cSrcweir             mrOldValue( rOldValue ) {}
operator ()(::accessibility::AccessibleEditableTextPara & rPara)341cdf0e10cSrcweir         void operator()( ::accessibility::AccessibleEditableTextPara& rPara )
342cdf0e10cSrcweir         {
343cdf0e10cSrcweir             rPara.FireEvent( mnEventId, mrNewValue, mrOldValue );
344cdf0e10cSrcweir         }
345cdf0e10cSrcweir 
346cdf0e10cSrcweir     private:
347cdf0e10cSrcweir         const sal_Int16 mnEventId;
348cdf0e10cSrcweir         const uno::Any& mrNewValue;
349cdf0e10cSrcweir         const uno::Any& mrOldValue;
350cdf0e10cSrcweir     };
351cdf0e10cSrcweir 
FireEvent(sal_uInt32 nStartPara,sal_uInt32 nEndPara,const sal_Int16 nEventId,const uno::Any & rNewValue,const uno::Any & rOldValue) const352cdf0e10cSrcweir     void AccessibleParaManager::FireEvent( sal_uInt32 nStartPara,
353cdf0e10cSrcweir                                            sal_uInt32 nEndPara,
354cdf0e10cSrcweir                                            const sal_Int16 nEventId,
355cdf0e10cSrcweir                                            const uno::Any& rNewValue,
356cdf0e10cSrcweir                                            const uno::Any& rOldValue ) const
357cdf0e10cSrcweir     {
358cdf0e10cSrcweir         DBG_ASSERT( maChildren.size() > nStartPara &&
359*9b8096d0SSteve Yin                     maChildren.size() >= nEndPara &&
360*9b8096d0SSteve Yin 					nEndPara >= nStartPara , "AccessibleParaManager::FireEvent: invalid index" );
361cdf0e10cSrcweir 
362*9b8096d0SSteve Yin         if( maChildren.size() > nStartPara && maChildren.size() >= nEndPara && nEndPara >= nStartPara)
363cdf0e10cSrcweir         {
364cdf0e10cSrcweir             VectorOfChildren::const_iterator front = maChildren.begin();
365cdf0e10cSrcweir             VectorOfChildren::const_iterator back = front;
366cdf0e10cSrcweir 
367cdf0e10cSrcweir             ::std::advance( front, nStartPara );
368cdf0e10cSrcweir             ::std::advance( back, nEndPara );
369cdf0e10cSrcweir 
370cdf0e10cSrcweir             StateChangeEvent aFunctor( nEventId, rNewValue, rOldValue );
371cdf0e10cSrcweir 
372cdf0e10cSrcweir             ::std::for_each( front, back, AccessibleParaManager::WeakChildAdapter< StateChangeEvent >( aFunctor ) );
373cdf0e10cSrcweir         }
374cdf0e10cSrcweir     }
375cdf0e10cSrcweir 
376cdf0e10cSrcweir     class ReleaseChild : public ::std::unary_function< const AccessibleParaManager::WeakChild&, AccessibleParaManager::WeakChild >
377cdf0e10cSrcweir     {
378cdf0e10cSrcweir     public:
operator ()(const AccessibleParaManager::WeakChild & rPara)379cdf0e10cSrcweir         AccessibleParaManager::WeakChild operator()( const AccessibleParaManager::WeakChild& rPara )
380cdf0e10cSrcweir         {
381cdf0e10cSrcweir             AccessibleParaManager::ShutdownPara( rPara );
382cdf0e10cSrcweir 
383cdf0e10cSrcweir             // clear reference
384cdf0e10cSrcweir             return AccessibleParaManager::WeakChild();
385cdf0e10cSrcweir         }
386cdf0e10cSrcweir     };
387cdf0e10cSrcweir 
Release(sal_uInt32 nStartPara,sal_uInt32 nEndPara)388cdf0e10cSrcweir     void AccessibleParaManager::Release( sal_uInt32 nStartPara, sal_uInt32 nEndPara )
389cdf0e10cSrcweir     {
390cdf0e10cSrcweir         DBG_ASSERT( maChildren.size() > nStartPara &&
391cdf0e10cSrcweir                     maChildren.size() >= nEndPara, "AccessibleParaManager::Release: invalid index" );
392cdf0e10cSrcweir 
393cdf0e10cSrcweir         if( maChildren.size() > nStartPara &&
394cdf0e10cSrcweir             maChildren.size() >= nEndPara )
395cdf0e10cSrcweir         {
396cdf0e10cSrcweir             VectorOfChildren::iterator front = maChildren.begin();
397cdf0e10cSrcweir             VectorOfChildren::iterator back = front;
398cdf0e10cSrcweir 
399cdf0e10cSrcweir             ::std::advance( front, nStartPara );
400cdf0e10cSrcweir             ::std::advance( back, nEndPara );
401cdf0e10cSrcweir 
402cdf0e10cSrcweir             ::std::transform( front, back, front, ReleaseChild() );
403cdf0e10cSrcweir         }
404cdf0e10cSrcweir     }
405cdf0e10cSrcweir 
ShutdownPara(const WeakChild & rChild)406cdf0e10cSrcweir     void AccessibleParaManager::ShutdownPara( const WeakChild& rChild )
407cdf0e10cSrcweir     {
408cdf0e10cSrcweir         WeakPara::HardRefType aChild( rChild.first.get() );
409cdf0e10cSrcweir 
410cdf0e10cSrcweir         if( IsReferencable( aChild ) )
411cdf0e10cSrcweir             aChild->SetEditSource( NULL );
412cdf0e10cSrcweir     }
413cdf0e10cSrcweir 
414cdf0e10cSrcweir }
415cdf0e10cSrcweir 
416cdf0e10cSrcweir //------------------------------------------------------------------------
417