diff options
Diffstat (limited to 'sw/source/core/inc/flowfrm.hxx')
-rw-r--r-- | sw/source/core/inc/flowfrm.hxx | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/sw/source/core/inc/flowfrm.hxx b/sw/source/core/inc/flowfrm.hxx new file mode 100644 index 000000000000..7e5371c9a9d4 --- /dev/null +++ b/sw/source/core/inc/flowfrm.hxx @@ -0,0 +1,216 @@ +/************************************************************************* + * + * $RCSfile: flowfrm.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-19 00:08:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#ifndef _FLOWFRM_HXX +#define _FLOWFRM_HXX + +//Der FlowFrm gibt die Funktionalitaet fuer alle Frms vor, die fliessen und +//die sich aufspalten koennen (wie CntntFrm oder TabFrm). +//Teile der Funktionalitaet sind im FlowFrm implementiert, andere Teile werden +//von den spezifischen Frms implementiert. +//Der FlowFrm ist kein eigenstaender Frm, es kann also auch niemals eine +//eigenstaendige Instanz vom FlowFrm existieren. +//Der FlowFrm ist nicht einmal ein echter Frm. Die naheliegende Implementierung +//waere ein FlowFrm der virtual vom SwFrm abgeleitet ist und direkt auf den +//eigenen Instanzdaten arbeitet. Abgeleitete Klassen muessten sich +//vom FlowFrm und (ueber mehrere Basisklassen weil der Klassenbaum sich direkt +//vom SwFrm zu SwCntntFrm und zum SwLayoutFrm spaltet) virtual vom SwFrm +//ableiten. +//Leider entstehen dadurch - neben Problemen mit Compilern und Debuggern - +//erhebliche zusaetzliche Kosten, die wir uns heutzutage IMHO nicht erlauben +//koennen. +//Ich greife deshalb auf eine andere Technik zurueck: Der FlowFrm hat eine +//Referenz auf den SwFrm - der er genau betrachtet selbst ist - und ist mit +//diesem befreundet. So kann der FlowFrm anstelle des this-Pointer mit der +//Referenz auf den SwFrm arbeiten. + +#include "frame.hxx" //fuer inlines + +class SwPageFrm; +class SwRect; +class SwBorderAttrs; +class SwDoc; +class SwNodeIndex; + +class SwFlowFrm +{ + //PrepareMake darf Locken/Unlocken (Robustheit) + friend inline void PrepareLock ( SwFlowFrm * ); + friend inline void PrepareUnlock( SwFlowFrm * ); + + //TblSel darf das Follow-Bit zuruecksetzen. + friend inline void UnsetFollow( SwFlowFrm *pFlow ); + + friend void MakeFrms( SwDoc *, const SwNodeIndex &, const SwNodeIndex & ); + + friend class SwNode2LayImpl; + + SwFrm &rThis; + + //Hilfsfunktionen fuer MoveSubTree() + static SwLayoutFrm *CutTree( SwFrm* ); + static BOOL PasteTree( SwFrm *, SwLayoutFrm *, SwFrm *, SwFrm* ); + + //Wird fuer das Zusammenspiel von _GetPrevxxx und MoveBwd gebraucht, damit + //mehrere Blaetter gleichzeitig uebersprungen werden koennen. + //Wird auch vom MoveBwd des TabFrm ausgewertet! + static BOOL bMoveBwdJump; + +protected: + + SwFlowFrm *pFollow; + + BOOL bIsFollow :1; //Ist's ein Follow + BOOL bLockJoin :1; //Join (und damit deleten) verboten wenn TRUE! + BOOL bUndersized:1; // wir sind kleiner als gewuenscht + BOOL bFtnAtEnd :1; // For sectionfrms only: footnotes at the end of section + BOOL bEndnAtEnd :1; // " " " : endnotes at the end of section + BOOL bCntntLock :1; // " " " : content locked + BOOL bOwnFtnNum :1; // " " " : special numbering of footnotes + BOOL bFtnLock :1; // " " " : ftn, don't leave this section bwd + + //Prueft ob Vorwaertsfluss noch Sinn macht Endloswanderschaften (unterbinden) + inline BOOL IsFwdMoveAllowed(); + BOOL IsKeepFwdMoveAllowed(); //Wie oben, Move fuer Keep. + + //Prueft ob ein Obj das Umlauf wuenscht ueberlappt. + //eine Null bedeutet, kein Objekt ueberlappt, + // 1 heisst, Objekte, die am FlowFrm selbst verankert sind, ueberlappen + // 2 heisst, Objekte, die woanders verankert sind, ueberlappen + // 3 heistt, beiderlei verankerte Objekte ueberlappen + BYTE BwdMoveNecessary( const SwPageFrm *pPage, const SwRect &rRect ); + + void LockJoin() { bLockJoin = TRUE; } + void UnlockJoin() { bLockJoin = FALSE; } + + BOOL CheckMoveFwd( BOOL &rbMakePage, BOOL bKeep, BOOL bMovedBwd ); + BOOL MoveFwd( BOOL bMakePage, BOOL bPageBreak, BOOL bMoveAlways = FALSE ); + virtual BOOL ShouldBwdMoved( SwLayoutFrm *pNewUpper, BOOL bHead, BOOL &rReformat )=0; + BOOL MoveBwd( BOOL &rbReformat ); + + BOOL IsKeep( const SwBorderAttrs &rAttrs ) const; //Ist ein Keep zu beruecksichtigen (Breaks!) + +public: + SwFlowFrm( SwFrm &rFrm ); + + const SwFrm *GetFrm() const { return &rThis; } + SwFrm *GetFrm() { return &rThis; } + + static BOOL IsMoveBwdJump() { return bMoveBwdJump; } + static void SetMoveBwdJump( BOOL bNew ){ bMoveBwdJump = bNew; } + + inline void SetUndersized( const BOOL bNew ) { bUndersized = bNew; } + inline BOOL IsUndersized() const { return bUndersized; } + + BOOL IsPrevObjMove() const; + + //Die Kette mit minimalen Operationen und Benachrichtigungen unter den + //neuen Parent Moven. + void MoveSubTree( SwLayoutFrm* pParent, SwFrm* pSibling = 0 ); + + BOOL HasFollow() const { return pFollow ? TRUE : FALSE; } + BOOL IsFollow() const { return bIsFollow; } + inline void _SetIsFollow( BOOL bSet ) { bIsFollow = bSet; } + const SwFlowFrm *GetFollow() const { return pFollow; } + SwFlowFrm *GetFollow() { return pFollow; } + BOOL IsAnFollow( const SwFlowFrm *pFlow ) const; + inline void SetFollow( SwFlowFrm *pNew ) { pFollow = pNew; } + SwFlowFrm *FindMaster(); + inline const SwFlowFrm *FindMaster() const; + + BOOL IsJoinLocked() const { return bLockJoin; } + BOOL IsFtnAtEnd() const { return bFtnAtEnd; } + BOOL IsEndnAtEnd() const { return bEndnAtEnd; } + BOOL IsAnyNoteAtEnd() const { return bFtnAtEnd || bEndnAtEnd; } + BOOL AreNotesAtEnd() const { return bFtnAtEnd && bEndnAtEnd; } + + BOOL IsPageBreak( BOOL bAct ) const; + BOOL IsColBreak( BOOL bAct ) const; + + BOOL HasParaSpaceAtPages( BOOL bSct ) const; + SwTwips CalcUpperSpace( const SwBorderAttrs *pAttrs = NULL, + const SwFrm* pPr = NULL ) const; + + void CheckKeep(); + + void SetFtnLock( BOOL bNew ){ bFtnLock = bNew; } + BOOL IsFtnLock() const { return bFtnLock; } + void SetOwnFtnNum( BOOL bNew ){ bOwnFtnNum = bNew; } + BOOL IsOwnFtnNum() const { return bOwnFtnNum; } + void SetCntntLock( BOOL bNew ){ bCntntLock = bNew; } + BOOL IsCntntLocked() const { return bCntntLock; } + + //casten einen Frm auf einen FlowFrm - wenns denn einer ist, sonst 0 + //Diese Methoden muessen fuer neue Ableitungen geaendert werden! + static SwFlowFrm *CastFlowFrm( SwFrm *pFrm ); + static const SwFlowFrm *CastFlowFrm( const SwFrm *pFrm ); +}; + +inline const SwFlowFrm *SwFlowFrm::FindMaster() const +{ + return ((SwFlowFrm*)this)->FindMaster(); +} +inline BOOL SwFlowFrm::IsFwdMoveAllowed() +{ + return rThis.GetIndPrev() != 0; +} + + +#endif |