blob: 3dcc601c300dca3f3ca1d6643459993757383434 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _SECTFRM_HXX
#define _SECTFRM_HXX
#include <tools/mempool.hxx>
#include "layfrm.hxx"
#include "flowfrm.hxx"
class SwSection;
class SwSectionFmt;
class SwAttrSetChg;
class SwFtnContFrm;
class SwLayouter;
#define FINDMODE_ENDNOTE 1
#define FINDMODE_LASTCNT 2
#define FINDMODE_MYLAST 4
class SwSectionFrm: public SwLayoutFrm, public SwFlowFrm
{
SwSection* pSection;
void _UpdateAttr( const SfxPoolItem*, const SfxPoolItem*, sal_uInt8 &,
SwAttrSetChg *pa = 0, SwAttrSetChg *pb = 0 );
void _Cut( sal_Bool bRemove );
// Is there a FtnContainer?
// An empty sectionfrm without FtnCont is superfluous
sal_Bool IsSuperfluous() const { return !ContainsAny() && !ContainsFtnCont(); }
void CalcFtnAtEndFlag();
void CalcEndAtEndFlag();
const SwSectionFmt* _GetEndSectFmt() const;
sal_Bool IsEndnoteAtMyEnd() const;
protected:
virtual void MakeAll();
virtual sal_Bool ShouldBwdMoved( SwLayoutFrm *pNewUpper, sal_Bool bHead, sal_Bool &rReformat );
virtual void Format( const SwBorderAttrs *pAttrs = 0 );
virtual void Modify( const SfxPoolItem*, const SfxPoolItem* );
virtual void SwClientNotify( const SwModify&, const SfxHint& );
public:
SwSectionFrm( SwSection &, SwFrm* ); //Inhalt wird nicht erzeugt!
SwSectionFrm( SwSectionFrm &, sal_Bool bMaster );//_Nur_ zum Erzeugen von Master/Follows
~SwSectionFrm();
void Init();
virtual void CheckDirection( sal_Bool bVert );
virtual void Cut();
virtual void Paste( SwFrm* pParent, SwFrm* pSibling = 0 );
inline const SwSectionFrm *GetFollow() const;
inline SwSectionFrm *GetFollow();
SwSectionFrm* FindMaster() const;
SwCntntFrm *FindLastCntnt( sal_uInt8 nMode = 0 );
inline const SwCntntFrm *FindLastCntnt( sal_uInt8 nMode = 0 ) const;
inline SwSection* GetSection() { return pSection; }
inline const SwSection* GetSection() const { return pSection; }
inline void ColLock() { bColLocked = sal_True; }
inline void ColUnlock() { bColLocked = sal_False; }
void CalcFtnCntnt();
void SimpleFormat();
sal_Bool IsDescendantFrom( const SwSectionFmt* pSect ) const;
sal_Bool HasToBreak( const SwFrm* pFrm ) const;
void MergeNext( SwSectionFrm* pNxt );
//Zerlegt den pFrm umgebenden SectionFrm in zwei Teile,
//pFrm an den Anfang des 2. Teils
sal_Bool SplitSect( SwFrm* pFrm, sal_Bool bApres );
void DelEmpty( sal_Bool bRemove ); // wie Cut(), Follow-Verkettung wird aber mitgepflegt
sal_Bool IsToIgnore() const // Keine Groesse, kein Inhalt, muss ignoriert werden
{ return !Frm().Height() && !ContainsCntnt(); }
SwFtnContFrm* ContainsFtnCont( const SwFtnContFrm* pCont = NULL ) const;
sal_Bool Growable() const;
SwTwips _Shrink( SwTwips, sal_Bool bTst );
SwTwips _Grow ( SwTwips, sal_Bool bTst );
// A sectionfrm has to maximize, if he has a follow or a ftncontainer at
// the end of the page. A superfluous follow will be ignored,
// if bCheckFollow is set.
sal_Bool ToMaximize( sal_Bool bCheckFollow ) const;
inline sal_Bool _ToMaximize() const
{ if( !pSection ) return sal_False; return ToMaximize( sal_False ); }
sal_Bool MoveAllowed( const SwFrm* ) const;
sal_Bool CalcMinDiff( SwTwips& rMinDiff ) const;
// Uebergibt man kein bOverSize bzw. sal_False, so ist der Returnwert
// >0 fuer Undersized-Frames, ==0 sonst.
// Uebergibt man sal_True, so kann es auch einen negativen Returnwert geben,
// wenn der SectionFrm nicht vollstaendig ausgefuellt ist, was z.B. bei
// SectionFrm mit Follow meist vorkommt. Benoetigt wird dies im
// FormatWidthCols, um "Luft" aus den Spalten zu lassen.
long Undersize( sal_Bool bOverSize = sal_False );
// Groesse an die Umgebung anpassen
void _CheckClipping( sal_Bool bGrow, sal_Bool bMaximize );
void InvalidateFtnPos();
void CollectEndnotes( SwLayouter* pLayouter );
const SwSectionFmt* GetEndSectFmt() const
{ if( IsEndnAtEnd() ) return _GetEndSectFmt(); return NULL; }
static void MoveCntntAndDelete( SwSectionFrm* pDel, sal_Bool bSave );
bool IsBalancedSection() const;
DECL_FIXEDMEMPOOL_NEWDEL(SwSectionFrm)
};
typedef SwSectionFrm* SwSectionFrmPtr;
SV_DECL_PTRARR_SORT( SwDestroyList, SwSectionFrmPtr, 1, 5)
inline const SwSectionFrm *SwSectionFrm::GetFollow() const
{
return (const SwSectionFrm*)SwFlowFrm::GetFollow();
}
inline SwSectionFrm *SwSectionFrm::GetFollow()
{
return (SwSectionFrm*)SwFlowFrm::GetFollow();
}
inline const SwCntntFrm *SwSectionFrm::FindLastCntnt( sal_uInt8 nMode ) const
{
return ((SwSectionFrm*)this)->FindLastCntnt( nMode );
}
#endif //_SECTFRM_HXX