merge the formfield patch from ooo-build
[ooovba.git] / sw / source / core / text / itrform2.hxx
blobec6fce195873d5b33c083742c60fe2329ebee6e5
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: itrform2.hxx,v $
10 * $Revision: 1.19 $
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 ************************************************************************/
30 #ifndef _ITRFORM2_HXX
31 #define _ITRFORM2_HXX
32 #include "itrpaint.hxx"
34 class SwFlyCntPortion;
35 class SwInterHyphInfo;
36 class SwDropPortion;
37 class SwFmtDrop;
38 class SwTxtAttr;
39 class SwNumberPortion;
40 class SwErgoSumPortion;
41 class SwExpandPortion;
42 class SwMultiPortion;
43 class SwFtnPortion;
44 class SvLongs;
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 );
128 public:
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 ); }
146 ~SwTxtFormatter();
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; }
217 #endif