/************************************************************** * * 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 ); // considers 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