diff options
Diffstat (limited to 'sw/source/core/layout/pagedesc.cxx')
-rw-r--r-- | sw/source/core/layout/pagedesc.cxx | 512 |
1 files changed, 512 insertions, 0 deletions
diff --git a/sw/source/core/layout/pagedesc.cxx b/sw/source/core/layout/pagedesc.cxx new file mode 100644 index 000000000000..b838c8163837 --- /dev/null +++ b/sw/source/core/layout/pagedesc.cxx @@ -0,0 +1,512 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" + + + +#include <hintids.hxx> +#include <editeng/pbinitem.hxx> +#include <editeng/ulspitem.hxx> +#include <editeng/boxitem.hxx> +#include <editeng/brshitem.hxx> +#include <editeng/shaditem.hxx> +#include <editeng/lrspitem.hxx> +#include "editeng/frmdiritem.hxx" +#include <fmtclds.hxx> +#include <fmtfsize.hxx> +#include <frmatr.hxx> +#include <pagefrm.hxx> +#include <pagedesc.hxx> +#include <frmfmt.hxx> +#include <fmtcol.hxx> // SwTxtFmtColl +#include <node.hxx> +#include <swtable.hxx> +#include <frmtool.hxx> +#include <doc.hxx> // fuer GetAttrPool +#include <poolfmt.hxx> + +/************************************************************************* +|* +|* SwPageDesc::SwPageDesc() +|* +|* Ersterstellung MA 25. Jan. 93 +|* Letzte Aenderung MA 16. Feb. 94 +|* +|*************************************************************************/ + + + +SwPageDesc::SwPageDesc( const String& rName, SwFrmFmt *pFmt, SwDoc *pDc ) : + SwModify( 0 ), + aDescName( rName ), + aMaster( pDc->GetAttrPool(), rName, pFmt ), + aLeft( pDc->GetAttrPool(), rName, pFmt ), + aDepend( this, 0 ), + pFollow( this ), + nRegHeight( 0 ), + nRegAscent( 0 ), + eUse( (UseOnPage)(nsUseOnPage::PD_ALL | nsUseOnPage::PD_HEADERSHARE | nsUseOnPage::PD_FOOTERSHARE) ), + bLandscape( FALSE ), + aFtnInfo() +{ +} + +SwPageDesc::SwPageDesc( const SwPageDesc &rCpy ) : + SwModify( 0 ), + aDescName( rCpy.GetName() ), + aNumType( rCpy.GetNumType() ), + aMaster( rCpy.GetMaster() ), + aLeft( rCpy.GetLeft() ), + aDepend( this, (SwModify*)rCpy.aDepend.GetRegisteredIn() ), + pFollow( rCpy.pFollow ), + nRegHeight( rCpy.GetRegHeight() ), + nRegAscent( rCpy.GetRegAscent() ), + eUse( rCpy.ReadUseOn() ), + bLandscape( rCpy.GetLandscape() ), + aFtnInfo( rCpy.GetFtnInfo() ) +{ +} + +SwPageDesc & SwPageDesc::operator = (const SwPageDesc & rSrc) +{ + aDescName = rSrc.aDescName; + aNumType = rSrc.aNumType; + aMaster = rSrc.aMaster; + aLeft = rSrc.aLeft; + + if (rSrc.pFollow == &rSrc) + pFollow = this; + else + pFollow = rSrc.pFollow; + + nRegHeight = rSrc.nRegHeight; + nRegAscent = rSrc.nRegAscent; + eUse = rSrc.eUse; + bLandscape = rSrc.bLandscape; + return *this; +} + +SwPageDesc::~SwPageDesc() +{ +} + +/************************************************************************* +|* +|* SwPageDesc::Mirror() +|* +|* Beschreibung Gespiegelt werden nur die Raender. +|* Attribute wie Umrandung und dergleichen werden 1:1 kopiert. +|* Ersterstellung MA 25. Jan. 93 +|* Letzte Aenderung 01. Nov. 94 +|* +|*************************************************************************/ + + + +void SwPageDesc::Mirror() +{ + //Das Spiegeln findet nur beim RandAttribut statt, alle anderen Werte + //werden schlicht uebertragen. + SvxLRSpaceItem aLR( RES_LR_SPACE ); + const SvxLRSpaceItem &rLR = aMaster.GetLRSpace(); + aLR.SetLeft( rLR.GetRight() ); + aLR.SetRight( rLR.GetLeft() ); + + SfxItemSet aSet( *aMaster.GetAttrSet().GetPool(), + aMaster.GetAttrSet().GetRanges() ); + aSet.Put( aLR ); + aSet.Put( aMaster.GetFrmSize() ); + aSet.Put( aMaster.GetPaperBin() ); + aSet.Put( aMaster.GetULSpace() ); + aSet.Put( aMaster.GetBox() ); + aSet.Put( aMaster.GetBackground() ); + aSet.Put( aMaster.GetShadow() ); + aSet.Put( aMaster.GetCol() ); + aSet.Put( aMaster.GetFrmDir() ); // #112217# + aLeft.SetFmtAttr( aSet ); +} + +void SwPageDesc::ResetAllAttr( sal_Bool bLeft ) +{ + SwFrmFmt& rFmt = bLeft ? GetLeft() : GetMaster(); + + // --> OD 2007-01-25 #i73790# - method renamed + rFmt.ResetAllFmtAttr(); + // <-- + rFmt.SetFmtAttr( SvxFrameDirectionItem(FRMDIR_HORI_LEFT_TOP, RES_FRAMEDIR) ); +} + +/************************************************************************* +|* +|* SwPageDesc::GetInfo() +|* +|* Beschreibung erfragt Informationen +|* Ersterstellung JP 31.03.94 +|* Letzte Aenderung JP 31.03.94 +|* +*************************************************************************/ + + + // erfrage vom Modify Informationen +BOOL SwPageDesc::GetInfo( SfxPoolItem & rInfo ) const +{ +// if( RES_AUTOFMT_DOCNODE == rInfo.Which() ) +// { + // dann weiter zum Format + if( !aMaster.GetInfo( rInfo ) ) + return FALSE; // gefunden + return aLeft.GetInfo( rInfo ); +// } +// return TRUE; // weiter suchen +} + +/************************************************************************* +|* +|* SwPageDesc::SetRegisterFmtColl() +|* +|* Beschreibung setzt die Vorlage fuer die Registerhaltigkeit +|* Ersterstellung AMA 22.07.96 +|* Letzte Aenderung AMA 22.07.96 +|* +*************************************************************************/ + + +void SwPageDesc::SetRegisterFmtColl( const SwTxtFmtColl* pFmt ) +{ + if( pFmt != GetRegisterFmtColl() ) + { + if( pFmt ) + ((SwTxtFmtColl*)pFmt)->Add( &aDepend ); + else + ((SwTxtFmtColl*)GetRegisterFmtColl())->Remove( &aDepend ); + + RegisterChange(); + } +} + +/************************************************************************* +|* +|* SwPageDesc::GetRegisterFmtColl() +|* +|* Beschreibung holt die Vorlage fuer die Registerhaltigkeit +|* Ersterstellung AMA 22.07.96 +|* Letzte Aenderung AMA 22.07.96 +|* +*************************************************************************/ + + +const SwTxtFmtColl* SwPageDesc::GetRegisterFmtColl() const +{ + const SwModify* pReg = aDepend.GetRegisteredIn(); + return (SwTxtFmtColl*)pReg; +} + +/************************************************************************* +|* +|* SwPageDesc::RegisterChange() +|* +|* Beschreibung benachrichtigt alle betroffenen PageFrames +|* Ersterstellung AMA 22.07.96 +|* Letzte Aenderung AMA 22.07.96 +|* +*************************************************************************/ + + +void SwPageDesc::RegisterChange() +{ + // --> OD 2004-06-15 #117072# - During destruction of the document <SwDoc> + // the page description is modified. Thus, do nothing, if the document + // is in destruction respectively if no viewshell exists. + SwDoc* pDoc = GetMaster().GetDoc(); + if ( !pDoc || pDoc->IsInDtor() ) + { + return; + } + ViewShell* pSh = 0L; + pDoc->GetEditShell( &pSh ); + if ( !pSh ) + { + return; + } + + nRegHeight = 0; + { + SwClientIter aIter( GetMaster() ); + for( SwClient* pLast = aIter.First(TYPE(SwFrm)); pLast; + pLast = aIter.Next() ) + { + if( ((SwFrm*)pLast)->IsPageFrm() ) + ((SwPageFrm*)pLast)->PrepareRegisterChg(); + } + } + { + SwClientIter aIter( GetLeft() ); + for( SwClient* pLast = aIter.First(TYPE(SwFrm)); pLast; + pLast = aIter.Next() ) + { + if( ((SwFrm*)pLast)->IsPageFrm() ) + ((SwPageFrm*)pLast)->PrepareRegisterChg(); + } + } +} + +/************************************************************************* +|* +|* SwPageDesc::Modify() +|* +|* Beschreibung reagiert insbesondere auf Aenderungen +|* der Vorlage fuer die Registerhaltigkeit +|* Ersterstellung AMA 22.07.96 +|* Letzte Aenderung AMA 22.07.96 +|* +*************************************************************************/ + + +void SwPageDesc::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) +{ + const USHORT nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0; + SwModify::Modify( pOld, pNew ); + + if ( (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich) + || isCHRATR(nWhich) || (RES_PARATR_LINESPACING == nWhich) ) + { + RegisterChange(); + } +} + +static const SwFrm* lcl_GetFrmOfNode( const SwNode& rNd ) +{ + SwModify* pMod; + USHORT nFrmType = FRM_CNTNT; + + if( rNd.IsCntntNode() ) + { + pMod = &(SwCntntNode&)rNd; + } + else if( rNd.IsTableNode() ) + { + pMod = ((SwTableNode&)rNd).GetTable().GetFrmFmt(); + nFrmType = FRM_TAB; + } + else + pMod = 0; + + Point aNullPt; + return pMod ? ::GetFrmOfModify( *pMod, nFrmType, &aNullPt, 0, FALSE ) + : 0; +} + +const SwPageDesc* SwPageDesc::GetPageDescOfNode(const SwNode& rNd) +{ + const SwPageDesc* pRet = 0; + const SwFrm* pChkFrm = lcl_GetFrmOfNode( rNd ); + if (pChkFrm && 0 != (pChkFrm = pChkFrm->FindPageFrm())) + pRet = ((const SwPageFrm*)pChkFrm)->GetPageDesc(); + return pRet; +} + +const SwFrmFmt* SwPageDesc::GetPageFmtOfNode( const SwNode& rNd, + BOOL bCheckForThisPgDc ) const +{ + // welches PageDescFormat ist fuer diesen Node gueltig? + const SwFrmFmt* pRet; + const SwFrm* pChkFrm = lcl_GetFrmOfNode( rNd ); + + if( pChkFrm && 0 != ( pChkFrm = pChkFrm->FindPageFrm() )) + { + const SwPageDesc* pPd = bCheckForThisPgDc ? this : + ((SwPageFrm*)pChkFrm)->GetPageDesc(); + pRet = &pPd->GetMaster(); + ASSERT( ((SwPageFrm*)pChkFrm)->GetPageDesc() == pPd, + "Falcher Node fuers erkennen des Seitenformats" ); + // an welchem Format haengt diese Seite? + if( pRet != pChkFrm->GetRegisteredIn() ) + { + pRet = &pPd->GetLeft(); + ASSERT( pRet == pChkFrm->GetRegisteredIn(), + "Falcher Node fuers erkennen des Seitenformats" ); + } + } + else + pRet = &GetMaster(); + return pRet; +} + +BOOL SwPageDesc::IsFollowNextPageOfNode( const SwNode& rNd ) const +{ + BOOL bRet = FALSE; + if( GetFollow() && this != GetFollow() ) + { + const SwFrm* pChkFrm = lcl_GetFrmOfNode( rNd ); + if( pChkFrm && 0 != ( pChkFrm = pChkFrm->FindPageFrm() ) && + pChkFrm->IsPageFrm() && + ( !pChkFrm->GetNext() || GetFollow() == + ((SwPageFrm*)pChkFrm->GetNext())->GetPageDesc() )) + // die Seite gefunden, auf die der Follow verweist + bRet = TRUE; + } + return bRet; +} + +/************************************************************************* +|* +|* SwPageFtnInfo::SwPageFtnInfo() +|* +|* Ersterstellung MA 24. Feb. 93 +|* Letzte Aenderung MA 24. Feb. 93 +|* +|*************************************************************************/ + + + +SwPageFtnInfo::SwPageFtnInfo() : + nMaxHeight( 0 ), +// aPen( PEN_SOLID ), + nLineWidth(10), + aWidth( 25, 100 ), + nTopDist( 57 ), //1mm + nBottomDist( 57 ) +{ + eAdj = FRMDIR_HORI_RIGHT_TOP == GetDefaultFrameDirection(GetAppLanguage()) ? + FTNADJ_RIGHT : + FTNADJ_LEFT; +// aPen.SetWidth( 10 ); +} + + + +SwPageFtnInfo::SwPageFtnInfo( const SwPageFtnInfo &rCpy ) : + nMaxHeight( rCpy.GetHeight() ), + nLineWidth(rCpy.nLineWidth), + aLineColor(rCpy.aLineColor), + aWidth( rCpy.GetWidth() ), + eAdj( rCpy.GetAdj() ), + nTopDist( rCpy.GetTopDist() ), + nBottomDist( rCpy.GetBottomDist() ) +{ +} + +/************************************************************************* +|* +|* SwPageFtnInfo::operator= +|* +|* Ersterstellung MA 24. Feb. 93 +|* Letzte Aenderung MA 24. Feb. 93 +|* +|*************************************************************************/ + + + +SwPageFtnInfo &SwPageFtnInfo::operator=( const SwPageFtnInfo& rCpy ) +{ + nMaxHeight = rCpy.GetHeight(); + nLineWidth = rCpy.nLineWidth; + aLineColor = rCpy.aLineColor; + aWidth = rCpy.GetWidth(); + eAdj = rCpy.GetAdj(); + nTopDist = rCpy.GetTopDist(); + nBottomDist = rCpy.GetBottomDist(); + return *this; +} +/************************************************************************* +|* +|* SwPageFtnInfo::operator== +|* +|* Ersterstellung MA 01. Mar. 93 +|* Letzte Aenderung MA 01. Mar. 93 +|* +|*************************************************************************/ + + + +BOOL SwPageFtnInfo::operator==( const SwPageFtnInfo& rCmp ) const +{ + return ( nMaxHeight == rCmp.GetHeight() && + nLineWidth == rCmp.nLineWidth && + aLineColor == rCmp.aLineColor && + aWidth == rCmp.GetWidth() && + eAdj == rCmp.GetAdj() && + nTopDist == rCmp.GetTopDist() && + nBottomDist== rCmp.GetBottomDist() ); +} + +SwPageDescExt::SwPageDescExt(const SwPageDesc & rPageDesc, SwDoc * _pDoc) + : aPageDesc(rPageDesc), pDoc(_pDoc) +{ + SetPageDesc(rPageDesc); +} + +SwPageDescExt::SwPageDescExt(const SwPageDescExt & rSrc) + : aPageDesc(rSrc.aPageDesc), pDoc(rSrc.pDoc) +{ + SetPageDesc(rSrc.aPageDesc); +} + +SwPageDescExt::~SwPageDescExt() +{ +} + +const String & SwPageDescExt::GetName() const +{ + return aPageDesc.GetName(); +} + +void SwPageDescExt::SetPageDesc(const SwPageDesc & _aPageDesc) +{ + aPageDesc = _aPageDesc; + + if (aPageDesc.GetFollow()) + sFollow = aPageDesc.GetFollow()->GetName(); +} + +SwPageDescExt & SwPageDescExt::operator = (const SwPageDesc & rSrc) +{ + SetPageDesc(rSrc); + + return *this; +} + +SwPageDescExt & SwPageDescExt::operator = (const SwPageDescExt & rSrc) +{ + SetPageDesc(rSrc.aPageDesc); + + return *this; +} + +SwPageDescExt::operator SwPageDesc() const +{ + SwPageDesc aResult(aPageDesc); + + SwPageDesc * pPageDesc = pDoc->GetPageDesc(sFollow); + + if ( 0 != pPageDesc ) + aResult.SetFollow(pPageDesc); + + return aResult; +} |