xref: /aoo42x/main/sw/source/core/text/inftxt.hxx (revision b8d31f9f)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifndef _INFTXT_HXX
24 #define _INFTXT_HXX
25 #include <com/sun/star/linguistic2/XHyphenatedWord.hpp>
26 #include <com/sun/star/beans/PropertyValues.hpp>
27 
28 #ifndef _TABLE_HXX //autogen
29 #include <tools/table.hxx>
30 #endif
31 
32 #include "swtypes.hxx"
33 #include "txttypes.hxx"
34 #include "swrect.hxx"
35 #include "txtfly.hxx"
36 #include "swfont.hxx"
37 #include "porlay.hxx"
38 #include "txtfrm.hxx"
39 #include "ndtxt.hxx"
40 #include "txttypes.hxx"
41 #include <editeng/paravertalignitem.hxx>
42 
43 class Font;
44 class OutputDevice;
45 class SvxBrushItem;
46 class SvxLineSpacingItem;
47 class SvxTabStop;
48 class SvxTabStopItem;
49 class SwAttrSet;
50 class SwFldPortion;
51 class SwFlyPortion;
52 class SwFmtDrop;
53 class SwLineLayout;
54 class SwLinePortion;
55 class SwParaPortion;
56 class SwTabPortion;
57 class SwTxtFrm;
58 class SwTxtSizeInfo;
59 class SwViewOption;
60 class ViewShell;
61 class SwTxtFtn;
62 class SwAttrIter;
63 struct SwMultiCreator;
64 class SwMultiPortion;
65 class SwWrongList;
66 
67 /* Minimum: Prozentwert fuers kernen */
68 #define MINKERNPERCENT 5
69 #define ARROW_WIDTH	200
70 #define DIR_LEFT2RIGHT 0
71 #define DIR_BOTTOM2TOP 1
72 #define DIR_RIGHT2LEFT 2
73 #define DIR_TOP2BOTTOM 3
74 
75 #ifdef DBG_UTIL
76 #define OPTCALM( rInf )  (rInf).IsOptCalm()
77 #define OPTLOW( rInf )	 (rInf).IsOptLow()
78 #define OPTDBG( rInf )	 (rInf).IsOptDbg()
79 #else
80 #define OPTCALM( rInf )  sal_True
81 #define OPTLOW( rInf )	 sal_False
82 #define OPTDBG( rInf )	 sal_False
83 #endif
84 
85 /*************************************************************************
86  *						class SwLineInfo
87  *************************************************************************/
88 
89 // Beruecksichtigt das Attribut LineSpace bei der Hoehen/Ascentberechnung.
90 
91 class SwLineInfo
92 {
93 	friend class SwTxtIter;
94 
95     SvxTabStopItem* pRuler;
96 	const SvxLineSpacingItem *pSpace;
97     sal_uInt16 nVertAlign;
98     KSHORT nDefTabStop;
99     // --> OD 2008-02-04 #newlistlevelattrs#
100     bool bListTabStopIncluded;
101     long nListTabStopPosition;
102     // <--
103 
104     // --> OD 2008-01-17 #newlistlevelattrs#
105     void CtorInitLineInfo( const SwAttrSet& rAttrSet,
106                            const SwTxtNode& rTxtNode );
107     // <--
108 
109     // --> OD 2008-01-17 #newlistlevelattrs#
110     SwLineInfo();
111     ~SwLineInfo();
112 public:
113 //        const SvxTabStop *GetTabStop( const SwTwips nLinePos,
114 //                                        const SwTwips nLeft,
115     // #i24363# tab stops relative to indent - returns the tab stop following nSearchPos or NULL
116     const SvxTabStop *GetTabStop( const SwTwips nSearchPos,
117 								 const SwTwips nRight ) const;
GetLineSpacing() const118 	inline const SvxLineSpacingItem *GetLineSpacing() const { return pSpace; }
GetDefTabStop() const119 	inline KSHORT GetDefTabStop() const { return nDefTabStop; }
SetDefTabStop(KSHORT nNew) const120 	inline void SetDefTabStop( KSHORT nNew ) const
121 		{ ( (SwLineInfo*)this )->nDefTabStop = nNew; }
122 
123     // vertical alignment
GetVertAlign() const124     inline sal_uInt16 GetVertAlign() const { return nVertAlign; }
HasSpecialAlign(sal_Bool bVert) const125     inline sal_Bool HasSpecialAlign( sal_Bool bVert ) const
126         { return bVert ?
127                  ( SvxParaVertAlignItem::BASELINE  != nVertAlign ) :
128                  ( SvxParaVertAlignItem::BASELINE  != nVertAlign &&
129                    SvxParaVertAlignItem::AUTOMATIC != nVertAlign ); }
130 
131     sal_uInt16 NumberOfTabStops() const;
132 
133     // --> OD 2008-02-04 #newlistlevelattrs#
IsListTabStopIncluded() const134     inline bool IsListTabStopIncluded() const
135     {
136         return bListTabStopIncluded;
137     }
GetListTabStopPosition() const138     inline long GetListTabStopPosition() const
139     {
140         return nListTabStopPosition;
141     }
142     // <--
143 
144 
145 //  friend ostream &operator<<( ostream &rOS, const SwLineInfo &rInf );
146 	friend SvStream &operator<<( SvStream &rOS, const SwLineInfo &rInf );
147 };
148 
149 /*************************************************************************
150  *						class SwTxtInfo
151  *************************************************************************/
152 
153 class SwTxtInfo
154 {
155 	// Implementation in txthyph.cxx
156 	friend void SetParaPortion( SwTxtInfo *pInf, SwParaPortion *pRoot );
157 	SwParaPortion *pPara;
158 	xub_StrLen nTxtStart;				  // TxtOfst bei Follows
159 
160 protected:
SwTxtInfo()161 	inline SwTxtInfo() { }
162 public:
163 	void CtorInitTxtInfo( SwTxtFrm *pFrm );
164 	SwTxtInfo( const SwTxtInfo &rInf );
SwTxtInfo(SwTxtFrm * pFrm)165 	inline SwTxtInfo( SwTxtFrm *pFrm ) { CtorInitTxtInfo( pFrm ); }
GetParaPortion()166 	inline SwParaPortion *GetParaPortion() { return pPara; }
GetParaPortion() const167 	inline const SwParaPortion *GetParaPortion() const { return pPara; }
GetTxtStart() const168 	inline xub_StrLen GetTxtStart() const { return nTxtStart; }
169 
170 	friend SvStream &operator<<( SvStream &rOS, const SwTxtInfo &rInf );
171 };
172 
173 /*************************************************************************
174  *						class SwTxtSizeInfo
175  *************************************************************************/
176 
177 DECLARE_TABLE( SwTxtPortionTable, sal_IntPtr )
178 
179 class SwTxtSizeInfo : public SwTxtInfo
180 {
181 protected:
182     // during formatting, a small database is built, mapping portion pointers
183     // to their maximum size (used for kana compression)
184     SwTxtPortionTable aMaxWidth;
185     // for each line, an array of compression values is calculated
186     // this array is passed over to the info structure
187     SvUShorts* pKanaComp;
188 
189 	ViewShell	 *pVsh;
190 
191     // pOut is the output device, pRef is the device used for formatting
192     OutputDevice* pOut;
193     OutputDevice* pRef;
194 
195 	SwFont *pFnt;
196     SwUnderlineFont *pUnderFnt; // Font for underlining
197 	SwTxtFrm *pFrm;
198 	const SwViewOption *pOpt;
199 	const XubString *pTxt;
200 	xub_StrLen nIdx, nLen;
201     sal_uInt16 nKanaIdx;
202     sal_Bool bOnWin     : 1;
203 	sal_Bool bNotEOL	: 1;
204 	sal_Bool bURLNotify : 1;
205 	sal_Bool bStopUnderFlow : 1;// Underflow gestoppt z.B. von einer FlyPortion
206     sal_Bool bFtnInside : 1;    // the current line contains a footnote
207     sal_Bool bOtherThanFtnInside : 1; // the current line contains another portion than a footnote portion.
208                                       // needed for checking keep together of footnote portion with previous portion
209 	sal_Bool bMulti : 1;		// inside a multiportion
210     sal_Bool bFirstMulti : 1;   // this flag is used for two purposes:
211                                 // - the multiportion is the first lineportion
212                                 // - indicates, if we are currently in second
213                                 //   line of multi portion
214 	sal_Bool bRuby : 1;			// during the formatting of a phonetic line
215 	sal_Bool bHanging : 1;		// formatting of hanging punctuation allowed
216 	sal_Bool bScriptSpace : 1;	// space between different scripts (Asian/Latin)
217 	sal_Bool bForbiddenChars : 1; // Forbidden start/endline characters
218     sal_Bool bSnapToGrid : 1;   // paragraph snaps to grid
219     sal_uInt8 nDirection : 2;       // writing direction: 0/90/180/270 degree
220 
221 protected:
222 	void CtorInitTxtSizeInfo( SwTxtFrm *pFrm, SwFont *pFnt = 0,
223 				   const xub_StrLen nIdx = 0,
224 				   const xub_StrLen nLen = STRING_LEN );
SwTxtSizeInfo()225 	SwTxtSizeInfo() {}
226 public:
227 	SwTxtSizeInfo( const SwTxtSizeInfo &rInf );
228 	SwTxtSizeInfo( const SwTxtSizeInfo &rInf, const XubString &rTxt,
229 				   const xub_StrLen nIdx = 0,
230 				   const xub_StrLen nLen = STRING_LEN );
231 
SwTxtSizeInfo(SwTxtFrm * pTxtFrm,SwFont * pTxtFnt=0,const xub_StrLen nIndex=0,const xub_StrLen nLength=STRING_LEN)232     inline SwTxtSizeInfo( SwTxtFrm *pTxtFrm, SwFont *pTxtFnt = 0,
233                    const xub_StrLen nIndex = 0,
234                    const xub_StrLen nLength = STRING_LEN )
235            { CtorInitTxtSizeInfo( pTxtFrm, pTxtFnt, nIndex, nLength ); }
236 
237 	// GetMultiAttr returns the text attribute of the multiportion,
238 	// if rPos is inside any multi-line part.
239 	// rPos will set to the end of the multi-line part.
240     SwMultiCreator* GetMultiCreator( xub_StrLen &rPos, SwMultiPortion* pM ) const;
241 
OnWin() const242 	inline sal_Bool OnWin() const { return bOnWin; }
SetOnWin(const sal_Bool bNew)243 	inline void SetOnWin( const sal_Bool bNew ) { bOnWin = bNew; }
NotEOL() const244 	inline sal_Bool NotEOL() const { return bNotEOL; }
SetNotEOL(const sal_Bool bNew)245 	inline void SetNotEOL( const sal_Bool bNew ) { bNotEOL = bNew; }
URLNotify() const246 	inline sal_Bool URLNotify() const { return bURLNotify; }
SetURLNotify(const sal_Bool bNew)247 	inline void SetURLNotify( const sal_Bool bNew ) { bURLNotify = bNew; }
StopUnderFlow() const248 	inline sal_Bool StopUnderFlow() const { return bStopUnderFlow; }
SetStopUnderFlow(const sal_Bool bNew)249 	inline void SetStopUnderFlow( const sal_Bool bNew ) { bStopUnderFlow = bNew; }
IsFtnInside() const250 	inline sal_Bool IsFtnInside() const { return bFtnInside; }
SetFtnInside(const sal_Bool bNew)251 	inline void SetFtnInside( const sal_Bool bNew ) { bFtnInside = bNew; }
IsOtherThanFtnInside() const252     inline sal_Bool IsOtherThanFtnInside() const { return bOtherThanFtnInside; }
SetOtherThanFtnInside(const sal_Bool bNew)253     inline void SetOtherThanFtnInside( const sal_Bool bNew ) { bOtherThanFtnInside = bNew; }
IsMulti() const254 	inline sal_Bool IsMulti() const { return bMulti; }
SetMulti(const sal_Bool bNew)255 	inline void SetMulti( const sal_Bool bNew ) { bMulti = bNew; }
IsFirstMulti() const256 	inline sal_Bool IsFirstMulti() const { return bFirstMulti; }
SetFirstMulti(const sal_Bool bNew)257 	inline void SetFirstMulti( const sal_Bool bNew ) { bFirstMulti = bNew; }
IsRuby() const258 	inline sal_Bool IsRuby() const { return bRuby; }
SetRuby(const sal_Bool bNew)259 	inline void SetRuby( const sal_Bool bNew ) { bRuby = bNew; }
IsHanging() const260 	inline sal_Bool IsHanging() const { return bHanging; }
SetHanging(const sal_Bool bNew)261 	inline void SetHanging( const sal_Bool bNew ) { bHanging = bNew; }
HasScriptSpace() const262 	inline sal_Bool HasScriptSpace() const { return bScriptSpace; }
SetScriptSpace(const sal_Bool bNew)263 	inline void SetScriptSpace( const sal_Bool bNew ) { bScriptSpace = bNew; }
HasForbiddenChars() const264 	inline sal_Bool HasForbiddenChars() const { return bForbiddenChars; }
SetForbiddenChars(const sal_Bool bN)265 	inline void SetForbiddenChars( const sal_Bool bN ) { bForbiddenChars = bN; }
SnapToGrid() const266     inline sal_Bool SnapToGrid() const { return bSnapToGrid; }
SetSnapToGrid(const sal_Bool bN)267     inline void SetSnapToGrid( const sal_Bool bN ) { bSnapToGrid = bN; }
GetDirection() const268     inline sal_uInt8 GetDirection() const { return nDirection; }
SetDirection(const sal_uInt8 nNew)269 	inline void SetDirection( const sal_uInt8 nNew ) { nDirection = nNew; }
IsRotated() const270 	inline sal_Bool IsRotated() const { return 0 != ( 1 & nDirection ); }
271 
GetVsh()272 	inline ViewShell *GetVsh() { return pVsh; }
GetVsh() const273 	inline const ViewShell *GetVsh() const { return pVsh; }
274 
GetOut()275     inline OutputDevice *GetOut() { return pOut; }
GetOut() const276 	inline const OutputDevice *GetOut() const { return pOut; }
SetOut(OutputDevice * pNewOut)277     inline void SetOut( OutputDevice* pNewOut ) { pOut = pNewOut; }
278 
GetRefDev()279     inline OutputDevice *GetRefDev() { return pRef; }
GetRefDev() const280     inline const OutputDevice *GetRefDev() const { return pRef; }
281 
GetFont()282     inline SwFont *GetFont() { return pFnt; }
GetFont() const283 	inline const SwFont *GetFont() const { return pFnt; }
SetFont(SwFont * pNew)284 	inline void SetFont( SwFont *pNew ) { pFnt = pNew; }
285 	void SelectFont();
SetUnderFnt(SwUnderlineFont * pNew)286     inline void SetUnderFnt( SwUnderlineFont* pNew ) { pUnderFnt = pNew; }
GetUnderFnt() const287     inline SwUnderlineFont* GetUnderFnt() const { return pUnderFnt; }
288 
GetOpt() const289 	inline const  SwViewOption &GetOpt() const { return *pOpt; }
GetTxt() const290 	inline const XubString &GetTxt() const { return *pTxt; }
GetChar(const xub_StrLen nPos) const291 	inline xub_Unicode GetChar( const xub_StrLen nPos ) const
292 		{ return pTxt->GetChar( nPos ); }
293 
294 	inline KSHORT	   GetTxtHeight() const;
295 
296     //
297     // GetTxtSize
298     //
299     SwPosSize GetTxtSize( OutputDevice* pOut, const SwScriptInfo* pSI,
300                           const XubString& rTxt, const xub_StrLen nIdx,
301                           const xub_StrLen nLen, const sal_uInt16 nComp ) const;
302     SwPosSize GetTxtSize() const;
303     void GetTxtSize( const SwScriptInfo* pSI, const xub_StrLen nIdx,
304                       const xub_StrLen nLen, const sal_uInt16 nComp,
305                       sal_uInt16& nMinSize, sal_uInt16& nMaxSizeDiff ) const;
306     inline SwPosSize GetTxtSize( const SwScriptInfo* pSI, const xub_StrLen nIdx,
307                                  const xub_StrLen nLen, const sal_uInt16 nComp ) const;
308     inline SwPosSize GetTxtSize( const XubString &rTxt ) const;
309 
310     //
311     // GetTxtBreak
312     //
313     xub_StrLen GetTxtBreak( const long nLineWidth,
314                                            const xub_StrLen nMaxLen,
315                                            const sal_uInt16 nComp ) const;
316     xub_StrLen GetTxtBreak( const long nLineWidth,
317                                            const xub_StrLen nMaxLen,
318                                            const sal_uInt16 nComp,
319                                            xub_StrLen& rExtraCharPos ) const;
320 
321     inline KSHORT GetAscent() const;
322 
GetIdx() const323 	inline xub_StrLen GetIdx() const { return nIdx; }
SetIdx(const xub_StrLen nNew)324 	inline void SetIdx( const xub_StrLen nNew ) { nIdx = nNew; }
GetLen() const325 	inline xub_StrLen GetLen() const { return nLen; }
SetLen(const xub_StrLen nNew)326 	inline void SetLen( const xub_StrLen nNew ) { nLen = nNew; }
SetTxt(const XubString & rNew)327 	inline void SetTxt( const XubString &rNew ){ pTxt = &rNew; }
328 
329 	friend SvStream &operator<<( SvStream &rOS, const SwTxtSizeInfo &rInf );
330 
331 // 7780: Keine Bullets beim Symbol-Zeichensatz!
IsNoSymbol() const332 	inline sal_Bool IsNoSymbol() const
333 	{ return RTL_TEXTENCODING_SYMBOL != pFnt->GetCharSet( pFnt->GetActual() ); }
334 
335     void NoteAnimation() const;
336 
337     // Home is where Your heart is...
GetTxtFrm()338 	inline SwTxtFrm *GetTxtFrm() { return pFrm; }
GetTxtFrm() const339 	inline const SwTxtFrm *GetTxtFrm() const { return pFrm; }
340 
HasHint(xub_StrLen nPos) const341 	inline sal_Bool HasHint( xub_StrLen nPos ) const
342 		{ return _HasHint( pFrm->GetTxtNode(), nPos ); }
343 	static sal_Bool _HasHint( const SwTxtNode* pTxtNode, xub_StrLen nPos );
344 
345     // If Kana Compression is enabled, a minimum and maximum portion width
346     // is calculated. We format lines with minimal size and share remaining
347     // space among compressed kanas.
348     // During formatting, the maximum values of compressable portions are
349     // stored in aMaxWidth and discarded after a line has been formatted.
SetMaxWidthDiff(sal_uLong nKey,sal_uInt16 nVal)350     inline void SetMaxWidthDiff( sal_uLong nKey, sal_uInt16 nVal )
351     {
352         aMaxWidth.Insert( nKey, nVal );
353     };
GetMaxWidthDiff(sal_uLong nKey)354     inline sal_uInt16 GetMaxWidthDiff( sal_uLong nKey )
355     {
356         return (sal_uInt16)aMaxWidth.Get( nKey );
357     };
ResetMaxWidthDiff()358     inline void ResetMaxWidthDiff()
359     {
360         aMaxWidth.Clear();
361     };
CompressLine()362     inline sal_Bool CompressLine()
363     {
364         return (sal_Bool)aMaxWidth.Count();
365     };
366 
367     //
368     // Feature: Kana Compression
369     //
GetKanaIdx() const370     inline MSHORT GetKanaIdx() const { return nKanaIdx; }
ResetKanaIdx()371     inline void ResetKanaIdx(){ nKanaIdx = 0; }
SetKanaIdx(MSHORT nNew)372     inline void SetKanaIdx( MSHORT nNew ) { nKanaIdx = nNew; }
IncKanaIdx()373     inline void IncKanaIdx() { ++nKanaIdx; }
SetKanaComp(SvUShorts * pNew)374     inline void SetKanaComp( SvUShorts *pNew ){ pKanaComp = pNew; }
GetpKanaComp() const375     inline SvUShorts* GetpKanaComp() const { return pKanaComp; }
GetKanaComp() const376     inline sal_uInt16 GetKanaComp() const
377         { return ( pKanaComp && nKanaIdx < pKanaComp->Count() )
378                    ? (*pKanaComp)[nKanaIdx] : 0; }
379 
380 #ifdef DBG_UTIL
381 	sal_Bool IsOptCalm() const;
382 	sal_Bool IsOptLow() const;
383 	sal_Bool IsOptDbg() const;
384 	sal_Bool IsOptTest1() const;
385 	sal_Bool IsOptTest2() const;
386 	sal_Bool IsOptTest3() const;
387 	sal_Bool IsOptTest4() const;
388 	sal_Bool IsOptTest5() const;
389 	sal_Bool IsOptTest6() const;
390 	sal_Bool IsOptTest7() const;
391 	sal_Bool IsOptTest8() const;
392 #endif
393 };
394 
395 /*************************************************************************
396  *						class SwTxtPaintInfo
397  *************************************************************************/
398 
399 class SwTxtPaintInfo : public SwTxtSizeInfo
400 {
401     const SwWrongList *pWrongList;
402     const SwWrongList *pGrammarCheckList;
403     const SwWrongList *pSmartTags;    // SMARTTAGS
404     std::vector<long>* pSpaceAdd;
405 	const SvxBrushItem *pBrushItem; // Fuer den Hintergrund
406 	SwRect      aItemRect;			// ebenfalls fuer den Hintergrund
407 	SwTxtFly	aTxtFly;	// FlyFrm-Berechnung
408 	Point		aPos;		// Ausgabeposition
409 	SwRect		aPaintRect;	// Original Ausgaberechteck (aus Layout-Paint)
410 
411 	MSHORT nSpaceIdx;
412 	void _DrawText( const XubString &rText, const SwLinePortion &rPor,
413 				   const xub_StrLen nIdx, const xub_StrLen nLen,
414                    const sal_Bool bKern, const sal_Bool bWrong = sal_False,
415                    const sal_Bool bSmartTag = sal_False,
416                    const sal_Bool bGrammarCheck = sal_False );  // SMARTTAGS
417 
418 	SwTxtPaintInfo &operator=(const SwTxtPaintInfo&);
419 	void _NotifyURL( const SwLinePortion &rPor ) const;
420 	void _DrawBackBrush( const SwLinePortion &rPor ) const;
421 
422 protected:
423 #ifndef DBG_UTIL
SwTxtPaintInfo()424     SwTxtPaintInfo() { pFrm = 0; pWrongList = 0; pGrammarCheckList = 0; pWrongList = 0; pSmartTags = 0; pSpaceAdd = 0; pBrushItem = 0;}
425 #else
426     SwTxtPaintInfo() { pFrm = 0; pWrongList = 0; pGrammarCheckList = 0; pSmartTags = 0; pSpaceAdd = 0;
427                        pBrushItem = ((SvxBrushItem*)-1);}
428 #endif
429 public:
430 	SwTxtPaintInfo( const SwTxtPaintInfo &rInf );
431 	SwTxtPaintInfo( const SwTxtPaintInfo &rInf, const XubString &rTxt );
432 
433 	void CtorInitTxtPaintInfo( SwTxtFrm *pFrame, const SwRect &rPaint );
434 
SetBack(const SvxBrushItem * pItem,const SwRect & rRect)435 	void SetBack( const SvxBrushItem *pItem,
436 				  const SwRect &rRect ) { pBrushItem = pItem; aItemRect = rRect;}
GetBrushItem() const437 	const SvxBrushItem *GetBrushItem() const { return pBrushItem; }
GetBrushRect() const438 	const SwRect       &GetBrushRect() const { return aItemRect;  }
439 
SwTxtPaintInfo(SwTxtFrm * pFrame,const SwRect & rPaint)440 	inline SwTxtPaintInfo( SwTxtFrm *pFrame, const SwRect &rPaint )
441 		   { CtorInitTxtPaintInfo( pFrame, rPaint ); }
442 
X() const443 	inline SwTwips X() const { return aPos.X(); }
X(const long nNew)444 	inline void X( const long nNew ) { aPos.X() = nNew; }
Y() const445 	inline SwTwips Y() const { return aPos.Y(); }
Y(const SwTwips nNew)446 	inline void Y( const SwTwips nNew ) { aPos.Y() = nNew; }
447 
GetTxtFly()448 	inline SwTxtFly *GetTxtFly() { return &aTxtFly; }
GetTxtFly() const449 	inline const SwTxtFly *GetTxtFly() const { return &aTxtFly; }
450 	inline void DrawText( const XubString &rText, const SwLinePortion &rPor,
451 						  const xub_StrLen nIdx = 0,
452 						  const xub_StrLen nLen = STRING_LEN,
453 						  const sal_Bool bKern = sal_False) const;
454 	inline void DrawText( const SwLinePortion &rPor, const xub_StrLen nLen,
455 						  const sal_Bool bKern = sal_False ) const;
456     inline void DrawMarkedText( const SwLinePortion &rPor, const xub_StrLen nLen,
457                                 const sal_Bool bKern,
458                                 const sal_Bool bWrong,
459                                 const sal_Bool bSmartTags,
460                                 const sal_Bool bGrammarCheck ) const;
461 
462     void DrawRect( const SwRect &rRect, sal_Bool bNoGraphic = sal_False,
463 				   sal_Bool bRetouche = sal_True ) const;
464 	void DrawTab( const SwLinePortion &rPor ) const;
465 	void DrawLineBreak( const SwLinePortion &rPor ) const;
466     void DrawRedArrow( const SwLinePortion &rPor ) const;
467     void DrawPostIts( const SwLinePortion &rPor, sal_Bool bScript ) const;
468 	void DrawBackground( const SwLinePortion &rPor ) const;
469 	void DrawViewOpt( const SwLinePortion &rPor, const MSHORT nWhich ) const;
DrawBackBrush(const SwLinePortion & rPor) const470 	inline void DrawBackBrush( const SwLinePortion &rPor ) const
471 	{ /* if( pFnt->GetBackColor() ) */ _DrawBackBrush( rPor ); }
472 
473     void DrawCheckBox( const SwFieldFormPortion &rPor, bool checked) const;
474 
NotifyURL(const SwLinePortion & rPor) const475 	inline void NotifyURL( const SwLinePortion &rPor ) const
476 		{ if( URLNotify() ) _NotifyURL( rPor ); }
477 
478     void CalcRect( const SwLinePortion& rPor, SwRect* pRect, SwRect* pIntersect = 0 ) const;
479 
480 	inline SwTwips GetPaintOfst() const;
481 	inline void SetPaintOfst( const SwTwips nNew );
GetPos() const482 	inline const Point &GetPos() const { return aPos; }
SetPos(const Point & rNew)483 	inline void SetPos( const Point &rNew ) { aPos = rNew; }
484 
GetPaintRect() const485 	inline const SwRect &GetPaintRect() const { return aPaintRect; }
SetPaintRect(const SwRect & rNew)486 	inline void SetPaintRect( const SwRect &rNew ) { aPaintRect = rNew; }
487 
488 	friend SvStream &operator<<( SvStream &rOS, const SwTxtPaintInfo &rInf );
489 
490     //
491     // STUFF FOR JUSTIFIED ALIGNMENT
492     //
GetSpaceIdx() const493     inline MSHORT GetSpaceIdx() const { return nSpaceIdx; }
ResetSpaceIdx()494 	inline void ResetSpaceIdx(){nSpaceIdx = 0; }
SetSpaceIdx(MSHORT nNew)495 	inline void SetSpaceIdx( MSHORT nNew ) { nSpaceIdx = nNew; }
IncSpaceIdx()496 	inline void IncSpaceIdx() { ++nSpaceIdx; }
RemoveFirstSpaceAdd()497     inline void RemoveFirstSpaceAdd() { pSpaceAdd->erase( pSpaceAdd->begin() ); }
GetSpaceAdd() const498     inline long GetSpaceAdd() const
499         { return ( pSpaceAdd && nSpaceIdx < pSpaceAdd->size() )
500 				   ? (*pSpaceAdd)[nSpaceIdx] : 0; }
501 
SetpSpaceAdd(std::vector<long> * pNew)502     inline void SetpSpaceAdd( std::vector<long>* pNew ){ pSpaceAdd = pNew; }
GetpSpaceAdd() const503     inline std::vector<long>* GetpSpaceAdd() const { return pSpaceAdd; }
504 
505 
SetWrongList(const SwWrongList * pNew)506     inline void SetWrongList( const SwWrongList *pNew ){ pWrongList = pNew; }
GetpWrongList() const507     inline const SwWrongList* GetpWrongList() const { return pWrongList; }
508 
SetGrammarCheckList(const SwWrongList * pNew)509     inline void SetGrammarCheckList( const SwWrongList *pNew ){ pGrammarCheckList = pNew; }
GetGrammarCheckList() const510     inline const SwWrongList* GetGrammarCheckList() const { return pGrammarCheckList; }
511 
512     // SMARTTAGS
SetSmartTags(const SwWrongList * pNew)513     inline void SetSmartTags( const SwWrongList *pNew ){ pSmartTags = pNew; }
GetSmartTags() const514     inline const SwWrongList* GetSmartTags() const { return pSmartTags; }
515 };
516 
517 /*************************************************************************
518  *						class SwTxtFormatInfo
519  *************************************************************************/
520 
521 class SwTxtFormatInfo : public SwTxtPaintInfo
522 {
523 	// temporary arguments for hyphenation
524 	com::sun::star::beans::PropertyValues	aHyphVals;
525 
526 	SwLineLayout	*pRoot; 	  // die Root der aktuellen Zeile (pCurr)
527 	SwLinePortion	*pLast; 	  // die letzte Portion
528 	SwFlyPortion	*pFly;		  // die nachfolgende FlyPortion
529 	SwFldPortion	*pLastFld;	  // umgebrochenes Feld
530 	SwLinePortion	*pUnderFlow;  // Unterlaufsituation: letzte Portion
531 	SwLinePortion	*pRest; 	  // Rest ist der Beginn der naechsten Zeile
532 
533 	SwTabPortion	*pLastTab;	   // die _letzte_ TabPortion
534 
535 	xub_StrLen nSoftHyphPos;    // SoftHyphPos fuer Hyphenate
536 	xub_StrLen nHyphStart;	    // TxtPos, an der die interakt.Tr.z.Z. steht
537 	xub_StrLen nHyphWrdStart;   // gefundene Wort-Position
538 	xub_StrLen nHyphWrdLen;     // gefundene Wort-Laenge
539 	xub_StrLen nLineStart;		// aktueller Zeilenbeginn im rTxt
540     xub_StrLen nUnderScorePos;  // enlarge repaint if underscore has been found
541     // --> FME 2004-11-25 #i34348# Changed type from sal_uInt16 to SwTwips
542     SwTwips nLeft;          // linker Rand
543     SwTwips nRight;           // rechter Rand
544     SwTwips nFirst;           // EZE
545     // <--
546     KSHORT nRealWidth;      // "echte" Zeilenbreite
547 	KSHORT nWidth;			// "virtuelle" Zeilenbreite
548 	KSHORT nLineHeight; 	// endgueltige Hoehe nach CalcLine
549     KSHORT nLineNettoHeight;   // line height without spacing
550 	KSHORT nForcedLeftMargin;	// Verschiebung des linken Rands wg. Rahmen
551 
552 	sal_Int16  nMinLeading;		// minimum number of chars before hyphenation point
553 	sal_Int16  nMinTrailing;	// minimum number of chars after hyphenation point
554 	sal_Int16  nMinWordLength;	// minimum length of word to be hyphenated
555 
556 	sal_Bool bFull	 : 1;	   // Zeile ist voll
557 	sal_Bool bFtnDone  : 1;	   // Ftn bereits formatiert
558 	sal_Bool bErgoDone : 1;	   // ErgoDone bereits formatiert
559 	sal_Bool bNumDone  : 1;	   // bNumDone bereits formatiert
560     sal_Bool bArrowDone : 1;    // Pfeil nach links bei gescrollten Absaetzen
561 	sal_Bool bStop	 : 1;	   // Sofort abbrechen, Zeile verwerfen.
562 	sal_Bool bNewLine  : 1;	   // Noch eine weitere Zeile formatieren.
563 	sal_Bool bShift	 : 1;	   // Positionsaend.: Repaint bis auf Weiteres
564 	sal_Bool bUnderFlow : 1;	   // Kontext: UnderFlow() ?
565 	sal_Bool bInterHyph: 1;	   // interaktive Trennung ?
566 	sal_Bool bAutoHyph : 1;	   // automatische Trennung ?
567 	sal_Bool bDropInit : 1;	   // DropWidth einstellen.
568 	sal_Bool bQuick	 : 1;	   // FormatQuick()
569 	sal_Bool bNoEndHyph	 : 1;  // Trennung am Zeilenende abgeschaltet wg. MaxHyphens
570 	sal_Bool bNoMidHyph	 : 1;  // Trennung vor Flies abgeschaltet wg. MaxHyphens
571 	sal_Bool bIgnoreFly: 1;	   // FitToContent ignoriert Flies
572     sal_Bool bFakeLineStart: 1; // String has been replaced by field portion
573                                 // info structure only pretends that we are at
574                                 // the beginning of a line
575 
576 	xub_Unicode   cTabDecimal;	// das _aktuelle_ Dezimalzeichen
577 	xub_Unicode   cHookChar;	// fuer Tabs in Feldern etc.
578 	sal_uInt8   nMaxHyph;		// max. Zeilenanz. aufeinanderfolg. Trenn.
579 	sal_Bool   bTestFormat;		// Testformatierung aus WouldFit, keine Benachrichtigungen etc.
580 
581 	// Hyphenating ...
582 	sal_Bool InitHyph( const sal_Bool bAuto = sal_False );
583 	sal_Bool _CheckFtnPortion( SwLineLayout* pCurr );
584 
585 public:
586 	void CtorInitTxtFormatInfo( SwTxtFrm *pFrm, const sal_Bool bInterHyph = sal_False,
587 		const sal_Bool bQuick = sal_False, const sal_Bool bTst = sal_False );
SwTxtFormatInfo(SwTxtFrm * pFrame,const sal_Bool bInterHyphL=sal_False,const sal_Bool bQuickL=sal_False,const sal_Bool bTst=sal_False)588     inline SwTxtFormatInfo(SwTxtFrm *pFrame,const sal_Bool bInterHyphL=sal_False,
589             const sal_Bool bQuickL = sal_False, const sal_Bool bTst = sal_False )
590            { CtorInitTxtFormatInfo( pFrame, bInterHyphL, bQuickL, bTst ); }
591 
592 	// For the formatting inside a double line in a line (multi-line portion)
593 	// we need a modified text-format-info:
594 	SwTxtFormatInfo( const SwTxtFormatInfo& rInf, SwLineLayout& rLay,
595 		SwTwips nActWidth );
596 
Width() const597 	inline KSHORT Width() const { return nWidth; }
Width(const KSHORT nNew)598 	inline void Width( const KSHORT nNew ) { nWidth = nNew; }
599 		   void Init();
600 
601 	// liefert die erste veraenderte Position im Absatz zurueck
602 	inline xub_StrLen GetReformatStart() const;
603 
604 	// Raender
Left() const605     inline SwTwips Left() const { return nLeft; }
Left(const SwTwips nNew)606     inline void Left( const SwTwips nNew ) { nLeft = nNew; }
Right() const607     inline SwTwips Right() const { return nRight; }
Right(const SwTwips nNew)608     inline void Right( const SwTwips nNew ) { nRight = nNew; }
First() const609     inline SwTwips First() const { return nFirst; }
First(const SwTwips nNew)610     inline void First( const SwTwips nNew ) { nFirst = nNew; }
RealWidth() const611 	inline KSHORT RealWidth() const { return nRealWidth; }
RealWidth(const KSHORT nNew)612 	inline void RealWidth( const KSHORT nNew ) { nRealWidth = nNew; }
ForcedLeftMargin() const613 	inline KSHORT ForcedLeftMargin() const { return nForcedLeftMargin; }
ForcedLeftMargin(const KSHORT nN)614 	inline void ForcedLeftMargin( const KSHORT nN ) { nForcedLeftMargin = nN; }
615 
MaxHyph()616 	inline sal_uInt8 &MaxHyph() { return nMaxHyph; }
MaxHyph() const617 	inline const sal_uInt8 &MaxHyph() const { return nMaxHyph; }
618 
GetRoot()619 	inline SwLineLayout *GetRoot() { return pRoot; }
GetRoot() const620 	inline const SwLineLayout *GetRoot() const { return pRoot; }
621 
SetRoot(SwLineLayout * pNew)622 	inline void SetRoot( SwLineLayout *pNew ) { pRoot = pNew; }
GetLast()623 	inline SwLinePortion *GetLast() { return pLast; }
SetLast(SwLinePortion * pNewLast)624 	inline void SetLast( SwLinePortion *pNewLast ) { pLast = pNewLast; }
IsFull() const625 	inline sal_Bool IsFull() const { return bFull; }
SetFull(const sal_Bool bNew)626 	inline void SetFull( const sal_Bool bNew ) { bFull = bNew; }
IsHyphForbud() const627 	inline sal_Bool IsHyphForbud() const
628 		{ return pFly ? bNoMidHyph : bNoEndHyph; }
SetHyphForbud(const sal_Bool bNew)629 	inline void SetHyphForbud( const sal_Bool bNew )
630 		{ if ( pFly ) bNoMidHyph = bNew; else bNoEndHyph = bNew; }
ChkNoHyph(const sal_uInt8 bEnd,const sal_uInt8 bMid)631 	inline void ChkNoHyph( const sal_uInt8 bEnd, const sal_uInt8 bMid )
632 		{ bNoEndHyph = (nMaxHyph && bEnd >= nMaxHyph);
633 		  bNoMidHyph = (nMaxHyph && bMid >= nMaxHyph); }
IsIgnoreFly() const634 	inline sal_Bool IsIgnoreFly() const { return bIgnoreFly; }
SetIgnoreFly(const sal_Bool bNew)635 	inline void SetIgnoreFly( const sal_Bool bNew ) { bIgnoreFly = bNew; }
IsFakeLineStart() const636     inline sal_Bool IsFakeLineStart() const { return bFakeLineStart; }
SetFakeLineStart(const sal_Bool bNew)637     inline void SetFakeLineStart( const sal_Bool bNew ) { bFakeLineStart = bNew; }
IsStop() const638 	inline sal_Bool IsStop() const { return bStop; }
SetStop(const sal_Bool bNew)639 	inline void SetStop( const sal_Bool bNew ) { bStop = bNew; }
GetRest()640 	inline SwLinePortion *GetRest() { return pRest; }
SetRest(SwLinePortion * pNewRest)641 	inline void SetRest( SwLinePortion *pNewRest ) { pRest = pNewRest; }
IsNewLine() const642 	inline sal_Bool IsNewLine() const { return bNewLine; }
SetNewLine(const sal_Bool bNew)643 	inline void SetNewLine( const sal_Bool bNew ) { bNewLine = bNew; }
IsShift() const644 	inline sal_Bool IsShift() const { return bShift; }
SetShift(const sal_Bool bNew)645 	inline void SetShift( const sal_Bool bNew ) { bShift = bNew; }
IsInterHyph() const646 	inline sal_Bool IsInterHyph() const { return bInterHyph; }
IsAutoHyph() const647 	inline sal_Bool IsAutoHyph() const { return bAutoHyph; }
IsUnderFlow() const648 	inline sal_Bool IsUnderFlow() const { return bUnderFlow; }
ClrUnderFlow()649 	inline void ClrUnderFlow() { bUnderFlow = sal_False; }
IsDropInit() const650 	inline sal_Bool IsDropInit() const { return bDropInit; }
SetDropInit(const sal_Bool bNew)651 	inline void SetDropInit( const sal_Bool bNew ) { bDropInit = bNew; }
IsQuick() const652 	inline sal_Bool IsQuick() const { return bQuick; }
IsTest() const653 	inline sal_Bool IsTest() const { return bTestFormat; }
654 
GetLineStart() const655 	inline xub_StrLen GetLineStart() const { return nLineStart; }
SetLineStart(const xub_StrLen nNew)656 	inline void SetLineStart( const xub_StrLen nNew ) { nLineStart = nNew; }
657 
658     // these are used during fly calculation
GetLineHeight() const659     inline KSHORT GetLineHeight() const { return nLineHeight; }
SetLineHeight(const KSHORT nNew)660 	inline void SetLineHeight( const KSHORT nNew ) { nLineHeight = nNew; }
GetLineNettoHeight() const661     inline KSHORT GetLineNettoHeight() const { return nLineNettoHeight; }
SetLineNettoHeight(const KSHORT nNew)662     inline void SetLineNettoHeight( const KSHORT nNew ) { nLineNettoHeight = nNew; }
663 
GetUnderFlow() const664 	inline const SwLinePortion *GetUnderFlow() const { return pUnderFlow; }
GetUnderFlow()665 	inline SwLinePortion *GetUnderFlow() { return pUnderFlow; }
SetUnderFlow(SwLinePortion * pNew)666 	inline void SetUnderFlow( SwLinePortion *pNew )
667 		   { pUnderFlow = pNew; bUnderFlow = sal_True; }
GetSoftHyphPos() const668 	inline xub_StrLen GetSoftHyphPos() const { return nSoftHyphPos; }
SetSoftHyphPos(const xub_StrLen nNew)669 	inline void SetSoftHyphPos( const xub_StrLen nNew ) { nSoftHyphPos = nNew; }
670 
671 	inline void SetParaFtn();
672 
673 	// FlyFrms
GetFly()674 	inline SwFlyPortion *GetFly() { return pFly; }
SetFly(SwFlyPortion * pNew)675 	inline void SetFly( SwFlyPortion *pNew ) { pFly = pNew; }
676 
677 	inline const SwAttrSet& GetCharAttr() const;
678 
679 	// Tabs
GetLastTab()680 	inline SwTabPortion *GetLastTab() { return pLastTab; }
SetLastTab(SwTabPortion * pNew)681 	inline void SetLastTab( SwTabPortion *pNew ) { pLastTab = pNew; }
GetTabDecimal() const682 	inline xub_Unicode GetTabDecimal() const { return cTabDecimal; }
SetTabDecimal(const xub_Unicode cNew)683 	inline void SetTabDecimal( const xub_Unicode cNew ) { cTabDecimal = cNew;}
684 
685 	// Last*
GetLastFld()686 	inline SwFldPortion *GetLastFld() { return pLastFld; }
SetLastFld(SwFldPortion * pNew)687 	inline void SetLastFld( SwFldPortion *pNew ) { pLastFld = pNew; }
688 
ClearHookChar()689 	inline void ClearHookChar() { cHookChar = 0; }
SetHookChar(const xub_Unicode cNew)690 	inline void SetHookChar( const xub_Unicode cNew ) { cHookChar = cNew; }
GetHookChar() const691 	inline xub_Unicode GetHookChar() const { return cHookChar; }
692 
693 	// Done-Flags
IsFtnDone() const694 	inline sal_Bool IsFtnDone() const { return bFtnDone; }
SetFtnDone(const sal_Bool bNew)695 	inline void SetFtnDone( const sal_Bool bNew ) { bFtnDone = bNew; }
IsErgoDone() const696 	inline sal_Bool IsErgoDone() const { return bErgoDone; }
SetErgoDone(const sal_Bool bNew)697 	inline void SetErgoDone( const sal_Bool bNew ) { bErgoDone = bNew; }
IsNumDone() const698 	inline sal_Bool IsNumDone() const { return bNumDone; }
SetNumDone(const sal_Bool bNew)699 	inline void SetNumDone( const sal_Bool bNew ) { bNumDone = bNew; }
IsArrowDone() const700 	inline sal_Bool IsArrowDone() const { return bArrowDone; }
SetArrowDone(const sal_Bool bNew)701 	inline void SetArrowDone( const sal_Bool bNew ) { bArrowDone = bNew; }
702 
703 	// Fuer SwTxtPortion::Hyphenate
704 	inline sal_Bool IsSoftHyph( const xub_StrLen nPos ) const;
705 	sal_Bool ChgHyph( const sal_Bool bNew );
706 
707 	// Soll die Trennhilfe angeschmissen werden?
708 	sal_Bool IsHyphenate() const;
SetHyphStart(const xub_StrLen nNew)709 	inline void SetHyphStart( const xub_StrLen nNew ) { nHyphStart = nNew; }
GetHyphStart() const710 	inline xub_StrLen GetHyphStart() const { return nHyphStart; }
SetHyphWrdStart(const xub_StrLen nNew)711 	inline void SetHyphWrdStart( const xub_StrLen nNew ) { nHyphWrdStart = nNew; }
GetHyphWrdStart() const712 	inline xub_StrLen GetHyphWrdStart() const { return nHyphWrdStart; }
SetHyphWrdLen(const xub_StrLen nNew)713 	inline void SetHyphWrdLen( const xub_StrLen nNew ) { nHyphWrdLen = nNew; }
GetHyphWrdLen() const714 	inline xub_StrLen GetHyphWrdLen() const { return nHyphWrdLen; }
GetUnderScorePos() const715     inline xub_StrLen GetUnderScorePos() const { return nUnderScorePos; }
SetUnderScorePos(xub_StrLen nNew)716     inline void SetUnderScorePos( xub_StrLen nNew ) { nUnderScorePos = nNew; }
717 
718 	// ruft HyphenateWord() des Hyphenators
719 	::com::sun::star::uno::Reference<
720 		::com::sun::star::linguistic2::XHyphenatedWord >
721 				HyphWord( const String &rTxt, const sal_uInt16 nMinTrail );
722 	const com::sun::star::beans::PropertyValues	&
723 				GetHyphValues() const;
724 
CheckFtnPortion(SwLineLayout * pCurr)725 	sal_Bool CheckFtnPortion( SwLineLayout* pCurr )
726 		{ return IsFtnInside() && _CheckFtnPortion( pCurr ); }
727 
728 	// Dropcaps vom SwTxtFormatter::CTOR gerufen.
729 	const SwFmtDrop *GetDropFmt() const;
730 
731 	// setzt die FormatInfo wieder in den Anfangszustand
732 	void Reset( const SwTxtFrm *pFrame); // , const sal_Bool bAll );
733 
734 	// Sets the last SwKernPortion as pLast, if it is followed by empty portions
735 	sal_Bool LastKernPortion();
736 
737     // Sucht ab nIdx bis nEnd nach Tabs, TabDec, TXTATR und BRK.
738 	// Return: gefundene Position, setzt ggf. cHookChar
739     xub_StrLen ScanPortionEnd( const xub_StrLen nStart, const xub_StrLen nEnd );
740 
741 //	friend ostream &operator<<( ostream &rOS, const SwTxtFormatInfo &rInf );
742 	friend SvStream &operator<<( SvStream &rOS, const SwTxtFormatInfo &rInf );
743 };
744 
745 /*************************************************************************
746  *						class SwTxtSlot
747  *************************************************************************/
748 
749 // Fuer die Textersetzung und Restaurierung der SwTxtSizeInfo.
750 // Die Art und Weise ist etwas kriminell, rInf ist const und wird
751 // trotzdem veraendert. Da rInf im DTOR wieder restauriert wird,
752 // ist dies zulaessig, es handelt sich um ein "logisches const".
753 
754 class SwTxtSlot
755 {
756     XubString aTxt;
757     const XubString *pOldTxt;
758     const SwWrongList* pOldSmartTagList;
759     const SwWrongList* pOldGrammarCheckList;
760     SwWrongList* pTempList;
761     xub_StrLen nIdx;
762 	xub_StrLen nLen;
763 	sal_Bool bOn;
764 protected:
765 	SwTxtSizeInfo *pInf;
766 public:
767     // Der Ersetzungstring kommt wahlweise aus der Portion via GetExpText()
768     // oder aus dem char Pointer pCh, wenn dieser ungleich NULL ist.
769     SwTxtSlot( const SwTxtSizeInfo *pNew, const SwLinePortion *pPor, bool bTxtLen,
770                bool bExgLists, const sal_Char *pCh = NULL );
771     ~SwTxtSlot();
IsOn() const772 	inline sal_Bool IsOn() const { return bOn; }
773 };
774 
775 /*************************************************************************
776  *						class SwFontSave
777  *************************************************************************/
778 
779 class SwFontSave
780 {
781 	SwTxtSizeInfo *pInf;
782 	SwFont		  *pFnt;
783 	SwAttrIter	  *pIter;
784 public:
785 	SwFontSave( const SwTxtSizeInfo &rInf, SwFont *pFnt,
786 				SwAttrIter* pItr = NULL );
787    ~SwFontSave();
788 };
789 
790 /*************************************************************************
791  *						class SwDefFontSave
792  *************************************************************************/
793 
794 class SwDefFontSave
795 {
796 	SwTxtSizeInfo *pInf;
797 	SwFont		  *pFnt;
798 	SwFont		  *pNewFnt;
799 	sal_Bool		   bAlter;
800 public:
801 	SwDefFontSave( const SwTxtSizeInfo &rInf );
802    ~SwDefFontSave();
803 };
804 
805 /*************************************************************************
806  *                       Inline-Implementierungen SwTxtSizeInfo
807  *************************************************************************/
808 
GetAscent() const809 inline KSHORT SwTxtSizeInfo::GetAscent() const
810 {
811     ASSERT( GetOut(), "SwTxtSizeInfo::GetAscent() without pOut" )
812     return ((SwFont*)GetFont())->GetAscent( pVsh, *GetOut() );
813 }
814 
GetTxtHeight() const815 inline KSHORT SwTxtSizeInfo::GetTxtHeight() const
816 {
817     ASSERT( GetOut(), "SwTxtSizeInfo::GetTxtHeight() without pOut" )
818     return ((SwFont*)GetFont())->GetHeight( pVsh, *GetOut() );
819 }
820 
GetTxtSize(const XubString & rTxt) const821 inline SwPosSize SwTxtSizeInfo::GetTxtSize( const XubString &rTxt ) const
822 {
823     return GetTxtSize( pOut, 0, rTxt, 0, rTxt.Len(), 0 );
824 }
825 
GetTxtSize(const SwScriptInfo * pSI,const xub_StrLen nNewIdx,const xub_StrLen nNewLen,const sal_uInt16 nCompress) const826 inline SwPosSize SwTxtSizeInfo::GetTxtSize( const SwScriptInfo* pSI,
827                                             const xub_StrLen nNewIdx,
828                                             const xub_StrLen nNewLen,
829                                             const sal_uInt16 nCompress ) const
830 {
831     return GetTxtSize( pOut, pSI, *pTxt, nNewIdx, nNewLen, nCompress );
832 }
833 
834 /*************************************************************************
835  *                       Inline-Implementierungen SwTxtPaintInfo
836  *************************************************************************/
837 
GetPaintOfst() const838 inline SwTwips SwTxtPaintInfo::GetPaintOfst() const
839 {
840 	return GetParaPortion()->GetRepaint()->GetOfst();
841 }
842 
SetPaintOfst(const SwTwips nNew)843 inline void SwTxtPaintInfo::SetPaintOfst( const SwTwips nNew )
844 {
845 	GetParaPortion()->GetRepaint()->SetOfst( nNew );
846 }
847 
848 
DrawText(const XubString & rText,const SwLinePortion & rPor,const xub_StrLen nStart,const xub_StrLen nLength,const sal_Bool bKern) const849 inline void SwTxtPaintInfo::DrawText( const XubString &rText,
850 							const SwLinePortion &rPor,
851                             const xub_StrLen nStart, const xub_StrLen nLength,
852 							const sal_Bool bKern ) const
853 {
854     ((SwTxtPaintInfo*)this)->_DrawText( rText, rPor, nStart, nLength, bKern );
855 }
856 
DrawText(const SwLinePortion & rPor,const xub_StrLen nLength,const sal_Bool bKern) const857 inline void SwTxtPaintInfo::DrawText( const SwLinePortion &rPor,
858         const xub_StrLen nLength, const sal_Bool bKern ) const
859 {
860     ((SwTxtPaintInfo*)this)->_DrawText( *pTxt, rPor, nIdx, nLength, bKern );
861 }
862 
DrawMarkedText(const SwLinePortion & rPor,const xub_StrLen nLength,const sal_Bool bKern,const sal_Bool bWrong,const sal_Bool bSmartTags,const sal_Bool bGrammarCheck) const863 inline void SwTxtPaintInfo::DrawMarkedText( const SwLinePortion &rPor,
864                                             const xub_StrLen nLength,
865                                             const sal_Bool bKern,
866                                             const sal_Bool bWrong,
867                                             const sal_Bool bSmartTags,
868                                             const sal_Bool bGrammarCheck ) const
869 {
870     ((SwTxtPaintInfo*)this)->_DrawText( *pTxt, rPor, nIdx, nLength, bKern, bWrong, bSmartTags, bGrammarCheck );
871 }
872 
873 /*************************************************************************
874  *                       Inline-Implementierungen SwTxtFormatInfo
875  *************************************************************************/
876 
GetReformatStart() const877 inline xub_StrLen SwTxtFormatInfo::GetReformatStart() const
878 {
879 	return GetParaPortion()->GetReformat()->Start();
880 }
881 
GetCharAttr() const882 inline const SwAttrSet& SwTxtFormatInfo::GetCharAttr() const
883 {
884 	return GetTxtFrm()->GetTxtNode()->GetSwAttrSet();
885 }
886 
SetParaFtn()887 inline void SwTxtFormatInfo::SetParaFtn()
888 {
889 	GetTxtFrm()->SetFtn( sal_True );
890 }
891 
IsSoftHyph(const xub_StrLen nPos) const892 inline sal_Bool SwTxtFormatInfo::IsSoftHyph( const xub_StrLen nPos ) const
893 {
894 	return CHAR_SOFTHYPHEN == GetTxtFrm()->GetTxtNode()->GetTxt().GetChar(nPos);
895 }
896 
897 
898 
899 #endif
900 
901