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 SwLinePortion
*NewPortion( SwTxtFormatInfo
&rInf
);
64 SwTxtPortion
*NewTxtPortion( SwTxtFormatInfo
&rInf
);
65 SwLinePortion
*NewExtraPortion( SwTxtFormatInfo
&rInf
);
66 SwTabPortion
*NewTabPortion( SwTxtFormatInfo
&rInf
, bool bAuto
) const;
67 SwNumberPortion
*NewNumberPortion( SwTxtFormatInfo
&rInf
) const;
68 SwDropPortion
*NewDropPortion( SwTxtFormatInfo
&rInf
);
69 SwNumberPortion
*NewFtnNumPortion( SwTxtFormatInfo
&rInf
) const;
70 SwErgoSumPortion
*NewErgoSumPortion( SwTxtFormatInfo
&rInf
) const;
71 SwExpandPortion
*NewFldPortion( SwTxtFormatInfo
&rInf
,
72 const SwTxtAttr
*pHt
) const;
73 SwFtnPortion
*NewFtnPortion( SwTxtFormatInfo
&rInf
, SwTxtAttr
*pHt
);
74 SwFlyCntPortion
*NewFlyCntPortion( SwTxtFormatInfo
&rInf
,
75 SwTxtAttr
*pHt
) const;
76 SwLinePortion
*WhichFirstPortion( SwTxtFormatInfo
&rInf
);
77 SwTxtPortion
*WhichTxtPor( SwTxtFormatInfo
&rInf
) const;
79 // Das Herzstueck der Formatierung
80 void BuildPortions( SwTxtFormatInfo
&rInf
);
81 BOOL
BuildMultiPortion( SwTxtFormatInfo
&rInf
, SwMultiPortion
& rMulti
);
83 // Berechnung des emulierten rechten Rands
84 void CalcFlyWidth( SwTxtFormatInfo
&rInf
);
86 // wird von SwTxtFormatter wegen UpdatePos ueberladen
87 void CalcAdjustLine( SwLineLayout
*pCurr
);
89 // consideres line spacing attributes
90 void CalcRealHeight( sal_Bool bNewLine
= sal_False
);
92 // uebertraegt die Daten nach rInf
93 void FeedInf( SwTxtFormatInfo
&rInf
) const;
95 // behandelt die Unterlaufsituationen
96 SwLinePortion
*UnderFlow( SwTxtFormatInfo
&rInf
);
98 // errechnet den Ascent und die Hoehe aus der Fontmetric
99 void CalcAscent( SwTxtFormatInfo
&rInf
, SwLinePortion
*pPor
);
101 // determines, if a optimized repaint rectange is allowed
102 sal_Bool
AllowRepaintOpt() const;
104 // calculates and sets the optimized repaint offset
105 long CalcOptRepaint( xub_StrLen nOldLineEnd
, const SvLongs
* pFlyStart
);
107 // wird von FormatLine gerufen.
108 void FormatReset( SwTxtFormatInfo
&rInf
);
110 // durch das Adjustment aendert sich die Position der Portions
111 void UpdatePos( SwLineLayout
*pCurr
, Point aStart
, xub_StrLen nStartIdx
,
112 sal_Bool bAllWays
= sal_False
) const;
114 // Setze alle FlyInCntFrms auf die uebergebene BaseLine
115 void AlignFlyInCntBase( long nBaseLine
) const;
117 // Unterlaufbedingungen bei Flys
118 sal_Bool
ChkFlyUnderflow( SwTxtFormatInfo
&rInf
) const;
120 // Portion einfuegen.
121 void InsertPortion( SwTxtFormatInfo
&rInf
, SwLinePortion
*pPor
) const;
123 // schaetzt die Hoehe fuer die DropPortion
124 void GuessDropHeight( const MSHORT nLines
);
127 // errechnet die Hoehe fuer die DropPortion
128 void CalcDropHeight( const MSHORT nLines
);
130 // errechnet den Bottom des Absatzes, beruecksichtigt an diesem verankerte
131 // Objekte mit Umlauf 1. Absatz.
132 SwTwips
CalcBottomLine() const;
134 // Beruecksichtigt zeichengebundene Objekte bei der Repaintrechteck-
135 // berechnung in Zeilen mit fester Zeilenhoehe
136 void CalcUnclipped( SwTwips
& rTop
, SwTwips
& rBottom
);
138 // u.a. fuer DropCaps
139 sal_Bool
CalcOnceMore();
141 void CtorInitTxtFormatter( SwTxtFrm
*pFrm
, SwTxtFormatInfo
*pInf
);
142 inline SwTxtFormatter( SwTxtFrm
*pTxtFrm
, SwTxtFormatInfo
*pTxtFmtInf
) : SwTxtPainter(pTxtFrm
!=NULL
?pTxtFrm
->GetTxtNode():NULL
)
143 { CtorInitTxtFormatter( pTxtFrm
, pTxtFmtInf
); }
146 xub_StrLen
FormatLine( const xub_StrLen nStart
);
148 void RecalcRealHeight();
150 // Wir formatieren eine Zeile fuer die interaktive Trennung
151 sal_Bool
Hyphenate( SwInterHyphInfo
&rInf
);
153 // Spezialmethode fuer QuoVadis-Texte
154 // nErgo ist die Seitennummer der ErgoSum-Ftn
155 // Bei 0 ist es noch unklar.
156 xub_StrLen
FormatQuoVadis( const xub_StrLen nStart
);
158 // Die Notbremse: Formatierung abbrechen, Zeile verwerfen.
159 inline sal_Bool
IsStop() const { return GetInfo().IsStop(); }
161 // Das Gegenstueck: Formatierung unbedingt fortsetzen.
162 inline sal_Bool
IsNewLine() const { return GetInfo().IsNewLine(); }
164 // FormatQuick(); auffrischen von Formatinformationen
165 inline sal_Bool
IsQuick() const { return GetInfo().IsQuick(); }
167 // erzeugt ggfs. ein SwLineLayout, dass Ftn/Fly--Oszillation unterbindet.
168 void MakeDummyLine();
170 // SwTxtIter-Funktionalitaet
171 void Insert( SwLineLayout
*pLine
);
173 // die noch verbleibende Hoehe bis zum Seitenrand
174 KSHORT
GetFrmRstHeight() const;
176 // Wie breit waerest Du ohne rechte Begrenzungen (Flys etc.)?
177 SwTwips
_CalcFitToContent( );
179 SwLinePortion
* MakeRestPortion(const SwLineLayout
* pLine
, xub_StrLen nPos
);
181 inline const SwFmtDrop
*GetDropFmt() const { return pDropFmt
; }
182 inline void ClearDropFmt() { pDropFmt
= 0; }
184 inline SwMultiPortion
*GetMulti() const { return pMulti
; }
186 inline sal_Bool
IsOnceMore() const { return bOnceMore
; }
187 inline void SetOnceMore( sal_Bool bNew
) { bOnceMore
= bNew
; }
189 inline sal_Bool
HasChanges() const { return bChanges
; }
190 inline void SetChanges() { bChanges
= sal_True
; }
192 inline sal_Bool
HasTruncLines() const { return bTruncLines
; }
193 inline void SetTruncLines( sal_Bool bNew
) { bTruncLines
= bNew
; }
195 inline sal_Bool
IsUnclipped() const { return bUnclipped
; }
196 inline void SetUnclipped( sal_Bool bNew
) { bUnclipped
= bNew
; }
198 inline sal_Bool
IsFlyInCntBase() const { return bFlyInCntBase
; }
199 inline void SetFlyInCntBase( sal_Bool bNew
= sal_True
){ bFlyInCntBase
= bNew
; }
201 inline SwTxtFormatInfo
&GetInfo()
202 { return (SwTxtFormatInfo
&)SwTxtIter::GetInfo(); }
203 inline const SwTxtFormatInfo
&GetInfo() const
204 { return (const SwTxtFormatInfo
&)SwTxtIter::GetInfo(); }
206 inline void InitCntHyph() { CntHyphens( nCntEndHyph
, nCntMidHyph
); }
207 inline const sal_uInt8
&CntEndHyph() const { return nCntEndHyph
; }
208 inline const sal_uInt8
&CntMidHyph() const { return nCntMidHyph
; }
209 inline sal_uInt8
&CntEndHyph() { return nCntEndHyph
; }
210 inline sal_uInt8
&CntMidHyph() { return nCntMidHyph
; }