xref: /AOO41X/main/sw/source/core/text/inftxt.hxx (revision 8809db7a87f97847b57a57f4cd2b0104b2b83182)
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 SwTwips CurrLeft() const { return (nLineStart ? nLeft : nFirst); }
612     inline KSHORT RealWidth() const { return nRealWidth; }
613     inline void RealWidth( const KSHORT nNew ) { nRealWidth = nNew; }
614     inline KSHORT ForcedLeftMargin() const { return nForcedLeftMargin; }
615     inline void ForcedLeftMargin( const KSHORT nN ) { nForcedLeftMargin = nN; }
616 
617     inline sal_uInt8 &MaxHyph() { return nMaxHyph; }
618     inline const sal_uInt8 &MaxHyph() const { return nMaxHyph; }
619 
620     inline SwLineLayout *GetRoot() { return pRoot; }
621     inline const SwLineLayout *GetRoot() const { return pRoot; }
622 
623     inline void SetRoot( SwLineLayout *pNew ) { pRoot = pNew; }
624     inline SwLinePortion *GetLast() { return pLast; }
625     inline void SetLast( SwLinePortion *pNewLast ) { pLast = pNewLast; }
626     inline sal_Bool IsFull() const { return bFull; }
627     inline void SetFull( const sal_Bool bNew ) { bFull = bNew; }
628     inline sal_Bool IsHyphForbud() const
629         { return pFly ? bNoMidHyph : bNoEndHyph; }
630     inline void SetHyphForbud( const sal_Bool bNew )
631         { if ( pFly ) bNoMidHyph = bNew; else bNoEndHyph = bNew; }
632     inline void ChkNoHyph( const sal_uInt8 bEnd, const sal_uInt8 bMid )
633         { bNoEndHyph = (nMaxHyph && bEnd >= nMaxHyph);
634           bNoMidHyph = (nMaxHyph && bMid >= nMaxHyph); }
635     inline sal_Bool IsIgnoreFly() const { return bIgnoreFly; }
636     inline void SetIgnoreFly( const sal_Bool bNew ) { bIgnoreFly = bNew; }
637     inline sal_Bool IsFakeLineStart() const { return bFakeLineStart; }
638     inline void SetFakeLineStart( const sal_Bool bNew ) { bFakeLineStart = bNew; }
639     inline sal_Bool IsStop() const { return bStop; }
640     inline void SetStop( const sal_Bool bNew ) { bStop = bNew; }
641     inline SwLinePortion *GetRest() { return pRest; }
642     inline void SetRest( SwLinePortion *pNewRest ) { pRest = pNewRest; }
643     inline sal_Bool IsNewLine() const { return bNewLine; }
644     inline void SetNewLine( const sal_Bool bNew ) { bNewLine = bNew; }
645     inline sal_Bool IsShift() const { return bShift; }
646     inline void SetShift( const sal_Bool bNew ) { bShift = bNew; }
647     inline sal_Bool IsInterHyph() const { return bInterHyph; }
648     inline sal_Bool IsAutoHyph() const { return bAutoHyph; }
649     inline sal_Bool IsUnderFlow() const { return bUnderFlow; }
650     inline void ClrUnderFlow() { bUnderFlow = sal_False; }
651     inline sal_Bool IsDropInit() const { return bDropInit; }
652     inline void SetDropInit( const sal_Bool bNew ) { bDropInit = bNew; }
653     inline sal_Bool IsQuick() const { return bQuick; }
654     inline sal_Bool IsTest() const { return bTestFormat; }
655 
656     inline xub_StrLen GetLineStart() const { return nLineStart; }
657     inline void SetLineStart( const xub_StrLen nNew ) { nLineStart = nNew; }
658 
659     // these are used during fly calculation
660     inline KSHORT GetLineHeight() const { return nLineHeight; }
661     inline void SetLineHeight( const KSHORT nNew ) { nLineHeight = nNew; }
662     inline KSHORT GetLineNettoHeight() const { return nLineNettoHeight; }
663     inline void SetLineNettoHeight( const KSHORT nNew ) { nLineNettoHeight = nNew; }
664 
665     inline const SwLinePortion *GetUnderFlow() const { return pUnderFlow; }
666     inline SwLinePortion *GetUnderFlow() { return pUnderFlow; }
667     inline void SetUnderFlow( SwLinePortion *pNew )
668            { pUnderFlow = pNew; bUnderFlow = sal_True; }
669     inline xub_StrLen GetSoftHyphPos() const { return nSoftHyphPos; }
670     inline void SetSoftHyphPos( const xub_StrLen nNew ) { nSoftHyphPos = nNew; }
671 
672     inline void SetParaFtn();
673 
674     // FlyFrms
675     inline SwFlyPortion *GetFly() { return pFly; }
676     inline void SetFly( SwFlyPortion *pNew ) { pFly = pNew; }
677 
678     inline const SwAttrSet& GetCharAttr() const;
679 
680     // Tabs
681     inline SwTabPortion *GetLastTab() { return pLastTab; }
682     inline void SetLastTab( SwTabPortion *pNew ) { pLastTab = pNew; }
683     inline xub_Unicode GetTabDecimal() const { return cTabDecimal; }
684     inline void SetTabDecimal( const xub_Unicode cNew ) { cTabDecimal = cNew;}
685 
686     // Last*
687     inline SwFldPortion *GetLastFld() { return pLastFld; }
688     inline void SetLastFld( SwFldPortion *pNew ) { pLastFld = pNew; }
689 
690     inline void ClearHookChar() { cHookChar = 0; }
691     inline void SetHookChar( const xub_Unicode cNew ) { cHookChar = cNew; }
692     inline xub_Unicode GetHookChar() const { return cHookChar; }
693 
694     // Done-Flags
695     inline sal_Bool IsFtnDone() const { return bFtnDone; }
696     inline void SetFtnDone( const sal_Bool bNew ) { bFtnDone = bNew; }
697     inline sal_Bool IsErgoDone() const { return bErgoDone; }
698     inline void SetErgoDone( const sal_Bool bNew ) { bErgoDone = bNew; }
699     inline sal_Bool IsNumDone() const { return bNumDone; }
700     inline void SetNumDone( const sal_Bool bNew ) { bNumDone = bNew; }
701     inline sal_Bool IsArrowDone() const { return bArrowDone; }
702     inline void SetArrowDone( const sal_Bool bNew ) { bArrowDone = bNew; }
703 
704     // Fuer SwTxtPortion::Hyphenate
705     inline sal_Bool IsSoftHyph( const xub_StrLen nPos ) const;
706     sal_Bool ChgHyph( const sal_Bool bNew );
707 
708     // Soll die Trennhilfe angeschmissen werden?
709     sal_Bool IsHyphenate() const;
710     inline void SetHyphStart( const xub_StrLen nNew ) { nHyphStart = nNew; }
711     inline xub_StrLen GetHyphStart() const { return nHyphStart; }
712     inline void SetHyphWrdStart( const xub_StrLen nNew ) { nHyphWrdStart = nNew; }
713     inline xub_StrLen GetHyphWrdStart() const { return nHyphWrdStart; }
714     inline void SetHyphWrdLen( const xub_StrLen nNew ) { nHyphWrdLen = nNew; }
715     inline xub_StrLen GetHyphWrdLen() const { return nHyphWrdLen; }
716     inline xub_StrLen GetUnderScorePos() const { return nUnderScorePos; }
717     inline void SetUnderScorePos( xub_StrLen nNew ) { nUnderScorePos = nNew; }
718 
719     // ruft HyphenateWord() des Hyphenators
720     ::com::sun::star::uno::Reference<
721         ::com::sun::star::linguistic2::XHyphenatedWord >
722                 HyphWord( const String &rTxt, const sal_uInt16 nMinTrail );
723     const com::sun::star::beans::PropertyValues &
724                 GetHyphValues() const;
725 
726     sal_Bool CheckFtnPortion( SwLineLayout* pCurr )
727         { return IsFtnInside() && _CheckFtnPortion( pCurr ); }
728 
729     // Dropcaps vom SwTxtFormatter::CTOR gerufen.
730     const SwFmtDrop *GetDropFmt() const;
731 
732     // setzt die FormatInfo wieder in den Anfangszustand
733     void Reset( const SwTxtFrm *pFrame); // , const sal_Bool bAll );
734 
735     // Sets the last SwKernPortion as pLast, if it is followed by empty portions
736     sal_Bool LastKernPortion();
737 
738     // Sucht ab nIdx bis nEnd nach Tabs, TabDec, TXTATR und BRK.
739     // Return: gefundene Position, setzt ggf. cHookChar
740     xub_StrLen ScanPortionEnd( const xub_StrLen nStart, const xub_StrLen nEnd );
741 
742 //  friend ostream &operator<<( ostream &rOS, const SwTxtFormatInfo &rInf );
743     friend SvStream &operator<<( SvStream &rOS, const SwTxtFormatInfo &rInf );
744 };
745 
746 /*************************************************************************
747  *                      class SwTxtSlot
748  *************************************************************************/
749 
750 // Fuer die Textersetzung und Restaurierung der SwTxtSizeInfo.
751 // Die Art und Weise ist etwas kriminell, rInf ist const und wird
752 // trotzdem veraendert. Da rInf im DTOR wieder restauriert wird,
753 // ist dies zulaessig, es handelt sich um ein "logisches const".
754 
755 class SwTxtSlot
756 {
757     XubString aTxt;
758     const XubString *pOldTxt;
759     const SwWrongList* pOldSmartTagList;
760     const SwWrongList* pOldGrammarCheckList;
761     SwWrongList* pTempList;
762     xub_StrLen nIdx;
763     xub_StrLen nLen;
764     sal_Bool bOn;
765 protected:
766     SwTxtSizeInfo *pInf;
767 public:
768     // Der Ersetzungstring kommt wahlweise aus der Portion via GetExpText()
769     // oder aus dem char Pointer pCh, wenn dieser ungleich NULL ist.
770     SwTxtSlot( const SwTxtSizeInfo *pNew, const SwLinePortion *pPor, bool bTxtLen,
771                bool bExgLists, const sal_Char *pCh = NULL );
772     ~SwTxtSlot();
773     inline sal_Bool IsOn() const { return bOn; }
774 };
775 
776 /*************************************************************************
777  *                      class SwFontSave
778  *************************************************************************/
779 
780 class SwFontSave
781 {
782     SwTxtSizeInfo *pInf;
783     SwFont        *pFnt;
784     SwAttrIter    *pIter;
785 public:
786     SwFontSave( const SwTxtSizeInfo &rInf, SwFont *pFnt,
787                 SwAttrIter* pItr = NULL );
788    ~SwFontSave();
789 };
790 
791 /*************************************************************************
792  *                      class SwDefFontSave
793  *************************************************************************/
794 
795 class SwDefFontSave
796 {
797     SwTxtSizeInfo *pInf;
798     SwFont        *pFnt;
799     SwFont        *pNewFnt;
800     sal_Bool           bAlter;
801 public:
802     SwDefFontSave( const SwTxtSizeInfo &rInf );
803    ~SwDefFontSave();
804 };
805 
806 /*************************************************************************
807  *                       Inline-Implementierungen SwTxtSizeInfo
808  *************************************************************************/
809 
810 inline KSHORT SwTxtSizeInfo::GetAscent() const
811 {
812     ASSERT( GetOut(), "SwTxtSizeInfo::GetAscent() without pOut" )
813     return ((SwFont*)GetFont())->GetAscent( pVsh, *GetOut() );
814 }
815 
816 inline KSHORT SwTxtSizeInfo::GetTxtHeight() const
817 {
818     ASSERT( GetOut(), "SwTxtSizeInfo::GetTxtHeight() without pOut" )
819     return ((SwFont*)GetFont())->GetHeight( pVsh, *GetOut() );
820 }
821 
822 inline SwPosSize SwTxtSizeInfo::GetTxtSize( const XubString &rTxt ) const
823 {
824     return GetTxtSize( pOut, 0, rTxt, 0, rTxt.Len(), 0 );
825 }
826 
827 inline SwPosSize SwTxtSizeInfo::GetTxtSize( const SwScriptInfo* pSI,
828                                             const xub_StrLen nNewIdx,
829                                             const xub_StrLen nNewLen,
830                                             const sal_uInt16 nCompress ) const
831 {
832     return GetTxtSize( pOut, pSI, *pTxt, nNewIdx, nNewLen, nCompress );
833 }
834 
835 /*************************************************************************
836  *                       Inline-Implementierungen SwTxtPaintInfo
837  *************************************************************************/
838 
839 inline SwTwips SwTxtPaintInfo::GetPaintOfst() const
840 {
841     return GetParaPortion()->GetRepaint()->GetOfst();
842 }
843 
844 inline void SwTxtPaintInfo::SetPaintOfst( const SwTwips nNew )
845 {
846     GetParaPortion()->GetRepaint()->SetOfst( nNew );
847 }
848 
849 
850 inline void SwTxtPaintInfo::DrawText( const XubString &rText,
851                             const SwLinePortion &rPor,
852                             const xub_StrLen nStart, const xub_StrLen nLength,
853                             const sal_Bool bKern ) const
854 {
855     ((SwTxtPaintInfo*)this)->_DrawText( rText, rPor, nStart, nLength, bKern );
856 }
857 
858 inline void SwTxtPaintInfo::DrawText( const SwLinePortion &rPor,
859         const xub_StrLen nLength, const sal_Bool bKern ) const
860 {
861     ((SwTxtPaintInfo*)this)->_DrawText( *pTxt, rPor, nIdx, nLength, bKern );
862 }
863 
864 inline void SwTxtPaintInfo::DrawMarkedText( const SwLinePortion &rPor,
865                                             const xub_StrLen nLength,
866                                             const sal_Bool bKern,
867                                             const sal_Bool bWrong,
868                                             const sal_Bool bSmartTags,
869                                             const sal_Bool bGrammarCheck ) const
870 {
871     ((SwTxtPaintInfo*)this)->_DrawText( *pTxt, rPor, nIdx, nLength, bKern, bWrong, bSmartTags, bGrammarCheck );
872 }
873 
874 /*************************************************************************
875  *                       Inline-Implementierungen SwTxtFormatInfo
876  *************************************************************************/
877 
878 inline xub_StrLen SwTxtFormatInfo::GetReformatStart() const
879 {
880     return GetParaPortion()->GetReformat()->Start();
881 }
882 
883 inline const SwAttrSet& SwTxtFormatInfo::GetCharAttr() const
884 {
885     return GetTxtFrm()->GetTxtNode()->GetSwAttrSet();
886 }
887 
888 inline void SwTxtFormatInfo::SetParaFtn()
889 {
890     GetTxtFrm()->SetFtn( sal_True );
891 }
892 
893 inline sal_Bool SwTxtFormatInfo::IsSoftHyph( const xub_StrLen nPos ) const
894 {
895     return CHAR_SOFTHYPHEN == GetTxtFrm()->GetTxtNode()->GetTxt().GetChar(nPos);
896 }
897 
898 
899 
900 #endif
901 
902