diff options
Diffstat (limited to 'sw/source/core/inc/frmtool.hxx')
-rw-r--r-- | sw/source/core/inc/frmtool.hxx | 582 |
1 files changed, 582 insertions, 0 deletions
diff --git a/sw/source/core/inc/frmtool.hxx b/sw/source/core/inc/frmtool.hxx new file mode 100644 index 000000000000..94befc1dca59 --- /dev/null +++ b/sw/source/core/inc/frmtool.hxx @@ -0,0 +1,582 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ +#ifndef _FRMTOOL_HXX +#define _FRMTOOL_HXX +#include "swtypes.hxx" +#include "layfrm.hxx" +#include "frmatr.hxx" +#include "swcache.hxx" +// --> OD 2008-12-04 #i96772# +#include <editeng/lrspitem.hxx> +// <-- + +class SwPageFrm; +class SwFlyFrm; +class SwCntntFrm; +class SwDoc; +class SwAttrSet; +class SdrObject; +class BigInt; +class SvxBrushItem; +class SdrMarkList; +class SwNodeIndex; +class OutputDevice; +class SwPageDesc; +class SwTableBox; +struct SwFindRowSpanCacheObj; + +#if defined(MSC) +#define MA_FASTCALL __fastcall +#else +#define MA_FASTCALL +#endif + +#define WEIT_WECH LONG_MAX - 20000 //Initale Position der Flys. +#define BROWSE_HEIGHT 56700L * 10L //10 Meter +//#define BROWSE_HEIGHT 1440L * 45L // 45 inch, maximum size for pdf files + +#define GRFNUM_NO 0 +#define GRFNUM_YES 1 +#define GRFNUM_REPLACE 2 + +//Painten des Hintergrunds. Mit Brush oder Graphic. +// OD 05.08.2002 #99657# - add 6th parameter to indicate that method should +// consider background transparency, saved in the color of the brush item +void MA_FASTCALL DrawGraphic( const SvxBrushItem *, OutputDevice *, + const SwRect &rOrg, const SwRect &rOut, const BYTE nGrfNum = GRFNUM_NO, + const sal_Bool bConsiderBackgroundTransparency = sal_False ); + +// OD 24.01.2003 #106593# - method to align rectangle +// Created declaration here to avoid <extern> declarations +void MA_FASTCALL SwAlignRect( SwRect &rRect, ViewShell *pSh ); + +// OD 24.01.2003 #106593# - method to align graphic rectangle +// Created declaration here to avoid <extern> declarations +void SwAlignGrfRect( SwRect *pGrfRect, const OutputDevice &rOut ); + +//Fly besorgen, wenn keine List hineingereicht wird, wir die der aktuellen +//Shell benutzt. +//Implementierung in feshview.cxx +SwFlyFrm *GetFlyFromMarked( const SdrMarkList *pLst, ViewShell *pSh ); + +//Nicht gleich die math.lib anziehen. +ULONG MA_FASTCALL SqRt( BigInt nX ); + +SwFrm *SaveCntnt( SwLayoutFrm *pLay, SwFrm *pStart ); +void RestoreCntnt( SwFrm *pSav, SwLayoutFrm *pParent, SwFrm *pSibling, bool bGrow ); + +//CntntNodes besorgen, CntntFrms erzeugen und in den LayFrm haengen. +void MA_FASTCALL _InsertCnt( SwLayoutFrm *pLay, SwDoc *pDoc, ULONG nIndex, + BOOL bPages = FALSE, ULONG nEndIndex = 0, + SwFrm *pPrv = 0 ); + +//Erzeugen der Frames fuer einen bestimmten Bereich, verwendet _InsertCnt +void MakeFrms( SwDoc *pDoc, const SwNodeIndex &rSttIdx, + const SwNodeIndex &rEndIdx ); + +//Um z.B. fuer Tabelleheadlines das Erzeugen der Flys in _InsertCnt zu unterbinden. +extern BOOL bDontCreateObjects; + +//Fuer FlyCnts, siehe SwFlyAtCntFrm::MakeAll() +extern BOOL bSetCompletePaintOnInvalidate; + +//Fuer Tabelleneinstellung per Tastatur. +long MA_FASTCALL CalcRowRstHeight( SwLayoutFrm *pRow ); +long MA_FASTCALL CalcHeightWidthFlys( const SwFrm *pFrm ); //MA_FLY_HEIGHT + +//Neue Seite einsetzen +SwPageFrm * MA_FASTCALL InsertNewPage( SwPageDesc &rDesc, SwFrm *pUpper, + BOOL bOdd, BOOL bInsertEmpty, BOOL bFtn, + SwFrm *pSibling ); + +//Flys bei der Seite anmelden. +void RegistFlys( SwPageFrm*, const SwLayoutFrm* ); + +//Benachrichtung des Fly Hintergrundes wenn Notwendig. +void Notify( SwFlyFrm *pFly, SwPageFrm *pOld, const SwRect &rOld, + const SwRect* pOldRect = 0 ); + +void Notify_Background( const SdrObject* pObj, + SwPageFrm* pPage, + const SwRect& rRect, + const PrepareHint eHint, + const BOOL bInva ); + +const SwFrm* GetVirtualUpper( const SwFrm* pFrm, const Point& rPos ); + +BOOL Is_Lower_Of( const SwFrm *pCurrFrm, const SdrObject* pObj ); + +const SwFrm *FindKontext( const SwFrm *pFrm, USHORT nAdditionalKontextTyp ); + +BOOL IsFrmInSameKontext( const SwFrm *pInnerFrm, const SwFrm *pFrm ); + +const SwFrm * MA_FASTCALL FindPage( const SwRect &rRect, const SwFrm *pPage ); + +// JP 07.05.98: wird von SwCntntNode::GetFrm und von SwFlyFrm::GetFrm +// gerufen +SwFrm* GetFrmOfModify( SwModify const&, USHORT const nFrmType, const Point* = 0, + const SwPosition *pPos = 0, + const BOOL bCalcFrm = FALSE ); + +//Sollen ExtraDaten (Reline-Strich, Zeilennummern) gepaintet werden? +BOOL IsExtraData( const SwDoc *pDoc ); + +// OD 14.03.2003 #i11760# - method declaration <CalcCntnt(..)> +void CalcCntnt( SwLayoutFrm *pLay, + bool bNoColl = false, + bool bNoCalcFollow = false ); + + +//Die Notify-Klassen merken sich im CTor die aktuellen Groessen und fuehren +//im DTor ggf. die notwendigen Benachrichtigungen durch. + +class SwFrmNotify +{ +protected: + SwFrm *pFrm; + const SwRect aFrm; + const SwRect aPrt; + SwTwips mnFlyAnchorOfst; + SwTwips mnFlyAnchorOfstNoWrap; + BOOL bHadFollow; + BOOL bInvaKeep; + BOOL bValidSize; +protected: + // --> OD 2005-07-29 #i49383# + bool mbFrmDeleted; + // <-- + +public: + SwFrmNotify( SwFrm *pFrm ); + ~SwFrmNotify(); + + const SwRect &Frm() const { return aFrm; } + const SwRect &Prt() const { return aPrt; } + void SetInvaKeep() { bInvaKeep = TRUE; } + // --> OD 2005-07-29 #i49383# + void FrmDeleted() + { + mbFrmDeleted = true; + } + // <-- +}; + +class SwLayNotify : public SwFrmNotify +{ + BOOL bLowersComplete; + + SwLayoutFrm *GetLay() { return (SwLayoutFrm*)pFrm; } +public: + SwLayNotify( SwLayoutFrm *pLayFrm ); + ~SwLayNotify(); + + void SetLowersComplete( BOOL b ) { bLowersComplete = b; } + BOOL IsLowersComplete() { return bLowersComplete; } +}; + +class SwFlyNotify : public SwLayNotify +{ + SwPageFrm *pOldPage; + const SwRect aFrmAndSpace; + SwFlyFrm *GetFly() { return (SwFlyFrm*)pFrm; } +public: + SwFlyNotify( SwFlyFrm *pFlyFrm ); + ~SwFlyNotify(); + + SwPageFrm *GetOldPage() const { return pOldPage; } +}; + +class SwCntntNotify : public SwFrmNotify +{ +private: + // OD 08.01.2004 #i11859# + bool mbChkHeightOfLastLine; + SwTwips mnHeightOfLastLine; + + // OD 2004-02-26 #i25029# + bool mbInvalidatePrevPrtArea; + bool mbBordersJoinedWithPrev; + + SwCntntFrm *GetCnt() { return (SwCntntFrm*)pFrm; } + +public: + SwCntntNotify( SwCntntFrm *pCntFrm ); + ~SwCntntNotify(); + + // OD 2004-02-26 #i25029# + void SetInvalidatePrevPrtArea() + { + mbInvalidatePrevPrtArea = true; + } + + void SetBordersJoinedWithPrev() + { + mbBordersJoinedWithPrev = true; + } +}; + +//SwBorderAttrs kapselt die Berechnung fuer die Randattribute inclusive +//Umrandung. Die Attribute und die errechneten Werte werden gecached. +//Neu: Die gesammte Klasse wird gecached. + +//!!!Achtung: Wenn weitere Attribute gecached werden muss unbedingt die +//Methode Modify::Modify mitgepflegt werden!!! + +// OD 23.01.2003 #106895# - delete old method <SwBorderAttrs::CalcRight()> and +// the stuff that belongs to it. +class SwBorderAttrs : public SwCacheObj +{ + const SwAttrSet &rAttrSet; + const SvxULSpaceItem &rUL; + // --> OD 2008-12-04 #i96772# + SvxLRSpaceItem rLR; + // <-- + const SvxBoxItem &rBox; + const SvxShadowItem &rShadow; + const Size aFrmSize; //Die FrmSize + + BOOL bBorderDist :1; //Ist's ein Frm der auch ohne Linie + //einen Abstand haben kann? + + //Mit den Folgenden Bools werden die gecache'ten Werte fuer UNgueltig + //erklaert - bis sie einmal berechnet wurden. + BOOL bTopLine :1; + BOOL bBottomLine :1; + BOOL bLeftLine :1; + BOOL bRightLine :1; + BOOL bTop :1; + BOOL bBottom :1; + BOOL bLine :1; + + BOOL bIsLine :1; //Umrandung an mind. einer Kante? + + BOOL bCacheGetLine :1; //GetTopLine(), GetBottomLine() cachen? + BOOL bCachedGetTopLine :1; //GetTopLine() gecached? + BOOL bCachedGetBottomLine :1; //GetBottomLine() gecached? + // OD 21.05.2003 #108789# - booleans indicating, if values <bJoinedWithPrev> + // and <bJoinedWithNext> are cached and valid. + // Caching depends on value of <bCacheGetLine>. + mutable BOOL bCachedJoinedWithPrev :1; + mutable BOOL bCachedJoinedWithNext :1; + // OD 21.05.2003 #108789# - booleans indicating, if borders are joined + // with previous/next frame. + BOOL bJoinedWithPrev :1; + BOOL bJoinedWithNext :1; + + //Die gecache'ten Werte, undefiniert bis sie einmal berechnet wurden. + USHORT nTopLine, + nBottomLine, + nLeftLine, + nRightLine, + nTop, + nBottom, + nGetTopLine, + nGetBottomLine; + + //Nur die Lines + Shadow errechnen. + void _CalcTopLine(); + void _CalcBottomLine(); + void _CalcLeftLine(); + void _CalcRightLine(); + + //Lines + Shadow + Abstaende + void _CalcTop(); + void _CalcBottom(); + + void _IsLine(); + + // OD 2004-02-26 #i25029# - add optional 2nd parameter <_pPrevFrm> + // If set, its value is taken for testing, if borders/shadow have to joined + // with previous frame. + void _GetTopLine ( const SwFrm& _rFrm, + const SwFrm* _pPrevFrm = 0L ); + void _GetBottomLine( const SwFrm& _rFrm ); + + // OD 21.05.2003 #108789# - private methods to calculate cached values + // <bJoinedWithPrev> and <bJoinedWithNext>. + // OD 2004-02-26 #i25029# - add optional 2nd parameter <_pPrevFrm> + // If set, its value is taken for testing, if borders/shadow have to joined + // with previous frame. + void _CalcJoinedWithPrev( const SwFrm& _rFrm, + const SwFrm* _pPrevFrm = 0L ); + void _CalcJoinedWithNext( const SwFrm& _rFrm ); + + // OD 21.05.2003 #108789# - internal helper method for methods + // <_CalcJoinedWithPrev> and <_CalcJoinedWithNext>. + BOOL _JoinWithCmp( const SwFrm& _rCallerFrm, + const SwFrm& _rCmpFrm ) const; + + //Rechte und linke Linie sowie LRSpace gleich? + // OD 21.05.2003 #108789# - change name of 1st parameter - "rAttrs" -> "rCmpAttrs". + BOOL CmpLeftRight( const SwBorderAttrs &rCmpAttrs, + const SwFrm *pCaller, + const SwFrm *pCmp ) const; + +public: + DECL_FIXEDMEMPOOL_NEWDEL(SwBorderAttrs) + + SwBorderAttrs( const SwModify *pOwner, const SwFrm *pConstructor ); + ~SwBorderAttrs(); + + inline const SwAttrSet &GetAttrSet() const { return rAttrSet; } + inline const SvxULSpaceItem &GetULSpace() const { return rUL; } + inline const SvxLRSpaceItem &GetLRSpace() const { return rLR; } + inline const SvxBoxItem &GetBox() const { return rBox; } + inline const SvxShadowItem &GetShadow() const { return rShadow; } + + inline USHORT CalcTopLine() const; + inline USHORT CalcBottomLine() const; + inline USHORT CalcLeftLine() const; + inline USHORT CalcRightLine() const; + inline USHORT CalcTop() const; + inline USHORT CalcBottom() const; + long CalcLeft( const SwFrm *pCaller ) const; + long CalcRight( const SwFrm *pCaller ) const; + + inline BOOL IsLine() const; + + inline const Size &GetSize() const { return aFrmSize; } + + inline BOOL IsBorderDist() const { return bBorderDist; } + + //Sollen obere bzw. untere Umrandung fuer den Frm ausgewertet werden? + // OD 2004-02-26 #i25029# - add optional 2nd parameter <_pPrevFrm> + // If set, its value is taken for testing, if borders/shadow have to joined + // with previous frame. + inline USHORT GetTopLine ( const SwFrm& _rFrm, + const SwFrm* _pPrevFrm = 0L ) const; + inline USHORT GetBottomLine( const SwFrm& _rFrm ) const; + inline void SetGetCacheLine( BOOL bNew ) const; + // OD 21.05.2003 #108789# - accessors for cached values <bJoinedWithPrev> + // and <bJoinedWithPrev> + // OD 2004-02-26 #i25029# - add optional 2nd parameter <_pPrevFrm> + // If set, its value is taken for testing, if borders/shadow have to joined + // with previous frame. + BOOL JoinedWithPrev( const SwFrm& _rFrm, + const SwFrm* _pPrevFrm = 0L ) const; + BOOL JoinedWithNext( const SwFrm& _rFrm ) const; +}; + +class SwBorderAttrAccess : public SwCacheAccess +{ + const SwFrm *pConstructor; //opt: Zur weitergabe an SwBorderAttrs +protected: + virtual SwCacheObj *NewObj(); + +public: + SwBorderAttrAccess( SwCache &rCache, const SwFrm *pOwner ); + + SwBorderAttrs *Get(); +}; + +//--------------------------------------------------------------------- +//Iterator fuer die DrawObjecte einer Seite. Die Objecte werden Nach ihrer +//Z-Order iteriert. +//Das iterieren ist nicht eben billig, denn fuer alle Operationen muss jeweils +//ueber das gesamte SortArray iteriert werden. +class SwOrderIter +{ + const SwPageFrm *pPage; + const SdrObject *pCurrent; + const BOOL bFlysOnly; +public: + SwOrderIter( const SwPageFrm *pPage, BOOL bFlysOnly = TRUE ); + + void Current( const SdrObject *pNew ) { pCurrent = pNew; } + const SdrObject *Current() const { return pCurrent; } + const SdrObject *operator()() const { return pCurrent; } + const SdrObject *Top(); + const SdrObject *Bottom(); + const SdrObject *Next(); + const SdrObject *Prev(); +}; + + +class StackHack +{ + static BYTE nCnt; + static BOOL bLocked; +public: + StackHack() + { + if ( ++StackHack::nCnt > 50 ) + StackHack::bLocked = TRUE; + } + ~StackHack() + { + if ( --StackHack::nCnt < 5 ) + StackHack::bLocked = FALSE; + } + + static BOOL IsLocked() { return StackHack::bLocked; } + static BYTE Count() { return StackHack::nCnt; } +}; + + +//Sollen obere bzw. untere Umrandung fuer den Frm ausgewertet werden? +// OD 2004-02-26 #i25029# - add optional 2nd parameter <_pPrevFrm> +// If set, its value is taken for testing, if borders/shadow have to joined +// with previous frame. +inline USHORT SwBorderAttrs::GetTopLine ( const SwFrm& _rFrm, + const SwFrm* _pPrevFrm ) const +{ + if ( !bCachedGetTopLine || _pPrevFrm ) + { + const_cast<SwBorderAttrs*>(this)->_GetTopLine( _rFrm, _pPrevFrm ); + } + return nGetTopLine; +} +inline USHORT SwBorderAttrs::GetBottomLine( const SwFrm& _rFrm ) const +{ + if ( !bCachedGetBottomLine ) + const_cast<SwBorderAttrs*>(this)->_GetBottomLine( _rFrm ); + return nGetBottomLine; +} +inline void SwBorderAttrs::SetGetCacheLine( BOOL bNew ) const +{ + ((SwBorderAttrs*)this)->bCacheGetLine = bNew; + ((SwBorderAttrs*)this)->bCachedGetBottomLine = + ((SwBorderAttrs*)this)->bCachedGetTopLine = FALSE; + // OD 21.05.2003 #108789# - invalidate cache for values <bJoinedWithPrev> + // and <bJoinedWithNext>. + bCachedJoinedWithPrev = FALSE; + bCachedJoinedWithNext = FALSE; +} + +inline USHORT SwBorderAttrs::CalcTopLine() const +{ + if ( bTopLine ) + ((SwBorderAttrs*)this)->_CalcTopLine(); + return nTopLine; +} +inline USHORT SwBorderAttrs::CalcBottomLine() const +{ + if ( bBottomLine ) + ((SwBorderAttrs*)this)->_CalcBottomLine(); + return nBottomLine; +} +inline USHORT SwBorderAttrs::CalcLeftLine() const +{ + if ( bLeftLine ) + ((SwBorderAttrs*)this)->_CalcLeftLine(); + return nLeftLine; +} +inline USHORT SwBorderAttrs::CalcRightLine() const +{ + if ( bRightLine ) + ((SwBorderAttrs*)this)->_CalcRightLine(); + return nRightLine; +} +inline USHORT SwBorderAttrs::CalcTop() const +{ + if ( bTop ) + ((SwBorderAttrs*)this)->_CalcTop(); + return nTop; +} +inline USHORT SwBorderAttrs::CalcBottom() const +{ + if ( bBottom ) + ((SwBorderAttrs*)this)->_CalcBottom(); + return nBottom; +} +inline BOOL SwBorderAttrs::IsLine() const +{ + if ( bLine ) + ((SwBorderAttrs*)this)->_IsLine(); + return bIsLine; +} + +/** method to determine the spacing values of a frame + + OD 2004-03-10 #i28701# + Values only provided for flow frames (table, section or text frames) + Note: line spacing value is only determined for text frames + OD 2009-08-28 #i102458# + Add output parameter <obIsLineSpacingProportional> + + @param rFrm + input parameter - frame, for which the spacing values are determined. + + @param onPrevLowerSpacing + output parameter - lower spacing of the frame in SwTwips + + @param onPrevLineSpacing + output parameter - line spacing of the frame in SwTwips + + @param obIsLineSpacingProportional + + @author OD +*/ +void GetSpacingValuesOfFrm( const SwFrm& rFrm, + SwTwips& onLowerSpacing, + SwTwips& onLineSpacing, + bool& obIsLineSpacingProportional ); + +/** method to get the content of the table cell + + Content from any nested tables will be omitted. + Note: line spacing value is only determined for text frames + + @param rCell_ + input parameter - the cell which should be searched for content. + + return + pointer to the found content frame or 0 +*/ + +const SwCntntFrm* GetCellCntnt( const SwLayoutFrm& rCell_ ); + + +/** helper class to check if a frame has been deleted during an operation + * !!!WARNING!!! This should only be used as a last and desperate means + * to make the code robust. + */ + +class SwDeletionChecker +{ + private: + + const SwFrm* mpFrm; + const SwModify* mpRegIn; + + public: + + SwDeletionChecker( const SwFrm* pFrm ) + : mpFrm( pFrm ), + mpRegIn( pFrm ? pFrm->GetRegisteredIn() : 0 ) + { + } + + /** + * return + * true if mpFrm != 0 and mpFrm is not client of pRegIn + * false otherwise + */ + bool HasBeenDeleted(); +}; + +#endif //_FRMTOOL_HXX |