xref: /aoo42x/main/sw/source/core/inc/frmtool.hxx (revision 56b35d86)
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 _FRMTOOL_HXX
24 #define _FRMTOOL_HXX
25 #include "swtypes.hxx"
26 #include "layfrm.hxx"
27 #include "frmatr.hxx"
28 #include "swcache.hxx"
29 // --> OD 2008-12-04 #i96772#
30 #include <editeng/lrspitem.hxx>
31 // <--
32 
33 class SwPageFrm;
34 class SwFlyFrm;
35 class SwCntntFrm;
36 class SwRootFrm;
37 class SwDoc;
38 class SwAttrSet;
39 class SdrObject;
40 class BigInt;
41 class SvxBrushItem;
42 class SdrMarkList;
43 class SwNodeIndex;
44 class OutputDevice;
45 class SwPageDesc;
46 class SwTableBox;
47 struct SwFindRowSpanCacheObj;
48 
49 #if defined(MSC)
50 #define MA_FASTCALL __fastcall
51 #else
52 #define MA_FASTCALL
53 #endif
54 
55 #define WEIT_WECH 		LONG_MAX - 20000		//Initale Position der Flys.
56 #define BROWSE_HEIGHT   56700L * 10L               //10 Meter
57 //#define BROWSE_HEIGHT   1440L * 45L     // 45 inch, maximum size for pdf files
58 
59 #define GRFNUM_NO 0
60 #define GRFNUM_YES 1
61 #define GRFNUM_REPLACE 2
62 
63 //Painten des Hintergrunds. Mit Brush oder Graphic.
64 // OD 05.08.2002 #99657# - add 6th parameter to indicate that method should
65 //     consider background transparency, saved in the color of the brush item
66 void MA_FASTCALL DrawGraphic(
67     const SvxBrushItem *,
68     OutputDevice *,
69     const SwRect &rOrg,
70     const SwRect &rOut,
71     const sal_uInt8 nGrfNum = GRFNUM_NO,
72     const sal_Bool bConsiderBackgroundTransparency = sal_False );
73 bool MA_FASTCALL DrawFillAttributes(
74     const drawinglayer::attribute::SdrAllFillAttributesHelperPtr& rFillAttributes,
75     const SwRect& rOriginalLayoutRect,
76     const SwRect& rPaintRect,
77     OutputDevice& rOut);
78 
79 // OD 24.01.2003 #106593# - method to align rectangle
80 // Created declaration here to avoid <extern> declarations
81 void MA_FASTCALL SwAlignRect( SwRect &rRect, ViewShell *pSh );
82 
83 // OD 24.01.2003 #106593# - method to align graphic rectangle
84 // Created declaration here to avoid <extern> declarations
85 void SwAlignGrfRect( SwRect *pGrfRect, const OutputDevice &rOut );
86 
87 //Fly besorgen, wenn keine List hineingereicht wird, wir die der aktuellen
88 //Shell benutzt.
89 //Implementierung in feshview.cxx
90 SwFlyFrm *GetFlyFromMarked( const SdrMarkList *pLst, ViewShell *pSh );
91 
92 //Nicht gleich die math.lib anziehen.
93 sal_uLong MA_FASTCALL SqRt( BigInt nX );
94 
95 SwFrm *SaveCntnt( SwLayoutFrm *pLay, SwFrm *pStart );
96 void RestoreCntnt( SwFrm *pSav, SwLayoutFrm *pParent, SwFrm *pSibling, bool bGrow );
97 
98 //CntntNodes besorgen, CntntFrms erzeugen und in den LayFrm haengen.
99 void MA_FASTCALL _InsertCnt( SwLayoutFrm *pLay, SwDoc *pDoc, sal_uLong nIndex,
100 				 sal_Bool bPages = sal_False, sal_uLong nEndIndex = 0,
101 				 SwFrm *pPrv = 0 );
102 
103 //Erzeugen der Frames fuer einen bestimmten Bereich, verwendet _InsertCnt
104 void MakeFrms( SwDoc *pDoc, const SwNodeIndex &rSttIdx,
105 							const SwNodeIndex &rEndIdx );
106 
107 //Um z.B. fuer Tabelleheadlines das Erzeugen der Flys in _InsertCnt zu unterbinden.
108 extern sal_Bool bDontCreateObjects;
109 
110 //Fuer FlyCnts, siehe SwFlyAtCntFrm::MakeAll()
111 extern sal_Bool bSetCompletePaintOnInvalidate;
112 
113 //Fuer Tabelleneinstellung per Tastatur.
114 long MA_FASTCALL CalcRowRstHeight( SwLayoutFrm *pRow );
115 long MA_FASTCALL CalcHeightWidthFlys( const SwFrm *pFrm ); 	//MA_FLY_HEIGHT
116 
117 //Neue Seite einsetzen
118 SwPageFrm * MA_FASTCALL InsertNewPage( SwPageDesc &rDesc, SwFrm *pUpper,
119 						  sal_Bool bOdd, sal_Bool bInsertEmpty, sal_Bool bFtn,
120 						  SwFrm *pSibling );
121 
122 //Flys bei der Seite anmelden.
123 void RegistFlys( SwPageFrm*, const SwLayoutFrm* );
124 
125 //Benachrichtung des Fly Hintergrundes wenn Notwendig.
126 void Notify( SwFlyFrm *pFly, SwPageFrm *pOld, const SwRect &rOld,
127              const SwRect* pOldRect = 0 );
128 
129 void Notify_Background( const SdrObject* pObj,
130                         SwPageFrm* pPage,
131                         const SwRect& rRect,
132                         const PrepareHint eHint,
133                         const sal_Bool bInva );
134 
135 const SwFrm* GetVirtualUpper( const SwFrm* pFrm, const Point& rPos );
136 
137 sal_Bool Is_Lower_Of( const SwFrm *pCurrFrm, const SdrObject* pObj );
138 
139 const SwFrm *FindKontext( const SwFrm *pFrm, sal_uInt16 nAdditionalKontextTyp );
140 
141 sal_Bool IsFrmInSameKontext( const SwFrm *pInnerFrm, const SwFrm *pFrm );
142 
143 const SwFrm * MA_FASTCALL FindPage( const SwRect &rRect, const SwFrm *pPage );
144 
145 // JP 07.05.98: wird von SwCntntNode::GetFrm und von SwFlyFrm::GetFrm
146 //				gerufen
147 SwFrm* GetFrmOfModify( const SwRootFrm* pLayout, SwModify const&, sal_uInt16 const nFrmType, const Point* = 0,
148 						const SwPosition *pPos = 0,
149 						const sal_Bool bCalcFrm = sal_False );
150 
151 //Sollen ExtraDaten (Reline-Strich, Zeilennummern) gepaintet werden?
152 sal_Bool IsExtraData( const SwDoc *pDoc );
153 
154 // OD 14.03.2003 #i11760# - method declaration <CalcCntnt(..)>
155 void CalcCntnt( SwLayoutFrm *pLay,
156                 bool bNoColl = false,
157                 bool bNoCalcFollow = false );
158 
159 
160 //Die Notify-Klassen merken sich im CTor die aktuellen Groessen und fuehren
161 //im DTor ggf. die notwendigen Benachrichtigungen durch.
162 
163 class SwFrmNotify
164 {
165 protected:
166 	SwFrm *pFrm;
167 	const SwRect aFrm;
168 	const SwRect aPrt;
169     SwTwips mnFlyAnchorOfst;
170     SwTwips mnFlyAnchorOfstNoWrap;
171 	sal_Bool     bHadFollow;
172 	sal_Bool	 bInvaKeep;
173 	sal_Bool	 bValidSize;
174 protected:
175     // --> OD 2005-07-29 #i49383#
176     bool mbFrmDeleted;
177     // <--
178 
179 public:
180 	SwFrmNotify( SwFrm *pFrm );
181 	~SwFrmNotify();
182 
Frm() const183 	const SwRect &Frm() const { return aFrm; }
Prt() const184 	const SwRect &Prt() const { return aPrt; }
SetInvaKeep()185 	void SetInvaKeep() { bInvaKeep = sal_True; }
186     // --> OD 2005-07-29 #i49383#
FrmDeleted()187     void FrmDeleted()
188     {
189         mbFrmDeleted = true;
190     }
191     // <--
192 };
193 
194 class SwLayNotify : public SwFrmNotify
195 {
196     sal_Bool bLowersComplete;
197 
GetLay()198 	SwLayoutFrm *GetLay() { return (SwLayoutFrm*)pFrm; }
199 public:
200 	SwLayNotify( SwLayoutFrm *pLayFrm );
201 	~SwLayNotify();
202 
SetLowersComplete(sal_Bool b)203     void SetLowersComplete( sal_Bool b ) { bLowersComplete = b; }
IsLowersComplete()204 	sal_Bool IsLowersComplete() 		 { return bLowersComplete; }
205 };
206 
207 class SwFlyNotify : public SwLayNotify
208 {
209 	SwPageFrm *pOldPage;
210 	const SwRect aFrmAndSpace;
GetFly()211 	SwFlyFrm *GetFly() { return (SwFlyFrm*)pFrm; }
212 public:
213 	SwFlyNotify( SwFlyFrm *pFlyFrm );
214 	~SwFlyNotify();
215 
GetOldPage() const216 	SwPageFrm *GetOldPage() const { return pOldPage; }
217 };
218 
219 class SwCntntNotify : public SwFrmNotify
220 {
221 private:
222     // OD 08.01.2004 #i11859#
223     bool    mbChkHeightOfLastLine;
224     SwTwips mnHeightOfLastLine;
225 
226     // OD 2004-02-26 #i25029#
227     bool        mbInvalidatePrevPrtArea;
228     bool        mbBordersJoinedWithPrev;
229 
GetCnt()230 	SwCntntFrm *GetCnt() { return (SwCntntFrm*)pFrm; }
231 
232 public:
233 	SwCntntNotify( SwCntntFrm *pCntFrm );
234 	~SwCntntNotify();
235 
236     // OD 2004-02-26 #i25029#
SetInvalidatePrevPrtArea()237     void SetInvalidatePrevPrtArea()
238     {
239         mbInvalidatePrevPrtArea = true;
240     }
241 
SetBordersJoinedWithPrev()242     void SetBordersJoinedWithPrev()
243     {
244         mbBordersJoinedWithPrev = true;
245     }
246 };
247 
248 //SwBorderAttrs kapselt die Berechnung fuer die Randattribute inclusive
249 //Umrandung. Die Attribute und die errechneten Werte werden gecached.
250 //Neu: Die gesammte Klasse wird gecached.
251 
252 //!!!Achtung: Wenn weitere Attribute gecached werden muss unbedingt die
253 //Methode Modify::Modify mitgepflegt werden!!!
254 
255 // OD 23.01.2003 #106895# - delete old method <SwBorderAttrs::CalcRight()> and
256 // the stuff that belongs to it.
257 class SwBorderAttrs : public SwCacheObj
258 {
259 	const SwAttrSet		 &rAttrSet;
260 	const SvxULSpaceItem &rUL;
261     // --> OD 2008-12-04 #i96772#
262     SvxLRSpaceItem rLR;
263     // <--
264 	const SvxBoxItem	 &rBox;
265 	const SvxShadowItem  &rShadow;
266 	const Size			  aFrmSize;		//Die FrmSize
267 
268 	sal_Bool bBorderDist	:1;				//Ist's ein Frm der auch ohne Linie
269 										//einen Abstand haben kann?
270 
271 	//Mit den Folgenden Bools werden die gecache'ten Werte fuer UNgueltig
272 	//erklaert - bis sie einmal berechnet wurden.
273 	sal_Bool bTopLine		:1;
274 	sal_Bool bBottomLine	:1;
275 	sal_Bool bLeftLine		:1;
276 	sal_Bool bRightLine		:1;
277 	sal_Bool bTop			:1;
278 	sal_Bool bBottom		:1;
279 	sal_Bool bLine			:1;
280 
281 	sal_Bool bIsLine		:1;	//Umrandung an mind. einer Kante?
282 
283 	sal_Bool bCacheGetLine		  :1; //GetTopLine(), GetBottomLine() cachen?
284 	sal_Bool bCachedGetTopLine	  :1; //GetTopLine() gecached?
285     sal_Bool bCachedGetBottomLine :1; //GetBottomLine() gecached?
286     // OD 21.05.2003 #108789# - booleans indicating, if values <bJoinedWithPrev>
287     //          and <bJoinedWithNext> are cached and valid.
288     //          Caching depends on value of <bCacheGetLine>.
289     mutable sal_Bool bCachedJoinedWithPrev :1;
290     mutable sal_Bool bCachedJoinedWithNext :1;
291     // OD 21.05.2003 #108789# - booleans indicating, if borders are joined
292     //          with previous/next frame.
293     sal_Bool bJoinedWithPrev :1;
294     sal_Bool bJoinedWithNext :1;
295 
296 	//Die gecache'ten Werte, undefiniert bis sie einmal berechnet wurden.
297 	sal_uInt16 nTopLine,
298 		   nBottomLine,
299 		   nLeftLine,
300 		   nRightLine,
301 		   nTop,
302 		   nBottom,
303 		   nGetTopLine,
304 		   nGetBottomLine;
305 
306 	//Nur die Lines + Shadow errechnen.
307 	void _CalcTopLine();
308 	void _CalcBottomLine();
309 	void _CalcLeftLine();
310 	void _CalcRightLine();
311 
312 	//Lines + Shadow + Abstaende
313 	void _CalcTop();
314 	void _CalcBottom();
315 
316 	void _IsLine();
317 
318     // OD 2004-02-26 #i25029# - add optional 2nd parameter <_pPrevFrm>
319     // If set, its value is taken for testing, if borders/shadow have to joined
320     // with previous frame.
321     void _GetTopLine   ( const SwFrm& _rFrm,
322                          const SwFrm* _pPrevFrm = 0L );
323     void _GetBottomLine( const SwFrm& _rFrm );
324 
325     // OD 21.05.2003 #108789# - private methods to calculate cached values
326     // <bJoinedWithPrev> and <bJoinedWithNext>.
327     // OD 2004-02-26 #i25029# - add optional 2nd parameter <_pPrevFrm>
328     // If set, its value is taken for testing, if borders/shadow have to joined
329     // with previous frame.
330     void _CalcJoinedWithPrev( const SwFrm& _rFrm,
331                               const SwFrm* _pPrevFrm = 0L );
332     void _CalcJoinedWithNext( const SwFrm& _rFrm );
333 
334     // OD 21.05.2003 #108789# - internal helper method for methods
335     // <_CalcJoinedWithPrev> and <_CalcJoinedWithNext>.
336     sal_Bool _JoinWithCmp( const SwFrm& _rCallerFrm,
337                        const SwFrm& _rCmpFrm ) const;
338 
339 	 //Rechte und linke Linie sowie LRSpace gleich?
340     // OD 21.05.2003 #108789# - change name of 1st parameter - "rAttrs" -> "rCmpAttrs".
341     sal_Bool CmpLeftRight( const SwBorderAttrs &rCmpAttrs,
342                        const SwFrm *pCaller,
343 					   const SwFrm *pCmp ) const;
344 
345 public:
346 	DECL_FIXEDMEMPOOL_NEWDEL(SwBorderAttrs)
347 
348 	SwBorderAttrs( const SwModify *pOwner, const SwFrm *pConstructor );
349 	~SwBorderAttrs();
350 
GetAttrSet() const351 	inline const SwAttrSet		&GetAttrSet() const { return rAttrSet;	}
GetULSpace() const352 	inline const SvxULSpaceItem &GetULSpace() const { return rUL;		}
GetLRSpace() const353 	inline const SvxLRSpaceItem &GetLRSpace() const { return rLR;	  	}
GetBox() const354 	inline const SvxBoxItem 	&GetBox()	  const { return rBox;		}
GetShadow() const355 	inline const SvxShadowItem	&GetShadow()  const { return rShadow;	}
356 
357 	inline sal_uInt16 CalcTopLine() const;
358 	inline sal_uInt16 CalcBottomLine() const;
359 	inline sal_uInt16 CalcLeftLine() const;
360 	inline sal_uInt16 CalcRightLine() const;
361 	inline sal_uInt16 CalcTop() const;
362 	inline sal_uInt16 CalcBottom() const;
363 		   long CalcLeft( const SwFrm *pCaller ) const;
364            long CalcRight( const SwFrm *pCaller ) const;
365 
366 	inline sal_Bool IsLine() const;
367 
GetSize() const368 	inline const Size &GetSize()	 const { return aFrmSize; }
369 
IsBorderDist() const370 	inline sal_Bool IsBorderDist() const { return bBorderDist; }
371 
372 	//Sollen obere bzw. untere Umrandung fuer den Frm ausgewertet werden?
373     // OD 2004-02-26 #i25029# - add optional 2nd parameter <_pPrevFrm>
374     // If set, its value is taken for testing, if borders/shadow have to joined
375     // with previous frame.
376     inline sal_uInt16 GetTopLine   ( const SwFrm& _rFrm,
377                                  const SwFrm* _pPrevFrm = 0L ) const;
378     inline sal_uInt16 GetBottomLine( const SwFrm& _rFrm ) const;
379 	inline void	  SetGetCacheLine( sal_Bool bNew ) const;
380     // OD 21.05.2003 #108789# - accessors for cached values <bJoinedWithPrev>
381     // and <bJoinedWithPrev>
382     // OD 2004-02-26 #i25029# - add optional 2nd parameter <_pPrevFrm>
383     // If set, its value is taken for testing, if borders/shadow have to joined
384     // with previous frame.
385     sal_Bool JoinedWithPrev( const SwFrm& _rFrm,
386                          const SwFrm* _pPrevFrm = 0L ) const;
387     sal_Bool JoinedWithNext( const SwFrm& _rFrm ) const;
388 };
389 
390 class SwBorderAttrAccess : public SwCacheAccess
391 {
392 	const SwFrm *pConstructor;		//opt: Zur weitergabe an SwBorderAttrs
393 protected:
394 	virtual SwCacheObj *NewObj();
395 
396 public:
397 	SwBorderAttrAccess( SwCache &rCache, const SwFrm *pOwner );
398 
399 	SwBorderAttrs *Get();
400 };
401 
402 //---------------------------------------------------------------------
403 //Iterator fuer die DrawObjecte einer Seite. Die Objecte werden Nach ihrer
404 //Z-Order iteriert.
405 //Das iterieren ist nicht eben billig, denn fuer alle Operationen muss jeweils
406 //ueber das gesamte SortArray iteriert werden.
407 class SwOrderIter
408 {
409 	const SwPageFrm *pPage;
410 	const SdrObject *pCurrent;
411 	const sal_Bool bFlysOnly;
412 public:
413 	SwOrderIter( const SwPageFrm *pPage, sal_Bool bFlysOnly = sal_True );
414 
Current(const SdrObject * pNew)415 	void 			 Current( const SdrObject *pNew ) { pCurrent = pNew; }
Current() const416 	const SdrObject *Current()	  const { return pCurrent; }
operator ()() const417 	const SdrObject *operator()() const { return pCurrent; }
418 	const SdrObject *Top();
419 	const SdrObject *Bottom();
420 	const SdrObject *Next();
421 	const SdrObject *Prev();
422 };
423 
424 
425 class StackHack
426 {
427 	static sal_uInt8 nCnt;
428 	static sal_Bool bLocked;
429 public:
StackHack()430 	StackHack()
431 	{
432 		if ( ++StackHack::nCnt > 50 )
433 			StackHack::bLocked = sal_True;
434 	}
~StackHack()435 	~StackHack()
436 	{
437         if ( --StackHack::nCnt < 5 )
438 			StackHack::bLocked = sal_False;
439 	}
440 
IsLocked()441 	static sal_Bool IsLocked()	{ return StackHack::bLocked; }
Count()442 	static sal_uInt8 Count()		{ return StackHack::nCnt; }
443 };
444 
445 
446 //Sollen obere bzw. untere Umrandung fuer den Frm ausgewertet werden?
447 // OD 2004-02-26 #i25029# - add optional 2nd parameter <_pPrevFrm>
448 // If set, its value is taken for testing, if borders/shadow have to joined
449 // with previous frame.
GetTopLine(const SwFrm & _rFrm,const SwFrm * _pPrevFrm) const450 inline sal_uInt16 SwBorderAttrs::GetTopLine ( const SwFrm& _rFrm,
451                                           const SwFrm* _pPrevFrm ) const
452 {
453     if ( !bCachedGetTopLine || _pPrevFrm )
454     {
455         const_cast<SwBorderAttrs*>(this)->_GetTopLine( _rFrm, _pPrevFrm );
456     }
457 	return nGetTopLine;
458 }
GetBottomLine(const SwFrm & _rFrm) const459 inline sal_uInt16 SwBorderAttrs::GetBottomLine( const SwFrm& _rFrm ) const
460 {
461 	if ( !bCachedGetBottomLine )
462         const_cast<SwBorderAttrs*>(this)->_GetBottomLine( _rFrm );
463 	return nGetBottomLine;
464 }
SetGetCacheLine(sal_Bool bNew) const465 inline void	SwBorderAttrs::SetGetCacheLine( sal_Bool bNew ) const
466 {
467 	((SwBorderAttrs*)this)->bCacheGetLine = bNew;
468 	((SwBorderAttrs*)this)->bCachedGetBottomLine =
469 	((SwBorderAttrs*)this)->bCachedGetTopLine = sal_False;
470     // OD 21.05.2003 #108789# - invalidate cache for values <bJoinedWithPrev>
471     // and <bJoinedWithNext>.
472     bCachedJoinedWithPrev = sal_False;
473     bCachedJoinedWithNext = sal_False;
474 }
475 
CalcTopLine() const476 inline sal_uInt16 SwBorderAttrs::CalcTopLine() const
477 {
478 	if ( bTopLine )
479 		((SwBorderAttrs*)this)->_CalcTopLine();
480 	return nTopLine;
481 }
CalcBottomLine() const482 inline sal_uInt16 SwBorderAttrs::CalcBottomLine() const
483 {
484 	if ( bBottomLine )
485 		((SwBorderAttrs*)this)->_CalcBottomLine();
486 	return nBottomLine;
487 }
CalcLeftLine() const488 inline sal_uInt16 SwBorderAttrs::CalcLeftLine() const
489 {
490 	if ( bLeftLine )
491 		((SwBorderAttrs*)this)->_CalcLeftLine();
492 	return nLeftLine;
493 }
CalcRightLine() const494 inline sal_uInt16 SwBorderAttrs::CalcRightLine() const
495 {
496 	if ( bRightLine )
497 		((SwBorderAttrs*)this)->_CalcRightLine();
498 	return nRightLine;
499 }
CalcTop() const500 inline sal_uInt16 SwBorderAttrs::CalcTop() const
501 {
502 	if ( bTop )
503 		((SwBorderAttrs*)this)->_CalcTop();
504 	return nTop;
505 }
CalcBottom() const506 inline sal_uInt16 SwBorderAttrs::CalcBottom() const
507 {
508 	if ( bBottom )
509 		((SwBorderAttrs*)this)->_CalcBottom();
510 	return nBottom;
511 }
IsLine() const512 inline sal_Bool SwBorderAttrs::IsLine() const
513 {
514 	if ( bLine )
515 		((SwBorderAttrs*)this)->_IsLine();
516 	return bIsLine;
517 }
518 
519 /** method to determine the spacing values of a frame
520 
521     OD 2004-03-10 #i28701#
522     Values only provided for flow frames (table, section or text frames)
523     Note: line spacing value is only determined for text frames
524     OD 2009-08-28 #i102458#
525     Add output parameter <obIsLineSpacingProportional>
526 
527     @param rFrm
528     input parameter - frame, for which the spacing values are determined.
529 
530     @param onPrevLowerSpacing
531     output parameter - lower spacing of the frame in SwTwips
532 
533     @param onPrevLineSpacing
534     output parameter - line spacing of the frame in SwTwips
535 
536     @param obIsLineSpacingProportional
537 
538     @author OD
539 */
540 void GetSpacingValuesOfFrm( const SwFrm& rFrm,
541                             SwTwips& onLowerSpacing,
542                             SwTwips& onLineSpacing,
543                             bool& obIsLineSpacingProportional );
544 
545 /** method to get the content of the table cell
546 
547     Content from any nested tables will be omitted.
548     Note: line spacing value is only determined for text frames
549 
550     @param rCell_
551     input parameter - the cell which should be searched for content.
552 
553     return
554         pointer to the found content frame or 0
555 */
556 
557 const SwCntntFrm* GetCellCntnt( const SwLayoutFrm& rCell_ );
558 
559 
560 /** helper class to check if a frame has been deleted during an operation
561  *  !!!WARNING!!! This should only be used as a last and desperate means
562  *  to make the code robust.
563  */
564 
565 class SwDeletionChecker
566 {
567     private:
568 
569     const SwFrm* mpFrm;
570     const SwModify* mpRegIn;
571 
572     public:
573 
SwDeletionChecker(const SwFrm * pFrm)574     SwDeletionChecker( const SwFrm* pFrm )
575             : mpFrm( pFrm ),
576               mpRegIn( pFrm ? const_cast<SwFrm*>(pFrm)->GetRegisteredIn() : 0 )
577     {
578     }
579 
580     /**
581      *  return
582      *    true if mpFrm != 0 and mpFrm is not client of pRegIn
583      *    false otherwise
584      */
585     bool HasBeenDeleted();
586 };
587 
588 #endif  //_FRMTOOL_HXX
589