xref: /aoo41x/main/sw/source/core/layout/atrfrm.cxx (revision 2f121198)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sw.hxx"
30 
31 
32 #include <hintids.hxx>
33 #include <com/sun/star/text/RelOrientation.hpp>
34 #include <com/sun/star/text/VertOrientation.hpp>
35 #include <com/sun/star/text/HorizontalAdjust.hpp>
36 #include <com/sun/star/text/DocumentStatistic.hpp>
37 #include <com/sun/star/text/HoriOrientation.hpp>
38 #include <com/sun/star/text/HoriOrientationFormat.hpp>
39 #include <com/sun/star/text/NotePrintMode.hpp>
40 #include <com/sun/star/text/SizeType.hpp>
41 #include <com/sun/star/text/VertOrientationFormat.hpp>
42 #include <com/sun/star/text/WrapTextMode.hpp>
43 #include <com/sun/star/text/XTextFrame.hpp>
44 #include <com/sun/star/text/TextContentAnchorType.hpp>
45 #include <com/sun/star/text/InvalidTextContentException.hpp>
46 #include <com/sun/star/container/XIndexContainer.hpp>
47 #include <com/sun/star/text/TextGridMode.hpp>
48 #include <com/sun/star/awt/Size.hpp>
49 #include <svtools/unoimap.hxx>
50 #include <svtools/unoevent.hxx>
51 #include <basic/sbxvar.hxx>
52 #include <svtools/imap.hxx>
53 #include <svtools/imapobj.hxx>
54 #include <editeng/ulspitem.hxx>
55 #include <editeng/lrspitem.hxx>
56 #include <svx/svdmodel.hxx>
57 #include <svx/svdpage.hxx>
58 #include <unosett.hxx>
59 #include <unostyle.hxx>
60 #include <fmtclds.hxx>
61 #include <fmtornt.hxx>
62 #include <fmthdft.hxx>
63 #include <fmtpdsc.hxx>
64 #include <fmtcntnt.hxx>
65 #include <fmtfsize.hxx>
66 #include <fmtfordr.hxx>
67 #include <fmtsrnd.hxx>
68 #include <fmtanchr.hxx>
69 #include <fmtlsplt.hxx>
70 #include <fmtrowsplt.hxx>
71 #include <fmtftntx.hxx>
72 #include <fmteiro.hxx>
73 #include <fmturl.hxx>
74 #include <fmtcnct.hxx>
75 #include <node.hxx>
76 #include <section.hxx>
77 #include <fmtline.hxx>
78 #include <tgrditem.hxx>
79 #include <hfspacingitem.hxx>
80 #include <doc.hxx>
81 #include <IDocumentUndoRedo.hxx>
82 #include <pagefrm.hxx>
83 #include <rootfrm.hxx>
84 #include <cntfrm.hxx>
85 #include <crsrsh.hxx>
86 #include <pam.hxx>
87 #include <dflyobj.hxx>
88 #include <dcontact.hxx>
89 #include <flyfrm.hxx>
90 #include <frmtool.hxx>
91 #include <flyfrms.hxx>
92 #include <pagedesc.hxx>
93 #include <grfatr.hxx>
94 #include <ndnotxt.hxx>
95 #include <docary.hxx>
96 #include <node2lay.hxx>
97 #include <fmtclbl.hxx>
98 #include <swunohelper.hxx>
99 #include <unoframe.hxx>
100 #include <unotextbodyhf.hxx>
101 #include <SwStyleNameMapper.hxx>
102 #include <editeng/brshitem.hxx>
103 #include <svtools/grfmgr.hxx>
104 #include <cmdid.h>
105 #include <unomid.h>
106 #include <comcore.hrc>
107 #include <svx/svdundo.hxx> // #111827#
108 #include <sortedobjs.hxx>
109 #include <HandleAnchorNodeChg.hxx>
110 #include <svl/cjkoptions.hxx>
111 #include <switerator.hxx>
112 #include <pagedeschint.hxx>
113 
114 using namespace ::com::sun::star;
115 using ::rtl::OUString;
116 
117 SV_IMPL_PTRARR(SwColumns,SwColumn*)
118 
119 TYPEINIT1(SwFmtVertOrient, SfxPoolItem);
120 TYPEINIT1(SwFmtHoriOrient, SfxPoolItem);
121 TYPEINIT2(SwFmtHeader,  SfxPoolItem, SwClient );
122 TYPEINIT2(SwFmtFooter,  SfxPoolItem, SwClient );
123 TYPEINIT2(SwFmtPageDesc,  SfxPoolItem, SwClient );
124 TYPEINIT1_AUTOFACTORY(SwFmtLineNumber, SfxPoolItem);
125 
126 /* -----------------19.05.98 09:26-------------------
127  * 	Umwandlung fuer QueryValue
128  * --------------------------------------------------*/
129 sal_Int16 lcl_RelToINT(sal_Int16 eRelation)
130 {
131     sal_Int16 nRet = text::RelOrientation::FRAME;
132 	switch(eRelation)
133 	{
134     case  text::RelOrientation::PRINT_AREA:           nRet = text::RelOrientation::PRINT_AREA; break;
135     case  text::RelOrientation::CHAR:         nRet = text::RelOrientation::CHAR; break;
136     case  text::RelOrientation::PAGE_LEFT:        nRet = text::RelOrientation::PAGE_LEFT; break;
137     case  text::RelOrientation::PAGE_RIGHT:       nRet = text::RelOrientation::PAGE_RIGHT; break;
138     case  text::RelOrientation::FRAME_LEFT:       nRet = text::RelOrientation::FRAME_LEFT; break;
139     case  text::RelOrientation::FRAME_RIGHT:  nRet = text::RelOrientation::FRAME_RIGHT; break;
140     case  text::RelOrientation::PAGE_FRAME:       nRet = text::RelOrientation::PAGE_FRAME; break;
141     case  text::RelOrientation::PAGE_PRINT_AREA:  nRet = text::RelOrientation::PAGE_PRINT_AREA; break;
142     // OD 13.11.2003 #i22341#
143     case  text::RelOrientation::TEXT_LINE:    nRet = text::RelOrientation::TEXT_LINE; break;
144     default: break;
145 	}
146 	return nRet;
147 }
148 
149 sal_Int16 lcl_IntToRelation(const uno::Any& rVal)
150 {
151     sal_Int16 eRet = text::RelOrientation::FRAME;
152     sal_Int16 nVal = 0;
153     rVal >>= nVal;
154     switch(nVal)
155 	{
156         case  text::RelOrientation::PRINT_AREA:         eRet =   text::RelOrientation::PRINT_AREA           ; break;
157         case  text::RelOrientation::CHAR:               eRet =   text::RelOrientation::CHAR          ; break;
158         case  text::RelOrientation::PAGE_LEFT:          eRet =   text::RelOrientation::PAGE_LEFT       ; break;
159         case  text::RelOrientation::PAGE_RIGHT:         eRet =   text::RelOrientation::PAGE_RIGHT      ; break;
160         case  text::RelOrientation::FRAME_LEFT:         eRet =   text::RelOrientation::FRAME_LEFT      ; break;
161         case  text::RelOrientation::FRAME_RIGHT:        eRet =   text::RelOrientation::FRAME_RIGHT     ; break;
162         case  text::RelOrientation::PAGE_FRAME:         eRet =   text::RelOrientation::PAGE_FRAME      ; break;
163         case  text::RelOrientation::PAGE_PRINT_AREA:    eRet =   text::RelOrientation::PAGE_PRINT_AREA    ; break;
164         // OD 13.11.2003 #i22341#
165         case  text::RelOrientation::TEXT_LINE: eRet = text::RelOrientation::TEXT_LINE; break;
166     }
167 	return eRet;
168 }
169 
170 void DelHFFormat( SwClient *pToRemove, SwFrmFmt *pFmt )
171 {
172 	//Wenn der Client der letzte ist der das Format benutzt, so muss dieses
173 	//vernichtet werden. Zuvor muss jedoch ggf. die Inhaltssection vernichtet
174 	//werden.
175 	SwDoc* pDoc = pFmt->GetDoc();
176 	pFmt->Remove( pToRemove );
177 	if( pDoc->IsInDtor() )
178 	{
179 		delete pFmt;
180 		return;
181 	}
182 
183 	//Nur noch Frms angemeldet?
184 	sal_Bool bDel = sal_True;
185 	{
186 		// Klammer, weil im DTOR SwClientIter das Flag bTreeChg zurueck
187 		// gesetzt wird. Unguenstig, wenn das Format vorher zerstoert wird.
188 		SwClientIter aIter( *pFmt );        // TODO
189 		SwClient *pLast = aIter.GoStart();
190 		if( pLast )
191 			do {
192                 bDel = pLast->IsA( TYPE(SwFrm) )
193                     || SwXHeadFootText::IsXHeadFootText(pLast);
194 			} while( bDel && 0 != ( pLast = ++aIter ));
195 	}
196 
197 	if ( bDel )
198 	{
199 		//Wenn in einem der Nodes noch ein Crsr angemeldet ist, muss das
200 		//ParkCrsr einer (beliebigen) Shell gerufen werden.
201 		SwFmtCntnt& rCnt = (SwFmtCntnt&)pFmt->GetCntnt();
202 		if ( rCnt.GetCntntIdx() )
203 		{
204 			SwNode *pNode = 0;
205 			{
206                 // --> OD 2008-10-07 #i92993#
207                 // Begin with start node of page header/footer to assure that
208                 // complete content is checked for cursors and the complete content
209                 // is deleted on below made method call <pDoc->DeleteSection(pNode)>
210 //                SwNodeIndex aIdx( *rCnt.GetCntntIdx(), 1 );
211                 SwNodeIndex aIdx( *rCnt.GetCntntIdx(), 0 );
212                 // <--
213 				//Wenn in einem der Nodes noch ein Crsr angemeldet ist, muss das
214 				//ParkCrsr einer (beliebigen) Shell gerufen werden.
215                 pNode = & aIdx.GetNode();
216 				sal_uInt32 nEnd = pNode->EndOfSectionIndex();
217 				while ( aIdx < nEnd )
218 				{
219 					if ( pNode->IsCntntNode() &&
220 						 ((SwCntntNode*)pNode)->GetDepends() )
221 					{
222 						SwCrsrShell *pShell = SwIterator<SwCrsrShell,SwCntntNode>::FirstElement( *(SwCntntNode*)pNode );
223 						if( pShell )
224 						{
225 							pShell->ParkCrsr( aIdx );
226 								aIdx = nEnd-1;
227 						}
228 					}
229 					aIdx++;
230                     pNode = & aIdx.GetNode();
231                 }
232             }
233             rCnt.SetNewCntntIdx( (const SwNodeIndex*)0 );
234 
235 			// beim Loeschen von Header/Footer-Formaten IMMER das Undo
236 			// abschalten! (Bug 31069)
237             ::sw::UndoGuard const undoGuard(pDoc->GetIDocumentUndoRedo());
238 
239 			ASSERT( pNode, "Ein grosses Problem." );
240 			pDoc->DeleteSection( pNode );
241 		}
242 		delete pFmt;
243 	}
244 }
245 
246 //	class SwFmtFrmSize
247 //	Implementierung teilweise inline im hxx
248 
249 SwFmtFrmSize::SwFmtFrmSize( SwFrmSize eSize, SwTwips nWidth, SwTwips nHeight )
250 	: SfxPoolItem( RES_FRM_SIZE ),
251 	aSize( nWidth, nHeight ),
252     eFrmHeightType( eSize ),
253     eFrmWidthType( ATT_FIX_SIZE )
254 {
255 	nWidthPercent = nHeightPercent = 0;
256 }
257 
258 SwFmtFrmSize& SwFmtFrmSize::operator=( const SwFmtFrmSize& rCpy )
259 {
260 	aSize = rCpy.GetSize();
261     eFrmHeightType = rCpy.GetHeightSizeType();
262     eFrmWidthType = rCpy.GetWidthSizeType();
263 	nHeightPercent = rCpy.GetHeightPercent();
264 	nWidthPercent  = rCpy.GetWidthPercent();
265 	return *this;
266 }
267 
268 int  SwFmtFrmSize::operator==( const SfxPoolItem& rAttr ) const
269 {
270 	ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
271     return( eFrmHeightType  == ((SwFmtFrmSize&)rAttr).eFrmHeightType &&
272             eFrmWidthType  == ((SwFmtFrmSize&)rAttr).eFrmWidthType &&
273 			aSize    		== ((SwFmtFrmSize&)rAttr).GetSize()&&
274 			nWidthPercent	== ((SwFmtFrmSize&)rAttr).GetWidthPercent() &&
275 			nHeightPercent	== ((SwFmtFrmSize&)rAttr).GetHeightPercent() );
276 }
277 
278 SfxPoolItem*  SwFmtFrmSize::Clone( SfxItemPool* ) const
279 {
280 	return new SwFmtFrmSize( *this );
281 }
282 
283 
284 /* -----------------24.04.98 11:36-------------------
285  *
286  * --------------------------------------------------*/
287 sal_Bool SwFmtFrmSize::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
288 {
289 	// hier wird immer konvertiert!
290 	nMemberId &= ~CONVERT_TWIPS;
291 	switch ( nMemberId )
292 	{
293 		case MID_FRMSIZE_SIZE:
294 		{
295 			awt::Size aTmp;
296 			aTmp.Height = TWIP_TO_MM100(aSize.Height());
297 			aTmp.Width = TWIP_TO_MM100(aSize.Width());
298 			rVal.setValue(&aTmp, ::getCppuType((const awt::Size*)0));
299 		}
300 		break;
301 		case MID_FRMSIZE_REL_HEIGHT:
302 			rVal <<= (sal_Int16)(GetHeightPercent() != 0xFF ? GetHeightPercent() : 0);
303 		break;
304 		case MID_FRMSIZE_REL_WIDTH:
305 			rVal <<= (sal_Int16)(GetWidthPercent() != 0xFF ? GetWidthPercent() : 0);
306 		break;
307         case MID_FRMSIZE_IS_SYNC_HEIGHT_TO_WIDTH:
308 		{
309 			sal_Bool bTmp = 0xFF == GetHeightPercent();
310 			rVal.setValue(&bTmp, ::getBooleanCppuType());
311 		}
312 		break;
313 		case MID_FRMSIZE_IS_SYNC_WIDTH_TO_HEIGHT:
314 		{
315 			sal_Bool bTmp = 0xFF == GetWidthPercent();
316 			rVal.setValue(&bTmp, ::getBooleanCppuType());
317 		}
318 		break;
319 		case MID_FRMSIZE_WIDTH :
320 			rVal <<= (sal_Int32)TWIP_TO_MM100(aSize.Width());
321 		break;
322         case MID_FRMSIZE_HEIGHT:
323             // #95848# returned size should never be zero.
324             // (there was a bug that allowed for setting height to 0.
325             // Thus there some documents existing with that not allowed
326             // attribut value which may cause problems on import.)
327             rVal <<= (sal_Int32)TWIP_TO_MM100(aSize.Height() < MINLAY ? MINLAY : aSize.Height() );
328         break;
329         case MID_FRMSIZE_SIZE_TYPE:
330             rVal <<= (sal_Int16)GetHeightSizeType();
331 		break;
332 		case MID_FRMSIZE_IS_AUTO_HEIGHT:
333 		{
334             sal_Bool bTmp = ATT_FIX_SIZE != GetHeightSizeType();
335 			rVal.setValue(&bTmp, ::getBooleanCppuType());
336 		}
337 		break;
338         case MID_FRMSIZE_WIDTH_TYPE:
339             rVal <<= (sal_Int16)GetWidthSizeType();
340         break;
341 	}
342 	return sal_True;
343 }
344 
345 /* -----------------24.04.98 11:36-------------------
346  *
347  * --------------------------------------------------*/
348 sal_Bool SwFmtFrmSize::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
349 {
350 	sal_Bool bConvert = 0 != (nMemberId&CONVERT_TWIPS);
351 	nMemberId &= ~CONVERT_TWIPS;
352 	sal_Bool bRet = sal_True;
353 	switch ( nMemberId )
354 	{
355 		case MID_FRMSIZE_SIZE:
356 		{
357             awt::Size aVal;
358             if(!(rVal >>= aVal))
359                 bRet = sal_False;
360             else
361             {
362                 Size aTmp(aVal.Width, aVal.Height);
363                 if(bConvert)
364                 {
365                     aTmp.Height() = MM100_TO_TWIP(aTmp.Height());
366                     aTmp.Width() = MM100_TO_TWIP(aTmp.Width());
367                 }
368                 if(aTmp.Height() && aTmp.Width())
369                     aSize = aTmp;
370                 else
371                     bRet = sal_False;
372             }
373 		}
374 		break;
375 		case MID_FRMSIZE_REL_HEIGHT:
376 		{
377 			sal_Int16 nSet = 0;
378 			rVal >>= nSet;
379             if(nSet >= 0 && nSet <= 0xfe)
380 				SetHeightPercent((sal_uInt8)nSet);
381 			else
382 				bRet = sal_False;
383 		}
384 		break;
385 		case MID_FRMSIZE_REL_WIDTH:
386 		{
387 			sal_Int16 nSet = 0;
388 			rVal >>= nSet;
389             if(nSet >= 0 && nSet <= 0xfe)
390 				SetWidthPercent((sal_uInt8)nSet);
391 			else
392 				bRet = sal_False;
393 		}
394 		break;
395 		case MID_FRMSIZE_IS_SYNC_HEIGHT_TO_WIDTH:
396 		{
397 			sal_Bool bSet = *(sal_Bool*)rVal.getValue();
398 			if(bSet)
399 				SetHeightPercent(0xff);
400 			else if( 0xff == GetHeightPercent() )
401 				SetHeightPercent( 0 );
402 		}
403 		break;
404 		case MID_FRMSIZE_IS_SYNC_WIDTH_TO_HEIGHT:
405 		{
406 			sal_Bool bSet = *(sal_Bool*)rVal.getValue();
407 			if(bSet)
408 				SetWidthPercent(0xff);
409 			else if( 0xff == GetWidthPercent() )
410 				SetWidthPercent(0);
411 		}
412 		break;
413 		case MID_FRMSIZE_WIDTH :
414 		{
415             sal_Int32 nWd = 0;
416             if(rVal >>= nWd)
417             {
418                 if(bConvert)
419                     nWd = MM100_TO_TWIP(nWd);
420                 if(nWd < MINLAY)
421                    nWd = MINLAY;
422                 aSize.Width() = nWd;
423             }
424             else
425                 bRet = sal_False;
426         }
427 		break;
428 		case MID_FRMSIZE_HEIGHT:
429 		{
430             sal_Int32 nHg = 0;
431             if(rVal >>= nHg)
432             {
433                 if(bConvert)
434                     nHg = MM100_TO_TWIP(nHg);
435                 if(nHg < MINLAY)
436                     nHg = MINLAY;
437                 aSize.Height() = nHg;
438             }
439             else
440                 bRet = sal_False;
441         }
442 		break;
443 		case MID_FRMSIZE_SIZE_TYPE:
444 		{
445             sal_Int16 nType = 0;
446             if((rVal >>= nType) && nType >= 0 && nType <= ATT_MIN_SIZE )
447 			{
448                 SetHeightSizeType((SwFrmSize)nType);
449 			}
450             else
451                 bRet = sal_False;
452         }
453 		break;
454 		case MID_FRMSIZE_IS_AUTO_HEIGHT:
455 		{
456 			sal_Bool bSet = *(sal_Bool*)rVal.getValue();
457             SetHeightSizeType(bSet ? ATT_VAR_SIZE : ATT_FIX_SIZE);
458 		}
459 		break;
460         case MID_FRMSIZE_WIDTH_TYPE:
461         {
462             sal_Int16 nType = 0;
463             if((rVal >>= nType) && nType >= 0 && nType <= ATT_MIN_SIZE )
464 			{
465                 SetWidthSizeType((SwFrmSize)nType);
466 			}
467             else
468                 bRet = sal_False;
469         }
470         break;
471 		default:
472 			bRet = sal_False;
473 	}
474 	return bRet;
475 }
476 
477 //	class SwFmtFillOrder
478 //	Implementierung teilweise inline im hxx
479 
480 SwFmtFillOrder::SwFmtFillOrder( SwFillOrder nFO )
481 	: SfxEnumItem( RES_FILL_ORDER, sal_uInt16(nFO) )
482 {}
483 
484 SfxPoolItem*  SwFmtFillOrder::Clone( SfxItemPool* ) const
485 {
486 	return new SwFmtFillOrder( GetFillOrder() );
487 }
488 
489 sal_uInt16  SwFmtFillOrder::GetValueCount() const
490 {
491 	return SW_FILL_ORDER_END - SW_FILL_ORDER_BEGIN;
492 }
493 
494 //	class SwFmtHeader
495 //	Implementierung teilweise inline im hxx
496 
497 SwFmtHeader::SwFmtHeader( SwFrmFmt *pHeaderFmt )
498 	: SfxPoolItem( RES_HEADER ),
499 	SwClient( pHeaderFmt ),
500 	bActive( pHeaderFmt ? sal_True : sal_False )
501 {
502 }
503 
504 SwFmtHeader::SwFmtHeader( const SwFmtHeader &rCpy )
505 	: SfxPoolItem( RES_HEADER ),
506 	SwClient( (SwModify*)rCpy.GetRegisteredIn() ),
507 	bActive( rCpy.IsActive() )
508 {
509 }
510 
511 SwFmtHeader::SwFmtHeader( sal_Bool bOn )
512 	: SfxPoolItem( RES_HEADER ),
513 	SwClient( 0 ),
514 	bActive( bOn )
515 {
516 }
517 
518  SwFmtHeader::~SwFmtHeader()
519 {
520 	if ( GetHeaderFmt() )
521 		DelHFFormat( this, GetHeaderFmt() );
522 }
523 
524 int  SwFmtHeader::operator==( const SfxPoolItem& rAttr ) const
525 {
526 	ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
527 	return ( GetRegisteredIn() == ((SwFmtHeader&)rAttr).GetRegisteredIn() &&
528 			 bActive == ((SwFmtHeader&)rAttr).IsActive() );
529 }
530 
531 SfxPoolItem*  SwFmtHeader::Clone( SfxItemPool* ) const
532 {
533 	return new SwFmtHeader( *this );
534 }
535 
536 void SwFmtHeader::RegisterToFormat( SwFmt& rFmt )
537 {
538     rFmt.Add(this);
539 }
540 
541 //	class SwFmtFooter
542 //	Implementierung teilweise inline im hxx
543 
544 SwFmtFooter::SwFmtFooter( SwFrmFmt *pFooterFmt )
545 	: SfxPoolItem( RES_FOOTER ),
546 	SwClient( pFooterFmt ),
547 	bActive( pFooterFmt ? sal_True : sal_False )
548 {
549 }
550 
551 SwFmtFooter::SwFmtFooter( const SwFmtFooter &rCpy )
552 	: SfxPoolItem( RES_FOOTER ),
553 	SwClient( (SwModify*)rCpy.GetRegisteredIn() ),
554 	bActive( rCpy.IsActive() )
555 {
556 }
557 
558 SwFmtFooter::SwFmtFooter( sal_Bool bOn )
559 	: SfxPoolItem( RES_FOOTER ),
560 	SwClient( 0 ),
561 	bActive( bOn )
562 {
563 }
564 
565  SwFmtFooter::~SwFmtFooter()
566 {
567 	if ( GetFooterFmt() )
568 		DelHFFormat( this, GetFooterFmt() );
569 }
570 
571 void SwFmtFooter::RegisterToFormat( SwFmt& rFmt )
572 {
573     rFmt.Add(this);
574 }
575 
576 int  SwFmtFooter::operator==( const SfxPoolItem& rAttr ) const
577 {
578 	ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
579 	return ( GetRegisteredIn() == ((SwFmtFooter&)rAttr).GetRegisteredIn() &&
580 			 bActive == ((SwFmtFooter&)rAttr).IsActive() );
581 }
582 
583 SfxPoolItem*  SwFmtFooter::Clone( SfxItemPool* ) const
584 {
585 	return new SwFmtFooter( *this );
586 }
587 
588 //	class SwFmtCntnt
589 //	Implementierung teilweise inline im hxx
590 
591 SwFmtCntnt::SwFmtCntnt( const SwFmtCntnt &rCpy )
592 	: SfxPoolItem( RES_CNTNT )
593 {
594 	pStartNode = rCpy.GetCntntIdx() ?
595 					new SwNodeIndex( *rCpy.GetCntntIdx() ) : 0;
596 }
597 
598 SwFmtCntnt::SwFmtCntnt( const SwStartNode *pStartNd )
599 	: SfxPoolItem( RES_CNTNT )
600 {
601 	pStartNode = pStartNd ? new SwNodeIndex( *pStartNd ) : 0;
602 }
603 
604  SwFmtCntnt::~SwFmtCntnt()
605 {
606 	delete pStartNode;
607 }
608 
609 void SwFmtCntnt::SetNewCntntIdx( const SwNodeIndex *pIdx )
610 {
611 	delete pStartNode;
612 	pStartNode = pIdx ? new SwNodeIndex( *pIdx ) : 0;
613 }
614 
615 int  SwFmtCntnt::operator==( const SfxPoolItem& rAttr ) const
616 {
617 	ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
618 	if( (long)pStartNode ^ (long)((SwFmtCntnt&)rAttr).pStartNode )
619 		return 0;
620 	if( pStartNode )
621 		return ( *pStartNode == *((SwFmtCntnt&)rAttr).GetCntntIdx() );
622 	return 1;
623 }
624 
625 SfxPoolItem*  SwFmtCntnt::Clone( SfxItemPool* ) const
626 {
627 	return new SwFmtCntnt( *this );
628 }
629 
630 //	class SwFmtPageDesc
631 //	Implementierung teilweise inline im hxx
632 
633 SwFmtPageDesc::SwFmtPageDesc( const SwFmtPageDesc &rCpy )
634 	: SfxPoolItem( RES_PAGEDESC ),
635 	SwClient( (SwPageDesc*)rCpy.GetPageDesc() ),
636     nNumOffset( rCpy.nNumOffset ),
637     nDescNameIdx( rCpy.nDescNameIdx ),
638     pDefinedIn( 0 )
639 {
640 }
641 
642 SwFmtPageDesc::SwFmtPageDesc( const SwPageDesc *pDesc )
643 	: SfxPoolItem( RES_PAGEDESC ),
644 	SwClient( (SwPageDesc*)pDesc ),
645     nNumOffset( 0 ),
646     nDescNameIdx( 0xFFFF ), // IDX_NO_VALUE
647     pDefinedIn( 0 )
648 {
649 }
650 
651  SwFmtPageDesc::~SwFmtPageDesc() {}
652 
653 bool SwFmtPageDesc::KnowsPageDesc() const
654 {
655     return (GetRegisteredIn() != 0);
656 }
657 
658 int  SwFmtPageDesc::operator==( const SfxPoolItem& rAttr ) const
659 {
660 	ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
661 	return	( pDefinedIn == ((SwFmtPageDesc&)rAttr).pDefinedIn ) &&
662 			( nNumOffset == ((SwFmtPageDesc&)rAttr).nNumOffset ) &&
663 			( GetPageDesc() == ((SwFmtPageDesc&)rAttr).GetPageDesc() );
664 }
665 
666 SfxPoolItem*  SwFmtPageDesc::Clone( SfxItemPool* ) const
667 {
668 	return new SwFmtPageDesc( *this );
669 }
670 
671 void SwFmtPageDesc::SwClientNotify( const SwModify&, const SfxHint& rHint )
672 {
673     const SwPageDescHint* pHint = dynamic_cast<const SwPageDescHint*>(&rHint);
674     if ( pHint )
675     {
676         // mba: shouldn't that be broadcasted also?
677         SwFmtPageDesc aDfltDesc( pHint->GetPageDesc() );
678         SwPageDesc* pDesc = pHint->GetPageDesc();
679         const SwModify* pMod = GetDefinedIn();
680         if ( pMod )
681         {
682             if( pMod->ISA( SwCntntNode ) )
683                 ((SwCntntNode*)pMod)->SetAttr( aDfltDesc );
684             else if( pMod->ISA( SwFmt ))
685                 ((SwFmt*)pMod)->SetFmtAttr( aDfltDesc );
686             else
687             {
688                 DBG_ERROR( "What kind of SwModify is this?" );
689                 RegisterToPageDesc( *pDesc );
690             }
691         }
692         else
693             // there could be an Undo-copy
694             RegisterToPageDesc( *pDesc );
695     }
696 }
697 
698 void SwFmtPageDesc::RegisterToPageDesc( SwPageDesc& rDesc )
699 {
700     rDesc.Add( this );
701 }
702 
703 void SwFmtPageDesc::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
704 {
705 	if( !pDefinedIn )
706 		return;
707 
708     const sal_uInt16 nWhichId = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
709     switch( nWhichId )
710 	{
711 		case RES_OBJECTDYING:
712 				//Der Pagedesc, bei dem ich angemeldet bin stirbt, ich trage
713 				//mich also bei meinem Format aus.
714 				//Dabei werden ich Deletet!!!
715 			if( IS_TYPE( SwFmt, pDefinedIn ))
716 #ifdef DBG_UTIL
717 			{
718                 sal_Bool bDel = ((SwFmt*)pDefinedIn)->ResetFmtAttr( RES_PAGEDESC );
719 				ASSERT( bDel, ";-) FmtPageDesc nicht zerstoert." );
720 			}
721 #else
722                 ((SwFmt*)pDefinedIn)->ResetFmtAttr( RES_PAGEDESC );
723 #endif
724 			else if( IS_TYPE( SwCntntNode, pDefinedIn ))
725 #ifdef DBG_UTIL
726 			{
727 				sal_Bool bDel = ((SwCntntNode*)pDefinedIn)->ResetAttr( RES_PAGEDESC );
728 				ASSERT( bDel, ";-) FmtPageDesc nicht zerstoert." );
729 			}
730 #else
731 				((SwCntntNode*)pDefinedIn)->ResetAttr( RES_PAGEDESC );
732 #endif
733 			break;
734 
735 		default:
736 			/* do nothing */;
737 	}
738 }
739 
740 sal_Bool SwFmtPageDesc::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
741 {
742 	// hier wird immer konvertiert!
743 	nMemberId &= ~CONVERT_TWIPS;
744 	sal_Bool	bRet = sal_True;
745 	switch ( nMemberId )
746 	{
747 		case MID_PAGEDESC_PAGENUMOFFSET:
748 			rVal <<= (sal_Int16)GetNumOffset();
749 			break;
750 
751 		case MID_PAGEDESC_PAGEDESCNAME:
752 			{
753 				const SwPageDesc* pDesc = GetPageDesc();
754 				if( pDesc )
755 				{
756 					String aString;
757 					SwStyleNameMapper::FillProgName(pDesc->GetName(), aString, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, sal_True );
758 					rVal <<= OUString( aString );
759 				}
760 				else
761 					rVal.clear();
762 			}
763 			break;
764 		default:
765 			ASSERT( !this, "unknown MemberId" );
766 			bRet = sal_False;
767 	}
768 	return bRet;
769 }
770 
771 sal_Bool SwFmtPageDesc::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
772 {
773 	// hier wird immer konvertiert!
774 	nMemberId &= ~CONVERT_TWIPS;
775 	sal_Bool bRet = sal_True;
776 	switch ( nMemberId )
777 	{
778 		case MID_PAGEDESC_PAGENUMOFFSET:
779         {
780             sal_Int16 nOffset = 0;
781             if(rVal >>= nOffset)
782                 SetNumOffset( nOffset );
783             else
784                 bRet = sal_False;
785         }
786         break;
787 
788 		case MID_PAGEDESC_PAGEDESCNAME:
789 			/* geht nicht, weil das Attribut eigentlich nicht den Namen
790 			 * sondern einen Pointer auf den PageDesc braucht (ist Client davon).
791 			 * Der Pointer waere aber ueber den Namen nur vom Dokument zu erfragen.
792 			 */
793 		default:
794 			ASSERT( !this, "unknown MemberId" );
795 			bRet = sal_False;
796 	}
797 	return bRet;
798 }
799 
800 
801 //	class SwFmtCol
802 //	Implementierung teilweise inline im hxx
803 
804 SwColumn::SwColumn() :
805     nWish ( 0 ),
806     nUpper( 0 ),
807 	nLower( 0 ),
808 	nLeft ( 0 ),
809     nRight( 0 )
810 {
811 }
812 
813 sal_Bool SwColumn::operator==( const SwColumn &rCmp )
814 {
815 	return (nWish    == rCmp.GetWishWidth() &&
816 			GetLeft()  == rCmp.GetLeft() &&
817 			GetRight() == rCmp.GetRight() &&
818 			GetUpper() == rCmp.GetUpper() &&
819 			GetLower() == rCmp.GetLower()) ? sal_True : sal_False;
820 }
821 
822 SwFmtCol::SwFmtCol( const SwFmtCol& rCpy )
823 	: SfxPoolItem( RES_COL ),
824 	nLineWidth( rCpy.nLineWidth),
825 	aLineColor( rCpy.aLineColor),
826 	nLineHeight( rCpy.GetLineHeight() ),
827 	eAdj( rCpy.GetLineAdj() ),
828     aColumns( (sal_Int8)rCpy.GetNumCols(), 1 ),
829     nWidth( rCpy.GetWishWidth() ),
830     bOrtho( rCpy.IsOrtho() )
831 {
832 	for ( sal_uInt16 i = 0; i < rCpy.GetNumCols(); ++i )
833 	{
834 		SwColumn *pCol = new SwColumn( *rCpy.GetColumns()[i] );
835 		aColumns.Insert( pCol, aColumns.Count() );
836 	}
837 }
838 
839 SwFmtCol::~SwFmtCol() {}
840 
841 SwFmtCol& SwFmtCol::operator=( const SwFmtCol& rCpy )
842 {
843 	nLineWidth  = rCpy.nLineWidth;
844 	aLineColor  = rCpy.aLineColor;
845 	nLineHeight	= rCpy.GetLineHeight();
846 	eAdj		= rCpy.GetLineAdj();
847 	nWidth		= rCpy.GetWishWidth();
848 	bOrtho		= rCpy.IsOrtho();
849 
850 	if ( aColumns.Count() )
851 		aColumns.DeleteAndDestroy( 0, aColumns.Count() );
852 	for ( sal_uInt16 i = 0; i < rCpy.GetNumCols(); ++i )
853 	{
854 		SwColumn *pCol = new SwColumn( *rCpy.GetColumns()[i] );
855 		aColumns.Insert( pCol, aColumns.Count() );
856 	}
857 	return *this;
858 }
859 
860 SwFmtCol::SwFmtCol()
861 	: SfxPoolItem( RES_COL ),
862     nLineWidth(0),
863     nLineHeight( 100 ),
864 	eAdj( COLADJ_NONE ),
865 	nWidth( USHRT_MAX ),
866     bOrtho( sal_True )
867 {
868 }
869 
870 int SwFmtCol::operator==( const SfxPoolItem& rAttr ) const
871 {
872 	ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
873 	const SwFmtCol &rCmp = (const SwFmtCol&)rAttr;
874 	if( !(nLineWidth		== rCmp.nLineWidth  &&
875 		  aLineColor        == rCmp.aLineColor	&&
876 		  nLineHeight  		 == rCmp.GetLineHeight() &&
877 		  eAdj		 		 == rCmp.GetLineAdj() &&
878 		  nWidth  	 		 == rCmp.GetWishWidth() &&
879 		  bOrtho  			 == rCmp.IsOrtho() &&
880 		  aColumns.Count() == rCmp.GetNumCols()) )
881 		return 0;
882 
883 	for ( sal_uInt16 i = 0; i < aColumns.Count(); ++i )
884 		if ( !(*aColumns[i] == *rCmp.GetColumns()[i]) )
885 			return 0;
886 
887 	return 1;
888 }
889 
890 SfxPoolItem*  SwFmtCol::Clone( SfxItemPool* ) const
891 {
892 	return new SwFmtCol( *this );
893 }
894 
895 sal_uInt16 SwFmtCol::GetGutterWidth( sal_Bool bMin ) const
896 {
897 	sal_uInt16 nRet = 0;
898 	if ( aColumns.Count() == 2 )
899 		nRet = aColumns[0]->GetRight() + aColumns[1]->GetLeft();
900 	else if ( aColumns.Count() > 2 )
901 	{
902 		sal_Bool bSet = sal_False;
903 		for ( sal_uInt16 i = 1; i < aColumns.Count()-1; ++i )
904 		{
905 			const sal_uInt16 nTmp = aColumns[i]->GetRight() + aColumns[i+1]->GetLeft();
906 			if ( bSet )
907 			{
908 				if ( nTmp != nRet )
909 				{
910 					if ( !bMin )
911 						return USHRT_MAX;
912 					if ( nRet > nTmp )
913 						nRet = nTmp;
914 				}
915 			}
916 			else
917 			{	bSet = sal_True;
918 				nRet = nTmp;
919 			}
920 		}
921 	}
922 	return nRet;
923 }
924 
925 void SwFmtCol::SetGutterWidth( sal_uInt16 nNew, sal_uInt16 nAct )
926 {
927 	if ( bOrtho )
928 		Calc( nNew, nAct );
929 	else
930 	{
931 		sal_uInt16 nHalf = nNew / 2;
932 		for ( sal_uInt16 i = 0; i < aColumns.Count(); ++i )
933 		{	SwColumn *pCol = aColumns[i];
934 			pCol->SetLeft ( nHalf );
935 			pCol->SetRight( nHalf );
936 			if ( i == 0 )
937 				pCol->SetLeft( 0 );
938 			else if ( i == (aColumns.Count() - 1) )
939 				pCol->SetRight( 0 );
940 		}
941 	}
942 }
943 
944 void SwFmtCol::Init( sal_uInt16 nNumCols, sal_uInt16 nGutterWidth, sal_uInt16 nAct )
945 {
946 	//Loeschen scheint hier auf den erste Blick vielleicht etwas zu heftig;
947 	//anderfalls muessten allerdings alle Werte der verbleibenden SwColumn's
948 	//initialisiert werden.
949 	if ( aColumns.Count() )
950 		aColumns.DeleteAndDestroy( 0, aColumns.Count() );
951 	for ( sal_uInt16 i = 0; i < nNumCols; ++i )
952 	{	SwColumn *pCol = new SwColumn;
953 		aColumns.Insert( pCol, i );
954 	}
955 	bOrtho = sal_True;
956 	nWidth = USHRT_MAX;
957 	if( nNumCols )
958 		Calc( nGutterWidth, nAct );
959 }
960 
961 void SwFmtCol::SetOrtho( sal_Bool bNew, sal_uInt16 nGutterWidth, sal_uInt16 nAct )
962 {
963 	bOrtho = bNew;
964 	if ( bNew && aColumns.Count() )
965 		Calc( nGutterWidth, nAct );
966 }
967 
968 sal_uInt16 SwFmtCol::CalcColWidth( sal_uInt16 nCol, sal_uInt16 nAct ) const
969 {
970 	ASSERT( nCol < aColumns.Count(), ":-( ColumnsArr ueberindiziert." );
971 	if ( nWidth != nAct )
972 	{
973 		long nW = aColumns[nCol]->GetWishWidth();
974 		nW *= nAct;
975 		nW /= nWidth;
976 		return sal_uInt16(nW);
977 	}
978 	else
979 		return aColumns[nCol]->GetWishWidth();
980 }
981 
982 sal_uInt16 SwFmtCol::CalcPrtColWidth( sal_uInt16 nCol, sal_uInt16 nAct ) const
983 {
984 	ASSERT( nCol < aColumns.Count(), ":-( ColumnsArr ueberindiziert." );
985 	sal_uInt16 nRet = CalcColWidth( nCol, nAct );
986 	SwColumn *pCol = aColumns[nCol];
987 	nRet = nRet - pCol->GetLeft();
988 	nRet = nRet - pCol->GetRight();
989 	return nRet;
990 }
991 
992 void SwFmtCol::Calc( sal_uInt16 nGutterWidth, sal_uInt16 nAct )
993 {
994 	if(!GetNumCols())
995         return;
996     //Erstmal die Spalten mit der Aktuellen Breite einstellen, dann die
997 	//Wunschbreite der Spalten anhand der Gesamtwunschbreite hochrechnen.
998 
999 	const sal_uInt16 nGutterHalf = nGutterWidth ? nGutterWidth / 2 : 0;
1000 
1001 	//Breite der PrtAreas ist Gesamtbreite - Zwischenraeume / Anzahl
1002 	const sal_uInt16 nPrtWidth =
1003 				(nAct - ((GetNumCols()-1) * nGutterWidth)) / GetNumCols();
1004 	sal_uInt16 nAvail = nAct;
1005 
1006 	//Die erste Spalte ist PrtBreite + (Zwischenraumbreite/2)
1007 	const sal_uInt16 nLeftWidth = nPrtWidth + nGutterHalf;
1008 	SwColumn *pCol = aColumns[0];
1009 	pCol->SetWishWidth( nLeftWidth );
1010 	pCol->SetRight( nGutterHalf );
1011 	pCol->SetLeft ( 0 );
1012 	nAvail = nAvail - nLeftWidth;
1013 
1014 	//Spalte 2 bis n-1 ist PrtBreite + Zwischenraumbreite
1015 	const sal_uInt16 nMidWidth = nPrtWidth + nGutterWidth;
1016 	sal_uInt16 i;
1017 
1018 	for ( i = 1; i < GetNumCols()-1; ++i )
1019 	{
1020 		pCol = aColumns[i];
1021 		pCol->SetWishWidth( nMidWidth );
1022 		pCol->SetLeft ( nGutterHalf );
1023 		pCol->SetRight( nGutterHalf );
1024 		nAvail = nAvail - nMidWidth;
1025 	}
1026 
1027 	//Die Letzte Spalte entspricht wieder der ersten, um Rundungsfehler
1028 	//auszugleichen wird der letzten Spalte alles zugeschlagen was die
1029 	//anderen nicht verbraucht haben.
1030 	pCol = aColumns[aColumns.Count()-1];
1031 	pCol->SetWishWidth( nAvail );
1032 	pCol->SetLeft ( nGutterHalf );
1033 	pCol->SetRight( 0 );
1034 
1035 	//Umrechnen der aktuellen Breiten in Wunschbreiten.
1036 	for ( i = 0; i < aColumns.Count(); ++i )
1037 	{
1038 		pCol = aColumns[i];
1039 		long nTmp = pCol->GetWishWidth();
1040 		nTmp *= GetWishWidth();
1041 		nTmp /= nAct;
1042 		pCol->SetWishWidth( sal_uInt16(nTmp) );
1043 	}
1044 }
1045 
1046 sal_Bool SwFmtCol::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1047 {
1048 	// hier wird immer konvertiert!
1049 	nMemberId &= ~CONVERT_TWIPS;
1050 	if(MID_COLUMN_SEPARATOR_LINE == nMemberId)
1051 	{
1052 		DBG_ERROR("not implemented");
1053 	}
1054 	else
1055 	{
1056 		uno::Reference< text::XTextColumns >  xCols = new SwXTextColumns(*this);
1057 		rVal.setValue(&xCols, ::getCppuType((uno::Reference< text::XTextColumns>*)0));
1058 	}
1059 	return sal_True;
1060 }
1061 
1062 sal_Bool SwFmtCol::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1063 {
1064 	// hier wird immer konvertiert!
1065 	nMemberId &= ~CONVERT_TWIPS;
1066 	sal_Bool bRet = sal_False;
1067 	if(MID_COLUMN_SEPARATOR_LINE == nMemberId)
1068 	{
1069 		DBG_ERROR("not implemented");
1070 	}
1071 	else
1072 	{
1073         uno::Reference< text::XTextColumns > xCols;
1074         rVal >>= xCols;
1075         if(xCols.is())
1076 		{
1077             uno::Sequence<text::TextColumn> aSetColumns = xCols->getColumns();
1078 			const text::TextColumn* pArray = aSetColumns.getConstArray();
1079 			aColumns.DeleteAndDestroy(0, aColumns.Count());
1080 			//max. Count ist hier 64K - das kann das Array aber nicht
1081 			sal_uInt16 nCount = Min( (sal_uInt16)aSetColumns.getLength(),
1082 									 (sal_uInt16) 0x3fff );
1083 			sal_uInt16 nWidthSum = 0;
1084             // #101224# one column is no column
1085             //
1086             if(nCount > 1)
1087                 for(sal_uInt16 i = 0; i < nCount; i++)
1088                 {
1089                     SwColumn* pCol = new SwColumn;
1090                     pCol->SetWishWidth( static_cast<sal_uInt16>(pArray[i].Width) );
1091                     nWidthSum = static_cast<sal_uInt16>(nWidthSum + pArray[i].Width);
1092                     pCol->SetLeft ( static_cast<sal_uInt16>(MM100_TO_TWIP(pArray[i].LeftMargin)) );
1093                     pCol->SetRight( static_cast<sal_uInt16>(MM100_TO_TWIP(pArray[i].RightMargin)) );
1094                     aColumns.Insert(pCol, i);
1095                 }
1096 			bRet = sal_True;
1097 			nWidth = nWidthSum;
1098             bOrtho = sal_False;
1099 
1100             uno::Reference<lang::XUnoTunnel> xNumTunnel(xCols, uno::UNO_QUERY);
1101 			SwXTextColumns* pSwColums = 0;
1102 			if(xNumTunnel.is())
1103 			{
1104                 pSwColums = reinterpret_cast< SwXTextColumns * >(
1105                     sal::static_int_cast< sal_IntPtr >(
1106                     xNumTunnel->getSomething( SwXTextColumns::getUnoTunnelId() )));
1107 			}
1108 			if(pSwColums)
1109 			{
1110                 bOrtho = pSwColums->IsAutomaticWidth();
1111                 nLineWidth = pSwColums->GetSepLineWidth();
1112 				aLineColor.SetColor(pSwColums->GetSepLineColor());
1113 				nLineHeight = pSwColums->GetSepLineHeightRelative();
1114 				if(!pSwColums->GetSepLineIsOn())
1115 					eAdj = COLADJ_NONE;
1116 				else switch(pSwColums->GetSepLineVertAlign())
1117 				{
1118 					case 0: eAdj = COLADJ_TOP;	break;	//VerticalAlignment_TOP
1119 					case 1: eAdj = COLADJ_CENTER;break; //VerticalAlignment_MIDDLE
1120 					case 2: eAdj = COLADJ_BOTTOM;break;	//VerticalAlignment_BOTTOM
1121                     default: ASSERT( !this, "unknown alignment" ); break;
1122 				}
1123 			}
1124 		}
1125 	}
1126 	return bRet;
1127 }
1128 
1129 
1130 //	class SwFmtSurround
1131 //	Implementierung teilweise inline im hxx
1132 
1133 SwFmtSurround::SwFmtSurround( SwSurround eFly ) :
1134 	SfxEnumItem( RES_SURROUND, sal_uInt16( eFly ) )
1135 {
1136 	bAnchorOnly = bContour = bOutside = sal_False;
1137 }
1138 
1139 SwFmtSurround::SwFmtSurround( const SwFmtSurround &rCpy ) :
1140 	SfxEnumItem( RES_SURROUND, rCpy.GetValue() )
1141 {
1142 	bAnchorOnly = rCpy.bAnchorOnly;
1143 	bContour = rCpy.bContour;
1144 	bOutside = rCpy.bOutside;
1145 }
1146 
1147 int  SwFmtSurround::operator==( const SfxPoolItem& rAttr ) const
1148 {
1149 	ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
1150 	return ( GetValue() == ((SwFmtSurround&)rAttr).GetValue() &&
1151 			 bAnchorOnly== ((SwFmtSurround&)rAttr).bAnchorOnly &&
1152 			 bContour== ((SwFmtSurround&)rAttr).bContour &&
1153 			 bOutside== ((SwFmtSurround&)rAttr).bOutside );
1154 }
1155 
1156 SfxPoolItem*  SwFmtSurround::Clone( SfxItemPool* ) const
1157 {
1158 	return new SwFmtSurround( *this );
1159 }
1160 
1161 sal_uInt16  SwFmtSurround::GetValueCount() const
1162 {
1163 	return SURROUND_END - SURROUND_BEGIN;
1164 }
1165 
1166 
1167 sal_Bool SwFmtSurround::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1168 {
1169 	// hier wird immer konvertiert!
1170 	nMemberId &= ~CONVERT_TWIPS;
1171 	sal_Bool bRet = sal_True;
1172 	switch ( nMemberId )
1173 	{
1174 		case MID_SURROUND_SURROUNDTYPE:
1175 				rVal <<= (text::WrapTextMode)GetSurround();
1176 		break;
1177 		case MID_SURROUND_ANCHORONLY:
1178 		{
1179 			sal_Bool bTmp = IsAnchorOnly();
1180 			rVal.setValue(&bTmp, ::getBooleanCppuType());
1181 		}
1182 				break;
1183 		case MID_SURROUND_CONTOUR:
1184 		{
1185 			sal_Bool bTmp = IsContour();
1186 			rVal.setValue(&bTmp, ::getBooleanCppuType());
1187 		}
1188 				break;
1189 		case MID_SURROUND_CONTOUROUTSIDE:
1190 		{
1191 			sal_Bool bTmp = IsOutside();
1192 			rVal.setValue(&bTmp, ::getBooleanCppuType());
1193 		}
1194 				break;
1195 		default:
1196 			ASSERT( !this, "unknown MemberId" );
1197 			bRet = sal_False;
1198 	}
1199 	return bRet;
1200 }
1201 
1202 sal_Bool SwFmtSurround::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1203 {
1204 	// hier wird immer konvertiert!
1205 	nMemberId &= ~CONVERT_TWIPS;
1206 	sal_Bool bRet = sal_True;
1207 	switch ( nMemberId )
1208 	{
1209 		case MID_SURROUND_SURROUNDTYPE:
1210 		{
1211 			sal_Int32 eVal = SWUnoHelper::GetEnumAsInt32( rVal );
1212 			if( eVal >= 0 && eVal < (sal_Int16)SURROUND_END )
1213 				SetValue( static_cast<sal_uInt16>(eVal) );
1214 			else {
1215 				//exception
1216 				;
1217             }
1218 		}
1219 		break;
1220 
1221 		case MID_SURROUND_ANCHORONLY:
1222 			SetAnchorOnly( *(sal_Bool*)rVal.getValue() );
1223 			break;
1224 		case MID_SURROUND_CONTOUR:
1225 			SetContour( *(sal_Bool*)rVal.getValue() );
1226 			break;
1227 		case MID_SURROUND_CONTOUROUTSIDE:
1228 			SetOutside( *(sal_Bool*)rVal.getValue() );
1229 			break;
1230 		default:
1231 			ASSERT( !this, "unknown MemberId" );
1232 			bRet = sal_False;
1233 	}
1234 	return bRet;
1235 }
1236 
1237 //	class SwFmtVertOrient
1238 //	Implementierung teilweise inline im hxx
1239 
1240 SwFmtVertOrient::SwFmtVertOrient( SwTwips nY, sal_Int16 eVert,
1241                                   sal_Int16 eRel )
1242 	: SfxPoolItem( RES_VERT_ORIENT ),
1243 	nYPos( nY ),
1244 	eOrient( eVert ),
1245 	eRelation( eRel )
1246 {}
1247 
1248 int  SwFmtVertOrient::operator==( const SfxPoolItem& rAttr ) const
1249 {
1250 	ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
1251 	return ( nYPos     == ((SwFmtVertOrient&)rAttr).nYPos &&
1252 			 eOrient   == ((SwFmtVertOrient&)rAttr).eOrient &&
1253 			 eRelation == ((SwFmtVertOrient&)rAttr).eRelation );
1254 }
1255 
1256 SfxPoolItem*  SwFmtVertOrient::Clone( SfxItemPool* ) const
1257 {
1258 	return new SwFmtVertOrient( nYPos, eOrient, eRelation );
1259 }
1260 
1261 sal_Bool SwFmtVertOrient::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1262 {
1263 	// hier wird immer konvertiert!
1264 	nMemberId &= ~CONVERT_TWIPS;
1265 	sal_Bool bRet = sal_True;
1266 	switch ( nMemberId )
1267 	{
1268 		case MID_VERTORIENT_ORIENT:
1269 		{
1270             sal_Int16 nRet = text::VertOrientation::NONE;
1271 			switch( eOrient )
1272 			{
1273                 case text::VertOrientation::TOP        :  nRet = text::VertOrientation::TOP        ;break;
1274                 case text::VertOrientation::CENTER     :  nRet = text::VertOrientation::CENTER     ;break;
1275                 case text::VertOrientation::BOTTOM     :  nRet = text::VertOrientation::BOTTOM     ;break;
1276                 case text::VertOrientation::CHAR_TOP   :  nRet = text::VertOrientation::CHAR_TOP   ;break;
1277                 case text::VertOrientation::CHAR_CENTER:  nRet = text::VertOrientation::CHAR_CENTER;break;
1278                 case text::VertOrientation::CHAR_BOTTOM:  nRet = text::VertOrientation::CHAR_BOTTOM;break;
1279                 case text::VertOrientation::LINE_TOP   :  nRet = text::VertOrientation::LINE_TOP   ;break;
1280                 case text::VertOrientation::LINE_CENTER:  nRet = text::VertOrientation::LINE_CENTER;break;
1281                 case text::VertOrientation::LINE_BOTTOM:  nRet = text::VertOrientation::LINE_BOTTOM;break;
1282                 default: break;
1283 			}
1284 			rVal <<= nRet;
1285 		}
1286 		break;
1287 		case MID_VERTORIENT_RELATION:
1288 				rVal <<= lcl_RelToINT(eRelation);
1289 		break;
1290 		case MID_VERTORIENT_POSITION:
1291 				rVal <<= (sal_Int32)TWIP_TO_MM100(GetPos());
1292 				break;
1293 		default:
1294 			ASSERT( !this, "unknown MemberId" );
1295 			bRet = sal_False;
1296 	}
1297 	return bRet;
1298 }
1299 
1300 sal_Bool SwFmtVertOrient::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1301 {
1302 	sal_Bool bConvert = 0 != (nMemberId&CONVERT_TWIPS);
1303 	nMemberId &= ~CONVERT_TWIPS;
1304 	sal_Bool bRet = sal_True;
1305 	switch ( nMemberId )
1306 	{
1307 		case MID_VERTORIENT_ORIENT:
1308 		{
1309 			sal_uInt16 nVal = 0;
1310 			rVal >>= nVal;
1311 			switch( nVal )
1312 			{
1313                 case text::VertOrientation::NONE:           eOrient = text::VertOrientation::NONE;    break;
1314                 case text::VertOrientation::TOP        :    eOrient = text::VertOrientation::TOP;     break;
1315                 case text::VertOrientation::CENTER     :    eOrient = text::VertOrientation::CENTER;     break;
1316                 case text::VertOrientation::BOTTOM     :    eOrient = text::VertOrientation::BOTTOM;     break;
1317                 case text::VertOrientation::CHAR_TOP   :    eOrient = text::VertOrientation::CHAR_TOP;   break;
1318                 case text::VertOrientation::CHAR_CENTER:    eOrient = text::VertOrientation::CHAR_CENTER;break;
1319                 case text::VertOrientation::CHAR_BOTTOM:    eOrient = text::VertOrientation::CHAR_BOTTOM;break;
1320                 case text::VertOrientation::LINE_TOP   :    eOrient = text::VertOrientation::LINE_TOP;    break;
1321                 case text::VertOrientation::LINE_CENTER:    eOrient = text::VertOrientation::LINE_CENTER;break;
1322                 case text::VertOrientation::LINE_BOTTOM:    eOrient = text::VertOrientation::LINE_BOTTOM;break;
1323 			}
1324 		}
1325 		break;
1326 		case MID_VERTORIENT_RELATION:
1327 		{
1328 			eRelation = lcl_IntToRelation(rVal);
1329 		}
1330 		break;
1331 		case MID_VERTORIENT_POSITION:
1332 		{
1333 			sal_Int32 nVal = 0;
1334 			rVal >>= nVal;
1335 			if(bConvert)
1336 				nVal = MM100_TO_TWIP(nVal);
1337 			SetPos( nVal );
1338 		}
1339 		break;
1340 		default:
1341 			ASSERT( !this, "unknown MemberId" );
1342 			bRet = sal_False;
1343 	}
1344 	return bRet;
1345 }
1346 
1347 
1348 
1349 //	class SwFmtHoriOrient
1350 //	Implementierung teilweise inline im hxx
1351 
1352 SwFmtHoriOrient::SwFmtHoriOrient( SwTwips nX, sal_Int16 eHori,
1353                               sal_Int16 eRel, sal_Bool bPos )
1354 	: SfxPoolItem( RES_HORI_ORIENT ),
1355 	nXPos( nX ),
1356 	eOrient( eHori ),
1357 	eRelation( eRel ),
1358 	bPosToggle( bPos )
1359 {}
1360 
1361 int  SwFmtHoriOrient::operator==( const SfxPoolItem& rAttr ) const
1362 {
1363 	ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
1364 	return ( nXPos == ((SwFmtHoriOrient&)rAttr).nXPos &&
1365 			 eOrient == ((SwFmtHoriOrient&)rAttr).eOrient &&
1366 			 eRelation == ((SwFmtHoriOrient&)rAttr).eRelation &&
1367 			 bPosToggle == ((SwFmtHoriOrient&)rAttr).bPosToggle );
1368 }
1369 
1370 SfxPoolItem*  SwFmtHoriOrient::Clone( SfxItemPool* ) const
1371 {
1372 	return new SwFmtHoriOrient( nXPos, eOrient, eRelation, bPosToggle );
1373 }
1374 
1375 sal_Bool SwFmtHoriOrient::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1376 {
1377 	// hier wird immer konvertiert!
1378 	nMemberId &= ~CONVERT_TWIPS;
1379 	sal_Bool bRet = sal_True;
1380 	switch ( nMemberId )
1381 	{
1382 		case MID_HORIORIENT_ORIENT:
1383 		{
1384             sal_Int16 nRet = text::HoriOrientation::NONE;
1385 			switch( eOrient )
1386 			{
1387                 case text::HoriOrientation::RIGHT:    nRet = text::HoriOrientation::RIGHT; break;
1388                 case text::HoriOrientation::CENTER :  nRet = text::HoriOrientation::CENTER; break;
1389                 case text::HoriOrientation::LEFT   :  nRet = text::HoriOrientation::LEFT; break;
1390                 case text::HoriOrientation::INSIDE :  nRet = text::HoriOrientation::INSIDE; break;
1391                 case text::HoriOrientation::OUTSIDE:  nRet = text::HoriOrientation::OUTSIDE; break;
1392                 case text::HoriOrientation::FULL:     nRet = text::HoriOrientation::FULL; break;
1393                 case text::HoriOrientation::LEFT_AND_WIDTH :
1394                     nRet = text::HoriOrientation::LEFT_AND_WIDTH;
1395                     break;
1396                 default:
1397                     break;
1398 
1399 			}
1400 			rVal <<= nRet;
1401 		}
1402 		break;
1403 		case MID_HORIORIENT_RELATION:
1404 			rVal <<= lcl_RelToINT(eRelation);
1405 		break;
1406 		case MID_HORIORIENT_POSITION:
1407 				rVal <<= (sal_Int32)TWIP_TO_MM100(GetPos());
1408 				break;
1409 		case MID_HORIORIENT_PAGETOGGLE:
1410 		{
1411 			sal_Bool bTmp = IsPosToggle();
1412 			rVal.setValue(&bTmp, ::getBooleanCppuType());
1413 		}
1414 				break;
1415 		default:
1416 			ASSERT( !this, "unknown MemberId" );
1417 			bRet = sal_False;
1418 	}
1419 	return bRet;
1420 }
1421 
1422 sal_Bool SwFmtHoriOrient::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1423 {
1424 	sal_Bool bConvert = 0 != (nMemberId&CONVERT_TWIPS);
1425 	nMemberId &= ~CONVERT_TWIPS;
1426 	sal_Bool bRet = sal_True;
1427 	switch ( nMemberId )
1428 	{
1429 		case MID_HORIORIENT_ORIENT:
1430 		{
1431             sal_Int16 nVal = 0;
1432             rVal >>= nVal;
1433             switch( nVal )
1434 			{
1435                 case text::HoriOrientation::NONE:       eOrient = text::HoriOrientation::NONE ;   break;
1436                 case text::HoriOrientation::RIGHT:  eOrient = text::HoriOrientation::RIGHT;   break;
1437                 case text::HoriOrientation::CENTER :    eOrient = text::HoriOrientation::CENTER;  break;
1438                 case text::HoriOrientation::LEFT   :    eOrient = text::HoriOrientation::LEFT;    break;
1439                 case text::HoriOrientation::INSIDE :    eOrient = text::HoriOrientation::INSIDE;  break;
1440                 case text::HoriOrientation::OUTSIDE:    eOrient = text::HoriOrientation::OUTSIDE; break;
1441                 case text::HoriOrientation::FULL:      eOrient = text::HoriOrientation::FULL;     break;
1442                 case text::HoriOrientation::LEFT_AND_WIDTH:
1443                     eOrient = text::HoriOrientation::LEFT_AND_WIDTH;
1444 				break;
1445 			}
1446 		}
1447 		break;
1448 		case MID_HORIORIENT_RELATION:
1449 		{
1450 			eRelation = lcl_IntToRelation(rVal);
1451 		}
1452 		break;
1453 		case MID_HORIORIENT_POSITION:
1454 		{
1455             sal_Int32 nVal = 0;
1456             if(!(rVal >>= nVal))
1457                 bRet = sal_False;
1458 			if(bConvert)
1459 				nVal = MM100_TO_TWIP(nVal);
1460 			SetPos( nVal );
1461 		}
1462 		break;
1463 		case MID_HORIORIENT_PAGETOGGLE:
1464 				SetPosToggle( *(sal_Bool*)rVal.getValue());
1465 			break;
1466 		default:
1467 			ASSERT( !this, "unknown MemberId" );
1468 			bRet = sal_False;
1469 	}
1470 	return bRet;
1471 }
1472 
1473 
1474 
1475 //	class SwFmtAnchor
1476 //	Implementierung teilweise inline im hxx
1477 
1478 SwFmtAnchor::SwFmtAnchor( RndStdIds nRnd, sal_uInt16 nPage )
1479 	: SfxPoolItem( RES_ANCHOR ),
1480 	pCntntAnchor( 0 ),
1481 	nAnchorId( nRnd ),
1482     nPageNum( nPage ),
1483     // OD 2004-05-05 #i28701# - get always new increased order number
1484     mnOrder( ++mnOrderCounter )
1485 {}
1486 
1487 SwFmtAnchor::SwFmtAnchor( const SwFmtAnchor &rCpy )
1488 	: SfxPoolItem( RES_ANCHOR ),
1489 	nAnchorId( rCpy.GetAnchorId() ),
1490     nPageNum( rCpy.GetPageNum() ),
1491     // OD 2004-05-05 #i28701# - get always new increased order number
1492     mnOrder( ++mnOrderCounter )
1493 {
1494 	pCntntAnchor = rCpy.GetCntntAnchor() ?
1495 						new SwPosition( *rCpy.GetCntntAnchor() ) : 0;
1496 }
1497 
1498  SwFmtAnchor::~SwFmtAnchor()
1499 {
1500 	delete pCntntAnchor;
1501 }
1502 
1503 void SwFmtAnchor::SetAnchor( const SwPosition *pPos )
1504 {
1505 	if ( pCntntAnchor )
1506 		delete pCntntAnchor;
1507 	pCntntAnchor = pPos ? new SwPosition( *pPos ) : 0;
1508 		//AM Absatz gebundene Flys sollten nie in den Absatz hineinzeigen.
1509     if (pCntntAnchor &&
1510         ((FLY_AT_PARA == nAnchorId) || (FLY_AT_FLY == nAnchorId)))
1511     {
1512 		pCntntAnchor->nContent.Assign( 0, 0 );
1513     }
1514 }
1515 
1516 SwFmtAnchor& SwFmtAnchor::operator=(const SwFmtAnchor& rAnchor)
1517 {
1518 	nAnchorId  = rAnchor.GetAnchorId();
1519 	nPageNum   = rAnchor.GetPageNum();
1520     // OD 2004-05-05 #i28701# - get always new increased order number
1521     mnOrder = ++mnOrderCounter;
1522 
1523 	delete pCntntAnchor;
1524 	pCntntAnchor = rAnchor.pCntntAnchor ?
1525 									new SwPosition(*(rAnchor.pCntntAnchor)) : 0;
1526 	return *this;
1527 }
1528 
1529 int  SwFmtAnchor::operator==( const SfxPoolItem& rAttr ) const
1530 {
1531 	ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
1532     // OD 2004-05-05 #i28701# - Note: <mnOrder> hasn't to be considered.
1533 	return ( nAnchorId == ((SwFmtAnchor&)rAttr).GetAnchorId() &&
1534 			 nPageNum == ((SwFmtAnchor&)rAttr).GetPageNum()   &&
1535 					//Anker vergleichen. Entweder zeigen beide auf das gleiche
1536 					//Attribut bzw. sind 0 oder die SwPosition* sind beide
1537 					//gueltig und die SwPositions sind gleich.
1538 			 (pCntntAnchor == ((SwFmtAnchor&)rAttr).GetCntntAnchor() ||
1539 			  (pCntntAnchor && ((SwFmtAnchor&)rAttr).GetCntntAnchor() &&
1540 			   *pCntntAnchor == *((SwFmtAnchor&)rAttr).GetCntntAnchor())));
1541 }
1542 
1543 SfxPoolItem*  SwFmtAnchor::Clone( SfxItemPool* ) const
1544 {
1545 	return new SwFmtAnchor( *this );
1546 }
1547 
1548 // OD 2004-05-05 #i28701#
1549 sal_uInt32 SwFmtAnchor::mnOrderCounter = 0;
1550 
1551 // OD 2004-05-05 #i28701#
1552 sal_uInt32 SwFmtAnchor::GetOrder() const
1553 {
1554     return mnOrder;
1555 }
1556 
1557 /*-----------------16.02.98 15:21-------------------
1558 
1559 --------------------------------------------------*/
1560 sal_Bool SwFmtAnchor::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1561 {
1562 	// hier wird immer konvertiert!
1563 	nMemberId &= ~CONVERT_TWIPS;
1564 	sal_Bool bRet = sal_True;
1565 	switch ( nMemberId )
1566 	{
1567 		case MID_ANCHOR_ANCHORTYPE:
1568 
1569 			text::TextContentAnchorType eRet;
1570             switch (GetAnchorId())
1571             {
1572                 case  FLY_AT_CHAR:
1573                     eRet = text::TextContentAnchorType_AT_CHARACTER;
1574                     break;
1575                 case  FLY_AT_PAGE:
1576                     eRet = text::TextContentAnchorType_AT_PAGE;
1577                     break;
1578                 case  FLY_AT_FLY:
1579                     eRet = text::TextContentAnchorType_AT_FRAME;
1580                     break;
1581                 case  FLY_AS_CHAR:
1582                     eRet = text::TextContentAnchorType_AS_CHARACTER;
1583                     break;
1584                 //case  FLY_AT_PARA:
1585                 default:
1586                     eRet = text::TextContentAnchorType_AT_PARAGRAPH;
1587             }
1588 			rVal <<= eRet;
1589 		break;
1590 		case MID_ANCHOR_PAGENUM:
1591 			rVal <<= (sal_Int16)GetPageNum();
1592         break;
1593         case MID_ANCHOR_ANCHORFRAME:
1594         {
1595             if(pCntntAnchor && FLY_AT_FLY == nAnchorId)
1596             {
1597                 SwFrmFmt* pFmt = pCntntAnchor->nNode.GetNode().GetFlyFmt();
1598                 if(pFmt)
1599                 {
1600                     uno::Reference<container::XNamed> xNamed = SwXFrames::GetObject( *pFmt, FLYCNTTYPE_FRM );
1601                     uno::Reference<text::XTextFrame> xRet(xNamed, uno::UNO_QUERY);
1602                     rVal <<= xRet;
1603                 }
1604             }
1605         }
1606         break;
1607         default:
1608 			ASSERT( !this, "unknown MemberId" );
1609 			bRet = sal_False;
1610 	}
1611 	return bRet;
1612 }
1613 
1614 sal_Bool SwFmtAnchor::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1615 {
1616 	// hier wird immer konvertiert!
1617 	nMemberId &= ~CONVERT_TWIPS;
1618 	sal_Bool bRet = sal_True;
1619 	switch ( nMemberId )
1620 	{
1621 		case MID_ANCHOR_ANCHORTYPE:
1622 		{
1623 			RndStdIds	eAnchor;
1624 			switch( SWUnoHelper::GetEnumAsInt32( rVal ) )
1625 			{
1626 				case  text::TextContentAnchorType_AS_CHARACTER:
1627                     eAnchor = FLY_AS_CHAR;
1628 					break;
1629 				case  text::TextContentAnchorType_AT_PAGE:
1630                     eAnchor = FLY_AT_PAGE;
1631 					if( GetPageNum() > 0 && pCntntAnchor )
1632 					{
1633 						// If the anchor type is page and a valid page number
1634 						// has been set, the content position isn't required
1635 						// any longer.
1636 						delete pCntntAnchor;
1637 						pCntntAnchor = 0;
1638 					}
1639 					break;
1640 				case  text::TextContentAnchorType_AT_FRAME:
1641 					eAnchor = FLY_AT_FLY;
1642 					break;
1643 				case  text::TextContentAnchorType_AT_CHARACTER:
1644                     eAnchor = FLY_AT_CHAR;
1645 					break;
1646 				//case  text::TextContentAnchorType_AT_PARAGRAPH:
1647 				default:
1648                     eAnchor = FLY_AT_PARA;
1649 					break;
1650 			}
1651 			SetType( eAnchor );
1652 		}
1653 		break;
1654 		case MID_ANCHOR_PAGENUM:
1655 		{
1656             sal_Int16 nVal = 0;
1657             if((rVal >>= nVal) && nVal > 0)
1658 			{
1659 				SetPageNum( nVal );
1660                 if ((FLY_AT_PAGE == GetAnchorId()) && pCntntAnchor)
1661                 {
1662 					// If the anchor type is page and a valid page number
1663 					// is set, the content paoition has to be deleted to not
1664 					// confuse the layout (frmtool.cxx). However, if the
1665 					// anchor type is not page, any content position will
1666 					// be kept.
1667 					delete pCntntAnchor;
1668 					pCntntAnchor = 0;
1669 				}
1670 			}
1671 			else
1672 				bRet = sal_False;
1673 		}
1674 		break;
1675         case MID_ANCHOR_ANCHORFRAME:
1676         //no break here!;
1677 		default:
1678 			ASSERT( !this, "unknown MemberId" );
1679 			bRet = sal_False;
1680 	}
1681 	return bRet;
1682 }
1683 
1684 //	class SwFmtURL
1685 //	Implementierung teilweise inline im hxx
1686 
1687 SwFmtURL::SwFmtURL() :
1688 	SfxPoolItem( RES_URL ),
1689 	pMap( 0 ),
1690 	bIsServerMap( sal_False )
1691 {
1692 }
1693 
1694 SwFmtURL::SwFmtURL( const SwFmtURL &rURL) :
1695 	SfxPoolItem( RES_URL ),
1696     sTargetFrameName( rURL.GetTargetFrameName() ),
1697     sURL( rURL.GetURL() ),
1698     sName( rURL.GetName() ),
1699 	bIsServerMap( rURL.IsServerMap() )
1700 {
1701 	pMap = rURL.GetMap() ? new ImageMap( *rURL.GetMap() ) : 0;
1702 }
1703 
1704 SwFmtURL::~SwFmtURL()
1705 {
1706 	if ( pMap )
1707 		delete pMap;
1708 }
1709 
1710 int SwFmtURL::operator==( const SfxPoolItem &rAttr ) const
1711 {
1712 	ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
1713 	const SwFmtURL &rCmp = (SwFmtURL&)rAttr;
1714 	sal_Bool bRet = bIsServerMap  	 == rCmp.IsServerMap() &&
1715 				sURL			 == rCmp.GetURL() &&
1716 				sTargetFrameName == rCmp.GetTargetFrameName() &&
1717 				sName 			 == rCmp.GetName();
1718 	if ( bRet )
1719 	{
1720 		if ( pMap && rCmp.GetMap() )
1721 			bRet = *pMap == *rCmp.GetMap();
1722 		else
1723 			bRet = pMap == rCmp.GetMap();
1724 	}
1725 	return bRet;
1726 }
1727 
1728 SfxPoolItem* SwFmtURL::Clone( SfxItemPool* ) const
1729 {
1730 	return new SwFmtURL( *this );
1731 }
1732 
1733 void SwFmtURL::SetURL( const XubString &rURL, sal_Bool bServerMap )
1734 {
1735 	sURL = rURL;
1736 	bIsServerMap = bServerMap;
1737 }
1738 
1739 void SwFmtURL::SetMap( const ImageMap *pM )
1740 {
1741 	if ( pMap )
1742 		delete pMap;
1743 	pMap = pM ? new ImageMap( *pM ) : 0;
1744 }
1745 extern const SvEventDescription* lcl_GetSupportedMacroItems();
1746 
1747 sal_Bool SwFmtURL::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1748 {
1749 	// hier wird immer konvertiert!
1750 	nMemberId &= ~CONVERT_TWIPS;
1751 	sal_Bool bRet = sal_True;
1752 	switch ( nMemberId )
1753 	{
1754 		case MID_URL_URL:
1755 		{
1756 			OUString sRet = GetURL();
1757 			rVal <<= sRet;
1758 		}
1759 		break;
1760 		case MID_URL_TARGET:
1761 		{
1762 			OUString sRet = GetTargetFrameName();
1763 			rVal <<= sRet;
1764 		}
1765 		break;
1766 		case MID_URL_HYPERLINKNAME:
1767 			rVal <<= OUString( GetName() );
1768 			break;
1769 		case MID_URL_CLIENTMAP:
1770         {
1771             uno::Reference< uno::XInterface > xInt;
1772             if(pMap)
1773             {
1774                 xInt = SvUnoImageMap_createInstance( *pMap, lcl_GetSupportedMacroItems() );
1775             }
1776             else
1777             {
1778                 ImageMap aEmptyMap;
1779                 xInt = SvUnoImageMap_createInstance( aEmptyMap, lcl_GetSupportedMacroItems() );
1780             }
1781             uno::Reference< container::XIndexContainer > xCont(xInt, uno::UNO_QUERY);
1782             rVal <<= xCont;
1783         }
1784         break;
1785 		case MID_URL_SERVERMAP:
1786 		{
1787 			sal_Bool bTmp = IsServerMap();
1788 			rVal.setValue(&bTmp, ::getBooleanCppuType());
1789 		}
1790 			break;
1791 		default:
1792 			ASSERT( !this, "unknown MemberId" );
1793 			bRet = sal_False;
1794 	}
1795 	return bRet;
1796 }
1797 
1798 sal_Bool SwFmtURL::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1799 {
1800 	// hier wird immer konvertiert!
1801 	nMemberId &= ~CONVERT_TWIPS;
1802 	sal_Bool bRet = sal_True;
1803 	switch ( nMemberId )
1804 	{
1805 		case MID_URL_URL:
1806         {
1807             OUString sTmp;
1808             rVal >>= sTmp;
1809             SetURL( sTmp, bIsServerMap );
1810         }
1811 		break;
1812 		case MID_URL_TARGET:
1813         {
1814             OUString sTmp;
1815             rVal >>= sTmp;
1816             SetTargetFrameName( sTmp );
1817         }
1818 		break;
1819 		case MID_URL_HYPERLINKNAME:
1820         {
1821             OUString sTmp;
1822             rVal >>= sTmp;
1823             SetName( sTmp );
1824         }
1825 		break;
1826 		case MID_URL_CLIENTMAP:
1827         {
1828             uno::Reference<container::XIndexContainer> xCont;
1829             if(!rVal.hasValue())
1830                 DELETEZ(pMap);
1831             else if(rVal >>= xCont)
1832             {
1833                 if(!pMap)
1834                     pMap = new ImageMap;
1835                 bRet = SvUnoImageMap_fillImageMap( xCont, *pMap );
1836             }
1837             else
1838                 bRet = sal_False;
1839         }
1840         break;
1841 		case MID_URL_SERVERMAP:
1842 			bIsServerMap = *(sal_Bool*)rVal.getValue();
1843 			break;
1844 		default:
1845 			ASSERT( !this, "unknown MemberId" );
1846 			bRet = sal_False;
1847 	}
1848 	return bRet;
1849 }
1850 
1851 
1852 // class SwNoReadOnly
1853 
1854 SfxPoolItem* SwFmtEditInReadonly::Clone( SfxItemPool* ) const
1855 {
1856 	return new SwFmtEditInReadonly( Which(), GetValue() );
1857 }
1858 
1859 // class SwFmtLayoutSplit
1860 
1861 SfxPoolItem* SwFmtLayoutSplit::Clone( SfxItemPool* ) const
1862 {
1863 	return new SwFmtLayoutSplit( GetValue() );
1864 }
1865 
1866 // class SwFmtRowSplit
1867 
1868 SfxPoolItem* SwFmtRowSplit::Clone( SfxItemPool* ) const
1869 {
1870     return new SwFmtRowSplit( GetValue() );
1871 }
1872 
1873 
1874 // class SwFmtNoBalancedColumns
1875 
1876 SfxPoolItem* SwFmtNoBalancedColumns::Clone( SfxItemPool* ) const
1877 {
1878 	return new SwFmtNoBalancedColumns( GetValue() );
1879 }
1880 
1881 // class SwFmtFtnEndAtTxtEnd
1882 
1883 sal_uInt16 SwFmtFtnEndAtTxtEnd::GetValueCount() const
1884 {
1885 	return sal_uInt16( FTNEND_ATTXTEND_END );
1886 }
1887 
1888 SwFmtFtnEndAtTxtEnd& SwFmtFtnEndAtTxtEnd::operator=(
1889 						const SwFmtFtnEndAtTxtEnd& rAttr )
1890 {
1891 	SfxEnumItem::SetValue( rAttr.GetValue() );
1892 	aFmt = rAttr.aFmt;
1893 	nOffset = rAttr.nOffset;
1894 	sPrefix = rAttr.sPrefix;
1895 	sSuffix = rAttr.sSuffix;
1896 	return *this;
1897 }
1898 
1899 int SwFmtFtnEndAtTxtEnd::operator==( const SfxPoolItem& rItem ) const
1900 {
1901 	const SwFmtFtnEndAtTxtEnd& rAttr = (SwFmtFtnEndAtTxtEnd&)rItem;
1902 	return SfxEnumItem::operator==( rAttr ) &&
1903 			aFmt.GetNumberingType() == rAttr.aFmt.GetNumberingType() &&
1904 			nOffset == rAttr.nOffset &&
1905 			sPrefix == rAttr.sPrefix &&
1906 			sSuffix == rAttr.sSuffix;
1907 }
1908 
1909 sal_Bool SwFmtFtnEndAtTxtEnd::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1910 {
1911 	nMemberId &= ~CONVERT_TWIPS;
1912 	switch(nMemberId)
1913 	{
1914 		case MID_COLLECT	 :
1915 		{
1916 			sal_Bool bVal = GetValue() >= FTNEND_ATTXTEND;
1917 			rVal.setValue(&bVal, ::getBooleanCppuType());
1918 		}
1919 		break;
1920 		case MID_RESTART_NUM :
1921 		{
1922 			sal_Bool bVal = GetValue() >= FTNEND_ATTXTEND_OWNNUMSEQ;
1923 			rVal.setValue(&bVal, ::getBooleanCppuType());
1924 		}
1925 		break;
1926 		case MID_NUM_START_AT: rVal <<= (sal_Int16) nOffset; break;
1927 		case MID_OWN_NUM     :
1928 		{
1929 			sal_Bool bVal = GetValue() >= FTNEND_ATTXTEND_OWNNUMANDFMT;
1930 			rVal.setValue(&bVal, ::getBooleanCppuType());
1931 		}
1932 		break;
1933 		case MID_NUM_TYPE    : rVal <<= aFmt.GetNumberingType(); break;
1934 		case MID_PREFIX      : rVal <<= OUString(sPrefix); break;
1935 		case MID_SUFFIX      : rVal <<= OUString(sSuffix); break;
1936 		default: return sal_False;
1937 	}
1938 	return sal_True;
1939 }
1940 
1941 sal_Bool SwFmtFtnEndAtTxtEnd::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1942 {
1943 	sal_Bool bRet = sal_True;
1944 	nMemberId &= ~CONVERT_TWIPS;
1945 	switch(nMemberId)
1946 	{
1947 		case MID_COLLECT	 :
1948 		{
1949 			sal_Bool bVal = *(sal_Bool*)rVal.getValue();
1950 			if(!bVal && GetValue() >= FTNEND_ATTXTEND)
1951 				SetValue(FTNEND_ATPGORDOCEND);
1952 			else if(bVal && GetValue() < FTNEND_ATTXTEND)
1953 				SetValue(FTNEND_ATTXTEND);
1954 		}
1955 		break;
1956 		case MID_RESTART_NUM :
1957 		{
1958 			sal_Bool bVal = *(sal_Bool*)rVal.getValue();
1959 			if(!bVal && GetValue() >= FTNEND_ATTXTEND_OWNNUMSEQ)
1960 				SetValue(FTNEND_ATTXTEND);
1961 			else if(bVal && GetValue() < FTNEND_ATTXTEND_OWNNUMSEQ)
1962 				SetValue(FTNEND_ATTXTEND_OWNNUMSEQ);
1963 		}
1964 		break;
1965 		case MID_NUM_START_AT:
1966 		{
1967 			sal_Int16 nVal = 0;
1968 			rVal >>= nVal;
1969 			if(nVal >= 0)
1970 				nOffset = nVal;
1971 			else
1972 				bRet = sal_False;
1973 		}
1974 		break;
1975 		case MID_OWN_NUM     :
1976 		{
1977 			sal_Bool bVal = *(sal_Bool*)rVal.getValue();
1978 			if(!bVal && GetValue() >= FTNEND_ATTXTEND_OWNNUMANDFMT)
1979 				SetValue(FTNEND_ATTXTEND_OWNNUMSEQ);
1980 			else if(bVal && GetValue() < FTNEND_ATTXTEND_OWNNUMANDFMT)
1981 				SetValue(FTNEND_ATTXTEND_OWNNUMANDFMT);
1982 		}
1983 		break;
1984 		case MID_NUM_TYPE    :
1985 		{
1986 			sal_Int16 nVal = 0;
1987 			rVal >>= nVal;
1988 			if(nVal >= 0 &&
1989 				(nVal <= SVX_NUM_ARABIC ||
1990 					SVX_NUM_CHARS_UPPER_LETTER_N == nVal ||
1991 						SVX_NUM_CHARS_LOWER_LETTER_N == nVal ))
1992 				aFmt.SetNumberingType(nVal);
1993 			else
1994 				bRet = sal_False;
1995 		}
1996 		break;
1997 		case MID_PREFIX      :
1998 		{
1999 			OUString sVal; rVal >>= sVal;
2000 			sPrefix = sVal;
2001 		}
2002 		break;
2003 		case MID_SUFFIX      :
2004 		{
2005 			OUString sVal; rVal >>= sVal;
2006 			sSuffix = sVal;
2007 		}
2008 		break;
2009 		default: bRet = sal_False;
2010 	}
2011 	return bRet;
2012 }
2013 
2014 
2015 // class SwFmtFtnAtTxtEnd
2016 
2017 SfxPoolItem* SwFmtFtnAtTxtEnd::Clone( SfxItemPool* ) const
2018 {
2019 	SwFmtFtnAtTxtEnd* pNew = new SwFmtFtnAtTxtEnd;
2020 	*pNew = *this;
2021 	return pNew;
2022 }
2023 
2024 // class SwFmtEndAtTxtEnd
2025 
2026 SfxPoolItem* SwFmtEndAtTxtEnd::Clone( SfxItemPool* ) const
2027 {
2028 	SwFmtEndAtTxtEnd* pNew = new SwFmtEndAtTxtEnd;
2029 	*pNew = *this;
2030 	return pNew;
2031 }
2032 
2033 //class SwFmtChain
2034 
2035 
2036 int SwFmtChain::operator==( const SfxPoolItem &rAttr ) const
2037 {
2038 	ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
2039 
2040 	return GetPrev() == ((SwFmtChain&)rAttr).GetPrev() &&
2041 		   GetNext() == ((SwFmtChain&)rAttr).GetNext();
2042 }
2043 
2044 SwFmtChain::SwFmtChain( const SwFmtChain &rCpy ) :
2045 	SfxPoolItem( RES_CHAIN )
2046 {
2047 	SetPrev( rCpy.GetPrev() );
2048 	SetNext( rCpy.GetNext() );
2049 }
2050 
2051 SfxPoolItem* SwFmtChain::Clone( SfxItemPool* ) const
2052 {
2053 	SwFmtChain *pRet = new SwFmtChain;
2054 	pRet->SetPrev( GetPrev() );
2055 	pRet->SetNext( GetNext() );
2056 	return pRet;
2057 }
2058 
2059 void SwFmtChain::SetPrev( SwFlyFrmFmt *pFmt )
2060 {
2061 	if ( pFmt )
2062 		pFmt->Add( &aPrev );
2063 	else if ( aPrev.GetRegisteredIn() )
2064 		((SwModify*)aPrev.GetRegisteredIn())->Remove( &aPrev );
2065 }
2066 
2067 void SwFmtChain::SetNext( SwFlyFrmFmt *pFmt )
2068 {
2069 	if ( pFmt )
2070 		pFmt->Add( &aNext );
2071 	else if ( aNext.GetRegisteredIn() )
2072 		((SwModify*)aNext.GetRegisteredIn())->Remove( &aNext );
2073 }
2074 
2075 sal_Bool SwFmtChain::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
2076 {
2077 	// hier wird immer konvertiert!
2078 	nMemberId &= ~CONVERT_TWIPS;
2079 	sal_Bool   bRet = sal_True;
2080 	XubString aRet;
2081 	switch ( nMemberId )
2082 	{
2083 		case MID_CHAIN_PREVNAME:
2084 			if ( GetPrev() )
2085 				aRet = GetPrev()->GetName();
2086 			break;
2087 		case MID_CHAIN_NEXTNAME:
2088 			if ( GetNext() )
2089 				aRet = GetNext()->GetName();
2090 			break;
2091 		default:
2092 			ASSERT( !this, "unknown MemberId" );
2093 			bRet = sal_False;
2094 	}
2095 	rVal <<= OUString(aRet);
2096 	return bRet;
2097 }
2098 
2099 
2100 
2101 
2102 //class SwFmtLineNumber
2103 
2104 SwFmtLineNumber::SwFmtLineNumber() :
2105 	SfxPoolItem( RES_LINENUMBER )
2106 {
2107 	nStartValue = 0;
2108 	bCountLines = sal_True;
2109 }
2110 
2111 SwFmtLineNumber::~SwFmtLineNumber()
2112 {
2113 }
2114 
2115 int SwFmtLineNumber::operator==( const SfxPoolItem &rAttr ) const
2116 {
2117 	ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
2118 
2119 	return nStartValue	== ((SwFmtLineNumber&)rAttr).GetStartValue() &&
2120 		   bCountLines	== ((SwFmtLineNumber&)rAttr).IsCount();
2121 }
2122 
2123 SfxPoolItem* SwFmtLineNumber::Clone( SfxItemPool* ) const
2124 {
2125 	return new SwFmtLineNumber( *this );
2126 }
2127 
2128 sal_Bool SwFmtLineNumber::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
2129 {
2130 	// hier wird immer konvertiert!
2131 	nMemberId &= ~CONVERT_TWIPS;
2132 	sal_Bool bRet = sal_True;
2133 	switch ( nMemberId )
2134 	{
2135 		case MID_LINENUMBER_COUNT:
2136 		{
2137 			sal_Bool bTmp = IsCount();
2138 			rVal.setValue(&bTmp, ::getBooleanCppuType());
2139 		}
2140 		break;
2141 		case MID_LINENUMBER_STARTVALUE:
2142 			rVal <<= (sal_Int32)GetStartValue();
2143 			break;
2144 		default:
2145 			ASSERT( !this, "unknown MemberId" );
2146 			bRet = sal_False;
2147 	}
2148 	return bRet;
2149 }
2150 
2151 sal_Bool SwFmtLineNumber::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
2152 {
2153 	// hier wird immer konvertiert!
2154 	nMemberId &= ~CONVERT_TWIPS;
2155 	sal_Bool bRet = sal_True;
2156 	switch ( nMemberId )
2157 	{
2158 		case MID_LINENUMBER_COUNT:
2159 			SetCountLines( *(sal_Bool*)rVal.getValue() );
2160 			break;
2161 		case MID_LINENUMBER_STARTVALUE:
2162         {
2163             sal_Int32 nVal = 0;
2164             if(rVal >>= nVal)
2165                 SetStartValue( nVal );
2166             else
2167                 bRet = sal_False;
2168         }
2169         break;
2170 		default:
2171 			ASSERT( !this, "unknown MemberId" );
2172 			bRet = sal_False;
2173 	}
2174 	return bRet;
2175 }
2176 
2177 /*************************************************************************
2178  *    class SwTextGridItem
2179  *************************************************************************/
2180 
2181 SwTextGridItem::SwTextGridItem()
2182     : SfxPoolItem( RES_TEXTGRID ), aColor( COL_LIGHTGRAY ), nLines( 20 ),
2183       nBaseHeight( 400 ), nRubyHeight( 200 ), eGridType( GRID_NONE ),
2184       bRubyTextBelow( 0 ), bPrintGrid( 1 ), bDisplayGrid( 1 ),
2185       nBaseWidth(400), bSnapToChars( 1 ), bSquaredMode(1)
2186 {
2187 }
2188 
2189 SwTextGridItem::~SwTextGridItem()
2190 {
2191 }
2192 
2193 int SwTextGridItem::operator==( const SfxPoolItem& rAttr ) const
2194 {
2195 	ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
2196     return eGridType == ((SwTextGridItem&)rAttr).GetGridType() &&
2197            nLines == ((SwTextGridItem&)rAttr).GetLines() &&
2198            nBaseHeight == ((SwTextGridItem&)rAttr).GetBaseHeight() &&
2199            nRubyHeight == ((SwTextGridItem&)rAttr).GetRubyHeight() &&
2200            bRubyTextBelow == ((SwTextGridItem&)rAttr).GetRubyTextBelow() &&
2201            bDisplayGrid == ((SwTextGridItem&)rAttr).GetDisplayGrid() &&
2202            bPrintGrid == ((SwTextGridItem&)rAttr).GetPrintGrid() &&
2203            aColor == ((SwTextGridItem&)rAttr).GetColor() &&
2204            nBaseWidth == ((SwTextGridItem&)rAttr).GetBaseWidth() &&
2205            bSnapToChars == ((SwTextGridItem&)rAttr).GetSnapToChars() &&
2206            bSquaredMode == ((SwTextGridItem&)rAttr).GetSquaredMode();
2207 }
2208 
2209 SfxPoolItem* SwTextGridItem::Clone( SfxItemPool* ) const
2210 {
2211     return new SwTextGridItem( *this );
2212 }
2213 
2214 SwTextGridItem& SwTextGridItem::operator=( const SwTextGridItem& rCpy )
2215 {
2216     aColor = rCpy.GetColor();
2217     nLines = rCpy.GetLines();
2218     nBaseHeight = rCpy.GetBaseHeight();
2219     nRubyHeight = rCpy.GetRubyHeight();
2220     eGridType = rCpy.GetGridType();
2221     bRubyTextBelow = rCpy.GetRubyTextBelow();
2222     bPrintGrid = rCpy.GetPrintGrid();
2223     bDisplayGrid = rCpy.GetDisplayGrid();
2224     nBaseWidth = rCpy.GetBaseWidth();
2225     bSnapToChars = rCpy.GetSnapToChars();
2226     bSquaredMode = rCpy.GetSquaredMode();
2227 
2228 	return *this;
2229 }
2230 
2231 sal_Bool SwTextGridItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
2232 {
2233     sal_Bool bRet = sal_True;
2234 
2235     switch( nMemberId & ~CONVERT_TWIPS )
2236     {
2237         case MID_GRID_COLOR:
2238             rVal <<= GetColor().GetColor();
2239             break;
2240         case MID_GRID_LINES:
2241             rVal <<= GetLines();
2242             break;
2243         case MID_GRID_RUBY_BELOW:
2244             rVal.setValue( &bRubyTextBelow, ::getBooleanCppuType() );
2245             break;
2246         case MID_GRID_PRINT:
2247             rVal.setValue( &bPrintGrid, ::getBooleanCppuType() );
2248             break;
2249         case MID_GRID_DISPLAY:
2250             rVal.setValue( &bDisplayGrid, ::getBooleanCppuType() );
2251             break;
2252         case MID_GRID_BASEHEIGHT:
2253             DBG_ASSERT( (nMemberId & CONVERT_TWIPS) != 0,
2254                         "This value needs TWIPS-MM100 conversion" );
2255             rVal <<= (sal_Int32) TWIP_TO_MM100_UNSIGNED(nBaseHeight);
2256             break;
2257         case MID_GRID_BASEWIDTH:
2258             DBG_ASSERT( (nMemberId & CONVERT_TWIPS) != 0,
2259                         "This value needs TWIPS-MM100 conversion" );
2260             rVal <<= (sal_Int32) TWIP_TO_MM100_UNSIGNED(nBaseWidth);
2261             break;
2262         case MID_GRID_RUBYHEIGHT:
2263             DBG_ASSERT( (nMemberId & CONVERT_TWIPS) != 0,
2264                         "This value needs TWIPS-MM100 conversion" );
2265             rVal <<= (sal_Int32)TWIP_TO_MM100_UNSIGNED(nRubyHeight);
2266             break;
2267         case MID_GRID_TYPE:
2268             switch( GetGridType() )
2269             {
2270                 case GRID_NONE:
2271                     rVal <<= text::TextGridMode::NONE;
2272                     break;
2273                 case GRID_LINES_ONLY:
2274                     rVal <<= text::TextGridMode::LINES;
2275                     break;
2276                 case GRID_LINES_CHARS:
2277                     rVal <<= text::TextGridMode::LINES_AND_CHARS;
2278                     break;
2279                 default:
2280                     DBG_ERROR("unknown SwTextGrid value");
2281                     bRet = sal_False;
2282                     break;
2283             }
2284             break;
2285         case MID_GRID_SNAPTOCHARS:
2286             rVal.setValue( &bSnapToChars, ::getBooleanCppuType() );
2287             break;
2288         case MID_GRID_STANDARD_MODE:
2289 			{
2290 				sal_Bool bStandardMode = !bSquaredMode;
2291     	        rVal.setValue( &bStandardMode, ::getBooleanCppuType() );
2292 			}
2293             break;
2294         default:
2295             DBG_ERROR("Unknown SwTextGridItem member");
2296             bRet = sal_False;
2297             break;
2298     }
2299 
2300 	return bRet;
2301 }
2302 
2303 sal_Bool SwTextGridItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
2304 {
2305 	sal_Bool bRet = sal_True;
2306     switch( nMemberId & ~CONVERT_TWIPS )
2307     {
2308         case MID_GRID_COLOR:
2309         {
2310             sal_Int32 nTmp = 0;
2311             bRet = (rVal >>= nTmp);
2312             if( bRet )
2313                 SetColor( Color(nTmp) );
2314         }
2315         break;
2316         case MID_GRID_LINES:
2317         {
2318             sal_Int16 nTmp = 0;
2319             bRet = (rVal >>= nTmp);
2320             if( bRet && (nTmp >= 0) )
2321                 SetLines( (sal_uInt16)nTmp );
2322             else
2323                 bRet = sal_False;
2324         }
2325         break;
2326         case MID_GRID_RUBY_BELOW:
2327             SetRubyTextBelow( *(sal_Bool*)rVal.getValue() );
2328             break;
2329         case MID_GRID_PRINT:
2330             SetPrintGrid( *(sal_Bool*)rVal.getValue() );
2331             break;
2332         case MID_GRID_DISPLAY:
2333             SetDisplayGrid( *(sal_Bool*)rVal.getValue() );
2334             break;
2335         case MID_GRID_BASEHEIGHT:
2336         case MID_GRID_BASEWIDTH:
2337         case MID_GRID_RUBYHEIGHT:
2338         {
2339             DBG_ASSERT( (nMemberId & CONVERT_TWIPS) != 0,
2340                         "This value needs TWIPS-MM100 conversion" );
2341             sal_Int32 nTmp = 0;
2342             bRet = (rVal >>= nTmp);
2343             nTmp = MM100_TO_TWIP( nTmp );
2344             if( bRet && (nTmp >= 0) && ( nTmp <= USHRT_MAX) )
2345                 if( (nMemberId & ~CONVERT_TWIPS) == MID_GRID_BASEHEIGHT )
2346                     SetBaseHeight( (sal_uInt16)nTmp );
2347                 else if( (nMemberId & ~CONVERT_TWIPS) == MID_GRID_BASEWIDTH )
2348                     SetBaseWidth( (sal_uInt16)nTmp );
2349                 else
2350                     SetRubyHeight( (sal_uInt16)nTmp );
2351             else
2352                 bRet = sal_False;
2353         }
2354         break;
2355         case MID_GRID_TYPE:
2356         {
2357             sal_Int16 nTmp = 0;
2358             bRet = (rVal >>= nTmp);
2359             if( bRet )
2360             {
2361                 switch( nTmp )
2362                 {
2363                     case text::TextGridMode::NONE:
2364                         SetGridType( GRID_NONE );
2365                         break;
2366                     case text::TextGridMode::LINES:
2367                         SetGridType( GRID_LINES_ONLY );
2368                         break;
2369                     case text::TextGridMode::LINES_AND_CHARS:
2370                         SetGridType( GRID_LINES_CHARS );
2371                         break;
2372                     default:
2373                         bRet = sal_False;
2374                         break;
2375                 }
2376             }
2377             break;
2378 		}
2379         case MID_GRID_SNAPTOCHARS:
2380             SetSnapToChars( *(sal_Bool*)rVal.getValue() );
2381             break;
2382         case MID_GRID_STANDARD_MODE:
2383 		{
2384 			sal_Bool bStandard = *(sal_Bool*)rVal.getValue();
2385            	SetSquaredMode( !bStandard );
2386         	break;
2387 		}
2388         default:
2389             DBG_ERROR("Unknown SwTextGridItem member");
2390             bRet = sal_False;
2391     }
2392 
2393     return bRet;
2394 }
2395 
2396 void SwTextGridItem::SwitchPaperMode(sal_Bool bNew)
2397 {
2398 	if( bNew == bSquaredMode )
2399 	{
2400 		//same paper mode, not switch
2401 		return;
2402 	}
2403 
2404 	// use default value when grid is disable
2405 	if( eGridType == GRID_NONE )
2406 	{
2407 		bSquaredMode = bNew;
2408 		Init();
2409 		return;
2410 	}
2411 
2412 	if( bSquaredMode )
2413 	{
2414 		//switch from "squared mode" to "standard mode"
2415 		nBaseWidth = nBaseHeight;
2416 		nBaseHeight = nBaseHeight + nRubyHeight;
2417 		nRubyHeight = 0;
2418 	}
2419 	else
2420 	{
2421 		//switch from "standard mode" to "squared mode"
2422 		nRubyHeight = nBaseHeight/3;
2423 		nBaseHeight = nBaseHeight - nRubyHeight;
2424 		nBaseWidth = nBaseHeight;
2425 	}
2426 	bSquaredMode = !bSquaredMode;
2427 }
2428 
2429 void SwTextGridItem::Init()
2430 {
2431 	if( bSquaredMode )
2432 	{
2433 		nLines = 20;
2434 		nBaseHeight = 400;
2435 		nRubyHeight = 200;
2436 		eGridType = GRID_NONE;
2437 		bRubyTextBelow = 0;
2438 		bPrintGrid = 1;
2439 		bDisplayGrid = 1;
2440 		bSnapToChars = 1;
2441 		nBaseWidth = 400;
2442 	}
2443 	else
2444 	{
2445 		nLines = 44;
2446 		nBaseHeight = 312;
2447 		nRubyHeight = 0;
2448 		eGridType = GRID_NONE;
2449 		bRubyTextBelow = 0;
2450 		bPrintGrid = 1;
2451 		bDisplayGrid = 1;
2452 		nBaseWidth = 210;
2453 		bSnapToChars = 1;
2454 
2455 		//default grid type is line only in CJK env
2456 		//disable this function due to type area change
2457 		//if grid type change.
2458 		//if(SvtCJKOptions().IsAsianTypographyEnabled())
2459 		//{
2460 		//	bDisplayGrid = 0;
2461 		//	eGridType = GRID_LINES_ONLY;
2462 		//}
2463 	}
2464 }
2465 // class SwHeaderAndFooterEatSpacingItem
2466 
2467 SfxPoolItem* SwHeaderAndFooterEatSpacingItem::Clone( SfxItemPool* ) const
2468 {
2469     return new SwHeaderAndFooterEatSpacingItem( Which(), GetValue() );
2470 }
2471 
2472 
2473 //  class SwFrmFmt
2474 //	Implementierung teilweise inline im hxx
2475 
2476 TYPEINIT1( SwFrmFmt, SwFmt );
2477 IMPL_FIXEDMEMPOOL_NEWDEL_DLL( SwFrmFmt, 20, 20 )
2478 
2479 void SwFrmFmt::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
2480 {
2481 	SwFmtHeader *pH = 0;
2482 	SwFmtFooter *pF = 0;
2483 
2484 	sal_uInt16 nWhich = pNew ? pNew->Which() : 0;
2485 
2486 	if( RES_ATTRSET_CHG == nWhich )
2487 	{
2488 		((SwAttrSetChg*)pNew)->GetChgSet()->GetItemState(
2489 			RES_HEADER, sal_False, (const SfxPoolItem**)&pH );
2490 		((SwAttrSetChg*)pNew)->GetChgSet()->GetItemState(
2491 			RES_FOOTER, sal_False, (const SfxPoolItem**)&pF );
2492 	}
2493 	else if( RES_HEADER == nWhich )
2494 		pH = (SwFmtHeader*)pNew;
2495 	else if( RES_FOOTER == nWhich )
2496 		pF = (SwFmtFooter*)pNew;
2497 
2498 	if( pH && pH->IsActive() && !pH->GetHeaderFmt() )
2499 	{	//Hat er keinen, mach ich ihm einen
2500         SwFrmFmt *pFmt = GetDoc()->MakeLayoutFmt( RND_STD_HEADER, 0 );
2501         pH->RegisterToFormat( *pFmt );
2502 	}
2503 
2504 	if( pF && pF->IsActive() && !pF->GetFooterFmt() )
2505 	{	//Hat er keinen, mach ich ihm einen
2506         SwFrmFmt *pFmt = GetDoc()->MakeLayoutFmt( RND_STD_FOOTER, 0 );
2507         pF->RegisterToFormat( *pFmt );
2508 	}
2509 
2510 	// MIB 24.3.98: Modify der Basisklasse muss immer gerufen werden, z.B.
2511 	// wegen RESET_FMTWRITTEN.
2512 //	if ( GetDepends() )
2513 		SwFmt::Modify( pOld, pNew );
2514 
2515     if (pOld && (RES_REMOVE_UNO_OBJECT == pOld->Which()))
2516     {   // invalidate cached uno object
2517         SetXObject(uno::Reference<uno::XInterface>(0));
2518     }
2519 }
2520 
2521 void SwFrmFmt::RegisterToFormat( SwFmt& rFmt )
2522 {
2523     rFmt.Add( this );
2524 }
2525 
2526 //Vernichtet alle Frms, die in aDepend angemeldet sind.
2527 
2528 void SwFrmFmt::DelFrms()
2529 {
2530 	SwIterator<SwFrm,SwFmt> aIter( *this );
2531 	SwFrm * pLast = aIter.First();
2532 	if( pLast )
2533 		do {
2534 				pLast->Cut();
2535 				delete pLast;
2536 		} while( 0 != ( pLast = aIter.Next() ));
2537 }
2538 
2539 void SwFrmFmt::MakeFrms()
2540 {
2541 	ASSERT( !this, "Sorry not implemented." );
2542 }
2543 
2544 
2545 
2546 SwRect SwFrmFmt::FindLayoutRect( const sal_Bool bPrtArea, const Point* pPoint,
2547 								 const sal_Bool bCalcFrm ) const
2548 {
2549 	SwRect aRet;
2550 	SwFrm *pFrm = 0;
2551 	if( ISA( SwSectionFmt ) )
2552 	{
2553         // dann den frame::Frame per Node2Layout besorgen
2554 		SwSectionNode* pSectNd = ((SwSectionFmt*)this)->GetSectionNode();
2555 		if( pSectNd )
2556 		{
2557 			SwNode2Layout aTmp( *pSectNd, pSectNd->GetIndex() - 1 );
2558 			pFrm = aTmp.NextFrm();
2559 
2560 			if( pFrm && !pFrm->KnowsFormat(*this) )
2561 			{
2562                 // die Section hat keinen eigenen frame::Frame, also falls
2563 				// jemand die tatsaechliche Groe?e braucht, so muss das
2564 				// noch implementier werden, in dem sich vom Ende noch
2565                 // der entsprechende frame::Frame besorgt wird.
2566 				// PROBLEM: was passiert bei SectionFrames, die auf unter-
2567 				//			schiedlichen Seiten stehen??
2568 				if( bPrtArea )
2569 					aRet = pFrm->Prt();
2570 				else
2571 				{
2572 					aRet = pFrm->Frm();
2573 					--aRet.Pos().Y();
2574 				}
2575 				pFrm = 0;		// das Rect ist ja jetzt fertig
2576 			}
2577 		}
2578 	}
2579 	else
2580 	{
2581 		sal_uInt16 nFrmType = RES_FLYFRMFMT == Which() ? FRM_FLY : USHRT_MAX;
2582 		pFrm = ::GetFrmOfModify( 0, *(SwModify*)this, nFrmType, pPoint,
2583 									0, bCalcFrm );
2584 	}
2585 
2586 	if( pFrm )
2587 	{
2588 		if( bPrtArea )
2589 			aRet = pFrm->Prt();
2590 		else
2591 			aRet = pFrm->Frm();
2592 	}
2593 	return aRet;
2594 }
2595 
2596 SwContact* SwFrmFmt::FindContactObj()
2597 {
2598 	return SwIterator<SwContact,SwFmt>::FirstElement( *this );
2599 }
2600 
2601 SdrObject* SwFrmFmt::FindSdrObject()
2602 {
2603     // --> OD 2005-01-06 #i30669# - use method <FindContactObj()> instead of
2604     // duplicated code.
2605     SwContact* pFoundContact = FindContactObj();
2606     return pFoundContact ? pFoundContact->GetMaster() : 0;
2607     // <--
2608 }
2609 
2610 SdrObject* SwFrmFmt::FindRealSdrObject()
2611 {
2612 	if( RES_FLYFRMFMT == Which() )
2613 	{
2614 		Point aNullPt;
2615 		SwFlyFrm* pFly = (SwFlyFrm*)::GetFrmOfModify( 0, *this, FRM_FLY,
2616 													&aNullPt, 0, sal_False );
2617 		return pFly ? pFly->GetVirtDrawObj() : 0;
2618 	}
2619 	return FindSdrObject();
2620 }
2621 
2622 
2623 sal_Bool SwFrmFmt::IsLowerOf( const SwFrmFmt& rFmt ) const
2624 {
2625 	//Auch eine Verkettung von Innen nach aussen oder von aussen
2626 	//nach innen ist nicht zulaessig.
2627 	SwFlyFrm *pSFly = SwIterator<SwFlyFrm,SwFmt>::FirstElement(*this);
2628 	if( pSFly )
2629 	{
2630 		SwFlyFrm *pAskFly = SwIterator<SwFlyFrm,SwFmt>::FirstElement(rFmt);
2631 		if( pAskFly )
2632             return pSFly->IsLowerOf( pAskFly );
2633 	}
2634 
2635 	// dann mal ueber die Node-Positionen versuchen
2636 	const SwFmtAnchor* pAnchor = &rFmt.GetAnchor();
2637     if ((FLY_AT_PAGE != pAnchor->GetAnchorId()) && pAnchor->GetCntntAnchor())
2638     {
2639 		const SwSpzFrmFmts& rFmts = *GetDoc()->GetSpzFrmFmts();
2640 		const SwNode* pFlyNd = pAnchor->GetCntntAnchor()->nNode.GetNode().
2641 								FindFlyStartNode();
2642 		while( pFlyNd )
2643 		{
2644 			// dann ueber den Anker nach oben "hangeln"
2645 			sal_uInt16 n;
2646 			for( n = 0; n < rFmts.Count(); ++n )
2647 			{
2648 				const SwFrmFmt* pFmt = rFmts[ n ];
2649 				const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx();
2650 				if( pIdx && pFlyNd == &pIdx->GetNode() )
2651 				{
2652 					if( pFmt == this )
2653 						return sal_True;
2654 
2655 					pAnchor = &pFmt->GetAnchor();
2656                     if ((FLY_AT_PAGE == pAnchor->GetAnchorId()) ||
2657                         !pAnchor->GetCntntAnchor() )
2658                     {
2659                         return sal_False;
2660                     }
2661 
2662 					pFlyNd = pAnchor->GetCntntAnchor()->nNode.GetNode().
2663 								FindFlyStartNode();
2664 					break;
2665 				}
2666 			}
2667 			if( n >= rFmts.Count() )
2668 			{
2669 				ASSERT( !this, "Fly-Section aber kein Format gefunden" );
2670 				return sal_False;
2671 			}
2672 		}
2673 	}
2674 	return sal_False;
2675 }
2676 
2677 // --> OD 2004-07-27 #i31698#
2678 SwFrmFmt::tLayoutDir SwFrmFmt::GetLayoutDir() const
2679 {
2680     return SwFrmFmt::HORI_L2R;
2681 }
2682 
2683 void SwFrmFmt::SetLayoutDir( const SwFrmFmt::tLayoutDir )
2684 {
2685     // empty body, because default implementation does nothing
2686 }
2687 // <--
2688 
2689 // --> OD 2004-08-06 #i28749#
2690 sal_Int16 SwFrmFmt::GetPositionLayoutDir() const
2691 {
2692     return text::PositionLayoutDir::PositionInLayoutDirOfAnchor;
2693 }
2694 void SwFrmFmt::SetPositionLayoutDir( const sal_Int16 )
2695 {
2696     // empty body, because default implementation does nothing
2697 }
2698 // <--
2699 String SwFrmFmt::GetDescription() const
2700 {
2701     return SW_RES(STR_FRAME);
2702 }
2703 
2704 //	class SwFlyFrmFmt
2705 //	Implementierung teilweise inline im hxx
2706 
2707 TYPEINIT1( SwFlyFrmFmt, SwFrmFmt );
2708 IMPL_FIXEDMEMPOOL_NEWDEL( SwFlyFrmFmt,	10, 10 )
2709 
2710 SwFlyFrmFmt::~SwFlyFrmFmt()
2711 {
2712 	SwIterator<SwFlyFrm,SwFmt> aIter( *this );
2713 	SwFlyFrm * pLast = aIter.First();
2714 	if( pLast )
2715 		do {
2716 				delete pLast;
2717 		} while( 0 != ( pLast = aIter.Next() ));
2718 
2719 	SwIterator<SwFlyDrawContact,SwFmt> a2ndIter( *this );
2720 	SwFlyDrawContact* pC = a2ndIter.First();
2721 	if( pC )
2722 		do {
2723 				delete pC;
2724 
2725 		} while( 0 != ( pC = a2ndIter.Next() ));
2726 }
2727 
2728 //Erzeugen der Frms wenn das Format einen Absatzgebundenen Rahmen beschreibt.
2729 //MA: 14. Feb. 94, Erzeugen der Frms auch fuer Seitengebundene Rahmen.
2730 
2731 void SwFlyFrmFmt::MakeFrms()
2732 {
2733 	// gibts ueberhaupt ein Layout ??
2734 	if( !GetDoc()->GetCurrentViewShell() )
2735 		return;	//swmod 071108//swmod 071225
2736 
2737 	SwModify *pModify = 0;
2738     // OD 24.07.2003 #111032# - create local copy of anchor attribute for possible changes.
2739     SwFmtAnchor aAnchorAttr( GetAnchor() );
2740     switch( aAnchorAttr.GetAnchorId() )
2741     {
2742     case FLY_AS_CHAR:
2743     case FLY_AT_PARA:
2744     case FLY_AT_CHAR:
2745         if( aAnchorAttr.GetCntntAnchor() )
2746         {
2747             pModify = aAnchorAttr.GetCntntAnchor()->nNode.GetNode().GetCntntNode();
2748         }
2749 		break;
2750 
2751 	case FLY_AT_FLY:
2752         if( aAnchorAttr.GetCntntAnchor() )
2753 		{
2754 			//Erst einmal ueber den Inhalt suchen, weil konstant schnell. Kann
2755 			//Bei verketteten Rahmen aber auch schief gehen, weil dann evtl.
2756             //niemals ein frame::Frame zu dem Inhalt existiert. Dann muss leider noch
2757 			//die Suche vom StartNode zum FrameFormat sein.
2758             SwNodeIndex aIdx( aAnchorAttr.GetCntntAnchor()->nNode );
2759 			SwCntntNode *pCNd = GetDoc()->GetNodes().GoNext( &aIdx );
2760             // --> OD 2009-12-28 #i105535#
2761             if ( pCNd == 0 )
2762             {
2763                 pCNd = aAnchorAttr.GetCntntAnchor()->nNode.GetNode().GetCntntNode();
2764             }
2765             if ( pCNd )
2766             // <--
2767             {
2768                 if( SwIterator<SwFrm,SwCntntNode>::FirstElement( *pCNd ) )
2769                 {
2770                     pModify = pCNd;
2771                 }
2772             }
2773             // --> OD 2009-12-28 #i105535#
2774             if ( pModify == 0 )
2775             // <--
2776             {
2777                 const SwNodeIndex &rIdx = aAnchorAttr.GetCntntAnchor()->nNode;
2778 				SwSpzFrmFmts& rFmts = *GetDoc()->GetSpzFrmFmts();
2779 				for( sal_uInt16 i = 0; i < rFmts.Count(); ++i )
2780 				{
2781 					SwFrmFmt* pFlyFmt = rFmts[i];
2782 					if( pFlyFmt->GetCntnt().GetCntntIdx() &&
2783 						rIdx == *pFlyFmt->GetCntnt().GetCntntIdx() )
2784 					{
2785 						pModify = pFlyFmt;
2786 						break;
2787 					}
2788 				}
2789 			}
2790 		}
2791 		break;
2792 
2793     case FLY_AT_PAGE:
2794         {
2795             sal_uInt16 nPgNum = aAnchorAttr.GetPageNum();
2796 			SwPageFrm *pPage = (SwPageFrm*)GetDoc()->GetCurrentLayout()->Lower();	//swmod 080218
2797             if( !nPgNum && aAnchorAttr.GetCntntAnchor() )
2798 			{
2799 				SwCntntNode *pCNd =
2800                     aAnchorAttr.GetCntntAnchor()->nNode.GetNode().GetCntntNode();
2801 				SwIterator<SwFrm,SwCntntNode> aIter( *pCNd );
2802                 for (SwFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() )
2803 				{
2804 						pPage = pFrm->FindPageFrm();
2805 						if( pPage )
2806                         {
2807 							nPgNum = pPage->GetPhyPageNum();
2808                             // OD 24.07.2003 #111032# - update anchor attribute
2809                             aAnchorAttr.SetPageNum( nPgNum );
2810                             aAnchorAttr.SetAnchor( 0 );
2811                             SetFmtAttr( aAnchorAttr );
2812                         }
2813 						break;
2814 					}
2815 			}
2816 			while ( pPage )
2817 			{
2818 				if ( pPage->GetPhyPageNum() == nPgNum )
2819 				{
2820                     // --> OD 2005-06-09 #i50432# - adjust synopsis of <PlaceFly(..)>
2821                     pPage->PlaceFly( 0, this );
2822                     // <--
2823                     break;
2824 				}
2825 				pPage = (SwPageFrm*)pPage->GetNext();
2826 			}
2827 		}
2828 		break;
2829     default:
2830         break;
2831 	}
2832 
2833 	if( pModify )
2834 	{
2835         SwIterator<SwFrm,SwModify> aIter( *pModify );
2836 		for( SwFrm *pFrm = aIter.First(); pFrm; pFrm = aIter.Next() )
2837 		{
2838 			sal_Bool bAdd = !pFrm->IsCntntFrm() ||
2839 							!((SwCntntFrm*)pFrm)->IsFollow();
2840 
2841             if ( FLY_AT_FLY == aAnchorAttr.GetAnchorId() && !pFrm->IsFlyFrm() )
2842             {
2843                 // --> OD 2009-12-28 #i105535#
2844                 // fallback to anchor type at-paragraph, if no fly frame is found.
2845 //                pFrm = pFrm->FindFlyFrm();
2846                 SwFrm* pFlyFrm = pFrm->FindFlyFrm();
2847                 if ( pFlyFrm )
2848                 {
2849                     pFrm = pFlyFrm;
2850                 }
2851                 else
2852                 {
2853                     aAnchorAttr.SetType( FLY_AT_PARA );
2854                     SetFmtAttr( aAnchorAttr );
2855                     MakeFrms();
2856                     return;
2857                 }
2858                 // <--
2859             }
2860 
2861 			if( pFrm->GetDrawObjs() )
2862 			{
2863                 // --> OD 2004-07-01 #i28701# - new type <SwSortedObjs>
2864                 SwSortedObjs &rObjs = *pFrm->GetDrawObjs();
2865 				for( sal_uInt16 i = 0; i < rObjs.Count(); ++i)
2866 				{
2867                     // --> OD 2004-07-01 #i28701# - consider changed type of
2868                     // <SwSortedObjs> entries.
2869                     SwAnchoredObject* pObj = rObjs[i];
2870                     if( pObj->ISA(SwFlyFrm) &&
2871                         (&pObj->GetFrmFmt()) == this )
2872 					{
2873 						bAdd = sal_False;
2874 						break;
2875 					}
2876 				}
2877 			}
2878 
2879 			if( bAdd )
2880 			{
2881 				SwFlyFrm *pFly = 0;
2882                 switch( aAnchorAttr.GetAnchorId() )
2883 				{
2884 				case FLY_AT_FLY:
2885 					pFly = new SwFlyLayFrm( this, pFrm, pFrm );
2886 					break;
2887 
2888                 case FLY_AT_PARA:
2889                 case FLY_AT_CHAR:
2890 					pFly = new SwFlyAtCntFrm( this, pFrm, pFrm );
2891 					break;
2892 
2893                 case FLY_AS_CHAR:
2894 					pFly = new SwFlyInCntFrm( this, pFrm, pFrm );
2895 					break;
2896                 default:
2897                     ASSERT( !this, "Neuer Ankertyp" )
2898                     break;
2899                 }
2900 				pFrm->AppendFly( pFly );
2901 				SwPageFrm *pPage = pFly->FindPageFrm();
2902 				if( pPage )
2903 					::RegistFlys( pPage, pFly );
2904             }
2905 		}
2906 	}
2907 }
2908 
2909 SwFlyFrm* SwFlyFrmFmt::GetFrm( const Point* pPoint, const sal_Bool bCalcFrm ) const
2910 {
2911 	return (SwFlyFrm*)::GetFrmOfModify( 0, *(SwModify*)this, FRM_FLY,
2912 											pPoint, 0, bCalcFrm );
2913 }
2914 
2915 SwAnchoredObject* SwFlyFrmFmt::GetAnchoredObj( const Point* pPoint, const sal_Bool bCalcFrm ) const
2916 {
2917     SwFlyFrm* pFlyFrm( GetFrm( pPoint, bCalcFrm ) );
2918     if ( pFlyFrm )
2919     {
2920         return dynamic_cast<SwAnchoredObject*>(pFlyFrm);
2921     }
2922     else
2923     {
2924         return 0L;
2925     }
2926 }
2927 
2928 
2929 sal_Bool SwFlyFrmFmt::GetInfo( SfxPoolItem& rInfo ) const
2930 {
2931 	switch( rInfo.Which() )
2932 	{
2933 	case RES_CONTENT_VISIBLE:
2934 		{
2935 			((SwPtrMsgPoolItem&)rInfo).pObject = SwIterator<SwFrm,SwFmt>::FirstElement( *this );
2936 		}
2937 		return sal_False;
2938 
2939 	default:
2940 		return SwFrmFmt::GetInfo( rInfo );
2941 	}
2942 	return sal_True;
2943 }
2944 
2945 // --> OD 2009-07-14 #i73249#
2946 void SwFlyFrmFmt::SetObjTitle( const String& rTitle, bool bBroadcast )
2947 {
2948     SdrObject* pMasterObject = FindSdrObject();
2949     ASSERT( pMasterObject,
2950             "<SwNoTxtNode::SetObjTitle(..)> - missing <SdrObject> instance" );
2951     if ( !pMasterObject )
2952     {
2953         return;
2954     }
2955 
2956     if( bBroadcast )
2957     {
2958         SwStringMsgPoolItem aOld( RES_TITLE_CHANGED, pMasterObject->GetTitle() );
2959         SwStringMsgPoolItem aNew( RES_TITLE_CHANGED, rTitle );
2960         pMasterObject->SetTitle( rTitle );
2961         ModifyNotification( &aOld, &aNew );
2962     }
2963     else
2964     {
2965         pMasterObject->SetTitle( rTitle );
2966     }
2967 }
2968 
2969 const String SwFlyFrmFmt::GetObjTitle() const
2970 {
2971     const SdrObject* pMasterObject = FindSdrObject();
2972     ASSERT( pMasterObject,
2973             "<SwFlyFrmFmt::GetObjTitle(..)> - missing <SdrObject> instance" );
2974     if ( !pMasterObject )
2975     {
2976         return aEmptyStr;
2977     }
2978 
2979     return pMasterObject->GetTitle();
2980 }
2981 
2982 void SwFlyFrmFmt::SetObjDescription( const String& rDescription, bool bBroadcast )
2983 {
2984     SdrObject* pMasterObject = FindSdrObject();
2985     ASSERT( pMasterObject,
2986             "<SwFlyFrmFmt::SetDescription(..)> - missing <SdrObject> instance" );
2987     if ( !pMasterObject )
2988     {
2989         return;
2990     }
2991 
2992     if( bBroadcast )
2993     {
2994         SwStringMsgPoolItem aOld( RES_DESCRIPTION_CHANGED, pMasterObject->GetDescription() );
2995         SwStringMsgPoolItem aNew( RES_DESCRIPTION_CHANGED, rDescription );
2996         pMasterObject->SetDescription( rDescription );
2997         ModifyNotification( &aOld, &aNew );
2998     }
2999     else
3000     {
3001         pMasterObject->SetDescription( rDescription );
3002     }
3003 }
3004 
3005 const String SwFlyFrmFmt::GetObjDescription() const
3006 {
3007     const SdrObject* pMasterObject = FindSdrObject();
3008     ASSERT( pMasterObject,
3009             "<SwNoTxtNode::GetDescription(..)> - missing <SdrObject> instance" );
3010     if ( !pMasterObject )
3011     {
3012         return aEmptyStr;
3013     }
3014 
3015     return pMasterObject->GetDescription();
3016 }
3017 // <--
3018 
3019 /** SwFlyFrmFmt::IsBackgroundTransparent - for #99657#
3020 
3021     OD 22.08.2002 - overloading virtual method and its default implementation,
3022     because format of fly frame provides transparent backgrounds.
3023     Method determines, if background of fly frame is transparent.
3024 
3025     @author OD
3026 
3027     @return true, if background color is transparent, but not "no fill"
3028     or the transparency of a existing background graphic is set.
3029 */
3030 sal_Bool SwFlyFrmFmt::IsBackgroundTransparent() const
3031 {
3032     sal_Bool bReturn = sal_False;
3033 
3034     /// NOTE: If background color is "no fill"/"auto fill" (COL_TRANSPARENT)
3035     ///     and there is no background graphic, it "inherites" the background
3036     ///     from its anchor.
3037     if ( (GetBackground().GetColor().GetTransparency() != 0) &&
3038          (GetBackground().GetColor() != COL_TRANSPARENT)
3039        )
3040     {
3041         bReturn = sal_True;
3042     }
3043     else
3044     {
3045         const GraphicObject *pTmpGrf =
3046                 static_cast<const GraphicObject*>(GetBackground().GetGraphicObject());
3047         if ( (pTmpGrf) &&
3048              (pTmpGrf->GetAttr().GetTransparency() != 0)
3049            )
3050         {
3051             bReturn = sal_True;
3052         }
3053     }
3054 
3055     return bReturn;
3056 }
3057 
3058 /** SwFlyFrmFmt::IsBackgroundBrushInherited - for #103898#
3059 
3060     OD 08.10.2002 - method to determine, if the brush for drawing the
3061     background is "inherited" from its parent/grandparent.
3062     This is the case, if no background graphic is set and the background
3063     color is "no fill"/"auto fill"
3064     NOTE: condition is "copied" from method <SwFrm::GetBackgroundBrush(..).
3065 
3066     @author OD
3067 
3068     @return true, if background brush is "inherited" from parent/grandparent
3069 */
3070 sal_Bool SwFlyFrmFmt::IsBackgroundBrushInherited() const
3071 {
3072     sal_Bool bReturn = sal_False;
3073 
3074     if ( (GetBackground().GetColor() == COL_TRANSPARENT) &&
3075          !(GetBackground().GetGraphicObject()) )
3076     {
3077         bReturn = sal_True;
3078     }
3079 
3080     return bReturn;
3081 }
3082 
3083 // --> OD 2006-02-28 #125892#
3084 SwHandleAnchorNodeChg::SwHandleAnchorNodeChg( SwFlyFrmFmt& _rFlyFrmFmt,
3085                                               const SwFmtAnchor& _rNewAnchorFmt,
3086                                               SwFlyFrm* _pKeepThisFlyFrm )
3087     : mrFlyFrmFmt( _rFlyFrmFmt ),
3088       mbAnchorNodeChanged( false )
3089 {
3090     const RndStdIds nNewAnchorType( _rNewAnchorFmt.GetAnchorId() );
3091     if ( ((nNewAnchorType == FLY_AT_PARA) ||
3092           (nNewAnchorType == FLY_AT_CHAR)) &&
3093          _rNewAnchorFmt.GetCntntAnchor() &&
3094          _rNewAnchorFmt.GetCntntAnchor()->nNode.GetNode().GetCntntNode() )
3095     {
3096         const SwFmtAnchor& aOldAnchorFmt( _rFlyFrmFmt.GetAnchor() );
3097         if ( aOldAnchorFmt.GetAnchorId() == nNewAnchorType &&
3098              aOldAnchorFmt.GetCntntAnchor() &&
3099              aOldAnchorFmt.GetCntntAnchor()->nNode.GetNode().GetCntntNode() &&
3100              aOldAnchorFmt.GetCntntAnchor()->nNode !=
3101                                     _rNewAnchorFmt.GetCntntAnchor()->nNode )
3102         {
3103             // determine 'old' number of anchor frames
3104             sal_uInt32 nOldNumOfAnchFrm( 0L );
3105             SwIterator<SwFrm,SwCntntNode> aOldIter( *(aOldAnchorFmt.GetCntntAnchor()->nNode.GetNode().GetCntntNode()) );
3106             for( SwFrm* pOld = aOldIter.First(); pOld; pOld = aOldIter.Next() )
3107             {
3108                 ++nOldNumOfAnchFrm;
3109             }
3110             // determine 'new' number of anchor frames
3111             sal_uInt32 nNewNumOfAnchFrm( 0L );
3112             SwIterator<SwFrm,SwCntntNode> aNewIter( *(_rNewAnchorFmt.GetCntntAnchor()->nNode.GetNode().GetCntntNode()) );
3113             for( SwFrm* pNew = aNewIter.First(); pNew; pNew = aNewIter.Next() )
3114             {
3115                 ++nNewNumOfAnchFrm;
3116             }
3117             if ( nOldNumOfAnchFrm != nNewNumOfAnchFrm )
3118             {
3119                 // delete existing fly frames except <_pKeepThisFlyFrm>
3120                 SwIterator<SwFrm,SwFmt> aIter( mrFlyFrmFmt );
3121                 SwFrm* pFrm = aIter.First();
3122                 if ( pFrm )
3123                 {
3124                     do {
3125                         if ( pFrm != _pKeepThisFlyFrm )
3126                         {
3127                             pFrm->Cut();
3128                             delete pFrm;
3129                         }
3130                     } while( 0 != ( pFrm = aIter.Next() ));
3131                 }
3132                 // indicate, that re-creation of fly frames necessary
3133                 mbAnchorNodeChanged = true;
3134             }
3135         }
3136     }
3137 }
3138 
3139 SwHandleAnchorNodeChg::~SwHandleAnchorNodeChg()
3140 {
3141     if ( mbAnchorNodeChanged )
3142     {
3143         mrFlyFrmFmt.MakeFrms();
3144     }
3145 }
3146 // <--
3147 //	class SwDrawFrmFmt
3148 //	Implementierung teilweise inline im hxx
3149 
3150 TYPEINIT1( SwDrawFrmFmt, SwFrmFmt );
3151 IMPL_FIXEDMEMPOOL_NEWDEL( SwDrawFrmFmt,	10, 10 )
3152 
3153 SwDrawFrmFmt::~SwDrawFrmFmt()
3154 {
3155 	SwContact *pContact = FindContactObj();
3156 	delete pContact;
3157 }
3158 
3159 void SwDrawFrmFmt::MakeFrms()
3160 {
3161 	SwDrawContact *pContact = (SwDrawContact*)FindContactObj();
3162     if ( pContact )
3163          pContact->ConnectToLayout();
3164 }
3165 
3166 void SwDrawFrmFmt::DelFrms()
3167 {
3168 	SwDrawContact *pContact = (SwDrawContact *)FindContactObj();
3169 	if ( pContact ) //fuer den Reader und andere Unabwaegbarkeiten.
3170 		pContact->DisconnectFromLayout();
3171 }
3172 
3173 // --> OD 2004-07-27 #i31698#
3174 SwFrmFmt::tLayoutDir SwDrawFrmFmt::GetLayoutDir() const
3175 {
3176     return meLayoutDir;
3177 }
3178 
3179 void SwDrawFrmFmt::SetLayoutDir( const SwFrmFmt::tLayoutDir _eLayoutDir )
3180 {
3181     meLayoutDir = _eLayoutDir;
3182 }
3183 // <--
3184 
3185 // --> OD 2004-08-06 #i28749#
3186 sal_Int16 SwDrawFrmFmt::GetPositionLayoutDir() const
3187 {
3188     return mnPositionLayoutDir;
3189 }
3190 void SwDrawFrmFmt::SetPositionLayoutDir( const sal_Int16 _nPositionLayoutDir )
3191 {
3192     switch ( _nPositionLayoutDir )
3193     {
3194         case text::PositionLayoutDir::PositionInHoriL2R:
3195         case text::PositionLayoutDir::PositionInLayoutDirOfAnchor:
3196         {
3197             mnPositionLayoutDir = _nPositionLayoutDir;
3198         }
3199         break;
3200         default:
3201         {
3202             ASSERT( false,
3203                     "<SwDrawFrmFmt::SetPositionLayoutDir(..)> - invalid attribute value." );
3204         }
3205     }
3206 }
3207 // <--
3208 
3209 String SwDrawFrmFmt::GetDescription() const
3210 {
3211     String aResult;
3212     const SdrObject * pSdrObj = FindSdrObject();
3213 
3214     if (pSdrObj)
3215     {
3216         if (pSdrObj != pSdrObjCached)
3217         {
3218             SdrObject * pSdrObjCopy = pSdrObj->Clone();
3219             SdrUndoNewObj * pSdrUndo = new SdrUndoNewObj(*pSdrObjCopy);
3220             sSdrObjCachedComment = pSdrUndo->GetComment();
3221 
3222             delete pSdrUndo;
3223 
3224             pSdrObjCached = pSdrObj;
3225         }
3226 
3227         aResult = sSdrObjCachedComment;
3228     }
3229     else
3230         aResult = SW_RES(STR_GRAPHIC);
3231 
3232     return aResult;
3233 }
3234 
3235 IMapObject* SwFrmFmt::GetIMapObject( const Point& rPoint,
3236 										const SwFlyFrm *pFly ) const
3237 {
3238 	const SwFmtURL &rURL = GetURL();
3239 	if( !rURL.GetMap() )
3240 		return 0;
3241 
3242 	if( !pFly )
3243 	{
3244 		pFly = SwIterator<SwFlyFrm,SwFmt>::FirstElement( *this );
3245 		if( !pFly )
3246 			return 0;
3247 	}
3248 
3249 	//Orignialgroesse fuer OLE und Grafik ist die TwipSize,
3250 	//ansonsten die Groesse vom FrmFmt des Fly.
3251 	const SwFrm *pRef;
3252     SwNoTxtNode *pNd = 0;
3253 	Size aOrigSz;
3254 	if( pFly->Lower() && pFly->Lower()->IsNoTxtFrm() )
3255 	{
3256 		pRef = pFly->Lower();
3257 		pNd = ((SwCntntFrm*)pRef)->GetNode()->GetNoTxtNode();
3258 		aOrigSz = pNd->GetTwipSize();
3259 	}
3260 	else
3261 	{
3262 		pRef = pFly;
3263 		aOrigSz = pFly->GetFmt()->GetFrmSize().GetSize();
3264 	}
3265 
3266 	if( aOrigSz.Width() != 0 && aOrigSz.Height() != 0 )
3267 	{
3268 		Point aPos( rPoint );
3269 		Size aActSz ( pRef == pFly ? pFly->Frm().SSize() : pRef->Prt().SSize() );
3270 		const MapMode aSrc ( MAP_TWIP );
3271 		const MapMode aDest( MAP_100TH_MM );
3272 		aOrigSz = OutputDevice::LogicToLogic( aOrigSz, aSrc, aDest );
3273 		aActSz  = OutputDevice::LogicToLogic( aActSz,  aSrc, aDest );
3274 		aPos -= pRef->Frm().Pos();
3275 		aPos -= pRef->Prt().Pos();
3276 		aPos    = OutputDevice::LogicToLogic( aPos, aSrc, aDest );
3277 		sal_uInt32 nFlags = 0;
3278 		if ( pFly != pRef && pNd->IsGrfNode() )
3279 		{
3280 			const sal_uInt16 nMirror = pNd->GetSwAttrSet().
3281 										GetMirrorGrf().GetValue();
3282             if ( RES_MIRROR_GRAPH_BOTH == nMirror )
3283 				nFlags = IMAP_MIRROR_HORZ | IMAP_MIRROR_VERT;
3284             else if ( RES_MIRROR_GRAPH_VERT == nMirror )
3285 				nFlags = IMAP_MIRROR_VERT;
3286             else if ( RES_MIRROR_GRAPH_HOR == nMirror )
3287 				nFlags = IMAP_MIRROR_HORZ;
3288 
3289 		}
3290 		return ((ImageMap*)rURL.GetMap())->GetHitIMapObject( aOrigSz,
3291 												aActSz, aPos, nFlags );
3292 	}
3293 
3294 	return 0;
3295 }
3296 
3297