summaryrefslogtreecommitdiff
path: root/sw/source/core/text/porlin.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/text/porlin.hxx')
-rw-r--r--sw/source/core/text/porlin.hxx254
1 files changed, 254 insertions, 0 deletions
diff --git a/sw/source/core/text/porlin.hxx b/sw/source/core/text/porlin.hxx
new file mode 100644
index 000000000000..a4f887113173
--- /dev/null
+++ b/sw/source/core/text/porlin.hxx
@@ -0,0 +1,254 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _PORLIN_HXX
+#define _PORLIN_HXX
+
+#include "possiz.hxx" // SwPosSize
+
+#if OSL_DEBUG_LEVEL > 1
+#include <libxml/xmlwriter.h>
+#endif
+
+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.
+#if OSL_DEBUG_LEVEL > 1
+#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;
+
+#if OSL_DEBUG_LEVEL > 1
+ 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;
+
+#if OSL_DEBUG_LEVEL > 1
+ void dumpPortionAsXml(sal_uInt16 ofs, String& aText, xmlTextWriter* writer);
+#endif
+ 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
+#define CLASSIO( class )
+
+CLASSIO( SwLinePortion )
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */