xref: /aoo4110/main/editeng/source/uno/unoedprx.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_editeng.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
28*b1cdbd2cSJim Jagielski //
29*b1cdbd2cSJim Jagielski // Global header
30*b1cdbd2cSJim Jagielski //
31*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <limits.h>
34*b1cdbd2cSJim Jagielski #include <vector>
35*b1cdbd2cSJim Jagielski #include <algorithm>
36*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx>
37*b1cdbd2cSJim Jagielski #include <vcl/window.hxx>
38*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Any.hxx>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Reference.hxx>
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
43*b1cdbd2cSJim Jagielski //
44*b1cdbd2cSJim Jagielski // Project-local header
45*b1cdbd2cSJim Jagielski //
46*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
47*b1cdbd2cSJim Jagielski #include "editeng/unoedprx.hxx"
48*b1cdbd2cSJim Jagielski #include <editeng/unotext.hxx>
49*b1cdbd2cSJim Jagielski #include <editeng/unoedhlp.hxx>
50*b1cdbd2cSJim Jagielski #include <editeng/editdata.hxx>
51*b1cdbd2cSJim Jagielski #include <editeng/editeng.hxx>
52*b1cdbd2cSJim Jagielski #include <editeng/editview.hxx>
53*b1cdbd2cSJim Jagielski #include <editeng/AccessibleStringWrap.hxx>
54*b1cdbd2cSJim Jagielski #include <editeng/outliner.hxx>
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski class SvxAccessibleTextIndex
60*b1cdbd2cSJim Jagielski {
61*b1cdbd2cSJim Jagielski public:
SvxAccessibleTextIndex()62*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex() :
63*b1cdbd2cSJim Jagielski         mnPara(0),
64*b1cdbd2cSJim Jagielski         mnIndex(0),
65*b1cdbd2cSJim Jagielski         mnEEIndex(0),
66*b1cdbd2cSJim Jagielski         mnFieldOffset(0),
67*b1cdbd2cSJim Jagielski         mnFieldLen(0),
68*b1cdbd2cSJim Jagielski         mbInField(sal_False),
69*b1cdbd2cSJim Jagielski         mnBulletOffset(0),
70*b1cdbd2cSJim Jagielski         mnBulletLen(0),
71*b1cdbd2cSJim Jagielski         mbInBullet(sal_False) {};
~SvxAccessibleTextIndex()72*b1cdbd2cSJim Jagielski     ~SvxAccessibleTextIndex() {};
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski     // Get/Set current paragraph
SetParagraph(sal_uInt16 nPara)75*b1cdbd2cSJim Jagielski     void SetParagraph( sal_uInt16 nPara )
76*b1cdbd2cSJim Jagielski     {
77*b1cdbd2cSJim Jagielski         mnPara = nPara;
78*b1cdbd2cSJim Jagielski     }
GetParagraph() const79*b1cdbd2cSJim Jagielski     sal_uInt16 GetParagraph() const { return mnPara; }
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski     /** Set the index in the UAA semantic
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski         @param nIndex
84*b1cdbd2cSJim Jagielski      	The index from the UA API (fields and bullets are expanded)
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski         @param rTF
87*b1cdbd2cSJim Jagielski         The text forwarder to use in the calculations
88*b1cdbd2cSJim Jagielski      */
89*b1cdbd2cSJim Jagielski     void SetIndex( sal_Int32 nIndex, const SvxTextForwarder& rTF );
SetIndex(sal_uInt16 nPara,sal_Int32 nIndex,const SvxTextForwarder & rTF)90*b1cdbd2cSJim Jagielski     void SetIndex( sal_uInt16 nPara, sal_Int32 nIndex, const SvxTextForwarder& rTF ) { SetParagraph(nPara); SetIndex(nIndex, rTF); }
GetIndex() const91*b1cdbd2cSJim Jagielski     sal_Int32 GetIndex() const { return mnIndex; }
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski     /** Set the index in the edit engine semantic
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski     	Update the object state to reflect the given index position in
96*b1cdbd2cSJim Jagielski     	EditEngine/Outliner index values
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski         @param nEEIndex
99*b1cdbd2cSJim Jagielski      	The index from the edit engine (fields span exactly one index increment)
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski         @param rTF
102*b1cdbd2cSJim Jagielski         The text forwarder to use in the calculations
103*b1cdbd2cSJim Jagielski      */
104*b1cdbd2cSJim Jagielski     void SetEEIndex( sal_uInt16 nEEIndex, const SvxTextForwarder& rTF );
SetEEIndex(sal_uInt16 nPara,sal_uInt16 nEEIndex,const SvxTextForwarder & rTF)105*b1cdbd2cSJim Jagielski     void SetEEIndex( sal_uInt16 nPara, sal_uInt16 nEEIndex, const SvxTextForwarder& rTF ) { SetParagraph(nPara); SetEEIndex(nEEIndex, rTF); }
106*b1cdbd2cSJim Jagielski     sal_uInt16 GetEEIndex() const;
107*b1cdbd2cSJim Jagielski 
SetFieldOffset(sal_Int32 nOffset,sal_Int32 nLen)108*b1cdbd2cSJim Jagielski     void SetFieldOffset( sal_Int32 nOffset, sal_Int32 nLen ) { mnFieldOffset = nOffset; mnFieldLen = nLen; }
GetFieldOffset() const109*b1cdbd2cSJim Jagielski     sal_Int32 GetFieldOffset() const { return mnFieldOffset; }
GetFieldLen() const110*b1cdbd2cSJim Jagielski     sal_Int32 GetFieldLen() const { return mnFieldLen; }
AreInField(sal_Bool bInField=sal_True)111*b1cdbd2cSJim Jagielski     void AreInField( sal_Bool bInField = sal_True ) { mbInField = bInField; }
InField() const112*b1cdbd2cSJim Jagielski     sal_Bool InField() const { return mbInField; }
113*b1cdbd2cSJim Jagielski 
SetBulletOffset(sal_Int32 nOffset,sal_Int32 nLen)114*b1cdbd2cSJim Jagielski     void SetBulletOffset( sal_Int32 nOffset, sal_Int32 nLen ) { mnBulletOffset = nOffset; mnBulletLen = nLen; }
GetBulletOffset() const115*b1cdbd2cSJim Jagielski     sal_Int32 GetBulletOffset() const { return mnBulletOffset; }
GetBulletLen() const116*b1cdbd2cSJim Jagielski     sal_Int32 GetBulletLen() const { return mnBulletLen; }
AreInBullet(sal_Bool bInBullet=sal_True)117*b1cdbd2cSJim Jagielski     void AreInBullet( sal_Bool bInBullet = sal_True ) { mbInBullet = bInBullet; }
InBullet() const118*b1cdbd2cSJim Jagielski     sal_Bool InBullet() const { return mbInBullet; }
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski     /// returns false if the current index contains non-editable text (e.g. bullets)
121*b1cdbd2cSJim Jagielski     sal_Bool IsEditable() const;
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski     /// returns false if the given range is non-editable (e.g. contains bullets or _parts_ of fields)
124*b1cdbd2cSJim Jagielski     sal_Bool IsEditableRange( const SvxAccessibleTextIndex& rEnd ) const;
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski private:
127*b1cdbd2cSJim Jagielski     sal_uInt16 	  mnPara;
128*b1cdbd2cSJim Jagielski     sal_Int32 mnIndex;
129*b1cdbd2cSJim Jagielski     sal_Int32 mnEEIndex;
130*b1cdbd2cSJim Jagielski     sal_Int32 mnFieldOffset;
131*b1cdbd2cSJim Jagielski     sal_Int32 mnFieldLen;
132*b1cdbd2cSJim Jagielski     sal_Bool  mbInField;
133*b1cdbd2cSJim Jagielski     sal_Int32 mnBulletOffset;
134*b1cdbd2cSJim Jagielski     sal_Int32 mnBulletLen;
135*b1cdbd2cSJim Jagielski     sal_Bool  mbInBullet;
136*b1cdbd2cSJim Jagielski };
137*b1cdbd2cSJim Jagielski 
MakeEESelection(const SvxAccessibleTextIndex & rStart,const SvxAccessibleTextIndex & rEnd)138*b1cdbd2cSJim Jagielski ESelection MakeEESelection( const SvxAccessibleTextIndex& rStart, const SvxAccessibleTextIndex& rEnd )
139*b1cdbd2cSJim Jagielski {
140*b1cdbd2cSJim Jagielski     // deal with field special case: to really get a field contained
141*b1cdbd2cSJim Jagielski     // within a selection, the start index must be before or on the
142*b1cdbd2cSJim Jagielski     // field, the end index after it.
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski     // The SvxAccessibleTextIndex.GetEEIndex method gives the index on
145*b1cdbd2cSJim Jagielski     // the field, as long the input index is on the field. Thus,
146*b1cdbd2cSJim Jagielski     // correction necessary for the end index
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski     // Therefore, for _ranges_, if part of the field is touched, all
149*b1cdbd2cSJim Jagielski     // of the field must be selected
150*b1cdbd2cSJim Jagielski     if( rStart.GetParagraph() <= rEnd.GetParagraph() ||
151*b1cdbd2cSJim Jagielski         (rStart.GetParagraph() == rEnd.GetParagraph() &&
152*b1cdbd2cSJim Jagielski          rStart.GetEEIndex() <= rEnd.GetEEIndex()) )
153*b1cdbd2cSJim Jagielski     {
154*b1cdbd2cSJim Jagielski         if( rEnd.InField() && rEnd.GetFieldOffset() )
155*b1cdbd2cSJim Jagielski             return ESelection( rStart.GetParagraph(), rStart.GetEEIndex(),
156*b1cdbd2cSJim Jagielski                                rEnd.GetParagraph(), rEnd.GetEEIndex()+1 );
157*b1cdbd2cSJim Jagielski     }
158*b1cdbd2cSJim Jagielski     else if( rStart.GetParagraph() > rEnd.GetParagraph() ||
159*b1cdbd2cSJim Jagielski              (rStart.GetParagraph() == rEnd.GetParagraph() &&
160*b1cdbd2cSJim Jagielski               rStart.GetEEIndex() > rEnd.GetEEIndex()) )
161*b1cdbd2cSJim Jagielski     {
162*b1cdbd2cSJim Jagielski         if( rStart.InField() && rStart.GetFieldOffset()  )
163*b1cdbd2cSJim Jagielski             return ESelection( rStart.GetParagraph(), rStart.GetEEIndex()+1,
164*b1cdbd2cSJim Jagielski                                rEnd.GetParagraph(), rEnd.GetEEIndex() );
165*b1cdbd2cSJim Jagielski     }
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski     return ESelection( rStart.GetParagraph(), rStart.GetEEIndex(),
168*b1cdbd2cSJim Jagielski                        rEnd.GetParagraph(), rEnd.GetEEIndex() );
169*b1cdbd2cSJim Jagielski }
170*b1cdbd2cSJim Jagielski 
MakeEESelection(const SvxAccessibleTextIndex & rIndex)171*b1cdbd2cSJim Jagielski ESelection MakeEESelection( const SvxAccessibleTextIndex& rIndex )
172*b1cdbd2cSJim Jagielski {
173*b1cdbd2cSJim Jagielski     return ESelection( rIndex.GetParagraph(), rIndex.GetEEIndex(),
174*b1cdbd2cSJim Jagielski                        rIndex.GetParagraph(), rIndex.GetEEIndex() + 1 );
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski 
GetEEIndex() const177*b1cdbd2cSJim Jagielski sal_uInt16 SvxAccessibleTextIndex::GetEEIndex() const
178*b1cdbd2cSJim Jagielski {
179*b1cdbd2cSJim Jagielski     DBG_ASSERT(mnEEIndex >= 0 && mnEEIndex <= USHRT_MAX,
180*b1cdbd2cSJim Jagielski                "SvxAccessibleTextIndex::GetEEIndex: index value overflow");
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski     return static_cast< sal_uInt16 > (mnEEIndex);
183*b1cdbd2cSJim Jagielski }
184*b1cdbd2cSJim Jagielski 
SetEEIndex(sal_uInt16 nEEIndex,const SvxTextForwarder & rTF)185*b1cdbd2cSJim Jagielski void SvxAccessibleTextIndex::SetEEIndex( sal_uInt16 nEEIndex, const SvxTextForwarder& rTF )
186*b1cdbd2cSJim Jagielski {
187*b1cdbd2cSJim Jagielski     // reset
188*b1cdbd2cSJim Jagielski     mnFieldOffset = 0;
189*b1cdbd2cSJim Jagielski     mbInField = sal_False;
190*b1cdbd2cSJim Jagielski     mnFieldLen = 0;
191*b1cdbd2cSJim Jagielski     mnBulletOffset = 0;
192*b1cdbd2cSJim Jagielski     mbInBullet = sal_False;
193*b1cdbd2cSJim Jagielski     mnBulletLen = 0;
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski     // set known values
196*b1cdbd2cSJim Jagielski     mnEEIndex = nEEIndex;
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski     // calculate unknowns
199*b1cdbd2cSJim Jagielski     sal_uInt16					nCurrField, nFieldCount = rTF.GetFieldCount( GetParagraph() );
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski     mnIndex = nEEIndex;
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski     EBulletInfo aBulletInfo = rTF.GetBulletInfo( GetParagraph() );
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski     // any text bullets?
206*b1cdbd2cSJim Jagielski     if( aBulletInfo.nParagraph != EE_PARA_NOT_FOUND &&
207*b1cdbd2cSJim Jagielski         aBulletInfo.bVisible &&
208*b1cdbd2cSJim Jagielski         aBulletInfo.nType != SVX_NUM_BITMAP )
209*b1cdbd2cSJim Jagielski     {
210*b1cdbd2cSJim Jagielski         mnIndex += aBulletInfo.aText.Len();
211*b1cdbd2cSJim Jagielski     }
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski     for( nCurrField=0; nCurrField < nFieldCount; ++nCurrField )
214*b1cdbd2cSJim Jagielski     {
215*b1cdbd2cSJim Jagielski         EFieldInfo aFieldInfo( rTF.GetFieldInfo( GetParagraph(), nCurrField ) );
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski         if( aFieldInfo.aPosition.nIndex > nEEIndex )
218*b1cdbd2cSJim Jagielski             break;
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski         if( aFieldInfo.aPosition.nIndex == nEEIndex )
221*b1cdbd2cSJim Jagielski         {
222*b1cdbd2cSJim Jagielski             AreInField();
223*b1cdbd2cSJim Jagielski             break;
224*b1cdbd2cSJim Jagielski         }
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski         // #106010#
227*b1cdbd2cSJim Jagielski         mnIndex += ::std::max(aFieldInfo.aCurrentText.Len()-1, 0);
228*b1cdbd2cSJim Jagielski     }
229*b1cdbd2cSJim Jagielski }
230*b1cdbd2cSJim Jagielski 
SetIndex(sal_Int32 nIndex,const SvxTextForwarder & rTF)231*b1cdbd2cSJim Jagielski void SvxAccessibleTextIndex::SetIndex( sal_Int32 nIndex, const SvxTextForwarder& rTF )
232*b1cdbd2cSJim Jagielski {
233*b1cdbd2cSJim Jagielski     // reset
234*b1cdbd2cSJim Jagielski     mnFieldOffset = 0;
235*b1cdbd2cSJim Jagielski     mbInField = sal_False;
236*b1cdbd2cSJim Jagielski     mnFieldLen = 0;
237*b1cdbd2cSJim Jagielski     mnBulletOffset = 0;
238*b1cdbd2cSJim Jagielski     mbInBullet = sal_False;
239*b1cdbd2cSJim Jagielski     mnBulletLen = 0;
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski     // set known values
242*b1cdbd2cSJim Jagielski     mnIndex = nIndex;
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski     // calculate unknowns
245*b1cdbd2cSJim Jagielski     sal_uInt16					nCurrField, nFieldCount = rTF.GetFieldCount( GetParagraph() );
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski     DBG_ASSERT(nIndex >= 0 && nIndex <= USHRT_MAX,
248*b1cdbd2cSJim Jagielski                "SvxAccessibleTextIndex::SetIndex: index value overflow");
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski     mnEEIndex = nIndex;
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski     EBulletInfo aBulletInfo = rTF.GetBulletInfo( GetParagraph() );
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski     // any text bullets?
255*b1cdbd2cSJim Jagielski     if( aBulletInfo.nParagraph != EE_PARA_NOT_FOUND &&
256*b1cdbd2cSJim Jagielski         aBulletInfo.bVisible &&
257*b1cdbd2cSJim Jagielski         aBulletInfo.nType != SVX_NUM_BITMAP )
258*b1cdbd2cSJim Jagielski     {
259*b1cdbd2cSJim Jagielski         sal_Int32 nBulletLen = aBulletInfo.aText.Len();
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski         if( nIndex < nBulletLen )
262*b1cdbd2cSJim Jagielski         {
263*b1cdbd2cSJim Jagielski             AreInBullet();
264*b1cdbd2cSJim Jagielski             SetBulletOffset( nIndex, nBulletLen );
265*b1cdbd2cSJim Jagielski             mnEEIndex = 0;
266*b1cdbd2cSJim Jagielski             return;
267*b1cdbd2cSJim Jagielski         }
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski         mnEEIndex = mnEEIndex - nBulletLen;
270*b1cdbd2cSJim Jagielski     }
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski     for( nCurrField=0; nCurrField < nFieldCount; ++nCurrField )
273*b1cdbd2cSJim Jagielski     {
274*b1cdbd2cSJim Jagielski         EFieldInfo aFieldInfo( rTF.GetFieldInfo( GetParagraph(), nCurrField ) );
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski         // we're before a field
277*b1cdbd2cSJim Jagielski         if( aFieldInfo.aPosition.nIndex > mnEEIndex )
278*b1cdbd2cSJim Jagielski             break;
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski         // #106010#
281*b1cdbd2cSJim Jagielski         mnEEIndex -= ::std::max(aFieldInfo.aCurrentText.Len()-1, 0);
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski         // we're within a field
284*b1cdbd2cSJim Jagielski         if( aFieldInfo.aPosition.nIndex >= mnEEIndex )
285*b1cdbd2cSJim Jagielski         {
286*b1cdbd2cSJim Jagielski             AreInField();
287*b1cdbd2cSJim Jagielski             SetFieldOffset( ::std::max(aFieldInfo.aCurrentText.Len()-1, 0) - (aFieldInfo.aPosition.nIndex - mnEEIndex),
288*b1cdbd2cSJim Jagielski                             aFieldInfo.aCurrentText.Len() );
289*b1cdbd2cSJim Jagielski             mnEEIndex = aFieldInfo.aPosition.nIndex ;
290*b1cdbd2cSJim Jagielski             break;
291*b1cdbd2cSJim Jagielski         }
292*b1cdbd2cSJim Jagielski     }
293*b1cdbd2cSJim Jagielski }
294*b1cdbd2cSJim Jagielski 
IsEditable() const295*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextIndex::IsEditable() const
296*b1cdbd2cSJim Jagielski {
297*b1cdbd2cSJim Jagielski     if( InBullet() || InField() )
298*b1cdbd2cSJim Jagielski         return sal_False;
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski     return sal_True;
301*b1cdbd2cSJim Jagielski }
302*b1cdbd2cSJim Jagielski 
IsEditableRange(const SvxAccessibleTextIndex & rEnd) const303*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextIndex::IsEditableRange( const SvxAccessibleTextIndex& rEnd ) const
304*b1cdbd2cSJim Jagielski {
305*b1cdbd2cSJim Jagielski     if( GetIndex() > rEnd.GetIndex() )
306*b1cdbd2cSJim Jagielski         return rEnd.IsEditableRange( *this );
307*b1cdbd2cSJim Jagielski 
308*b1cdbd2cSJim Jagielski     if( InBullet() || rEnd.InBullet() )
309*b1cdbd2cSJim Jagielski         return sal_False;
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski     if( InField() && GetFieldOffset() )
312*b1cdbd2cSJim Jagielski         return sal_False; // within field
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski     if( rEnd.InField() && rEnd.GetFieldOffset() >= rEnd.GetFieldLen() - 1 )
315*b1cdbd2cSJim Jagielski         return sal_False; // within field
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski     return sal_True;
318*b1cdbd2cSJim Jagielski }
319*b1cdbd2cSJim Jagielski 
320*b1cdbd2cSJim Jagielski //---------------------------------------------------------------------------------
321*b1cdbd2cSJim Jagielski 
SvxEditSourceAdapter()322*b1cdbd2cSJim Jagielski SvxEditSourceAdapter::SvxEditSourceAdapter() : mbEditSourceValid( sal_False )
323*b1cdbd2cSJim Jagielski {
324*b1cdbd2cSJim Jagielski }
325*b1cdbd2cSJim Jagielski 
~SvxEditSourceAdapter()326*b1cdbd2cSJim Jagielski SvxEditSourceAdapter::~SvxEditSourceAdapter()
327*b1cdbd2cSJim Jagielski {
328*b1cdbd2cSJim Jagielski }
329*b1cdbd2cSJim Jagielski 
Clone() const330*b1cdbd2cSJim Jagielski SvxEditSource* SvxEditSourceAdapter::Clone() const
331*b1cdbd2cSJim Jagielski {
332*b1cdbd2cSJim Jagielski     if( mbEditSourceValid && mpAdaptee.get() )
333*b1cdbd2cSJim Jagielski     {
334*b1cdbd2cSJim Jagielski         ::std::auto_ptr< SvxEditSource > pClonedAdaptee( mpAdaptee->Clone() );
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski         if( pClonedAdaptee.get() )
337*b1cdbd2cSJim Jagielski         {
338*b1cdbd2cSJim Jagielski             SvxEditSourceAdapter* pClone = new SvxEditSourceAdapter();
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski             if( pClone )
341*b1cdbd2cSJim Jagielski             {
342*b1cdbd2cSJim Jagielski                 pClone->SetEditSource( pClonedAdaptee );
343*b1cdbd2cSJim Jagielski                 return pClone;
344*b1cdbd2cSJim Jagielski             }
345*b1cdbd2cSJim Jagielski         }
346*b1cdbd2cSJim Jagielski     }
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski     return NULL;
349*b1cdbd2cSJim Jagielski }
350*b1cdbd2cSJim Jagielski 
GetTextForwarderAdapter()351*b1cdbd2cSJim Jagielski SvxAccessibleTextAdapter* SvxEditSourceAdapter::GetTextForwarderAdapter()
352*b1cdbd2cSJim Jagielski {
353*b1cdbd2cSJim Jagielski     if( mbEditSourceValid && mpAdaptee.get() )
354*b1cdbd2cSJim Jagielski     {
355*b1cdbd2cSJim Jagielski         SvxTextForwarder* pTextForwarder = mpAdaptee->GetTextForwarder();
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski         if( pTextForwarder )
358*b1cdbd2cSJim Jagielski         {
359*b1cdbd2cSJim Jagielski             maTextAdapter.SetForwarder(*pTextForwarder);
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski             return &maTextAdapter;
362*b1cdbd2cSJim Jagielski         }
363*b1cdbd2cSJim Jagielski     }
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski     return NULL;
366*b1cdbd2cSJim Jagielski }
367*b1cdbd2cSJim Jagielski 
GetTextForwarder()368*b1cdbd2cSJim Jagielski SvxTextForwarder* SvxEditSourceAdapter::GetTextForwarder()
369*b1cdbd2cSJim Jagielski {
370*b1cdbd2cSJim Jagielski     return GetTextForwarderAdapter();
371*b1cdbd2cSJim Jagielski }
372*b1cdbd2cSJim Jagielski 
GetViewForwarder()373*b1cdbd2cSJim Jagielski SvxViewForwarder* SvxEditSourceAdapter::GetViewForwarder()
374*b1cdbd2cSJim Jagielski {
375*b1cdbd2cSJim Jagielski     if( mbEditSourceValid && mpAdaptee.get() )
376*b1cdbd2cSJim Jagielski         return mpAdaptee->GetViewForwarder();
377*b1cdbd2cSJim Jagielski 
378*b1cdbd2cSJim Jagielski     return NULL;
379*b1cdbd2cSJim Jagielski }
380*b1cdbd2cSJim Jagielski 
GetEditViewForwarderAdapter(sal_Bool bCreate)381*b1cdbd2cSJim Jagielski SvxAccessibleTextEditViewAdapter* SvxEditSourceAdapter::GetEditViewForwarderAdapter( sal_Bool bCreate )
382*b1cdbd2cSJim Jagielski {
383*b1cdbd2cSJim Jagielski     if( mbEditSourceValid && mpAdaptee.get() )
384*b1cdbd2cSJim Jagielski     {
385*b1cdbd2cSJim Jagielski         SvxEditViewForwarder* pEditViewForwarder = mpAdaptee->GetEditViewForwarder(bCreate);
386*b1cdbd2cSJim Jagielski 
387*b1cdbd2cSJim Jagielski         if( pEditViewForwarder )
388*b1cdbd2cSJim Jagielski         {
389*b1cdbd2cSJim Jagielski             SvxAccessibleTextAdapter* pTextAdapter = GetTextForwarderAdapter();
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski             if( pTextAdapter )
392*b1cdbd2cSJim Jagielski             {
393*b1cdbd2cSJim Jagielski                 maEditViewAdapter.SetForwarder(*pEditViewForwarder, *pTextAdapter);
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski                 return &maEditViewAdapter;
396*b1cdbd2cSJim Jagielski             }
397*b1cdbd2cSJim Jagielski         }
398*b1cdbd2cSJim Jagielski     }
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski     return NULL;
401*b1cdbd2cSJim Jagielski }
402*b1cdbd2cSJim Jagielski 
GetEditViewForwarder(sal_Bool bCreate)403*b1cdbd2cSJim Jagielski SvxEditViewForwarder* SvxEditSourceAdapter::GetEditViewForwarder( sal_Bool bCreate )
404*b1cdbd2cSJim Jagielski {
405*b1cdbd2cSJim Jagielski     return GetEditViewForwarderAdapter( bCreate );
406*b1cdbd2cSJim Jagielski }
407*b1cdbd2cSJim Jagielski 
UpdateData()408*b1cdbd2cSJim Jagielski void SvxEditSourceAdapter::UpdateData()
409*b1cdbd2cSJim Jagielski {
410*b1cdbd2cSJim Jagielski     if( mbEditSourceValid && mpAdaptee.get() )
411*b1cdbd2cSJim Jagielski         mpAdaptee->UpdateData();
412*b1cdbd2cSJim Jagielski }
413*b1cdbd2cSJim Jagielski 
GetBroadcaster() const414*b1cdbd2cSJim Jagielski SfxBroadcaster& SvxEditSourceAdapter::GetBroadcaster() const
415*b1cdbd2cSJim Jagielski {
416*b1cdbd2cSJim Jagielski     if( mbEditSourceValid && mpAdaptee.get() )
417*b1cdbd2cSJim Jagielski         return mpAdaptee->GetBroadcaster();
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski     return maDummyBroadcaster;
420*b1cdbd2cSJim Jagielski }
421*b1cdbd2cSJim Jagielski 
SetEditSource(::std::auto_ptr<SvxEditSource> pAdaptee)422*b1cdbd2cSJim Jagielski void SvxEditSourceAdapter::SetEditSource( ::std::auto_ptr< SvxEditSource > pAdaptee )
423*b1cdbd2cSJim Jagielski {
424*b1cdbd2cSJim Jagielski     if( pAdaptee.get() )
425*b1cdbd2cSJim Jagielski     {
426*b1cdbd2cSJim Jagielski         mpAdaptee = pAdaptee;
427*b1cdbd2cSJim Jagielski         mbEditSourceValid = sal_True;
428*b1cdbd2cSJim Jagielski     }
429*b1cdbd2cSJim Jagielski     else
430*b1cdbd2cSJim Jagielski     {
431*b1cdbd2cSJim Jagielski         // do a lazy delete (prevents us from deleting the broadcaster
432*b1cdbd2cSJim Jagielski         // from within a broadcast in
433*b1cdbd2cSJim Jagielski         // AccessibleTextHelper_Impl::Notify)
434*b1cdbd2cSJim Jagielski         mbEditSourceValid = sal_False;
435*b1cdbd2cSJim Jagielski     }
436*b1cdbd2cSJim Jagielski }
437*b1cdbd2cSJim Jagielski 
IsValid() const438*b1cdbd2cSJim Jagielski sal_Bool SvxEditSourceAdapter::IsValid() const
439*b1cdbd2cSJim Jagielski {
440*b1cdbd2cSJim Jagielski     return mbEditSourceValid;
441*b1cdbd2cSJim Jagielski }
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------------
445*b1cdbd2cSJim Jagielski 
SvxAccessibleTextAdapter()446*b1cdbd2cSJim Jagielski SvxAccessibleTextAdapter::SvxAccessibleTextAdapter() : mrTextForwarder( NULL )
447*b1cdbd2cSJim Jagielski {
448*b1cdbd2cSJim Jagielski }
449*b1cdbd2cSJim Jagielski 
~SvxAccessibleTextAdapter()450*b1cdbd2cSJim Jagielski SvxAccessibleTextAdapter::~SvxAccessibleTextAdapter()
451*b1cdbd2cSJim Jagielski {
452*b1cdbd2cSJim Jagielski }
453*b1cdbd2cSJim Jagielski 
GetParagraphCount() const454*b1cdbd2cSJim Jagielski sal_uInt16 SvxAccessibleTextAdapter::GetParagraphCount() const
455*b1cdbd2cSJim Jagielski {
456*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski     return mrTextForwarder->GetParagraphCount();
459*b1cdbd2cSJim Jagielski }
460*b1cdbd2cSJim Jagielski 
GetTextLen(sal_uInt16 nParagraph) const461*b1cdbd2cSJim Jagielski sal_uInt16 SvxAccessibleTextAdapter::GetTextLen( sal_uInt16 nParagraph ) const
462*b1cdbd2cSJim Jagielski {
463*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
464*b1cdbd2cSJim Jagielski 
465*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aIndex;
466*b1cdbd2cSJim Jagielski     aIndex.SetEEIndex( nParagraph, mrTextForwarder->GetTextLen( nParagraph ), *this );
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski     return static_cast< sal_uInt16 >(aIndex.GetIndex());
469*b1cdbd2cSJim Jagielski }
470*b1cdbd2cSJim Jagielski 
GetText(const ESelection & rSel) const471*b1cdbd2cSJim Jagielski String SvxAccessibleTextAdapter::GetText( const ESelection& rSel ) const
472*b1cdbd2cSJim Jagielski {
473*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aStartIndex;
476*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aEndIndex;
477*b1cdbd2cSJim Jagielski 
478*b1cdbd2cSJim Jagielski     aStartIndex.SetIndex( rSel.nStartPara, rSel.nStartPos, *this );
479*b1cdbd2cSJim Jagielski     aEndIndex.SetIndex( rSel.nEndPara, rSel.nEndPos, *this );
480*b1cdbd2cSJim Jagielski 
481*b1cdbd2cSJim Jagielski     // normalize selection
482*b1cdbd2cSJim Jagielski     if( rSel.nStartPara > rSel.nEndPara ||
483*b1cdbd2cSJim Jagielski         (rSel.nStartPara == rSel.nEndPara && rSel.nStartPos > rSel.nEndPos) )
484*b1cdbd2cSJim Jagielski     {
485*b1cdbd2cSJim Jagielski         ::std::swap( aStartIndex, aEndIndex );
486*b1cdbd2cSJim Jagielski     }
487*b1cdbd2cSJim Jagielski 
488*b1cdbd2cSJim Jagielski     String sStr = mrTextForwarder->GetText( MakeEESelection(aStartIndex, aEndIndex) );
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski     // trim field text, if necessary
491*b1cdbd2cSJim Jagielski     if( aStartIndex.InField() )
492*b1cdbd2cSJim Jagielski     {
493*b1cdbd2cSJim Jagielski         DBG_ASSERT(aStartIndex.GetFieldOffset() >= 0 &&
494*b1cdbd2cSJim Jagielski                    aStartIndex.GetFieldOffset() <= USHRT_MAX,
495*b1cdbd2cSJim Jagielski                    "SvxAccessibleTextIndex::GetText: index value overflow");
496*b1cdbd2cSJim Jagielski 
497*b1cdbd2cSJim Jagielski         sStr.Erase(0, static_cast< sal_uInt16 > (aStartIndex.GetFieldOffset()) );
498*b1cdbd2cSJim Jagielski     }
499*b1cdbd2cSJim Jagielski     if( aEndIndex.InField() && aEndIndex.GetFieldOffset() )
500*b1cdbd2cSJim Jagielski     {
501*b1cdbd2cSJim Jagielski         DBG_ASSERT(sStr.Len() - (aEndIndex.GetFieldLen() - aEndIndex.GetFieldOffset()) >= 0 &&
502*b1cdbd2cSJim Jagielski                    sStr.Len() - (aEndIndex.GetFieldLen() - aEndIndex.GetFieldOffset()) <= USHRT_MAX,
503*b1cdbd2cSJim Jagielski                    "SvxAccessibleTextIndex::GetText: index value overflow");
504*b1cdbd2cSJim Jagielski 
505*b1cdbd2cSJim Jagielski         sStr = sStr.Copy(0, static_cast< sal_uInt16 > (sStr.Len() - (aEndIndex.GetFieldLen() - aEndIndex.GetFieldOffset())) );
506*b1cdbd2cSJim Jagielski     }
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski     EBulletInfo aBulletInfo1 = GetBulletInfo( static_cast< sal_uInt16 >(aStartIndex.GetParagraph()) );
509*b1cdbd2cSJim Jagielski     EBulletInfo aBulletInfo2 = GetBulletInfo( static_cast< sal_uInt16 >(aEndIndex.GetParagraph()) );
510*b1cdbd2cSJim Jagielski 
511*b1cdbd2cSJim Jagielski     if( aEndIndex.InBullet() )
512*b1cdbd2cSJim Jagielski     {
513*b1cdbd2cSJim Jagielski         // append trailing bullet
514*b1cdbd2cSJim Jagielski         sStr += aBulletInfo2.aText;;
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski         DBG_ASSERT(sStr.Len() - (aEndIndex.GetBulletLen() - aEndIndex.GetBulletOffset()) >= 0 &&
517*b1cdbd2cSJim Jagielski                    sStr.Len() - (aEndIndex.GetBulletLen() - aEndIndex.GetBulletOffset()) <= USHRT_MAX,
518*b1cdbd2cSJim Jagielski                    "SvxAccessibleTextIndex::GetText: index value overflow");
519*b1cdbd2cSJim Jagielski 
520*b1cdbd2cSJim Jagielski         sStr = sStr.Copy(0, static_cast< sal_uInt16 > (sStr.Len() - (aEndIndex.GetBulletLen() - aEndIndex.GetBulletOffset())) );
521*b1cdbd2cSJim Jagielski     }
522*b1cdbd2cSJim Jagielski     else if( aStartIndex.GetParagraph() != aEndIndex.GetParagraph() &&
523*b1cdbd2cSJim Jagielski              HaveTextBullet( aEndIndex.GetParagraph() ) )
524*b1cdbd2cSJim Jagielski     {
525*b1cdbd2cSJim Jagielski         String sBullet = aBulletInfo2.aText;
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski         DBG_ASSERT(sBullet.Len() - (aEndIndex.GetBulletLen() - aEndIndex.GetBulletOffset()) >= 0 &&
528*b1cdbd2cSJim Jagielski                    sBullet.Len() - (aEndIndex.GetBulletLen() - aEndIndex.GetBulletOffset()) <= USHRT_MAX,
529*b1cdbd2cSJim Jagielski                    "SvxAccessibleTextIndex::GetText: index value overflow");
530*b1cdbd2cSJim Jagielski 
531*b1cdbd2cSJim Jagielski         sBullet = sBullet.Copy(0, static_cast< sal_uInt16 > (sBullet.Len() - (aEndIndex.GetBulletLen() - aEndIndex.GetBulletOffset())) );
532*b1cdbd2cSJim Jagielski 
533*b1cdbd2cSJim Jagielski         // insert bullet
534*b1cdbd2cSJim Jagielski         sStr.Insert( sBullet,
535*b1cdbd2cSJim Jagielski                      static_cast< sal_uInt16 > (GetTextLen(aStartIndex.GetParagraph()) - aStartIndex.GetIndex()) );
536*b1cdbd2cSJim Jagielski     }
537*b1cdbd2cSJim Jagielski 
538*b1cdbd2cSJim Jagielski     return sStr;
539*b1cdbd2cSJim Jagielski }
540*b1cdbd2cSJim Jagielski 
GetAttribs(const ESelection & rSel,sal_Bool bOnlyHardAttrib) const541*b1cdbd2cSJim Jagielski SfxItemSet SvxAccessibleTextAdapter::GetAttribs( const ESelection& rSel, sal_Bool bOnlyHardAttrib ) const
542*b1cdbd2cSJim Jagielski {
543*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aStartIndex;
546*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aEndIndex;
547*b1cdbd2cSJim Jagielski 
548*b1cdbd2cSJim Jagielski     aStartIndex.SetIndex( rSel.nStartPara, rSel.nStartPos, *this );
549*b1cdbd2cSJim Jagielski     aEndIndex.SetIndex( rSel.nEndPara, rSel.nEndPos, *this );
550*b1cdbd2cSJim Jagielski 
551*b1cdbd2cSJim Jagielski     return mrTextForwarder->GetAttribs( MakeEESelection(aStartIndex, aEndIndex),
552*b1cdbd2cSJim Jagielski                                         bOnlyHardAttrib );
553*b1cdbd2cSJim Jagielski }
554*b1cdbd2cSJim Jagielski 
GetParaAttribs(sal_uInt16 nPara) const555*b1cdbd2cSJim Jagielski SfxItemSet SvxAccessibleTextAdapter::GetParaAttribs( sal_uInt16 nPara ) const
556*b1cdbd2cSJim Jagielski {
557*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski     return mrTextForwarder->GetParaAttribs( nPara );
560*b1cdbd2cSJim Jagielski }
561*b1cdbd2cSJim Jagielski 
SetParaAttribs(sal_uInt16 nPara,const SfxItemSet & rSet)562*b1cdbd2cSJim Jagielski void SvxAccessibleTextAdapter::SetParaAttribs( sal_uInt16 nPara, const SfxItemSet& rSet )
563*b1cdbd2cSJim Jagielski {
564*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski     mrTextForwarder->SetParaAttribs( nPara, rSet );
567*b1cdbd2cSJim Jagielski }
568*b1cdbd2cSJim Jagielski 
RemoveAttribs(const ESelection &,sal_Bool,sal_uInt16)569*b1cdbd2cSJim Jagielski void SvxAccessibleTextAdapter::RemoveAttribs( const ESelection& , sal_Bool , sal_uInt16 )
570*b1cdbd2cSJim Jagielski {
571*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
572*b1cdbd2cSJim Jagielski }
573*b1cdbd2cSJim Jagielski 
GetPortions(sal_uInt16 nPara,SvUShorts & rList) const574*b1cdbd2cSJim Jagielski void SvxAccessibleTextAdapter::GetPortions( sal_uInt16 nPara, SvUShorts& rList ) const
575*b1cdbd2cSJim Jagielski {
576*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
577*b1cdbd2cSJim Jagielski 
578*b1cdbd2cSJim Jagielski     mrTextForwarder->GetPortions( nPara, rList );
579*b1cdbd2cSJim Jagielski }
580*b1cdbd2cSJim Jagielski 
GetItemState(const ESelection & rSel,sal_uInt16 nWhich) const581*b1cdbd2cSJim Jagielski sal_uInt16 SvxAccessibleTextAdapter::GetItemState( const ESelection& rSel, sal_uInt16 nWhich ) const
582*b1cdbd2cSJim Jagielski {
583*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
584*b1cdbd2cSJim Jagielski 
585*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aStartIndex;
586*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aEndIndex;
587*b1cdbd2cSJim Jagielski 
588*b1cdbd2cSJim Jagielski     aStartIndex.SetIndex( rSel.nStartPara, rSel.nStartPos, *this );
589*b1cdbd2cSJim Jagielski     aEndIndex.SetIndex( rSel.nEndPara, rSel.nEndPos, *this );
590*b1cdbd2cSJim Jagielski 
591*b1cdbd2cSJim Jagielski     return mrTextForwarder->GetItemState( MakeEESelection(aStartIndex, aEndIndex),
592*b1cdbd2cSJim Jagielski                                           nWhich );
593*b1cdbd2cSJim Jagielski }
594*b1cdbd2cSJim Jagielski 
GetItemState(sal_uInt16 nPara,sal_uInt16 nWhich) const595*b1cdbd2cSJim Jagielski sal_uInt16 SvxAccessibleTextAdapter::GetItemState( sal_uInt16 nPara, sal_uInt16 nWhich ) const
596*b1cdbd2cSJim Jagielski {
597*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
598*b1cdbd2cSJim Jagielski 
599*b1cdbd2cSJim Jagielski     return mrTextForwarder->GetItemState( nPara, nWhich );
600*b1cdbd2cSJim Jagielski }
601*b1cdbd2cSJim Jagielski 
QuickInsertText(const String & rText,const ESelection & rSel)602*b1cdbd2cSJim Jagielski void SvxAccessibleTextAdapter::QuickInsertText( const String& rText, const ESelection& rSel )
603*b1cdbd2cSJim Jagielski {
604*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
605*b1cdbd2cSJim Jagielski 
606*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aStartIndex;
607*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aEndIndex;
608*b1cdbd2cSJim Jagielski 
609*b1cdbd2cSJim Jagielski     aStartIndex.SetIndex( rSel.nStartPara, rSel.nStartPos, *this );
610*b1cdbd2cSJim Jagielski     aEndIndex.SetIndex( rSel.nEndPara, rSel.nEndPos, *this );
611*b1cdbd2cSJim Jagielski 
612*b1cdbd2cSJim Jagielski     mrTextForwarder->QuickInsertText( rText,
613*b1cdbd2cSJim Jagielski                                       MakeEESelection(aStartIndex, aEndIndex) );
614*b1cdbd2cSJim Jagielski }
615*b1cdbd2cSJim Jagielski 
QuickInsertField(const SvxFieldItem & rFld,const ESelection & rSel)616*b1cdbd2cSJim Jagielski void SvxAccessibleTextAdapter::QuickInsertField( const SvxFieldItem& rFld, const ESelection& rSel )
617*b1cdbd2cSJim Jagielski {
618*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
619*b1cdbd2cSJim Jagielski 
620*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aStartIndex;
621*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aEndIndex;
622*b1cdbd2cSJim Jagielski 
623*b1cdbd2cSJim Jagielski     aStartIndex.SetIndex( rSel.nStartPara, rSel.nStartPos, *this );
624*b1cdbd2cSJim Jagielski     aEndIndex.SetIndex( rSel.nEndPara, rSel.nEndPos, *this );
625*b1cdbd2cSJim Jagielski 
626*b1cdbd2cSJim Jagielski     mrTextForwarder->QuickInsertField( rFld,
627*b1cdbd2cSJim Jagielski                                        MakeEESelection(aStartIndex, aEndIndex) );
628*b1cdbd2cSJim Jagielski }
629*b1cdbd2cSJim Jagielski 
QuickSetAttribs(const SfxItemSet & rSet,const ESelection & rSel)630*b1cdbd2cSJim Jagielski void SvxAccessibleTextAdapter::QuickSetAttribs( const SfxItemSet& rSet, const ESelection& rSel )
631*b1cdbd2cSJim Jagielski {
632*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aStartIndex;
635*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aEndIndex;
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski     aStartIndex.SetIndex( rSel.nStartPara, rSel.nStartPos, *this );
638*b1cdbd2cSJim Jagielski     aEndIndex.SetIndex( rSel.nEndPara, rSel.nEndPos, *this );
639*b1cdbd2cSJim Jagielski 
640*b1cdbd2cSJim Jagielski     mrTextForwarder->QuickSetAttribs( rSet,
641*b1cdbd2cSJim Jagielski                                       MakeEESelection(aStartIndex, aEndIndex) );
642*b1cdbd2cSJim Jagielski }
643*b1cdbd2cSJim Jagielski 
QuickInsertLineBreak(const ESelection & rSel)644*b1cdbd2cSJim Jagielski void SvxAccessibleTextAdapter::QuickInsertLineBreak( const ESelection& rSel )
645*b1cdbd2cSJim Jagielski {
646*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
647*b1cdbd2cSJim Jagielski 
648*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aStartIndex;
649*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aEndIndex;
650*b1cdbd2cSJim Jagielski 
651*b1cdbd2cSJim Jagielski     aStartIndex.SetIndex( rSel.nStartPara, rSel.nStartPos, *this );
652*b1cdbd2cSJim Jagielski     aEndIndex.SetIndex( rSel.nEndPara, rSel.nEndPos, *this );
653*b1cdbd2cSJim Jagielski 
654*b1cdbd2cSJim Jagielski     mrTextForwarder->QuickInsertLineBreak( MakeEESelection(aStartIndex, aEndIndex) );
655*b1cdbd2cSJim Jagielski }
656*b1cdbd2cSJim Jagielski 
GetPool() const657*b1cdbd2cSJim Jagielski SfxItemPool* SvxAccessibleTextAdapter::GetPool() const
658*b1cdbd2cSJim Jagielski {
659*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
660*b1cdbd2cSJim Jagielski 
661*b1cdbd2cSJim Jagielski     return mrTextForwarder->GetPool();
662*b1cdbd2cSJim Jagielski }
663*b1cdbd2cSJim Jagielski 
CalcFieldValue(const SvxFieldItem & rField,sal_uInt16 nPara,sal_uInt16 nPos,Color * & rpTxtColor,Color * & rpFldColor)664*b1cdbd2cSJim Jagielski XubString SvxAccessibleTextAdapter::CalcFieldValue( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos, Color*& rpTxtColor, Color*& rpFldColor )
665*b1cdbd2cSJim Jagielski {
666*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
667*b1cdbd2cSJim Jagielski 
668*b1cdbd2cSJim Jagielski     return mrTextForwarder->CalcFieldValue( rField, nPara, nPos, rpTxtColor, rpFldColor );
669*b1cdbd2cSJim Jagielski }
670*b1cdbd2cSJim Jagielski 
FieldClicked(const SvxFieldItem & rField,sal_uInt16 nPara,xub_StrLen nPos)671*b1cdbd2cSJim Jagielski void SvxAccessibleTextAdapter::FieldClicked( const SvxFieldItem& rField, sal_uInt16 nPara, xub_StrLen nPos )
672*b1cdbd2cSJim Jagielski {
673*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
674*b1cdbd2cSJim Jagielski 
675*b1cdbd2cSJim Jagielski     mrTextForwarder->FieldClicked( rField, nPara, nPos );
676*b1cdbd2cSJim Jagielski }
677*b1cdbd2cSJim Jagielski 
CalcLogicalIndex(sal_uInt16 nPara,sal_uInt16 nEEIndex)678*b1cdbd2cSJim Jagielski sal_Int32 SvxAccessibleTextAdapter::CalcLogicalIndex( sal_uInt16 nPara, sal_uInt16 nEEIndex )
679*b1cdbd2cSJim Jagielski {
680*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
681*b1cdbd2cSJim Jagielski 
682*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aIndex;
683*b1cdbd2cSJim Jagielski     aIndex.SetEEIndex(nPara, nEEIndex, *mrTextForwarder);
684*b1cdbd2cSJim Jagielski     return aIndex.GetIndex();
685*b1cdbd2cSJim Jagielski }
686*b1cdbd2cSJim Jagielski 
CalcEditEngineIndex(sal_uInt16 nPara,sal_Int32 nLogicalIndex)687*b1cdbd2cSJim Jagielski sal_uInt16 SvxAccessibleTextAdapter::CalcEditEngineIndex( sal_uInt16 nPara, sal_Int32 nLogicalIndex )
688*b1cdbd2cSJim Jagielski {
689*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
690*b1cdbd2cSJim Jagielski 
691*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aIndex;
692*b1cdbd2cSJim Jagielski     aIndex.SetIndex(nPara, nLogicalIndex, *mrTextForwarder);
693*b1cdbd2cSJim Jagielski     return aIndex.GetEEIndex();
694*b1cdbd2cSJim Jagielski }
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski 
697*b1cdbd2cSJim Jagielski 
IsValid() const698*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextAdapter::IsValid() const
699*b1cdbd2cSJim Jagielski {
700*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
701*b1cdbd2cSJim Jagielski 
702*b1cdbd2cSJim Jagielski     if( mrTextForwarder )
703*b1cdbd2cSJim Jagielski         return mrTextForwarder->IsValid();
704*b1cdbd2cSJim Jagielski     else
705*b1cdbd2cSJim Jagielski         return sal_False;
706*b1cdbd2cSJim Jagielski }
707*b1cdbd2cSJim Jagielski 
GetLanguage(sal_uInt16 nPara,sal_uInt16 nPos) const708*b1cdbd2cSJim Jagielski LanguageType SvxAccessibleTextAdapter::GetLanguage( sal_uInt16 nPara, sal_uInt16 nPos ) const
709*b1cdbd2cSJim Jagielski {
710*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
711*b1cdbd2cSJim Jagielski 
712*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aIndex;
713*b1cdbd2cSJim Jagielski 
714*b1cdbd2cSJim Jagielski     aIndex.SetIndex( nPara, nPos, *this );
715*b1cdbd2cSJim Jagielski 
716*b1cdbd2cSJim Jagielski     return mrTextForwarder->GetLanguage( nPara, aIndex.GetEEIndex() );
717*b1cdbd2cSJim Jagielski }
718*b1cdbd2cSJim Jagielski 
GetFieldCount(sal_uInt16 nPara) const719*b1cdbd2cSJim Jagielski sal_uInt16 SvxAccessibleTextAdapter::GetFieldCount( sal_uInt16 nPara ) const
720*b1cdbd2cSJim Jagielski {
721*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
722*b1cdbd2cSJim Jagielski 
723*b1cdbd2cSJim Jagielski     return mrTextForwarder->GetFieldCount( nPara );
724*b1cdbd2cSJim Jagielski }
725*b1cdbd2cSJim Jagielski 
GetFieldInfo(sal_uInt16 nPara,sal_uInt16 nField) const726*b1cdbd2cSJim Jagielski EFieldInfo SvxAccessibleTextAdapter::GetFieldInfo( sal_uInt16 nPara, sal_uInt16 nField ) const
727*b1cdbd2cSJim Jagielski {
728*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
729*b1cdbd2cSJim Jagielski 
730*b1cdbd2cSJim Jagielski     return mrTextForwarder->GetFieldInfo( nPara, nField );
731*b1cdbd2cSJim Jagielski }
732*b1cdbd2cSJim Jagielski 
GetBulletInfo(sal_uInt16 nPara) const733*b1cdbd2cSJim Jagielski EBulletInfo SvxAccessibleTextAdapter::GetBulletInfo( sal_uInt16 nPara ) const
734*b1cdbd2cSJim Jagielski {
735*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
736*b1cdbd2cSJim Jagielski 
737*b1cdbd2cSJim Jagielski     return mrTextForwarder->GetBulletInfo( nPara );
738*b1cdbd2cSJim Jagielski }
SetUpdateModeForAcc(sal_Bool bUp)739*b1cdbd2cSJim Jagielski void	SvxAccessibleTextAdapter::SetUpdateModeForAcc( sal_Bool bUp)
740*b1cdbd2cSJim Jagielski {
741*b1cdbd2cSJim Jagielski 	return mrTextForwarder->SetUpdateModeForAcc( bUp );
742*b1cdbd2cSJim Jagielski }
GetUpdateModeForAcc() const743*b1cdbd2cSJim Jagielski sal_Bool	SvxAccessibleTextAdapter::GetUpdateModeForAcc( ) const
744*b1cdbd2cSJim Jagielski {
745*b1cdbd2cSJim Jagielski 	return mrTextForwarder->GetUpdateModeForAcc( );
746*b1cdbd2cSJim Jagielski }
GetCharBounds(sal_uInt16 nPara,sal_uInt16 nIndex) const747*b1cdbd2cSJim Jagielski Rectangle SvxAccessibleTextAdapter::GetCharBounds( sal_uInt16 nPara, sal_uInt16 nIndex ) const
748*b1cdbd2cSJim Jagielski {
749*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
750*b1cdbd2cSJim Jagielski 
751*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aIndex;
752*b1cdbd2cSJim Jagielski     aIndex.SetIndex( nPara, nIndex, *this );
753*b1cdbd2cSJim Jagielski 
754*b1cdbd2cSJim Jagielski     // preset if anything goes wrong below
755*b1cdbd2cSJim Jagielski     // n-th char in GetParagraphIndex's paragraph
756*b1cdbd2cSJim Jagielski     Rectangle aRect = mrTextForwarder->GetCharBounds( nPara, static_cast< sal_uInt16 >( aIndex.GetEEIndex() ) );
757*b1cdbd2cSJim Jagielski 
758*b1cdbd2cSJim Jagielski     if( aIndex.InBullet() )
759*b1cdbd2cSJim Jagielski     {
760*b1cdbd2cSJim Jagielski         EBulletInfo aBulletInfo = GetBulletInfo( nPara );
761*b1cdbd2cSJim Jagielski 
762*b1cdbd2cSJim Jagielski         OutputDevice* pOutDev = GetRefDevice();
763*b1cdbd2cSJim Jagielski 
764*b1cdbd2cSJim Jagielski         DBG_ASSERT(pOutDev!=NULL, "SvxAccessibleTextAdapter::GetCharBounds: No ref device");
765*b1cdbd2cSJim Jagielski 
766*b1cdbd2cSJim Jagielski         // preset if anything goes wrong below
767*b1cdbd2cSJim Jagielski         aRect = aBulletInfo.aBounds; // better than nothing
768*b1cdbd2cSJim Jagielski         if( pOutDev )
769*b1cdbd2cSJim Jagielski         {
770*b1cdbd2cSJim Jagielski             AccessibleStringWrap aStringWrap( *pOutDev, aBulletInfo.aFont, aBulletInfo.aText );
771*b1cdbd2cSJim Jagielski 
772*b1cdbd2cSJim Jagielski             if( aStringWrap.GetCharacterBounds( aIndex.GetBulletOffset(), aRect ) )
773*b1cdbd2cSJim Jagielski                 aRect.Move( aBulletInfo.aBounds.Left(), aBulletInfo.aBounds.Top() );
774*b1cdbd2cSJim Jagielski         }
775*b1cdbd2cSJim Jagielski     }
776*b1cdbd2cSJim Jagielski     else
777*b1cdbd2cSJim Jagielski     {
778*b1cdbd2cSJim Jagielski         // handle field content manually
779*b1cdbd2cSJim Jagielski         if( aIndex.InField() )
780*b1cdbd2cSJim Jagielski         {
781*b1cdbd2cSJim Jagielski             OutputDevice* pOutDev = GetRefDevice();
782*b1cdbd2cSJim Jagielski 
783*b1cdbd2cSJim Jagielski             DBG_ASSERT(pOutDev!=NULL, "SvxAccessibleTextAdapter::GetCharBounds: No ref device");
784*b1cdbd2cSJim Jagielski 
785*b1cdbd2cSJim Jagielski             if( pOutDev )
786*b1cdbd2cSJim Jagielski             {
787*b1cdbd2cSJim Jagielski                 ESelection aSel = MakeEESelection( aIndex );
788*b1cdbd2cSJim Jagielski 
789*b1cdbd2cSJim Jagielski                 SvxFont aFont = EditEngine::CreateSvxFontFromItemSet( mrTextForwarder->GetAttribs( aSel ) );
790*b1cdbd2cSJim Jagielski                 AccessibleStringWrap aStringWrap( *pOutDev,
791*b1cdbd2cSJim Jagielski                                                   aFont,
792*b1cdbd2cSJim Jagielski                                                   mrTextForwarder->GetText( aSel ) );
793*b1cdbd2cSJim Jagielski 
794*b1cdbd2cSJim Jagielski                 Rectangle aStartRect = mrTextForwarder->GetCharBounds( nPara, static_cast< sal_uInt16 >( aIndex.GetEEIndex() ) );
795*b1cdbd2cSJim Jagielski 
796*b1cdbd2cSJim Jagielski                 if( !aStringWrap.GetCharacterBounds( aIndex.GetFieldOffset(), aRect ) )
797*b1cdbd2cSJim Jagielski                     aRect = aStartRect;
798*b1cdbd2cSJim Jagielski                 else
799*b1cdbd2cSJim Jagielski                     aRect.Move( aStartRect.Left(), aStartRect.Top() );
800*b1cdbd2cSJim Jagielski             }
801*b1cdbd2cSJim Jagielski         }
802*b1cdbd2cSJim Jagielski     }
803*b1cdbd2cSJim Jagielski 
804*b1cdbd2cSJim Jagielski     return aRect;
805*b1cdbd2cSJim Jagielski }
806*b1cdbd2cSJim Jagielski 
GetParaBounds(sal_uInt16 nPara) const807*b1cdbd2cSJim Jagielski Rectangle SvxAccessibleTextAdapter::GetParaBounds( sal_uInt16 nPara ) const
808*b1cdbd2cSJim Jagielski {
809*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
810*b1cdbd2cSJim Jagielski 
811*b1cdbd2cSJim Jagielski     EBulletInfo aBulletInfo = GetBulletInfo( nPara );
812*b1cdbd2cSJim Jagielski 
813*b1cdbd2cSJim Jagielski     if( aBulletInfo.nParagraph != EE_PARA_NOT_FOUND &&
814*b1cdbd2cSJim Jagielski         aBulletInfo.bVisible &&
815*b1cdbd2cSJim Jagielski         aBulletInfo.nType != SVX_NUM_BITMAP )
816*b1cdbd2cSJim Jagielski     {
817*b1cdbd2cSJim Jagielski         // include bullet in para bounding box
818*b1cdbd2cSJim Jagielski         Rectangle aRect( mrTextForwarder->GetParaBounds( nPara ) );
819*b1cdbd2cSJim Jagielski 
820*b1cdbd2cSJim Jagielski         aRect.Union( aBulletInfo.aBounds );
821*b1cdbd2cSJim Jagielski 
822*b1cdbd2cSJim Jagielski         return aRect;
823*b1cdbd2cSJim Jagielski     }
824*b1cdbd2cSJim Jagielski 
825*b1cdbd2cSJim Jagielski     return mrTextForwarder->GetParaBounds( nPara );
826*b1cdbd2cSJim Jagielski }
827*b1cdbd2cSJim Jagielski 
GetMapMode() const828*b1cdbd2cSJim Jagielski MapMode SvxAccessibleTextAdapter::GetMapMode() const
829*b1cdbd2cSJim Jagielski {
830*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
831*b1cdbd2cSJim Jagielski 
832*b1cdbd2cSJim Jagielski     return mrTextForwarder->GetMapMode();
833*b1cdbd2cSJim Jagielski }
834*b1cdbd2cSJim Jagielski 
GetRefDevice() const835*b1cdbd2cSJim Jagielski OutputDevice* SvxAccessibleTextAdapter::GetRefDevice() const
836*b1cdbd2cSJim Jagielski {
837*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
838*b1cdbd2cSJim Jagielski 
839*b1cdbd2cSJim Jagielski     return mrTextForwarder->GetRefDevice();
840*b1cdbd2cSJim Jagielski }
841*b1cdbd2cSJim Jagielski 
GetIndexAtPoint(const Point & rPoint,sal_uInt16 & nPara,sal_uInt16 & nIndex) const842*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextAdapter::GetIndexAtPoint( const Point& rPoint, sal_uInt16& nPara, sal_uInt16& nIndex ) const
843*b1cdbd2cSJim Jagielski {
844*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
845*b1cdbd2cSJim Jagielski 
846*b1cdbd2cSJim Jagielski     if( !mrTextForwarder->GetIndexAtPoint( rPoint, nPara, nIndex ) )
847*b1cdbd2cSJim Jagielski         return sal_False;
848*b1cdbd2cSJim Jagielski 
849*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aIndex;
850*b1cdbd2cSJim Jagielski     aIndex.SetEEIndex(nPara, nIndex, *this);
851*b1cdbd2cSJim Jagielski 
852*b1cdbd2cSJim Jagielski     DBG_ASSERT(aIndex.GetIndex() >= 0 && aIndex.GetIndex() <= USHRT_MAX,
853*b1cdbd2cSJim Jagielski                "SvxAccessibleTextIndex::SetIndex: index value overflow");
854*b1cdbd2cSJim Jagielski 
855*b1cdbd2cSJim Jagielski     nIndex = static_cast< sal_uInt16 > (aIndex.GetIndex());
856*b1cdbd2cSJim Jagielski 
857*b1cdbd2cSJim Jagielski     EBulletInfo aBulletInfo = GetBulletInfo( nPara );
858*b1cdbd2cSJim Jagielski 
859*b1cdbd2cSJim Jagielski     // any text bullets?
860*b1cdbd2cSJim Jagielski     if( aBulletInfo.nParagraph != EE_PARA_NOT_FOUND &&
861*b1cdbd2cSJim Jagielski         aBulletInfo.bVisible &&
862*b1cdbd2cSJim Jagielski         aBulletInfo.nType != SVX_NUM_BITMAP )
863*b1cdbd2cSJim Jagielski     {
864*b1cdbd2cSJim Jagielski         if( aBulletInfo.aBounds.IsInside( rPoint) )
865*b1cdbd2cSJim Jagielski         {
866*b1cdbd2cSJim Jagielski             OutputDevice* pOutDev = GetRefDevice();
867*b1cdbd2cSJim Jagielski 
868*b1cdbd2cSJim Jagielski             DBG_ASSERT(pOutDev!=NULL, "SvxAccessibleTextAdapter::GetIndexAtPoint: No ref device");
869*b1cdbd2cSJim Jagielski 
870*b1cdbd2cSJim Jagielski             if( !pOutDev )
871*b1cdbd2cSJim Jagielski                 return sal_False;
872*b1cdbd2cSJim Jagielski 
873*b1cdbd2cSJim Jagielski             AccessibleStringWrap aStringWrap( *pOutDev, aBulletInfo.aFont, aBulletInfo.aText );
874*b1cdbd2cSJim Jagielski 
875*b1cdbd2cSJim Jagielski             Point aPoint = rPoint;
876*b1cdbd2cSJim Jagielski             aPoint.Move( -aBulletInfo.aBounds.Left(), -aBulletInfo.aBounds.Top() );
877*b1cdbd2cSJim Jagielski 
878*b1cdbd2cSJim Jagielski             DBG_ASSERT(aStringWrap.GetIndexAtPoint( aPoint ) >= 0 &&
879*b1cdbd2cSJim Jagielski                        aStringWrap.GetIndexAtPoint( aPoint ) <= USHRT_MAX,
880*b1cdbd2cSJim Jagielski                        "SvxAccessibleTextIndex::SetIndex: index value overflow");
881*b1cdbd2cSJim Jagielski 
882*b1cdbd2cSJim Jagielski             nIndex = static_cast< sal_uInt16 > (aStringWrap.GetIndexAtPoint( aPoint ));
883*b1cdbd2cSJim Jagielski             return sal_True;
884*b1cdbd2cSJim Jagielski         }
885*b1cdbd2cSJim Jagielski     }
886*b1cdbd2cSJim Jagielski 
887*b1cdbd2cSJim Jagielski     if( aIndex.InField() )
888*b1cdbd2cSJim Jagielski     {
889*b1cdbd2cSJim Jagielski         OutputDevice* pOutDev = GetRefDevice();
890*b1cdbd2cSJim Jagielski 
891*b1cdbd2cSJim Jagielski         DBG_ASSERT(pOutDev!=NULL, "SvxAccessibleTextAdapter::GetIndexAtPoint: No ref device");
892*b1cdbd2cSJim Jagielski 
893*b1cdbd2cSJim Jagielski         if( !pOutDev )
894*b1cdbd2cSJim Jagielski             return sal_False;
895*b1cdbd2cSJim Jagielski 
896*b1cdbd2cSJim Jagielski         ESelection aSelection = MakeEESelection( aIndex );
897*b1cdbd2cSJim Jagielski         SvxFont aFont = EditEngine::CreateSvxFontFromItemSet( mrTextForwarder->GetAttribs( aSelection ) );
898*b1cdbd2cSJim Jagielski         AccessibleStringWrap aStringWrap( *pOutDev,
899*b1cdbd2cSJim Jagielski                                           aFont,
900*b1cdbd2cSJim Jagielski                                           mrTextForwarder->GetText( aSelection ) );
901*b1cdbd2cSJim Jagielski 
902*b1cdbd2cSJim Jagielski         Rectangle aRect = mrTextForwarder->GetCharBounds( nPara, aIndex.GetEEIndex() );
903*b1cdbd2cSJim Jagielski         Point aPoint = rPoint;
904*b1cdbd2cSJim Jagielski         aPoint.Move( -aRect.Left(), -aRect.Top() );
905*b1cdbd2cSJim Jagielski 
906*b1cdbd2cSJim Jagielski         DBG_ASSERT(aIndex.GetIndex() + aStringWrap.GetIndexAtPoint( rPoint ) >= 0 &&
907*b1cdbd2cSJim Jagielski                    aIndex.GetIndex() + aStringWrap.GetIndexAtPoint( rPoint ) <= USHRT_MAX,
908*b1cdbd2cSJim Jagielski                    "SvxAccessibleTextIndex::SetIndex: index value overflow");
909*b1cdbd2cSJim Jagielski 
910*b1cdbd2cSJim Jagielski         nIndex = static_cast< sal_uInt16 >(aIndex.GetIndex() + aStringWrap.GetIndexAtPoint( aPoint ));
911*b1cdbd2cSJim Jagielski         return sal_True;
912*b1cdbd2cSJim Jagielski     }
913*b1cdbd2cSJim Jagielski 
914*b1cdbd2cSJim Jagielski     return sal_True;
915*b1cdbd2cSJim Jagielski }
916*b1cdbd2cSJim Jagielski 
GetWordIndices(sal_uInt16 nPara,sal_uInt16 nIndex,sal_uInt16 & nStart,sal_uInt16 & nEnd) const917*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextAdapter::GetWordIndices( sal_uInt16 nPara, sal_uInt16 nIndex, sal_uInt16& nStart, sal_uInt16& nEnd ) const
918*b1cdbd2cSJim Jagielski {
919*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
920*b1cdbd2cSJim Jagielski 
921*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aIndex;
922*b1cdbd2cSJim Jagielski     aIndex.SetIndex(nPara, nIndex, *this);
923*b1cdbd2cSJim Jagielski     nIndex = aIndex.GetEEIndex();
924*b1cdbd2cSJim Jagielski 
925*b1cdbd2cSJim Jagielski     if( aIndex.InBullet() )
926*b1cdbd2cSJim Jagielski     {
927*b1cdbd2cSJim Jagielski         DBG_ASSERT(aIndex.GetBulletLen() >= 0 &&
928*b1cdbd2cSJim Jagielski                    aIndex.GetBulletLen() <= USHRT_MAX,
929*b1cdbd2cSJim Jagielski                    "SvxAccessibleTextIndex::SetIndex: index value overflow");
930*b1cdbd2cSJim Jagielski 
931*b1cdbd2cSJim Jagielski         // always treat bullet as separate word
932*b1cdbd2cSJim Jagielski         nStart = 0;
933*b1cdbd2cSJim Jagielski         nEnd = static_cast< sal_uInt16 > (aIndex.GetBulletLen());
934*b1cdbd2cSJim Jagielski 
935*b1cdbd2cSJim Jagielski         return sal_True;
936*b1cdbd2cSJim Jagielski     }
937*b1cdbd2cSJim Jagielski 
938*b1cdbd2cSJim Jagielski     if( aIndex.InField() )
939*b1cdbd2cSJim Jagielski     {
940*b1cdbd2cSJim Jagielski         DBG_ASSERT(aIndex.GetIndex() - aIndex.GetFieldOffset() >= 0 &&
941*b1cdbd2cSJim Jagielski                    aIndex.GetIndex() - aIndex.GetFieldOffset() <= USHRT_MAX &&
942*b1cdbd2cSJim Jagielski                    nStart + aIndex.GetFieldLen() >= 0 &&
943*b1cdbd2cSJim Jagielski                    nStart + aIndex.GetFieldLen() <= USHRT_MAX,
944*b1cdbd2cSJim Jagielski                    "SvxAccessibleTextIndex::SetIndex: index value overflow");
945*b1cdbd2cSJim Jagielski 
946*b1cdbd2cSJim Jagielski         // always treat field as separate word
947*b1cdbd2cSJim Jagielski         // TODO: to circumvent this, _we_ would have to do the break iterator stuff!
948*b1cdbd2cSJim Jagielski         nStart = static_cast< sal_uInt16 > (aIndex.GetIndex() - aIndex.GetFieldOffset());
949*b1cdbd2cSJim Jagielski         nEnd = static_cast< sal_uInt16 > (nStart + aIndex.GetFieldLen());
950*b1cdbd2cSJim Jagielski 
951*b1cdbd2cSJim Jagielski         return sal_True;
952*b1cdbd2cSJim Jagielski     }
953*b1cdbd2cSJim Jagielski 
954*b1cdbd2cSJim Jagielski     if( !mrTextForwarder->GetWordIndices( nPara, nIndex, nStart, nEnd ) )
955*b1cdbd2cSJim Jagielski         return sal_False;
956*b1cdbd2cSJim Jagielski 
957*b1cdbd2cSJim Jagielski     aIndex.SetEEIndex( nPara, nStart, *this );
958*b1cdbd2cSJim Jagielski     DBG_ASSERT(aIndex.GetIndex() >= 0 &&
959*b1cdbd2cSJim Jagielski                aIndex.GetIndex() <= USHRT_MAX,
960*b1cdbd2cSJim Jagielski                "SvxAccessibleTextIndex::SetIndex: index value overflow");
961*b1cdbd2cSJim Jagielski     nStart = static_cast< sal_uInt16 > (aIndex.GetIndex());
962*b1cdbd2cSJim Jagielski 
963*b1cdbd2cSJim Jagielski     aIndex.SetEEIndex( nPara, nEnd, *this );
964*b1cdbd2cSJim Jagielski     DBG_ASSERT(aIndex.GetIndex() >= 0 &&
965*b1cdbd2cSJim Jagielski                aIndex.GetIndex() <= USHRT_MAX,
966*b1cdbd2cSJim Jagielski                "SvxAccessibleTextIndex::SetIndex: index value overflow");
967*b1cdbd2cSJim Jagielski     nEnd = static_cast< sal_uInt16 > (aIndex.GetIndex());
968*b1cdbd2cSJim Jagielski 
969*b1cdbd2cSJim Jagielski     return sal_True;
970*b1cdbd2cSJim Jagielski }
GetAttributeRun(sal_uInt16 & nStartIndex,sal_uInt16 & nEndIndex,sal_uInt16 nPara,sal_uInt16 nIndex,sal_Bool) const971*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextAdapter::GetAttributeRun( sal_uInt16& nStartIndex, sal_uInt16& nEndIndex, sal_uInt16 nPara, sal_uInt16 nIndex, sal_Bool /* bInCell */) const
972*b1cdbd2cSJim Jagielski {
973*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
974*b1cdbd2cSJim Jagielski 
975*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aIndex;
976*b1cdbd2cSJim Jagielski     aIndex.SetIndex(nPara, nIndex, *this);
977*b1cdbd2cSJim Jagielski     nIndex = aIndex.GetEEIndex();
978*b1cdbd2cSJim Jagielski 
979*b1cdbd2cSJim Jagielski     if( aIndex.InBullet() )
980*b1cdbd2cSJim Jagielski     {
981*b1cdbd2cSJim Jagielski         DBG_ASSERT(aIndex.GetBulletLen() >= 0 &&
982*b1cdbd2cSJim Jagielski                    aIndex.GetBulletLen() <= USHRT_MAX,
983*b1cdbd2cSJim Jagielski                    "SvxAccessibleTextIndex::SetIndex: index value overflow");
984*b1cdbd2cSJim Jagielski 
985*b1cdbd2cSJim Jagielski         // always treat bullet as distinct attribute
986*b1cdbd2cSJim Jagielski         nStartIndex = 0;
987*b1cdbd2cSJim Jagielski         nEndIndex = static_cast< sal_uInt16 > (aIndex.GetBulletLen());
988*b1cdbd2cSJim Jagielski 
989*b1cdbd2cSJim Jagielski         return sal_True;
990*b1cdbd2cSJim Jagielski     }
991*b1cdbd2cSJim Jagielski 
992*b1cdbd2cSJim Jagielski     if( aIndex.InField() )
993*b1cdbd2cSJim Jagielski     {
994*b1cdbd2cSJim Jagielski         DBG_ASSERT(aIndex.GetIndex() - aIndex.GetFieldOffset() >= 0 &&
995*b1cdbd2cSJim Jagielski                    aIndex.GetIndex() - aIndex.GetFieldOffset() <= USHRT_MAX,
996*b1cdbd2cSJim Jagielski                    "SvxAccessibleTextIndex::SetIndex: index value overflow");
997*b1cdbd2cSJim Jagielski 
998*b1cdbd2cSJim Jagielski         // always treat field as distinct attribute
999*b1cdbd2cSJim Jagielski         nStartIndex = static_cast< sal_uInt16 > (aIndex.GetIndex() - aIndex.GetFieldOffset());
1000*b1cdbd2cSJim Jagielski         nEndIndex = static_cast< sal_uInt16 > (nStartIndex + aIndex.GetFieldLen());
1001*b1cdbd2cSJim Jagielski 
1002*b1cdbd2cSJim Jagielski         return sal_True;
1003*b1cdbd2cSJim Jagielski     }
1004*b1cdbd2cSJim Jagielski 
1005*b1cdbd2cSJim Jagielski     if( !mrTextForwarder->GetAttributeRun( nStartIndex, nEndIndex, nPara, nIndex ) )
1006*b1cdbd2cSJim Jagielski         return sal_False;
1007*b1cdbd2cSJim Jagielski 
1008*b1cdbd2cSJim Jagielski     aIndex.SetEEIndex( nPara, nStartIndex, *this );
1009*b1cdbd2cSJim Jagielski     DBG_ASSERT(aIndex.GetIndex() >= 0 &&
1010*b1cdbd2cSJim Jagielski                aIndex.GetIndex() <= USHRT_MAX,
1011*b1cdbd2cSJim Jagielski                "SvxAccessibleTextIndex::SetIndex: index value overflow");
1012*b1cdbd2cSJim Jagielski     nStartIndex = static_cast< sal_uInt16 > (aIndex.GetIndex());
1013*b1cdbd2cSJim Jagielski 
1014*b1cdbd2cSJim Jagielski     aIndex.SetEEIndex( nPara, nEndIndex, *this );
1015*b1cdbd2cSJim Jagielski     DBG_ASSERT(aIndex.GetIndex() >= 0 &&
1016*b1cdbd2cSJim Jagielski                aIndex.GetIndex() <= USHRT_MAX,
1017*b1cdbd2cSJim Jagielski                "SvxAccessibleTextIndex::SetIndex: index value overflow");
1018*b1cdbd2cSJim Jagielski     nEndIndex = static_cast< sal_uInt16 > (aIndex.GetIndex());
1019*b1cdbd2cSJim Jagielski 
1020*b1cdbd2cSJim Jagielski     return sal_True;
1021*b1cdbd2cSJim Jagielski }
1022*b1cdbd2cSJim Jagielski 
GetLineCount(sal_uInt16 nPara) const1023*b1cdbd2cSJim Jagielski sal_uInt16 SvxAccessibleTextAdapter::GetLineCount( sal_uInt16 nPara ) const
1024*b1cdbd2cSJim Jagielski {
1025*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
1026*b1cdbd2cSJim Jagielski 
1027*b1cdbd2cSJim Jagielski     return mrTextForwarder->GetLineCount( nPara );
1028*b1cdbd2cSJim Jagielski }
1029*b1cdbd2cSJim Jagielski 
GetLineLen(sal_uInt16 nPara,sal_uInt16 nLine) const1030*b1cdbd2cSJim Jagielski sal_uInt16 SvxAccessibleTextAdapter::GetLineLen( sal_uInt16 nPara, sal_uInt16 nLine ) const
1031*b1cdbd2cSJim Jagielski {
1032*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
1033*b1cdbd2cSJim Jagielski 
1034*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aStartIndex;
1035*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aEndIndex;
1036*b1cdbd2cSJim Jagielski     sal_uInt16 nCurrLine;
1037*b1cdbd2cSJim Jagielski     sal_uInt16 nCurrIndex, nLastIndex;
1038*b1cdbd2cSJim Jagielski     for( nCurrLine=0, nCurrIndex=0, nLastIndex=0; nCurrLine<=nLine; ++nCurrLine )
1039*b1cdbd2cSJim Jagielski     {
1040*b1cdbd2cSJim Jagielski         nLastIndex = nCurrIndex;
1041*b1cdbd2cSJim Jagielski         nCurrIndex =
1042*b1cdbd2cSJim Jagielski             nCurrIndex + mrTextForwarder->GetLineLen( nPara, nCurrLine );
1043*b1cdbd2cSJim Jagielski     }
1044*b1cdbd2cSJim Jagielski 
1045*b1cdbd2cSJim Jagielski     aEndIndex.SetEEIndex( nPara, nCurrIndex, *this );
1046*b1cdbd2cSJim Jagielski     if( nLine > 0 )
1047*b1cdbd2cSJim Jagielski     {
1048*b1cdbd2cSJim Jagielski         aStartIndex.SetEEIndex( nPara, nLastIndex, *this );
1049*b1cdbd2cSJim Jagielski 
1050*b1cdbd2cSJim Jagielski         return static_cast< sal_uInt16 >(aEndIndex.GetIndex() - aStartIndex.GetIndex());
1051*b1cdbd2cSJim Jagielski     }
1052*b1cdbd2cSJim Jagielski     else
1053*b1cdbd2cSJim Jagielski         return static_cast< sal_uInt16 >(aEndIndex.GetIndex());
1054*b1cdbd2cSJim Jagielski }
1055*b1cdbd2cSJim Jagielski 
GetLineBoundaries(sal_uInt16 & rStart,sal_uInt16 & rEnd,sal_uInt16 nParagraph,sal_uInt16 nLine) const1056*b1cdbd2cSJim Jagielski void SvxAccessibleTextAdapter::GetLineBoundaries( /*out*/sal_uInt16 &rStart, /*out*/sal_uInt16 &rEnd, sal_uInt16 nParagraph, sal_uInt16 nLine ) const
1057*b1cdbd2cSJim Jagielski {
1058*b1cdbd2cSJim Jagielski     mrTextForwarder->GetLineBoundaries( rStart, rEnd, nParagraph, nLine );
1059*b1cdbd2cSJim Jagielski }
1060*b1cdbd2cSJim Jagielski 
GetLineNumberAtIndex(sal_uInt16 nPara,sal_uInt16 nIndex) const1061*b1cdbd2cSJim Jagielski sal_uInt16 SvxAccessibleTextAdapter::GetLineNumberAtIndex( sal_uInt16 nPara, sal_uInt16 nIndex ) const
1062*b1cdbd2cSJim Jagielski {
1063*b1cdbd2cSJim Jagielski     return mrTextForwarder->GetLineNumberAtIndex( nPara, nIndex );
1064*b1cdbd2cSJim Jagielski }
1065*b1cdbd2cSJim Jagielski 
Delete(const ESelection & rSel)1066*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextAdapter::Delete( const ESelection& rSel )
1067*b1cdbd2cSJim Jagielski {
1068*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
1069*b1cdbd2cSJim Jagielski 
1070*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aStartIndex;
1071*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aEndIndex;
1072*b1cdbd2cSJim Jagielski 
1073*b1cdbd2cSJim Jagielski     aStartIndex.SetIndex( rSel.nStartPara, rSel.nStartPos, *this );
1074*b1cdbd2cSJim Jagielski     aEndIndex.SetIndex( rSel.nEndPara, rSel.nEndPos, *this );
1075*b1cdbd2cSJim Jagielski 
1076*b1cdbd2cSJim Jagielski     return mrTextForwarder->Delete( MakeEESelection(aStartIndex, aEndIndex ) );
1077*b1cdbd2cSJim Jagielski }
1078*b1cdbd2cSJim Jagielski 
InsertText(const String & rStr,const ESelection & rSel)1079*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextAdapter::InsertText( const String& rStr, const ESelection& rSel )
1080*b1cdbd2cSJim Jagielski {
1081*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
1082*b1cdbd2cSJim Jagielski 
1083*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aStartIndex;
1084*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aEndIndex;
1085*b1cdbd2cSJim Jagielski 
1086*b1cdbd2cSJim Jagielski     aStartIndex.SetIndex( rSel.nStartPara, rSel.nStartPos, *this );
1087*b1cdbd2cSJim Jagielski     aEndIndex.SetIndex( rSel.nEndPara, rSel.nEndPos, *this );
1088*b1cdbd2cSJim Jagielski 
1089*b1cdbd2cSJim Jagielski     return mrTextForwarder->InsertText( rStr, MakeEESelection(aStartIndex, aEndIndex) );
1090*b1cdbd2cSJim Jagielski }
1091*b1cdbd2cSJim Jagielski 
QuickFormatDoc(sal_Bool bFull)1092*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextAdapter::QuickFormatDoc( sal_Bool bFull )
1093*b1cdbd2cSJim Jagielski {
1094*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
1095*b1cdbd2cSJim Jagielski 
1096*b1cdbd2cSJim Jagielski     return mrTextForwarder->QuickFormatDoc( bFull );
1097*b1cdbd2cSJim Jagielski }
1098*b1cdbd2cSJim Jagielski 
GetDepth(sal_uInt16 nPara) const1099*b1cdbd2cSJim Jagielski sal_Int16 SvxAccessibleTextAdapter::GetDepth( sal_uInt16 nPara ) const
1100*b1cdbd2cSJim Jagielski {
1101*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
1102*b1cdbd2cSJim Jagielski 
1103*b1cdbd2cSJim Jagielski     return mrTextForwarder->GetDepth( nPara );
1104*b1cdbd2cSJim Jagielski }
1105*b1cdbd2cSJim Jagielski 
SetDepth(sal_uInt16 nPara,sal_Int16 nNewDepth)1106*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextAdapter::SetDepth( sal_uInt16 nPara, sal_Int16 nNewDepth )
1107*b1cdbd2cSJim Jagielski {
1108*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
1109*b1cdbd2cSJim Jagielski 
1110*b1cdbd2cSJim Jagielski     return mrTextForwarder->SetDepth( nPara, nNewDepth );
1111*b1cdbd2cSJim Jagielski }
1112*b1cdbd2cSJim Jagielski 
SetForwarder(SvxTextForwarder & rForwarder)1113*b1cdbd2cSJim Jagielski void SvxAccessibleTextAdapter::SetForwarder( SvxTextForwarder& rForwarder )
1114*b1cdbd2cSJim Jagielski {
1115*b1cdbd2cSJim Jagielski     mrTextForwarder = &rForwarder;
1116*b1cdbd2cSJim Jagielski }
1117*b1cdbd2cSJim Jagielski 
HaveImageBullet(sal_uInt16 nPara) const1118*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextAdapter::HaveImageBullet( sal_uInt16 nPara ) const
1119*b1cdbd2cSJim Jagielski {
1120*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
1121*b1cdbd2cSJim Jagielski 
1122*b1cdbd2cSJim Jagielski     EBulletInfo aBulletInfo = GetBulletInfo( nPara );
1123*b1cdbd2cSJim Jagielski 
1124*b1cdbd2cSJim Jagielski     if( aBulletInfo.nParagraph != EE_PARA_NOT_FOUND &&
1125*b1cdbd2cSJim Jagielski         aBulletInfo.bVisible &&
1126*b1cdbd2cSJim Jagielski         aBulletInfo.nType == SVX_NUM_BITMAP )
1127*b1cdbd2cSJim Jagielski     {
1128*b1cdbd2cSJim Jagielski         return sal_True;
1129*b1cdbd2cSJim Jagielski     }
1130*b1cdbd2cSJim Jagielski     else
1131*b1cdbd2cSJim Jagielski     {
1132*b1cdbd2cSJim Jagielski         return sal_False;
1133*b1cdbd2cSJim Jagielski     }
1134*b1cdbd2cSJim Jagielski }
1135*b1cdbd2cSJim Jagielski 
HaveTextBullet(sal_uInt16 nPara) const1136*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextAdapter::HaveTextBullet( sal_uInt16 nPara ) const
1137*b1cdbd2cSJim Jagielski {
1138*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
1139*b1cdbd2cSJim Jagielski 
1140*b1cdbd2cSJim Jagielski     EBulletInfo aBulletInfo = GetBulletInfo( nPara );
1141*b1cdbd2cSJim Jagielski 
1142*b1cdbd2cSJim Jagielski     if( aBulletInfo.nParagraph != EE_PARA_NOT_FOUND &&
1143*b1cdbd2cSJim Jagielski         aBulletInfo.bVisible &&
1144*b1cdbd2cSJim Jagielski         aBulletInfo.nType != SVX_NUM_BITMAP )
1145*b1cdbd2cSJim Jagielski     {
1146*b1cdbd2cSJim Jagielski         return sal_True;
1147*b1cdbd2cSJim Jagielski     }
1148*b1cdbd2cSJim Jagielski     else
1149*b1cdbd2cSJim Jagielski     {
1150*b1cdbd2cSJim Jagielski         return sal_False;
1151*b1cdbd2cSJim Jagielski     }
1152*b1cdbd2cSJim Jagielski }
1153*b1cdbd2cSJim Jagielski 
IsEditable(const ESelection & rSel)1154*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextAdapter::IsEditable( const ESelection& rSel )
1155*b1cdbd2cSJim Jagielski {
1156*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrTextForwarder, "SvxAccessibleTextAdapter: no forwarder");
1157*b1cdbd2cSJim Jagielski 
1158*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aStartIndex;
1159*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aEndIndex;
1160*b1cdbd2cSJim Jagielski 
1161*b1cdbd2cSJim Jagielski     aStartIndex.SetIndex( rSel.nStartPara, rSel.nStartPos, *this );
1162*b1cdbd2cSJim Jagielski     aEndIndex.SetIndex( rSel.nEndPara, rSel.nEndPos, *this );
1163*b1cdbd2cSJim Jagielski 
1164*b1cdbd2cSJim Jagielski     // normalize selection
1165*b1cdbd2cSJim Jagielski     if( rSel.nStartPara > rSel.nEndPara ||
1166*b1cdbd2cSJim Jagielski         (rSel.nStartPara == rSel.nEndPara && rSel.nStartPos > rSel.nEndPos) )
1167*b1cdbd2cSJim Jagielski     {
1168*b1cdbd2cSJim Jagielski         ::std::swap( aStartIndex, aEndIndex );
1169*b1cdbd2cSJim Jagielski     }
1170*b1cdbd2cSJim Jagielski 
1171*b1cdbd2cSJim Jagielski     return aStartIndex.IsEditableRange( aEndIndex );
1172*b1cdbd2cSJim Jagielski }
1173*b1cdbd2cSJim Jagielski 
GetEmptyItemSetPtr()1174*b1cdbd2cSJim Jagielski const SfxItemSet * SvxAccessibleTextAdapter::GetEmptyItemSetPtr()
1175*b1cdbd2cSJim Jagielski {
1176*b1cdbd2cSJim Jagielski     DBG_ERROR( "not implemented" );
1177*b1cdbd2cSJim Jagielski     return 0;
1178*b1cdbd2cSJim Jagielski }
1179*b1cdbd2cSJim Jagielski 
AppendParagraph()1180*b1cdbd2cSJim Jagielski void SvxAccessibleTextAdapter::AppendParagraph()
1181*b1cdbd2cSJim Jagielski {
1182*b1cdbd2cSJim Jagielski     DBG_ERROR( "not implemented" );
1183*b1cdbd2cSJim Jagielski }
1184*b1cdbd2cSJim Jagielski 
AppendTextPortion(sal_uInt16,const String &,const SfxItemSet &)1185*b1cdbd2cSJim Jagielski xub_StrLen SvxAccessibleTextAdapter::AppendTextPortion( sal_uInt16, const String &, const SfxItemSet & )
1186*b1cdbd2cSJim Jagielski {
1187*b1cdbd2cSJim Jagielski     DBG_ERROR( "not implemented" );
1188*b1cdbd2cSJim Jagielski     return 0;
1189*b1cdbd2cSJim Jagielski }
CopyText(const SvxTextForwarder &)1190*b1cdbd2cSJim Jagielski void        SvxAccessibleTextAdapter::CopyText(const SvxTextForwarder&)
1191*b1cdbd2cSJim Jagielski {
1192*b1cdbd2cSJim Jagielski     DBG_ERROR( "not implemented" );
1193*b1cdbd2cSJim Jagielski }
1194*b1cdbd2cSJim Jagielski 
1195*b1cdbd2cSJim Jagielski 
1196*b1cdbd2cSJim Jagielski 
1197*b1cdbd2cSJim Jagielski //---------------------------------------------------------------------------------------
1198*b1cdbd2cSJim Jagielski 
SvxAccessibleTextEditViewAdapter()1199*b1cdbd2cSJim Jagielski SvxAccessibleTextEditViewAdapter::SvxAccessibleTextEditViewAdapter()
1200*b1cdbd2cSJim Jagielski {
1201*b1cdbd2cSJim Jagielski }
1202*b1cdbd2cSJim Jagielski 
~SvxAccessibleTextEditViewAdapter()1203*b1cdbd2cSJim Jagielski SvxAccessibleTextEditViewAdapter::~SvxAccessibleTextEditViewAdapter()
1204*b1cdbd2cSJim Jagielski {
1205*b1cdbd2cSJim Jagielski }
1206*b1cdbd2cSJim Jagielski 
IsValid() const1207*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextEditViewAdapter::IsValid() const
1208*b1cdbd2cSJim Jagielski {
1209*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrViewForwarder, "SvxAccessibleTextEditViewAdapter: no forwarder");
1210*b1cdbd2cSJim Jagielski 
1211*b1cdbd2cSJim Jagielski     if( mrViewForwarder )
1212*b1cdbd2cSJim Jagielski         return mrViewForwarder->IsValid();
1213*b1cdbd2cSJim Jagielski     else
1214*b1cdbd2cSJim Jagielski         return sal_False;
1215*b1cdbd2cSJim Jagielski }
1216*b1cdbd2cSJim Jagielski 
GetVisArea() const1217*b1cdbd2cSJim Jagielski Rectangle SvxAccessibleTextEditViewAdapter::GetVisArea() const
1218*b1cdbd2cSJim Jagielski {
1219*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrViewForwarder, "SvxAccessibleTextEditViewAdapter: no forwarder");
1220*b1cdbd2cSJim Jagielski 
1221*b1cdbd2cSJim Jagielski     return mrViewForwarder->GetVisArea();
1222*b1cdbd2cSJim Jagielski }
1223*b1cdbd2cSJim Jagielski 
LogicToPixel(const Point & rPoint,const MapMode & rMapMode) const1224*b1cdbd2cSJim Jagielski Point SvxAccessibleTextEditViewAdapter::LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const
1225*b1cdbd2cSJim Jagielski {
1226*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrViewForwarder, "SvxAccessibleTextEditViewAdapter: no forwarder");
1227*b1cdbd2cSJim Jagielski 
1228*b1cdbd2cSJim Jagielski     return mrViewForwarder->LogicToPixel(rPoint, rMapMode);
1229*b1cdbd2cSJim Jagielski }
1230*b1cdbd2cSJim Jagielski 
PixelToLogic(const Point & rPoint,const MapMode & rMapMode) const1231*b1cdbd2cSJim Jagielski Point SvxAccessibleTextEditViewAdapter::PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const
1232*b1cdbd2cSJim Jagielski {
1233*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrViewForwarder, "SvxAccessibleTextEditViewAdapter: no forwarder");
1234*b1cdbd2cSJim Jagielski 
1235*b1cdbd2cSJim Jagielski     return mrViewForwarder->PixelToLogic(rPoint, rMapMode);
1236*b1cdbd2cSJim Jagielski }
1237*b1cdbd2cSJim Jagielski 
GetSelection(ESelection & rSel) const1238*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextEditViewAdapter::GetSelection( ESelection& rSel ) const
1239*b1cdbd2cSJim Jagielski {
1240*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrViewForwarder, "SvxAccessibleTextEditViewAdapter: no forwarder");
1241*b1cdbd2cSJim Jagielski 
1242*b1cdbd2cSJim Jagielski     ESelection aSelection;
1243*b1cdbd2cSJim Jagielski 
1244*b1cdbd2cSJim Jagielski     if( !mrViewForwarder->GetSelection( aSelection ) )
1245*b1cdbd2cSJim Jagielski         return sal_False;
1246*b1cdbd2cSJim Jagielski 
1247*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aStartIndex;
1248*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aEndIndex;
1249*b1cdbd2cSJim Jagielski 
1250*b1cdbd2cSJim Jagielski     aStartIndex.SetEEIndex( aSelection.nStartPara, aSelection.nStartPos, *mrTextForwarder );
1251*b1cdbd2cSJim Jagielski     aEndIndex.SetEEIndex( aSelection.nEndPara, aSelection.nEndPos, *mrTextForwarder );
1252*b1cdbd2cSJim Jagielski 
1253*b1cdbd2cSJim Jagielski     DBG_ASSERT(aStartIndex.GetIndex() >= 0 && aStartIndex.GetIndex() <= USHRT_MAX &&
1254*b1cdbd2cSJim Jagielski                aEndIndex.GetIndex() >= 0 && aEndIndex.GetIndex() <= USHRT_MAX,
1255*b1cdbd2cSJim Jagielski                "SvxAccessibleTextEditViewAdapter::GetSelection: index value overflow");
1256*b1cdbd2cSJim Jagielski 
1257*b1cdbd2cSJim Jagielski     rSel = ESelection( aStartIndex.GetParagraph(), static_cast< sal_uInt16 > (aStartIndex.GetIndex()),
1258*b1cdbd2cSJim Jagielski                        aEndIndex.GetParagraph(), static_cast< sal_uInt16 > (aEndIndex.GetIndex()) );
1259*b1cdbd2cSJim Jagielski 
1260*b1cdbd2cSJim Jagielski     return sal_True;
1261*b1cdbd2cSJim Jagielski }
1262*b1cdbd2cSJim Jagielski 
SetSelection(const ESelection & rSel)1263*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextEditViewAdapter::SetSelection( const ESelection& rSel )
1264*b1cdbd2cSJim Jagielski {
1265*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrViewForwarder, "SvxAccessibleTextEditViewAdapter: no forwarder");
1266*b1cdbd2cSJim Jagielski 
1267*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aStartIndex;
1268*b1cdbd2cSJim Jagielski     SvxAccessibleTextIndex aEndIndex;
1269*b1cdbd2cSJim Jagielski 
1270*b1cdbd2cSJim Jagielski     aStartIndex.SetIndex( rSel.nStartPara, rSel.nStartPos, *mrTextForwarder );
1271*b1cdbd2cSJim Jagielski     aEndIndex.SetIndex( rSel.nEndPara, rSel.nEndPos, *mrTextForwarder );
1272*b1cdbd2cSJim Jagielski 
1273*b1cdbd2cSJim Jagielski     return mrViewForwarder->SetSelection( MakeEESelection(aStartIndex, aEndIndex) );
1274*b1cdbd2cSJim Jagielski }
1275*b1cdbd2cSJim Jagielski 
Copy()1276*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextEditViewAdapter::Copy()
1277*b1cdbd2cSJim Jagielski {
1278*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrViewForwarder, "SvxAccessibleTextEditViewAdapter: no forwarder");
1279*b1cdbd2cSJim Jagielski 
1280*b1cdbd2cSJim Jagielski     return mrViewForwarder->Copy();
1281*b1cdbd2cSJim Jagielski }
1282*b1cdbd2cSJim Jagielski 
Cut()1283*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextEditViewAdapter::Cut()
1284*b1cdbd2cSJim Jagielski {
1285*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrViewForwarder, "SvxAccessibleTextEditViewAdapter: no forwarder");
1286*b1cdbd2cSJim Jagielski 
1287*b1cdbd2cSJim Jagielski     return mrViewForwarder->Cut();
1288*b1cdbd2cSJim Jagielski }
1289*b1cdbd2cSJim Jagielski 
Paste()1290*b1cdbd2cSJim Jagielski sal_Bool SvxAccessibleTextEditViewAdapter::Paste()
1291*b1cdbd2cSJim Jagielski {
1292*b1cdbd2cSJim Jagielski     DBG_ASSERT(mrViewForwarder, "SvxAccessibleTextEditViewAdapter: no forwarder");
1293*b1cdbd2cSJim Jagielski 
1294*b1cdbd2cSJim Jagielski     return mrViewForwarder->Paste();
1295*b1cdbd2cSJim Jagielski }
1296*b1cdbd2cSJim Jagielski 
SetForwarder(SvxEditViewForwarder & rForwarder,SvxAccessibleTextAdapter & rTextForwarder)1297*b1cdbd2cSJim Jagielski void SvxAccessibleTextEditViewAdapter::SetForwarder( SvxEditViewForwarder& 		rForwarder,
1298*b1cdbd2cSJim Jagielski                                                      SvxAccessibleTextAdapter&	rTextForwarder )
1299*b1cdbd2cSJim Jagielski {
1300*b1cdbd2cSJim Jagielski     mrViewForwarder = &rForwarder;
1301*b1cdbd2cSJim Jagielski     mrTextForwarder = &rTextForwarder;
1302*b1cdbd2cSJim Jagielski }
1303*b1cdbd2cSJim Jagielski 
1304