LCOV - code coverage report
Current view: top level - sw/source/core/text - itrtxt.hxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 91 0.0 %
Date: 2014-04-14 Functions: 0 65 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : #ifndef INCLUDED_SW_SOURCE_CORE_TEXT_ITRTXT_HXX
      20             : #define INCLUDED_SW_SOURCE_CORE_TEXT_ITRTXT_HXX
      21             : #include "swtypes.hxx"
      22             : #include "itratr.hxx"
      23             : #include "inftxt.hxx"
      24             : 
      25             : class SwTxtFrm;
      26             : struct SwPosition;
      27             : struct SwCrsrMoveState;
      28             : class SwMarginPortion;
      29             : class SwFlyPortion;
      30             : 
      31             : /*************************************************************************
      32             :  *                      class SwTxtIter
      33             :  *************************************************************************/
      34             : 
      35           0 : class SwTxtIter : public SwAttrIter
      36             : {
      37             : protected:
      38             :     SwLineInfo aLineInf;
      39             :     SwTxtFrm  *pFrm;
      40             :     SwTxtInfo *pInf;
      41             :     SwLineLayout *pCurr;
      42             :     SwLineLayout *pPrev;
      43             :     SwTwips nFrameStart;
      44             :     SwTwips nY;
      45             :     SwTwips nRegStart;          // The register's start position (Y)
      46             :     sal_Int32 nStart;          // Start in the text string, end = pCurr->GetLen()
      47             :     KSHORT nRegDiff;            // Register's line distance
      48             :     MSHORT nLineNr;             // Line number
      49             :     bool bPrev          : 1;
      50             :     bool bRegisterOn    : 1;    // Keep in register
      51             :     bool bOneBlock      : 1;    // Justified text: Dispose single words
      52             :     bool bLastBlock     : 1;    // Justified text: Also the last line
      53             :     bool bLastCenter    : 1;    // Justified text: Center last line
      54             : 
      55             :     SwLineLayout *_GetPrev();
      56             : 
      57             :     // Reset in the first line
      58             :     void Init();
      59             :     void CtorInitTxtIter( SwTxtFrm *pFrm, SwTxtInfo *pInf );
      60           0 :     inline SwTxtIter(SwTxtNode* pTxtNode)
      61             :         : SwAttrIter(pTxtNode)
      62             :         , pFrm(NULL)
      63             :         , pInf(NULL)
      64             :         , pCurr(NULL)
      65             :         , pPrev(NULL)
      66             :         , nFrameStart(0)
      67             :         , nY(0)
      68             :         , nRegStart(0)
      69             :         , nStart(0)
      70             :         , nRegDiff(0)
      71             :         , nLineNr(0)
      72             :         , bPrev(false)
      73             :         , bRegisterOn(false)
      74             :         , bOneBlock(false)
      75             :         , bLastBlock(false)
      76           0 :         , bLastCenter(false)
      77           0 :         {}
      78             : public:
      79           0 :     inline SwTxtIter( SwTxtFrm *pTxtFrm, SwTxtInfo *pTxtInf )
      80             :         : SwAttrIter( pTxtFrm != NULL ? pTxtFrm->GetTxtNode() : NULL)
      81             :         , bOneBlock(false)
      82             :         , bLastBlock(false)
      83           0 :         , bLastCenter(false)
      84             :         {
      85           0 :             CtorInitTxtIter( pTxtFrm, pTxtInf );
      86           0 :         }
      87           0 :     inline const SwLineLayout *GetCurr() const { return pCurr; } // NEVER 0!
      88           0 :     inline const SwLineLayout *GetNext() const { return pCurr->GetNext(); }
      89             :            const SwLineLayout *GetPrev();
      90           0 :     inline sal_Int32 GetLength() const { return pCurr->GetLen(); }
      91           0 :     inline MSHORT GetLineNr() const { return nLineNr; }
      92           0 :     inline sal_Int32 GetStart() const { return nStart; }
      93           0 :     inline sal_Int32 GetEnd() const { return GetStart() + GetLength(); }
      94           0 :     inline SwTwips Y() const { return nY; }
      95             : 
      96           0 :     inline SwTwips RegStart() const { return nRegStart; }
      97           0 :     inline KSHORT RegDiff() const { return nRegDiff; }
      98           0 :     inline bool IsRegisterOn() const { return bRegisterOn; }
      99             : 
     100           0 :     inline SwTxtInfo &GetInfo() { return *pInf; }
     101           0 :     inline const SwTxtInfo &GetInfo() const { return *pInf; }
     102             : 
     103           0 :     inline void Top() { Init(); }
     104             :     void Bottom();
     105             :     const SwLineLayout *Next();
     106             :     const SwLineLayout *Prev();
     107             : 
     108             :     // Skips the FlyFrms dummy line
     109             :     const SwLineLayout *NextLine();
     110             :     const SwLineLayout *PrevLine();
     111             :     const SwLineLayout *GetNextLine() const;
     112             :     const SwLineLayout *GetPrevLine();
     113             : 
     114             :     void CharToLine( const sal_Int32 );
     115             :     const SwLineLayout *TwipsToLine(const SwTwips);
     116             : 
     117             :     // Truncates all after pCurr
     118             :     void TruncLines( bool bNoteFollow = false );
     119             : 
     120           0 :     inline KSHORT GetLineHeight() const { return pCurr->GetRealHeight(); }
     121             :     void CalcAscentAndHeight( KSHORT &rAscent, KSHORT &rHeight ) const;
     122             : 
     123             :     // Lots of trouble for querying pCurr == pPara
     124           0 :     inline bool IsFirstTxtLine() const
     125           0 :     { return nStart == GetInfo().GetTxtStart() &&
     126           0 :         !( pCurr->IsDummy() && GetNextLine() ); }
     127             : 
     128             :     // Replacement for the old IsFirstLine()
     129           0 :     inline bool IsParaLine() const
     130           0 :         { return pCurr == pInf->GetParaPortion(); }
     131             : 
     132           0 :     const SwLineInfo &GetLineInfo() const { return aLineInf; }
     133             :     inline SwTwips GetFirstPos() const { return nFrameStart; }
     134             :     inline bool SeekAndChg( SwTxtSizeInfo &rInf );
     135             :     inline bool SeekAndChgBefore( SwTxtSizeInfo &rInf );
     136             :     inline bool SeekStartAndChg( SwTxtSizeInfo &rInf, const bool bPara=false );
     137             : 
     138           0 :     inline SwTxtFrm *GetTxtFrm() { return pFrm; }
     139           0 :     inline const SwTxtFrm *GetTxtFrm() const { return pFrm; }
     140             : 
     141             :     // Counts consecutive hyphens in order to be within the boundary given by MaxHyphens
     142             :     void CntHyphens( sal_uInt8 &nEndCnt, sal_uInt8 &nMidCnt) const;
     143             : };
     144             : 
     145             : /*************************************************************************
     146             :  *                      class SwTxtMargin
     147             :  *************************************************************************/
     148             : 
     149           0 : class SwTxtMargin : public SwTxtIter
     150             : {
     151             : private:
     152             :           SwTwips nLeft;
     153             :           SwTwips nRight;
     154             :           SwTwips nFirst;
     155             :           KSHORT  nDropLeft;
     156             :           KSHORT  nDropHeight;
     157             :           KSHORT  nDropDescent;
     158             :           MSHORT  nDropLines;
     159             :           MSHORT  nAdjust;
     160             :           // #i91133#
     161             :           SwTwips mnTabLeft;
     162             : 
     163             : protected:
     164             :     // For FormatQuoVadis
     165           0 :     inline void Right( const SwTwips nNew ) { nRight = nNew; }
     166             :     // For CalcFlyAdjust
     167             :     inline void SetDropLeft( const KSHORT nNew ) { nDropLeft = nNew; }
     168             : 
     169             :     void CtorInitTxtMargin( SwTxtFrm *pFrm, SwTxtSizeInfo *pInf );
     170           0 :     inline SwTxtMargin(SwTxtNode* pTxtNode)
     171             :         : SwTxtIter(pTxtNode)
     172             :         , nLeft(0)
     173             :         , nRight(0)
     174             :         , nFirst(0)
     175             :         , nDropLeft(0)
     176             :         , nDropHeight(0)
     177             :         , nDropDescent(0)
     178             :         , nDropLines(0)
     179             :         , nAdjust(0)
     180           0 :         , mnTabLeft(0)
     181           0 :         { }
     182             : public:
     183           0 :     inline SwTxtMargin( SwTxtFrm *pTxtFrm, SwTxtSizeInfo *pTxtSizeInf )
     184           0 :         : SwTxtIter( pTxtFrm != NULL ? pTxtFrm->GetTxtNode() : NULL)
     185             :         {
     186           0 :             CtorInitTxtMargin( pTxtFrm, pTxtSizeInf );
     187           0 :         }
     188             :     inline SwTwips GetLeftMargin() const;
     189             :     inline SwTwips Left() const;
     190           0 :     inline SwTwips Right() const { return nRight; }
     191           0 :     inline SwTwips FirstLeft() const { return nFirst; }
     192           0 :     inline SwTwips CurrWidth() const { return pCurr->PrtWidth(); }
     193             :            SwTwips GetLineStart() const;
     194           0 :     inline SwTwips GetLineEnd() const { return GetLineStart() + CurrWidth(); }
     195           0 :     inline Point GetTopLeft() const { return Point( GetLineStart(), Y() ); }
     196           0 :     inline bool IsOneBlock() const { return bOneBlock; }
     197           0 :     inline bool IsLastBlock() const { return bLastBlock; }
     198           0 :     inline bool IsLastCenter() const { return bLastCenter; }
     199           0 :     inline MSHORT GetAdjust() const { return nAdjust; }
     200           0 :     inline KSHORT GetLineWidth() const
     201           0 :            { return KSHORT( Right() - GetLeftMargin() + 1 ); }
     202           0 :     inline SwTwips GetLeftMin() const { return nFirst < nLeft ? nFirst : nLeft; }
     203           0 :     inline bool HasNegFirst() const { return nFirst < nLeft; }
     204             : 
     205             :     // #i91133#
     206           0 :     inline SwTwips GetTabLeft() const
     207             :     {
     208           0 :         return mnTabLeft;
     209             :     }
     210             :     // DropCaps
     211           0 :     inline MSHORT GetDropLines() const { return nDropLines; }
     212           0 :     inline void SetDropLines( const MSHORT nNew ) { nDropLines = nNew; }
     213           0 :     inline KSHORT GetDropLeft() const { return nDropLeft; }
     214           0 :     inline KSHORT GetDropHeight() const { return nDropHeight; }
     215           0 :     inline void SetDropHeight( const KSHORT nNew ) { nDropHeight = nNew; }
     216           0 :     inline KSHORT GetDropDescent() const { return nDropDescent; }
     217           0 :     inline void SetDropDescent( const KSHORT nNew ) { nDropDescent = nNew; }
     218             :     void DropInit();
     219             : 
     220             :     // Returns the TxtPos for start and end of the current line without whitespace
     221             :     // Implemented in frminf.cxx
     222             :     sal_Int32 GetTxtStart() const;
     223             :     sal_Int32 GetTxtEnd() const;
     224             : 
     225           0 :     inline SwTxtSizeInfo &GetInfo()
     226           0 :         { return (SwTxtSizeInfo&)SwTxtIter::GetInfo(); }
     227           0 :     inline const SwTxtSizeInfo &GetInfo() const
     228           0 :         { return (const SwTxtSizeInfo&)SwTxtIter::GetInfo(); }
     229             : 
     230             : };
     231             : 
     232             : /*************************************************************************
     233             :  *                      class SwTxtAdjuster
     234             :  *************************************************************************/
     235             : 
     236           0 : class SwTxtAdjuster : public SwTxtMargin
     237             : {
     238             :     // Adjusts the portion, if we have adjustment and FlyFrms
     239             :     void CalcFlyAdjust( SwLineLayout *pCurr );
     240             : 
     241             :     // Calls SplitGlues and CalcBlockAdjust
     242             :     void FormatBlock( );
     243             : 
     244             :     // Creates the glue chain for short lines
     245             :     SwMarginPortion* CalcRightMargin( SwLineLayout *pCurr, SwTwips nReal = 0 );
     246             : 
     247             :     // Calculate the adjustment (FlyPortions)
     248             :     SwFlyPortion *CalcFlyPortion( const long nRealWidth,
     249             :                                   const SwRect &rCurrRect );
     250             : 
     251             : protected:
     252           0 :     inline SwTxtAdjuster(SwTxtNode* pTxtNode) : SwTxtMargin(pTxtNode) { }
     253             :     // Creates the Glues for adjusted paragraphs
     254             :     void CalcNewBlock( SwLineLayout *pCurr, const SwLinePortion *pStopAt,
     255             :         SwTwips nReal = 0, bool bSkipKashida = false );
     256             :     SwTwips CalcKanaAdj( SwLineLayout *pCurr );
     257             : public:
     258             :     inline SwTxtAdjuster( SwTxtFrm *pTxtFrm, SwTxtSizeInfo *pTxtSizeInf ) : SwTxtMargin(pTxtFrm!=NULL?pTxtFrm->GetTxtNode():NULL)
     259             :            { CtorInitTxtMargin( pTxtFrm, pTxtSizeInf ); }
     260             : 
     261             :     // Is overloaded by SwTxtFormatter due to UpdatePos
     262             :     void CalcAdjLine( SwLineLayout *pCurr );
     263             : 
     264             :     // For adjusting afterwards
     265           0 :     inline void GetAdjusted() const
     266             :     {
     267           0 :         if( pCurr->IsFormatAdj() )
     268           0 :             ((SwTxtAdjuster*)this)->CalcAdjLine( pCurr );
     269           0 :     }
     270             : 
     271             :     // Special treatment for DropCaps
     272             :     void CalcDropAdjust();
     273             :     void CalcDropRepaint();
     274             : };
     275             : 
     276             : /*************************************************************************
     277             :  *                      class SwTxtCursor
     278             :  *************************************************************************/
     279             : 
     280           0 : class SwTxtCursor : public SwTxtAdjuster
     281             : {
     282             :     // A small helper-class to save SwTxtCursor member, manipulate them
     283             :     // and to restore them
     284             :     friend class SwTxtCursorSave;
     285             : 
     286             :     // Ambiguities
     287             :     static bool bRightMargin;
     288             :     void _GetCharRect(SwRect *, const sal_Int32, SwCrsrMoveState* );
     289             : protected:
     290             :     void CtorInitTxtCursor( SwTxtFrm *pFrm, SwTxtSizeInfo *pInf );
     291           0 :     SwTxtCursor(SwTxtNode* pTxtNode) : SwTxtAdjuster(pTxtNode) { }
     292             : public:
     293           0 :     SwTxtCursor( SwTxtFrm *pTxtFrm, SwTxtSizeInfo *pTxtSizeInf )
     294           0 :         : SwTxtAdjuster(pTxtFrm->GetTxtNode())
     295             :     {
     296           0 :         CtorInitTxtCursor(pTxtFrm, pTxtSizeInf);
     297           0 :     }
     298             :     bool GetCharRect(SwRect *, const sal_Int32, SwCrsrMoveState* = 0,
     299             :         const long nMax = 0 );
     300             :     bool GetEndCharRect(SwRect *, const sal_Int32, SwCrsrMoveState* = 0,
     301             :         const long nMax = 0 );
     302             :     sal_Int32 GetCrsrOfst( SwPosition *pPos, const Point &rPoint,
     303             :                 bool nChgNode, SwCrsrMoveState* = 0 ) const;
     304             :     // Respects ambiguities: For the implementation see below
     305             :     const SwLineLayout *CharCrsrToLine( const sal_Int32 nPos );
     306             : 
     307             :     // calculates baseline for portion rPor
     308             :     // bAutoToCentered indicates, if AUTOMATIC mode means CENTERED or BASELINE
     309             :     sal_uInt16 AdjustBaseLine( const SwLineLayout& rLine, const SwLinePortion* pPor,
     310             :                            sal_uInt16 nPorHeight = 0, sal_uInt16 nAscent = 0,
     311             :                            const bool bAutoToCentered = false ) const;
     312             : 
     313           0 :     static inline void SetRightMargin( const bool bNew ){ bRightMargin = bNew; }
     314           0 :     static inline bool IsRightMargin() { return bRightMargin; }
     315             : };
     316             : 
     317             : /*************************************************************************
     318             :  *                          SwHookOut
     319             :  *
     320             :  * Change current output device to printer, this has to be done before
     321             :  * formatting.
     322             :  *************************************************************************/
     323             : 
     324             : class SwHookOut
     325             : {
     326             :     SwTxtSizeInfo* pInf;
     327             :     OutputDevice* pOut;
     328             :     bool bOnWin;
     329             : public:
     330             :     SwHookOut( SwTxtSizeInfo& rInfo );
     331             :     ~SwHookOut();
     332             : };
     333             : 
     334             : /*************************************************************************
     335             :  *                      Inline implementation
     336             :  *************************************************************************/
     337             : 
     338           0 : inline bool SwTxtIter::SeekAndChg( SwTxtSizeInfo &rInf )
     339             : {
     340           0 :     return SeekAndChgAttrIter( rInf.GetIdx(), rInf.GetOut() );
     341             : }
     342             : 
     343           0 : inline bool SwTxtIter::SeekAndChgBefore( SwTxtSizeInfo &rInf )
     344             : {
     345           0 :     if ( rInf.GetIdx() )
     346           0 :         return SeekAndChgAttrIter( rInf.GetIdx()-1, rInf.GetOut() );
     347             :     else
     348           0 :         return SeekAndChgAttrIter( rInf.GetIdx(), rInf.GetOut() );
     349             : }
     350             : 
     351           0 : inline bool SwTxtIter::SeekStartAndChg( SwTxtSizeInfo &rInf, const bool bPara )
     352             : {
     353           0 :     return SeekStartAndChgAttrIter( rInf.GetOut(), bPara );
     354             : }
     355             : 
     356           0 : inline SwTwips SwTxtMargin::GetLeftMargin() const
     357             : {
     358           0 :     return IsFirstTxtLine() ? nFirst : Left();
     359             : }
     360             : 
     361           0 : inline SwTwips SwTxtMargin::Left() const
     362             : {
     363           0 :     return (nDropLines >= nLineNr && 1 != nLineNr) ? nFirst + nDropLeft : nLeft;
     364             : }
     365             : 
     366             : #endif
     367             : 
     368             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10