update dev300-m58
[ooovba.git] / sw / source / core / text / itrform2.hxx
blobf5732ced0bdee0b7734e93b92d7075a8d174a670
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 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 );
126 public:
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 ); }
144 ~SwTxtFormatter();
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; }
215 #endif