LCOV - code coverage report
Current view: top level - sw/source/core/text - itrtxt.hxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 88 91 96.7 %
Date: 2015-06-13 12:38:46 Functions: 58 65 89.2 %
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 SwTextFrm;
      26             : struct SwPosition;
      27             : struct SwCrsrMoveState;
      28             : class SwMarginPortion;
      29             : class SwFlyPortion;
      30             : 
      31      184833 : class SwTextIter : public SwAttrIter
      32             : {
      33             : protected:
      34             :     SwLineInfo aLineInf;
      35             :     SwTextFrm  *pFrm;
      36             :     SwTextInfo *pInf;
      37             :     SwLineLayout *pCurr;
      38             :     SwLineLayout *pPrev;
      39             :     SwTwips nFrameStart;
      40             :     SwTwips nY;
      41             :     SwTwips nRegStart;          // The register's start position (Y)
      42             :     sal_Int32 nStart;          // Start in the text string, end = pCurr->GetLen()
      43             :     sal_uInt16 nRegDiff;            // Register's line distance
      44             :     sal_uInt16 nLineNr;             // Line number
      45             :     bool bPrev          : 1;
      46             :     bool bRegisterOn    : 1;    // Keep in register
      47             :     bool bOneBlock      : 1;    // Justified text: Dispose single words
      48             :     bool bLastBlock     : 1;    // Justified text: Also the last line
      49             :     bool bLastCenter    : 1;    // Justified text: Center last line
      50             : 
      51             :     SwLineLayout *_GetPrev();
      52             : 
      53             :     // Reset in the first line
      54             :     void Init();
      55             :     void CtorInitTextIter( SwTextFrm *pFrm, SwTextInfo *pInf );
      56      184321 :     explicit SwTextIter(SwTextNode* pTextNode)
      57             :         : SwAttrIter(pTextNode)
      58             :         , pFrm(NULL)
      59             :         , pInf(NULL)
      60             :         , pCurr(NULL)
      61             :         , pPrev(NULL)
      62             :         , nFrameStart(0)
      63             :         , nY(0)
      64             :         , nRegStart(0)
      65             :         , nStart(0)
      66             :         , nRegDiff(0)
      67             :         , nLineNr(0)
      68             :         , bPrev(false)
      69             :         , bRegisterOn(false)
      70             :         , bOneBlock(false)
      71             :         , bLastBlock(false)
      72      184321 :         , bLastCenter(false)
      73             :     {
      74      184321 :     }
      75             : public:
      76         512 :     SwTextIter(SwTextFrm *pTextFrm, SwTextInfo *pTextInf)
      77             :         : SwAttrIter(pTextFrm->GetTextNode())
      78             :         , bOneBlock(false)
      79             :         , bLastBlock(false)
      80         512 :         , bLastCenter(false)
      81             :     {
      82         512 :         CtorInitTextIter(pTextFrm, pTextInf);
      83         512 :     }
      84      745925 :     inline const SwLineLayout *GetCurr() const { return pCurr; } // NEVER 0!
      85        7734 :     inline const SwLineLayout *GetNext() const { return pCurr->GetNext(); }
      86             :            const SwLineLayout *GetPrev();
      87      166556 :     inline sal_Int32 GetLength() const { return pCurr->GetLen(); }
      88      322757 :     inline sal_uInt16 GetLineNr() const { return nLineNr; }
      89      388489 :     inline sal_Int32 GetStart() const { return nStart; }
      90      119312 :     inline sal_Int32 GetEnd() const { return GetStart() + GetLength(); }
      91      591553 :     inline SwTwips Y() const { return nY; }
      92             : 
      93           0 :     inline SwTwips RegStart() const { return nRegStart; }
      94           0 :     inline sal_uInt16 RegDiff() const { return nRegDiff; }
      95      103285 :     inline bool IsRegisterOn() const { return bRegisterOn; }
      96             : 
      97     4458223 :     inline SwTextInfo &GetInfo() { return *pInf; }
      98     1172597 :     inline const SwTextInfo &GetInfo() const { return *pInf; }
      99             : 
     100        1414 :     inline void Top() { Init(); }
     101             :     void Bottom();
     102             :     const SwLineLayout *Next();
     103             :     const SwLineLayout *Prev();
     104             : 
     105             :     // Skips the FlyFrms dummy line
     106             :     const SwLineLayout *NextLine();
     107             :     const SwLineLayout *PrevLine();
     108             :     const SwLineLayout *GetNextLine() const;
     109             :     const SwLineLayout *GetPrevLine();
     110             : 
     111             :     void CharToLine( const sal_Int32 );
     112             :     const SwLineLayout *TwipsToLine(const SwTwips);
     113             : 
     114             :     // Truncates all after pCurr
     115             :     void TruncLines( bool bNoteFollow = false );
     116             : 
     117      823475 :     inline sal_uInt16 GetLineHeight() const { return pCurr->GetRealHeight(); }
     118             :     void CalcAscentAndHeight( sal_uInt16 &rAscent, sal_uInt16 &rHeight ) const;
     119             : 
     120             :     // Lots of trouble for querying pCurr == pPara
     121      412916 :     inline bool IsFirstTextLine() const
     122      987507 :     { return nStart == GetInfo().GetTextStart() &&
     123      738027 :         !( pCurr->IsDummy() && GetNextLine() ); }
     124             : 
     125             :     // Replacement for the old IsFirstLine()
     126      200712 :     inline bool IsParaLine() const
     127      200712 :         { return pCurr == pInf->GetParaPortion(); }
     128             : 
     129       78539 :     const SwLineInfo &GetLineInfo() const { return aLineInf; }
     130             :     inline SwTwips GetFirstPos() const { return nFrameStart; }
     131             :     inline bool SeekAndChg( SwTextSizeInfo &rInf );
     132             :     inline bool SeekAndChgBefore( SwTextSizeInfo &rInf );
     133             :     inline bool SeekStartAndChg( SwTextSizeInfo &rInf, const bool bPara=false );
     134             : 
     135      588463 :     inline SwTextFrm *GetTextFrm() { return pFrm; }
     136        7208 :     inline const SwTextFrm *GetTextFrm() const { return pFrm; }
     137             : 
     138             :     // Counts consecutive hyphens in order to be within the boundary given by MaxHyphens
     139             :     void CntHyphens( sal_uInt8 &nEndCnt, sal_uInt8 &nMidCnt) const;
     140             : };
     141             : 
     142      184321 : class SwTextMargin : public SwTextIter
     143             : {
     144             : private:
     145             :           SwTwips nLeft;
     146             :           SwTwips nRight;
     147             :           SwTwips nFirst;
     148             :           sal_uInt16  nDropLeft;
     149             :           sal_uInt16  nDropHeight;
     150             :           sal_uInt16  nDropDescent;
     151             :           sal_uInt16  nDropLines;
     152             :           sal_uInt16  nAdjust;
     153             :           // #i91133#
     154             :           SwTwips mnTabLeft;
     155             : 
     156             : protected:
     157             :     // For FormatQuoVadis
     158           0 :     inline void Right( const SwTwips nNew ) { nRight = nNew; }
     159             :     // For CalcFlyAdjust
     160             :     inline void SetDropLeft( const sal_uInt16 nNew ) { nDropLeft = nNew; }
     161             : 
     162             :     void CtorInitTextMargin( SwTextFrm *pFrm, SwTextSizeInfo *pInf );
     163      138248 :     explicit SwTextMargin(SwTextNode* pTextNode)
     164             :         : SwTextIter(pTextNode)
     165             :         , nLeft(0)
     166             :         , nRight(0)
     167             :         , nFirst(0)
     168             :         , nDropLeft(0)
     169             :         , nDropHeight(0)
     170             :         , nDropDescent(0)
     171             :         , nDropLines(0)
     172             :         , nAdjust(0)
     173      138248 :         , mnTabLeft(0)
     174             :     {
     175      138248 :     }
     176             : public:
     177       46073 :     SwTextMargin(SwTextFrm *pTextFrm, SwTextSizeInfo *pTextSizeInf)
     178       46073 :         : SwTextIter(pTextFrm->GetTextNode())
     179             :     {
     180       46073 :         CtorInitTextMargin( pTextFrm, pTextSizeInf );
     181       46073 :     }
     182             :     inline SwTwips GetLeftMargin() const;
     183             :     inline SwTwips Left() const;
     184      218951 :     inline SwTwips Right() const { return nRight; }
     185       84658 :     inline SwTwips FirstLeft() const { return nFirst; }
     186        6897 :     inline SwTwips CurrWidth() const { return pCurr->PrtWidth(); }
     187             :            SwTwips GetLineStart() const;
     188         135 :     inline SwTwips GetLineEnd() const { return GetLineStart() + CurrWidth(); }
     189      144827 :     inline Point GetTopLeft() const { return Point( GetLineStart(), Y() ); }
     190          14 :     inline bool IsOneBlock() const { return bOneBlock; }
     191         616 :     inline bool IsLastBlock() const { return bLastBlock; }
     192         327 :     inline bool IsLastCenter() const { return bLastCenter; }
     193      265551 :     inline sal_uInt16 GetAdjust() const { return nAdjust; }
     194        6860 :     inline sal_uInt16 GetLineWidth() const
     195        6860 :            { return sal_uInt16( Right() - GetLeftMargin() + 1 ); }
     196       28826 :     inline SwTwips GetLeftMin() const { return nFirst < nLeft ? nFirst : nLeft; }
     197         268 :     inline bool HasNegFirst() const { return nFirst < nLeft; }
     198             : 
     199             :     // #i91133#
     200        4131 :     inline SwTwips GetTabLeft() const
     201             :     {
     202        4131 :         return mnTabLeft;
     203             :     }
     204             :     // DropCaps
     205       73624 :     inline sal_uInt16 GetDropLines() const { return nDropLines; }
     206          18 :     inline void SetDropLines( const sal_uInt16 nNew ) { nDropLines = nNew; }
     207       28826 :     inline sal_uInt16 GetDropLeft() const { return nDropLeft; }
     208          60 :     inline sal_uInt16 GetDropHeight() const { return nDropHeight; }
     209          18 :     inline void SetDropHeight( const sal_uInt16 nNew ) { nDropHeight = nNew; }
     210          12 :     inline sal_uInt16 GetDropDescent() const { return nDropDescent; }
     211          18 :     inline void SetDropDescent( const sal_uInt16 nNew ) { nDropDescent = nNew; }
     212             :     void DropInit();
     213             : 
     214             :     // Returns the TextPos for start and end of the current line without whitespace
     215             :     // Implemented in frminf.cxx
     216             :     sal_Int32 GetTextStart() const;
     217             :     sal_Int32 GetTextEnd() const;
     218             : 
     219      532620 :     inline SwTextSizeInfo &GetInfo()
     220      532620 :         { return static_cast<SwTextSizeInfo&>(SwTextIter::GetInfo()); }
     221       59719 :     inline const SwTextSizeInfo &GetInfo() const
     222       59719 :         { return static_cast<const SwTextSizeInfo&>(SwTextIter::GetInfo()); }
     223             : 
     224             : };
     225             : 
     226      138248 : class SwTextAdjuster : public SwTextMargin
     227             : {
     228             :     // Adjusts the portion, if we have adjustment and FlyFrms
     229             :     void CalcFlyAdjust( SwLineLayout *pCurr );
     230             : 
     231             :     // Calls SplitGlues and CalcBlockAdjust
     232             :     void FormatBlock( );
     233             : 
     234             :     // Creates the glue chain for short lines
     235             :     SwMarginPortion* CalcRightMargin( SwLineLayout *pCurr, SwTwips nReal = 0 );
     236             : 
     237             :     // Calculate the adjustment (FlyPortions)
     238             :     SwFlyPortion *CalcFlyPortion( const long nRealWidth,
     239             :                                   const SwRect &rCurrRect );
     240             : 
     241             : protected:
     242      138248 :     explicit SwTextAdjuster(SwTextNode* pTextNode) : SwTextMargin(pTextNode) { }
     243             :     // Creates the Glues for adjusted paragraphs
     244             :     void CalcNewBlock( SwLineLayout *pCurr, const SwLinePortion *pStopAt,
     245             :         SwTwips nReal = 0, bool bSkipKashida = false );
     246             :     SwTwips CalcKanaAdj( SwLineLayout *pCurr );
     247             : public:
     248             :     inline SwTextAdjuster( SwTextFrm *pTextFrm, SwTextSizeInfo *pTextSizeInf ) : SwTextMargin(pTextFrm!=NULL?pTextFrm->GetTextNode():NULL)
     249             :            { CtorInitTextMargin( pTextFrm, pTextSizeInf ); }
     250             : 
     251             :     // Is overloaded by SwTextFormatter due to UpdatePos
     252             :     void CalcAdjLine( SwLineLayout *pCurr );
     253             : 
     254             :     // For adjusting afterwards
     255       90672 :     inline void GetAdjusted() const
     256             :     {
     257       90672 :         if( pCurr->IsFormatAdj() )
     258        1523 :             const_cast<SwTextAdjuster*>(this)->CalcAdjLine( pCurr );
     259       90672 :     }
     260             : 
     261             :     // Special treatment for DropCaps
     262             :     void CalcDropAdjust();
     263             :     void CalcDropRepaint();
     264             : };
     265             : 
     266      138248 : class SwTextCursor : public SwTextAdjuster
     267             : {
     268             :     // A small helper-class to save SwTextCursor member, manipulate them
     269             :     // and to restore them
     270             :     friend class SwTextCursorSave;
     271             : 
     272             :     // Ambiguities
     273             :     static bool bRightMargin;
     274             :     void _GetCharRect(SwRect *, const sal_Int32, SwCrsrMoveState* );
     275             : protected:
     276             :     void CtorInitTextCursor( SwTextFrm *pFrm, SwTextSizeInfo *pInf );
     277       69633 :     explicit SwTextCursor(SwTextNode* pTextNode) : SwTextAdjuster(pTextNode) { }
     278             : public:
     279       68615 :     SwTextCursor( SwTextFrm *pTextFrm, SwTextSizeInfo *pTextSizeInf )
     280       68615 :         : SwTextAdjuster(pTextFrm->GetTextNode())
     281             :     {
     282       68615 :         CtorInitTextCursor(pTextFrm, pTextSizeInf);
     283       68615 :     }
     284             :     bool GetCharRect(SwRect *, const sal_Int32, SwCrsrMoveState* = 0,
     285             :         const long nMax = 0 );
     286             :     bool GetEndCharRect(SwRect *, const sal_Int32, SwCrsrMoveState* = 0,
     287             :         const long nMax = 0 );
     288             :     sal_Int32 GetCrsrOfst( SwPosition *pPos, const Point &rPoint,
     289             :                 bool nChgNode, SwCrsrMoveState* = 0 ) const;
     290             :     // Respects ambiguities: For the implementation see below
     291             :     const SwLineLayout *CharCrsrToLine( const sal_Int32 nPos );
     292             : 
     293             :     // calculates baseline for portion rPor
     294             :     // bAutoToCentered indicates, if AUTOMATIC mode means CENTERED or BASELINE
     295             :     sal_uInt16 AdjustBaseLine( const SwLineLayout& rLine, const SwLinePortion* pPor,
     296             :                            sal_uInt16 nPorHeight = 0, sal_uInt16 nAscent = 0,
     297             :                            const bool bAutoToCentered = false ) const;
     298             : 
     299          10 :     static inline void SetRightMargin( const bool bNew ){ bRightMargin = bNew; }
     300         118 :     static inline bool IsRightMargin() { return bRightMargin; }
     301             : };
     302             : 
     303             : // Change current output device to printer, this has to be done before
     304             : // formatting.
     305             : class SwHookOut
     306             : {
     307             :     SwTextSizeInfo* pInf;
     308             :     VclPtr<OutputDevice> pOut;
     309             :     bool bOnWin;
     310             : public:
     311             :     explicit SwHookOut( SwTextSizeInfo& rInfo );
     312             :     ~SwHookOut();
     313             : };
     314             : 
     315      295074 : inline bool SwTextIter::SeekAndChg( SwTextSizeInfo &rInf )
     316             : {
     317      295074 :     return SeekAndChgAttrIter( rInf.GetIdx(), rInf.GetOut() );
     318             : }
     319             : 
     320         194 : inline bool SwTextIter::SeekAndChgBefore( SwTextSizeInfo &rInf )
     321             : {
     322         194 :     if ( rInf.GetIdx() )
     323           1 :         return SeekAndChgAttrIter( rInf.GetIdx()-1, rInf.GetOut() );
     324             :     else
     325         193 :         return SeekAndChgAttrIter( rInf.GetIdx(), rInf.GetOut() );
     326             : }
     327             : 
     328       12087 : inline bool SwTextIter::SeekStartAndChg( SwTextSizeInfo &rInf, const bool bPara )
     329             : {
     330       12087 :     return SeekStartAndChgAttrIter( rInf.GetOut(), bPara );
     331             : }
     332             : 
     333      412559 : inline SwTwips SwTextMargin::GetLeftMargin() const
     334             : {
     335      412559 :     return IsFirstTextLine() ? nFirst : Left();
     336             : }
     337             : 
     338      241665 : inline SwTwips SwTextMargin::Left() const
     339             : {
     340      241665 :     return (nDropLines >= nLineNr && 1 != nLineNr) ? nFirst + nDropLeft : nLeft;
     341             : }
     342             : 
     343             : #endif
     344             : 
     345             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11