1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: inftxt.hxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
32 #include <com/sun/star/linguistic2/XHyphenatedWord.hpp>
33 #include <com/sun/star/beans/PropertyValues.hpp>
35 #ifndef _TABLE_HXX //autogen
36 #include <tools/table.hxx>
39 #include "swtypes.hxx"
40 #include "txttypes.hxx"
47 #include "txttypes.hxx"
48 #include <svx/paravertalignitem.hxx>
53 class SvxLineSpacingItem
;
70 struct SwMultiCreator
;
74 /* Minimum: Prozentwert fuers kernen */
75 #define MINKERNPERCENT 5
76 #define ARROW_WIDTH 200
77 #define DIR_LEFT2RIGHT 0
78 #define DIR_BOTTOM2TOP 1
79 #define DIR_RIGHT2LEFT 2
80 #define DIR_TOP2BOTTOM 3
83 #define OPTCALM( rInf ) (rInf).IsOptCalm()
84 #define OPTLOW( rInf ) (rInf).IsOptLow()
85 #define OPTDBG( rInf ) (rInf).IsOptDbg()
87 #define OPTCALM( rInf ) sal_True
88 #define OPTLOW( rInf ) sal_False
89 #define OPTDBG( rInf ) sal_False
92 /*************************************************************************
94 *************************************************************************/
96 // Beruecksichtigt das Attribut LineSpace bei der Hoehen/Ascentberechnung.
100 friend class SwTxtIter
;
102 SvxTabStopItem
* pRuler
;
103 const SvxLineSpacingItem
*pSpace
;
106 // --> OD 2008-02-04 #newlistlevelattrs#
107 bool bListTabStopIncluded
;
108 long nListTabStopPosition
;
111 // --> OD 2008-01-17 #newlistlevelattrs#
112 void CtorInitLineInfo( const SwAttrSet
& rAttrSet
,
113 const SwTxtNode
& rTxtNode
);
116 // --> OD 2008-01-17 #newlistlevelattrs#
120 // const SvxTabStop *GetTabStop( const SwTwips nLinePos,
121 // const SwTwips nLeft,
122 // #i24363# tab stops relative to indent - returns the tab stop following nSearchPos or NULL
123 const SvxTabStop
*GetTabStop( const SwTwips nSearchPos
,
124 const SwTwips nRight
) const;
125 inline const SvxLineSpacingItem
*GetLineSpacing() const { return pSpace
; }
126 inline KSHORT
GetDefTabStop() const { return nDefTabStop
; }
127 inline void SetDefTabStop( KSHORT nNew
) const
128 { ( (SwLineInfo
*)this )->nDefTabStop
= nNew
; }
130 // vertical alignment
131 inline USHORT
GetVertAlign() const { return nVertAlign
; }
132 inline sal_Bool
HasSpecialAlign( sal_Bool bVert
) const
134 ( SvxParaVertAlignItem::BASELINE
!= nVertAlign
) :
135 ( SvxParaVertAlignItem::BASELINE
!= nVertAlign
&&
136 SvxParaVertAlignItem::AUTOMATIC
!= nVertAlign
); }
138 USHORT
NumberOfTabStops() const;
140 // --> OD 2008-02-04 #newlistlevelattrs#
141 inline bool IsListTabStopIncluded() const
143 return bListTabStopIncluded
;
145 inline long GetListTabStopPosition() const
147 return nListTabStopPosition
;
152 // friend ostream &operator<<( ostream &rOS, const SwLineInfo &rInf );
153 friend SvStream
&operator<<( SvStream
&rOS
, const SwLineInfo
&rInf
);
156 /*************************************************************************
158 *************************************************************************/
162 // Implementation in txthyph.cxx
163 friend void SetParaPortion( SwTxtInfo
*pInf
, SwParaPortion
*pRoot
);
164 SwParaPortion
*pPara
;
165 xub_StrLen nTxtStart
; // TxtOfst bei Follows
168 inline SwTxtInfo() { }
170 void CtorInitTxtInfo( SwTxtFrm
*pFrm
);
171 SwTxtInfo( const SwTxtInfo
&rInf
);
172 inline SwTxtInfo( SwTxtFrm
*pFrm
) { CtorInitTxtInfo( pFrm
); }
173 inline SwParaPortion
*GetParaPortion() { return pPara
; }
174 inline const SwParaPortion
*GetParaPortion() const { return pPara
; }
175 inline xub_StrLen
GetTxtStart() const { return nTxtStart
; }
177 friend SvStream
&operator<<( SvStream
&rOS
, const SwTxtInfo
&rInf
);
180 /*************************************************************************
181 * class SwTxtSizeInfo
182 *************************************************************************/
184 DECLARE_TABLE( SwTxtPortionTable
, sal_IntPtr
)
186 class SwTxtSizeInfo
: public SwTxtInfo
189 // during formatting, a small database is built, mapping portion pointers
190 // to their maximum size (used for kana compression)
191 SwTxtPortionTable aMaxWidth
;
192 // for each line, an array of compression values is calculated
193 // this array is passed over to the info structure
194 SvUShorts
* pKanaComp
;
198 // pOut is the output device, pRef is the device used for formatting
203 SwUnderlineFont
*pUnderFnt
; // Font for underlining
205 const SwViewOption
*pOpt
;
206 const XubString
*pTxt
;
207 xub_StrLen nIdx
, nLen
;
210 sal_Bool bNotEOL
: 1;
211 sal_Bool bURLNotify
: 1;
212 sal_Bool bStopUnderFlow
: 1;// Underflow gestoppt z.B. von einer FlyPortion
213 sal_Bool bFtnInside
: 1; // the current line contains a footnote
214 sal_Bool bMulti
: 1; // inside a multiportion
215 sal_Bool bFirstMulti
: 1; // this flag is used for two purposes:
216 // - the multiportion is the first lineportion
217 // - indicates, if we are currently in second
218 // line of multi portion
219 sal_Bool bRuby
: 1; // during the formatting of a phonetic line
220 sal_Bool bHanging
: 1; // formatting of hanging punctuation allowed
221 sal_Bool bScriptSpace
: 1; // space between different scripts (Asian/Latin)
222 sal_Bool bForbiddenChars
: 1; // Forbidden start/endline characters
223 sal_Bool bSnapToGrid
: 1; // paragraph snaps to grid
224 sal_uInt8 nDirection
: 2; // writing direction: 0/90/180/270 degree
227 void CtorInitTxtSizeInfo( SwTxtFrm
*pFrm
, SwFont
*pFnt
= 0,
228 const xub_StrLen nIdx
= 0,
229 const xub_StrLen nLen
= STRING_LEN
);
232 SwTxtSizeInfo( const SwTxtSizeInfo
&rInf
);
233 SwTxtSizeInfo( const SwTxtSizeInfo
&rInf
, const XubString
&rTxt
,
234 const xub_StrLen nIdx
= 0,
235 const xub_StrLen nLen
= STRING_LEN
);
237 inline SwTxtSizeInfo( SwTxtFrm
*pTxtFrm
, SwFont
*pTxtFnt
= 0,
238 const xub_StrLen nIndex
= 0,
239 const xub_StrLen nLength
= STRING_LEN
)
240 { CtorInitTxtSizeInfo( pTxtFrm
, pTxtFnt
, nIndex
, nLength
); }
242 // GetMultiAttr returns the text attribute of the multiportion,
243 // if rPos is inside any multi-line part.
244 // rPos will set to the end of the multi-line part.
245 SwMultiCreator
* GetMultiCreator( xub_StrLen
&rPos
, SwMultiPortion
* pM
) const;
247 inline sal_Bool
OnWin() const { return bOnWin
; }
248 inline void SetOnWin( const sal_Bool bNew
) { bOnWin
= bNew
; }
249 inline sal_Bool
NotEOL() const { return bNotEOL
; }
250 inline void SetNotEOL( const sal_Bool bNew
) { bNotEOL
= bNew
; }
251 inline sal_Bool
URLNotify() const { return bURLNotify
; }
252 inline void SetURLNotify( const sal_Bool bNew
) { bURLNotify
= bNew
; }
253 inline sal_Bool
StopUnderFlow() const { return bStopUnderFlow
; }
254 inline void SetStopUnderFlow( const sal_Bool bNew
) { bStopUnderFlow
= bNew
; }
255 inline sal_Bool
IsFtnInside() const { return bFtnInside
; }
256 inline void SetFtnInside( const sal_Bool bNew
) { bFtnInside
= bNew
; }
257 inline sal_Bool
IsMulti() const { return bMulti
; }
258 inline void SetMulti( const sal_Bool bNew
) { bMulti
= bNew
; }
259 inline sal_Bool
IsFirstMulti() const { return bFirstMulti
; }
260 inline void SetFirstMulti( const sal_Bool bNew
) { bFirstMulti
= bNew
; }
261 inline sal_Bool
IsRuby() const { return bRuby
; }
262 inline void SetRuby( const sal_Bool bNew
) { bRuby
= bNew
; }
263 inline sal_Bool
IsHanging() const { return bHanging
; }
264 inline void SetHanging( const sal_Bool bNew
) { bHanging
= bNew
; }
265 inline sal_Bool
HasScriptSpace() const { return bScriptSpace
; }
266 inline void SetScriptSpace( const sal_Bool bNew
) { bScriptSpace
= bNew
; }
267 inline sal_Bool
HasForbiddenChars() const { return bForbiddenChars
; }
268 inline void SetForbiddenChars( const sal_Bool bN
) { bForbiddenChars
= bN
; }
269 inline sal_Bool
SnapToGrid() const { return bSnapToGrid
; }
270 inline void SetSnapToGrid( const sal_Bool bN
) { bSnapToGrid
= bN
; }
271 inline sal_uInt8
GetDirection() const { return nDirection
; }
272 inline void SetDirection( const sal_uInt8 nNew
) { nDirection
= nNew
; }
273 inline sal_Bool
IsRotated() const { return 0 != ( 1 & nDirection
); }
275 inline ViewShell
*GetVsh() { return pVsh
; }
276 inline const ViewShell
*GetVsh() const { return pVsh
; }
278 inline OutputDevice
*GetOut() { return pOut
; }
279 inline const OutputDevice
*GetOut() const { return pOut
; }
280 inline void SetOut( OutputDevice
* pNewOut
) { pOut
= pNewOut
; }
282 inline OutputDevice
*GetRefDev() { return pRef
; }
283 inline const OutputDevice
*GetRefDev() const { return pRef
; }
285 inline SwFont
*GetFont() { return pFnt
; }
286 inline const SwFont
*GetFont() const { return pFnt
; }
287 inline void SetFont( SwFont
*pNew
) { pFnt
= pNew
; }
289 inline void SetUnderFnt( SwUnderlineFont
* pNew
) { pUnderFnt
= pNew
; }
290 inline SwUnderlineFont
* GetUnderFnt() const { return pUnderFnt
; }
292 inline const SwViewOption
&GetOpt() const { return *pOpt
; }
293 inline const XubString
&GetTxt() const { return *pTxt
; }
294 inline xub_Unicode
GetChar( const xub_StrLen nPos
) const
295 { return pTxt
->GetChar( nPos
); }
297 inline KSHORT
GetTxtHeight() const;
302 SwPosSize
GetTxtSize( OutputDevice
* pOut
, const SwScriptInfo
* pSI
,
303 const XubString
& rTxt
, const xub_StrLen nIdx
,
304 const xub_StrLen nLen
, const USHORT nComp
) const;
305 SwPosSize
GetTxtSize() const;
306 void GetTxtSize( const SwScriptInfo
* pSI
, const xub_StrLen nIdx
,
307 const xub_StrLen nLen
, const USHORT nComp
,
308 USHORT
& nMinSize
, USHORT
& nMaxSizeDiff
) const;
309 inline SwPosSize
GetTxtSize( const SwScriptInfo
* pSI
, const xub_StrLen nIdx
,
310 const xub_StrLen nLen
, const USHORT nComp
) const;
311 inline SwPosSize
GetTxtSize( const XubString
&rTxt
) const;
316 xub_StrLen
GetTxtBreak( const long nLineWidth
,
317 const xub_StrLen nMaxLen
,
318 const USHORT nComp
) const;
319 xub_StrLen
GetTxtBreak( const long nLineWidth
,
320 const xub_StrLen nMaxLen
,
322 xub_StrLen
& rExtraCharPos
) const;
324 inline KSHORT
GetAscent() const;
326 inline xub_StrLen
GetIdx() const { return nIdx
; }
327 inline void SetIdx( const xub_StrLen nNew
) { nIdx
= nNew
; }
328 inline xub_StrLen
GetLen() const { return nLen
; }
329 inline void SetLen( const xub_StrLen nNew
) { nLen
= nNew
; }
330 inline void SetTxt( const XubString
&rNew
){ pTxt
= &rNew
; }
332 friend SvStream
&operator<<( SvStream
&rOS
, const SwTxtSizeInfo
&rInf
);
334 // 7780: Keine Bullets beim Symbol-Zeichensatz!
335 inline sal_Bool
IsNoSymbol() const
336 { return RTL_TEXTENCODING_SYMBOL
!= pFnt
->GetCharSet( pFnt
->GetActual() ); }
338 void NoteAnimation() const;
340 // Home is where Your heart is...
341 inline SwTxtFrm
*GetTxtFrm() { return pFrm
; }
342 inline const SwTxtFrm
*GetTxtFrm() const { return pFrm
; }
344 inline sal_Bool
HasHint( xub_StrLen nPos
) const
345 { return _HasHint( pFrm
->GetTxtNode(), nPos
); }
346 static sal_Bool
_HasHint( const SwTxtNode
* pTxtNode
, xub_StrLen nPos
);
348 // If Kana Compression is enabled, a minimum and maximum portion width
349 // is calculated. We format lines with minimal size and share remaining
350 // space among compressed kanas.
351 // During formatting, the maximum values of compressable portions are
352 // stored in aMaxWidth and discarded after a line has been formatted.
353 inline void SetMaxWidthDiff( ULONG nKey
, USHORT nVal
)
355 aMaxWidth
.Insert( nKey
, nVal
);
357 inline USHORT
GetMaxWidthDiff( ULONG nKey
)
359 return (USHORT
)aMaxWidth
.Get( nKey
);
361 inline void ResetMaxWidthDiff()
365 inline sal_Bool
CompressLine()
367 return (sal_Bool
)aMaxWidth
.Count();
371 // Feature: Kana Compression
373 inline MSHORT
GetKanaIdx() const { return nKanaIdx
; }
374 inline void ResetKanaIdx(){ nKanaIdx
= 0; }
375 inline void SetKanaIdx( MSHORT nNew
) { nKanaIdx
= nNew
; }
376 inline void IncKanaIdx() { ++nKanaIdx
; }
377 inline void SetKanaComp( SvUShorts
*pNew
){ pKanaComp
= pNew
; }
378 inline SvUShorts
* GetpKanaComp() const { return pKanaComp
; }
379 inline USHORT
GetKanaComp() const
380 { return ( pKanaComp
&& nKanaIdx
< pKanaComp
->Count() )
381 ? (*pKanaComp
)[nKanaIdx
] : 0; }
384 sal_Bool
IsOptCalm() const;
385 sal_Bool
IsOptLow() const;
386 sal_Bool
IsOptDbg() const;
387 sal_Bool
IsOptTest1() const;
388 sal_Bool
IsOptTest2() const;
389 sal_Bool
IsOptTest3() const;
390 sal_Bool
IsOptTest4() const;
391 sal_Bool
IsOptTest5() const;
392 sal_Bool
IsOptTest6() const;
393 sal_Bool
IsOptTest7() const;
394 sal_Bool
IsOptTest8() const;
398 /*************************************************************************
399 * class SwTxtPaintInfo
400 *************************************************************************/
402 class SwTxtPaintInfo
: public SwTxtSizeInfo
404 const SwWrongList
*pWrongList
;
405 const SwWrongList
*pGrammarCheckList
;
406 const SwWrongList
*pSmartTags
; // SMARTTAGS
407 std::vector
<long>* pSpaceAdd
;
408 const SvxBrushItem
*pBrushItem
; // Fuer den Hintergrund
409 SwRect aItemRect
; // ebenfalls fuer den Hintergrund
410 SwTxtFly aTxtFly
; // FlyFrm-Berechnung
411 Point aPos
; // Ausgabeposition
412 SwRect aPaintRect
; // Original Ausgaberechteck (aus Layout-Paint)
415 void _DrawText( const XubString
&rText
, const SwLinePortion
&rPor
,
416 const xub_StrLen nIdx
, const xub_StrLen nLen
,
417 const sal_Bool bKern
, const sal_Bool bWrong
= sal_False
,
418 const sal_Bool bSmartTag
= sal_False
,
419 const sal_Bool bGrammarCheck
= sal_False
); // SMARTTAGS
421 SwTxtPaintInfo
&operator=(const SwTxtPaintInfo
&);
422 void _NotifyURL( const SwLinePortion
&rPor
) const;
423 void _DrawBackBrush( const SwLinePortion
&rPor
) const;
427 SwTxtPaintInfo() { pFrm
= 0; pWrongList
= 0; pGrammarCheckList
= 0; pWrongList
= 0; pSmartTags
= 0; pSpaceAdd
= 0; pBrushItem
= 0;}
429 SwTxtPaintInfo() { pFrm
= 0; pWrongList
= 0; pGrammarCheckList
= 0; pSmartTags
= 0; pSpaceAdd
= 0;
430 pBrushItem
= ((SvxBrushItem
*)-1);}
433 SwTxtPaintInfo( const SwTxtPaintInfo
&rInf
);
434 SwTxtPaintInfo( const SwTxtPaintInfo
&rInf
, const XubString
&rTxt
);
436 void CtorInitTxtPaintInfo( SwTxtFrm
*pFrame
, const SwRect
&rPaint
);
438 void SetBack( const SvxBrushItem
*pItem
,
439 const SwRect
&rRect
) { pBrushItem
= pItem
; aItemRect
= rRect
;}
440 const SvxBrushItem
*GetBrushItem() const { return pBrushItem
; }
441 const SwRect
&GetBrushRect() const { return aItemRect
; }
443 inline SwTxtPaintInfo( SwTxtFrm
*pFrame
, const SwRect
&rPaint
)
444 { CtorInitTxtPaintInfo( pFrame
, rPaint
); }
446 inline SwTwips
X() const { return aPos
.X(); }
447 inline void X( const long nNew
) { aPos
.X() = nNew
; }
448 inline SwTwips
Y() const { return aPos
.Y(); }
449 inline void Y( const SwTwips nNew
) { aPos
.Y() = nNew
; }
451 inline SwTxtFly
*GetTxtFly() { return &aTxtFly
; }
452 inline const SwTxtFly
*GetTxtFly() const { return &aTxtFly
; }
453 inline void DrawText( const XubString
&rText
, const SwLinePortion
&rPor
,
454 const xub_StrLen nIdx
= 0,
455 const xub_StrLen nLen
= STRING_LEN
,
456 const sal_Bool bKern
= sal_False
) const;
457 inline void DrawText( const SwLinePortion
&rPor
, const xub_StrLen nLen
,
458 const sal_Bool bKern
= sal_False
) const;
459 inline void DrawMarkedText( const SwLinePortion
&rPor
, const xub_StrLen nLen
,
460 const sal_Bool bKern
,
461 const sal_Bool bWrong
,
462 const sal_Bool bSmartTags
,
463 const sal_Bool bGrammarCheck
) const;
465 void DrawRect( const SwRect
&rRect
, sal_Bool bNoGraphic
= sal_False
,
466 sal_Bool bRetouche
= sal_True
) const;
467 void DrawTab( const SwLinePortion
&rPor
) const;
468 void DrawLineBreak( const SwLinePortion
&rPor
) const;
469 void DrawRedArrow( const SwLinePortion
&rPor
) const;
470 void DrawPostIts( const SwLinePortion
&rPor
, sal_Bool bScript
) const;
471 void DrawBackground( const SwLinePortion
&rPor
) const;
472 void DrawViewOpt( const SwLinePortion
&rPor
, const MSHORT nWhich
) const;
473 inline void DrawBackBrush( const SwLinePortion
&rPor
) const
474 { /* if( pFnt->GetBackColor() ) */ _DrawBackBrush( rPor
); }
476 void DrawCheckBox( const SwFieldFormPortion
&rPor
, bool checked
) const;
478 inline void NotifyURL( const SwLinePortion
&rPor
) const
479 { if( URLNotify() ) _NotifyURL( rPor
); }
481 void CalcRect( const SwLinePortion
& rPor
, SwRect
* pRect
, SwRect
* pIntersect
= 0 ) const;
483 inline SwTwips
GetPaintOfst() const;
484 inline void SetPaintOfst( const SwTwips nNew
);
485 inline const Point
&GetPos() const { return aPos
; }
486 inline void SetPos( const Point
&rNew
) { aPos
= rNew
; }
488 inline const SwRect
&GetPaintRect() const { return aPaintRect
; }
489 inline void SetPaintRect( const SwRect
&rNew
) { aPaintRect
= rNew
; }
491 friend SvStream
&operator<<( SvStream
&rOS
, const SwTxtPaintInfo
&rInf
);
494 // STUFF FOR JUSTIFIED ALIGNMENT
496 inline MSHORT
GetSpaceIdx() const { return nSpaceIdx
; }
497 inline void ResetSpaceIdx(){nSpaceIdx
= 0; }
498 inline void SetSpaceIdx( MSHORT nNew
) { nSpaceIdx
= nNew
; }
499 inline void IncSpaceIdx() { ++nSpaceIdx
; }
500 inline void RemoveFirstSpaceAdd() { pSpaceAdd
->erase( pSpaceAdd
->begin() ); }
501 inline long GetSpaceAdd() const
502 { return ( pSpaceAdd
&& nSpaceIdx
< pSpaceAdd
->size() )
503 ? (*pSpaceAdd
)[nSpaceIdx
] : 0; }
505 inline void SetpSpaceAdd( std::vector
<long>* pNew
){ pSpaceAdd
= pNew
; }
506 inline std::vector
<long>* GetpSpaceAdd() const { return pSpaceAdd
; }
509 inline void SetWrongList( const SwWrongList
*pNew
){ pWrongList
= pNew
; }
510 inline const SwWrongList
* GetpWrongList() const { return pWrongList
; }
512 inline void SetGrammarCheckList( const SwWrongList
*pNew
){ pGrammarCheckList
= pNew
; }
513 inline const SwWrongList
* GetGrammarCheckList() const { return pGrammarCheckList
; }
516 inline void SetSmartTags( const SwWrongList
*pNew
){ pSmartTags
= pNew
; }
517 inline const SwWrongList
* GetSmartTags() const { return pSmartTags
; }
520 /*************************************************************************
521 * class SwTxtFormatInfo
522 *************************************************************************/
524 class SwTxtFormatInfo
: public SwTxtPaintInfo
526 // temporary arguments for hyphenation
527 com::sun::star::beans::PropertyValues aHyphVals
;
529 SwLineLayout
*pRoot
; // die Root der aktuellen Zeile (pCurr)
530 SwLinePortion
*pLast
; // die letzte Portion
531 SwFlyPortion
*pFly
; // die nachfolgende FlyPortion
532 SwFldPortion
*pLastFld
; // umgebrochenes Feld
533 SwLinePortion
*pUnderFlow
; // Unterlaufsituation: letzte Portion
534 SwLinePortion
*pRest
; // Rest ist der Beginn der naechsten Zeile
536 SwTabPortion
*pLastTab
; // die _letzte_ TabPortion
538 xub_StrLen nSoftHyphPos
; // SoftHyphPos fuer Hyphenate
539 xub_StrLen nHyphStart
; // TxtPos, an der die interakt.Tr.z.Z. steht
540 xub_StrLen nHyphWrdStart
; // gefundene Wort-Position
541 xub_StrLen nHyphWrdLen
; // gefundene Wort-Laenge
542 xub_StrLen nLineStart
; // aktueller Zeilenbeginn im rTxt
543 xub_StrLen nUnderScorePos
; // enlarge repaint if underscore has been found
544 // --> FME 2004-11-25 #i34348# Changed type from USHORT to SwTwips
545 SwTwips nLeft
; // linker Rand
546 SwTwips nRight
; // rechter Rand
547 SwTwips nFirst
; // EZE
549 KSHORT nRealWidth
; // "echte" Zeilenbreite
550 KSHORT nWidth
; // "virtuelle" Zeilenbreite
551 KSHORT nLineHeight
; // endgueltige Hoehe nach CalcLine
552 KSHORT nLineNettoHeight
; // line height without spacing
553 KSHORT nForcedLeftMargin
; // Verschiebung des linken Rands wg. Rahmen
555 INT16 nMinLeading
; // minimum number of chars before hyphenation point
556 INT16 nMinTrailing
; // minimum number of chars after hyphenation point
557 INT16 nMinWordLength
; // minimum length of word to be hyphenated
559 sal_Bool bFull
: 1; // Zeile ist voll
560 sal_Bool bFtnDone
: 1; // Ftn bereits formatiert
561 sal_Bool bErgoDone
: 1; // ErgoDone bereits formatiert
562 sal_Bool bNumDone
: 1; // bNumDone bereits formatiert
563 sal_Bool bArrowDone
: 1; // Pfeil nach links bei gescrollten Absaetzen
564 sal_Bool bStop
: 1; // Sofort abbrechen, Zeile verwerfen.
565 sal_Bool bNewLine
: 1; // Noch eine weitere Zeile formatieren.
566 sal_Bool bShift
: 1; // Positionsaend.: Repaint bis auf Weiteres
567 sal_Bool bUnderFlow
: 1; // Kontext: UnderFlow() ?
568 sal_Bool bInterHyph
: 1; // interaktive Trennung ?
569 sal_Bool bAutoHyph
: 1; // automatische Trennung ?
570 sal_Bool bDropInit
: 1; // DropWidth einstellen.
571 sal_Bool bQuick
: 1; // FormatQuick()
572 sal_Bool bNoEndHyph
: 1; // Trennung am Zeilenende abgeschaltet wg. MaxHyphens
573 sal_Bool bNoMidHyph
: 1; // Trennung vor Flies abgeschaltet wg. MaxHyphens
574 sal_Bool bIgnoreFly
: 1; // FitToContent ignoriert Flies
575 sal_Bool bFakeLineStart
: 1; // String has been replaced by field portion
576 // info structure only pretends that we are at
577 // the beginning of a line
579 xub_Unicode cTabDecimal
; // das _aktuelle_ Dezimalzeichen
580 xub_Unicode cHookChar
; // fuer Tabs in Feldern etc.
581 sal_uInt8 nMaxHyph
; // max. Zeilenanz. aufeinanderfolg. Trenn.
582 sal_Bool bTestFormat
; // Testformatierung aus WouldFit, keine Benachrichtigungen etc.
585 sal_Bool
InitHyph( const sal_Bool bAuto
= sal_False
);
586 sal_Bool
_CheckFtnPortion( SwLineLayout
* pCurr
);
589 void CtorInitTxtFormatInfo( SwTxtFrm
*pFrm
, const sal_Bool bInterHyph
= sal_False
,
590 const sal_Bool bQuick
= sal_False
, const sal_Bool bTst
= sal_False
);
591 inline SwTxtFormatInfo(SwTxtFrm
*pFrame
,const sal_Bool bInterHyphL
=sal_False
,
592 const sal_Bool bQuickL
= sal_False
, const sal_Bool bTst
= sal_False
)
593 { CtorInitTxtFormatInfo( pFrame
, bInterHyphL
, bQuickL
, bTst
); }
595 // For the formatting inside a double line in a line (multi-line portion)
596 // we need a modified text-format-info:
597 SwTxtFormatInfo( const SwTxtFormatInfo
& rInf
, SwLineLayout
& rLay
,
600 inline KSHORT
Width() const { return nWidth
; }
601 inline void Width( const KSHORT nNew
) { nWidth
= nNew
; }
604 // liefert die erste veraenderte Position im Absatz zurueck
605 inline xub_StrLen
GetReformatStart() const;
608 inline SwTwips
Left() const { return nLeft
; }
609 inline void Left( const SwTwips nNew
) { nLeft
= nNew
; }
610 inline SwTwips
Right() const { return nRight
; }
611 inline void Right( const SwTwips nNew
) { nRight
= nNew
; }
612 inline SwTwips
First() const { return nFirst
; }
613 inline void First( const SwTwips nNew
) { nFirst
= nNew
; }
614 inline SwTwips
CurrLeft() const { return (nLineStart
? nLeft
: nFirst
); }
615 inline KSHORT
RealWidth() const { return nRealWidth
; }
616 inline void RealWidth( const KSHORT nNew
) { nRealWidth
= nNew
; }
617 inline KSHORT
ForcedLeftMargin() const { return nForcedLeftMargin
; }
618 inline void ForcedLeftMargin( const KSHORT nN
) { nForcedLeftMargin
= nN
; }
620 inline sal_uInt8
&MaxHyph() { return nMaxHyph
; }
621 inline const sal_uInt8
&MaxHyph() const { return nMaxHyph
; }
623 inline SwLineLayout
*GetRoot() { return pRoot
; }
624 inline const SwLineLayout
*GetRoot() const { return pRoot
; }
626 inline void SetRoot( SwLineLayout
*pNew
) { pRoot
= pNew
; }
627 inline SwLinePortion
*GetLast() { return pLast
; }
628 inline void SetLast( SwLinePortion
*pNewLast
) { pLast
= pNewLast
; }
629 inline sal_Bool
IsFull() const { return bFull
; }
630 inline void SetFull( const sal_Bool bNew
) { bFull
= bNew
; }
631 inline sal_Bool
IsHyphForbud() const
632 { return pFly
? bNoMidHyph
: bNoEndHyph
; }
633 inline void SetHyphForbud( const sal_Bool bNew
)
634 { if ( pFly
) bNoMidHyph
= bNew
; else bNoEndHyph
= bNew
; }
635 inline void ChkNoHyph( const sal_uInt8 bEnd
, const sal_uInt8 bMid
)
636 { bNoEndHyph
= (nMaxHyph
&& bEnd
>= nMaxHyph
);
637 bNoMidHyph
= (nMaxHyph
&& bMid
>= nMaxHyph
); }
638 inline sal_Bool
IsIgnoreFly() const { return bIgnoreFly
; }
639 inline void SetIgnoreFly( const sal_Bool bNew
) { bIgnoreFly
= bNew
; }
640 inline sal_Bool
IsFakeLineStart() const { return bFakeLineStart
; }
641 inline void SetFakeLineStart( const sal_Bool bNew
) { bFakeLineStart
= bNew
; }
642 inline sal_Bool
IsStop() const { return bStop
; }
643 inline void SetStop( const sal_Bool bNew
) { bStop
= bNew
; }
644 inline SwLinePortion
*GetRest() { return pRest
; }
645 inline void SetRest( SwLinePortion
*pNewRest
) { pRest
= pNewRest
; }
646 inline sal_Bool
IsNewLine() const { return bNewLine
; }
647 inline void SetNewLine( const sal_Bool bNew
) { bNewLine
= bNew
; }
648 inline sal_Bool
IsShift() const { return bShift
; }
649 inline void SetShift( const sal_Bool bNew
) { bShift
= bNew
; }
650 inline sal_Bool
IsInterHyph() const { return bInterHyph
; }
651 inline sal_Bool
IsAutoHyph() const { return bAutoHyph
; }
652 inline sal_Bool
IsUnderFlow() const { return bUnderFlow
; }
653 inline void ClrUnderFlow() { bUnderFlow
= sal_False
; }
654 inline sal_Bool
IsDropInit() const { return bDropInit
; }
655 inline void SetDropInit( const sal_Bool bNew
) { bDropInit
= bNew
; }
656 inline sal_Bool
IsQuick() const { return bQuick
; }
657 inline sal_Bool
IsTest() const { return bTestFormat
; }
659 inline xub_StrLen
GetLineStart() const { return nLineStart
; }
660 inline void SetLineStart( const xub_StrLen nNew
) { nLineStart
= nNew
; }
662 // these are used during fly calculation
663 inline KSHORT
GetLineHeight() const { return nLineHeight
; }
664 inline void SetLineHeight( const KSHORT nNew
) { nLineHeight
= nNew
; }
665 inline KSHORT
GetLineNettoHeight() const { return nLineNettoHeight
; }
666 inline void SetLineNettoHeight( const KSHORT nNew
) { nLineNettoHeight
= nNew
; }
668 inline const SwLinePortion
*GetUnderFlow() const { return pUnderFlow
; }
669 inline SwLinePortion
*GetUnderFlow() { return pUnderFlow
; }
670 inline void SetUnderFlow( SwLinePortion
*pNew
)
671 { pUnderFlow
= pNew
; bUnderFlow
= sal_True
; }
672 inline xub_StrLen
GetSoftHyphPos() const { return nSoftHyphPos
; }
673 inline void SetSoftHyphPos( const xub_StrLen nNew
) { nSoftHyphPos
= nNew
; }
675 inline void SetParaFtn();
678 inline SwFlyPortion
*GetFly() { return pFly
; }
679 inline void SetFly( SwFlyPortion
*pNew
) { pFly
= pNew
; }
681 inline const SwAttrSet
& GetCharAttr() const;
684 inline SwTabPortion
*GetLastTab() { return pLastTab
; }
685 inline void SetLastTab( SwTabPortion
*pNew
) { pLastTab
= pNew
; }
686 inline xub_Unicode
GetTabDecimal() const { return cTabDecimal
; }
687 inline void SetTabDecimal( const xub_Unicode cNew
) { cTabDecimal
= cNew
;}
690 inline SwFldPortion
*GetLastFld() { return pLastFld
; }
691 inline void SetLastFld( SwFldPortion
*pNew
) { pLastFld
= pNew
; }
693 inline void ClearHookChar() { cHookChar
= 0; }
694 inline void SetHookChar( const xub_Unicode cNew
) { cHookChar
= cNew
; }
695 inline xub_Unicode
GetHookChar() const { return cHookChar
; }
698 inline sal_Bool
IsFtnDone() const { return bFtnDone
; }
699 inline void SetFtnDone( const sal_Bool bNew
) { bFtnDone
= bNew
; }
700 inline sal_Bool
IsErgoDone() const { return bErgoDone
; }
701 inline void SetErgoDone( const sal_Bool bNew
) { bErgoDone
= bNew
; }
702 inline sal_Bool
IsNumDone() const { return bNumDone
; }
703 inline void SetNumDone( const sal_Bool bNew
) { bNumDone
= bNew
; }
704 inline sal_Bool
IsArrowDone() const { return bArrowDone
; }
705 inline void SetArrowDone( const sal_Bool bNew
) { bArrowDone
= bNew
; }
707 // Fuer SwTxtPortion::Hyphenate
708 inline sal_Bool
IsSoftHyph( const xub_StrLen nPos
) const;
709 sal_Bool
ChgHyph( const sal_Bool bNew
);
711 // Soll die Trennhilfe angeschmissen werden?
712 sal_Bool
IsHyphenate() const;
713 inline void SetHyphStart( const xub_StrLen nNew
) { nHyphStart
= nNew
; }
714 inline xub_StrLen
GetHyphStart() const { return nHyphStart
; }
715 inline void SetHyphWrdStart( const xub_StrLen nNew
) { nHyphWrdStart
= nNew
; }
716 inline xub_StrLen
GetHyphWrdStart() const { return nHyphWrdStart
; }
717 inline void SetHyphWrdLen( const xub_StrLen nNew
) { nHyphWrdLen
= nNew
; }
718 inline xub_StrLen
GetHyphWrdLen() const { return nHyphWrdLen
; }
719 inline xub_StrLen
GetUnderScorePos() const { return nUnderScorePos
; }
720 inline void SetUnderScorePos( xub_StrLen nNew
) { nUnderScorePos
= nNew
; }
722 // ruft HyphenateWord() des Hyphenators
723 ::com::sun::star::uno::Reference
<
724 ::com::sun::star::linguistic2::XHyphenatedWord
>
725 HyphWord( const String
&rTxt
, const USHORT nMinTrail
);
726 const com::sun::star::beans::PropertyValues
&
727 GetHyphValues() const;
729 sal_Bool
CheckFtnPortion( SwLineLayout
* pCurr
)
730 { return IsFtnInside() && _CheckFtnPortion( pCurr
); }
732 // Dropcaps vom SwTxtFormatter::CTOR gerufen.
733 const SwFmtDrop
*GetDropFmt() const;
735 // setzt die FormatInfo wieder in den Anfangszustand
736 void Reset( const SwTxtFrm
*pFrame
); // , const sal_Bool bAll );
738 // Sets the last SwKernPortion as pLast, if it is followed by empty portions
739 BOOL
LastKernPortion();
741 // Sucht ab nIdx bis nEnd nach Tabs, TabDec, TXTATR und BRK.
742 // Return: gefundene Position, setzt ggf. cHookChar
743 xub_StrLen
ScanPortionEnd( const xub_StrLen nStart
, const xub_StrLen nEnd
);
745 // friend ostream &operator<<( ostream &rOS, const SwTxtFormatInfo &rInf );
746 friend SvStream
&operator<<( SvStream
&rOS
, const SwTxtFormatInfo
&rInf
);
749 /*************************************************************************
751 *************************************************************************/
753 // Fuer die Textersetzung und Restaurierung der SwTxtSizeInfo.
754 // Die Art und Weise ist etwas kriminell, rInf ist const und wird
755 // trotzdem veraendert. Da rInf im DTOR wieder restauriert wird,
756 // ist dies zulaessig, es handelt sich um ein "logisches const".
761 const XubString
*pOldTxt
;
762 const SwWrongList
* pOldSmartTagList
;
763 const SwWrongList
* pOldGrammarCheckList
;
764 SwWrongList
* pTempList
;
771 // Der Ersetzungstring kommt wahlweise aus der Portion via GetExpText()
772 // oder aus dem char Pointer pCh, wenn dieser ungleich NULL ist.
773 SwTxtSlot( const SwTxtSizeInfo
*pNew
, const SwLinePortion
*pPor
, bool bTxtLen
,
774 bool bExgLists
, const sal_Char
*pCh
= NULL
);
776 inline sal_Bool
IsOn() const { return bOn
; }
779 /*************************************************************************
781 *************************************************************************/
789 SwFontSave( const SwTxtSizeInfo
&rInf
, SwFont
*pFnt
,
790 SwAttrIter
* pItr
= NULL
);
794 /*************************************************************************
795 * class SwDefFontSave
796 *************************************************************************/
805 SwDefFontSave( const SwTxtSizeInfo
&rInf
);
809 /*************************************************************************
810 * Inline-Implementierungen SwTxtSizeInfo
811 *************************************************************************/
813 inline KSHORT
SwTxtSizeInfo::GetAscent() const
815 ASSERT( GetOut(), "SwTxtSizeInfo::GetAscent() without pOut" )
816 return ((SwFont
*)GetFont())->GetAscent( pVsh
, *GetOut() );
819 inline KSHORT
SwTxtSizeInfo::GetTxtHeight() const
821 ASSERT( GetOut(), "SwTxtSizeInfo::GetTxtHeight() without pOut" )
822 return ((SwFont
*)GetFont())->GetHeight( pVsh
, *GetOut() );
825 inline SwPosSize
SwTxtSizeInfo::GetTxtSize( const XubString
&rTxt
) const
827 return GetTxtSize( pOut
, 0, rTxt
, 0, rTxt
.Len(), 0 );
830 inline SwPosSize
SwTxtSizeInfo::GetTxtSize( const SwScriptInfo
* pSI
,
831 const xub_StrLen nNewIdx
,
832 const xub_StrLen nNewLen
,
833 const USHORT nCompress
) const
835 return GetTxtSize( pOut
, pSI
, *pTxt
, nNewIdx
, nNewLen
, nCompress
);
838 /*************************************************************************
839 * Inline-Implementierungen SwTxtPaintInfo
840 *************************************************************************/
842 inline SwTwips
SwTxtPaintInfo::GetPaintOfst() const
844 return GetParaPortion()->GetRepaint()->GetOfst();
847 inline void SwTxtPaintInfo::SetPaintOfst( const SwTwips nNew
)
849 GetParaPortion()->GetRepaint()->SetOfst( nNew
);
853 inline void SwTxtPaintInfo::DrawText( const XubString
&rText
,
854 const SwLinePortion
&rPor
,
855 const xub_StrLen nStart
, const xub_StrLen nLength
,
856 const sal_Bool bKern
) const
858 ((SwTxtPaintInfo
*)this)->_DrawText( rText
, rPor
, nStart
, nLength
, bKern
);
861 inline void SwTxtPaintInfo::DrawText( const SwLinePortion
&rPor
,
862 const xub_StrLen nLength
, const sal_Bool bKern
) const
864 ((SwTxtPaintInfo
*)this)->_DrawText( *pTxt
, rPor
, nIdx
, nLength
, bKern
);
867 inline void SwTxtPaintInfo::DrawMarkedText( const SwLinePortion
&rPor
,
868 const xub_StrLen nLength
,
869 const sal_Bool bKern
,
870 const sal_Bool bWrong
,
871 const sal_Bool bSmartTags
,
872 const sal_Bool bGrammarCheck
) const
874 ((SwTxtPaintInfo
*)this)->_DrawText( *pTxt
, rPor
, nIdx
, nLength
, bKern
, bWrong
, bSmartTags
, bGrammarCheck
);
877 /*************************************************************************
878 * Inline-Implementierungen SwTxtFormatInfo
879 *************************************************************************/
881 inline xub_StrLen
SwTxtFormatInfo::GetReformatStart() const
883 return GetParaPortion()->GetReformat()->Start();
886 inline const SwAttrSet
& SwTxtFormatInfo::GetCharAttr() const
888 return GetTxtFrm()->GetTxtNode()->GetSwAttrSet();
891 inline void SwTxtFormatInfo::SetParaFtn()
893 GetTxtFrm()->SetFtn( sal_True
);
896 inline sal_Bool
SwTxtFormatInfo::IsSoftHyph( const xub_StrLen nPos
) const
898 return CHAR_SOFTHYPHEN
== GetTxtFrm()->GetTxtNode()->GetTxt().GetChar(nPos
);