blob: da82710ab926eb9805aac705b7df73c35cf94b50 [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 _PORLIN_HXX
#define _PORLIN_HXX
#include "possiz.hxx" // SwPosSize
class XubString;
class SwTxtSizeInfo;
class SwTxtPaintInfo;
class SwTxtFormatInfo;
class SwPortionHandler;
// Die Ausgabeoperatoren der Portions sind virtuelle Methoden der Portion.
// Das CLASSIO-Makro implementiert die 'freischwebende' Funktion.
// Auf diese Weise erhaelt man beide Vorteile: virtuelle Ausgabeoperatoren
// und allgemeine Verwendbarkeit.
#ifdef DBG_UTIL
#define OUTPUT_OPERATOR virtual SvStream &operator<<( SvStream & aOs ) const;
#else
#define OUTPUT_OPERATOR
#endif
// Portiongruppen
#define PORGRP_TXT 0x8000
#define PORGRP_EXP 0x4000
#define PORGRP_FLD 0x2000
#define PORGRP_HYPH 0x1000
#define PORGRP_NUMBER 0x0800
#define PORGRP_GLUE 0x0400
#define PORGRP_FIX 0x0200
#define PORGRP_TAB 0x0100
#define PORGRP_NOTRECY 0x0080
// kleine Spezialgruppen
#define PORGRP_FIXMARG 0x0040
//#define PORGRP_? 0x0020
#define PORGRP_TABNOTLFT 0x0010
#define PORGRP_TOXREF 0x0008
/*************************************************************************
* class SwLinePortion
*************************************************************************/
class SwLinePortion: public SwPosSize
{
protected:
// Hier gibt es Bereiche mit unterschiedlichen Attributen.
SwLinePortion *pPortion;
// Anzahl der Zeichen und Spaces auf der Zeile
xub_StrLen nLineLength;
KSHORT nAscent; // Maximaler Ascender
SwLinePortion();
private:
MSHORT nWhichPor; // Who's who?
void _Truncate();
public:
inline SwLinePortion(const SwLinePortion &rPortion);
virtual ~SwLinePortion();
// Zugriffsmethoden
inline SwLinePortion *GetPortion() const { return( pPortion ); }
inline SwLinePortion &operator=(const SwLinePortion &rPortion);
inline sal_Bool operator==( const SwLinePortion &rPortion ) const;
inline xub_StrLen GetLen() const { return nLineLength; }
inline void SetLen( const xub_StrLen nLen ) { nLineLength = nLen; }
inline void SetPortion( SwLinePortion *pNew ){ pPortion = pNew; }
inline KSHORT &GetAscent() { return nAscent; }
inline KSHORT GetAscent() const { return nAscent; }
inline void SetAscent( const KSHORT nNewAsc ) { nAscent = nNewAsc; }
inline void PrtWidth( KSHORT nNewWidth ) { Width( nNewWidth ); }
inline KSHORT PrtWidth() const { return Width(); }
inline void AddPrtWidth( const KSHORT nNew ) { Width( Width() + nNew ); }
inline void SubPrtWidth( const KSHORT nNew ) { Width( Width() - nNew ); }
inline const SwPosSize &PrtSize() const { return *this; }
// Einfuegeoperationen:
virtual SwLinePortion *Insert( SwLinePortion *pPortion );
virtual SwLinePortion *Append( SwLinePortion *pPortion );
SwLinePortion *Cut( SwLinePortion *pVictim );
inline void Truncate();
// liefert 0 zurueck, wenn keine Nutzdaten enthalten sind.
virtual SwLinePortion *Compress();
inline void SetWhichPor( const MSHORT nNew ) { nWhichPor = nNew; }
inline MSHORT GetWhichPor( ) const { return nWhichPor; }
// Gruppenabfragen:
inline sal_Bool InTxtGrp( ) const { return nWhichPor & PORGRP_TXT ? sal_True : sal_False; }
inline sal_Bool InGlueGrp( ) const { return nWhichPor & PORGRP_GLUE ? sal_True : sal_False;}
inline sal_Bool InTabGrp( ) const { return nWhichPor & PORGRP_TAB ? sal_True : sal_False; }
inline sal_Bool InHyphGrp( ) const { return nWhichPor & PORGRP_HYPH ? sal_True : sal_False;}
inline sal_Bool InNumberGrp( )const { return nWhichPor & PORGRP_NUMBER ? sal_True : sal_False;}
inline sal_Bool InFixGrp( ) const { return nWhichPor & PORGRP_FIX ? sal_True : sal_False; }
inline sal_Bool InFldGrp( ) const { return nWhichPor & PORGRP_FLD ? sal_True : sal_False; }
inline sal_Bool InToxRefGrp( ) const { return nWhichPor & PORGRP_TOXREF ? sal_True : sal_False; }
inline sal_Bool InToxRefOrFldGrp( ) const { return nWhichPor &
( PORGRP_FLD | PORGRP_TOXREF ) ? sal_True : sal_False; }
inline sal_Bool InExpGrp( ) const { return nWhichPor & PORGRP_EXP ? sal_True : sal_False; }
inline sal_Bool InTabnLftGrp( ) const
{ return nWhichPor & PORGRP_TABNOTLFT ? sal_True : sal_False; }
inline sal_Bool InFixMargGrp( )const
{ return nWhichPor & PORGRP_FIXMARG ? sal_True : sal_False; }
inline sal_Bool InSpaceGrp( )const
{ return InTxtGrp() || IsMultiPortion(); }
// Individuelle Abfragen:
inline sal_Bool IsGrfNumPortion( )const{ return nWhichPor == POR_GRFNUM; }
inline sal_Bool IsFlyCntPortion( )const{ return nWhichPor == POR_FLYCNT; }
inline sal_Bool IsBlankPortion( ) const{ return nWhichPor == POR_BLANK; }
inline sal_Bool IsBreakPortion( ) const{ return nWhichPor == POR_BRK; }
inline sal_Bool IsErgoSumPortion()const{ return nWhichPor == POR_ERGOSUM;}
inline sal_Bool IsQuoVadisPortion()const{ return nWhichPor==POR_QUOVADIS;}
inline sal_Bool IsTabCntPortion( )const{ return nWhichPor==POR_TABCENTER;}
inline sal_Bool IsTabDecimalPortion() const { return nWhichPor == POR_TABDECIMAL;}
inline sal_Bool IsTabLeftPortion()const{ return nWhichPor == POR_TABLEFT;}
inline sal_Bool IsFtnNumPortion( )const{ return nWhichPor == POR_FTNNUM; }
inline sal_Bool IsFtnPortion( ) const{ return nWhichPor == POR_FTN; }
inline sal_Bool IsTmpEndPortion( )const{ return nWhichPor == POR_TMPEND; }
inline sal_Bool IsDropPortion( ) const{ return nWhichPor == POR_DROP; }
inline sal_Bool IsLayPortion( ) const{ return nWhichPor == POR_LAY; }
inline sal_Bool IsParaPortion( ) const{ return nWhichPor == POR_PARA; }
inline sal_Bool IsMarginPortion( )const{ return nWhichPor == POR_MARGIN; }
inline sal_Bool IsFlyPortion( ) const{ return nWhichPor == POR_FLY; }
inline sal_Bool IsHolePortion( ) const{ return nWhichPor == POR_HOLE; }
inline sal_Bool IsSoftHyphPortion()const{ return nWhichPor==POR_SOFTHYPH;}
inline sal_Bool IsPostItsPortion()const{ return nWhichPor == POR_POSTITS;}
inline sal_Bool IsCombinedPortion()const{ return nWhichPor==POR_COMBINED;}
inline sal_Bool IsTextPortion( ) const{ return nWhichPor == POR_TXT; }
inline sal_Bool IsURLPortion( ) const{ return nWhichPor == POR_URL; }
inline sal_Bool IsHangingPortion( ) const{ return nWhichPor == POR_HNG; }
inline sal_Bool IsKernPortion( ) const{ return nWhichPor == POR_KERN; }
inline sal_Bool IsArrowPortion( ) const{ return nWhichPor == POR_ARROW; }
inline sal_Bool IsMultiPortion( ) const{ return nWhichPor == POR_MULTI; }
inline sal_Bool IsNumberPortion( ) const{ return nWhichPor == POR_NUMBER; } // #i23726#
inline sal_Bool IsControlCharPortion() const { return nWhichPor == POR_CONTROLCHAR; }
// Positionierung
SwLinePortion *FindPrevPortion( const SwLinePortion *pRoot );
SwLinePortion *FindLastPortion();
virtual xub_StrLen GetCrsrOfst( const KSHORT nOfst ) const;
virtual SwPosSize GetTxtSize( const SwTxtSizeInfo &rInfo ) const;
void CalcTxtSize( const SwTxtSizeInfo &rInfo );
// Ausgabe
virtual void Paint( const SwTxtPaintInfo &rInf ) const = 0;
void PrePaint( const SwTxtPaintInfo &rInf, const SwLinePortion *pLast ) const;
#ifdef DBG_UTIL
virtual sal_Bool Check( SvStream &rOs, SwTxtSizeInfo &rInfo ); //$ ostream
#endif
virtual sal_Bool Format( SwTxtFormatInfo &rInf );
// wird fuer die letzte Portion der Zeile extra gerufen
virtual void FormatEOL( SwTxtFormatInfo &rInf );
void Move( SwTxtPaintInfo &rInf );
// Fuer SwTxtSlot
virtual sal_Bool GetExpTxt( const SwTxtSizeInfo &rInf, XubString &rTxt ) const;
// fuer SwFldPortion, SwSoftHyphPortion
virtual KSHORT GetViewWidth( const SwTxtSizeInfo &rInf ) const;
// for text- and multi-portions
virtual long CalcSpacing( long nSpaceAdd, const SwTxtSizeInfo &rInf ) const;
// Accessibility: pass information about this portion to the PortionHandler
virtual void HandlePortion( SwPortionHandler& rPH ) const;
OUTPUT_OPERATOR
};
/*************************************************************************
* inline - Implementations
*************************************************************************/
inline SwLinePortion &SwLinePortion::operator=(const SwLinePortion &rPortion)
{
*(SwPosSize*)this = rPortion;
nLineLength = rPortion.nLineLength;
nAscent = rPortion.nAscent;
nWhichPor = rPortion.nWhichPor;
return *this;
}
inline sal_Bool SwLinePortion::operator==(const SwLinePortion &rPortion ) const
{
return( Height() == rPortion.Height() &&
Width() == rPortion.Width() &&
nLineLength == rPortion.GetLen() &&
nAscent == rPortion.GetAscent() );
}
inline SwLinePortion::SwLinePortion(const SwLinePortion &rPortion) :
SwPosSize( rPortion ),
pPortion( 0 ),
nLineLength( rPortion.nLineLength ),
nAscent( rPortion.nAscent ),
nWhichPor( rPortion.nWhichPor )
{
}
inline void SwLinePortion::Truncate()
{
if ( pPortion )
_Truncate();
}
//$ ostream
#ifdef DBGTXT
#define CLASSIO( class ) \
inline SvStream &operator<<( SvStream &rOs, const class &rClass ) {\
return rClass.operator<<( rOs );\
}
#else
#define CLASSIO( class )
#endif
CLASSIO( SwLinePortion )
#endif