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