blob: 7906792b4eccf3128397442ac9ac78eedda3a250 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _ITRFORM2_HXX
#define _ITRFORM2_HXX
#include "itrpaint.hxx"
class SwFlyCntPortion;
class SwInterHyphInfo;
class SwDropPortion;
class SwFmtDrop;
class SwTxtAttr;
class SwNumberPortion;
class SwErgoSumPortion;
class SwExpandPortion;
class SwMultiPortion;
class SwFtnPortion;
class SvLongs;
/*************************************************************************
* class SwTxtFormatter
*************************************************************************/
class SwTxtFormatter : public SwTxtPainter
{
const SwFmtDrop *pDropFmt;
SwMultiPortion* pMulti; // during formatting a multi-portion
sal_uInt8 nCntEndHyph; // zaehlt aufeinanderfolgende Hyphens am Zeilenende
sal_uInt8 nCntMidHyph; // zaehlt aufeinanderfolgende Hyphens vor Flies
xub_StrLen nLeftScanIdx; // for increasing performance during
xub_StrLen nRightScanIdx; // scanning for portion ends
sal_Bool bOnceMore : 1; // noch 'ne Runde?
sal_Bool bFlyInCntBase : 1; // Base-Referenz der zeichengeb. Rahmen setzen
sal_Bool bChanges : 1; // Flag, fuer die Berechnung des Repaint-Rechtecks
sal_Bool bTruncLines : 1; // Flag, Repaint-Rechtecks ggf. erweitern
sal_Bool bUnclipped : 1; // Flag, ob Repaint groesser als feste Zeilenhoehe
sal_uInt16 m_nHintEndIndex; // HACK for TryNewNoLengthPortion
SwLinePortion *NewPortion( SwTxtFormatInfo &rInf );
SwTxtPortion *NewTxtPortion( SwTxtFormatInfo &rInf );
SwLinePortion *NewExtraPortion( SwTxtFormatInfo &rInf );
SwTabPortion *NewTabPortion( SwTxtFormatInfo &rInf, bool bAuto ) const;
SwNumberPortion *NewNumberPortion( SwTxtFormatInfo &rInf ) const;
SwDropPortion *NewDropPortion( SwTxtFormatInfo &rInf );
SwNumberPortion *NewFtnNumPortion( SwTxtFormatInfo &rInf ) const;
SwErgoSumPortion *NewErgoSumPortion( SwTxtFormatInfo &rInf ) const;
SwExpandPortion *NewFldPortion( SwTxtFormatInfo &rInf,
const SwTxtAttr *pHt ) const;
SwFtnPortion *NewFtnPortion( SwTxtFormatInfo &rInf, SwTxtAttr *pHt );
SwFlyCntPortion *NewFlyCntPortion( SwTxtFormatInfo &rInf,
SwTxtAttr *pHt ) const;
SwLinePortion *WhichFirstPortion( SwTxtFormatInfo &rInf );
SwTxtPortion *WhichTxtPor( SwTxtFormatInfo &rInf ) const;
SwExpandPortion * TryNewNoLengthPortion( SwTxtFormatInfo & rInfo );
// Das Herzstueck der Formatierung
void BuildPortions( SwTxtFormatInfo &rInf );
sal_Bool BuildMultiPortion( SwTxtFormatInfo &rInf, SwMultiPortion& rMulti );
// Berechnung des emulierten rechten Rands
void CalcFlyWidth( SwTxtFormatInfo &rInf );
// wird von SwTxtFormatter wegen UpdatePos ueberladen
void CalcAdjustLine( SwLineLayout *pCurr );
// consideres line spacing attributes
void CalcRealHeight( sal_Bool bNewLine = sal_False );
// uebertraegt die Daten nach rInf
void FeedInf( SwTxtFormatInfo &rInf ) const;
// behandelt die Unterlaufsituationen
SwLinePortion *UnderFlow( SwTxtFormatInfo &rInf );
// errechnet den Ascent und die Hoehe aus der Fontmetric
void CalcAscent( SwTxtFormatInfo &rInf, SwLinePortion *pPor );
// determines, if a optimized repaint rectange is allowed
sal_Bool AllowRepaintOpt() const;
// calculates and sets the optimized repaint offset
long CalcOptRepaint( xub_StrLen nOldLineEnd, const SvLongs* pFlyStart );
// wird von FormatLine gerufen.
void FormatReset( SwTxtFormatInfo &rInf );
// durch das Adjustment aendert sich die Position der Portions
void UpdatePos( SwLineLayout *pCurr, Point aStart, xub_StrLen nStartIdx,
sal_Bool bAllWays = sal_False ) const;
// Setze alle FlyInCntFrms auf die uebergebene BaseLine
void AlignFlyInCntBase( long nBaseLine ) const;
// Unterlaufbedingungen bei Flys
sal_Bool ChkFlyUnderflow( SwTxtFormatInfo &rInf ) const;
// Portion einfuegen.
void InsertPortion( SwTxtFormatInfo &rInf, SwLinePortion *pPor ) const;
// schaetzt die Hoehe fuer die DropPortion
void GuessDropHeight( const MSHORT nLines );
public:
// errechnet die Hoehe fuer die DropPortion
void CalcDropHeight( const MSHORT nLines );
// errechnet den Bottom des Absatzes, beruecksichtigt an diesem verankerte
// Objekte mit Umlauf 1. Absatz.
SwTwips CalcBottomLine() const;
// Beruecksichtigt zeichengebundene Objekte bei der Repaintrechteck-
// berechnung in Zeilen mit fester Zeilenhoehe
void CalcUnclipped( SwTwips& rTop, SwTwips& rBottom );
// u.a. fuer DropCaps
sal_Bool CalcOnceMore();
void CtorInitTxtFormatter( SwTxtFrm *pFrm, SwTxtFormatInfo *pInf );
inline SwTxtFormatter( SwTxtFrm *pTxtFrm, SwTxtFormatInfo *pTxtFmtInf ) : SwTxtPainter(pTxtFrm!=NULL?pTxtFrm->GetTxtNode():NULL)
{ CtorInitTxtFormatter( pTxtFrm, pTxtFmtInf ); }
~SwTxtFormatter();
xub_StrLen FormatLine( const xub_StrLen nStart );
void RecalcRealHeight();
// Wir formatieren eine Zeile fuer die interaktive Trennung
sal_Bool Hyphenate( SwInterHyphInfo &rInf );
// Spezialmethode fuer QuoVadis-Texte
// nErgo ist die Seitennummer der ErgoSum-Ftn
// Bei 0 ist es noch unklar.
xub_StrLen FormatQuoVadis( const xub_StrLen nStart );
// Die Notbremse: Formatierung abbrechen, Zeile verwerfen.
inline sal_Bool IsStop() const { return GetInfo().IsStop(); }
// Das Gegenstueck: Formatierung unbedingt fortsetzen.
inline sal_Bool IsNewLine() const { return GetInfo().IsNewLine(); }
// FormatQuick(); auffrischen von Formatinformationen
inline sal_Bool IsQuick() const { return GetInfo().IsQuick(); }
// erzeugt ggfs. ein SwLineLayout, dass Ftn/Fly--Oszillation unterbindet.
void MakeDummyLine();
// SwTxtIter-Funktionalitaet
void Insert( SwLineLayout *pLine );
// die noch verbleibende Hoehe bis zum Seitenrand
KSHORT GetFrmRstHeight() const;
// Wie breit waerest Du ohne rechte Begrenzungen (Flys etc.)?
SwTwips _CalcFitToContent( );
SwLinePortion* MakeRestPortion(const SwLineLayout* pLine, xub_StrLen nPos);
inline const SwFmtDrop *GetDropFmt() const { return pDropFmt; }
inline void ClearDropFmt() { pDropFmt = 0; }
inline SwMultiPortion *GetMulti() const { return pMulti; }
inline sal_Bool IsOnceMore() const { return bOnceMore; }
inline void SetOnceMore( sal_Bool bNew ) { bOnceMore = bNew; }
inline sal_Bool HasChanges() const { return bChanges; }
inline void SetChanges() { bChanges = sal_True; }
inline sal_Bool HasTruncLines() const { return bTruncLines; }
inline void SetTruncLines( sal_Bool bNew ) { bTruncLines = bNew; }
inline sal_Bool IsUnclipped() const { return bUnclipped; }
inline void SetUnclipped( sal_Bool bNew ) { bUnclipped = bNew; }
inline sal_Bool IsFlyInCntBase() const { return bFlyInCntBase; }
inline void SetFlyInCntBase( sal_Bool bNew = sal_True ){ bFlyInCntBase = bNew; }
inline SwTxtFormatInfo &GetInfo()
{ return (SwTxtFormatInfo&)SwTxtIter::GetInfo(); }
inline const SwTxtFormatInfo &GetInfo() const
{ return (const SwTxtFormatInfo&)SwTxtIter::GetInfo(); }
inline void InitCntHyph() { CntHyphens( nCntEndHyph, nCntMidHyph ); }
inline const sal_uInt8 &CntEndHyph() const { return nCntEndHyph; }
inline const sal_uInt8 &CntMidHyph() const { return nCntMidHyph; }
inline sal_uInt8 &CntEndHyph() { return nCntEndHyph; }
inline sal_uInt8 &CntMidHyph() { return nCntMidHyph; }
};
#endif