blob: 0e849c3a719a6fcfbf64fb67deb38fe27a8ae945 [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 _PORLAY_HXX
#define _PORLAY_HXX
#include <tools/string.hxx>
#include <tools/fract.hxx>
#include <scriptinfo.hxx>
#include "swrect.hxx" // SwRepaint
#include "portxt.hxx"
#include "swfont.hxx"
#include <vector>
class SwMarginPortion;
class SwDropPortion;
class SvStream;
class SwTxtFormatter;
/*************************************************************************
* class SwCharRange
*************************************************************************/
class SwCharRange
{
xub_StrLen nStart, nLen;
public:
inline SwCharRange( const xub_StrLen nInitStart = 0,
const xub_StrLen nInitLen = 0): nStart( nInitStart ), nLen(nInitLen) {}
inline xub_StrLen &Start() { return nStart; }
inline const xub_StrLen &Start() const { return nStart; }
inline void LeftMove( xub_StrLen nNew )
{ if ( nNew < nStart ) { nLen += nStart-nNew; nStart = nNew; } }
inline xub_StrLen End() const
{ return nStart + nLen; }
inline xub_StrLen &Len() { return nLen; }
inline const xub_StrLen &Len() const { return nLen; }
inline sal_Bool operator<(const SwCharRange &rRange) const
{ return nStart < rRange.nStart; }
inline sal_Bool operator>(const SwCharRange &rRange) const
{ return nStart + nLen > rRange.nStart + rRange.nLen; }
inline sal_Bool operator!=(const SwCharRange &rRange) const
{ return *this < rRange || *this > rRange; }
SwCharRange &operator+=(const SwCharRange &rRange);
};
/*************************************************************************
* class SwRepaint
*************************************************************************/
// SwRepaint ist ein dokumentglobales SwRect mit einem nOfst der angibt,
// ab wo in der ersten Zeile gepaintet werden soll
// und einem nRightOfst, der den rechten Rand bestimmt
class SwRepaint : public SwRect
{
SwTwips nOfst;
SwTwips nRightOfst;
public:
SwRepaint() : SwRect(), nOfst( 0 ), nRightOfst( 0 ) {}
SwRepaint( const SwRepaint& rRep ) : SwRect( rRep ), nOfst( rRep.nOfst ),
nRightOfst( rRep.nRightOfst ) {}
SwTwips GetOfst() const { return nOfst; }
void SetOfst( const SwTwips nNew ) { nOfst = nNew; }
SwTwips GetRightOfst() const { return nRightOfst; }
void SetRightOfst( const SwTwips nNew ) { nRightOfst = nNew; }
};
/*************************************************************************
* class SwLineLayout
*************************************************************************/
class SwLineLayout : public SwTxtPortion
{
private:
SwLineLayout *pNext; // Die naechste Zeile.
std::vector<long>* pLLSpaceAdd; // Used for justified alignment.
SvUShorts* pKanaComp; // Used for Kana compression.
KSHORT nRealHeight; // Die aus Zeilenabstand/Register resultierende Hoehe.
sal_Bool bFormatAdj : 1;
sal_Bool bDummy : 1;
sal_Bool bFntChg : 1;
sal_Bool bEndHyph : 1;
sal_Bool bMidHyph : 1;
sal_Bool bTab : 1;
sal_Bool bFly : 1;
sal_Bool bRest : 1;
sal_Bool bBlinking : 1;
sal_Bool bClipping : 1; // Clipping erforderlich wg. exakter Zeilenhoehe
sal_Bool bContent : 1; // enthaelt Text, fuer Zeilennumerierung
sal_Bool bRedline : 1; // enthaelt Redlining
sal_Bool bForcedLeftMargin : 1; // vom Fly verschobener linker Einzug
sal_Bool bHanging : 1; // contents a hanging portion in the margin
sal_Bool bUnderscore : 1;
SwTwips _GetHangingMargin() const;
public:
// von SwLinePortion
virtual SwLinePortion *Insert( SwLinePortion *pPortion );
virtual SwLinePortion *Append( SwLinePortion *pPortion );
inline SwLinePortion *GetFirstPortion() const;
// Flags
inline void ResetFlags();
inline void SetFormatAdj( const sal_Bool bNew ) { bFormatAdj = bNew; }
inline sal_Bool IsFormatAdj() const { return bFormatAdj; }
inline void SetFntChg( const sal_Bool bNew ) { bFntChg = bNew; }
inline sal_Bool IsFntChg() const { return bFntChg; }
inline void SetEndHyph( const sal_Bool bNew ) { bEndHyph = bNew; }
inline sal_Bool IsEndHyph() const { return bEndHyph; }
inline void SetMidHyph( const sal_Bool bNew ) { bMidHyph = bNew; }
inline sal_Bool IsMidHyph() const { return bMidHyph; }
inline void SetTab( const sal_Bool bNew ) { bTab = bNew; }
inline sal_Bool IsTab() const { return bTab; }
inline void SetFly( const sal_Bool bNew ) { bFly = bNew; }
inline sal_Bool IsFly() const { return bFly; }
inline void SetRest( const sal_Bool bNew ) { bRest = bNew; }
inline sal_Bool IsRest() const { return bRest; }
inline void SetBlinking( const sal_Bool bNew = sal_True ) { bBlinking = bNew; }
inline sal_Bool IsBlinking() const { return bBlinking; }
inline void SetCntnt( const sal_Bool bNew = sal_True ) { bContent = bNew; }
inline sal_Bool HasCntnt() const { return bContent; }
inline void SetRedline( const sal_Bool bNew = sal_True ) { bRedline = bNew; }
inline sal_Bool HasRedline() const { return bRedline; }
inline void SetForcedLeftMargin( const sal_Bool bNew = sal_True ) { bForcedLeftMargin = bNew; }
inline sal_Bool HasForcedLeftMargin() const { return bForcedLeftMargin; }
inline void SetHanging( const sal_Bool bNew = sal_True ) { bHanging = bNew; }
inline sal_Bool IsHanging() const { return bHanging; }
inline void SetUnderscore( const sal_Bool bNew = sal_True ) { bUnderscore = bNew; }
inline sal_Bool HasUnderscore() const { return bUnderscore; }
// Beruecksichtigung von Dummyleerzeilen
// 4147, 8221:
inline void SetDummy( const sal_Bool bNew ) { bDummy = bNew; }
inline sal_Bool IsDummy() const { return bDummy; }
inline void SetClipping( const sal_Bool bNew ) { bClipping = bNew; }
inline sal_Bool IsClipping() const { return bClipping; }
inline SwLineLayout();
virtual ~SwLineLayout();
inline SwLineLayout *GetNext() { return pNext; }
inline const SwLineLayout *GetNext() const { return pNext; }
inline void SetNext( SwLineLayout *pNew ) { pNext = pNew; }
void Init( SwLinePortion *pNextPortion = NULL);
// Sammelt die Daten fuer die Zeile.
void CalcLine( SwTxtFormatter &rLine, SwTxtFormatInfo &rInf );
inline void SetRealHeight( KSHORT nNew ) { nRealHeight = nNew; }
inline KSHORT GetRealHeight() const { return nRealHeight; }
// Erstellt bei kurzen Zeilen die Glue-Kette.
SwMarginPortion *CalcLeftMargin();
inline SwTwips GetHangingMargin() const
{ return _GetHangingMargin(); }
// fuer die Sonderbehandlung bei leeren Zeilen
virtual sal_Bool Format( SwTxtFormatInfo &rInf );
//
// STUFF FOR JUSTIFIED ALIGNMENT
//
inline sal_Bool IsSpaceAdd() { return pLLSpaceAdd != NULL; }
void InitSpaceAdd(); // Creates pLLSpaceAdd if necessary
void CreateSpaceAdd( const long nInit = 0 );
inline void FinishSpaceAdd() { delete pLLSpaceAdd; pLLSpaceAdd = NULL; }
inline sal_uInt16 GetLLSpaceAddCount() const { return sal::static_int_cast< sal_uInt16 >(pLLSpaceAdd->size()); }
inline void SetLLSpaceAdd( long nNew, sal_uInt16 nIdx )
{
if ( nIdx == GetLLSpaceAddCount() )
pLLSpaceAdd->push_back( nNew );
else
(*pLLSpaceAdd)[ nIdx ] = nNew;
}
inline long GetLLSpaceAdd( sal_uInt16 nIdx ) { return (*pLLSpaceAdd)[ nIdx ]; }
inline void RemoveFirstLLSpaceAdd() { pLLSpaceAdd->erase( pLLSpaceAdd->begin() ); }
inline std::vector<long>* GetpLLSpaceAdd() const { return pLLSpaceAdd; }
//
// STUFF FOR KANA COMPRESSION
//
inline void SetKanaComp( SvUShorts* pNew ){ pKanaComp = pNew; }
inline void FinishKanaComp() { delete pKanaComp; pKanaComp = NULL; }
inline SvUShorts* GetpKanaComp() const { return pKanaComp; }
inline SvUShorts& GetKanaComp() { return *pKanaComp; }
/** determine ascent and descent for positioning of as-character anchored
object
OD 07.01.2004 #i11859# - previously local method <lcl_MaxAscDescent>
Method calculates maximum ascents and descents of the line layout.
One value considering as-character anchored objects, one without these
objects.
Portions for other anchored objects aren't considered.
OD 2005-05-20 #i47162# - add optional parameter <_bNoFlyCntPorAndLinePor>
to control, if the fly content portions and line portion are considered.
@param _orAscent
output parameter - maximum ascent without as-character anchored objects
@param _orDescent
output parameter - maximum descent without as-character anchored objects
@param _orObjAscent
output parameter - maximum ascent with as-character anchored objects
@param _orObjDescent
output parameter - maximum descent with as-character anchored objects
@param _pDontConsiderPortion
input parameter - portion, which isn't considered for calculating
<_orObjAscent> and <_orObjDescent>, if it isn't a portion for a
as-character anchored object or it isn't as high as the line.
@param _bNoFlyCntPorAndLinePor
optional input parameter - boolean, indicating that fly content portions
and the line portion are considered or not.
@author OD
*/
void MaxAscentDescent( SwTwips& _orAscent,
SwTwips& _orDescent,
SwTwips& _orObjAscent,
SwTwips& _orObjDescent,
const SwLinePortion* _pDontConsiderPortion = NULL,
const bool _bNoFlyCntPorAndLinePor = false ) const;
#ifdef DBG_UTIL
void DebugPortions( SvStream &rOs, const XubString &rTxt,
const xub_StrLen nStart ); //$ ostream
#endif
OUTPUT_OPERATOR
DECL_FIXEDMEMPOOL_NEWDEL(SwLineLayout)
};
class SwParaPortion : public SwLineLayout
{
// neu zu paintender Bereich
SwRepaint aRepaint;
// neu zu formatierender Bereich
SwCharRange aReformat;
SwScriptInfo aScriptInfo;
// Fraction aZoom;
long nDelta;
// Wenn ein SwTxtFrm gelocked ist, werden keine Veraenderungen an den
// Formatierungsdaten (unter pLine) vorgenommen (vgl. ORPHANS)
sal_Bool bFlys : 1; // Ueberlappen Flys ?
sal_Bool bPrep : 1; // PREP_*
sal_Bool bPrepWidows : 1; // PREP_WIDOWS
sal_Bool bPrepAdjust : 1; // PREP_ADJUST_FRM
sal_Bool bPrepMustFit : 1; // PREP_MUST_FIT
sal_Bool bFollowField : 1; // Es steht noch ein Feldrest fuer den Follow an.
sal_Bool bFixLineHeight : 1; // Feste Zeilenhoehe
sal_Bool bFtnNum : 1; // contents a footnotenumberportion
sal_Bool bMargin : 1; // contents a hanging punctuation in the margin
sal_Bool bFlag00 : 1; //
sal_Bool bFlag11 : 1; //
sal_Bool bFlag12 : 1; //
sal_Bool bFlag13 : 1; //
sal_Bool bFlag14 : 1; //
sal_Bool bFlag15 : 1; //
sal_Bool bFlag16 : 1; //
public:
SwParaPortion();
virtual ~SwParaPortion();
// setzt alle Formatinformationen zurueck (ausser bFlys wg. 9916)
inline void FormatReset();
// Setzt die Flags zurueck
inline void ResetPreps();
// Get/Set-Methoden
inline SwRepaint *GetRepaint() { return &aRepaint; }
inline const SwRepaint *GetRepaint() const { return &aRepaint; }
inline SwCharRange *GetReformat() { return &aReformat; }
inline const SwCharRange *GetReformat() const { return &aReformat; }
inline long *GetDelta() { return &nDelta; }
inline const long *GetDelta() const { return &nDelta; }
inline SwScriptInfo& GetScriptInfo() { return aScriptInfo; }
inline const SwScriptInfo& GetScriptInfo() const { return aScriptInfo; }
// fuer SwTxtFrm::Format: liefert die aktuelle Laenge des Absatzes
xub_StrLen GetParLen() const;
// fuer Prepare()
sal_Bool UpdateQuoVadis( const XubString &rQuo );
// Flags
inline void SetFly( const sal_Bool bNew = sal_True ) { bFlys = bNew; }
inline sal_Bool HasFly() const { return bFlys; }
// Preps
inline void SetPrep( const sal_Bool bNew = sal_True ) { bPrep = bNew; }
inline sal_Bool IsPrep() const { return bPrep; }
inline void SetPrepWidows( const sal_Bool bNew = sal_True ) { bPrepWidows = bNew; }
inline sal_Bool IsPrepWidows() const { return bPrepWidows; }
inline void SetPrepMustFit( const sal_Bool bNew = sal_True ) { bPrepMustFit = bNew; }
inline sal_Bool IsPrepMustFit() const { return bPrepMustFit; }
inline void SetPrepAdjust( const sal_Bool bNew = sal_True ) { bPrepAdjust = bNew; }
inline sal_Bool IsPrepAdjust() const { return bPrepAdjust; }
inline void SetFollowField( const sal_Bool bNew = sal_True ) { bFollowField = bNew; }
inline sal_Bool IsFollowField() const { return bFollowField; }
inline void SetFixLineHeight( const sal_Bool bNew = sal_True ) { bFixLineHeight = bNew; }
inline sal_Bool IsFixLineHeight() const { return bFixLineHeight; }
inline void SetFtnNum( const sal_Bool bNew = sal_True ) { bFtnNum = bNew; }
inline sal_Bool IsFtnNum() const { return bFtnNum; }
inline void SetMargin( const sal_Bool bNew = sal_True ) { bMargin = bNew; }
inline sal_Bool IsMargin() const { return bMargin; }
inline void SetFlag00( const sal_Bool bNew = sal_True ) { bFlag00 = bNew; }
inline sal_Bool IsFlag00() const { return bFlag00; }
inline void SetFlag11( const sal_Bool bNew = sal_True ) { bFlag11 = bNew; }
inline sal_Bool IsFlag11() const { return bFlag11; }
inline void SetFlag12( const sal_Bool bNew = sal_True ) { bFlag12 = bNew; }
inline sal_Bool IsFlag12() const { return bFlag12; }
inline void SetFlag13( const sal_Bool bNew = sal_True ) { bFlag13 = bNew; }
inline sal_Bool IsFlag13() const { return bFlag13; }
inline void SetFlag14( const sal_Bool bNew = sal_True ) { bFlag14 = bNew; }
inline sal_Bool IsFlag14() const { return bFlag14; }
inline void SetFlag15( const sal_Bool bNew = sal_True ) { bFlag15 = bNew; }
inline sal_Bool IsFlag15() const { return bFlag15; }
inline void SetFlag16( const sal_Bool bNew = sal_True ) { bFlag16 = bNew; }
inline sal_Bool IsFlag16() const { return bFlag16; }
// schneller, hoeher, weiter: Read/Write-Methoden fuer den SWG-Filter
SvStream &ReadSwg ( SvStream& rStream ); //$ istream
SvStream &WriteSwg( SvStream& rStream ); //$ ostream
// nErgo in der QuoVadisPortion setzen
void SetErgoSumNum( const XubString &rErgo );
const SwDropPortion *FindDropPortion() const;
OUTPUT_OPERATOR
DECL_FIXEDMEMPOOL_NEWDEL(SwParaPortion)
};
/*************************************************************************
* Inline-Implementierungen
*************************************************************************/
inline void SwLineLayout::ResetFlags()
{
bFormatAdj = bDummy = bFntChg = bTab = bEndHyph = bMidHyph = bFly
= bRest = bBlinking = bClipping = bContent = bRedline
= bForcedLeftMargin = bHanging = sal_False;
}
inline SwLineLayout::SwLineLayout()
: pNext( 0 ), pLLSpaceAdd( 0 ), pKanaComp( 0 ), nRealHeight( 0 ),
bUnderscore( sal_False )
{
ResetFlags();
SetWhichPor( POR_LAY );
}
inline void SwParaPortion::ResetPreps()
{
bPrep = bPrepWidows = bPrepAdjust = bPrepMustFit = sal_False;
}
inline void SwParaPortion::FormatReset()
{
nDelta = 0;
aReformat = SwCharRange( 0, STRING_LEN );
// AMA 9916: bFlys muss in SwTxtFrm::_Format() erhalten bleiben, damit
// leere Absaetze, die Rahmen ohne Umfluss ausweichen mussten, sich
// neu formatieren, wenn der Rahmen aus dem Bereich verschwindet.
// bFlys = sal_False;
ResetPreps();
bFollowField = bFixLineHeight = bMargin = sal_False;
}
#ifdef UNX
// C30 ist mit dem ternaeren Ausdruck ueberfordert.
inline SwLinePortion *SwLineLayout::GetFirstPortion() const
{
SwLinePortion *pTmp = pPortion;
if ( !pPortion )
pTmp = (SwLinePortion*)this;
return( pTmp );
}
#else
inline SwLinePortion *SwLineLayout::GetFirstPortion() const
{ return( pPortion ? pPortion : (SwLinePortion*)this ); }
#endif
CLASSIO( SwLineLayout )
CLASSIO( SwParaPortion )
#endif