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