LCOV - code coverage report
Current view: top level - sw/source/core/text - porrst.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 167 296 56.4 %
Date: 2015-06-13 12:38:46 Functions: 18 27 66.7 %
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             : 
      20             : #include <hintids.hxx>
      21             : #include <sfx2/printer.hxx>
      22             : #include <editeng/lspcitem.hxx>
      23             : #include <editeng/adjustitem.hxx>
      24             : #include <editeng/escapementitem.hxx>
      25             : #include <editeng/lrspitem.hxx>
      26             : #include <editeng/pgrditem.hxx>
      27             : #include <vcl/window.hxx>
      28             : #include <vcl/svapp.hxx>
      29             : #include <viewsh.hxx>
      30             : #include <viewopt.hxx>
      31             : #include <ndtxt.hxx>
      32             : #include <pagefrm.hxx>
      33             : #include <paratr.hxx>
      34             : #include <SwPortionHandler.hxx>
      35             : #include <porrst.hxx>
      36             : #include <inftxt.hxx>
      37             : #include <txtpaint.hxx>
      38             : #include <swfntcch.hxx>
      39             : #include <tgrditem.hxx>
      40             : #include <pagedesc.hxx>
      41             : #include <frmatr.hxx>
      42             : #include <redlnitr.hxx>
      43             : #include <porfly.hxx>
      44             : #include <atrhndl.hxx>
      45             : #include "rootfrm.hxx"
      46             : 
      47             : #include <IDocumentRedlineAccess.hxx>
      48             : #include <IDocumentSettingAccess.hxx>
      49             : #include <IDocumentDeviceAccess.hxx>
      50             : 
      51             : #include <crsrsh.hxx>
      52             : 
      53           0 : SwTmpEndPortion::SwTmpEndPortion( const SwLinePortion &rPortion )
      54             : {
      55           0 :     Height( rPortion.Height() );
      56           0 :     SetAscent( rPortion.GetAscent() );
      57           0 :     SetWhichPor( POR_TMPEND );
      58           0 : }
      59             : 
      60           0 : void SwTmpEndPortion::Paint( const SwTextPaintInfo &rInf ) const
      61             : {
      62           0 :     if (rInf.OnWin() && rInf.GetOpt().IsParagraph())
      63             :     {
      64           0 :         const SwFont* pOldFnt = rInf.GetFont();
      65             : 
      66           0 :         SwFont aFont(*pOldFnt);
      67           0 :         aFont.SetColor(NON_PRINTING_CHARACTER_COLOR);
      68           0 :         const_cast<SwTextPaintInfo&>(rInf).SetFont(&aFont);
      69             : 
      70             :         // draw the pilcrow
      71           0 :         rInf.DrawText(OUString(CH_PAR), *this);
      72             : 
      73           0 :         const_cast<SwTextPaintInfo&>(rInf).SetFont(const_cast<SwFont*>(pOldFnt));
      74             :     }
      75           0 : }
      76             : 
      77         557 : SwBreakPortion::SwBreakPortion( const SwLinePortion &rPortion )
      78         557 :     : SwLinePortion( rPortion )
      79             : {
      80         557 :     nLineLength = 1;
      81         557 :     SetWhichPor( POR_BRK );
      82         557 : }
      83             : 
      84           0 : sal_Int32 SwBreakPortion::GetCrsrOfst( const sal_uInt16 ) const
      85           0 : { return 0; }
      86             : 
      87        1203 : sal_uInt16 SwBreakPortion::GetViewWidth( const SwTextSizeInfo & ) const
      88        1203 : { return 0; }
      89             : 
      90         462 : SwLinePortion *SwBreakPortion::Compress()
      91         462 : { return (GetPortion() && GetPortion()->InTextGrp() ? 0 : this); }
      92             : 
      93         618 : void SwBreakPortion::Paint( const SwTextPaintInfo &rInf ) const
      94             : {
      95         618 :     if( rInf.OnWin() && rInf.GetOpt().IsLineBreak() )
      96           0 :         rInf.DrawLineBreak( *this );
      97         618 : }
      98             : 
      99         557 : bool SwBreakPortion::Format( SwTextFormatInfo &rInf )
     100             : {
     101         557 :     const SwLinePortion *pRoot = rInf.GetRoot();
     102         557 :     Width( 0 );
     103         557 :     Height( pRoot->Height() );
     104         557 :     SetAscent( pRoot->GetAscent() );
     105         557 :     if ( rInf.GetIdx()+1 == rInf.GetText().getLength() )
     106         297 :         rInf.SetNewLine( true );
     107         557 :     return true;
     108             : }
     109             : 
     110           1 : void SwBreakPortion::HandlePortion( SwPortionHandler& rPH ) const
     111             : {
     112           1 :     rPH.Text( GetLen(), GetWhichPor() );
     113           1 : }
     114             : 
     115         324 : SwKernPortion::SwKernPortion( SwLinePortion &rPortion, short nKrn,
     116             :                               bool bBG, bool bGK ) :
     117         324 :     nKern( nKrn ), bBackground( bBG ), bGridKern( bGK )
     118             : {
     119         324 :     Height( rPortion.Height() );
     120         324 :     SetAscent( rPortion.GetAscent() );
     121         324 :     nLineLength = 0;
     122         324 :     SetWhichPor( POR_KERN );
     123         324 :     if( nKern > 0 )
     124         308 :         Width( nKern );
     125         324 :      rPortion.Insert( this );
     126         324 : }
     127             : 
     128         109 : SwKernPortion::SwKernPortion( const SwLinePortion& rPortion ) :
     129         109 :     nKern( 0 ), bBackground( false ), bGridKern( true )
     130             : {
     131         109 :     Height( rPortion.Height() );
     132         109 :     SetAscent( rPortion.GetAscent() );
     133             : 
     134         109 :     nLineLength = 0;
     135         109 :     SetWhichPor( POR_KERN );
     136         109 : }
     137             : 
     138           5 : void SwKernPortion::Paint( const SwTextPaintInfo &rInf ) const
     139             : {
     140           5 :     if( Width() )
     141             :     {
     142             :         // bBackground is set for Kerning Portions between two fields
     143           5 :         if ( bBackground )
     144           0 :             rInf.DrawViewOpt( *this, POR_FLD );
     145             : 
     146           5 :         rInf.DrawBackBrush( *this );
     147             : 
     148             :         // do we have to repaint a post it portion?
     149           5 :         if( rInf.OnWin() && pPortion && !pPortion->Width() )
     150           0 :             pPortion->PrePaint( rInf, this );
     151             : 
     152           5 :         if( rInf.GetFont()->IsPaintBlank() )
     153             :         {
     154           1 :             OUString aTextDouble("  ");
     155             : 
     156           1 :             SwRect aClipRect;
     157           1 :             rInf.CalcRect( *this, &aClipRect, 0 );
     158           2 :             SwSaveClip aClip( const_cast<OutputDevice*>(rInf.GetOut()) );
     159           1 :             aClip.ChgClip( aClipRect, 0 );
     160           2 :             rInf.DrawText( aTextDouble, *this, 0, 2, true );
     161             :         }
     162             :     }
     163           5 : }
     164             : 
     165         261 : void SwKernPortion::FormatEOL( SwTextFormatInfo &rInf )
     166             : {
     167         261 :     if ( bGridKern )
     168         300 :         return;
     169             : 
     170         222 :     if( rInf.GetLast() == this )
     171         222 :         rInf.SetLast( FindPrevPortion( rInf.GetRoot() ) );
     172         222 :     if( nKern < 0 )
     173           8 :         Width( -nKern );
     174             :     else
     175         214 :         Width( 0 );
     176         222 :     rInf.GetLast()->FormatEOL( rInf );
     177             : }
     178             : 
     179           0 : SwArrowPortion::SwArrowPortion( const SwLinePortion &rPortion ) :
     180           0 :     bLeft( true )
     181             : {
     182           0 :     Height( rPortion.Height() );
     183           0 :     SetAscent( rPortion.GetAscent() );
     184           0 :     nLineLength = 0;
     185           0 :     SetWhichPor( POR_ARROW );
     186           0 : }
     187             : 
     188           6 : SwArrowPortion::SwArrowPortion( const SwTextPaintInfo &rInf )
     189           6 :     : bLeft( false )
     190             : {
     191           6 :     Height( (sal_uInt16)(rInf.GetTextFrm()->Prt().Height()) );
     192          12 :     aPos.X() = rInf.GetTextFrm()->Frm().Left() +
     193          12 :                rInf.GetTextFrm()->Prt().Right();
     194          12 :     aPos.Y() = rInf.GetTextFrm()->Frm().Top() +
     195          12 :                rInf.GetTextFrm()->Prt().Bottom();
     196           6 :     SetWhichPor( POR_ARROW );
     197           6 : }
     198             : 
     199           0 : void SwArrowPortion::Paint( const SwTextPaintInfo &rInf ) const
     200             : {
     201           0 :     const_cast<SwArrowPortion*>(this)->aPos = rInf.GetPos();
     202           0 : }
     203             : 
     204           0 : SwLinePortion *SwArrowPortion::Compress() { return this; }
     205             : 
     206       74089 : SwTwips SwTextFrm::EmptyHeight() const
     207             : {
     208       74089 :     if (IsCollapse()) {
     209         225 :         SwViewShell *pSh = getRootFrm()->GetCurrShell();
     210         225 :         if ( pSh->IsA( TYPE(SwCrsrShell) ) ) {
     211         216 :             SwCrsrShell *pCrSh = static_cast<SwCrsrShell*>(pSh);
     212         216 :             SwContentFrm *pCurrFrm=pCrSh->GetCurrFrm();
     213         216 :             if (pCurrFrm==static_cast<SwContentFrm const *>(this)) {
     214             :                 // do nothing
     215             :             } else {
     216         216 :                 return 1;
     217             :             }
     218             :         } else {
     219           9 :             return 1;
     220             :         }
     221             :     }
     222             :     OSL_ENSURE( ! IsVertical() || ! IsSwapped(),"SwTextFrm::EmptyHeight with swapped frame" );
     223             : 
     224             :     SwFont *pFnt;
     225       73864 :     const SwTextNode& rTextNode = *GetTextNode();
     226       73864 :     const IDocumentSettingAccess* pIDSA = rTextNode.getIDocumentSettingAccess();
     227       73864 :     SwViewShell *pSh = getRootFrm()->GetCurrShell();
     228       73864 :     if ( rTextNode.HasSwAttrSet() )
     229             :     {
     230       42531 :         const SwAttrSet *pAttrSet = &( rTextNode.GetSwAttrSet() );
     231       42531 :         pFnt = new SwFont( pAttrSet, pIDSA );
     232             :     }
     233             :     else
     234             :     {
     235       31333 :         SwFontAccess aFontAccess( &rTextNode.GetAnyFormatColl(), pSh);
     236       31333 :         pFnt = new SwFont( aFontAccess.Get()->GetFont() );
     237       31333 :         pFnt->ChkMagic( pSh, pFnt->GetActual() );
     238             :     }
     239             : 
     240       73864 :     if ( IsVertical() )
     241           5 :         pFnt->SetVertical( 2700 );
     242             : 
     243       73864 :     OutputDevice* pOut = pSh ? pSh->GetOut() : 0;
     244       74013 :     if ( !pOut || !pSh->GetViewOptions()->getBrowseMode() ||
     245         149 :          pSh->GetViewOptions()->IsPrtFormat() )
     246             :     {
     247       73715 :         pOut = rTextNode.getIDocumentDeviceAccess()->getReferenceDevice(true);
     248             :     }
     249             : 
     250       73864 :     const IDocumentRedlineAccess* pIDRA = rTextNode.getIDocumentRedlineAccess();
     251       73864 :     if( IDocumentRedlineAccess::IsShowChanges( pIDRA->GetRedlineMode() ) )
     252             :     {
     253       73515 :         const sal_uInt16 nRedlPos = pIDRA->GetRedlinePos( rTextNode, USHRT_MAX );
     254       73515 :         if( USHRT_MAX != nRedlPos )
     255             :         {
     256         281 :             SwAttrHandler aAttrHandler;
     257         281 :             aAttrHandler.Init(  GetTextNode()->GetSwAttrSet(),
     258         562 :                                *GetTextNode()->getIDocumentSettingAccess(), NULL );
     259             :             SwRedlineItr aRedln( rTextNode, *pFnt, aAttrHandler,
     260         281 :                                  nRedlPos, true );
     261             :         }
     262             :     }
     263             : 
     264             :     SwTwips nRet;
     265       73864 :     if( !pOut )
     266           0 :         nRet = IsVertical() ?
     267           0 :                Prt().SSize().Width() + 1 :
     268           0 :                Prt().SSize().Height() + 1;
     269             :     else
     270             :     {
     271       73864 :         pFnt->SetFntChg( true );
     272       73864 :         pFnt->ChgPhysFnt( pSh, *pOut );
     273       73864 :         nRet = pFnt->GetHeight( pSh, *pOut );
     274             :     }
     275       73864 :     delete pFnt;
     276       73864 :     return nRet;
     277             : }
     278             : 
     279       29045 : bool SwTextFrm::FormatEmpty()
     280             : {
     281             :     OSL_ENSURE( ! IsVertical() || ! IsSwapped(),"SwTextFrm::FormatEmpty with swapped frame" );
     282             : 
     283       29045 :     bool bCollapse = EmptyHeight( ) == 1 && this->IsCollapse( );
     284             : 
     285      114405 :     if ( HasFollow() || GetTextNode()->GetpSwpHints() ||
     286       53975 :         0 != GetTextNode()->GetNumRule() ||
     287       53305 :         GetTextNode()->HasHiddenCharAttribute( true ) ||
     288       82109 :          IsInFootnote() || ( HasPara() && GetPara()->IsPrepMustFit() ) )
     289        2613 :         return false;
     290       26432 :     const SwAttrSet& aSet = GetTextNode()->GetSwAttrSet();
     291       26432 :     const SvxAdjust nAdjust = aSet.GetAdjust().GetAdjust();
     292       52789 :     if( !bCollapse && ( ( ( ! IsRightToLeft() && ( SVX_ADJUST_LEFT != nAdjust ) ) ||
     293       44868 :           (   IsRightToLeft() && ( SVX_ADJUST_RIGHT != nAdjust ) ) ) ||
     294       22422 :           aSet.GetRegister().GetValue() ) )
     295        3935 :         return false;
     296       22497 :     const SvxLineSpacingItem &rSpacing = aSet.GetLineSpacing();
     297       45750 :     if( !bCollapse && ( SVX_LINE_SPACE_MIN == rSpacing.GetLineSpaceRule() ||
     298       43621 :         SVX_LINE_SPACE_FIX == rSpacing.GetLineSpaceRule() ||
     299       21395 :         aSet.GetLRSpace().IsAutoFirst() ) )
     300        1027 :         return false;
     301             : 
     302       21470 :     SwTextFly aTextFly( this );
     303       21470 :     SwRect aRect;
     304       21470 :     bool bFirstFlyCheck = 0 != Prt().Height();
     305       74148 :     if ( !bCollapse && bFirstFlyCheck &&
     306       35363 :             aTextFly.IsOn() && aTextFly.IsAnyObj( aRect ) )
     307        3093 :         return false;
     308             : 
     309       18377 :     SwTwips nHeight = EmptyHeight();
     310             : 
     311       36439 :     if ( GetTextNode()->GetSwAttrSet().GetParaGrid().GetValue() &&
     312       18062 :             IsInDocBody() )
     313             :     {
     314       13583 :         SwTextGridItem const*const pGrid(GetGridItem(FindPageFrm()));
     315       13583 :         if ( pGrid )
     316           4 :             nHeight = pGrid->GetBaseHeight() + pGrid->GetRubyHeight();
     317             :     }
     318             : 
     319       18377 :     SWRECTFN( this )
     320       18377 :     const SwTwips nChg = nHeight - (Prt().*fnRect->fnGetHeight)();
     321             : 
     322       18377 :     if( !nChg )
     323        5997 :         SetUndersized( false );
     324       18377 :     AdjustFrm( nChg );
     325             : 
     326       18377 :     if( HasBlinkPor() )
     327             :     {
     328           0 :         ClearPara();
     329           0 :         ResetBlinkPor();
     330             :     }
     331       18377 :     SetCacheIdx( USHRT_MAX );
     332       18377 :     if( !IsEmpty() )
     333             :     {
     334       11322 :         SetEmpty( true );
     335       11322 :         SetCompletePaint();
     336             :     }
     337       66638 :     if( !bCollapse && !bFirstFlyCheck &&
     338       33801 :             aTextFly.IsOn() && aTextFly.IsAnyObj( aRect ) )
     339        1742 :         return false;
     340             : 
     341             :     // #i35635# - call method <HideAndShowObjects()>
     342             :     // to assure that objects anchored at the empty paragraph are
     343             :     // correctly visible resp. invisible.
     344       16635 :     HideAndShowObjects();
     345       16635 :     return true;
     346             : }
     347             : 
     348           0 : bool SwTextFrm::FillRegister( SwTwips& rRegStart, sal_uInt16& rRegDiff )
     349             : {
     350           0 :     const SwFrm *pFrm = this;
     351           0 :     rRegDiff = 0;
     352           0 :     while( !( ( FRM_BODY | FRM_FLY )
     353           0 :            & pFrm->GetType() ) && pFrm->GetUpper() )
     354           0 :         pFrm = pFrm->GetUpper();
     355           0 :     if( ( FRM_BODY| FRM_FLY ) & pFrm->GetType() )
     356             :     {
     357           0 :         SWRECTFN( pFrm )
     358           0 :         rRegStart = (pFrm->*fnRect->fnGetPrtTop)();
     359           0 :         pFrm = pFrm->FindPageFrm();
     360           0 :         if( pFrm->IsPageFrm() )
     361             :         {
     362           0 :             SwPageDesc* pDesc = const_cast<SwPageFrm*>(static_cast<const SwPageFrm*>(pFrm))->FindPageDesc();
     363           0 :             if( pDesc )
     364             :             {
     365           0 :                 rRegDiff = pDesc->GetRegHeight();
     366           0 :                 if( !rRegDiff )
     367             :                 {
     368           0 :                     const SwTextFormatColl *pFormat = pDesc->GetRegisterFormatColl();
     369           0 :                     if( pFormat )
     370             :                     {
     371           0 :                         const SvxLineSpacingItem &rSpace = pFormat->GetLineSpacing();
     372           0 :                         if( SVX_LINE_SPACE_FIX == rSpace.GetLineSpaceRule() )
     373             :                         {
     374           0 :                             rRegDiff = rSpace.GetLineHeight();
     375           0 :                             pDesc->SetRegHeight( rRegDiff );
     376           0 :                             pDesc->SetRegAscent( ( 4 * rRegDiff ) / 5 );
     377             :                         }
     378             :                         else
     379             :                         {
     380           0 :                             SwViewShell *pSh = getRootFrm()->GetCurrShell();
     381           0 :                             SwFontAccess aFontAccess( pFormat, pSh );
     382           0 :                             SwFont aFnt( aFontAccess.Get()->GetFont() );
     383             : 
     384           0 :                             OutputDevice *pOut = 0;
     385           0 :                             if( !pSh || !pSh->GetViewOptions()->getBrowseMode() ||
     386           0 :                                 pSh->GetViewOptions()->IsPrtFormat() )
     387           0 :                                 pOut = GetTextNode()->getIDocumentDeviceAccess()->getReferenceDevice( true );
     388             : 
     389           0 :                             if( pSh && !pOut )
     390           0 :                                 pOut = pSh->GetWin();
     391             : 
     392           0 :                             if( !pOut )
     393           0 :                                 pOut = Application::GetDefaultDevice();
     394             : 
     395           0 :                             MapMode aOldMap( pOut->GetMapMode() );
     396           0 :                             pOut->SetMapMode( MapMode( MAP_TWIP ) );
     397             : 
     398           0 :                             aFnt.ChgFnt( pSh, *pOut );
     399           0 :                             rRegDiff = aFnt.GetHeight( pSh, *pOut );
     400           0 :                             sal_uInt16 nNetHeight = rRegDiff;
     401             : 
     402           0 :                             switch( rSpace.GetLineSpaceRule() )
     403             :                             {
     404             :                                 case SVX_LINE_SPACE_AUTO:
     405           0 :                                 break;
     406             :                                 case SVX_LINE_SPACE_MIN:
     407             :                                 {
     408           0 :                                     if( rRegDiff < rSpace.GetLineHeight() )
     409           0 :                                         rRegDiff = rSpace.GetLineHeight();
     410           0 :                                     break;
     411             :                                 }
     412             :                                 default:
     413             :                                     OSL_FAIL( ": unknown LineSpaceRule" );
     414             :                             }
     415           0 :                             switch( rSpace.GetInterLineSpaceRule() )
     416             :                             {
     417             :                                 case SVX_INTER_LINE_SPACE_OFF:
     418           0 :                                 break;
     419             :                                 case SVX_INTER_LINE_SPACE_PROP:
     420             :                                 {
     421           0 :                                     long nTmp = rSpace.GetPropLineSpace();
     422           0 :                                     if( nTmp < 50 )
     423           0 :                                         nTmp = nTmp ? 50 : 100;
     424           0 :                                     nTmp *= rRegDiff;
     425           0 :                                     nTmp /= 100;
     426           0 :                                     if( !nTmp )
     427           0 :                                         ++nTmp;
     428           0 :                                     rRegDiff = (sal_uInt16)nTmp;
     429           0 :                                     nNetHeight = rRegDiff;
     430           0 :                                     break;
     431             :                                 }
     432             :                                 case SVX_INTER_LINE_SPACE_FIX:
     433             :                                 {
     434           0 :                                     rRegDiff = rRegDiff + rSpace.GetInterLineSpace();
     435           0 :                                     nNetHeight = rRegDiff;
     436           0 :                                     break;
     437             :                                 }
     438             :                                 default: OSL_FAIL( ": unknown InterLineSpaceRule" );
     439             :                             }
     440           0 :                             pDesc->SetRegHeight( rRegDiff );
     441             :                             pDesc->SetRegAscent( rRegDiff - nNetHeight +
     442           0 :                                                  aFnt.GetAscent( pSh, *pOut ) );
     443           0 :                             pOut->SetMapMode( aOldMap );
     444             :                         }
     445             :                     }
     446             :                 }
     447           0 :                 const long nTmpDiff = pDesc->GetRegAscent() - rRegDiff;
     448           0 :                 if ( bVert )
     449           0 :                     rRegStart -= nTmpDiff;
     450             :                 else
     451           0 :                     rRegStart += nTmpDiff;
     452             :             }
     453             :         }
     454             :     }
     455           0 :     return ( 0 != rRegDiff );
     456             : }
     457             : 
     458           2 : void SwHiddenTextPortion::Paint( const SwTextPaintInfo & rInf) const
     459             : {
     460             :     (void)rInf;
     461             : #ifdef DBG_UTIL
     462             :     OutputDevice* pOut = const_cast<OutputDevice*>(rInf.GetOut());
     463             :     Color aCol( SwViewOption::GetFieldShadingsColor() );
     464             :     Color aOldColor( pOut->GetFillColor() );
     465             :     pOut->SetFillColor( aCol );
     466             :     Point aPos( rInf.GetPos() );
     467             :     aPos.Y() -= 150;
     468             :     aPos.X() -= 25;
     469             :     SwRect aRect( aPos, Size( 100, 200 ) );
     470             :     static_cast<OutputDevice*>(pOut)->DrawRect( aRect.SVRect() );
     471             :     pOut->SetFillColor( aOldColor );
     472             : #endif
     473           2 : }
     474             : 
     475           4 : bool SwHiddenTextPortion::Format( SwTextFormatInfo &rInf )
     476             : {
     477           4 :     Width( 0 );
     478           4 :     rInf.GetTextFrm()->HideFootnotes( rInf.GetIdx(), rInf.GetIdx() + GetLen() );
     479             : 
     480           4 :     return false;
     481             : };
     482             : 
     483           0 : void SwControlCharPortion::Paint( const SwTextPaintInfo &rInf ) const
     484             : {
     485           0 :     if ( Width() )  // is only set during prepaint mode
     486             :     {
     487           0 :         rInf.DrawViewOpt( *this, POR_CONTROLCHAR );
     488             : 
     489           0 :         if ( !rInf.GetOpt().IsPagePreview() &&
     490           0 :              !rInf.GetOpt().IsReadonly() &&
     491           0 :               SwViewOption::IsFieldShadings() &&
     492           0 :               CHAR_ZWNBSP != mcChar )
     493             :         {
     494           0 :             SwFont aTmpFont( *rInf.GetFont() );
     495           0 :             aTmpFont.SetEscapement( CHAR_ZWSP == mcChar ? DFLT_ESC_AUTO_SUB : -25 );
     496           0 :             const sal_uInt16 nProp = 40;
     497           0 :             aTmpFont.SetProportion( nProp );  // a smaller font
     498           0 :             SwFontSave aFontSave( rInf, &aTmpFont );
     499             : 
     500           0 :             OUString aOutString;
     501             : 
     502           0 :             switch ( mcChar )
     503             :             {
     504             :                 case CHAR_ZWSP :
     505           0 :                     aOutString = "/"; break;
     506             : //                case CHAR_LRM :
     507             : //                    rText = sal_Unicode(0x2514); break;
     508             : //                case CHAR_RLM :
     509             : //                    rText = sal_Unicode(0x2518); break;
     510             :             }
     511             : 
     512           0 :             if ( !mnHalfCharWidth )
     513           0 :                 mnHalfCharWidth = rInf.GetTextSize( aOutString ).Width() / 2;
     514             : 
     515           0 :             Point aOldPos = rInf.GetPos();
     516           0 :             Point aNewPos( aOldPos );
     517           0 :             aNewPos.X() = aNewPos.X() + ( Width() / 2 ) - mnHalfCharWidth;
     518           0 :             const_cast< SwTextPaintInfo& >( rInf ).SetPos( aNewPos );
     519             : 
     520           0 :             rInf.DrawText( aOutString, *this );
     521             : 
     522           0 :             const_cast< SwTextPaintInfo& >( rInf ).SetPos( aOldPos );
     523             :         }
     524             :     }
     525           0 : }
     526             : 
     527         280 : bool SwControlCharPortion::Format( SwTextFormatInfo &rInf )
     528             : {
     529         280 :     const SwLinePortion* pRoot = rInf.GetRoot();
     530         280 :     Width( 0 );
     531         280 :     Height( pRoot->Height() );
     532         280 :     SetAscent( pRoot->GetAscent() );
     533             : 
     534         280 :     return false;
     535             : }
     536             : 
     537           0 : sal_uInt16 SwControlCharPortion::GetViewWidth( const SwTextSizeInfo& rInf ) const
     538             : {
     539           0 :     if( !mnViewWidth )
     540           0 :         mnViewWidth = rInf.GetTextSize(OUString(' ')).Width();
     541             : 
     542           0 :     return mnViewWidth;
     543         177 : }
     544             : 
     545             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11