xref: /trunk/main/sw/source/core/inc/frame.hxx (revision ba2f60e973791aaede57acb23286dc2de69bd3d2)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifndef SW_FRAME_HXX
24 #define SW_FRAME_HXX
25 
26 #include <svl/svarray.hxx>
27 #include "swtypes.hxx"  // fuer SwTwips
28 #include "swrect.hxx"
29 #include "calbck.hxx"   // fuer SwClient
30 #include <svl/brdcst.hxx>
31 
32 #include <com/sun/star/style/TabStop.hpp>
33 #include <comphelper/stlunosequence.hxx>
34 using namespace ::com::sun::star;
35 class SwLayoutFrm;
36 class SwRootFrm;
37 class SwPageFrm;
38 class SwFlyFrm;
39 class SwSectionFrm;
40 class SdrObject;
41 class SwFtnFrm;
42 class SwFtnBossFrm;
43 class SwTabFrm;
44 class SwRowFrm;
45 class SwFlowFrm;
46 class SwCntntFrm;
47 class SfxPoolItem;
48 class SwAttrSet;
49 class ViewShell;
50 class Color;
51 class SwBorderAttrs;
52 class SwCache;
53 class SvxBrushItem;
54 class SwSelectionList;
55 struct SwPosition;
56 struct SwCrsrMoveState;
57 class SwFmt;
58 class SwPrintData;
59 class SwSortedObjs;
60 class SwAnchoredObject;
61 
62 //Jeder FrmTyp findet sich hier in einem Bit wieder.
63 //Die Bits muessen so gesetzt werden, dass mit einer Maskierung festgestellt
64 //werden kann was fuer ein FrmTyp eine Instanz ist _und_ von welchen Klassen
65 //sie abgeleitet ist.
66 //Der Frm hat in der Basisklasse einen Member der von den CToren der
67 //einzelnen Frms entsprechend gesetzt werden muss.
68 #define FRM_ROOT        0x0001
69 #define FRM_PAGE        0x0002
70 #define FRM_COLUMN      0x0004
71 #define FRM_HEADER      0x0008
72 #define FRM_FOOTER      0x0010
73 #define FRM_FTNCONT     0x0020
74 #define FRM_FTN         0x0040
75 #define FRM_BODY        0x0080
76 #define FRM_FLY         0x0100
77 #define FRM_SECTION     0x0200
78 #define FRM_UNUSED      0x0400
79 #define FRM_TAB         0x0800
80 #define FRM_ROW         0x1000
81 #define FRM_CELL        0x2000
82 #define FRM_TXT         0x4000
83 #define FRM_NOTXT       0x8000
84 
85 //Fuer den internen Gebrauch ein paar gebraeuchliche Verknuepfungen.
86 #define FRM_LAYOUT      0x3FFF
87 #define FRM_CNTNT       0xC000
88 #define FRM_FTNBOSS     0x0006
89 #define FRM_ACCESSIBLE (FRM_HEADER|FRM_FOOTER|FRM_FTN|FRM_TXT|FRM_ROOT|FRM_FLY|FRM_TAB|FRM_CELL|FRM_PAGE)
90 
91         //Weils so schon ist das ganze als Bitfeld....
92 //0000 0000 0000 0001   ROOT
93 //0000 0000 0000 0010   PAGE
94 //0000 0000 0000 0100   COLUMN
95 //0000 0000 0000 1000   HEADER
96 //0000 0000 0001 0000   FOOTER
97 //0000 0000 0010 0000   FTNCONT
98 //0000 0000 0100 0000   FTN
99 //0000 0000 1000 0000   BODY
100 //0000 0001 0000 0000   FLY
101 //0000 0010 0000 0000   SECTION
102 //0000 0100 0000 0000   UNUSED
103 //0000 1000 0000 0000   TAB
104 //0001 0000 0000 0000   ROW
105 //0010 0000 0000 0000   CELL
106 //0100 0000 0000 0000   TXT
107 //1000 0000 0000 0000   NOTXT
108 
109 // The type of the frame is internal represented by the 4-bit value nType,
110 // which can expanded to the types above by shifting a bit (0x1 << nType)
111 // Here are the corresponding defines for the compressed representation:
112 
113 #define FRMC_ROOT        0
114 #define FRMC_PAGE        1
115 #define FRMC_COLUMN      2
116 #define FRMC_HEADER      3
117 #define FRMC_FOOTER      4
118 #define FRMC_FTNCONT     5
119 #define FRMC_FTN         6
120 #define FRMC_BODY        7
121 #define FRMC_FLY         8
122 #define FRMC_SECTION     9
123 #define FRMC_UNUSED      10
124 #define FRMC_TAB         11
125 #define FRMC_ROW         12
126 #define FRMC_CELL        13
127 #define FRMC_TXT         14
128 #define FRMC_NOTXT       15
129 
130 #define FRM_NEIGHBOUR   0x2004
131 #define FRM_NOTE_VERT   0x7a60
132 #define FRM_HEADFOOT    0x0018
133 #define FRM_BODYFTNC    0x00a0
134 
135 class SwFrm;
136 typedef long (SwFrm:: *SwFrmGet)() const;
137 typedef sal_Bool (SwFrm:: *SwFrmMax)( long );
138 typedef void (SwFrm:: *SwFrmMakePos)( const SwFrm*, const SwFrm*, sal_Bool );
139 typedef long (*SwOperator)( long, long );
140 typedef void (SwFrm:: *SwFrmSet)( long, long );
141 
142 struct SwRectFnCollection
143 {
144     SwRectGet     fnGetTop;
145     SwRectGet     fnGetBottom;
146     SwRectGet     fnGetLeft;
147     SwRectGet     fnGetRight;
148     SwRectGet     fnGetWidth;
149     SwRectGet     fnGetHeight;
150     SwRectPoint   fnGetPos;
151     SwRectSize    fnGetSize;
152 
153     SwRectSet     fnSetTop;
154     SwRectSet     fnSetBottom;
155     SwRectSet     fnSetLeft;
156     SwRectSet     fnSetRight;
157     SwRectSet     fnSetWidth;
158     SwRectSet     fnSetHeight;
159 
160     SwRectSet     fnSubTop;
161     SwRectSet     fnAddBottom;
162     SwRectSet     fnSubLeft;
163     SwRectSet     fnAddRight;
164     SwRectSet     fnAddWidth;
165     SwRectSet     fnAddHeight;
166 
167     SwRectSet     fnSetPosX;
168     SwRectSet     fnSetPosY;
169 
170     SwFrmGet      fnGetTopMargin;
171     SwFrmGet      fnGetBottomMargin;
172     SwFrmGet      fnGetLeftMargin;
173     SwFrmGet      fnGetRightMargin;
174     SwFrmSet      fnSetXMargins;
175     SwFrmSet      fnSetYMargins;
176     SwFrmGet      fnGetPrtTop;
177     SwFrmGet      fnGetPrtBottom;
178     SwFrmGet      fnGetPrtLeft;
179     SwFrmGet      fnGetPrtRight;
180     SwRectDist    fnTopDist;
181     SwRectDist    fnBottomDist;
182     SwRectDist    fnLeftDist;
183     SwRectDist    fnRightDist;
184     SwFrmMax      fnSetLimit;
185     SwRectMax     fnOverStep;
186 
187     SwRectSetPos  fnSetPos;
188     SwFrmMakePos  fnMakePos;
189     SwOperator    fnXDiff;
190     SwOperator    fnYDiff;
191     SwOperator    fnXInc;
192     SwOperator    fnYInc;
193 
194     SwRectSetTwice fnSetLeftAndWidth;
195     SwRectSetTwice fnSetTopAndHeight;
196 };
197 
198 typedef SwRectFnCollection* SwRectFn;
199 /*
200 extern SwRectFn fnRectHori, fnRectVert, fnRectB2T, fnRectVL2R;
201 #define SWRECTFN( pFrm )    sal_Bool bVert = pFrm->IsVertical(); \
202                             sal_Bool bRev = pFrm->IsReverse(); \
203                             SwRectFn fnRect = bVert ? \
204                                 ( bRev ? fnRectVL2R : fnRectVert ): \
205                                 ( bRev ? fnRectB2T : fnRectHori );
206 #define SWRECTFNX( pFrm )   sal_Bool bVertX = pFrm->IsVertical(); \
207                             sal_Bool bRevX = pFrm->IsReverse(); \
208                             SwRectFn fnRectX = bVertX ? \
209                                 ( bRevX ? fnRectVL2R : fnRectVert ): \
210                                 ( bRevX ? fnRectB2T : fnRectHori );
211 #define SWREFRESHFN( pFrm ) { if( bVert != pFrm->IsVertical() || \
212                                   bRev  != pFrm->IsReverse() ) \
213                                 bVert = pFrm->IsVertical(); \
214                                 bRev = pFrm->IsReverse(); \
215                                 fnRect = bVert ? \
216                                     ( bRev ? fnRectVL2R : fnRectVert ): \
217                                     ( bRev ? fnRectB2T : fnRectHori ); }
218 #define SWRECTFN2( pFrm )   sal_Bool bVert = pFrm->IsVertical(); \
219                             sal_Bool bNeighb = pFrm->IsNeighbourFrm(); \
220                             SwRectFn fnRect = bVert == bNeighb ? \
221                                 fnRectHori : fnRectVert;
222 */
223 
224 //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin
225 extern SwRectFn fnRectHori, fnRectVert, fnRectB2T, fnRectVL2R, fnRectVertL2R;
226 #define SWRECTFN( pFrm )    sal_Bool bVert = pFrm->IsVertical(); \
227                             sal_Bool bRev = pFrm->IsReverse(); \
228                             sal_Bool bVertL2R = pFrm->IsVertLR(); \
229                             SwRectFn fnRect = bVert ? \
230                                 ( bRev ? fnRectVL2R : ( bVertL2R ? fnRectVertL2R : fnRectVert ) ): \
231                                 ( bRev ? fnRectB2T : fnRectHori );
232 #define SWRECTFNX( pFrm )   sal_Bool bVertX = pFrm->IsVertical(); \
233                             sal_Bool bRevX = pFrm->IsReverse(); \
234                             sal_Bool bVertL2RX = pFrm->IsVertLR(); \
235                             SwRectFn fnRectX = bVertX ? \
236                                 ( bRevX ? fnRectVL2R : ( bVertL2RX ? fnRectVertL2R : fnRectVert ) ): \
237                                 ( bRevX ? fnRectB2T : fnRectHori );
238 #define SWREFRESHFN( pFrm ) { if( bVert != pFrm->IsVertical() || \
239                                   bRev  != pFrm->IsReverse() ) \
240                                 bVert = pFrm->IsVertical(); \
241                                 bRev = pFrm->IsReverse(); \
242                                 bVertL2R = pFrm->IsVertLR(); \
243                                 fnRect = bVert ? \
244                                     ( bRev ? fnRectVL2R : ( bVertL2R ? fnRectVertL2R : fnRectVert ) ): \
245                                     ( bRev ? fnRectB2T : fnRectHori ); }
246 #define SWRECTFN2( pFrm )   sal_Bool bVert = pFrm->IsVertical(); \
247                 sal_Bool bVertL2R = pFrm->IsVertLR(); \
248                             sal_Bool bNeighb = pFrm->IsNeighbourFrm(); \
249                             SwRectFn fnRect = bVert == bNeighb ? \
250                                 fnRectHori : ( bVertL2R ? fnRectVertL2R : fnRectVert );
251 //End of SCMS
252 #define POS_DIFF( aFrm1, aFrm2 ) \
253             ( (aFrm1.*fnRect->fnGetTop)() != (aFrm2.*fnRect->fnGetTop)() || \
254             (aFrm1.*fnRect->fnGetLeft)() != (aFrm2.*fnRect->fnGetLeft)() )
255 
256 
257 //Fuer GetNextLeaf/GetPrevLeaf.
258 enum MakePageType
259 {
260     MAKEPAGE_NONE,      //Keine Seite bzw. Fussnote anlegen
261     MAKEPAGE_APPEND,    //Nur ggf. Seite anhaengen
262     MAKEPAGE_INSERT,    //Seite ggf. anhaengen oder einfuegen.
263     MAKEPAGE_FTN,       //Fussnote ggf. einfuegen.
264     MAKEPAGE_NOSECTION  // Don't create section frames
265 };
266 
267 // OD 2004-05-06 #i28701# - replaced by new class <SwSortedObjs>
268 //typedef SdrObject* SdrObjectPtr;
269 //SV_DECL_PTRARR(SwDrawObjs,SdrObjectPtr,1,1);
270 
271 class SwFrm: public SwClient, public SfxBroadcaster
272 {
273     //Der verkappte Frm
274     friend class SwFlowFrm;
275     friend class SwLayoutFrm;       // Sw3FrameIo: fuer pNext, pPrev
276     friend class SwLooping;         // LoopControlling  (layouter.cxx)
277 
278     //Hebt die Lower waehrend eines Spaltenumbaus auf.
279     friend SwFrm *SaveCntnt( SwLayoutFrm *, SwFrm* pStart = NULL );
280     friend void   RestoreCntnt( SwFrm *, SwLayoutFrm *, SwFrm *pSibling, bool bGrow );
281 
282 #if OSL_DEBUG_LEVEL > 1
283     //entfernt leere SwSectionFrms aus einer Kette
284     friend SwFrm* SwClearDummies( SwFrm* pFrm );
285 #endif
286 
287         //Zum validieren eines unsinnig invalidierten in SwCntntFrm::MakeAll
288     friend void ValidateSz( SwFrm *pFrm );
289         // Implementiert in text/txtftn.cxx, verhindert Ftn-Oszillation
290     friend void ValidateTxt( SwFrm *pFrm );
291 
292 //  friend void CalcAnchorAndKeep( SwFlyFrm * );
293 
294     friend void MakeNxt( SwFrm *pFrm, SwFrm *pNxt );
295 
296     //Cache fuer (Umrandungs-)Attribute.
297     static SwCache *pCache;
298     //Solution:Member to identify if acc table should be disposed
299     sal_Bool bIfAccTableShouldDisposing;
300 
301     // --> OD 2006-05-10 #i65250#
302     // frame ID is now in general available - used for layout loop control
303     static sal_uInt32 mnLastFrmId;
304     const  sal_uInt32 mnFrmId;
305     // <--
306 
307     SwRootFrm   *mpRoot;
308     SwLayoutFrm *pUpper;
309     SwFrm       *pNext;
310     SwFrm       *pPrev;
311 
312     SwFrm *_FindNext();
313     SwFrm *_FindPrev();
314 
315     /** method to determine next content frame in the same environment
316         for a flow frame (content frame, table frame, section frame)
317 
318         OD 2005-11-30 #i27138# - adding documentation:
319         Travelling downwards through the layout to determine the next content
320         frame in the same environment. There are several environments in a
321         document, which form a closed context regarding this function. These
322         environments are:
323         - Each page header
324         - Each page footer
325         - Each unlinked fly frame
326         - Each group of linked fly frames
327         - All footnotes
328         - All document body frames
329         OD 2005-11-30 #i27138# - adding parameter <_bInSameFtn>
330         Its default value is <false>. If its value is <true>, the environment
331         'All footnotes' is no longer treated. Instead each footnote is treated
332         as an own environment.
333 
334         @author OD
335 
336         @param _bInSameFtn
337         input parameter - boolean indicating, that the found next content
338         frame has to be in the same footnote frame. This parameter is only
339         relevant for flow frames in footnotes.
340 
341         @return SwCntntFrm*
342         pointer to the found next content frame. It's NULL, if none exists.
343     */
344     SwCntntFrm* _FindNextCnt( const bool _bInSameFtn = false );
345 
346     /** method to determine previous content frame in the same environment
347         for a flow frame (content frame, table frame, section frame)
348 
349         OD 2005-11-30 #i27138#
350         Travelling upwards through the layout to determine the previous content
351         frame in the same environment. There are several environments in a
352         document, which form a closed context regarding this function. These
353         environments are:
354         - Each page header
355         - Each page footer
356         - Each unlinked fly frame
357         - Each group of linked fly frames
358         - All footnotes
359         - All document body frames
360         OD 2005-11-30 #i27138# - adding parameter <_bInSameFtn>
361         Its default value is <false>. If its value is <true>, the environment
362         'All footnotes' is no longer treated. Instead each footnote is treated
363         as an own environment.
364 
365         @author OD
366 
367         @param _bInSameFtn
368         input parameter - boolean indicating, that the found previous content
369         frame has to be in the same footnote frame. This parameter is only
370         relevant for flow frames in footnotes.
371 
372         @return SwCntntFrm*
373         pointer to the found previous content frame. It's NULL, if none exists.
374     */
375     SwCntntFrm* _FindPrevCnt( const bool _bInSameFtn = false );
376 
377 
378     void _UpdateAttrFrm( const SfxPoolItem*, const SfxPoolItem*, sal_uInt8 & );
379     SwFrm* _GetIndNext();
380     void SetDirFlags( sal_Bool bVert );
381 
382     SwFrm( SwFrm & );       //Kopieren ist nicht erlaubt.
383 
384     const SwLayoutFrm* ImplGetNextLayoutLeaf( bool bFwd ) const;
385 
386 protected:
387     SwSortedObjs* pDrawObjs;    //Hier haengen die DrawObjs, kann 0 sein
388 
389     SwRect  aFrm;   //Absolute Dokumentposition und groesse des Frm
390     SwRect  aPrt;   //Position der PrtArea rel zum Frm und groesse der PrtArea
391 
392     sal_uInt16 bFlag01:         1;
393     sal_uInt16 bFlag02:         1;
394     sal_uInt16 bFlag03:         1;
395     sal_uInt16 bFlag04:         1;
396     sal_uInt16 bFlag05:         1;
397     sal_uInt16 bReverse:        1; // Next line above/at the right side instead
398                                // under/at the left side of the previous line.
399     sal_uInt16 bInvalidR2L:     1;
400     sal_uInt16 bDerivedR2L:     1;
401     sal_uInt16 bRightToLeft:    1;
402     sal_uInt16 bInvalidVert:    1;
403     sal_uInt16 bDerivedVert:    1;
404     sal_uInt16 bVertical:       1;
405     //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin
406     sal_uInt16 bVertLR:         1;
407     //End of SCMS
408     sal_uInt16 nType:         4;  //Who am I?
409 
410     sal_Bool bValidPos:         1;
411     sal_Bool bValidPrtArea:     1;
412     sal_Bool bValidSize:        1;
413     sal_Bool bValidLineNum:     1;
414     sal_Bool bFixSize:          1;
415     sal_Bool bUnUsed1:          1;
416     sal_Bool bCompletePaint:    1;  //Frame wird ganz gepaintet wenn sal_True, auch
417                                 //wenn der Inhalt nur teilw. veraendert ist;
418                                 //Bei CntntFrms wird ausschliesslich wenn sal_True
419                                 //der Border (von Action) gemalt.
420     sal_Bool bRetouche:         1;  //Der Frame ist fuer Retusche verantwortlich
421                                 //wenn sal_True.
422 public:
423     virtual uno::Sequence< style::TabStop >  GetTabStopInfo( SwTwips )
424     {
425         return uno::Sequence< style::TabStop >();
426     }
427     sal_Bool bUnUsed2:          1;
428 protected:
429     sal_Bool bInfInvalid:       1;  //InfoFlags sind Invalid.
430     sal_Bool bInfBody:          1;  //Frm steht im DokumentBody.
431     sal_Bool bInfTab:           1;  //Frm steht in einer Tabelle.
432     sal_Bool bInfFly:           1;  //Frm steht in einem Fly.
433     sal_Bool bInfFtn:           1;  //Frm steht in einer Fussnote.
434     sal_Bool bInfSct:           1;  //Frm steht in einem Bereich.
435     sal_Bool bColLocked:        1;  //Grow/Shrink sperren bei spaltigen Section-
436                                 //oder Fly-Frames, wird im Format gesetzt
437 
438     void ColLock()      { bColLocked = sal_True; }
439     void ColUnlock()    { bColLocked = sal_False; }
440 
441     // Only used by SwRootFrm Ctor to get 'this' into mpRoot...
442     void setRootFrm( SwRootFrm* pRoot ) { mpRoot = pRoot; }
443 
444     SwPageFrm *InsertPage( SwPageFrm *pSibling, sal_Bool bFtn );
445     void PrepareMake();
446     void OptPrepareMake();
447     void MakePos();
448     // --> OD 2005-09-28 #b6329202#
449     // method formats next frame of table frame to assure keep attribute.
450     // in case of nested tables method <SwFrm::MakeAll()> is called to
451     // avoid format of superior table frame.
452     friend SwFrm* lcl_FormatNextCntntForKeep( SwTabFrm* pTabFrm );
453     // <--
454     virtual void MakeAll() = 0;
455         //Adjustierung der Frames einer Seite
456     SwTwips AdjustNeighbourhood( SwTwips nDiff, sal_Bool bTst = sal_False );
457 
458 
459         //Aendern nur die Framesize, nicht die PrtArea-SSize
460     virtual SwTwips ShrinkFrm( SwTwips, sal_Bool bTst = sal_False, sal_Bool bInfo = sal_False ) = 0;
461     virtual SwTwips GrowFrm  ( SwTwips, sal_Bool bTst = sal_False, sal_Bool bInfo = sal_False ) = 0;
462 
463     SwModify        *GetDep()       { return GetRegisteredInNonConst(); }
464     const SwModify  *GetDep() const { return GetRegisteredIn(); }
465 
466     SwFrm( SwModify*, SwFrm* );
467 
468     void CheckDir( sal_uInt16 nDir, sal_Bool bVert, sal_Bool bOnlyBiDi, sal_Bool bBrowse );
469 
470     /** enumeration for the different invalidations
471 
472         OD 2004-05-19 #i28701#
473 
474         @author OD
475     */
476     enum InvalidationType
477     {
478         INVALID_SIZE, INVALID_PRTAREA, INVALID_POS, INVALID_LINENUM, INVALID_ALL
479     };
480 
481     /** method to determine, if an invalidation is allowed.
482 
483         OD 2004-05-19 #i28701
484 
485         @author OD
486     */
487     virtual bool _InvalidationAllowed( const InvalidationType _nInvalid ) const;
488 
489     /** method to perform additional actions on an invalidation
490 
491         OD 2004-05-19 #i28701#
492         Method has *only* to contain actions, which has to be performed on
493         *every* assignment of the corresponding flag to <sal_False>.
494 
495         @author OD
496     */
497     virtual void _ActionOnInvalidation( const InvalidationType _nInvalid );
498 
499         //Schatten und Umrandung painten
500     void PaintShadow( const SwRect&, SwRect&, const SwBorderAttrs& ) const;
501     virtual void  Modify( const SfxPoolItem*, const SfxPoolItem* );
502 
503 public:
504     TYPEINFO(); //Bereits in Basisklasse Client drin.
505 
506     sal_uInt16 GetType() const { return 0x1 << nType; }
507 
508     static SwCache &GetCache()                { return *pCache; }
509     static SwCache *GetCachePtr()             { return pCache;  }
510     static void     SetCache( SwCache *pNew ) { pCache = pNew;  }
511 
512         //Aendern die PrtArea-SSize und die FrmSize.
513     SwTwips Shrink( SwTwips, sal_Bool bTst = sal_False, sal_Bool bInfo = sal_False );
514     SwTwips Grow  ( SwTwips, sal_Bool bTst = sal_False, sal_Bool bInfo = sal_False );
515 
516     //Wir brauchen unterschiedliche Methoden (wg. Performance) fuer das
517     //Einfuegenin den Layout Baum:
518 
519     //Einfuegen vor pBehind  oder am Ende der Kette unter pUpper
520     void InsertBefore( SwLayoutFrm* pParent, SwFrm* pBehind );
521     //Einfuegen hinter pBefore oder am Anfang der Kette unter pUpper
522     void InsertBehind( SwLayoutFrm *pParent, SwFrm *pBefore );
523     //Einfuegen vor pBehind oder am Ende der Kette, unter Beruecksichtigung
524     //der Geschwister von pSct
525     void InsertGroupBefore( SwFrm* pParent, SwFrm* pWhere, SwFrm* pSct );
526     void Remove();
527 
528     //For internal use only; wer es anders macht wird
529     //in einen Sack gesteckt und muss zwei Tage drin hocken bleiben.
530     //Fuert Spezialbehandlung fuer _Get[Next|Prev]Leaf() durch (Tabellen).
531     SwLayoutFrm *GetLeaf( MakePageType eMakePage, sal_Bool bFwd );
532     SwLayoutFrm *GetNextLeaf   ( MakePageType eMakePage );
533     SwLayoutFrm *GetNextFtnLeaf( MakePageType eMakePage );
534     SwLayoutFrm *GetNextSctLeaf( MakePageType eMakePage );
535     SwLayoutFrm *GetNextCellLeaf( MakePageType eMakePage );
536     SwLayoutFrm *GetPrevLeaf   ( MakePageType eMakeFtn = MAKEPAGE_FTN );
537     SwLayoutFrm *GetPrevFtnLeaf( MakePageType eMakeFtn = MAKEPAGE_FTN );
538     SwLayoutFrm *GetPrevSctLeaf( MakePageType eMakeFtn = MAKEPAGE_FTN );
539     SwLayoutFrm *GetPrevCellLeaf( MakePageType eMakeFtn = MAKEPAGE_FTN );
540     const SwLayoutFrm *GetLeaf ( MakePageType eMakePage, sal_Bool bFwd,
541                                  const SwFrm *pAnch ) const;
542 
543     sal_Bool WrongPageDesc( SwPageFrm* pNew );
544 
545     // --> OD 2004-07-02 #i28701# - new methods to append/remove drawing objects
546     void AppendDrawObj( SwAnchoredObject& _rNewObj );
547     void RemoveDrawObj( SwAnchoredObject& _rToRemoveObj );
548     // <--
549 
550     //Arbeiten mit der Kette der FlyFrms
551     void  AppendFly( SwFlyFrm *pNew );
552     void  RemoveFly( SwFlyFrm *pToRemove );
553     const SwSortedObjs *GetDrawObjs() const { return pDrawObjs; }
554           SwSortedObjs *GetDrawObjs()         { return pDrawObjs; }
555     // --> OD 2004-07-01 #i28701# - change purpose of method and adjust its name
556     void InvalidateObjs( const bool _bInvaPosOnly,
557                          const bool _bNoInvaOfAsCharAnchoredObjs = true );
558 
559     virtual void PaintBorder( const SwRect&, const SwPageFrm *pPage,
560                               const SwBorderAttrs & ) const;
561     void PaintBaBo( const SwRect&, const SwPageFrm *pPage = 0,
562                     const sal_Bool bLowerBorder = sal_False ) const;
563     void PaintBackground( const SwRect&, const SwPageFrm *pPage,
564                           const SwBorderAttrs &,
565                           const sal_Bool bLowerMode = sal_False,
566                           const sal_Bool bLowerBorder = sal_False ) const;
567     void PaintBorderLine( const SwRect&, const SwRect&, const SwPageFrm*,
568                           const Color *pColor ) const;
569 
570     //Retouche, nicht im Bereich des uebergebenen Rect!
571     void Retouche( const SwPageFrm *pPage, const SwRect &rRect ) const;
572 
573     sal_Bool GetBackgroundBrush( const SvxBrushItem*& rpBrush,
574                              const Color*& rpColor,
575                              SwRect &rOrigRect,
576                              sal_Bool bLowerMode ) const;
577 
578     inline void SetCompletePaint() const;
579     inline void ResetCompletePaint() const;
580     inline sal_Bool IsCompletePaint() const { return bCompletePaint; }
581 
582     inline void SetRetouche() const;
583     inline void ResetRetouche() const;
584     inline sal_Bool IsRetouche() const { return bRetouche; }
585 
586     void SetInfFlags();                 //Setzen der InfoFlags
587     inline void InvalidateInfFlags() { bInfInvalid = sal_True; }
588     inline sal_Bool IsInDocBody() const;    //Benutzen die InfoFlags.
589     inline sal_Bool IsInFtn() const;        //ggf. werden die Flags ermittelt.
590     inline sal_Bool IsInTab() const;
591     inline sal_Bool IsInFly() const;
592     inline sal_Bool IsInSct() const;
593 
594     // If frame is inside a split table row, this function returns
595     // the corresponding row frame in the follow table.
596     const SwRowFrm* IsInSplitTableRow() const;
597 
598     // If frame is inside a follow flow row, this function returns
599     // the corresponding row frame master table
600     const SwRowFrm* IsInFollowFlowRow() const;
601 
602     bool IsInBalancedSection() const;
603 
604     inline sal_Bool IsReverse() const { return bReverse; }
605     inline void SetReverse( sal_Bool bNew ){ bReverse = bNew ? 1 : 0; }
606     inline sal_Bool IsVertical() const;
607     //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin
608     inline sal_Bool IsVertLR() const;
609     //End of SCMS
610     inline sal_Bool GetVerticalFlag() const;
611     inline void SetVertical( sal_Bool bNew ){ bVertical = bNew ? 1 : 0; }
612     //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin
613     inline void SetbVertLR( sal_Bool bNew ) { bVertLR = bNew ? 1 : 0; }
614     //End of SCMS
615     inline void SetDerivedVert( sal_Bool bNew ){ bDerivedVert = bNew ? 1 : 0; }
616     inline void SetInvalidVert( sal_Bool bNew) { bInvalidVert = bNew ? 1 : 0; }
617     inline sal_Bool IsRightToLeft() const;
618     inline sal_Bool GetRightToLeftFlag() const;
619     inline void SetRightToLeft( sal_Bool bNew ){ bRightToLeft = bNew ? 1 : 0; }
620     inline void SetDerivedR2L( sal_Bool bNew ) { bDerivedR2L  = bNew ? 1 : 0; }
621     inline void SetInvalidR2L( sal_Bool bNew ) { bInvalidR2L  = bNew ? 1 : 0; }
622 
623     void CheckDirChange();
624     // returns upper left frame position for LTR and
625     // upper right frame position for Asian / RTL frames
626     Point   GetFrmAnchorPos( sal_Bool bIgnoreFlysAnchoredAtThisFrame ) const;
627 
628     /** determine, if frame is moveable in given environment
629 
630         OD 08.08.2003 #110978#
631         method replaced 'old' method <sal_Bool IsMoveable() const>.
632         Determines, if frame is moveable in given environment. if no environment
633         is given (parameter _pLayoutFrm == 0L), the movability in the actual
634         environment (<this->GetUpper()) is checked.
635 
636         @author OD
637 
638         @param _pLayoutFrm
639         input parameter - given environment (layout frame), in which the movability
640         will be checked. If not set ( == 0L ), actual environment is taken.
641 
642         @return boolean, indicating, if frame is moveable in given environment
643     */
644 //    sal_Bool IsMoveable() const;
645     bool IsMoveable( const SwLayoutFrm* _pLayoutFrm = 0L ) const;
646 
647     //Ist es fuer den (Txt)Frm in der aktuellen Umgebung erlaubt eine
648     //Fussnote einzufuegen (nicht z.B. in wiederholten TabellenHeadlines).
649     sal_Bool IsFtnAllowed() const;
650 
651     virtual void  Format( const SwBorderAttrs *pAttrs = 0 );
652 
653     virtual void  CheckDirection( sal_Bool bVert );
654 
655     void ReinitializeFrmSizeAttrFlags();
656 
657     const SwAttrSet *GetAttrSet() const;
658 
659     inline sal_Bool HasFixSize() const { return bFixSize; }
660     inline void SetFixSize( sal_Bool bNew ) { bFixSize = bNew; }
661 
662     //Prueft alle Seiten ab der Uebergebenen und korrigiert ggf.
663     static void CheckPageDescs( SwPageFrm *pStart, sal_Bool bNotifyFields = sal_True );
664 
665         //Koennen 0 liefern, einmal const einmal nicht
666     SwFrm               *GetNext()  { return pNext; }
667     SwFrm               *GetPrev()  { return pPrev; }
668     SwLayoutFrm         *GetUpper() { return pUpper; }
669     SwRootFrm           *getRootFrm(){ return mpRoot; }
670     SwPageFrm           *FindPageFrm();
671     SwFrm               *FindColFrm();
672     SwFtnBossFrm        *FindFtnBossFrm( sal_Bool bFootnotes = sal_False );
673     SwTabFrm            *ImplFindTabFrm();
674     SwFtnFrm            *ImplFindFtnFrm();
675     SwFlyFrm            *ImplFindFlyFrm();
676     SwSectionFrm        *ImplFindSctFrm();
677     SwFrm               *FindFooterOrHeader();
678     SwFrm               *GetLower();
679     const SwFrm         *GetNext()  const { return pNext; }
680     const SwFrm         *GetPrev()  const { return pPrev; }
681     const SwLayoutFrm   *GetUpper() const { return pUpper; }
682     const SwRootFrm     *getRootFrm()   const { return mpRoot; }
683     inline SwTabFrm     *FindTabFrm();
684     inline SwFtnFrm     *FindFtnFrm();
685     inline SwFlyFrm     *FindFlyFrm();
686     inline SwSectionFrm *FindSctFrm();
687     inline SwFrm        *FindNext();
688     // --> OD 2005-12-01 #i27138# - add parameter <_bInSameFtn>
689     inline SwCntntFrm* FindNextCnt( const bool _bInSameFtn = false );
690     // <--
691     inline SwFrm        *FindPrev();
692     inline const SwPageFrm *FindPageFrm() const;
693     inline const SwFtnBossFrm *FindFtnBossFrm( sal_Bool bFtn = sal_False ) const;
694     inline const SwFrm     *FindColFrm() const;
695     inline const SwFrm     *FindFooterOrHeader() const;
696     inline const SwTabFrm  *FindTabFrm() const;
697     inline const SwFtnFrm  *FindFtnFrm() const;
698     inline const SwFlyFrm  *FindFlyFrm() const;
699     inline const SwSectionFrm *FindSctFrm() const;
700     inline const SwFrm     *FindNext() const;
701     // --> OD 2005-12-01 #i27138# - add parameter <_bInSameFtn>
702     inline const SwCntntFrm* FindNextCnt( const bool _bInSameFtn = false ) const;
703     // <--
704     inline const SwFrm     *FindPrev() const;
705            const SwFrm     *GetLower()  const;
706 
707     /** inline wrapper method for <_FindPrevCnt(..)>
708 
709         OD 2005-11-30 #i27138#
710 
711         @author OD
712     */
713     inline SwCntntFrm* FindPrevCnt( const bool _bInSameFtn = false )
714     {
715         if ( GetPrev() && GetPrev()->IsCntntFrm() )
716             return (SwCntntFrm*)(GetPrev());
717         else
718             return _FindPrevCnt( _bInSameFtn );
719     }
720 
721     /** inline const wrapper method for <_FindPrevCnt(..)>
722 
723         OD 2005-11-30 #i27138#
724 
725         @author OD
726     */
727     inline const SwCntntFrm* FindPrevCnt( const bool _bInSameFtn = false ) const
728     {
729         if ( GetPrev() && GetPrev()->IsCntntFrm() )
730             return (const SwCntntFrm*)(GetPrev());
731         else
732             return const_cast<SwFrm*>(this)->_FindPrevCnt( _bInSameFtn );
733     }
734 
735     // --> OD 2007-09-04 #i79774#, #b6596954#
736     SwFrm* _GetIndPrev() const;
737     SwFrm* GetIndPrev() const
738         { return ( pPrev || !IsInSct() ) ? pPrev : _GetIndPrev(); }
739 //    const SwFrm* GetIndPrev() const { return ((SwFrm*)this)->GetIndPrev(); }
740     // <--
741     SwFrm* GetIndNext()
742         { return ( pNext || !IsInSct() ) ? pNext : _GetIndNext(); }
743     const SwFrm* GetIndNext() const { return ((SwFrm*)this)->GetIndNext(); }
744 
745     sal_uInt16 GetPhyPageNum() const;   //Seitennummer ohne Offset
746     sal_uInt16 GetVirtPageNum() const;  //Seitenummer mit Offset
747     sal_Bool OnRightPage() const { return 0 != GetPhyPageNum() % 2; };
748     sal_Bool WannaRightPage() const;
749 
750 
751     inline const  SwLayoutFrm *GetPrevLayoutLeaf() const;
752     inline const  SwLayoutFrm *GetNextLayoutLeaf() const;
753     inline SwLayoutFrm *GetPrevLayoutLeaf();
754     inline SwLayoutFrm *GetNextLayoutLeaf();
755 
756     inline void Calc() const;       //Hier wird ggf. 'Formatiert'
757     inline void OptCalc() const;    //Hier wird zur Optimierung davon ausgegangen,
758                                     //das die Vorgaenger bereits formatiert sind.
759 
760     inline Point   GetRelPos() const;
761     const  SwRect &Frm() const { return aFrm; }
762     const  SwRect &Prt() const { return aPrt; }
763 
764     // The PaintArea is the area, where content may be displayed.
765     // The margin of the page or the space between columns belongs to her.
766     const SwRect PaintArea() const;
767     // The UnionFrm is the union of frm- and prt-area, normally identical
768     // to the frm-area except the case of negative prt-margins.
769     const SwRect UnionFrm( sal_Bool bBorder = sal_False ) const;
770 
771     //Der Zugriff auf die Member wird hier ausnahmsweiste gestattet,
772     //dies soll aber nicht dazu dienen die Werte wahllos zu veraendern;
773     //es ist nur die einzige Moeglichkeit die Compilerprobleme zu umgehen
774     //(gleiche Methode mal public mal protected).
775     SwRect &Frm() { return aFrm; }
776     SwRect &Prt() { return aPrt; }
777 
778     virtual Size ChgSize( const Size& aNewSize );
779 
780     virtual void Cut() = 0;
781     //Solution:Add a method to change the acc table dispose state.
782     void SetAccTableDispose( sal_Bool bDispose){ bIfAccTableShouldDisposing = bDispose;}
783     virtual void Paste( SwFrm* pParent, SwFrm* pSibling = 0 ) = 0;
784 
785     void ValidateLineNum() { bValidLineNum = sal_True; }
786 
787     sal_Bool GetValidPosFlag()    const { return bValidPos; }
788     sal_Bool GetValidPrtAreaFlag()const { return bValidPrtArea; }
789     sal_Bool GetValidSizeFlag()   const { return bValidSize; }
790     sal_Bool GetValidLineNumFlag()const { return bValidLineNum; }
791     sal_Bool IsValid() const { return bValidPos && bValidSize && bValidPrtArea; }
792 
793     //Invalideren nur den Frm
794     // OD 2004-05-19 #i28701# - add call to method <_ActionOnInvalidation(..)>
795     // for all invalidation methods.
796     // OD 2004-05-19 #i28701# - use method <_InvalidationAllowed(..)> to
797     // decide, if invalidation will to be performed or not.
798     // --> OD 2004-10-08 #i26945# - no additional invalidation, if it's already
799     // invalidate.
800     void _InvalidateSize()
801     {
802         if ( bValidSize && _InvalidationAllowed( INVALID_SIZE ) )
803         {
804             bValidSize = sal_False;
805             _ActionOnInvalidation( INVALID_SIZE );
806         }
807     }
808     void _InvalidatePrt()
809     {
810         if ( bValidPrtArea && _InvalidationAllowed( INVALID_PRTAREA ) )
811         {
812             bValidPrtArea = sal_False;
813             _ActionOnInvalidation( INVALID_PRTAREA );
814         }
815     }
816     void _InvalidatePos()
817     {
818         if ( bValidPos && _InvalidationAllowed( INVALID_POS ) )
819         {
820             bValidPos = sal_False;
821             _ActionOnInvalidation( INVALID_POS );
822         }
823     }
824     void _InvalidateLineNum()
825     {
826         if ( bValidLineNum && _InvalidationAllowed( INVALID_LINENUM ) )
827         {
828             bValidLineNum = sal_False;
829             _ActionOnInvalidation( INVALID_LINENUM );
830         }
831     }
832     void _InvalidateAll()
833     {
834         if ( ( bValidSize || bValidPrtArea || bValidPos ) &&
835              _InvalidationAllowed( INVALID_ALL ) )
836         {
837             bValidSize = bValidPrtArea = bValidPos = sal_False;
838             _ActionOnInvalidation( INVALID_ALL );
839         }
840     }
841     // <--
842     //Benachrichtigen gleich die Seite mit.
843     inline void InvalidateSize();
844     inline void InvalidatePrt();
845     inline void InvalidatePos();
846     inline void InvalidateLineNum();
847     inline void InvalidateAll();
848     void ImplInvalidateSize();
849     void ImplInvalidatePrt();
850     void ImplInvalidatePos();
851     void ImplInvalidateLineNum();
852 
853     inline void InvalidateNextPos( sal_Bool bNoFtn = sal_False );
854     void ImplInvalidateNextPos( sal_Bool bNoFtn = sal_False );
855 
856     /** method to invalidate printing area of next frame
857 
858         OD 09.01.2004 #i11859#
859 
860         @author OD
861     */
862     void InvalidateNextPrtArea();
863 
864     void InvalidatePage( const SwPageFrm *pPage = 0 ) const;
865 
866     virtual bool    FillSelection( SwSelectionList& rList, const SwRect& rRect ) const;
867 
868     virtual sal_Bool    GetCrsrOfst( SwPosition *, Point&,
869                                  SwCrsrMoveState* = 0 ) const;
870     virtual sal_Bool    GetCharRect( SwRect &, const SwPosition&,
871                                  SwCrsrMoveState* = 0 ) const;
872     virtual void Paint( SwRect const&,
873                         SwPrintData const*const pPrintData = NULL ) const;
874 
875     // der "kurze Dienstweg" zwischen den Frames und der Formatierung.
876     // Wer den void* falsch Casted ist selbst schuld!
877     // Auf jedenfall muss der void* auf 0 geprueft werden.
878     virtual void Prepare( const PrepareHint ePrep = PREP_CLEAR,
879                           const void *pVoid = 0, sal_Bool bNotify = sal_True );
880 
881     //sal_True wenn's die richtige Klasse ist, sal_False sonst
882     inline sal_Bool IsLayoutFrm() const;
883     inline sal_Bool IsRootFrm() const;
884     inline sal_Bool IsPageFrm() const;
885     inline sal_Bool IsColumnFrm() const;
886     inline sal_Bool IsFtnBossFrm() const; // Fussnotenbosse sind PageFrms und ColumnFrms
887     inline sal_Bool IsHeaderFrm() const;
888     inline sal_Bool IsFooterFrm() const;
889     inline sal_Bool IsFtnContFrm() const;
890     inline sal_Bool IsFtnFrm() const;
891     inline sal_Bool IsBodyFrm() const;
892     inline sal_Bool IsColBodyFrm() const;   // in layfrm.hxx implementiert, BodyFrm unterhalb ColumnFrm
893     inline sal_Bool IsPageBodyFrm() const;  // in layfrm.hxx implementiert, BodyFrm unterhalb PageFrm
894     inline sal_Bool IsFlyFrm() const;
895     inline sal_Bool IsSctFrm() const;
896     inline sal_Bool IsTabFrm() const;
897     inline sal_Bool IsRowFrm() const;
898     inline sal_Bool IsCellFrm() const;
899     inline sal_Bool IsCntntFrm() const;
900     inline sal_Bool IsTxtFrm() const;
901     inline sal_Bool IsNoTxtFrm() const;
902     inline sal_Bool IsFlowFrm() const;      //Frms deren PrtArea von den Nachbarn
903                                         //abhaengen und die halt im Inhaltsfluss
904                                         //stehen.
905     inline sal_Bool IsRetoucheFrm() const;  //Frms die Retouchefaehig sind bzw. die
906                                         //u.U. hinter sich Retouchieren muessen.
907     inline sal_Bool IsAccessibleFrm() const;
908 
909     void PrepareCrsr();                 //Die CrsrShell darf.
910 
911     //Ist der Frm (bzw. die Section in der er steht) geschuetzt?
912     //Auch Fly in Fly in ... und Fussnoten
913     sal_Bool IsProtected() const;
914 
915     sal_Bool IsColLocked()  const { return bColLocked; }
916 
917     virtual ~SwFrm();
918 
919     // No inline cause we need the function pointers
920     long GetTopMargin() const;
921     long GetBottomMargin() const;
922     long GetLeftMargin() const;
923     long GetRightMargin() const;
924     void SetTopBottomMargins( long, long );
925     void SetBottomTopMargins( long, long );
926     void SetLeftRightMargins( long, long );
927     void SetRightLeftMargins( long, long );
928     void SetLeftAndWidth( long nLeft, long nWidth );
929     void SetTopAndHeight( long nTop, long nHeight );
930     void SetRightAndWidth( long nRight, long nWidth );
931     void SetBottomAndHeight( long nBottom, long nHeight );
932     long GetPrtLeft() const;
933     long GetPrtBottom() const;
934     long GetPrtRight() const;
935     long GetPrtTop() const;
936     sal_Bool SetMinLeft( long );
937     sal_Bool SetMaxBottom( long );
938     sal_Bool SetMaxRight( long );
939     sal_Bool SetMinTop( long );
940     void MakeBelowPos( const SwFrm*, const SwFrm*, sal_Bool );
941     void MakeUpperPos( const SwFrm*, const SwFrm*, sal_Bool );
942     void MakeLeftPos( const SwFrm*, const SwFrm*, sal_Bool );
943     void MakeRightPos( const SwFrm*, const SwFrm*, sal_Bool );
944     inline sal_Bool IsNeighbourFrm() const
945         { return GetType() & FRM_NEIGHBOUR ? sal_True : sal_False; }
946 
947     // --> OD 2006-05-10 #i65250#
948     inline sal_uInt32 GetFrmId() const { return mnFrmId; }
949     inline sal_uInt32 GetLastFrmId() const { return mnLastFrmId; }
950     // <--
951 
952     // NEW TABELS
953     // Some functions for covered/covering table cells. This way unnessessary
954     // includes can be avoided
955     bool IsLeaveUpperAllowed() const;
956     bool IsCoveredCell() const;
957     bool IsInCoveredCell() const;
958 
959     // FME 2007-08-30 #i81146# new loop control
960     bool KnowsFormat( const SwFmt& rFmt ) const;
961     void RegisterToFormat( SwFmt& rFmt );
962     void ValidateThisAndAllLowers( const sal_uInt16 nStage );
963 };
964 
965 inline sal_Bool SwFrm::IsInDocBody() const
966 {
967     if ( bInfInvalid )
968         ((SwFrm*)this)->SetInfFlags();
969     return bInfBody;
970 }
971 inline sal_Bool SwFrm::IsInFtn() const
972 {
973     if ( bInfInvalid )
974         ((SwFrm*)this)->SetInfFlags();
975     return bInfFtn;
976 }
977 inline sal_Bool SwFrm::IsInTab() const
978 {
979     if ( bInfInvalid )
980         ((SwFrm*)this)->SetInfFlags();
981     return bInfTab;
982 }
983 inline sal_Bool SwFrm::IsInFly() const
984 {
985     if ( bInfInvalid )
986         ((SwFrm*)this)->SetInfFlags();
987     return bInfFly;
988 }
989 inline sal_Bool SwFrm::IsInSct() const
990 {
991     if ( bInfInvalid )
992         ((SwFrm*)this)->SetInfFlags();
993     return bInfSct;
994 }
995 sal_Bool SwFrm::IsVertical() const
996 {
997     if( bInvalidVert )
998         ((SwFrm*)this)->SetDirFlags( sal_True );
999     return bVertical != 0;
1000 }
1001 //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin
1002 inline sal_Bool SwFrm::IsVertLR() const
1003 {
1004     return bVertLR != 0;
1005 }
1006 //End of SCMS
1007 sal_Bool SwFrm::GetVerticalFlag() const
1008 {
1009     return bVertical != 0;
1010 }
1011 inline sal_Bool SwFrm::IsRightToLeft() const
1012 {
1013     if( bInvalidR2L )
1014         ((SwFrm*)this)->SetDirFlags( sal_False );
1015     return bRightToLeft != 0;
1016 }
1017 sal_Bool SwFrm::GetRightToLeftFlag() const
1018 {
1019     return bRightToLeft != 0;
1020 }
1021 
1022 inline void SwFrm::SetCompletePaint() const
1023 {
1024     ((SwFrm*)this)->bCompletePaint = sal_True;
1025 }
1026 inline void SwFrm::ResetCompletePaint() const
1027 {
1028     ((SwFrm*)this)->bCompletePaint = sal_False;
1029 }
1030 
1031 inline void SwFrm::SetRetouche() const
1032 {
1033     ((SwFrm*)this)->bRetouche = sal_True;
1034 }
1035 inline void SwFrm::ResetRetouche() const
1036 {
1037     ((SwFrm*)this)->bRetouche = sal_False;
1038 }
1039 
1040 inline SwLayoutFrm *SwFrm::GetNextLayoutLeaf()
1041 {
1042     return (SwLayoutFrm*)((const SwFrm*)this)->GetNextLayoutLeaf();
1043 }
1044 
1045 inline SwLayoutFrm *SwFrm::GetPrevLayoutLeaf()
1046 {
1047     return (SwLayoutFrm*)((const SwFrm*)this)->GetPrevLayoutLeaf();
1048 }
1049 
1050 inline const SwLayoutFrm *SwFrm::GetNextLayoutLeaf() const
1051 {
1052     return ImplGetNextLayoutLeaf( true );
1053 }
1054 
1055 inline const SwLayoutFrm *SwFrm::GetPrevLayoutLeaf() const
1056 {
1057     return ImplGetNextLayoutLeaf( false );
1058 }
1059 
1060 inline void SwFrm::InvalidateSize()
1061 {
1062     if ( bValidSize )
1063         ImplInvalidateSize();
1064 }
1065 inline void SwFrm::InvalidatePrt()
1066 {
1067     if ( bValidPrtArea )
1068         ImplInvalidatePrt();
1069 }
1070 inline void SwFrm::InvalidatePos()
1071 {
1072     if ( bValidPos )
1073         ImplInvalidatePos();
1074 }
1075 inline void SwFrm::InvalidateLineNum()
1076 {
1077     if ( bValidLineNum )
1078         ImplInvalidateLineNum();
1079 }
1080 
1081 inline void SwFrm::InvalidateAll()
1082 {
1083     if ( _InvalidationAllowed( INVALID_ALL ) )
1084     {
1085         if ( bValidPrtArea && bValidSize && bValidPos  )
1086             ImplInvalidatePos();
1087         bValidPrtArea = bValidSize = bValidPos = sal_False;
1088 
1089         // OD 2004-05-19 #i28701#
1090         _ActionOnInvalidation( INVALID_ALL );
1091     }
1092 }
1093 
1094 inline void SwFrm::InvalidateNextPos( sal_Bool bNoFtn )
1095 {
1096     if ( pNext && !pNext->IsSctFrm() )
1097         pNext->InvalidatePos();
1098 #ifndef C30 // vielleicht geht es ja bei C40 ?
1099     else
1100         ImplInvalidateNextPos( bNoFtn );
1101 #else
1102     if ( !pNext )
1103         ImplInvalidateNextPos( bNoFtn );
1104 #endif
1105 }
1106 
1107 inline void SwFrm::Calc() const
1108 {
1109     if ( !bValidPos || !bValidPrtArea || !bValidSize )
1110         ((SwFrm*)this)->PrepareMake();
1111 }
1112 inline void SwFrm::OptCalc() const
1113 {
1114     if ( !bValidPos || !bValidPrtArea || !bValidSize )
1115         ((SwFrm*)this)->OptPrepareMake();
1116 }
1117 
1118 inline Point SwFrm::GetRelPos() const
1119 {
1120     Point aRet( aFrm.Pos() );
1121         //hier wird gecasted, weil die Klasse SwLayoutFrm nur vorward-
1122         //declariert ist.
1123     aRet -= ((SwFrm*)GetUpper())->Prt().Pos();
1124     aRet -= ((SwFrm*)GetUpper())->Frm().Pos();
1125     return aRet;
1126 }
1127 
1128 inline const SwPageFrm *SwFrm::FindPageFrm() const
1129 {
1130     return ((SwFrm*)this)->FindPageFrm();
1131 }
1132 inline const SwFrm *SwFrm::FindColFrm() const
1133 {
1134     return ((SwFrm*)this)->FindColFrm();
1135 }
1136 inline const SwFrm *SwFrm::FindFooterOrHeader() const
1137 {
1138     return ((SwFrm*)this)->FindFooterOrHeader();
1139 }
1140 inline SwTabFrm *SwFrm::FindTabFrm()
1141 {
1142     return IsInTab() ? ImplFindTabFrm() : 0;
1143 }
1144 inline const SwFtnBossFrm *SwFrm::FindFtnBossFrm( sal_Bool bFtn ) const
1145 {
1146     return ((SwFrm*)this)->FindFtnBossFrm( bFtn );
1147 }
1148 inline SwFtnFrm *SwFrm::FindFtnFrm()
1149 {
1150     return IsInFtn() ? ImplFindFtnFrm() : 0;
1151 }
1152 inline SwFlyFrm *SwFrm::FindFlyFrm()
1153 {
1154     return IsInFly() ? ImplFindFlyFrm() : 0;
1155 }
1156 inline SwSectionFrm *SwFrm::FindSctFrm()
1157 {
1158     return IsInSct() ? ImplFindSctFrm() : 0;
1159 }
1160 
1161 inline const SwTabFrm *SwFrm::FindTabFrm() const
1162 {
1163     return IsInTab() ? ((SwFrm*)this)->ImplFindTabFrm() : 0;
1164 }
1165 inline const SwFtnFrm *SwFrm::FindFtnFrm() const
1166 {
1167     return IsInFtn() ? ((SwFrm*)this)->ImplFindFtnFrm() : 0;
1168 }
1169 inline const SwFlyFrm *SwFrm::FindFlyFrm() const
1170 {
1171     return IsInFly() ? ((SwFrm*)this)->ImplFindFlyFrm() : 0;
1172 }
1173 inline const SwSectionFrm *SwFrm::FindSctFrm() const
1174 {
1175     return IsInSct() ? ((SwFrm*)this)->ImplFindSctFrm() : 0;
1176 }
1177 inline SwFrm *SwFrm::FindNext()
1178 {
1179     if ( pNext )
1180         return pNext;
1181     else
1182         return _FindNext();
1183 }
1184 inline const SwFrm *SwFrm::FindNext() const
1185 {
1186     if ( pNext )
1187         return pNext;
1188     else
1189         return ((SwFrm*)this)->_FindNext();
1190 }
1191 // --> OD 2005-12-01 #i27138# - add parameter <_bInSameFtn>
1192 inline SwCntntFrm *SwFrm::FindNextCnt( const bool _bInSameFtn )
1193 {
1194     if ( pNext && pNext->IsCntntFrm() )
1195         return (SwCntntFrm*)pNext;
1196     else
1197         return _FindNextCnt( _bInSameFtn );
1198 }
1199 // <--
1200 // --> OD 2005-12-01 #i27138# - add parameter <_bInSameFtn>
1201 inline const SwCntntFrm *SwFrm::FindNextCnt( const bool _bInSameFtn ) const
1202 {
1203     if ( pNext && pNext->IsCntntFrm() )
1204         return (SwCntntFrm*)pNext;
1205     else
1206         return ((SwFrm*)this)->_FindNextCnt( _bInSameFtn );
1207 }
1208 // <--
1209 inline SwFrm *SwFrm::FindPrev()
1210 {
1211     if ( pPrev && !pPrev->IsSctFrm() )
1212         return pPrev;
1213     else
1214         return _FindPrev();
1215 }
1216 inline const SwFrm *SwFrm::FindPrev() const
1217 {
1218     if ( pPrev && !pPrev->IsSctFrm() )
1219         return pPrev;
1220     else
1221         return ((SwFrm*)this)->_FindPrev();
1222 }
1223 
1224 
1225 inline sal_Bool SwFrm::IsLayoutFrm() const
1226 {
1227     return GetType() & FRM_LAYOUT ? sal_True : sal_False;
1228 }
1229 inline sal_Bool SwFrm::IsRootFrm() const
1230 {
1231     return nType == FRMC_ROOT;
1232 }
1233 inline sal_Bool SwFrm::IsPageFrm() const
1234 {
1235     return nType == FRMC_PAGE;
1236 }
1237 inline sal_Bool SwFrm::IsColumnFrm() const
1238 {
1239     return nType == FRMC_COLUMN;
1240 }
1241 inline sal_Bool SwFrm::IsFtnBossFrm() const
1242 {
1243     return GetType() & FRM_FTNBOSS ? sal_True : sal_False;
1244 }
1245 inline sal_Bool SwFrm::IsHeaderFrm() const
1246 {
1247     return nType == FRMC_HEADER;
1248 }
1249 inline sal_Bool SwFrm::IsFooterFrm() const
1250 {
1251     return nType == FRMC_FOOTER;
1252 }
1253 inline sal_Bool SwFrm::IsFtnContFrm() const
1254 {
1255     return nType == FRMC_FTNCONT;
1256 }
1257 inline sal_Bool SwFrm::IsFtnFrm() const
1258 {
1259     return nType == FRMC_FTN;
1260 }
1261 inline sal_Bool SwFrm::IsBodyFrm() const
1262 {
1263     return nType == FRMC_BODY;
1264 }
1265 inline sal_Bool SwFrm::IsFlyFrm() const
1266 {
1267     return nType == FRMC_FLY;
1268 }
1269 inline sal_Bool SwFrm::IsSctFrm() const
1270 {
1271     return nType == FRMC_SECTION;
1272 }
1273 inline sal_Bool SwFrm::IsTabFrm() const
1274 {
1275     return nType == FRMC_TAB;
1276 }
1277 inline sal_Bool SwFrm::IsRowFrm() const
1278 {
1279     return nType == FRMC_ROW;
1280 }
1281 inline sal_Bool SwFrm::IsCellFrm() const
1282 {
1283     return nType == FRMC_CELL;
1284 }
1285 inline sal_Bool SwFrm::IsCntntFrm() const
1286 {
1287     return GetType() & FRM_CNTNT ? sal_True : sal_False;
1288 }
1289 inline sal_Bool SwFrm::IsTxtFrm() const
1290 {
1291     return nType == FRMC_TXT;
1292 }
1293 inline sal_Bool SwFrm::IsNoTxtFrm() const
1294 {
1295     return nType == FRMC_NOTXT;
1296 }
1297 inline sal_Bool SwFrm::IsFlowFrm() const
1298 {
1299     return GetType() & 0xCA00 ? sal_True : sal_False;   //TabFrm, CntntFrm, SectionFrm
1300 }
1301 inline sal_Bool SwFrm::IsRetoucheFrm() const
1302 {
1303     return GetType() & 0xCA40 ? sal_True : sal_False;   //TabFrm, CntntFrm, SectionFrm, Ftnfrm
1304 }
1305 inline sal_Bool SwFrm::IsAccessibleFrm() const
1306 {
1307     return GetType() & FRM_ACCESSIBLE ? sal_True : sal_False;
1308 }
1309 #endif
1310