1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 #ifndef _FLOWFRM_HXX 28 #define _FLOWFRM_HXX 29 30 //Der FlowFrm gibt die Funktionalitaet fuer alle Frms vor, die fliessen und 31 //die sich aufspalten koennen (wie CntntFrm oder TabFrm). 32 //Teile der Funktionalitaet sind im FlowFrm implementiert, andere Teile werden 33 //von den spezifischen Frms implementiert. 34 //Der FlowFrm ist kein eigenstaender Frm, es kann also auch niemals eine 35 //eigenstaendige Instanz vom FlowFrm existieren. 36 //Der FlowFrm ist nicht einmal ein echter Frm. Die naheliegende Implementierung 37 //waere ein FlowFrm der virtual vom SwFrm abgeleitet ist und direkt auf den 38 //eigenen Instanzdaten arbeitet. Abgeleitete Klassen muessten sich 39 //vom FlowFrm und (ueber mehrere Basisklassen weil der Klassenbaum sich direkt 40 //vom SwFrm zu SwCntntFrm und zum SwLayoutFrm spaltet) virtual vom SwFrm 41 //ableiten. 42 //Leider entstehen dadurch - neben Problemen mit Compilern und Debuggern - 43 //erhebliche zusaetzliche Kosten, die wir uns heutzutage IMHO nicht erlauben 44 //koennen. 45 //Ich greife deshalb auf eine andere Technik zurueck: Der FlowFrm hat eine 46 //Referenz auf den SwFrm - der er genau betrachtet selbst ist - und ist mit 47 //diesem befreundet. So kann der FlowFrm anstelle des this-Pointer mit der 48 //Referenz auf den SwFrm arbeiten. 49 50 //#include "frame.hxx" //fuer inlines 51 52 class SwPageFrm; 53 class SwRect; 54 class SwBorderAttrs; 55 class SwDoc; 56 class SwNodeIndex; 57 // --> OD 2005-03-04 #i44049# 58 class SwObjectFormatterTxtFrm; 59 // <-- 60 61 void MakeFrms( SwDoc *, const SwNodeIndex &, const SwNodeIndex & ); 62 63 class SwFlowFrm 64 { 65 //PrepareMake darf Locken/Unlocken (Robustheit) 66 friend inline void PrepareLock ( SwFlowFrm * ); 67 friend inline void PrepareUnlock( SwFlowFrm * ); 68 friend inline void TableSplitRecalcLock( SwFlowFrm * ); 69 friend inline void TableSplitRecalcUnlock( SwFlowFrm * ); 70 // --> OD 2005-03-04 #i44049# 71 friend class SwObjectFormatterTxtFrm; 72 // <-- 73 74 //TblSel darf das Follow-Bit zuruecksetzen. 75 friend inline void UnsetFollow( SwFlowFrm *pFlow ); 76 77 friend void MakeFrms( SwDoc *, const SwNodeIndex &, const SwNodeIndex & ); 78 79 friend class SwNode2LayImpl; 80 81 SwFrm &rThis; 82 83 //Hilfsfunktionen fuer MoveSubTree() 84 static SwLayoutFrm *CutTree( SwFrm* ); 85 static sal_Bool PasteTree( SwFrm *, SwLayoutFrm *, SwFrm *, SwFrm* ); 86 87 //Wird fuer das Zusammenspiel von _GetPrevxxx und MoveBwd gebraucht, damit 88 //mehrere Blaetter gleichzeitig uebersprungen werden koennen. 89 //Wird auch vom MoveBwd des TabFrm ausgewertet! 90 static sal_Bool bMoveBwdJump; 91 92 /** helper method to determine previous frame for calculation of the 93 upper space 94 95 OD 2004-03-10 #i11860# 96 97 @param _pProposedPrevFrm 98 optional input parameter - pointer to frame, which should be used 99 instead of the direct previous frame. 100 101 @author OD 102 */ 103 const SwFrm* _GetPrevFrmForUpperSpaceCalc( const SwFrm* _pProposedPrevFrm = 0L ) const; 104 105 /** method to detemine the upper space amount, which is considered for 106 the previous frame 107 108 OD 2004-03-11 #i11860# 109 110 @author OD 111 */ 112 SwTwips _GetUpperSpaceAmountConsideredForPrevFrm() const; 113 114 /** method to detemine the upper space amount, which is considered for 115 the page grid 116 117 OD 2004-03-12 #i11860# 118 119 @author OD 120 */ 121 SwTwips _GetUpperSpaceAmountConsideredForPageGrid( 122 const SwTwips _nUpperSpaceWithoutGrid ) const; 123 124 protected: 125 126 SwFlowFrm *pFollow; 127 128 sal_Bool bIsFollow :1; //Ist's ein Follow 129 sal_Bool bLockJoin :1; //Join (und damit deleten) verboten wenn sal_True! 130 sal_Bool bUndersized:1; // wir sind kleiner als gewuenscht 131 sal_Bool bFtnAtEnd :1; // For sectionfrms only: footnotes at the end of section 132 sal_Bool bEndnAtEnd :1; // " " " : endnotes at the end of section 133 sal_Bool bCntntLock :1; // " " " : content locked 134 sal_Bool bOwnFtnNum :1; // " " " : special numbering of footnotes 135 sal_Bool bFtnLock :1; // " " " : ftn, don't leave this section bwd 136 sal_Bool bFlyLock :1; // Stop positioning of at-character flyframes 137 138 //Prueft ob Vorwaertsfluss noch Sinn macht Endloswanderschaften (unterbinden) 139 inline sal_Bool IsFwdMoveAllowed(); 140 // --> OD 2005-03-08 #i44049# - method <CalcCntnt(..)> has to check this property. 141 friend void CalcCntnt( SwLayoutFrm *pLay, bool bNoColl, bool bNoCalcFollow ); 142 // <-- 143 sal_Bool IsKeepFwdMoveAllowed(); //Wie oben, Move fuer Keep. 144 145 //Prueft ob ein Obj das Umlauf wuenscht ueberlappt. 146 //eine Null bedeutet, kein Objekt ueberlappt, 147 // 1 heisst, Objekte, die am FlowFrm selbst verankert sind, ueberlappen 148 // 2 heisst, Objekte, die woanders verankert sind, ueberlappen 149 // 3 heistt, beiderlei verankerte Objekte ueberlappen 150 sal_uInt8 BwdMoveNecessary( const SwPageFrm *pPage, const SwRect &rRect ); 151 152 void LockJoin() { bLockJoin = sal_True; } 153 void UnlockJoin() { bLockJoin = sal_False; } 154 155 sal_Bool CheckMoveFwd( sal_Bool &rbMakePage, sal_Bool bKeep, sal_Bool bMovedBwd ); 156 sal_Bool MoveFwd( sal_Bool bMakePage, sal_Bool bPageBreak, sal_Bool bMoveAlways = sal_False ); 157 virtual sal_Bool ShouldBwdMoved( SwLayoutFrm *pNewUpper, sal_Bool bHead, sal_Bool &rReformat )=0; 158 sal_Bool MoveBwd( sal_Bool &rbReformat ); 159 160 public: 161 SwFlowFrm( SwFrm &rFrm ); 162 163 const SwFrm *GetFrm() const { return &rThis; } 164 SwFrm *GetFrm() { return &rThis; } 165 166 static sal_Bool IsMoveBwdJump() { return bMoveBwdJump; } 167 static void SetMoveBwdJump( sal_Bool bNew ){ bMoveBwdJump = bNew; } 168 169 inline void SetUndersized( const sal_Bool bNew ) { bUndersized = bNew; } 170 inline sal_Bool IsUndersized() const { return bUndersized; } 171 172 sal_Bool IsPrevObjMove() const; 173 174 //Die Kette mit minimalen Operationen und Benachrichtigungen unter den 175 //neuen Parent Moven. 176 void MoveSubTree( SwLayoutFrm* pParent, SwFrm* pSibling = 0 ); 177 178 sal_Bool HasFollow() const { return pFollow ? sal_True : sal_False; } 179 sal_Bool IsFollow() const { return bIsFollow; } 180 inline void _SetIsFollow( sal_Bool bSet ) { bIsFollow = bSet; } 181 const SwFlowFrm *GetFollow() const { return pFollow; } 182 SwFlowFrm *GetFollow() { return pFollow; } 183 sal_Bool IsAnFollow( const SwFlowFrm *pFlow ) const; 184 inline void SetFollow( SwFlowFrm *pNew ) { pFollow = pNew; } 185 186 sal_Bool IsJoinLocked() const { return bLockJoin; } 187 sal_Bool IsAnyJoinLocked() const { return bLockJoin || HasLockedFollow(); } 188 sal_Bool IsFtnAtEnd() const { return bFtnAtEnd; } 189 sal_Bool IsEndnAtEnd() const { return bEndnAtEnd; } 190 sal_Bool IsAnyNoteAtEnd() const { return bFtnAtEnd || bEndnAtEnd; } 191 sal_Bool AreNotesAtEnd() const { return bFtnAtEnd && bEndnAtEnd; } 192 193 sal_Bool IsPageBreak( sal_Bool bAct ) const; 194 sal_Bool IsColBreak( sal_Bool bAct ) const; 195 196 //Ist ein Keep zu beruecksichtigen (Breaks!) 197 sal_Bool IsKeep( const SwAttrSet& rAttrs, bool bBreakCheck = false ) const; 198 199 sal_Bool HasLockedFollow() const; 200 201 sal_Bool HasParaSpaceAtPages( sal_Bool bSct ) const; 202 203 /** method to determine the upper space hold by the frame 204 205 OD 2004-03-12 #i11860# - add 3rd parameter <_bConsiderGrid> to get 206 the upper space with and without considering the page grid 207 (default value: <sal_True>) 208 209 @author ? 210 */ 211 SwTwips CalcUpperSpace( const SwBorderAttrs *pAttrs = NULL, 212 const SwFrm* pPr = NULL, 213 const bool _bConsiderGrid = true ) const; 214 215 /** method to determine the upper space amount, which is considered for 216 the previous frame and the page grid, if option 'Use former object 217 positioning' is OFF 218 219 OD 2004-03-18 #i11860# 220 221 @author OD 222 */ 223 SwTwips GetUpperSpaceAmountConsideredForPrevFrmAndPageGrid() const; 224 225 /** calculation of lower space 226 227 OD 2004-03-02 #106629# 228 229 @author OD 230 */ 231 SwTwips CalcLowerSpace( const SwBorderAttrs* _pAttrs = 0L ) const; 232 233 /** calculation of the additional space to be considered, if flow frame 234 is the last inside a table cell 235 236 OD 2004-07-16 #i26250 237 238 @author OD 239 240 @param _pAttrs 241 optional input parameter - border attributes of the flow frame. 242 Used for optimization, if caller has already determined the border 243 attributes. 244 245 @return SwTwips 246 */ 247 SwTwips CalcAddLowerSpaceAsLastInTableCell( 248 const SwBorderAttrs* _pAttrs = 0L ) const; 249 250 void CheckKeep(); 251 252 void SetFtnLock( sal_Bool bNew ){ bFtnLock = bNew; } 253 sal_Bool IsFtnLock() const { return bFtnLock; } 254 void SetFlyLock( sal_Bool bNew ){ bFlyLock = bNew; } 255 sal_Bool IsFlyLock() const { return bFlyLock; } 256 void SetOwnFtnNum( sal_Bool bNew ){ bOwnFtnNum = bNew; } 257 sal_Bool IsOwnFtnNum() const { return bOwnFtnNum; } 258 void SetCntntLock( sal_Bool bNew ){ bCntntLock = bNew; } 259 sal_Bool IsCntntLocked() const { return bCntntLock; } 260 261 //casten einen Frm auf einen FlowFrm - wenns denn einer ist, sonst 0 262 //Diese Methoden muessen fuer neue Ableitungen geaendert werden! 263 static SwFlowFrm *CastFlowFrm( SwFrm *pFrm ); 264 static const SwFlowFrm *CastFlowFrm( const SwFrm *pFrm ); 265 }; 266 267 inline sal_Bool SwFlowFrm::IsFwdMoveAllowed() 268 { 269 return rThis.GetIndPrev() != 0; 270 } 271 272 273 #endif 274