1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: flowfrm.hxx,v $
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 ************************************************************************/
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
45 //Leider entstehen dadurch - neben Problemen mit Compilern und Debuggern -
46 //erhebliche zusaetzliche Kosten, die wir uns heutzutage IMHO nicht erlauben
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
60 // --> OD 2005-03-04 #i44049#
61 class SwObjectFormatterTxtFrm
;
64 void MakeFrms( SwDoc
*, const SwNodeIndex
&, const SwNodeIndex
& );
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
;
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
;
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
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.
106 const SwFrm
* _GetPrevFrmForUpperSpaceCalc( const SwFrm
* _pProposedPrevFrm
= 0L ) const;
108 /** method to detemine the upper space amount, which is considered for
111 OD 2004-03-11 #i11860#
115 SwTwips
_GetUpperSpaceAmountConsideredForPrevFrm() const;
117 /** method to detemine the upper space amount, which is considered for
120 OD 2004-03-12 #i11860#
124 SwTwips
_GetUpperSpaceAmountConsideredForPageGrid(
125 const SwTwips _nUpperSpaceWithoutGrid
) const;
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
);
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
);
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>)
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
222 OD 2004-03-18 #i11860#
226 SwTwips
GetUpperSpaceAmountConsideredForPrevFrmAndPageGrid() const;
228 /** calculation of lower space
230 OD 2004-03-02 #106629#
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
244 optional input parameter - border attributes of the flow frame.
245 Used for optimization, if caller has already determined the border
250 SwTwips
CalcAddLowerSpaceAsLastInTableCell(
251 const SwBorderAttrs
* _pAttrs
= 0L ) const;
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;