LCOV - code coverage report
Current view: top level - sw/source/core/layout - pagedesc.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 180 238 75.6 %
Date: 2014-11-03 Functions: 30 36 83.3 %
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 <editeng/pbinitem.hxx>
      21             : #include <editeng/ulspitem.hxx>
      22             : #include <editeng/boxitem.hxx>
      23             : #include <editeng/brushitem.hxx>
      24             : #include <editeng/shaditem.hxx>
      25             : #include <editeng/frmdiritem.hxx>
      26             : #include <fmtclds.hxx>
      27             : #include <fmtfsize.hxx>
      28             : #include <pagefrm.hxx>
      29             : #include <pagedesc.hxx>
      30             : #include <swtable.hxx>
      31             : #include <frmtool.hxx>
      32             : #include <doc.hxx>
      33             : #include <poolfmt.hrc>
      34             : #include <IDocumentLayoutAccess.hxx>
      35             : #include <IDocumentStylePoolAccess.hxx>
      36             : #include <poolfmt.hxx>
      37             : #include <switerator.hxx>
      38             : 
      39             : using namespace ::com::sun::star;
      40             : 
      41        6612 : SwPageDesc::SwPageDesc( const OUString& rName, SwFrmFmt *pFmt, SwDoc *pDc ) :
      42             :     SwModify( 0 ),
      43             :     aDescName( rName ),
      44        6612 :     aMaster( pDc->GetAttrPool(), rName, pFmt ),
      45        6612 :     aLeft( pDc->GetAttrPool(), rName, pFmt ),
      46        6612 :     m_FirstMaster( pDc->GetAttrPool(), rName, pFmt ),
      47        6612 :     m_FirstLeft( pDc->GetAttrPool(), rName, pFmt ),
      48             :     aDepend( this, 0 ),
      49             :     pFollow( this ),
      50             :     nRegHeight( 0 ),
      51             :     nRegAscent( 0 ),
      52             :     eUse( (UseOnPage)(nsUseOnPage::PD_ALL | nsUseOnPage::PD_HEADERSHARE | nsUseOnPage::PD_FOOTERSHARE | nsUseOnPage::PD_FIRSTSHARE ) ),
      53             :     bLandscape( false ),
      54             :     bHidden( false ),
      55       33060 :     aFtnInfo()
      56             : {
      57        6612 : }
      58             : 
      59       11220 : SwPageDesc::SwPageDesc( const SwPageDesc &rCpy ) :
      60             :     SwModify( 0 ),
      61             :     aDescName( rCpy.GetName() ),
      62       11220 :     aNumType( rCpy.GetNumType() ),
      63       11220 :     aMaster( rCpy.GetMaster() ),
      64       11220 :     aLeft( rCpy.GetLeft() ),
      65       11220 :     m_FirstMaster( rCpy.GetFirstMaster() ),
      66       11220 :     m_FirstLeft( rCpy.GetFirstLeft() ),
      67       11220 :     aDepend( this, (SwModify*)rCpy.aDepend.GetRegisteredIn() ),
      68             :     pFollow( rCpy.pFollow ),
      69       11220 :     nRegHeight( rCpy.GetRegHeight() ),
      70       11220 :     nRegAscent( rCpy.GetRegAscent() ),
      71       11220 :     eUse( rCpy.ReadUseOn() ),
      72       11220 :     bLandscape( rCpy.GetLandscape() ),
      73       11220 :     bHidden( rCpy.IsHidden() ),
      74      134640 :     aFtnInfo( rCpy.GetFtnInfo() )
      75             : {
      76       11220 : }
      77             : 
      78         602 : SwPageDesc & SwPageDesc::operator = (const SwPageDesc & rSrc)
      79             : {
      80         602 :     aDescName = rSrc.aDescName;
      81         602 :     aNumType = rSrc.aNumType;
      82         602 :     aMaster = rSrc.aMaster;
      83         602 :     aLeft = rSrc.aLeft;
      84         602 :     m_FirstMaster = rSrc.m_FirstMaster;
      85         602 :     m_FirstLeft = rSrc.m_FirstLeft;
      86             : 
      87         602 :     if (rSrc.pFollow == &rSrc)
      88         574 :         pFollow = this;
      89             :     else
      90          28 :         pFollow = rSrc.pFollow;
      91             : 
      92         602 :     nRegHeight = rSrc.nRegHeight;
      93         602 :     nRegAscent = rSrc.nRegAscent;
      94         602 :     eUse = rSrc.eUse;
      95         602 :     bLandscape = rSrc.bLandscape;
      96         602 :     return *this;
      97             : }
      98             : 
      99       34948 : SwPageDesc::~SwPageDesc()
     100             : {
     101       34948 : }
     102             : 
     103             : /// Only the margin is mirrored.
     104             : /// Attributes like borders and so on are copied 1:1.
     105         130 : void SwPageDesc::Mirror()
     106             : {
     107             :     //Only the margins are mirrored, all other values are just copied.
     108         130 :     SvxLRSpaceItem aLR( RES_LR_SPACE );
     109         130 :     const SvxLRSpaceItem &rLR = aMaster.GetLRSpace();
     110         130 :     aLR.SetLeft(  rLR.GetRight() );
     111         130 :     aLR.SetRight( rLR.GetLeft() );
     112             : 
     113         130 :     SfxItemSet aSet( *aMaster.GetAttrSet().GetPool(),
     114         390 :                      aMaster.GetAttrSet().GetRanges() );
     115         130 :     aSet.Put( aLR );
     116         130 :     aSet.Put( aMaster.GetFrmSize() );
     117         130 :     aSet.Put( aMaster.GetPaperBin() );
     118         130 :     aSet.Put( aMaster.GetULSpace() );
     119         130 :     aSet.Put( aMaster.GetBox() );
     120         130 :     aSet.Put( aMaster.makeBackgroundBrushItem() );
     121         130 :     aSet.Put( aMaster.GetShadow() );
     122         130 :     aSet.Put( aMaster.GetCol() );
     123         130 :     aSet.Put( aMaster.GetFrmDir() );    // #112217#
     124         260 :     aLeft.SetFmtAttr( aSet );
     125         130 : }
     126             : 
     127         670 : void SwPageDesc::ResetAllAttr( bool bLeft )
     128             : {
     129         670 :     SwFrmFmt& rFmt = bLeft ? GetLeft() : GetMaster();
     130             : 
     131             :     // #i73790# - method renamed
     132         670 :     rFmt.ResetAllFmtAttr();
     133         670 :     rFmt.SetFmtAttr( SvxFrameDirectionItem(FRMDIR_HORI_LEFT_TOP, RES_FRAMEDIR) );
     134         670 : }
     135             : 
     136             : // gets information from Modify
     137         609 : bool SwPageDesc::GetInfo( SfxPoolItem & rInfo ) const
     138             : {
     139         609 :     if( !aMaster.GetInfo( rInfo ) )
     140           8 :         return false;       // found
     141         601 :     if ( !aLeft.GetInfo( rInfo ) )
     142           4 :         return false ;
     143         597 :     if ( !m_FirstMaster.GetInfo( rInfo ) )
     144          96 :         return false;
     145         501 :     return m_FirstLeft.GetInfo( rInfo );
     146             : }
     147             : 
     148             : /// set the style for the grid alignment
     149       22028 : void SwPageDesc::SetRegisterFmtColl( const SwTxtFmtColl* pFmt )
     150             : {
     151       22028 :     if( pFmt != GetRegisterFmtColl() )
     152             :     {
     153           0 :         if( pFmt )
     154           0 :             ((SwTxtFmtColl*)pFmt)->Add( &aDepend );
     155             :         else
     156           0 :             ((SwTxtFmtColl*)GetRegisterFmtColl())->Remove( &aDepend );
     157             : 
     158           0 :         RegisterChange();
     159             :     }
     160       22028 : }
     161             : 
     162             : /// retrieve the style for the grid alignment
     163       59852 : const SwTxtFmtColl* SwPageDesc::GetRegisterFmtColl() const
     164             : {
     165       59852 :     const SwModify* pReg = aDepend.GetRegisteredIn();
     166       59852 :     return (SwTxtFmtColl*)pReg;
     167             : }
     168             : 
     169             : /// notifie all affected page frames
     170           0 : void SwPageDesc::RegisterChange()
     171             : {
     172             :     // #117072# - During destruction of the document <SwDoc>
     173             :     // the page description is modified. Thus, do nothing, if the document
     174             :     // is in destruction respectively if no viewshell exists.
     175           0 :     SwDoc* pDoc = GetMaster().GetDoc();
     176           0 :     if ( !pDoc || pDoc->IsInDtor() )
     177             :     {
     178           0 :         return;
     179             :     }
     180           0 :     SwViewShell* pSh = pDoc->getIDocumentLayoutAccess().GetCurrentViewShell();
     181           0 :     if ( !pSh )
     182             :     {
     183           0 :         return;
     184             :     }
     185             : 
     186           0 :     nRegHeight = 0;
     187             :     {
     188           0 :         SwIterator<SwFrm,SwFmt> aIter( GetMaster() );
     189           0 :         for( SwFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() )
     190             :         {
     191           0 :             if( pLast->IsPageFrm() )
     192           0 :                 ((SwPageFrm*)pLast)->PrepareRegisterChg();
     193           0 :         }
     194             :     }
     195             :     {
     196           0 :         SwIterator<SwFrm,SwFmt> aIter( GetLeft() );
     197           0 :         for( SwFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() )
     198             :         {
     199           0 :             if( pLast->IsPageFrm() )
     200           0 :                 ((SwPageFrm*)pLast)->PrepareRegisterChg();
     201           0 :         }
     202             :     }
     203             :     {
     204           0 :         SwIterator<SwFrm,SwFmt> aIter( GetFirstMaster() );
     205           0 :         for( SwFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() )
     206             :         {
     207           0 :             if( pLast->IsPageFrm() )
     208           0 :                 ((SwPageFrm*)pLast)->PrepareRegisterChg();
     209           0 :         }
     210             :     }
     211             :     {
     212           0 :         SwIterator<SwFrm,SwFmt> aIter( GetFirstLeft() );
     213           0 :         for( SwFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() )
     214             :         {
     215           0 :             if( pLast->IsPageFrm() )
     216           0 :                 ((SwPageFrm*)pLast)->PrepareRegisterChg();
     217           0 :         }
     218             :     }
     219             : }
     220             : 
     221             : /// special handling if the style of the grid alignment changes
     222           0 : void SwPageDesc::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew )
     223             : {
     224           0 :     const sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
     225           0 :     NotifyClients( pOld, pNew );
     226             : 
     227           0 :     if ( (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich)
     228           0 :         || isCHRATR(nWhich) || (RES_PARATR_LINESPACING == nWhich) )
     229             :     {
     230           0 :         RegisterChange();
     231             :     }
     232           0 : }
     233             : 
     234         494 : static const SwFrm* lcl_GetFrmOfNode( const SwNode& rNd )
     235             : {
     236             :     SwModify* pMod;
     237         494 :     sal_uInt16 nFrmType = FRM_CNTNT;
     238             : 
     239         494 :     if( rNd.IsCntntNode() )
     240             :     {
     241         482 :         pMod = &(SwCntntNode&)rNd;
     242             :     }
     243          12 :     else if( rNd.IsTableNode() )
     244             :     {
     245          12 :         pMod = ((SwTableNode&)rNd).GetTable().GetFrmFmt();
     246          12 :         nFrmType = FRM_TAB;
     247             :     }
     248             :     else
     249           0 :         pMod = 0;
     250             : 
     251         494 :     Point aNullPt;
     252         494 :     return pMod ? ::GetFrmOfModify( 0, *pMod, nFrmType, &aNullPt, 0, false )
     253         988 :                 : 0;
     254             : }
     255             : 
     256         194 : const SwPageDesc* SwPageDesc::GetPageDescOfNode(const SwNode& rNd)
     257             : {
     258         194 :     const SwPageDesc* pRet = 0;
     259         194 :     const SwFrm* pChkFrm = lcl_GetFrmOfNode( rNd );
     260         194 :     if (pChkFrm && 0 != (pChkFrm = pChkFrm->FindPageFrm()))
     261         194 :         pRet = ((const SwPageFrm*)pChkFrm)->GetPageDesc();
     262         194 :     return pRet;
     263             : }
     264             : 
     265         218 : const SwFrmFmt* SwPageDesc::GetPageFmtOfNode( const SwNode& rNd,
     266             :                                               bool bCheckForThisPgDc ) const
     267             : {
     268             :     // which PageDescFormat is valid for this node?
     269             :     const SwFrmFmt* pRet;
     270         218 :     const SwFrm* pChkFrm = lcl_GetFrmOfNode( rNd );
     271             : 
     272         218 :     if( pChkFrm && 0 != ( pChkFrm = pChkFrm->FindPageFrm() ))
     273             :     {
     274             :         const SwPageDesc* pPd = bCheckForThisPgDc ? this :
     275          80 :                                 ((SwPageFrm*)pChkFrm)->GetPageDesc();
     276          80 :         pRet = &pPd->GetMaster();
     277             :         OSL_ENSURE( ((SwPageFrm*)pChkFrm)->GetPageDesc() == pPd, "Wrong node for detection of page format!" );
     278             :         // this page is assigned to which format?
     279          80 :         if( !pChkFrm->KnowsFormat(*pRet) )
     280             :         {
     281          78 :             pRet = &pPd->GetLeft();
     282             :             OSL_ENSURE( pChkFrm->KnowsFormat(*pRet), "Wrong node for detection of page format!" );
     283             :         }
     284             :     }
     285             :     else
     286         138 :         pRet = &GetMaster();
     287         218 :     return pRet;
     288             : }
     289             : 
     290          82 : bool SwPageDesc::IsFollowNextPageOfNode( const SwNode& rNd ) const
     291             : {
     292          82 :     bool bRet = false;
     293          82 :     if( GetFollow() && this != GetFollow() )
     294             :     {
     295          82 :         const SwFrm* pChkFrm = lcl_GetFrmOfNode( rNd );
     296         246 :         if( pChkFrm && 0 != ( pChkFrm = pChkFrm->FindPageFrm() ) &&
     297         326 :             pChkFrm->IsPageFrm() &&
     298         158 :             ( !pChkFrm->GetNext() || GetFollow() ==
     299          38 :                         ((SwPageFrm*)pChkFrm->GetNext())->GetPageDesc() ))
     300             :             // the page on which the follow points was found
     301          80 :             bRet = true;
     302             :     }
     303          82 :     return bRet;
     304             : }
     305             : 
     306        5794 : SwFrmFmt *SwPageDesc::GetLeftFmt(bool const bFirst)
     307             : {
     308        5794 :     return (nsUseOnPage::PD_LEFT & eUse)
     309             :             ? ((bFirst) ? &m_FirstLeft : &aLeft)
     310        5794 :             : 0;
     311             : }
     312             : 
     313       10054 : SwFrmFmt *SwPageDesc::GetRightFmt(bool const bFirst)
     314             : {
     315       10054 :     return (nsUseOnPage::PD_RIGHT & eUse)
     316             :             ? ((bFirst) ? &m_FirstMaster : &aMaster)
     317       10054 :             : 0;
     318             : }
     319             : 
     320      106764 : bool SwPageDesc::IsFirstShared() const
     321             : {
     322      106764 :     return (eUse & nsUseOnPage::PD_FIRSTSHARE) != 0;
     323             : }
     324             : 
     325       16616 : void SwPageDesc::ChgFirstShare( bool bNew )
     326             : {
     327       16616 :     if ( bNew )
     328       16400 :         eUse = (UseOnPage) (eUse | nsUseOnPage::PD_FIRSTSHARE);
     329             :     else
     330         216 :         eUse = (UseOnPage) (eUse & nsUseOnPage::PD_NOFIRSTSHARE);
     331       16616 : }
     332             : 
     333        4052 : SwPageDesc* SwPageDesc::GetByName(SwDoc& rDoc, const OUString& rName)
     334             : {
     335        4052 :     const sal_uInt16 nDCount = rDoc.GetPageDescCnt();
     336             : 
     337        6808 :     for( sal_uInt16 i = 0; i < nDCount; i++ )
     338             :     {
     339        6800 :         SwPageDesc* pDsc = &rDoc.GetPageDesc( i );
     340        6800 :         if(pDsc->GetName() == rName)
     341             :         {
     342        4044 :             return pDsc;
     343             :         }
     344             :     }
     345             : 
     346          32 :     for( sal_Int32 i = RC_POOLPAGEDESC_BEGIN; i <= STR_POOLPAGE_LANDSCAPE; ++i)
     347             :     {
     348          32 :         if (rName==SW_RESSTR(i))
     349             :         {
     350           8 :             return rDoc.getIDocumentStylePoolAccess().GetPageDescFromPool( static_cast< sal_uInt16 >(
     351           8 :                         i - RC_POOLPAGEDESC_BEGIN + RES_POOLPAGE_BEGIN) );
     352             :         }
     353             :     }
     354             : 
     355           0 :     return 0;
     356             : }
     357             : 
     358        6612 : SwPageFtnInfo::SwPageFtnInfo() :
     359             :     nMaxHeight( 0 ),
     360             :     nLineWidth(10),
     361             :     eLineStyle( table::BorderLineStyle::SOLID ),
     362             :     aWidth( 25, 100 ),
     363             :     nTopDist( 57 ),         //1mm
     364        6612 :     nBottomDist( 57 )
     365             : {
     366        6612 :     eAdj = FRMDIR_HORI_RIGHT_TOP == GetDefaultFrameDirection(GetAppLanguage()) ?
     367             :            FTNADJ_RIGHT :
     368        6612 :            FTNADJ_LEFT;
     369        6612 : }
     370             : 
     371      106138 : SwPageFtnInfo::SwPageFtnInfo( const SwPageFtnInfo &rCpy ) :
     372      106138 :     nMaxHeight( rCpy.GetHeight() ),
     373             :     nLineWidth(rCpy.nLineWidth),
     374             :     eLineStyle(rCpy.eLineStyle),
     375             :     aLineColor(rCpy.aLineColor),
     376      106138 :     aWidth( rCpy.GetWidth() ),
     377      106138 :     eAdj( rCpy.GetAdj() ),
     378      106138 :     nTopDist( rCpy.GetTopDist() ),
     379      424552 :     nBottomDist( rCpy.GetBottomDist() )
     380             : {
     381      106138 : }
     382             : 
     383       14664 : SwPageFtnInfo &SwPageFtnInfo::operator=( const SwPageFtnInfo& rCpy )
     384             : {
     385       14664 :     nMaxHeight  = rCpy.GetHeight();
     386       14664 :     nLineWidth  = rCpy.nLineWidth;
     387       14664 :     eLineStyle  = rCpy.eLineStyle;
     388       14664 :     aLineColor  = rCpy.aLineColor;
     389       14664 :     aWidth      = rCpy.GetWidth();
     390       14664 :     eAdj        = rCpy.GetAdj();
     391       14664 :     nTopDist    = rCpy.GetTopDist();
     392       14664 :     nBottomDist = rCpy.GetBottomDist();
     393       14664 :     return *this;
     394             : }
     395             : 
     396       31324 : bool SwPageFtnInfo::operator==( const SwPageFtnInfo& rCmp ) const
     397             : {
     398       62644 :     return ( nMaxHeight == rCmp.GetHeight() &&
     399       62624 :              nLineWidth == rCmp.nLineWidth &&
     400       62608 :              eLineStyle == rCmp.eLineStyle &&
     401       62608 :              aLineColor == rCmp.aLineColor &&
     402       54684 :              aWidth     == rCmp.GetWidth() &&
     403       46756 :              eAdj       == rCmp.GetAdj() &&
     404       78064 :              nTopDist   == rCmp.GetTopDist() &&
     405       54688 :              nBottomDist== rCmp.GetBottomDist() );
     406             : }
     407             : 
     408         602 : SwPageDescExt::SwPageDescExt(const SwPageDesc & rPageDesc, SwDoc * _pDoc)
     409         602 :     : aPageDesc(rPageDesc), pDoc(_pDoc)
     410             : {
     411         602 :     SetPageDesc(rPageDesc);
     412         602 : }
     413             : 
     414           0 : SwPageDescExt::SwPageDescExt(const SwPageDescExt & rSrc)
     415           0 :     : aPageDesc(rSrc.aPageDesc), pDoc(rSrc.pDoc)
     416             : {
     417           0 :     SetPageDesc(rSrc.aPageDesc);
     418           0 : }
     419             : 
     420         602 : SwPageDescExt::~SwPageDescExt()
     421             : {
     422         602 : }
     423             : 
     424         960 : OUString SwPageDescExt::GetName() const
     425             : {
     426         960 :     return aPageDesc.GetName();
     427             : }
     428             : 
     429         602 : void SwPageDescExt::SetPageDesc(const SwPageDesc & _aPageDesc)
     430             : {
     431         602 :     aPageDesc = _aPageDesc;
     432             : 
     433         602 :     if (aPageDesc.GetFollow())
     434         602 :         sFollow = aPageDesc.GetFollow()->GetName();
     435         602 : }
     436             : 
     437           0 : SwPageDescExt & SwPageDescExt::operator = (const SwPageDesc & rSrc)
     438             : {
     439           0 :     SetPageDesc(rSrc);
     440             : 
     441           0 :     return *this;
     442             : }
     443             : 
     444           0 : SwPageDescExt & SwPageDescExt::operator = (const SwPageDescExt & rSrc)
     445             : {
     446           0 :     SetPageDesc(rSrc.aPageDesc);
     447             : 
     448           0 :     return *this;
     449             : }
     450             : 
     451           0 : SwPageDescExt::operator SwPageDesc() const
     452             : {
     453           0 :     SwPageDesc aResult(aPageDesc);
     454             : 
     455           0 :     SwPageDesc * pPageDesc = pDoc->GetPageDesc(sFollow);
     456             : 
     457           0 :     if ( 0 != pPageDesc )
     458           0 :         aResult.SetFollow(pPageDesc);
     459             : 
     460           0 :     return aResult;
     461             : }
     462             : 
     463       10090 : SwPageDescs::~SwPageDescs()
     464             : {
     465        5045 :     for(const_iterator it = begin(); it != end(); ++it)
     466           0 :         delete *it;
     467        5315 : }
     468             : 
     469             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10