xref: /AOO41X/main/sw/source/core/text/inftxt.hxx (revision 772b8e0b82570e4556f647a63961304db1bf493b)
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;
118 	inline const SvxLineSpacingItem *GetLineSpacing() const { return pSpace; }
119 	inline KSHORT GetDefTabStop() const { return nDefTabStop; }
120 	inline void SetDefTabStop( KSHORT nNew ) const
121 		{ ( (SwLineInfo*)this )->nDefTabStop = nNew; }
122 
123     // vertical alignment
124     inline sal_uInt16 GetVertAlign() const { return nVertAlign; }
125     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#
134     inline bool IsListTabStopIncluded() const
135     {
136         return bListTabStopIncluded;
137     }
138     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:
161 	inline SwTxtInfo() { }
162 public:
163 	void CtorInitTxtInfo( SwTxtFrm *pFrm );
164 	SwTxtInfo( const SwTxtInfo &rInf );
165 	inline SwTxtInfo( SwTxtFrm *pFrm ) { CtorInitTxtInfo( pFrm ); }
166 	inline SwParaPortion *GetParaPortion() { return pPara; }
167 	inline const SwParaPortion *GetParaPortion() const { return pPara; }
168 	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 );
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 
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 
242 	inline sal_Bool OnWin() const { return bOnWin; }
243 	inline void SetOnWin( const sal_Bool bNew ) { bOnWin = bNew; }
244 	inline sal_Bool NotEOL() const { return bNotEOL; }
245 	inline void SetNotEOL( const sal_Bool bNew ) { bNotEOL = bNew; }
246 	inline sal_Bool URLNotify() const { return bURLNotify; }
247 	inline void SetURLNotify( const sal_Bool bNew ) { bURLNotify = bNew; }
248 	inline sal_Bool StopUnderFlow() const { return bStopUnderFlow; }
249 	inline void SetStopUnderFlow( const sal_Bool bNew ) { bStopUnderFlow = bNew; }
250 	inline sal_Bool IsFtnInside() const { return bFtnInside; }
251 	inline void SetFtnInside( const sal_Bool bNew ) { bFtnInside = bNew; }
252     inline sal_Bool IsOtherThanFtnInside() const { return bOtherThanFtnInside; }
253     inline void SetOtherThanFtnInside( const sal_Bool bNew ) { bOtherThanFtnInside = bNew; }
254 	inline sal_Bool IsMulti() const { return bMulti; }
255 	inline void SetMulti( const sal_Bool bNew ) { bMulti = bNew; }
256 	inline sal_Bool IsFirstMulti() const { return bFirstMulti; }
257 	inline void SetFirstMulti( const sal_Bool bNew ) { bFirstMulti = bNew; }
258 	inline sal_Bool IsRuby() const { return bRuby; }
259 	inline void SetRuby( const sal_Bool bNew ) { bRuby = bNew; }
260 	inline sal_Bool IsHanging() const { return bHanging; }
261 	inline void SetHanging( const sal_Bool bNew ) { bHanging = bNew; }
262 	inline sal_Bool HasScriptSpace() const { return bScriptSpace; }
263 	inline void SetScriptSpace( const sal_Bool bNew ) { bScriptSpace = bNew; }
264 	inline sal_Bool HasForbiddenChars() const { return bForbiddenChars; }
265 	inline void SetForbiddenChars( const sal_Bool bN ) { bForbiddenChars = bN; }
266     inline sal_Bool SnapToGrid() const { return bSnapToGrid; }
267     inline void SetSnapToGrid( const sal_Bool bN ) { bSnapToGrid = bN; }
268     inline sal_uInt8 GetDirection() const { return nDirection; }
269 	inline void SetDirection( const sal_uInt8 nNew ) { nDirection = nNew; }
270 	inline sal_Bool IsRotated() const { return 0 != ( 1 & nDirection ); }
271 
272 	inline ViewShell *GetVsh() { return pVsh; }
273 	inline const ViewShell *GetVsh() const { return pVsh; }
274 
275     inline OutputDevice *GetOut() { return pOut; }
276 	inline const OutputDevice *GetOut() const { return pOut; }
277     inline void SetOut( OutputDevice* pNewOut ) { pOut = pNewOut; }
278 
279     inline OutputDevice *GetRefDev() { return pRef; }
280     inline const OutputDevice *GetRefDev() const { return pRef; }
281 
282     inline SwFont *GetFont() { return pFnt; }
283 	inline const SwFont *GetFont() const { return pFnt; }
284 	inline void SetFont( SwFont *pNew ) { pFnt = pNew; }
285 	void SelectFont();
286     inline void SetUnderFnt( SwUnderlineFont* pNew ) { pUnderFnt = pNew; }
287     inline SwUnderlineFont* GetUnderFnt() const { return pUnderFnt; }
288 
289 	inline const  SwViewOption &GetOpt() const { return *pOpt; }
290 	inline const XubString &GetTxt() const { return *pTxt; }
291 	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 
323 	inline xub_StrLen GetIdx() const { return nIdx; }
324 	inline void SetIdx( const xub_StrLen nNew ) { nIdx = nNew; }
325 	inline xub_StrLen GetLen() const { return nLen; }
326 	inline void SetLen( const xub_StrLen nNew ) { nLen = nNew; }
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!
332 	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...
338 	inline SwTxtFrm *GetTxtFrm() { return pFrm; }
339 	inline const SwTxtFrm *GetTxtFrm() const { return pFrm; }
340 
341 	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.
350     inline void SetMaxWidthDiff( sal_uLong nKey, sal_uInt16 nVal )
351     {
352         aMaxWidth.Insert( nKey, nVal );
353     };
354     inline sal_uInt16 GetMaxWidthDiff( sal_uLong nKey )
355     {
356         return (sal_uInt16)aMaxWidth.Get( nKey );
357     };
358     inline void ResetMaxWidthDiff()
359     {
360         aMaxWidth.Clear();
361     };
362     inline sal_Bool CompressLine()
363     {
364         return (sal_Bool)aMaxWidth.Count();
365     };
366 
367     //
368     // Feature: Kana Compression
369     //
370     inline MSHORT GetKanaIdx() const { return nKanaIdx; }
371     inline void ResetKanaIdx(){ nKanaIdx = 0; }
372     inline void SetKanaIdx( MSHORT nNew ) { nKanaIdx = nNew; }
373     inline void IncKanaIdx() { ++nKanaIdx; }
374     inline void SetKanaComp( SvUShorts *pNew ){ pKanaComp = pNew; }
375     inline SvUShorts* GetpKanaComp() const { return pKanaComp; }
376     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
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 
435 	void SetBack( const SvxBrushItem *pItem,
436 				  const SwRect &rRect ) { pBrushItem = pItem; aItemRect = rRect;}
437 	const SvxBrushItem *GetBrushItem() const { return pBrushItem; }
438 	const SwRect       &GetBrushRect() const { return aItemRect;  }
439 
440 	inline SwTxtPaintInfo( SwTxtFrm *pFrame, const SwRect &rPaint )
441 		   { CtorInitTxtPaintInfo( pFrame, rPaint ); }
442 
443 	inline SwTwips X() const { return aPos.X(); }
444 	inline void X( const long nNew ) { aPos.X() = nNew; }
445 	inline SwTwips Y() const { return aPos.Y(); }
446 	inline void Y( const SwTwips nNew ) { aPos.Y() = nNew; }
447 
448 	inline SwTxtFly *GetTxtFly() { return &aTxtFly; }
449 	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;
470 	inline void DrawBackBrush( const SwLinePortion &rPor ) const
471 	{ /* if( pFnt->GetBackColor() ) */ _DrawBackBrush( rPor ); }
472 
473     void DrawCheckBox( const SwFieldFormPortion &rPor, bool checked) const;
474 
475 	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 );
482 	inline const Point &GetPos() const { return aPos; }
483 	inline void SetPos( const Point &rNew ) { aPos = rNew; }
484 
485 	inline const SwRect &GetPaintRect() const { return aPaintRect; }
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     //
493     inline MSHORT GetSpaceIdx() const { return nSpaceIdx; }
494 	inline void ResetSpaceIdx(){nSpaceIdx = 0; }
495 	inline void SetSpaceIdx( MSHORT nNew ) { nSpaceIdx = nNew; }
496 	inline void IncSpaceIdx() { ++nSpaceIdx; }
497     inline void RemoveFirstSpaceAdd() { pSpaceAdd->erase( pSpaceAdd->begin() ); }
498     inline long GetSpaceAdd() const
499         { return ( pSpaceAdd && nSpaceIdx < pSpaceAdd->size() )
500 				   ? (*pSpaceAdd)[nSpaceIdx] : 0; }
501 
502     inline void SetpSpaceAdd( std::vector<long>* pNew ){ pSpaceAdd = pNew; }
503     inline std::vector<long>* GetpSpaceAdd() const { return pSpaceAdd; }
504 
505 
506     inline void SetWrongList( const SwWrongList *pNew ){ pWrongList = pNew; }
507     inline const SwWrongList* GetpWrongList() const { return pWrongList; }
508 
509     inline void SetGrammarCheckList( const SwWrongList *pNew ){ pGrammarCheckList = pNew; }
510     inline const SwWrongList* GetGrammarCheckList() const { return pGrammarCheckList; }
511 
512     // SMARTTAGS
513     inline void SetSmartTags( const SwWrongList *pNew ){ pSmartTags = pNew; }
514     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 );
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 
597 	inline KSHORT Width() const { return nWidth; }
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
605     inline SwTwips Left() const { return nLeft; }
606     inline void Left( const SwTwips nNew ) { nLeft = nNew; }
607     inline SwTwips Right() const { return nRight; }
608     inline void Right( const SwTwips nNew ) { nRight = nNew; }
609     inline SwTwips First() const { return nFirst; }
610     inline void First( const SwTwips nNew ) { nFirst = nNew; }
611 	inline KSHORT RealWidth() const { return nRealWidth; }
612 	inline void RealWidth( const KSHORT nNew ) { nRealWidth = nNew; }
613 	inline KSHORT ForcedLeftMargin() const { return nForcedLeftMargin; }
614 	inline void ForcedLeftMargin( const KSHORT nN ) { nForcedLeftMargin = nN; }
615 
616 	inline sal_uInt8 &MaxHyph() { return nMaxHyph; }
617 	inline const sal_uInt8 &MaxHyph() const { return nMaxHyph; }
618 
619 	inline SwLineLayout *GetRoot() { return pRoot; }
620 	inline const SwLineLayout *GetRoot() const { return pRoot; }
621 
622 	inline void SetRoot( SwLineLayout *pNew ) { pRoot = pNew; }
623 	inline SwLinePortion *GetLast() { return pLast; }
624 	inline void SetLast( SwLinePortion *pNewLast ) { pLast = pNewLast; }
625 	inline sal_Bool IsFull() const { return bFull; }
626 	inline void SetFull( const sal_Bool bNew ) { bFull = bNew; }
627 	inline sal_Bool IsHyphForbud() const
628 		{ return pFly ? bNoMidHyph : bNoEndHyph; }
629 	inline void SetHyphForbud( const sal_Bool bNew )
630 		{ if ( pFly ) bNoMidHyph = bNew; else bNoEndHyph = bNew; }
631 	inline void ChkNoHyph( const sal_uInt8 bEnd, const sal_uInt8 bMid )
632 		{ bNoEndHyph = (nMaxHyph && bEnd >= nMaxHyph);
633 		  bNoMidHyph = (nMaxHyph && bMid >= nMaxHyph); }
634 	inline sal_Bool IsIgnoreFly() const { return bIgnoreFly; }
635 	inline void SetIgnoreFly( const sal_Bool bNew ) { bIgnoreFly = bNew; }
636     inline sal_Bool IsFakeLineStart() const { return bFakeLineStart; }
637     inline void SetFakeLineStart( const sal_Bool bNew ) { bFakeLineStart = bNew; }
638 	inline sal_Bool IsStop() const { return bStop; }
639 	inline void SetStop( const sal_Bool bNew ) { bStop = bNew; }
640 	inline SwLinePortion *GetRest() { return pRest; }
641 	inline void SetRest( SwLinePortion *pNewRest ) { pRest = pNewRest; }
642 	inline sal_Bool IsNewLine() const { return bNewLine; }
643 	inline void SetNewLine( const sal_Bool bNew ) { bNewLine = bNew; }
644 	inline sal_Bool IsShift() const { return bShift; }
645 	inline void SetShift( const sal_Bool bNew ) { bShift = bNew; }
646 	inline sal_Bool IsInterHyph() const { return bInterHyph; }
647 	inline sal_Bool IsAutoHyph() const { return bAutoHyph; }
648 	inline sal_Bool IsUnderFlow() const { return bUnderFlow; }
649 	inline void ClrUnderFlow() { bUnderFlow = sal_False; }
650 	inline sal_Bool IsDropInit() const { return bDropInit; }
651 	inline void SetDropInit( const sal_Bool bNew ) { bDropInit = bNew; }
652 	inline sal_Bool IsQuick() const { return bQuick; }
653 	inline sal_Bool IsTest() const { return bTestFormat; }
654 
655 	inline xub_StrLen GetLineStart() const { return nLineStart; }
656 	inline void SetLineStart( const xub_StrLen nNew ) { nLineStart = nNew; }
657 
658     // these are used during fly calculation
659     inline KSHORT GetLineHeight() const { return nLineHeight; }
660 	inline void SetLineHeight( const KSHORT nNew ) { nLineHeight = nNew; }
661     inline KSHORT GetLineNettoHeight() const { return nLineNettoHeight; }
662     inline void SetLineNettoHeight( const KSHORT nNew ) { nLineNettoHeight = nNew; }
663 
664 	inline const SwLinePortion *GetUnderFlow() const { return pUnderFlow; }
665 	inline SwLinePortion *GetUnderFlow() { return pUnderFlow; }
666 	inline void SetUnderFlow( SwLinePortion *pNew )
667 		   { pUnderFlow = pNew; bUnderFlow = sal_True; }
668 	inline xub_StrLen GetSoftHyphPos() const { return nSoftHyphPos; }
669 	inline void SetSoftHyphPos( const xub_StrLen nNew ) { nSoftHyphPos = nNew; }
670 
671 	inline void SetParaFtn();
672 
673 	// FlyFrms
674 	inline SwFlyPortion *GetFly() { return pFly; }
675 	inline void SetFly( SwFlyPortion *pNew ) { pFly = pNew; }
676 
677 	inline const SwAttrSet& GetCharAttr() const;
678 
679 	// Tabs
680 	inline SwTabPortion *GetLastTab() { return pLastTab; }
681 	inline void SetLastTab( SwTabPortion *pNew ) { pLastTab = pNew; }
682 	inline xub_Unicode GetTabDecimal() const { return cTabDecimal; }
683 	inline void SetTabDecimal( const xub_Unicode cNew ) { cTabDecimal = cNew;}
684 
685 	// Last*
686 	inline SwFldPortion *GetLastFld() { return pLastFld; }
687 	inline void SetLastFld( SwFldPortion *pNew ) { pLastFld = pNew; }
688 
689 	inline void ClearHookChar() { cHookChar = 0; }
690 	inline void SetHookChar( const xub_Unicode cNew ) { cHookChar = cNew; }
691 	inline xub_Unicode GetHookChar() const { return cHookChar; }
692 
693 	// Done-Flags
694 	inline sal_Bool IsFtnDone() const { return bFtnDone; }
695 	inline void SetFtnDone( const sal_Bool bNew ) { bFtnDone = bNew; }
696 	inline sal_Bool IsErgoDone() const { return bErgoDone; }
697 	inline void SetErgoDone( const sal_Bool bNew ) { bErgoDone = bNew; }
698 	inline sal_Bool IsNumDone() const { return bNumDone; }
699 	inline void SetNumDone( const sal_Bool bNew ) { bNumDone = bNew; }
700 	inline sal_Bool IsArrowDone() const { return bArrowDone; }
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;
709 	inline void SetHyphStart( const xub_StrLen nNew ) { nHyphStart = nNew; }
710 	inline xub_StrLen GetHyphStart() const { return nHyphStart; }
711 	inline void SetHyphWrdStart( const xub_StrLen nNew ) { nHyphWrdStart = nNew; }
712 	inline xub_StrLen GetHyphWrdStart() const { return nHyphWrdStart; }
713 	inline void SetHyphWrdLen( const xub_StrLen nNew ) { nHyphWrdLen = nNew; }
714 	inline xub_StrLen GetHyphWrdLen() const { return nHyphWrdLen; }
715     inline xub_StrLen GetUnderScorePos() const { return nUnderScorePos; }
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 
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();
772 	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 
809 inline KSHORT SwTxtSizeInfo::GetAscent() const
810 {
811     ASSERT( GetOut(), "SwTxtSizeInfo::GetAscent() without pOut" )
812     return ((SwFont*)GetFont())->GetAscent( pVsh, *GetOut() );
813 }
814 
815 inline KSHORT SwTxtSizeInfo::GetTxtHeight() const
816 {
817     ASSERT( GetOut(), "SwTxtSizeInfo::GetTxtHeight() without pOut" )
818     return ((SwFont*)GetFont())->GetHeight( pVsh, *GetOut() );
819 }
820 
821 inline SwPosSize SwTxtSizeInfo::GetTxtSize( const XubString &rTxt ) const
822 {
823     return GetTxtSize( pOut, 0, rTxt, 0, rTxt.Len(), 0 );
824 }
825 
826 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 
838 inline SwTwips SwTxtPaintInfo::GetPaintOfst() const
839 {
840 	return GetParaPortion()->GetRepaint()->GetOfst();
841 }
842 
843 inline void SwTxtPaintInfo::SetPaintOfst( const SwTwips nNew )
844 {
845 	GetParaPortion()->GetRepaint()->SetOfst( nNew );
846 }
847 
848 
849 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 
857 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 
863 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 
877 inline xub_StrLen SwTxtFormatInfo::GetReformatStart() const
878 {
879 	return GetParaPortion()->GetReformat()->Start();
880 }
881 
882 inline const SwAttrSet& SwTxtFormatInfo::GetCharAttr() const
883 {
884 	return GetTxtFrm()->GetTxtNode()->GetSwAttrSet();
885 }
886 
887 inline void SwTxtFormatInfo::SetParaFtn()
888 {
889 	GetTxtFrm()->SetFtn( sal_True );
890 }
891 
892 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