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: itrform2.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 "itrpaint.hxx"
34 class SwFlyCntPortion
;
35 class SwInterHyphInfo
;
39 class SwNumberPortion
;
40 class SwErgoSumPortion
;
41 class SwExpandPortion
;
46 /*************************************************************************
47 * class SwTxtFormatter
48 *************************************************************************/
50 class SwTxtFormatter
: public SwTxtPainter
52 const SwFmtDrop
*pDropFmt
;
53 SwMultiPortion
* pMulti
; // during formatting a multi-portion
54 sal_uInt8 nCntEndHyph
; // zaehlt aufeinanderfolgende Hyphens am Zeilenende
55 sal_uInt8 nCntMidHyph
; // zaehlt aufeinanderfolgende Hyphens vor Flies
56 xub_StrLen nLeftScanIdx
; // for increasing performance during
57 xub_StrLen nRightScanIdx
; // scanning for portion ends
58 sal_Bool bOnceMore
: 1; // noch 'ne Runde?
59 sal_Bool bFlyInCntBase
: 1; // Base-Referenz der zeichengeb. Rahmen setzen
60 sal_Bool bChanges
: 1; // Flag, fuer die Berechnung des Repaint-Rechtecks
61 sal_Bool bTruncLines
: 1; // Flag, Repaint-Rechtecks ggf. erweitern
62 sal_Bool bUnclipped
: 1; // Flag, ob Repaint groesser als feste Zeilenhoehe
63 USHORT m_nHintEndIndex
; // HACK for TryNewNoLengthPortion
64 SwLinePortion
*NewPortion( SwTxtFormatInfo
&rInf
);
65 SwTxtPortion
*NewTxtPortion( SwTxtFormatInfo
&rInf
);
66 SwLinePortion
*NewExtraPortion( SwTxtFormatInfo
&rInf
);
67 SwTabPortion
*NewTabPortion( SwTxtFormatInfo
&rInf
, bool bAuto
) const;
68 SwNumberPortion
*NewNumberPortion( SwTxtFormatInfo
&rInf
) const;
69 SwDropPortion
*NewDropPortion( SwTxtFormatInfo
&rInf
);
70 SwNumberPortion
*NewFtnNumPortion( SwTxtFormatInfo
&rInf
) const;
71 SwErgoSumPortion
*NewErgoSumPortion( SwTxtFormatInfo
&rInf
) const;
72 SwExpandPortion
*NewFldPortion( SwTxtFormatInfo
&rInf
,
73 const SwTxtAttr
*pHt
) const;
74 SwFtnPortion
*NewFtnPortion( SwTxtFormatInfo
&rInf
, SwTxtAttr
*pHt
);
75 SwFlyCntPortion
*NewFlyCntPortion( SwTxtFormatInfo
&rInf
,
76 SwTxtAttr
*pHt
) const;
77 SwLinePortion
*WhichFirstPortion( SwTxtFormatInfo
&rInf
);
78 SwTxtPortion
*WhichTxtPor( SwTxtFormatInfo
&rInf
) const;
79 SwExpandPortion
* TryNewNoLengthPortion( SwTxtFormatInfo
& rInfo
);
81 // Das Herzstueck der Formatierung
82 void BuildPortions( SwTxtFormatInfo
&rInf
);
83 BOOL
BuildMultiPortion( SwTxtFormatInfo
&rInf
, SwMultiPortion
& rMulti
);
85 // Berechnung des emulierten rechten Rands
86 void CalcFlyWidth( SwTxtFormatInfo
&rInf
);
88 // wird von SwTxtFormatter wegen UpdatePos ueberladen
89 void CalcAdjustLine( SwLineLayout
*pCurr
);
91 // consideres line spacing attributes
92 void CalcRealHeight( sal_Bool bNewLine
= sal_False
);
94 // uebertraegt die Daten nach rInf
95 void FeedInf( SwTxtFormatInfo
&rInf
) const;
97 // behandelt die Unterlaufsituationen
98 SwLinePortion
*UnderFlow( SwTxtFormatInfo
&rInf
);
100 // errechnet den Ascent und die Hoehe aus der Fontmetric
101 void CalcAscent( SwTxtFormatInfo
&rInf
, SwLinePortion
*pPor
);
103 // determines, if a optimized repaint rectange is allowed
104 sal_Bool
AllowRepaintOpt() const;
106 // calculates and sets the optimized repaint offset
107 long CalcOptRepaint( xub_StrLen nOldLineEnd
, const SvLongs
* pFlyStart
);
109 // wird von FormatLine gerufen.
110 void FormatReset( SwTxtFormatInfo
&rInf
);
112 // durch das Adjustment aendert sich die Position der Portions
113 void UpdatePos( SwLineLayout
*pCurr
, Point aStart
, xub_StrLen nStartIdx
,
114 sal_Bool bAllWays
= sal_False
) const;
116 // Setze alle FlyInCntFrms auf die uebergebene BaseLine
117 void AlignFlyInCntBase( long nBaseLine
) const;
119 // Unterlaufbedingungen bei Flys
120 sal_Bool
ChkFlyUnderflow( SwTxtFormatInfo
&rInf
) const;
122 // Portion einfuegen.
123 void InsertPortion( SwTxtFormatInfo
&rInf
, SwLinePortion
*pPor
) const;
125 // schaetzt die Hoehe fuer die DropPortion
126 void GuessDropHeight( const MSHORT nLines
);
129 // errechnet die Hoehe fuer die DropPortion
130 void CalcDropHeight( const MSHORT nLines
);
132 // errechnet den Bottom des Absatzes, beruecksichtigt an diesem verankerte
133 // Objekte mit Umlauf 1. Absatz.
134 SwTwips
CalcBottomLine() const;
136 // Beruecksichtigt zeichengebundene Objekte bei der Repaintrechteck-
137 // berechnung in Zeilen mit fester Zeilenhoehe
138 void CalcUnclipped( SwTwips
& rTop
, SwTwips
& rBottom
);
140 // u.a. fuer DropCaps
141 sal_Bool
CalcOnceMore();
143 void CtorInitTxtFormatter( SwTxtFrm
*pFrm
, SwTxtFormatInfo
*pInf
);
144 inline SwTxtFormatter( SwTxtFrm
*pTxtFrm
, SwTxtFormatInfo
*pTxtFmtInf
) : SwTxtPainter(pTxtFrm
!=NULL
?pTxtFrm
->GetTxtNode():NULL
)
145 { CtorInitTxtFormatter( pTxtFrm
, pTxtFmtInf
); }
148 xub_StrLen
FormatLine( const xub_StrLen nStart
);
150 void RecalcRealHeight();
152 // Wir formatieren eine Zeile fuer die interaktive Trennung
153 sal_Bool
Hyphenate( SwInterHyphInfo
&rInf
);
155 // Spezialmethode fuer QuoVadis-Texte
156 // nErgo ist die Seitennummer der ErgoSum-Ftn
157 // Bei 0 ist es noch unklar.
158 xub_StrLen
FormatQuoVadis( const xub_StrLen nStart
);
160 // Die Notbremse: Formatierung abbrechen, Zeile verwerfen.
161 inline sal_Bool
IsStop() const { return GetInfo().IsStop(); }
163 // Das Gegenstueck: Formatierung unbedingt fortsetzen.
164 inline sal_Bool
IsNewLine() const { return GetInfo().IsNewLine(); }
166 // FormatQuick(); auffrischen von Formatinformationen
167 inline sal_Bool
IsQuick() const { return GetInfo().IsQuick(); }
169 // erzeugt ggfs. ein SwLineLayout, dass Ftn/Fly--Oszillation unterbindet.
170 void MakeDummyLine();
172 // SwTxtIter-Funktionalitaet
173 void Insert( SwLineLayout
*pLine
);
175 // die noch verbleibende Hoehe bis zum Seitenrand
176 KSHORT
GetFrmRstHeight() const;
178 // Wie breit waerest Du ohne rechte Begrenzungen (Flys etc.)?
179 SwTwips
_CalcFitToContent( );
181 SwLinePortion
* MakeRestPortion(const SwLineLayout
* pLine
, xub_StrLen nPos
);
183 inline const SwFmtDrop
*GetDropFmt() const { return pDropFmt
; }
184 inline void ClearDropFmt() { pDropFmt
= 0; }
186 inline SwMultiPortion
*GetMulti() const { return pMulti
; }
188 inline sal_Bool
IsOnceMore() const { return bOnceMore
; }
189 inline void SetOnceMore( sal_Bool bNew
) { bOnceMore
= bNew
; }
191 inline sal_Bool
HasChanges() const { return bChanges
; }
192 inline void SetChanges() { bChanges
= sal_True
; }
194 inline sal_Bool
HasTruncLines() const { return bTruncLines
; }
195 inline void SetTruncLines( sal_Bool bNew
) { bTruncLines
= bNew
; }
197 inline sal_Bool
IsUnclipped() const { return bUnclipped
; }
198 inline void SetUnclipped( sal_Bool bNew
) { bUnclipped
= bNew
; }
200 inline sal_Bool
IsFlyInCntBase() const { return bFlyInCntBase
; }
201 inline void SetFlyInCntBase( sal_Bool bNew
= sal_True
){ bFlyInCntBase
= bNew
; }
203 inline SwTxtFormatInfo
&GetInfo()
204 { return (SwTxtFormatInfo
&)SwTxtIter::GetInfo(); }
205 inline const SwTxtFormatInfo
&GetInfo() const
206 { return (const SwTxtFormatInfo
&)SwTxtIter::GetInfo(); }
208 inline void InitCntHyph() { CntHyphens( nCntEndHyph
, nCntMidHyph
); }
209 inline const sal_uInt8
&CntEndHyph() const { return nCntEndHyph
; }
210 inline const sal_uInt8
&CntMidHyph() const { return nCntMidHyph
; }
211 inline sal_uInt8
&CntEndHyph() { return nCntEndHyph
; }
212 inline sal_uInt8
&CntMidHyph() { return nCntMidHyph
; }