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