Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <com/sun/star/text/WrapTextMode.hpp>
21 : #include <com/sun/star/text/TextContentAnchorType.hpp>
22 : #include <com/sun/star/container/XIndexContainer.hpp>
23 : #include <com/sun/star/text/TextGridMode.hpp>
24 : #include <svtools/unoimap.hxx>
25 : #include <svtools/imap.hxx>
26 : #include <svtools/imapobj.hxx>
27 : #include <atrfrm.hxx>
28 : #include <unocoll.hxx>
29 : #include <unosett.hxx>
30 : #include <unostyle.hxx>
31 : #include <fmtclds.hxx>
32 : #include <fmtornt.hxx>
33 : #include <fmthdft.hxx>
34 : #include <fmtpdsc.hxx>
35 : #include <fmtcntnt.hxx>
36 : #include <fmtfsize.hxx>
37 : #include <fmtfordr.hxx>
38 : #include <fmtsrnd.hxx>
39 : #include <fmtlsplt.hxx>
40 : #include <fmtrowsplt.hxx>
41 : #include <fmtftntx.hxx>
42 : #include <fmteiro.hxx>
43 : #include <fmturl.hxx>
44 : #include <fmtcnct.hxx>
45 : #include <section.hxx>
46 : #include <fmtline.hxx>
47 : #include <tgrditem.hxx>
48 : #include <hfspacingitem.hxx>
49 : #include <IDocumentUndoRedo.hxx>
50 : #include <IDocumentContentOperations.hxx>
51 : #include <IDocumentLayoutAccess.hxx>
52 : #include <pagefrm.hxx>
53 : #include <rootfrm.hxx>
54 : #include <cntfrm.hxx>
55 : #include <crsrsh.hxx>
56 : #include <dflyobj.hxx>
57 : #include <dcontact.hxx>
58 : #include <frmtool.hxx>
59 : #include <flyfrms.hxx>
60 : #include <pagedesc.hxx>
61 : #include <grfatr.hxx>
62 : #include <ndnotxt.hxx>
63 : #include <docary.hxx>
64 : #include <node2lay.hxx>
65 : #include <fmtclbl.hxx>
66 : #include <swunohelper.hxx>
67 : #include <unoframe.hxx>
68 : #include <unotextbodyhf.hxx>
69 : #include <SwStyleNameMapper.hxx>
70 : #include <editeng/brushitem.hxx>
71 : #include <svtools/grfmgr.hxx>
72 : #include <unomid.h>
73 : #include <comcore.hrc>
74 : #include <svx/svdundo.hxx>
75 : #include <sortedobjs.hxx>
76 : #include <HandleAnchorNodeChg.hxx>
77 : #include <calbck.hxx>
78 : #include <pagedeschint.hxx>
79 : #ifndef NDEBUG
80 : #include <ndtxt.hxx>
81 : #endif
82 :
83 : //UUUU
84 : #include <svx/sdr/attribute/sdrallfillattributeshelper.hxx>
85 : #include <svx/xfillit0.hxx>
86 : #include <svl/itemiter.hxx>
87 :
88 : using namespace ::com::sun::star;
89 :
90 28808 : TYPEINIT1(SwFormatVertOrient, SfxPoolItem);
91 29090 : TYPEINIT1(SwFormatHoriOrient, SfxPoolItem);
92 102972 : TYPEINIT2(SwFormatHeader, SfxPoolItem, SwClient );
93 97919 : TYPEINIT2(SwFormatFooter, SfxPoolItem, SwClient );
94 60660 : TYPEINIT2(SwFormatPageDesc, SfxPoolItem, SwClient );
95 17379 : TYPEINIT1_AUTOFACTORY(SwFormatLineNumber, SfxPoolItem);
96 :
97 5887 : static sal_Int16 lcl_IntToRelation(const uno::Any& rVal)
98 : {
99 5887 : sal_Int16 nVal = text::RelOrientation::FRAME;
100 5887 : if (!(rVal >>= nVal))
101 : SAL_WARN("sw.core", "lcl_IntToRelation: read from Any failed!");
102 5887 : return nVal;
103 : }
104 :
105 15379 : void DelHFFormat( SwClient *pToRemove, SwFrameFormat *pFormat )
106 : {
107 : //If the client is the last one who uses this format, then we have to delete
108 : //it - before this is done, we may need to delete the content-section.
109 15379 : SwDoc* pDoc = pFormat->GetDoc();
110 15379 : pFormat->Remove( pToRemove );
111 15379 : if( pDoc->IsInDtor() )
112 : {
113 1486 : delete pFormat;
114 16865 : return;
115 : }
116 :
117 : // Anything other than frames registered?
118 13893 : bool bDel = true;
119 : {
120 : // nested scope because DTOR of SwClientIter resets the flag bTreeChg.
121 : // It's suboptimal if the format is deleted beforehand.
122 13893 : SwIterator<SwClient,SwFrameFormat> aIter(*pFormat);
123 23409 : for(SwClient* pLast = aIter.First(); bDel && pLast; pLast = aIter.Next())
124 9516 : if(!pLast->IsA(TYPE(SwFrm)) || !SwXHeadFootText::IsXHeadFootText(pLast))
125 23409 : bDel = false;
126 : }
127 :
128 13893 : if ( bDel )
129 : {
130 : // If there is a Crsr registered in one of the nodes, we need to call the
131 : // ParkCrsr in an (arbitrary) shell.
132 4377 : SwFormatContent& rCnt = (SwFormatContent&)pFormat->GetContent();
133 4377 : if ( rCnt.GetContentIdx() )
134 : {
135 4377 : SwNode *pNode = 0;
136 : {
137 : // #i92993#
138 : // Begin with start node of page header/footer to assure that
139 : // complete content is checked for cursors and the complete content
140 : // is deleted on below made method call <pDoc->getIDocumentContentOperations().DeleteSection(pNode)>
141 4377 : SwNodeIndex aIdx( *rCnt.GetContentIdx(), 0 );
142 : // If there is a Crsr registered in one of the nodes, we need to call the
143 : // ParkCrsr in an (arbitrary) shell.
144 4377 : pNode = & aIdx.GetNode();
145 4377 : sal_uInt32 nEnd = pNode->EndOfSectionIndex();
146 20994 : while ( aIdx < nEnd )
147 : {
148 18159 : if ( pNode->IsContentNode() &&
149 5919 : static_cast<SwContentNode*>(pNode)->HasWriterListeners() )
150 : {
151 0 : SwCrsrShell *pShell = SwIterator<SwCrsrShell,SwContentNode>( *static_cast<SwContentNode*>(pNode) ).First();
152 0 : if( pShell )
153 : {
154 0 : pShell->ParkCrsr( aIdx );
155 0 : aIdx = nEnd-1;
156 : }
157 : }
158 12240 : ++aIdx;
159 12240 : pNode = & aIdx.GetNode();
160 4377 : }
161 : }
162 4377 : rCnt.SetNewContentIdx( nullptr );
163 :
164 : // When deleting a header/footer-format, we ALWAYS need to disable
165 : // the undo function (Bug 31069)
166 4377 : ::sw::UndoGuard const undoGuard(pDoc->GetIDocumentUndoRedo());
167 :
168 : OSL_ENSURE( pNode, "A big problem." );
169 4377 : pDoc->getIDocumentContentOperations().DeleteSection( pNode );
170 : }
171 4377 : delete pFormat;
172 : }
173 : }
174 :
175 : // Partially implemented inline in hxx
176 98675 : SwFormatFrmSize::SwFormatFrmSize( SwFrmSize eSize, SwTwips nWidth, SwTwips nHeight )
177 : : SfxPoolItem( RES_FRM_SIZE ),
178 : m_aSize( nWidth, nHeight ),
179 : m_eFrmHeightType( eSize ),
180 98675 : m_eFrmWidthType( ATT_FIX_SIZE )
181 : {
182 98675 : m_nWidthPercent = m_eWidthPercentRelation = m_nHeightPercent = m_eHeightPercentRelation = 0;
183 98675 : }
184 :
185 249 : SwFormatFrmSize& SwFormatFrmSize::operator=( const SwFormatFrmSize& rCpy )
186 : {
187 249 : m_aSize = rCpy.GetSize();
188 249 : m_eFrmHeightType = rCpy.GetHeightSizeType();
189 249 : m_eFrmWidthType = rCpy.GetWidthSizeType();
190 249 : m_nHeightPercent = rCpy.GetHeightPercent();
191 249 : m_eHeightPercentRelation = rCpy.GetHeightPercentRelation();
192 249 : m_nWidthPercent = rCpy.GetWidthPercent();
193 249 : m_eWidthPercentRelation = rCpy.GetWidthPercentRelation();
194 249 : return *this;
195 : }
196 :
197 1105007 : bool SwFormatFrmSize::operator==( const SfxPoolItem& rAttr ) const
198 : {
199 : assert(SfxPoolItem::operator==(rAttr));
200 1888343 : return( m_eFrmHeightType == static_cast<const SwFormatFrmSize&>(rAttr).m_eFrmHeightType &&
201 1566467 : m_eFrmWidthType == static_cast<const SwFormatFrmSize&>(rAttr).m_eFrmWidthType &&
202 1089383 : m_aSize == static_cast<const SwFormatFrmSize&>(rAttr).GetSize()&&
203 612328 : m_nWidthPercent == static_cast<const SwFormatFrmSize&>(rAttr).GetWidthPercent() &&
204 612152 : m_eWidthPercentRelation == static_cast<const SwFormatFrmSize&>(rAttr).GetWidthPercentRelation() &&
205 1717159 : m_nHeightPercent == static_cast<const SwFormatFrmSize&>(rAttr).GetHeightPercent() &&
206 1411083 : m_eHeightPercentRelation == static_cast<const SwFormatFrmSize&>(rAttr).GetHeightPercentRelation() );
207 : }
208 :
209 23549 : SfxPoolItem* SwFormatFrmSize::Clone( SfxItemPool* ) const
210 : {
211 23549 : return new SwFormatFrmSize( *this );
212 : }
213 :
214 1330 : bool SwFormatFrmSize::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
215 : {
216 : // here we convert always!
217 1330 : nMemberId &= ~CONVERT_TWIPS;
218 1330 : switch ( nMemberId )
219 : {
220 : case MID_FRMSIZE_SIZE:
221 : {
222 82 : awt::Size aTmp;
223 82 : aTmp.Height = convertTwipToMm100(m_aSize.Height());
224 82 : aTmp.Width = convertTwipToMm100(m_aSize.Width());
225 82 : rVal.setValue(&aTmp, ::cppu::UnoType<awt::Size>::get());
226 : }
227 82 : break;
228 : case MID_FRMSIZE_REL_HEIGHT:
229 224 : rVal <<= (sal_Int16)(GetHeightPercent() != 0xFF ? GetHeightPercent() : 0);
230 224 : break;
231 : case MID_FRMSIZE_REL_HEIGHT_RELATION:
232 154 : rVal <<= GetHeightPercentRelation();
233 154 : break;
234 : case MID_FRMSIZE_REL_WIDTH:
235 232 : rVal <<= (sal_Int16)(GetWidthPercent() != 0xFF ? GetWidthPercent() : 0);
236 232 : break;
237 : case MID_FRMSIZE_REL_WIDTH_RELATION:
238 154 : rVal <<= GetWidthPercentRelation();
239 154 : break;
240 : case MID_FRMSIZE_IS_SYNC_HEIGHT_TO_WIDTH:
241 74 : rVal <<= 0xFF == GetHeightPercent();
242 74 : break;
243 : case MID_FRMSIZE_IS_SYNC_WIDTH_TO_HEIGHT:
244 74 : rVal <<= 0xFF == GetWidthPercent();
245 74 : break;
246 : case MID_FRMSIZE_WIDTH :
247 126 : rVal <<= (sal_Int32)convertTwipToMm100(m_aSize.Width());
248 126 : break;
249 : case MID_FRMSIZE_HEIGHT:
250 : // #95848# returned size should never be zero.
251 : // (there was a bug that allowed for setting height to 0.
252 : // Thus there some documents existing with that not allowed
253 : // attribute value which may cause problems on import.)
254 77 : rVal <<= (sal_Int32)convertTwipToMm100(m_aSize.Height() < MINLAY ? MINLAY : m_aSize.Height() );
255 77 : break;
256 : case MID_FRMSIZE_SIZE_TYPE:
257 69 : rVal <<= (sal_Int16)GetHeightSizeType();
258 69 : break;
259 : case MID_FRMSIZE_IS_AUTO_HEIGHT:
260 1 : rVal <<= ATT_FIX_SIZE != GetHeightSizeType();
261 1 : break;
262 : case MID_FRMSIZE_WIDTH_TYPE:
263 63 : rVal <<= (sal_Int16)GetWidthSizeType();
264 63 : break;
265 : }
266 1330 : return true;
267 : }
268 :
269 10081 : bool SwFormatFrmSize::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
270 : {
271 10081 : bool bConvert = 0 != (nMemberId&CONVERT_TWIPS);
272 10081 : nMemberId &= ~CONVERT_TWIPS;
273 10081 : bool bRet = true;
274 10081 : switch ( nMemberId )
275 : {
276 : case MID_FRMSIZE_SIZE:
277 : {
278 3015 : awt::Size aVal;
279 3015 : if(!(rVal >>= aVal))
280 12 : bRet = false;
281 : else
282 : {
283 3003 : Size aTmp(aVal.Width, aVal.Height);
284 3003 : if(bConvert)
285 : {
286 3003 : aTmp.Height() = convertMm100ToTwip(aTmp.Height());
287 3003 : aTmp.Width() = convertMm100ToTwip(aTmp.Width());
288 : }
289 3003 : if(aTmp.Height() && aTmp.Width())
290 3003 : m_aSize = aTmp;
291 : else
292 0 : bRet = false;
293 : }
294 : }
295 3015 : break;
296 : case MID_FRMSIZE_REL_HEIGHT:
297 : {
298 371 : sal_Int16 nSet = 0;
299 371 : rVal >>= nSet;
300 371 : if(nSet >= 0 && nSet <= 0xfe)
301 371 : SetHeightPercent((sal_uInt8)nSet);
302 : else
303 0 : bRet = false;
304 : }
305 371 : break;
306 : case MID_FRMSIZE_REL_HEIGHT_RELATION:
307 : {
308 9 : sal_Int16 eSet = 0;
309 9 : rVal >>= eSet;
310 9 : SetHeightPercentRelation(eSet);
311 : }
312 9 : break;
313 : case MID_FRMSIZE_REL_WIDTH:
314 : {
315 376 : sal_Int16 nSet = 0;
316 376 : rVal >>= nSet;
317 376 : if(nSet >= 0 && nSet <= 0xfe)
318 376 : SetWidthPercent((sal_uInt8)nSet);
319 : else
320 0 : bRet = false;
321 : }
322 376 : break;
323 : case MID_FRMSIZE_REL_WIDTH_RELATION:
324 : {
325 9 : sal_Int16 eSet = 0;
326 9 : rVal >>= eSet;
327 9 : SetWidthPercentRelation(eSet);
328 : }
329 9 : break;
330 : case MID_FRMSIZE_IS_SYNC_HEIGHT_TO_WIDTH:
331 : {
332 368 : bool bSet = *static_cast<sal_Bool const *>(rVal.getValue());
333 368 : if(bSet)
334 3 : SetHeightPercent(0xff);
335 365 : else if( 0xff == GetHeightPercent() )
336 0 : SetHeightPercent( 0 );
337 : }
338 368 : break;
339 : case MID_FRMSIZE_IS_SYNC_WIDTH_TO_HEIGHT:
340 : {
341 368 : bool bSet = *static_cast<sal_Bool const *>(rVal.getValue());
342 368 : if(bSet)
343 1 : SetWidthPercent(0xff);
344 367 : else if( 0xff == GetWidthPercent() )
345 0 : SetWidthPercent(0);
346 : }
347 368 : break;
348 : case MID_FRMSIZE_WIDTH :
349 : {
350 1163 : sal_Int32 nWd = 0;
351 1163 : if(rVal >>= nWd)
352 : {
353 1163 : if(bConvert)
354 1163 : nWd = convertMm100ToTwip(nWd);
355 1163 : if(nWd < MINLAY)
356 59 : nWd = MINLAY;
357 1163 : m_aSize.Width() = nWd;
358 : }
359 : else
360 0 : bRet = false;
361 : }
362 1163 : break;
363 : case MID_FRMSIZE_HEIGHT:
364 : {
365 1128 : sal_Int32 nHg = 0;
366 1128 : if(rVal >>= nHg)
367 : {
368 1128 : if(bConvert)
369 1128 : nHg = convertMm100ToTwip(nHg);
370 1128 : if(nHg < MINLAY)
371 59 : nHg = MINLAY;
372 1128 : m_aSize.Height() = nHg;
373 : }
374 : else
375 0 : bRet = false;
376 : }
377 1128 : break;
378 : case MID_FRMSIZE_SIZE_TYPE:
379 : {
380 2218 : sal_Int16 nType = 0;
381 2218 : if((rVal >>= nType) && nType >= 0 && nType <= ATT_MIN_SIZE )
382 : {
383 2218 : SetHeightSizeType((SwFrmSize)nType);
384 : }
385 : else
386 0 : bRet = false;
387 : }
388 2218 : break;
389 : case MID_FRMSIZE_IS_AUTO_HEIGHT:
390 : {
391 817 : bool bSet = *static_cast<sal_Bool const *>(rVal.getValue());
392 817 : SetHeightSizeType(bSet ? ATT_VAR_SIZE : ATT_FIX_SIZE);
393 : }
394 817 : break;
395 : case MID_FRMSIZE_WIDTH_TYPE:
396 : {
397 239 : sal_Int16 nType = 0;
398 239 : if((rVal >>= nType) && nType >= 0 && nType <= ATT_MIN_SIZE )
399 : {
400 238 : SetWidthSizeType((SwFrmSize)nType);
401 : }
402 : else
403 1 : bRet = false;
404 : }
405 239 : break;
406 : default:
407 0 : bRet = false;
408 : }
409 10081 : return bRet;
410 : }
411 :
412 0 : void SwFormatFrmSize::dumpAsXml(xmlTextWriterPtr pWriter) const
413 : {
414 0 : xmlTextWriterStartElement(pWriter, BAD_CAST("swFormatFrmSize"));
415 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("whichId"), BAD_CAST(OString::number(Which()).getStr()));
416 :
417 0 : std::stringstream aSize;
418 0 : aSize << m_aSize;
419 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("size"), BAD_CAST(aSize.str().c_str()));
420 :
421 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("eFrmHeightType"), BAD_CAST(OString::number(m_eFrmHeightType).getStr()));
422 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("eFrmWidthType"), BAD_CAST(OString::number(m_eFrmWidthType).getStr()));
423 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nWidthPercent"), BAD_CAST(OString::number(m_nWidthPercent).getStr()));
424 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("eWidthPercentRelation"), BAD_CAST(OString::number(m_eWidthPercentRelation).getStr()));
425 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nHeightPercent"), BAD_CAST(OString::number(m_nHeightPercent).getStr()));
426 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("eHeightPercentRelation"), BAD_CAST(OString::number(m_eHeightPercentRelation).getStr()));
427 :
428 0 : xmlTextWriterEndElement(pWriter);
429 0 : }
430 :
431 : // Partially implemented inline in hxx
432 7080 : SwFormatFillOrder::SwFormatFillOrder( SwFillOrder nFO )
433 7080 : : SfxEnumItem( RES_FILL_ORDER, sal_uInt16(nFO) )
434 7080 : {}
435 2997 : SfxPoolItem* SwFormatFillOrder::Clone( SfxItemPool* ) const
436 : {
437 2997 : return new SwFormatFillOrder( GetFillOrder() );
438 : }
439 :
440 0 : sal_uInt16 SwFormatFillOrder::GetValueCount() const
441 : {
442 0 : return SW_FILL_ORDER_END - SW_FILL_ORDER_BEGIN;
443 : }
444 :
445 : // Partially implemented inline in hxx
446 61 : SwFormatHeader::SwFormatHeader( SwFrameFormat *pHeaderFormat )
447 : : SfxPoolItem( RES_HEADER ),
448 : SwClient( pHeaderFormat ),
449 61 : bActive( pHeaderFormat )
450 : {
451 61 : }
452 :
453 14978 : SwFormatHeader::SwFormatHeader( const SwFormatHeader &rCpy )
454 : : SfxPoolItem( RES_HEADER ),
455 14978 : SwClient( const_cast<SwModify*>(rCpy.GetRegisteredIn()) ),
456 29956 : bActive( rCpy.IsActive() )
457 : {
458 14978 : }
459 :
460 773 : SwFormatHeader::SwFormatHeader( bool bOn )
461 : : SfxPoolItem( RES_HEADER ),
462 : SwClient( 0 ),
463 773 : bActive( bOn )
464 : {
465 773 : }
466 :
467 43607 : SwFormatHeader::~SwFormatHeader()
468 : {
469 15807 : if ( GetHeaderFormat() )
470 9328 : DelHFFormat( this, GetHeaderFormat() );
471 27800 : }
472 :
473 27366 : bool SwFormatHeader::operator==( const SfxPoolItem& rAttr ) const
474 : {
475 : assert(SfxPoolItem::operator==(rAttr));
476 38526 : return ( GetRegisteredIn() == static_cast<const SwFormatHeader&>(rAttr).GetRegisteredIn() &&
477 38526 : bActive == static_cast<const SwFormatHeader&>(rAttr).IsActive() );
478 : }
479 :
480 11939 : SfxPoolItem* SwFormatHeader::Clone( SfxItemPool* ) const
481 : {
482 11939 : return new SwFormatHeader( *this );
483 : }
484 :
485 3438 : void SwFormatHeader::RegisterToFormat( SwFormat& rFormat )
486 : {
487 3438 : rFormat.Add(this);
488 3438 : }
489 :
490 : // Partially implemented inline in hxx
491 58 : SwFormatFooter::SwFormatFooter( SwFrameFormat *pFooterFormat )
492 : : SfxPoolItem( RES_FOOTER ),
493 : SwClient( pFooterFormat ),
494 58 : bActive( pFooterFormat )
495 : {
496 58 : }
497 :
498 12699 : SwFormatFooter::SwFormatFooter( const SwFormatFooter &rCpy )
499 : : SfxPoolItem( RES_FOOTER ),
500 12699 : SwClient( const_cast<SwModify*>(rCpy.GetRegisteredIn()) ),
501 25398 : bActive( rCpy.IsActive() )
502 : {
503 12699 : }
504 :
505 770 : SwFormatFooter::SwFormatFooter( bool bOn )
506 : : SfxPoolItem( RES_FOOTER ),
507 : SwClient( 0 ),
508 770 : bActive( bOn )
509 : {
510 770 : }
511 :
512 37767 : SwFormatFooter::~SwFormatFooter()
513 : {
514 13522 : if ( GetFooterFormat() )
515 6051 : DelHFFormat( this, GetFooterFormat() );
516 24245 : }
517 :
518 2307 : void SwFormatFooter::RegisterToFormat( SwFormat& rFormat )
519 : {
520 2307 : rFormat.Add(this);
521 2307 : }
522 :
523 26060 : bool SwFormatFooter::operator==( const SfxPoolItem& rAttr ) const
524 : {
525 : assert(SfxPoolItem::operator==(rAttr));
526 40119 : return ( GetRegisteredIn() == static_cast<const SwFormatFooter&>(rAttr).GetRegisteredIn() &&
527 40119 : bActive == static_cast<const SwFormatFooter&>(rAttr).IsActive() );
528 : }
529 :
530 10669 : SfxPoolItem* SwFormatFooter::Clone( SfxItemPool* ) const
531 : {
532 10669 : return new SwFormatFooter( *this );
533 : }
534 :
535 : // Partially implemented inline in hxx
536 87387 : SwFormatContent::SwFormatContent( const SwFormatContent &rCpy )
537 87387 : : SfxPoolItem( RES_CNTNT )
538 : {
539 87387 : pStartNode = rCpy.GetContentIdx() ?
540 87387 : new SwNodeIndex( *rCpy.GetContentIdx() ) : 0;
541 87387 : }
542 :
543 8558 : SwFormatContent::SwFormatContent( const SwStartNode *pStartNd )
544 8558 : : SfxPoolItem( RES_CNTNT )
545 : {
546 8558 : pStartNode = pStartNd ? new SwNodeIndex( *pStartNd ) : 0;
547 8558 : }
548 :
549 278639 : SwFormatContent::~SwFormatContent()
550 : {
551 95944 : delete pStartNode;
552 182695 : }
553 :
554 7905 : void SwFormatContent::SetNewContentIdx( const SwNodeIndex *pIdx )
555 : {
556 7905 : delete pStartNode;
557 7905 : pStartNode = pIdx ? new SwNodeIndex( *pIdx ) : 0;
558 7905 : }
559 :
560 283247 : bool SwFormatContent::operator==( const SfxPoolItem& rAttr ) const
561 : {
562 : assert(SfxPoolItem::operator==(rAttr));
563 283247 : if( (bool)pStartNode != (bool)static_cast<const SwFormatContent&>(rAttr).pStartNode )
564 1 : return false;
565 283246 : if( pStartNode )
566 283193 : return ( *pStartNode == *static_cast<const SwFormatContent&>(rAttr).GetContentIdx() );
567 53 : return true;
568 : }
569 :
570 86693 : SfxPoolItem* SwFormatContent::Clone( SfxItemPool* ) const
571 : {
572 86693 : return new SwFormatContent( *this );
573 : }
574 :
575 0 : void SwFormatContent::dumpAsXml(xmlTextWriterPtr pWriter) const
576 : {
577 0 : xmlTextWriterStartElement(pWriter, BAD_CAST("swFormatContent"));
578 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("whichId"), BAD_CAST(OString::number(Which()).getStr()));
579 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("startNode"), BAD_CAST(OString::number(pStartNode->GetNode().GetIndex()).getStr()));
580 0 : xmlTextWriterEndElement(pWriter);
581 0 : }
582 :
583 : // Partially implemented inline in hxx
584 37068 : SwFormatPageDesc::SwFormatPageDesc( const SwFormatPageDesc &rCpy )
585 : : SfxPoolItem( RES_PAGEDESC ),
586 37068 : SwClient( const_cast<SwPageDesc*>(rCpy.GetPageDesc()) ),
587 : oNumOffset( rCpy.oNumOffset ),
588 : nDescNameIdx( rCpy.nDescNameIdx ),
589 74136 : pDefinedIn( 0 )
590 : {
591 37068 : }
592 :
593 3671 : SwFormatPageDesc::SwFormatPageDesc( const SwPageDesc *pDesc )
594 : : SfxPoolItem( RES_PAGEDESC ),
595 : SwClient( const_cast<SwPageDesc*>(pDesc) ),
596 : nDescNameIdx( 0xFFFF ), // IDX_NO_VALUE
597 3671 : pDefinedIn( 0 )
598 : {
599 3671 : }
600 :
601 0 : SwFormatPageDesc &SwFormatPageDesc::operator=(const SwFormatPageDesc &rCpy)
602 : {
603 0 : if (rCpy.GetPageDesc())
604 0 : RegisterToPageDesc(*const_cast<SwPageDesc*>(rCpy.GetPageDesc()));
605 0 : oNumOffset = rCpy.oNumOffset;
606 0 : nDescNameIdx = rCpy.nDescNameIdx;
607 0 : pDefinedIn = 0;
608 :
609 0 : return *this;
610 : }
611 :
612 77303 : SwFormatPageDesc::~SwFormatPageDesc() {}
613 :
614 5861 : bool SwFormatPageDesc::KnowsPageDesc() const
615 : {
616 5861 : return (GetRegisteredIn() != 0);
617 : }
618 :
619 2613 : bool SwFormatPageDesc::operator==( const SfxPoolItem& rAttr ) const
620 : {
621 : assert(SfxPoolItem::operator==(rAttr));
622 4162 : return ( pDefinedIn == static_cast<const SwFormatPageDesc&>(rAttr).pDefinedIn ) &&
623 3902 : ( oNumOffset == static_cast<const SwFormatPageDesc&>(rAttr).oNumOffset ) &&
624 3902 : ( GetPageDesc() == static_cast<const SwFormatPageDesc&>(rAttr).GetPageDesc() );
625 : }
626 :
627 34143 : SfxPoolItem* SwFormatPageDesc::Clone( SfxItemPool* ) const
628 : {
629 34143 : return new SwFormatPageDesc( *this );
630 : }
631 :
632 5845 : void SwFormatPageDesc::SwClientNotify( const SwModify& rModify, const SfxHint& rHint )
633 : {
634 5845 : SwClient::SwClientNotify(rModify, rHint);
635 5845 : const SwPageDescHint* pHint = dynamic_cast<const SwPageDescHint*>(&rHint);
636 5845 : if ( pHint )
637 : {
638 : // mba: shouldn't that be broadcasted also?
639 0 : SwFormatPageDesc aDfltDesc( pHint->GetPageDesc() );
640 0 : SwPageDesc* pDesc = pHint->GetPageDesc();
641 0 : const SwModify* pMod = GetDefinedIn();
642 0 : if ( pMod )
643 : {
644 0 : if( pMod->ISA( SwContentNode ) )
645 0 : const_cast<SwContentNode*>(static_cast<const SwContentNode*>(pMod))->SetAttr( aDfltDesc );
646 0 : else if( pMod->ISA( SwFormat ))
647 0 : const_cast<SwFormat*>(static_cast<const SwFormat*>(pMod))->SetFormatAttr( aDfltDesc );
648 : else
649 : {
650 : OSL_FAIL( "What kind of SwModify is this?" );
651 0 : RegisterToPageDesc( *pDesc );
652 : }
653 : }
654 : else
655 : // there could be an Undo-copy
656 0 : RegisterToPageDesc( *pDesc );
657 : }
658 5845 : }
659 :
660 2296 : void SwFormatPageDesc::RegisterToPageDesc( SwPageDesc& rDesc )
661 : {
662 2296 : rDesc.Add( this );
663 2296 : }
664 :
665 5845 : void SwFormatPageDesc::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
666 : {
667 5845 : if( !pDefinedIn )
668 9265 : return;
669 :
670 2425 : const sal_uInt16 nWhichId = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
671 2425 : switch( nWhichId )
672 : {
673 : case RES_OBJECTDYING:
674 : //The Pagedesc where I'm registered dies, therefore I unregister
675 : //from that format. During this I get deleted!
676 2425 : if( IS_TYPE( SwFormat, pDefinedIn ))
677 : {
678 : bool const bResult =
679 0 : static_cast<SwFormat*>(pDefinedIn)->ResetFormatAttr(RES_PAGEDESC);
680 : OSL_ENSURE( bResult, "FormatPageDesc not deleted" );
681 : (void) bResult; // unused in non-debug
682 : }
683 2425 : else if( IS_TYPE( SwContentNode, pDefinedIn ))
684 : {
685 : bool const bResult = static_cast<SwContentNode*>(pDefinedIn)
686 0 : ->ResetAttr(RES_PAGEDESC);
687 : OSL_ENSURE( bResult, "FormatPageDesc not deleted" );
688 : (void) bResult; // unused in non-debug
689 : }
690 2425 : break;
691 :
692 : default:
693 : /* do nothing */;
694 : }
695 : }
696 :
697 129 : bool SwFormatPageDesc::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
698 : {
699 : // here we convert always!
700 129 : nMemberId &= ~CONVERT_TWIPS;
701 129 : bool bRet = true;
702 129 : switch ( nMemberId )
703 : {
704 : case MID_PAGEDESC_PAGENUMOFFSET:
705 : {
706 74 : ::boost::optional<sal_uInt16> oOffset = GetNumOffset();
707 74 : if (oOffset)
708 : {
709 4 : rVal <<= (sal_Int16)oOffset.get();
710 : }
711 : else
712 : {
713 70 : rVal.clear();
714 74 : }
715 : }
716 74 : break;
717 :
718 : case MID_PAGEDESC_PAGEDESCNAME:
719 : {
720 55 : const SwPageDesc* pDesc = GetPageDesc();
721 55 : if( pDesc )
722 : {
723 47 : OUString aString;
724 47 : SwStyleNameMapper::FillProgName(pDesc->GetName(), aString, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, true );
725 47 : rVal <<= aString;
726 : }
727 : else
728 8 : rVal.clear();
729 : }
730 55 : break;
731 : default:
732 : OSL_ENSURE( false, "unknown MemberId" );
733 0 : bRet = false;
734 : }
735 129 : return bRet;
736 : }
737 :
738 344 : bool SwFormatPageDesc::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
739 : {
740 : // here we convert always!
741 344 : nMemberId &= ~CONVERT_TWIPS;
742 344 : bool bRet = true;
743 344 : switch ( nMemberId )
744 : {
745 : case MID_PAGEDESC_PAGENUMOFFSET:
746 : {
747 344 : sal_Int16 nOffset = 0;
748 344 : if (!rVal.hasValue())
749 : {
750 230 : SetNumOffset(boost::none);
751 : }
752 114 : else if (rVal >>= nOffset)
753 114 : SetNumOffset( nOffset );
754 : else
755 0 : bRet = false;
756 : }
757 344 : break;
758 :
759 : case MID_PAGEDESC_PAGEDESCNAME:
760 : /* Doesn't work, because the attribute doesn't need the name but a
761 : * pointer to the PageDesc (it's a client of it). The pointer can
762 : * only be requested from the document using the name.
763 : */
764 : default:
765 : OSL_ENSURE( false, "unknown MemberId" );
766 0 : bRet = false;
767 : }
768 344 : return bRet;
769 : }
770 :
771 0 : void SwFormatPageDesc::dumpAsXml(xmlTextWriterPtr pWriter) const
772 : {
773 0 : xmlTextWriterStartElement(pWriter, BAD_CAST("swFormatPageDesc"));
774 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("whichId"), BAD_CAST(OString::number(Which()).getStr()));
775 0 : if (oNumOffset)
776 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("oNumOffset"), BAD_CAST(OString::number(*oNumOffset).getStr()));
777 : else
778 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("oNumOffset"), BAD_CAST("none"));
779 0 : xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("pPageDesc"), "%p", GetPageDesc());
780 0 : if (const SwPageDesc* pPageDesc = GetPageDesc())
781 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("presentation"), BAD_CAST(pPageDesc->GetName().toUtf8().getStr()));
782 0 : xmlTextWriterEndElement(pWriter);
783 0 : }
784 :
785 : // class SwFormatCol
786 : // Partially implemented inline in hxx
787 :
788 237 : SwColumn::SwColumn() :
789 : nWish ( 0 ),
790 : nUpper( 0 ),
791 : nLower( 0 ),
792 : nLeft ( 0 ),
793 237 : nRight( 0 )
794 : {
795 237 : }
796 :
797 75 : bool SwColumn::operator==( const SwColumn &rCmp ) const
798 : {
799 150 : return nWish == rCmp.GetWishWidth() &&
800 150 : GetLeft() == rCmp.GetLeft() &&
801 113 : GetRight() == rCmp.GetRight() &&
802 151 : GetUpper() == rCmp.GetUpper() &&
803 113 : GetLower() == rCmp.GetLower();
804 : }
805 :
806 0 : void SwColumn::dumpAsXml(xmlTextWriterPtr pWriter) const
807 : {
808 0 : xmlTextWriterStartElement(pWriter, BAD_CAST("swColumn"));
809 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nWish"), BAD_CAST(OString::number(nWish).getStr()));
810 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nUpper"), BAD_CAST(OString::number(nUpper).getStr()));
811 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nLower"), BAD_CAST(OString::number(nLower).getStr()));
812 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nLeft"), BAD_CAST(OString::number(nLeft).getStr()));
813 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nRight"), BAD_CAST(OString::number(nRight).getStr()));
814 0 : xmlTextWriterEndElement(pWriter);
815 0 : }
816 :
817 1090 : SwFormatCol::SwFormatCol( const SwFormatCol& rCpy )
818 : : SfxPoolItem( RES_COL ),
819 : m_eLineStyle( rCpy.m_eLineStyle ),
820 : m_nLineWidth( rCpy.m_nLineWidth),
821 : m_aLineColor( rCpy.m_aLineColor),
822 1090 : m_nLineHeight( rCpy.GetLineHeight() ),
823 1090 : m_eAdj( rCpy.GetLineAdj() ),
824 1090 : m_aColumns( (sal_Int8)rCpy.GetNumCols() ),
825 1090 : m_nWidth( rCpy.GetWishWidth() ),
826 : m_aWidthAdjustValue( rCpy.m_aWidthAdjustValue ),
827 5450 : m_bOrtho( rCpy.IsOrtho() )
828 : {
829 1343 : for ( sal_uInt16 i = 0; i < rCpy.GetNumCols(); ++i )
830 : {
831 253 : SwColumn *pCol = new SwColumn( rCpy.GetColumns()[i] );
832 253 : m_aColumns.push_back( pCol );
833 : }
834 1090 : }
835 :
836 2470 : SwFormatCol::~SwFormatCol() {}
837 :
838 0 : SwFormatCol& SwFormatCol::operator=( const SwFormatCol& rCpy )
839 : {
840 0 : m_eLineStyle = rCpy.m_eLineStyle;
841 0 : m_nLineWidth = rCpy.m_nLineWidth;
842 0 : m_aLineColor = rCpy.m_aLineColor;
843 0 : m_nLineHeight = rCpy.GetLineHeight();
844 0 : m_eAdj = rCpy.GetLineAdj();
845 0 : m_nWidth = rCpy.GetWishWidth();
846 0 : m_aWidthAdjustValue = rCpy.m_aWidthAdjustValue;
847 0 : m_bOrtho = rCpy.IsOrtho();
848 :
849 0 : if ( !m_aColumns.empty() )
850 0 : m_aColumns.clear();
851 0 : for ( sal_uInt16 i = 0; i < rCpy.GetNumCols(); ++i )
852 : {
853 0 : SwColumn *pCol = new SwColumn( rCpy.GetColumns()[i] );
854 0 : m_aColumns.push_back( pCol );
855 : }
856 0 : return *this;
857 : }
858 :
859 418 : SwFormatCol::SwFormatCol()
860 : : SfxPoolItem( RES_COL )
861 : , m_eLineStyle( table::BorderLineStyle::NONE)
862 : ,
863 : m_nLineWidth(0),
864 : m_nLineHeight( 100 ),
865 : m_eAdj( COLADJ_NONE ),
866 : m_nWidth( USHRT_MAX ),
867 : m_aWidthAdjustValue( 0 ),
868 418 : m_bOrtho( true )
869 : {
870 418 : }
871 :
872 1182 : bool SwFormatCol::operator==( const SfxPoolItem& rAttr ) const
873 : {
874 : assert(SfxPoolItem::operator==(rAttr));
875 1182 : const SwFormatCol &rCmp = static_cast<const SwFormatCol&>(rAttr);
876 3546 : if( !(m_eLineStyle == rCmp.m_eLineStyle &&
877 2364 : m_nLineWidth == rCmp.m_nLineWidth &&
878 2364 : m_aLineColor == rCmp.m_aLineColor &&
879 2364 : m_nLineHeight == rCmp.GetLineHeight() &&
880 2358 : m_eAdj == rCmp.GetLineAdj() &&
881 1960 : m_nWidth == rCmp.GetWishWidth() &&
882 1512 : m_bOrtho == rCmp.IsOrtho() &&
883 728 : m_aColumns.size() == rCmp.GetNumCols() &&
884 483 : m_aWidthAdjustValue == rCmp.GetAdjustValue()
885 1665 : ) )
886 699 : return false;
887 :
888 521 : for ( size_t i = 0; i < m_aColumns.size(); ++i )
889 75 : if ( !(m_aColumns[i] == rCmp.GetColumns()[i]) )
890 37 : return false;
891 :
892 446 : return true;
893 : }
894 :
895 570 : SfxPoolItem* SwFormatCol::Clone( SfxItemPool* ) const
896 : {
897 570 : return new SwFormatCol( *this );
898 : }
899 :
900 204 : sal_uInt16 SwFormatCol::GetGutterWidth( bool bMin ) const
901 : {
902 204 : sal_uInt16 nRet = 0;
903 204 : if ( m_aColumns.size() == 2 )
904 24 : nRet = m_aColumns[0].GetRight() + m_aColumns[1].GetLeft();
905 180 : else if ( m_aColumns.size() > 2 )
906 : {
907 10 : bool bSet = false;
908 30 : for ( size_t i = 1; i+1 < m_aColumns.size(); ++i )
909 : {
910 20 : const sal_uInt16 nTmp = m_aColumns[i].GetRight() + m_aColumns[i+1].GetLeft();
911 20 : if ( bSet )
912 : {
913 10 : if ( nTmp != nRet )
914 : {
915 0 : if ( !bMin )
916 0 : return USHRT_MAX;
917 0 : if ( nRet > nTmp )
918 0 : nRet = nTmp;
919 : }
920 : }
921 : else
922 : {
923 10 : bSet = true;
924 10 : nRet = nTmp;
925 : }
926 : }
927 : }
928 204 : return nRet;
929 : }
930 :
931 0 : void SwFormatCol::SetGutterWidth( sal_uInt16 nNew, sal_uInt16 nAct )
932 : {
933 0 : if ( m_bOrtho )
934 0 : Calc( nNew, nAct );
935 : else
936 : {
937 0 : sal_uInt16 nHalf = nNew / 2;
938 0 : for ( size_t i = 0; i < m_aColumns.size(); ++i )
939 : {
940 0 : SwColumn *pCol = &m_aColumns[i];
941 0 : pCol->SetLeft ( nHalf );
942 0 : pCol->SetRight( nHalf );
943 0 : if ( i == 0 )
944 0 : pCol->SetLeft( 0 );
945 0 : else if ( i+1 == m_aColumns.size() )
946 0 : pCol->SetRight( 0 );
947 : }
948 : }
949 0 : }
950 :
951 7 : void SwFormatCol::Init( sal_uInt16 nNumCols, sal_uInt16 nGutterWidth, sal_uInt16 nAct )
952 : {
953 : // Deleting seems to be a bit radical on the first sight; but otherwise we
954 : // have to initialize all values of the remaining SwCloumns.
955 7 : if ( !m_aColumns.empty() )
956 0 : m_aColumns.clear();
957 21 : for ( sal_uInt16 i = 0; i < nNumCols; ++i )
958 : {
959 14 : SwColumn *pCol = new SwColumn;
960 14 : m_aColumns.push_back( pCol );
961 : }
962 7 : m_bOrtho = true;
963 7 : m_nWidth = USHRT_MAX;
964 7 : if( nNumCols )
965 7 : Calc( nGutterWidth, nAct );
966 7 : }
967 :
968 0 : void SwFormatCol::SetOrtho( bool bNew, sal_uInt16 nGutterWidth, sal_uInt16 nAct )
969 : {
970 0 : m_bOrtho = bNew;
971 0 : if ( bNew && !m_aColumns.empty() )
972 0 : Calc( nGutterWidth, nAct );
973 0 : }
974 :
975 764 : sal_uInt16 SwFormatCol::CalcColWidth( sal_uInt16 nCol, sal_uInt16 nAct ) const
976 : {
977 : assert(nCol < m_aColumns.size());
978 764 : if ( m_nWidth != nAct )
979 : {
980 717 : long nW = m_aColumns[nCol].GetWishWidth();
981 717 : nW *= nAct;
982 717 : nW /= m_nWidth;
983 717 : return sal_uInt16(nW);
984 : }
985 : else
986 47 : return m_aColumns[nCol].GetWishWidth();
987 : }
988 :
989 59 : sal_uInt16 SwFormatCol::CalcPrtColWidth( sal_uInt16 nCol, sal_uInt16 nAct ) const
990 : {
991 : assert(nCol < m_aColumns.size());
992 59 : sal_uInt16 nRet = CalcColWidth( nCol, nAct );
993 59 : const SwColumn *pCol = &m_aColumns[nCol];
994 59 : nRet = nRet - pCol->GetLeft();
995 59 : nRet = nRet - pCol->GetRight();
996 59 : return nRet;
997 : }
998 :
999 7 : void SwFormatCol::Calc( sal_uInt16 nGutterWidth, sal_uInt16 nAct )
1000 : {
1001 7 : if(!GetNumCols())
1002 7 : return;
1003 : //First set the column widths with the current width, then calculate the
1004 : //column's requested width using the requested total width.
1005 :
1006 7 : const sal_uInt16 nGutterHalf = nGutterWidth ? nGutterWidth / 2 : 0;
1007 :
1008 : //Width of PrtAreas is totalwidth - spacings / count
1009 : const sal_uInt16 nPrtWidth =
1010 7 : (nAct - ((GetNumCols()-1) * nGutterWidth)) / GetNumCols();
1011 7 : sal_uInt16 nAvail = nAct;
1012 :
1013 : //The fist column is PrtWidth + (gap width / 2)
1014 7 : const sal_uInt16 nLeftWidth = nPrtWidth + nGutterHalf;
1015 7 : SwColumn *pCol = &m_aColumns.front();
1016 7 : pCol->SetWishWidth( nLeftWidth );
1017 7 : pCol->SetRight( nGutterHalf );
1018 7 : pCol->SetLeft ( 0 );
1019 7 : nAvail = nAvail - nLeftWidth;
1020 :
1021 : //Column 2 to n-1 is PrtWidth + gap width
1022 7 : const sal_uInt16 nMidWidth = nPrtWidth + nGutterWidth;
1023 : sal_uInt16 i;
1024 :
1025 7 : for ( i = 1; i < GetNumCols()-1; ++i )
1026 : {
1027 0 : pCol = &m_aColumns[i];
1028 0 : pCol->SetWishWidth( nMidWidth );
1029 0 : pCol->SetLeft ( nGutterHalf );
1030 0 : pCol->SetRight( nGutterHalf );
1031 0 : nAvail = nAvail - nMidWidth;
1032 : }
1033 :
1034 : //The last column is equivalent to the first one - to compensate rounding
1035 : //errors we add the remaining space of the other columns to the last one.
1036 7 : pCol = &m_aColumns.back();
1037 7 : pCol->SetWishWidth( nAvail );
1038 7 : pCol->SetLeft ( nGutterHalf );
1039 7 : pCol->SetRight( 0 );
1040 :
1041 : //Convert the current width to the requested width.
1042 21 : for ( i = 0; i < m_aColumns.size(); ++i )
1043 : {
1044 14 : pCol = &m_aColumns[i];
1045 14 : long nTmp = pCol->GetWishWidth();
1046 14 : nTmp *= GetWishWidth();
1047 14 : nTmp /= nAct;
1048 14 : pCol->SetWishWidth( sal_uInt16(nTmp) );
1049 : }
1050 : }
1051 :
1052 190 : bool SwFormatCol::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1053 : {
1054 : // here we convert always!
1055 190 : nMemberId &= ~CONVERT_TWIPS;
1056 190 : if(MID_COLUMN_SEPARATOR_LINE == nMemberId)
1057 : {
1058 : OSL_FAIL("not implemented");
1059 : }
1060 : else
1061 : {
1062 190 : uno::Reference< text::XTextColumns > xCols = new SwXTextColumns(*this);
1063 190 : rVal.setValue(&xCols, cppu::UnoType<text::XTextColumns>::get());
1064 : }
1065 190 : return true;
1066 : }
1067 :
1068 237 : bool SwFormatCol::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1069 : {
1070 : // here we convert always!
1071 237 : nMemberId &= ~CONVERT_TWIPS;
1072 237 : bool bRet = false;
1073 237 : if(MID_COLUMN_SEPARATOR_LINE == nMemberId)
1074 : {
1075 : OSL_FAIL("not implemented");
1076 : }
1077 : else
1078 : {
1079 237 : uno::Reference< text::XTextColumns > xCols;
1080 237 : rVal >>= xCols;
1081 237 : if(xCols.is())
1082 : {
1083 237 : uno::Sequence<text::TextColumn> aSetColumns = xCols->getColumns();
1084 237 : const text::TextColumn* pArray = aSetColumns.getConstArray();
1085 237 : m_aColumns.clear();
1086 : //max count is 64k here - this is something the array can't do
1087 237 : sal_uInt16 nCount = std::min( (sal_uInt16)aSetColumns.getLength(),
1088 474 : (sal_uInt16) 0x3fff );
1089 237 : sal_uInt16 nWidthSum = 0;
1090 : // #101224# one column is no column
1091 :
1092 237 : if(nCount > 1)
1093 312 : for(sal_uInt16 i = 0; i < nCount; i++)
1094 : {
1095 223 : SwColumn* pCol = new SwColumn;
1096 223 : pCol->SetWishWidth( static_cast<sal_uInt16>(pArray[i].Width) );
1097 223 : nWidthSum = static_cast<sal_uInt16>(nWidthSum + pArray[i].Width);
1098 223 : pCol->SetLeft ( static_cast<sal_uInt16>(convertMm100ToTwip(pArray[i].LeftMargin)) );
1099 223 : pCol->SetRight( static_cast<sal_uInt16>(convertMm100ToTwip(pArray[i].RightMargin)) );
1100 223 : m_aColumns.insert(m_aColumns.begin() + i, pCol);
1101 : }
1102 237 : bRet = true;
1103 237 : m_nWidth = nWidthSum;
1104 237 : m_bOrtho = false;
1105 :
1106 474 : uno::Reference<lang::XUnoTunnel> xNumTunnel(xCols, uno::UNO_QUERY);
1107 237 : SwXTextColumns* pSwColums = 0;
1108 237 : if(xNumTunnel.is())
1109 : {
1110 : pSwColums = reinterpret_cast< SwXTextColumns * >(
1111 : sal::static_int_cast< sal_IntPtr >(
1112 237 : xNumTunnel->getSomething( SwXTextColumns::getUnoTunnelId() )));
1113 : }
1114 237 : if(pSwColums)
1115 : {
1116 237 : m_bOrtho = pSwColums->IsAutomaticWidth();
1117 237 : m_nLineWidth = pSwColums->GetSepLineWidth();
1118 237 : m_aLineColor.SetColor(pSwColums->GetSepLineColor());
1119 237 : m_nLineHeight = pSwColums->GetSepLineHeightRelative();
1120 237 : switch ( pSwColums->GetSepLineStyle() )
1121 : {
1122 : default:
1123 237 : case 0: m_eLineStyle = table::BorderLineStyle::NONE; break;
1124 0 : case 1: m_eLineStyle = table::BorderLineStyle::SOLID; break;
1125 0 : case 2: m_eLineStyle = table::BorderLineStyle::DOTTED; break;
1126 0 : case 3: m_eLineStyle = table::BorderLineStyle::DASHED; break;
1127 : }
1128 237 : if(!pSwColums->GetSepLineIsOn())
1129 236 : m_eAdj = COLADJ_NONE;
1130 1 : else switch(pSwColums->GetSepLineVertAlign())
1131 : {
1132 0 : case 0: m_eAdj = COLADJ_TOP; break; //VerticalAlignment_TOP
1133 1 : case 1: m_eAdj = COLADJ_CENTER;break; //VerticalAlignment_MIDDLE
1134 0 : case 2: m_eAdj = COLADJ_BOTTOM;break; //VerticalAlignment_BOTTOM
1135 0 : default: OSL_ENSURE( false, "unknown alignment" ); break;
1136 : }
1137 237 : }
1138 237 : }
1139 : }
1140 237 : return bRet;
1141 : }
1142 :
1143 0 : void SwFormatCol::dumpAsXml(xmlTextWriterPtr pWriter) const
1144 : {
1145 0 : xmlTextWriterStartElement(pWriter, BAD_CAST("swFormatCol"));
1146 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("whichId"), BAD_CAST(OString::number(Which()).getStr()));
1147 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("eLineStyle"), BAD_CAST(OString::number(m_eLineStyle).getStr()));
1148 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nLineWidth"), BAD_CAST(OString::number(m_nLineWidth).getStr()));
1149 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("aLineColor"), BAD_CAST(m_aLineColor.AsRGBHexString().toUtf8().getStr()));
1150 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nLineHeight"), BAD_CAST(OString::number(m_nLineHeight).getStr()));
1151 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("eAdj"), BAD_CAST(OString::number(m_eAdj).getStr()));
1152 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nWidth"), BAD_CAST(OString::number(m_nWidth).getStr()));
1153 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nWidthAdjustValue"), BAD_CAST(OString::number(m_aWidthAdjustValue).getStr()));
1154 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("bOrtho"), BAD_CAST(OString::boolean(m_bOrtho).getStr()));
1155 :
1156 0 : xmlTextWriterStartElement(pWriter, BAD_CAST("aColumns"));
1157 0 : for (const SwColumn& rColumn : m_aColumns)
1158 0 : rColumn.dumpAsXml(pWriter);
1159 0 : xmlTextWriterEndElement(pWriter);
1160 :
1161 0 : xmlTextWriterEndElement(pWriter);
1162 0 : }
1163 :
1164 : // Partially implemented inline in hxx
1165 1634 : SwFormatSurround::SwFormatSurround( SwSurround eFly ) :
1166 1634 : SfxEnumItem( RES_SURROUND, sal_uInt16( eFly ) )
1167 : {
1168 1634 : bAnchorOnly = bContour = bOutside = false;
1169 1634 : }
1170 :
1171 7126 : SwFormatSurround::SwFormatSurround( const SwFormatSurround &rCpy ) :
1172 7126 : SfxEnumItem( RES_SURROUND, rCpy.GetValue() )
1173 : {
1174 7126 : bAnchorOnly = rCpy.bAnchorOnly;
1175 7126 : bContour = rCpy.bContour;
1176 7126 : bOutside = rCpy.bOutside;
1177 7126 : }
1178 :
1179 8734 : bool SwFormatSurround::operator==( const SfxPoolItem& rAttr ) const
1180 : {
1181 : assert(SfxPoolItem::operator==(rAttr));
1182 12510 : return ( GetValue() == static_cast<const SwFormatSurround&>(rAttr).GetValue() &&
1183 7548 : bAnchorOnly== static_cast<const SwFormatSurround&>(rAttr).bAnchorOnly &&
1184 16234 : bContour== static_cast<const SwFormatSurround&>(rAttr).bContour &&
1185 12462 : bOutside== static_cast<const SwFormatSurround&>(rAttr).bOutside );
1186 : }
1187 :
1188 6623 : SfxPoolItem* SwFormatSurround::Clone( SfxItemPool* ) const
1189 : {
1190 6623 : return new SwFormatSurround( *this );
1191 : }
1192 :
1193 0 : sal_uInt16 SwFormatSurround::GetValueCount() const
1194 : {
1195 0 : return SURROUND_END - SURROUND_BEGIN;
1196 : }
1197 :
1198 : namespace
1199 : {
1200 187 : text::WrapTextMode SwSurroundToWrapMode(SwSurround eSurround)
1201 : {
1202 : text::WrapTextMode eRet;
1203 187 : switch(eSurround)
1204 : {
1205 : case SURROUND_THROUGHT:
1206 153 : eRet = css::text::WrapTextMode_THROUGHT;
1207 153 : break;
1208 : case SURROUND_PARALLEL:
1209 19 : eRet = css::text::WrapTextMode_PARALLEL;
1210 19 : break;
1211 : case SURROUND_IDEAL:
1212 9 : eRet = css::text::WrapTextMode_DYNAMIC;
1213 9 : break;
1214 : case SURROUND_LEFT:
1215 0 : eRet = css::text::WrapTextMode_LEFT;
1216 0 : break;
1217 : case SURROUND_RIGHT:
1218 0 : eRet = css::text::WrapTextMode_RIGHT;
1219 0 : break;
1220 : default:
1221 6 : eRet = css::text::WrapTextMode_NONE;
1222 6 : break;
1223 : }
1224 187 : return eRet;
1225 : }
1226 : }
1227 :
1228 438 : bool SwFormatSurround::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1229 : {
1230 : // here we convert always!
1231 438 : nMemberId &= ~CONVERT_TWIPS;
1232 438 : bool bRet = true;
1233 438 : switch ( nMemberId )
1234 : {
1235 : case MID_SURROUND_SURROUNDTYPE:
1236 187 : rVal <<= SwSurroundToWrapMode(GetSurround());
1237 187 : break;
1238 : case MID_SURROUND_ANCHORONLY:
1239 121 : rVal <<= IsAnchorOnly();
1240 121 : break;
1241 : case MID_SURROUND_CONTOUR:
1242 65 : rVal <<= IsContour();
1243 65 : break;
1244 : case MID_SURROUND_CONTOUROUTSIDE:
1245 65 : rVal <<= IsOutside();
1246 65 : break;
1247 : default:
1248 : OSL_ENSURE( false, "unknown MemberId" );
1249 0 : bRet = false;
1250 : }
1251 438 : return bRet;
1252 : }
1253 :
1254 4530 : bool SwFormatSurround::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1255 : {
1256 : // here we convert always!
1257 4530 : nMemberId &= ~CONVERT_TWIPS;
1258 4530 : bool bRet = true;
1259 4530 : switch ( nMemberId )
1260 : {
1261 : case MID_SURROUND_SURROUNDTYPE:
1262 : {
1263 3062 : sal_Int32 eVal = SWUnoHelper::GetEnumAsInt32( rVal );
1264 3062 : if( eVal >= 0 && eVal < SURROUND_END )
1265 3062 : SetValue( static_cast<sal_uInt16>(eVal) );
1266 : else {
1267 : //exception
1268 : ;
1269 : }
1270 : }
1271 3062 : break;
1272 :
1273 : case MID_SURROUND_ANCHORONLY:
1274 281 : SetAnchorOnly( *static_cast<sal_Bool const *>(rVal.getValue()) );
1275 281 : break;
1276 : case MID_SURROUND_CONTOUR:
1277 1096 : SetContour( *static_cast<sal_Bool const *>(rVal.getValue()) );
1278 1096 : break;
1279 : case MID_SURROUND_CONTOUROUTSIDE:
1280 91 : SetOutside( *static_cast<sal_Bool const *>(rVal.getValue()) );
1281 91 : break;
1282 : default:
1283 : OSL_ENSURE( false, "unknown MemberId" );
1284 0 : bRet = false;
1285 : }
1286 4530 : return bRet;
1287 : }
1288 :
1289 0 : void SwFormatSurround::dumpAsXml(xmlTextWriterPtr pWriter) const
1290 : {
1291 0 : xmlTextWriterStartElement(pWriter, BAD_CAST("swFormatSurround"));
1292 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("whichId"), BAD_CAST(OString::number(Which()).getStr()));
1293 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("value"), BAD_CAST(OString::number(GetValue()).getStr()));
1294 :
1295 0 : OUString aPresentation;
1296 0 : GetPresentation(SFX_ITEM_PRESENTATION_NAMELESS, SFX_MAPUNIT_100TH_MM, SFX_MAPUNIT_100TH_MM, aPresentation);
1297 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("presentation"), BAD_CAST(aPresentation.toUtf8().getStr()));
1298 :
1299 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("bAnchorOnly"), BAD_CAST(OString::boolean(bAnchorOnly).getStr()));
1300 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("bContour"), BAD_CAST(OString::boolean(bContour).getStr()));
1301 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("bOutside"), BAD_CAST(OString::boolean(bOutside).getStr()));
1302 :
1303 0 : xmlTextWriterEndElement(pWriter);
1304 0 : }
1305 :
1306 0 : SvStream& SwFormatVertOrient::Store(SvStream &rStream, sal_uInt16 /*version*/) const
1307 : {
1308 : #if SAL_TYPES_SIZEOFLONG == 8
1309 0 : rStream.WriteInt64(m_nYPos);
1310 : #else
1311 : rStream.WriteInt32(m_nYPos);
1312 : #endif
1313 0 : rStream.WriteInt16( m_eOrient ).WriteInt16( m_eRelation );
1314 0 : return rStream;
1315 : }
1316 :
1317 0 : SfxPoolItem* SwFormatVertOrient::Create(SvStream &rStream, sal_uInt16 /*itemVersion*/) const
1318 : {
1319 0 : SwTwips yPos(0);
1320 0 : sal_Int16 orient(0);
1321 0 : sal_Int16 relation(0);
1322 : // compatibility hack for Table Auto Format: SwTwips is "long" :(
1323 : // (this means that the file format is platform dependent)
1324 : #if SAL_TYPES_SIZEOFLONG == 8
1325 0 : rStream.ReadInt64(yPos);
1326 : #else
1327 : sal_Int32 n;
1328 : rStream.ReadInt32(n);
1329 : yPos = n;
1330 : #endif
1331 0 : rStream.ReadInt16( orient ).ReadInt16( relation );
1332 :
1333 0 : return new SwFormatVertOrient(yPos, orient, relation);
1334 : }
1335 :
1336 : // Partially implemented inline in hxx
1337 6798842 : SwFormatVertOrient::SwFormatVertOrient( SwTwips nY, sal_Int16 eVert,
1338 : sal_Int16 eRel )
1339 : : SfxPoolItem( RES_VERT_ORIENT ),
1340 : m_nYPos( nY ),
1341 : m_eOrient( eVert ),
1342 6798842 : m_eRelation( eRel )
1343 6798842 : {}
1344 :
1345 59121 : bool SwFormatVertOrient::operator==( const SfxPoolItem& rAttr ) const
1346 : {
1347 : assert(SfxPoolItem::operator==(rAttr));
1348 77967 : return ( m_nYPos == static_cast<const SwFormatVertOrient&>(rAttr).m_nYPos &&
1349 71658 : m_eOrient == static_cast<const SwFormatVertOrient&>(rAttr).m_eOrient &&
1350 71658 : m_eRelation == static_cast<const SwFormatVertOrient&>(rAttr).m_eRelation );
1351 : }
1352 :
1353 14224 : SfxPoolItem* SwFormatVertOrient::Clone( SfxItemPool* ) const
1354 : {
1355 14224 : return new SwFormatVertOrient( m_nYPos, m_eOrient, m_eRelation );
1356 : }
1357 :
1358 10868 : bool SwFormatVertOrient::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1359 : {
1360 : // here we convert always!
1361 10868 : nMemberId &= ~CONVERT_TWIPS;
1362 10868 : bool bRet = true;
1363 10868 : switch ( nMemberId )
1364 : {
1365 : case MID_VERTORIENT_ORIENT:
1366 : {
1367 963 : rVal <<= (sal_Int16)m_eOrient;
1368 : }
1369 963 : break;
1370 : case MID_VERTORIENT_RELATION:
1371 662 : rVal <<= (sal_Int16)m_eRelation;
1372 662 : break;
1373 : case MID_VERTORIENT_POSITION:
1374 9243 : rVal <<= (sal_Int32)convertTwipToMm100(GetPos());
1375 9243 : break;
1376 : default:
1377 : OSL_ENSURE( false, "unknown MemberId" );
1378 0 : bRet = false;
1379 : }
1380 10868 : return bRet;
1381 : }
1382 :
1383 9737 : bool SwFormatVertOrient::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1384 : {
1385 9737 : bool bConvert = 0 != (nMemberId&CONVERT_TWIPS);
1386 9737 : nMemberId &= ~CONVERT_TWIPS;
1387 9737 : bool bRet = true;
1388 9737 : switch ( nMemberId )
1389 : {
1390 : case MID_VERTORIENT_ORIENT:
1391 : {
1392 4446 : sal_uInt16 nVal = text::VertOrientation::NONE;
1393 4446 : rVal >>= nVal;
1394 4446 : m_eOrient = nVal;
1395 : }
1396 4446 : break;
1397 : case MID_VERTORIENT_RELATION:
1398 : {
1399 3274 : m_eRelation = lcl_IntToRelation(rVal);
1400 : }
1401 3274 : break;
1402 : case MID_VERTORIENT_POSITION:
1403 : {
1404 2017 : sal_Int32 nVal = 0;
1405 2017 : rVal >>= nVal;
1406 2017 : if(bConvert)
1407 2017 : nVal = convertMm100ToTwip(nVal);
1408 2017 : SetPos( nVal );
1409 : }
1410 2017 : break;
1411 : default:
1412 : OSL_ENSURE( false, "unknown MemberId" );
1413 0 : bRet = false;
1414 : }
1415 9737 : return bRet;
1416 : }
1417 :
1418 0 : void SwFormatVertOrient::dumpAsXml(xmlTextWriterPtr pWriter) const
1419 : {
1420 0 : xmlTextWriterStartElement(pWriter, BAD_CAST("swFormatVertOrient"));
1421 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("whichId"), BAD_CAST(OString::number(Which()).getStr()));
1422 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nYPos"), BAD_CAST(OString::number(m_nYPos).getStr()));
1423 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("eOrient"), BAD_CAST(OString::number(m_eOrient).getStr()));
1424 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("eRelation"), BAD_CAST(OString::number(m_eRelation).getStr()));
1425 0 : xmlTextWriterEndElement(pWriter);
1426 0 : }
1427 :
1428 : // Partially implemented inline in hxx
1429 17302 : SwFormatHoriOrient::SwFormatHoriOrient( SwTwips nX, sal_Int16 eHori,
1430 : sal_Int16 eRel, bool bPos )
1431 : : SfxPoolItem( RES_HORI_ORIENT ),
1432 : m_nXPos( nX ),
1433 : m_eOrient( eHori ),
1434 : m_eRelation( eRel ),
1435 17302 : m_bPosToggle( bPos )
1436 17302 : {}
1437 :
1438 62451 : bool SwFormatHoriOrient::operator==( const SfxPoolItem& rAttr ) const
1439 : {
1440 : assert(SfxPoolItem::operator==(rAttr));
1441 76738 : return ( m_nXPos == static_cast<const SwFormatHoriOrient&>(rAttr).m_nXPos &&
1442 24707 : m_eOrient == static_cast<const SwFormatHoriOrient&>(rAttr).m_eOrient &&
1443 80467 : m_eRelation == static_cast<const SwFormatHoriOrient&>(rAttr).m_eRelation &&
1444 70047 : m_bPosToggle == static_cast<const SwFormatHoriOrient&>(rAttr).m_bPosToggle );
1445 : }
1446 :
1447 13329 : SfxPoolItem* SwFormatHoriOrient::Clone( SfxItemPool* ) const
1448 : {
1449 13329 : return new SwFormatHoriOrient( m_nXPos, m_eOrient, m_eRelation, m_bPosToggle );
1450 : }
1451 :
1452 11054 : bool SwFormatHoriOrient::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1453 : {
1454 : // here we convert always!
1455 11054 : nMemberId &= ~CONVERT_TWIPS;
1456 11054 : bool bRet = true;
1457 11054 : switch ( nMemberId )
1458 : {
1459 : case MID_HORIORIENT_ORIENT:
1460 : {
1461 947 : rVal <<= (sal_Int16)m_eOrient;
1462 : }
1463 947 : break;
1464 : case MID_HORIORIENT_RELATION:
1465 662 : rVal <<= (sal_Int16)m_eRelation;
1466 662 : break;
1467 : case MID_HORIORIENT_POSITION:
1468 9246 : rVal <<= (sal_Int32)convertTwipToMm100(GetPos());
1469 9246 : break;
1470 : case MID_HORIORIENT_PAGETOGGLE:
1471 199 : rVal <<= IsPosToggle();
1472 199 : break;
1473 : default:
1474 : OSL_ENSURE( false, "unknown MemberId" );
1475 0 : bRet = false;
1476 : }
1477 11054 : return bRet;
1478 : }
1479 :
1480 9382 : bool SwFormatHoriOrient::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1481 : {
1482 9382 : bool bConvert = 0 != (nMemberId&CONVERT_TWIPS);
1483 9382 : nMemberId &= ~CONVERT_TWIPS;
1484 9382 : bool bRet = true;
1485 9382 : switch ( nMemberId )
1486 : {
1487 : case MID_HORIORIENT_ORIENT:
1488 : {
1489 3269 : sal_Int16 nVal = text::HoriOrientation::NONE;
1490 3269 : rVal >>= nVal;
1491 3269 : m_eOrient = nVal;
1492 : }
1493 3269 : break;
1494 : case MID_HORIORIENT_RELATION:
1495 : {
1496 2613 : m_eRelation = lcl_IntToRelation(rVal);
1497 : }
1498 2613 : break;
1499 : case MID_HORIORIENT_POSITION:
1500 : {
1501 2046 : sal_Int32 nVal = 0;
1502 2046 : if(!(rVal >>= nVal))
1503 0 : bRet = false;
1504 2046 : if(bConvert)
1505 2046 : nVal = convertMm100ToTwip(nVal);
1506 2046 : SetPos( nVal );
1507 : }
1508 2046 : break;
1509 : case MID_HORIORIENT_PAGETOGGLE:
1510 1454 : SetPosToggle( *static_cast<sal_Bool const *>(rVal.getValue()));
1511 1454 : break;
1512 : default:
1513 : OSL_ENSURE( false, "unknown MemberId" );
1514 0 : bRet = false;
1515 : }
1516 9382 : return bRet;
1517 : }
1518 :
1519 0 : void SwFormatHoriOrient::dumpAsXml(xmlTextWriterPtr pWriter) const
1520 : {
1521 0 : xmlTextWriterStartElement(pWriter, BAD_CAST("swFormatHoriOrient"));
1522 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("whichId"), BAD_CAST(OString::number(Which()).getStr()));
1523 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nXPos"), BAD_CAST(OString::number(m_nXPos).getStr()));
1524 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("eOrient"), BAD_CAST(OString::number(m_eOrient).getStr()));
1525 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("eRelation"), BAD_CAST(OString::number(m_eRelation).getStr()));
1526 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("bPosToggle"), BAD_CAST(OString::boolean(m_bPosToggle).getStr()));
1527 0 : xmlTextWriterEndElement(pWriter);
1528 0 : }
1529 :
1530 : // Partially implemented inline in hxx
1531 4198 : SwFormatAnchor::SwFormatAnchor( RndStdIds nRnd, sal_uInt16 nPage )
1532 : : SfxPoolItem( RES_ANCHOR ),
1533 : nAnchorId( nRnd ),
1534 : nPageNum( nPage ),
1535 : // OD 2004-05-05 #i28701# - get always new increased order number
1536 4198 : mnOrder( ++mnOrderCounter )
1537 4198 : {}
1538 :
1539 100684 : SwFormatAnchor::SwFormatAnchor( const SwFormatAnchor &rCpy )
1540 : : SfxPoolItem( RES_ANCHOR )
1541 100684 : , m_pContentAnchor( (rCpy.GetContentAnchor())
1542 65082 : ? new SwPosition( *rCpy.GetContentAnchor() ) : 0 )
1543 100684 : , nAnchorId( rCpy.GetAnchorId() )
1544 100684 : , nPageNum( rCpy.GetPageNum() )
1545 : // OD 2004-05-05 #i28701# - get always new increased order number
1546 467818 : , mnOrder( ++mnOrderCounter )
1547 : {
1548 100684 : }
1549 :
1550 189524 : SwFormatAnchor::~SwFormatAnchor()
1551 : {
1552 189524 : }
1553 :
1554 14547 : void SwFormatAnchor::SetAnchor( const SwPosition *pPos )
1555 : {
1556 : // anchor only to paragraphs, or start nodes in case of FLY_AT_FLY
1557 : // also allow table node, this is used when a table is selected and is converted to a frame by the UI
1558 : assert(!pPos
1559 : || ((FLY_AT_FLY == nAnchorId) &&
1560 : dynamic_cast<SwStartNode*>(&pPos->nNode.GetNode()))
1561 : || (FLY_AT_PARA == nAnchorId && dynamic_cast<SwTableNode*>(&pPos->nNode.GetNode()))
1562 : || dynamic_cast<SwTextNode*>(&pPos->nNode.GetNode()));
1563 14547 : m_pContentAnchor .reset( (pPos) ? new SwPosition( *pPos ) : 0 );
1564 : // Flys anchored AT paragraph should not point into the paragraph content
1565 28737 : if (m_pContentAnchor &&
1566 33855 : ((FLY_AT_PARA == nAnchorId) || (FLY_AT_FLY == nAnchorId)))
1567 : {
1568 3027 : m_pContentAnchor->nContent.Assign( 0, 0 );
1569 : }
1570 14547 : }
1571 :
1572 117 : SwFormatAnchor& SwFormatAnchor::operator=(const SwFormatAnchor& rAnchor)
1573 : {
1574 117 : nAnchorId = rAnchor.GetAnchorId();
1575 117 : nPageNum = rAnchor.GetPageNum();
1576 : // OD 2004-05-05 #i28701# - get always new increased order number
1577 117 : mnOrder = ++mnOrderCounter;
1578 :
1579 117 : m_pContentAnchor.reset( (rAnchor.GetContentAnchor())
1580 0 : ? new SwPosition(*(rAnchor.GetContentAnchor()))
1581 117 : : 0 );
1582 117 : return *this;
1583 : }
1584 :
1585 34358 : bool SwFormatAnchor::operator==( const SfxPoolItem& rAttr ) const
1586 : {
1587 : assert(SfxPoolItem::operator==(rAttr));
1588 34358 : SwFormatAnchor const& rFormatAnchor(static_cast<SwFormatAnchor const&>(rAttr));
1589 : // OD 2004-05-05 #i28701# - Note: <mnOrder> hasn't to be considered.
1590 64007 : return ( nAnchorId == rFormatAnchor.GetAnchorId() &&
1591 85464 : nPageNum == rFormatAnchor.GetPageNum() &&
1592 : // compare anchor: either both do not point into a textnode or
1593 : // both do (valid m_pContentAnchor) and the positions are equal
1594 57066 : ((m_pContentAnchor.get() == rFormatAnchor.m_pContentAnchor.get()) ||
1595 79372 : (m_pContentAnchor && rFormatAnchor.GetContentAnchor() &&
1596 58780 : (*m_pContentAnchor == *rFormatAnchor.GetContentAnchor()))));
1597 : }
1598 :
1599 84385 : SfxPoolItem* SwFormatAnchor::Clone( SfxItemPool* ) const
1600 : {
1601 84385 : return new SwFormatAnchor( *this );
1602 : }
1603 :
1604 : // OD 2004-05-05 #i28701#
1605 : sal_uInt32 SwFormatAnchor::mnOrderCounter = 0;
1606 :
1607 : // OD 2004-05-05 #i28701#
1608 :
1609 10665 : bool SwFormatAnchor::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1610 : {
1611 : // here we convert always!
1612 10665 : nMemberId &= ~CONVERT_TWIPS;
1613 10665 : bool bRet = true;
1614 10665 : switch ( nMemberId )
1615 : {
1616 : case MID_ANCHOR_ANCHORTYPE:
1617 :
1618 : text::TextContentAnchorType eRet;
1619 10652 : switch (GetAnchorId())
1620 : {
1621 : case FLY_AT_CHAR:
1622 1706 : eRet = text::TextContentAnchorType_AT_CHARACTER;
1623 1706 : break;
1624 : case FLY_AT_PAGE:
1625 1596 : eRet = text::TextContentAnchorType_AT_PAGE;
1626 1596 : break;
1627 : case FLY_AT_FLY:
1628 9 : eRet = text::TextContentAnchorType_AT_FRAME;
1629 9 : break;
1630 : case FLY_AS_CHAR:
1631 4423 : eRet = text::TextContentAnchorType_AS_CHARACTER;
1632 4423 : break;
1633 : //case FLY_AT_PARA:
1634 : default:
1635 2918 : eRet = text::TextContentAnchorType_AT_PARAGRAPH;
1636 : }
1637 10652 : rVal <<= eRet;
1638 21317 : break;
1639 : case MID_ANCHOR_PAGENUM:
1640 13 : rVal <<= (sal_Int16)GetPageNum();
1641 13 : break;
1642 : case MID_ANCHOR_ANCHORFRAME:
1643 : {
1644 0 : if (m_pContentAnchor && FLY_AT_FLY == nAnchorId)
1645 : {
1646 0 : SwFrameFormat* pFormat = m_pContentAnchor->nNode.GetNode().GetFlyFormat();
1647 0 : if(pFormat)
1648 : {
1649 : uno::Reference<text::XTextFrame> const xRet(
1650 0 : SwXTextFrame::CreateXTextFrame(*pFormat->GetDoc(), pFormat));
1651 0 : rVal <<= xRet;
1652 : }
1653 : }
1654 : }
1655 0 : break;
1656 : default:
1657 : OSL_ENSURE( false, "unknown MemberId" );
1658 0 : bRet = false;
1659 : }
1660 10665 : return bRet;
1661 : }
1662 :
1663 4550 : bool SwFormatAnchor::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1664 : {
1665 : // here we convert always!
1666 4550 : nMemberId &= ~CONVERT_TWIPS;
1667 4550 : bool bRet = true;
1668 4550 : switch ( nMemberId )
1669 : {
1670 : case MID_ANCHOR_ANCHORTYPE:
1671 : {
1672 : RndStdIds eAnchor;
1673 4427 : switch( SWUnoHelper::GetEnumAsInt32( rVal ) )
1674 : {
1675 : case text::TextContentAnchorType_AS_CHARACTER:
1676 2012 : eAnchor = FLY_AS_CHAR;
1677 2012 : break;
1678 : case text::TextContentAnchorType_AT_PAGE:
1679 134 : eAnchor = FLY_AT_PAGE;
1680 134 : if( GetPageNum() > 0 )
1681 : {
1682 : // If the anchor type is page and a valid page number
1683 : // has been set, the content position isn't required
1684 : // any longer.
1685 96 : m_pContentAnchor.reset();
1686 : }
1687 134 : break;
1688 : case text::TextContentAnchorType_AT_FRAME:
1689 9 : eAnchor = FLY_AT_FLY;
1690 9 : break;
1691 : case text::TextContentAnchorType_AT_CHARACTER:
1692 999 : eAnchor = FLY_AT_CHAR;
1693 999 : break;
1694 : //case text::TextContentAnchorType_AT_PARAGRAPH:
1695 : default:
1696 1273 : eAnchor = FLY_AT_PARA;
1697 1273 : break;
1698 : }
1699 4427 : SetType( eAnchor );
1700 : }
1701 4427 : break;
1702 : case MID_ANCHOR_PAGENUM:
1703 : {
1704 123 : sal_Int16 nVal = 0;
1705 123 : if((rVal >>= nVal) && nVal > 0)
1706 : {
1707 123 : SetPageNum( nVal );
1708 123 : if (FLY_AT_PAGE == GetAnchorId())
1709 : {
1710 : // If the anchor type is page and a valid page number
1711 : // is set, the content paoition has to be deleted to not
1712 : // confuse the layout (frmtool.cxx). However, if the
1713 : // anchor type is not page, any content position will
1714 : // be kept.
1715 113 : m_pContentAnchor.reset();
1716 : }
1717 : }
1718 : else
1719 0 : bRet = false;
1720 : }
1721 123 : break;
1722 : case MID_ANCHOR_ANCHORFRAME:
1723 : //no break here!;
1724 : default:
1725 : OSL_ENSURE( false, "unknown MemberId" );
1726 0 : bRet = false;
1727 : }
1728 4550 : return bRet;
1729 : }
1730 :
1731 0 : void SwFormatAnchor::dumpAsXml(xmlTextWriterPtr pWriter) const
1732 : {
1733 0 : xmlTextWriterStartElement(pWriter, BAD_CAST("swFormatAnchor"));
1734 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("whichId"), BAD_CAST(OString::number(Which()).getStr()));
1735 :
1736 0 : if (m_pContentAnchor)
1737 : {
1738 0 : std::stringstream aContentAnchor;
1739 0 : aContentAnchor << *m_pContentAnchor;
1740 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("pContentAnchor"), BAD_CAST(aContentAnchor.str().c_str()));
1741 : }
1742 : else
1743 0 : xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("pContentAnchor"), "%p", m_pContentAnchor.get());
1744 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nAnchorType"), BAD_CAST(OString::number(nAnchorId).getStr()));
1745 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nPageNum"), BAD_CAST(OString::number(nPageNum).getStr()));
1746 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nOrder"), BAD_CAST(OString::number(mnOrder).getStr()));
1747 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("nOrderCounter"), BAD_CAST(OString::number(mnOrderCounter).getStr()));
1748 0 : OUString aPresentation;
1749 0 : GetPresentation(SFX_ITEM_PRESENTATION_NAMELESS, SFX_MAPUNIT_100TH_MM, SFX_MAPUNIT_100TH_MM, aPresentation);
1750 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("presentation"), BAD_CAST(aPresentation.toUtf8().getStr()));
1751 :
1752 0 : xmlTextWriterEndElement(pWriter);
1753 0 : }
1754 :
1755 : // Partially implemented inline in hxx
1756 59 : SwFormatURL::SwFormatURL() :
1757 : SfxPoolItem( RES_URL ),
1758 : pMap( 0 ),
1759 59 : bIsServerMap( false )
1760 : {
1761 59 : }
1762 :
1763 70 : SwFormatURL::SwFormatURL( const SwFormatURL &rURL) :
1764 : SfxPoolItem( RES_URL ),
1765 : sTargetFrameName( rURL.GetTargetFrameName() ),
1766 : sURL( rURL.GetURL() ),
1767 : sName( rURL.GetName() ),
1768 70 : bIsServerMap( rURL.IsServerMap() )
1769 : {
1770 70 : pMap = rURL.GetMap() ? new ImageMap( *rURL.GetMap() ) : 0;
1771 70 : }
1772 :
1773 334 : SwFormatURL::~SwFormatURL()
1774 : {
1775 129 : delete pMap;
1776 205 : }
1777 :
1778 65 : bool SwFormatURL::operator==( const SfxPoolItem &rAttr ) const
1779 : {
1780 : assert(SfxPoolItem::operator==(rAttr));
1781 65 : const SwFormatURL &rCmp = static_cast<const SwFormatURL&>(rAttr);
1782 195 : bool bRet = bIsServerMap == rCmp.IsServerMap() &&
1783 386 : sURL == rCmp.GetURL() &&
1784 443 : sTargetFrameName == rCmp.GetTargetFrameName() &&
1785 187 : sName == rCmp.GetName();
1786 65 : if ( bRet )
1787 : {
1788 57 : if ( pMap && rCmp.GetMap() )
1789 1 : bRet = *pMap == *rCmp.GetMap();
1790 : else
1791 56 : bRet = pMap == rCmp.GetMap();
1792 : }
1793 65 : return bRet;
1794 : }
1795 :
1796 17 : SfxPoolItem* SwFormatURL::Clone( SfxItemPool* ) const
1797 : {
1798 17 : return new SwFormatURL( *this );
1799 : }
1800 :
1801 5 : void SwFormatURL::SetURL(const OUString &rURL, bool bServerMap)
1802 : {
1803 5 : sURL = rURL;
1804 5 : bIsServerMap = bServerMap;
1805 5 : }
1806 :
1807 0 : void SwFormatURL::SetMap( const ImageMap *pM )
1808 : {
1809 0 : delete pMap;
1810 0 : pMap = pM ? new ImageMap( *pM ) : 0;
1811 0 : }
1812 :
1813 75 : bool SwFormatURL::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1814 : {
1815 : // here we convert always!
1816 75 : nMemberId &= ~CONVERT_TWIPS;
1817 75 : bool bRet = true;
1818 75 : switch ( nMemberId )
1819 : {
1820 : case MID_URL_URL:
1821 0 : rVal <<= GetURL();
1822 0 : break;
1823 : case MID_URL_TARGET:
1824 0 : rVal <<= GetTargetFrameName();
1825 0 : break;
1826 : case MID_URL_HYPERLINKNAME:
1827 0 : rVal <<= GetName();
1828 0 : break;
1829 : case MID_URL_CLIENTMAP:
1830 : {
1831 75 : uno::Reference< uno::XInterface > xInt;
1832 75 : if(pMap)
1833 : {
1834 0 : xInt = SvUnoImageMap_createInstance( *pMap, sw_GetSupportedMacroItems() );
1835 : }
1836 : else
1837 : {
1838 75 : ImageMap aEmptyMap;
1839 75 : xInt = SvUnoImageMap_createInstance( aEmptyMap, sw_GetSupportedMacroItems() );
1840 : }
1841 150 : uno::Reference< container::XIndexContainer > xCont(xInt, uno::UNO_QUERY);
1842 150 : rVal <<= xCont;
1843 : }
1844 75 : break;
1845 : case MID_URL_SERVERMAP:
1846 0 : rVal <<= IsServerMap();
1847 0 : break;
1848 : default:
1849 : OSL_ENSURE( false, "unknown MemberId" );
1850 0 : bRet = false;
1851 : }
1852 75 : return bRet;
1853 : }
1854 :
1855 9 : bool SwFormatURL::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1856 : {
1857 : // here we convert always!
1858 9 : nMemberId &= ~CONVERT_TWIPS;
1859 9 : bool bRet = true;
1860 9 : switch ( nMemberId )
1861 : {
1862 : case MID_URL_URL:
1863 : {
1864 2 : OUString sTmp;
1865 2 : rVal >>= sTmp;
1866 2 : SetURL( sTmp, bIsServerMap );
1867 : }
1868 2 : break;
1869 : case MID_URL_TARGET:
1870 : {
1871 2 : OUString sTmp;
1872 2 : rVal >>= sTmp;
1873 2 : SetTargetFrameName( sTmp );
1874 : }
1875 2 : break;
1876 : case MID_URL_HYPERLINKNAME:
1877 : {
1878 2 : OUString sTmp;
1879 2 : rVal >>= sTmp;
1880 2 : SetName( sTmp );
1881 : }
1882 2 : break;
1883 : case MID_URL_CLIENTMAP:
1884 : {
1885 1 : uno::Reference<container::XIndexContainer> xCont;
1886 1 : if(!rVal.hasValue())
1887 0 : DELETEZ(pMap);
1888 1 : else if(rVal >>= xCont)
1889 : {
1890 1 : if(!pMap)
1891 1 : pMap = new ImageMap;
1892 1 : bRet = SvUnoImageMap_fillImageMap( xCont, *pMap );
1893 : }
1894 : else
1895 0 : bRet = false;
1896 : }
1897 1 : break;
1898 : case MID_URL_SERVERMAP:
1899 2 : bIsServerMap = *static_cast<sal_Bool const *>(rVal.getValue());
1900 2 : break;
1901 : default:
1902 : OSL_ENSURE( false, "unknown MemberId" );
1903 0 : bRet = false;
1904 : }
1905 9 : return bRet;
1906 : }
1907 :
1908 174 : SfxPoolItem* SwFormatEditInReadonly::Clone( SfxItemPool* ) const
1909 : {
1910 174 : return new SwFormatEditInReadonly( Which(), GetValue() );
1911 : }
1912 :
1913 5 : SfxPoolItem* SwFormatLayoutSplit::Clone( SfxItemPool* ) const
1914 : {
1915 5 : return new SwFormatLayoutSplit( GetValue() );
1916 : }
1917 :
1918 4377 : SfxPoolItem* SwFormatRowSplit::Clone( SfxItemPool* ) const
1919 : {
1920 4377 : return new SwFormatRowSplit( GetValue() );
1921 : }
1922 :
1923 63 : SfxPoolItem* SwFormatNoBalancedColumns::Clone( SfxItemPool* ) const
1924 : {
1925 63 : return new SwFormatNoBalancedColumns( GetValue() );
1926 : }
1927 :
1928 0 : void SwFormatNoBalancedColumns::dumpAsXml(xmlTextWriterPtr pWriter) const
1929 : {
1930 0 : xmlTextWriterStartElement(pWriter, BAD_CAST("swFormatNoBalancedColumns"));
1931 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("whichId"), BAD_CAST(OString::number(Which()).getStr()));
1932 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("value"), BAD_CAST(OString::boolean(GetValue()).getStr()));
1933 0 : xmlTextWriterEndElement(pWriter);
1934 0 : }
1935 :
1936 : // class SwFormatFootnoteEndAtTextEnd
1937 :
1938 0 : sal_uInt16 SwFormatFootnoteEndAtTextEnd::GetValueCount() const
1939 : {
1940 0 : return sal_uInt16( FTNEND_ATTXTEND_END );
1941 : }
1942 :
1943 4 : SwFormatFootnoteEndAtTextEnd& SwFormatFootnoteEndAtTextEnd::operator=(
1944 : const SwFormatFootnoteEndAtTextEnd& rAttr )
1945 : {
1946 4 : SfxEnumItem::SetValue( rAttr.GetValue() );
1947 4 : aFormat = rAttr.aFormat;
1948 4 : nOffset = rAttr.nOffset;
1949 4 : sPrefix = rAttr.sPrefix;
1950 4 : sSuffix = rAttr.sSuffix;
1951 4 : return *this;
1952 : }
1953 :
1954 106 : bool SwFormatFootnoteEndAtTextEnd::operator==( const SfxPoolItem& rItem ) const
1955 : {
1956 106 : const SwFormatFootnoteEndAtTextEnd& rAttr = static_cast<const SwFormatFootnoteEndAtTextEnd&>(rItem);
1957 212 : return SfxEnumItem::operator==( rAttr ) &&
1958 212 : aFormat.GetNumberingType() == rAttr.aFormat.GetNumberingType() &&
1959 212 : nOffset == rAttr.nOffset &&
1960 318 : sPrefix == rAttr.sPrefix &&
1961 212 : sSuffix == rAttr.sSuffix;
1962 : }
1963 :
1964 0 : bool SwFormatFootnoteEndAtTextEnd::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1965 : {
1966 0 : nMemberId &= ~CONVERT_TWIPS;
1967 0 : switch(nMemberId)
1968 : {
1969 : case MID_COLLECT :
1970 0 : rVal <<= GetValue() >= FTNEND_ATTXTEND;
1971 0 : break;
1972 : case MID_RESTART_NUM :
1973 0 : rVal <<= GetValue() >= FTNEND_ATTXTEND_OWNNUMSEQ;
1974 0 : break;
1975 0 : case MID_NUM_START_AT: rVal <<= (sal_Int16) nOffset; break;
1976 : case MID_OWN_NUM :
1977 0 : rVal <<= GetValue() >= FTNEND_ATTXTEND_OWNNUMANDFMT;
1978 0 : break;
1979 0 : case MID_NUM_TYPE : rVal <<= aFormat.GetNumberingType(); break;
1980 0 : case MID_PREFIX : rVal <<= OUString(sPrefix); break;
1981 0 : case MID_SUFFIX : rVal <<= OUString(sSuffix); break;
1982 0 : default: return false;
1983 : }
1984 0 : return true;
1985 : }
1986 :
1987 28 : bool SwFormatFootnoteEndAtTextEnd::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1988 : {
1989 28 : bool bRet = true;
1990 28 : nMemberId &= ~CONVERT_TWIPS;
1991 28 : switch(nMemberId)
1992 : {
1993 : case MID_COLLECT :
1994 : {
1995 4 : bool bVal = *static_cast<sal_Bool const *>(rVal.getValue());
1996 4 : if(!bVal && GetValue() >= FTNEND_ATTXTEND)
1997 0 : SetValue(FTNEND_ATPGORDOCEND);
1998 4 : else if(bVal && GetValue() < FTNEND_ATTXTEND)
1999 4 : SetValue(FTNEND_ATTXTEND);
2000 : }
2001 4 : break;
2002 : case MID_RESTART_NUM :
2003 : {
2004 4 : bool bVal = *static_cast<sal_Bool const *>(rVal.getValue());
2005 4 : if(!bVal && GetValue() >= FTNEND_ATTXTEND_OWNNUMSEQ)
2006 0 : SetValue(FTNEND_ATTXTEND);
2007 4 : else if(bVal && GetValue() < FTNEND_ATTXTEND_OWNNUMSEQ)
2008 4 : SetValue(FTNEND_ATTXTEND_OWNNUMSEQ);
2009 : }
2010 4 : break;
2011 : case MID_NUM_START_AT:
2012 : {
2013 4 : sal_Int16 nVal = 0;
2014 4 : rVal >>= nVal;
2015 4 : if(nVal >= 0)
2016 4 : nOffset = nVal;
2017 : else
2018 0 : bRet = false;
2019 : }
2020 4 : break;
2021 : case MID_OWN_NUM :
2022 : {
2023 4 : bool bVal = *static_cast<sal_Bool const *>(rVal.getValue());
2024 4 : if(!bVal && GetValue() >= FTNEND_ATTXTEND_OWNNUMANDFMT)
2025 0 : SetValue(FTNEND_ATTXTEND_OWNNUMSEQ);
2026 4 : else if(bVal && GetValue() < FTNEND_ATTXTEND_OWNNUMANDFMT)
2027 0 : SetValue(FTNEND_ATTXTEND_OWNNUMANDFMT);
2028 : }
2029 4 : break;
2030 : case MID_NUM_TYPE :
2031 : {
2032 4 : sal_Int16 nVal = 0;
2033 4 : rVal >>= nVal;
2034 8 : if(nVal >= 0 &&
2035 4 : (nVal <= SVX_NUM_ARABIC ||
2036 0 : SVX_NUM_CHARS_UPPER_LETTER_N == nVal ||
2037 0 : SVX_NUM_CHARS_LOWER_LETTER_N == nVal ))
2038 4 : aFormat.SetNumberingType(nVal);
2039 : else
2040 0 : bRet = false;
2041 : }
2042 4 : break;
2043 : case MID_PREFIX :
2044 : {
2045 4 : OUString sVal; rVal >>= sVal;
2046 4 : sPrefix = sVal;
2047 : }
2048 4 : break;
2049 : case MID_SUFFIX :
2050 : {
2051 4 : OUString sVal; rVal >>= sVal;
2052 4 : sSuffix = sVal;
2053 : }
2054 4 : break;
2055 0 : default: bRet = false;
2056 : }
2057 28 : return bRet;
2058 : }
2059 :
2060 : // class SwFormatFootnoteAtTextEnd
2061 :
2062 2 : SfxPoolItem* SwFormatFootnoteAtTextEnd::Clone( SfxItemPool* ) const
2063 : {
2064 2 : SwFormatFootnoteAtTextEnd* pNew = new SwFormatFootnoteAtTextEnd;
2065 2 : *pNew = *this;
2066 2 : return pNew;
2067 : }
2068 :
2069 : // class SwFormatEndAtTextEnd
2070 :
2071 2 : SfxPoolItem* SwFormatEndAtTextEnd::Clone( SfxItemPool* ) const
2072 : {
2073 2 : SwFormatEndAtTextEnd* pNew = new SwFormatEndAtTextEnd;
2074 2 : *pNew = *this;
2075 2 : return pNew;
2076 : }
2077 :
2078 : //class SwFormatChain
2079 :
2080 57 : bool SwFormatChain::operator==( const SfxPoolItem &rAttr ) const
2081 : {
2082 : assert(SfxPoolItem::operator==(rAttr));
2083 :
2084 114 : return GetPrev() == static_cast<const SwFormatChain&>(rAttr).GetPrev() &&
2085 114 : GetNext() == static_cast<const SwFormatChain&>(rAttr).GetNext();
2086 : }
2087 :
2088 4 : SwFormatChain::SwFormatChain( const SwFormatChain &rCpy ) :
2089 4 : SfxPoolItem( RES_CHAIN )
2090 : {
2091 4 : SetPrev( rCpy.GetPrev() );
2092 4 : SetNext( rCpy.GetNext() );
2093 4 : }
2094 :
2095 34 : SfxPoolItem* SwFormatChain::Clone( SfxItemPool* ) const
2096 : {
2097 34 : SwFormatChain *pRet = new SwFormatChain;
2098 34 : pRet->SetPrev( GetPrev() );
2099 34 : pRet->SetNext( GetNext() );
2100 34 : return pRet;
2101 : }
2102 :
2103 50 : void SwFormatChain::SetPrev( SwFlyFrameFormat *pFormat )
2104 : {
2105 50 : if ( pFormat )
2106 29 : pFormat->Add( &aPrev );
2107 21 : else if ( aPrev.GetRegisteredIn() )
2108 4 : static_cast<SwModify*>(aPrev.GetRegisteredIn())->Remove( &aPrev );
2109 50 : }
2110 :
2111 46 : void SwFormatChain::SetNext( SwFlyFrameFormat *pFormat )
2112 : {
2113 46 : if ( pFormat )
2114 17 : pFormat->Add( &aNext );
2115 29 : else if ( aNext.GetRegisteredIn() )
2116 0 : static_cast<SwModify*>(aNext.GetRegisteredIn())->Remove( &aNext );
2117 46 : }
2118 :
2119 409 : bool SwFormatChain::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
2120 : {
2121 : // here we convert always!
2122 409 : nMemberId &= ~CONVERT_TWIPS;
2123 409 : bool bRet = true;
2124 409 : OUString aRet;
2125 409 : switch ( nMemberId )
2126 : {
2127 : case MID_CHAIN_PREVNAME:
2128 175 : if ( GetPrev() )
2129 2 : aRet = GetPrev()->GetName();
2130 175 : break;
2131 : case MID_CHAIN_NEXTNAME:
2132 234 : if ( GetNext() )
2133 2 : aRet = GetNext()->GetName();
2134 234 : break;
2135 : default:
2136 : OSL_ENSURE( false, "unknown MemberId" );
2137 0 : bRet = false;
2138 : }
2139 409 : rVal <<= aRet;
2140 409 : return bRet;
2141 : }
2142 :
2143 6908 : SwFormatLineNumber::SwFormatLineNumber() :
2144 6908 : SfxPoolItem( RES_LINENUMBER )
2145 : {
2146 6908 : nStartValue = 0;
2147 6908 : bCountLines = true;
2148 6908 : }
2149 :
2150 19601 : SwFormatLineNumber::~SwFormatLineNumber()
2151 : {
2152 19601 : }
2153 :
2154 9914 : bool SwFormatLineNumber::operator==( const SfxPoolItem &rAttr ) const
2155 : {
2156 : assert(SfxPoolItem::operator==(rAttr));
2157 :
2158 19809 : return nStartValue == static_cast<const SwFormatLineNumber&>(rAttr).GetStartValue() &&
2159 19809 : bCountLines == static_cast<const SwFormatLineNumber&>(rAttr).IsCount();
2160 : }
2161 :
2162 6323 : SfxPoolItem* SwFormatLineNumber::Clone( SfxItemPool* ) const
2163 : {
2164 6323 : return new SwFormatLineNumber( *this );
2165 : }
2166 :
2167 402 : bool SwFormatLineNumber::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
2168 : {
2169 : // here we convert always!
2170 402 : nMemberId &= ~CONVERT_TWIPS;
2171 402 : bool bRet = true;
2172 402 : switch ( nMemberId )
2173 : {
2174 : case MID_LINENUMBER_COUNT:
2175 201 : rVal <<= IsCount();
2176 201 : break;
2177 : case MID_LINENUMBER_STARTVALUE:
2178 201 : rVal <<= (sal_Int32)GetStartValue();
2179 201 : break;
2180 : default:
2181 : OSL_ENSURE( false, "unknown MemberId" );
2182 0 : bRet = false;
2183 : }
2184 402 : return bRet;
2185 : }
2186 :
2187 3084 : bool SwFormatLineNumber::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
2188 : {
2189 : // here we convert always!
2190 3084 : nMemberId &= ~CONVERT_TWIPS;
2191 3084 : bool bRet = true;
2192 3084 : switch ( nMemberId )
2193 : {
2194 : case MID_LINENUMBER_COUNT:
2195 2235 : SetCountLines( *static_cast<sal_Bool const *>(rVal.getValue()) );
2196 2235 : break;
2197 : case MID_LINENUMBER_STARTVALUE:
2198 : {
2199 849 : sal_Int32 nVal = 0;
2200 849 : if(rVal >>= nVal)
2201 849 : SetStartValue( nVal );
2202 : else
2203 0 : bRet = false;
2204 : }
2205 849 : break;
2206 : default:
2207 : OSL_ENSURE( false, "unknown MemberId" );
2208 0 : bRet = false;
2209 : }
2210 3084 : return bRet;
2211 : }
2212 :
2213 200 : SwTextGridItem::SwTextGridItem()
2214 : : SfxPoolItem( RES_TEXTGRID ), m_aColor( COL_LIGHTGRAY ), m_nLines( 20 )
2215 : , m_nBaseHeight( 400 ), m_nRubyHeight( 200 ), m_eGridType( GRID_NONE )
2216 : , m_bRubyTextBelow( false ), m_bPrintGrid( true ), m_bDisplayGrid( true )
2217 200 : , m_nBaseWidth(400), m_bSnapToChars( true ), m_bSquaredMode(true)
2218 : {
2219 200 : }
2220 :
2221 87908 : SwTextGridItem::~SwTextGridItem()
2222 : {
2223 87908 : }
2224 :
2225 74293 : bool SwTextGridItem::operator==( const SfxPoolItem& rAttr ) const
2226 : {
2227 : assert(SfxPoolItem::operator==(rAttr));
2228 74293 : SwTextGridItem const& rOther(static_cast<SwTextGridItem const&>(rAttr));
2229 74293 : return m_eGridType == rOther.GetGridType()
2230 73911 : && m_nLines == rOther.GetLines()
2231 39874 : && m_nBaseHeight == rOther.GetBaseHeight()
2232 33459 : && m_nRubyHeight == rOther.GetRubyHeight()
2233 30237 : && m_bRubyTextBelow == rOther.GetRubyTextBelow()
2234 30237 : && m_bDisplayGrid == rOther.GetDisplayGrid()
2235 25398 : && m_bPrintGrid == rOther.GetPrintGrid()
2236 20416 : && m_aColor == rOther.GetColor()
2237 20416 : && m_nBaseWidth == rOther.GetBaseWidth()
2238 20328 : && m_bSnapToChars == rOther.GetSnapToChars()
2239 94621 : && m_bSquaredMode == rOther.GetSquaredMode();
2240 : }
2241 :
2242 41671 : SfxPoolItem* SwTextGridItem::Clone( SfxItemPool* ) const
2243 : {
2244 41671 : return new SwTextGridItem( *this );
2245 : }
2246 :
2247 0 : SwTextGridItem& SwTextGridItem::operator=( const SwTextGridItem& rCpy )
2248 : {
2249 0 : m_aColor = rCpy.GetColor();
2250 0 : m_nLines = rCpy.GetLines();
2251 0 : m_nBaseHeight = rCpy.GetBaseHeight();
2252 0 : m_nRubyHeight = rCpy.GetRubyHeight();
2253 0 : m_eGridType = rCpy.GetGridType();
2254 0 : m_bRubyTextBelow = rCpy.GetRubyTextBelow();
2255 0 : m_bPrintGrid = rCpy.GetPrintGrid();
2256 0 : m_bDisplayGrid = rCpy.GetDisplayGrid();
2257 0 : m_nBaseWidth = rCpy.GetBaseWidth();
2258 0 : m_bSnapToChars = rCpy.GetSnapToChars();
2259 0 : m_bSquaredMode = rCpy.GetSquaredMode();
2260 :
2261 0 : return *this;
2262 : }
2263 :
2264 396 : bool SwTextGridItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
2265 : {
2266 396 : bool bRet = true;
2267 :
2268 396 : switch( nMemberId & ~CONVERT_TWIPS )
2269 : {
2270 : case MID_GRID_COLOR:
2271 29 : rVal <<= GetColor().GetColor();
2272 29 : break;
2273 : case MID_GRID_LINES:
2274 29 : rVal <<= GetLines();
2275 29 : break;
2276 : case MID_GRID_RUBY_BELOW:
2277 29 : rVal <<= m_bRubyTextBelow;
2278 29 : break;
2279 : case MID_GRID_PRINT:
2280 29 : rVal <<= m_bPrintGrid;
2281 29 : break;
2282 : case MID_GRID_DISPLAY:
2283 29 : rVal <<= m_bDisplayGrid;
2284 29 : break;
2285 : case MID_GRID_BASEHEIGHT:
2286 : OSL_ENSURE( (nMemberId & CONVERT_TWIPS) != 0,
2287 : "This value needs TWIPS-MM100 conversion" );
2288 29 : rVal <<= (sal_Int32) convertTwipToMm100(m_nBaseHeight);
2289 29 : break;
2290 : case MID_GRID_BASEWIDTH:
2291 : OSL_ENSURE( (nMemberId & CONVERT_TWIPS) != 0,
2292 : "This value needs TWIPS-MM100 conversion" );
2293 29 : rVal <<= (sal_Int32) convertTwipToMm100(m_nBaseWidth);
2294 29 : break;
2295 : case MID_GRID_RUBYHEIGHT:
2296 : OSL_ENSURE( (nMemberId & CONVERT_TWIPS) != 0,
2297 : "This value needs TWIPS-MM100 conversion" );
2298 29 : rVal <<= (sal_Int32)convertTwipToMm100(m_nRubyHeight);
2299 29 : break;
2300 : case MID_GRID_TYPE:
2301 31 : switch( GetGridType() )
2302 : {
2303 : case GRID_NONE:
2304 29 : rVal <<= text::TextGridMode::NONE;
2305 29 : break;
2306 : case GRID_LINES_ONLY:
2307 0 : rVal <<= text::TextGridMode::LINES;
2308 0 : break;
2309 : case GRID_LINES_CHARS:
2310 2 : rVal <<= text::TextGridMode::LINES_AND_CHARS;
2311 2 : break;
2312 : default:
2313 : OSL_FAIL("unknown SwTextGrid value");
2314 0 : bRet = false;
2315 0 : break;
2316 : }
2317 31 : break;
2318 : case MID_GRID_SNAPTOCHARS:
2319 31 : rVal <<= m_bSnapToChars;
2320 31 : break;
2321 : case MID_GRID_STANDARD_MODE:
2322 102 : rVal <<= !m_bSquaredMode;
2323 102 : break;
2324 : default:
2325 : OSL_FAIL("Unknown SwTextGridItem member");
2326 0 : bRet = false;
2327 0 : break;
2328 : }
2329 :
2330 396 : return bRet;
2331 : }
2332 :
2333 16781 : bool SwTextGridItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
2334 : {
2335 16781 : bool bRet = true;
2336 16781 : switch( nMemberId & ~CONVERT_TWIPS )
2337 : {
2338 : case MID_GRID_COLOR:
2339 : {
2340 76 : sal_Int32 nTmp = 0;
2341 76 : bRet = (rVal >>= nTmp);
2342 76 : if( bRet )
2343 76 : SetColor( Color(nTmp) );
2344 : }
2345 76 : break;
2346 : case MID_GRID_LINES:
2347 : {
2348 2344 : sal_Int16 nTmp = 0;
2349 2344 : bRet = (rVal >>= nTmp);
2350 2344 : if( bRet && (nTmp >= 0) )
2351 2344 : SetLines( (sal_uInt16)nTmp );
2352 : else
2353 0 : bRet = false;
2354 : }
2355 2344 : break;
2356 : case MID_GRID_RUBY_BELOW:
2357 76 : SetRubyTextBelow( *static_cast<sal_Bool const *>(rVal.getValue()) );
2358 76 : break;
2359 : case MID_GRID_PRINT:
2360 2393 : SetPrintGrid( *static_cast<sal_Bool const *>(rVal.getValue()) );
2361 2393 : break;
2362 : case MID_GRID_DISPLAY:
2363 2393 : SetDisplayGrid( *static_cast<sal_Bool const *>(rVal.getValue()) );
2364 2393 : break;
2365 : case MID_GRID_BASEHEIGHT:
2366 : case MID_GRID_BASEWIDTH:
2367 : case MID_GRID_RUBYHEIGHT:
2368 : {
2369 : OSL_ENSURE( (nMemberId & CONVERT_TWIPS) != 0,
2370 : "This value needs TWIPS-MM100 conversion" );
2371 4740 : sal_Int32 nTmp = 0;
2372 4740 : bRet = (rVal >>= nTmp);
2373 4740 : nTmp = convertMm100ToTwip( nTmp );
2374 4740 : if( bRet && (nTmp >= 0) && ( nTmp <= USHRT_MAX) )
2375 : {
2376 : // rhbz#1043551 round up to 5pt -- 0 causes divide-by-zero
2377 : // in layout; 1pt ties the painting code up in knots for
2378 : // minutes with bazillion lines...
2379 : #define MIN_TEXTGRID_SIZE 100
2380 9480 : if( (nMemberId & ~CONVERT_TWIPS) == MID_GRID_BASEHEIGHT )
2381 : {
2382 2344 : nTmp = std::max<sal_Int32>(nTmp, MIN_TEXTGRID_SIZE);
2383 2344 : SetBaseHeight( (sal_uInt16)nTmp );
2384 : }
2385 2396 : else if( (nMemberId & ~CONVERT_TWIPS) == MID_GRID_BASEWIDTH )
2386 : {
2387 52 : nTmp = std::max<sal_Int32>(nTmp, MIN_TEXTGRID_SIZE);
2388 52 : SetBaseWidth( (sal_uInt16)nTmp );
2389 : }
2390 : else
2391 2344 : SetRubyHeight( (sal_uInt16)nTmp );
2392 : }
2393 : else
2394 0 : bRet = false;
2395 : }
2396 4740 : break;
2397 : case MID_GRID_TYPE:
2398 : {
2399 2393 : sal_Int16 nTmp = 0;
2400 2393 : bRet = (rVal >>= nTmp);
2401 2393 : if( bRet )
2402 : {
2403 2393 : switch( nTmp )
2404 : {
2405 : case text::TextGridMode::NONE:
2406 2367 : SetGridType( GRID_NONE );
2407 2367 : break;
2408 : case text::TextGridMode::LINES:
2409 23 : SetGridType( GRID_LINES_ONLY );
2410 23 : break;
2411 : case text::TextGridMode::LINES_AND_CHARS:
2412 3 : SetGridType( GRID_LINES_CHARS );
2413 3 : break;
2414 : default:
2415 0 : bRet = false;
2416 0 : break;
2417 : }
2418 : }
2419 2393 : break;
2420 : }
2421 : case MID_GRID_SNAPTOCHARS:
2422 55 : SetSnapToChars( *static_cast<sal_Bool const *>(rVal.getValue()) );
2423 55 : break;
2424 : case MID_GRID_STANDARD_MODE:
2425 : {
2426 2311 : bool bStandard = *static_cast<sal_Bool const *>(rVal.getValue());
2427 2311 : SetSquaredMode( !bStandard );
2428 2311 : break;
2429 : }
2430 : default:
2431 : OSL_FAIL("Unknown SwTextGridItem member");
2432 0 : bRet = false;
2433 : }
2434 :
2435 16781 : return bRet;
2436 : }
2437 :
2438 2268 : void SwTextGridItem::SwitchPaperMode(bool bNew)
2439 : {
2440 2268 : if (bNew == m_bSquaredMode)
2441 : {
2442 : //same paper mode, not switch
2443 2254 : return;
2444 : }
2445 :
2446 : // use default value when grid is disable
2447 14 : if (m_eGridType == GRID_NONE)
2448 : {
2449 14 : m_bSquaredMode = bNew;
2450 14 : Init();
2451 14 : return;
2452 : }
2453 :
2454 0 : if (m_bSquaredMode)
2455 : {
2456 : //switch from "squared mode" to "standard mode"
2457 0 : m_nBaseWidth = m_nBaseHeight;
2458 0 : m_nBaseHeight = m_nBaseHeight + m_nRubyHeight;
2459 0 : m_nRubyHeight = 0;
2460 : }
2461 : else
2462 : {
2463 : //switch from "standard mode" to "squared mode"
2464 0 : m_nRubyHeight = m_nBaseHeight/3;
2465 0 : m_nBaseHeight = m_nBaseHeight - m_nRubyHeight;
2466 0 : m_nBaseWidth = m_nBaseHeight;
2467 : }
2468 0 : m_bSquaredMode = !m_bSquaredMode;
2469 : }
2470 :
2471 2055 : void SwTextGridItem::Init()
2472 : {
2473 2055 : if (m_bSquaredMode)
2474 : {
2475 0 : m_nLines = 20;
2476 0 : m_nBaseHeight = 400;
2477 0 : m_nRubyHeight = 200;
2478 0 : m_eGridType = GRID_NONE;
2479 0 : m_bRubyTextBelow = false;
2480 0 : m_bPrintGrid = true;
2481 0 : m_bDisplayGrid = true;
2482 0 : m_bSnapToChars = true;
2483 0 : m_nBaseWidth = 400;
2484 : }
2485 : else
2486 : {
2487 2055 : m_nLines = 44;
2488 2055 : m_nBaseHeight = 312;
2489 2055 : m_nRubyHeight = 0;
2490 2055 : m_eGridType = GRID_NONE;
2491 2055 : m_bRubyTextBelow = false;
2492 2055 : m_bPrintGrid = true;
2493 2055 : m_bDisplayGrid = true;
2494 2055 : m_nBaseWidth = 210;
2495 2055 : m_bSnapToChars = true;
2496 : }
2497 2055 : }
2498 :
2499 1415 : SfxPoolItem* SwHeaderAndFooterEatSpacingItem::Clone( SfxItemPool* ) const
2500 : {
2501 1415 : return new SwHeaderAndFooterEatSpacingItem( Which(), GetValue() );
2502 : }
2503 :
2504 : // Partially implemented inline in hxx
2505 180536 : TYPEINIT1( SwFrameFormat, SwFormat );
2506 39875 : IMPL_FIXEDMEMPOOL_NEWDEL_DLL( SwFrameFormat )
2507 :
2508 14738 : SwFrameFormat::SwFrameFormat(
2509 : SwAttrPool& rPool,
2510 : const sal_Char* pFormatNm,
2511 : SwFrameFormat *pDrvdFrm,
2512 : sal_uInt16 nFormatWhich,
2513 : const sal_uInt16* pWhichRange)
2514 : : SwFormat(rPool, pFormatNm, (pWhichRange ? pWhichRange : aFrameFormatSetRange), pDrvdFrm, nFormatWhich),
2515 : m_wXObject(),
2516 14738 : maFillAttributes()
2517 : {
2518 14738 : }
2519 :
2520 303625 : SwFrameFormat::SwFrameFormat(
2521 : SwAttrPool& rPool,
2522 : const OUString &rFormatNm,
2523 : SwFrameFormat *pDrvdFrm,
2524 : sal_uInt16 nFormatWhich,
2525 : const sal_uInt16* pWhichRange)
2526 : : SwFormat(rPool, rFormatNm, (pWhichRange ? pWhichRange : aFrameFormatSetRange), pDrvdFrm, nFormatWhich),
2527 : m_wXObject(),
2528 303625 : maFillAttributes()
2529 : {
2530 303625 : }
2531 :
2532 718379 : SwFrameFormat::~SwFrameFormat()
2533 : {
2534 349415 : if( !GetDoc()->IsInDtor())
2535 : {
2536 41739 : const SwFormatAnchor& rAnchor = GetAnchor();
2537 41739 : if (rAnchor.GetContentAnchor() != nullptr)
2538 : {
2539 838 : rAnchor.GetContentAnchor()->nNode.GetNode().RemoveAnchoredFly(this);
2540 : }
2541 : }
2542 368964 : }
2543 :
2544 377455 : bool SwFrameFormat::supportsFullDrawingLayerFillAttributeSet() const
2545 : {
2546 377455 : return true;
2547 : }
2548 :
2549 1551191 : void SwFrameFormat::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
2550 : {
2551 1551191 : SwFormatHeader const *pH = 0;
2552 1551191 : SwFormatFooter const *pF = 0;
2553 :
2554 1551191 : const sal_uInt16 nWhich = pNew ? pNew->Which() : 0;
2555 :
2556 1551191 : if( RES_ATTRSET_CHG == nWhich )
2557 : {
2558 1525248 : static_cast<const SwAttrSetChg*>(pNew)->GetChgSet()->GetItemState(
2559 1525248 : RES_HEADER, false, reinterpret_cast<const SfxPoolItem**>(&pH) );
2560 1525248 : static_cast<const SwAttrSetChg*>(pNew)->GetChgSet()->GetItemState(
2561 1525248 : RES_FOOTER, false, reinterpret_cast<const SfxPoolItem**>(&pF) );
2562 :
2563 : //UUUU reset fill information
2564 1525248 : if (maFillAttributes.get() && supportsFullDrawingLayerFillAttributeSet())
2565 : {
2566 609 : SfxItemIter aIter(*static_cast<const SwAttrSetChg*>(pNew)->GetChgSet());
2567 609 : bool bReset(false);
2568 :
2569 1481 : for(const SfxPoolItem* pItem = aIter.FirstItem(); pItem && !bReset; pItem = aIter.NextItem())
2570 : {
2571 872 : bReset = !IsInvalidItem(pItem) && pItem->Which() >= XATTR_FILL_FIRST && pItem->Which() <= XATTR_FILL_LAST;
2572 : }
2573 :
2574 609 : if(bReset)
2575 : {
2576 4 : maFillAttributes.reset();
2577 609 : }
2578 : }
2579 : }
2580 25943 : else if(RES_FMT_CHG == nWhich)
2581 : {
2582 : //UUUU reset fill information on format change (e.g. style changed)
2583 22962 : if (maFillAttributes.get() && supportsFullDrawingLayerFillAttributeSet())
2584 : {
2585 37 : maFillAttributes.reset();
2586 : }
2587 : }
2588 2981 : else if( RES_HEADER == nWhich )
2589 0 : pH = static_cast<const SwFormatHeader*>(pNew);
2590 2981 : else if( RES_FOOTER == nWhich )
2591 0 : pF = static_cast<const SwFormatFooter*>(pNew);
2592 :
2593 1551191 : if( pH && pH->IsActive() && !pH->GetHeaderFormat() )
2594 : { //If he doesn't have one, I'll add one
2595 709 : SwFrameFormat *pFormat = GetDoc()->getIDocumentLayoutAccess().MakeLayoutFormat( RND_STD_HEADER, 0 );
2596 709 : const_cast<SwFormatHeader *>(pH)->RegisterToFormat( *pFormat );
2597 : }
2598 :
2599 1551191 : if( pF && pF->IsActive() && !pF->GetFooterFormat() )
2600 : { //If he doesn't have one, I'll add one
2601 708 : SwFrameFormat *pFormat = GetDoc()->getIDocumentLayoutAccess().MakeLayoutFormat( RND_STD_FOOTER, 0 );
2602 708 : const_cast<SwFormatFooter *>(pF)->RegisterToFormat( *pFormat );
2603 : }
2604 :
2605 1551191 : SwFormat::Modify( pOld, pNew );
2606 :
2607 1551191 : if (pOld && (RES_REMOVE_UNO_OBJECT == pOld->Which()))
2608 : { // invalidate cached uno object
2609 1122 : SetXObject(uno::Reference<uno::XInterface>(0));
2610 : }
2611 :
2612 1551191 : const SwPosition* oldAnchorPosition = NULL;
2613 1551191 : const SwPosition* newAnchorPosition = NULL;
2614 1551191 : if( pNew && pNew->Which() == RES_ATTRSET_CHG )
2615 : {
2616 1525248 : const SfxPoolItem* tmp = NULL;
2617 1525248 : static_cast< const SwAttrSetChg* >(pNew)->GetChgSet()->GetItemState( RES_ANCHOR, false, &tmp );
2618 1525248 : if( tmp )
2619 13399 : newAnchorPosition = static_cast< const SwFormatAnchor* >( tmp )->GetContentAnchor();
2620 : }
2621 1551191 : if( pNew && pNew->Which() == RES_ANCHOR )
2622 0 : newAnchorPosition = static_cast< const SwFormatAnchor* >( pNew )->GetContentAnchor();
2623 1551191 : if( pOld && pOld->Which() == RES_ATTRSET_CHG )
2624 : {
2625 1525248 : const SfxPoolItem* tmp = NULL;
2626 1525248 : static_cast< const SwAttrSetChg* >(pOld)->GetChgSet()->GetItemState( RES_ANCHOR, false, &tmp );
2627 1525248 : if( tmp )
2628 13399 : oldAnchorPosition = static_cast< const SwFormatAnchor* >( tmp )->GetContentAnchor();
2629 : }
2630 1551191 : if( pOld && pOld->Which() == RES_ANCHOR )
2631 0 : oldAnchorPosition = static_cast< const SwFormatAnchor* >( pOld )->GetContentAnchor();
2632 1551191 : if( oldAnchorPosition != NULL && ( newAnchorPosition == NULL || oldAnchorPosition->nNode.GetIndex() != newAnchorPosition->nNode.GetIndex()))
2633 : {
2634 1703 : oldAnchorPosition->nNode.GetNode().RemoveAnchoredFly(this);
2635 : }
2636 1551191 : if( newAnchorPosition != NULL && ( oldAnchorPosition == NULL || oldAnchorPosition->nNode.GetIndex() != newAnchorPosition->nNode.GetIndex()))
2637 : {
2638 5925 : newAnchorPosition->nNode.GetNode().AddAnchoredFly(this);
2639 : }
2640 1551191 : }
2641 :
2642 46 : void SwFrameFormat::RegisterToFormat( SwFormat& rFormat )
2643 : {
2644 46 : rFormat.Add( this );
2645 46 : }
2646 :
2647 : /// Delete all Frms that are registered in aDepend.
2648 2262 : void SwFrameFormat::DelFrms()
2649 : {
2650 2262 : SwIterator<SwFrm,SwFormat> aIter( *this );
2651 2262 : SwFrm * pLast = aIter.First();
2652 2262 : if( pLast )
2653 11 : do {
2654 11 : pLast->Cut();
2655 11 : SwFrm::DestroyFrm(pLast);
2656 2262 : } while( 0 != ( pLast = aIter.Next() ));
2657 2262 : }
2658 :
2659 0 : void SwFrameFormat::MakeFrms()
2660 : {
2661 : OSL_ENSURE( false, "Sorry not implemented." );
2662 0 : }
2663 :
2664 2439 : SwRect SwFrameFormat::FindLayoutRect( const bool bPrtArea, const Point* pPoint,
2665 : const bool bCalcFrm ) const
2666 : {
2667 2439 : SwRect aRet;
2668 2439 : SwFrm *pFrm = 0;
2669 2439 : if( ISA( SwSectionFormat ) )
2670 : {
2671 : // get the Frame using Node2Layout
2672 0 : const SwSectionNode* pSectNd = static_cast<const SwSectionFormat*>(this)->GetSectionNode();
2673 0 : if( pSectNd )
2674 : {
2675 0 : SwNode2Layout aTmp( *pSectNd, pSectNd->GetIndex() - 1 );
2676 0 : pFrm = aTmp.NextFrm();
2677 :
2678 0 : if( pFrm && !pFrm->KnowsFormat(*this) )
2679 : {
2680 : // the Section doesn't have his own Frame, so if someone
2681 : // needs the real size, we have to implement this by requesting
2682 : // the matching Frame from the end.
2683 : // PROBLEM: what happens if SectionFrames overlaps multiple
2684 : // pages?
2685 0 : if( bPrtArea )
2686 0 : aRet = pFrm->Prt();
2687 : else
2688 : {
2689 0 : aRet = pFrm->Frm();
2690 0 : --aRet.Pos().Y();
2691 : }
2692 0 : pFrm = 0; // the rect is finished by now
2693 0 : }
2694 : }
2695 : }
2696 : else
2697 : {
2698 2439 : const sal_uInt16 nFrmType = RES_FLYFRMFMT == Which() ? FRM_FLY : USHRT_MAX;
2699 : pFrm = ::GetFrmOfModify( 0, *const_cast<SwModify*>(static_cast<SwModify const *>(this)), nFrmType, pPoint,
2700 2439 : 0, bCalcFrm );
2701 : }
2702 :
2703 2439 : if( pFrm )
2704 : {
2705 2087 : if( bPrtArea )
2706 204 : aRet = pFrm->Prt();
2707 : else
2708 1883 : aRet = pFrm->Frm();
2709 : }
2710 2439 : return aRet;
2711 : }
2712 :
2713 32638 : SwContact* SwFrameFormat::FindContactObj()
2714 : {
2715 32638 : return SwIterator<SwContact,SwFormat>( *this ).First();
2716 : }
2717 :
2718 23273 : SdrObject* SwFrameFormat::FindSdrObject()
2719 : {
2720 : // #i30669# - use method <FindContactObj()> instead of
2721 : // duplicated code.
2722 23273 : SwContact* pFoundContact = FindContactObj();
2723 23273 : return pFoundContact ? pFoundContact->GetMaster() : 0;
2724 : }
2725 :
2726 11304 : SdrObject* SwFrameFormat::FindRealSdrObject()
2727 : {
2728 11304 : if( RES_FLYFRMFMT == Which() )
2729 : {
2730 1630 : Point aNullPt;
2731 : SwFlyFrm* pFly = static_cast<SwFlyFrm*>(::GetFrmOfModify( 0, *this, FRM_FLY,
2732 1630 : &aNullPt, 0, false ));
2733 1630 : return pFly ? pFly->GetVirtDrawObj() : 0;
2734 : }
2735 9674 : return FindSdrObject();
2736 : }
2737 :
2738 8 : bool SwFrameFormat::IsLowerOf( const SwFrameFormat& rFormat ) const
2739 : {
2740 : //Also linking from inside to outside or from outside to inside is not
2741 : //allowed.
2742 8 : SwFlyFrm *pSFly = SwIterator<SwFlyFrm,SwFormat>(*this).First();
2743 8 : if( pSFly )
2744 : {
2745 0 : SwFlyFrm *pAskFly = SwIterator<SwFlyFrm,SwFormat>(rFormat).First();
2746 0 : if( pAskFly )
2747 0 : return pSFly->IsLowerOf( pAskFly );
2748 : }
2749 :
2750 : // let's try it using the node positions
2751 8 : const SwFormatAnchor* pAnchor = &rFormat.GetAnchor();
2752 8 : if ((FLY_AT_PAGE != pAnchor->GetAnchorId()) && pAnchor->GetContentAnchor())
2753 : {
2754 8 : const SwFrameFormats& rFormats = *GetDoc()->GetSpzFrameFormats();
2755 8 : const SwNode* pFlyNd = pAnchor->GetContentAnchor()->nNode.GetNode().
2756 8 : FindFlyStartNode();
2757 16 : while( pFlyNd )
2758 : {
2759 : // then we walk up using the anchor
2760 : size_t n;
2761 0 : for( n = 0; n < rFormats.size(); ++n )
2762 : {
2763 0 : const SwFrameFormat* pFormat = rFormats[ n ];
2764 0 : const SwNodeIndex* pIdx = pFormat->GetContent().GetContentIdx();
2765 0 : if( pIdx && pFlyNd == &pIdx->GetNode() )
2766 : {
2767 0 : if( pFormat == this )
2768 0 : return true;
2769 :
2770 0 : pAnchor = &pFormat->GetAnchor();
2771 0 : if ((FLY_AT_PAGE == pAnchor->GetAnchorId()) ||
2772 0 : !pAnchor->GetContentAnchor() )
2773 : {
2774 0 : return false;
2775 : }
2776 :
2777 0 : pFlyNd = pAnchor->GetContentAnchor()->nNode.GetNode().
2778 0 : FindFlyStartNode();
2779 0 : break;
2780 : }
2781 : }
2782 0 : if( n >= rFormats.size() )
2783 : {
2784 : OSL_ENSURE( false, "Fly section but no format found" );
2785 0 : return false;
2786 : }
2787 : }
2788 : }
2789 8 : return false;
2790 : }
2791 :
2792 : // #i31698#
2793 0 : SwFrameFormat::tLayoutDir SwFrameFormat::GetLayoutDir() const
2794 : {
2795 0 : return SwFrameFormat::HORI_L2R;
2796 : }
2797 :
2798 2214 : void SwFrameFormat::SetLayoutDir( const SwFrameFormat::tLayoutDir )
2799 : {
2800 : // empty body, because default implementation does nothing
2801 2214 : }
2802 :
2803 : // #i28749#
2804 0 : sal_Int16 SwFrameFormat::GetPositionLayoutDir() const
2805 : {
2806 0 : return text::PositionLayoutDir::PositionInLayoutDirOfAnchor;
2807 : }
2808 0 : void SwFrameFormat::SetPositionLayoutDir( const sal_Int16 )
2809 : {
2810 : // empty body, because default implementation does nothing
2811 0 : }
2812 :
2813 0 : OUString SwFrameFormat::GetDescription() const
2814 : {
2815 0 : return SW_RES(STR_FRAME);
2816 : }
2817 :
2818 0 : void SwFrameFormat::dumpAsXml(xmlTextWriterPtr pWriter) const
2819 : {
2820 0 : xmlTextWriterStartElement(pWriter, BAD_CAST("swFrameFormat"));
2821 0 : xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("ptr"), "%p", this);
2822 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("name"), BAD_CAST(GetName().toUtf8().getStr()));
2823 0 : xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("whichId"), "%d", Which());
2824 :
2825 0 : const char* pWhich = 0;
2826 0 : switch (Which())
2827 : {
2828 : case RES_FLYFRMFMT:
2829 0 : pWhich = "fly frame format";
2830 0 : break;
2831 : case RES_DRAWFRMFMT:
2832 0 : pWhich = "draw frame format";
2833 0 : break;
2834 : }
2835 0 : if (pWhich)
2836 0 : xmlTextWriterWriteAttribute(pWriter, BAD_CAST("which"), BAD_CAST(pWhich));
2837 :
2838 0 : GetAttrSet().dumpAsXml(pWriter);
2839 :
2840 0 : xmlTextWriterEndElement(pWriter);
2841 0 : }
2842 :
2843 0 : void SwFrameFormats::dumpAsXml(xmlTextWriterPtr pWriter, const char* pName) const
2844 : {
2845 0 : xmlTextWriterStartElement(pWriter, BAD_CAST(pName));
2846 0 : for (size_t i = 0; i < size(); ++i)
2847 0 : GetFormat(i)->dumpAsXml(pWriter);
2848 0 : xmlTextWriterEndElement(pWriter);
2849 0 : }
2850 :
2851 : // class SwFlyFrameFormat
2852 : // Partially implemented inline in hxx
2853 :
2854 110733 : TYPEINIT1( SwFlyFrameFormat, SwFrameFormat );
2855 59 : IMPL_FIXEDMEMPOOL_NEWDEL( SwFlyFrameFormat )
2856 :
2857 6867 : SwFlyFrameFormat::~SwFlyFrameFormat()
2858 : {
2859 2289 : SwIterator<SwFlyFrm,SwFormat> aIter( *this );
2860 2289 : SwFlyFrm * pLast = aIter.First();
2861 2289 : if( pLast )
2862 0 : do
2863 : {
2864 0 : SwFrm::DestroyFrm(pLast);
2865 : } while( 0 != ( pLast = aIter.Next() ));
2866 :
2867 4578 : SwIterator<SwFlyDrawContact,SwFormat> a2ndIter( *this );
2868 2289 : SwFlyDrawContact* pC = a2ndIter.First();
2869 2289 : if( pC )
2870 574 : do {
2871 574 : delete pC;
2872 :
2873 2289 : } while( 0 != ( pC = a2ndIter.Next() ));
2874 4578 : }
2875 :
2876 : /// Creates the Frms if the format describes a paragraph-bound frame.
2877 : /// MA: 1994-02-14: creates the Frms also for frames anchored at page.
2878 1474 : void SwFlyFrameFormat::MakeFrms()
2879 : {
2880 : // is there a layout?
2881 1474 : if( !GetDoc()->getIDocumentLayoutAccess().GetCurrentViewShell() )
2882 852 : return;
2883 :
2884 1048 : SwModify *pModify = 0;
2885 : // OD 24.07.2003 #111032# - create local copy of anchor attribute for possible changes.
2886 1048 : SwFormatAnchor aAnchorAttr( GetAnchor() );
2887 1048 : switch( aAnchorAttr.GetAnchorId() )
2888 : {
2889 : case FLY_AS_CHAR:
2890 : case FLY_AT_PARA:
2891 : case FLY_AT_CHAR:
2892 956 : if( aAnchorAttr.GetContentAnchor() )
2893 : {
2894 956 : pModify = aAnchorAttr.GetContentAnchor()->nNode.GetNode().GetContentNode();
2895 : }
2896 956 : break;
2897 :
2898 : case FLY_AT_FLY:
2899 0 : if( aAnchorAttr.GetContentAnchor() )
2900 : {
2901 : //First search in the content because this is O(1)
2902 : //This can go wrong for linked frames because in this case it's
2903 : //possible, that no Frame exists for this content.
2904 : //In such a situation we also need to search from StartNode to
2905 : //FrameFormat.
2906 0 : SwNodeIndex aIdx( aAnchorAttr.GetContentAnchor()->nNode );
2907 0 : SwContentNode *pCNd = GetDoc()->GetNodes().GoNext( &aIdx );
2908 : // #i105535#
2909 0 : if ( pCNd == 0 )
2910 : {
2911 0 : pCNd = aAnchorAttr.GetContentAnchor()->nNode.GetNode().GetContentNode();
2912 : }
2913 0 : if ( pCNd )
2914 : {
2915 0 : if( SwIterator<SwFrm,SwContentNode>( *pCNd ).First() )
2916 : {
2917 0 : pModify = pCNd;
2918 : }
2919 : }
2920 : // #i105535#
2921 0 : if ( pModify == 0 )
2922 : {
2923 0 : const SwNodeIndex &rIdx = aAnchorAttr.GetContentAnchor()->nNode;
2924 0 : SwFrameFormats& rFormats = *GetDoc()->GetSpzFrameFormats();
2925 0 : for( size_t i = 0; i < rFormats.size(); ++i )
2926 : {
2927 0 : SwFrameFormat* pFlyFormat = rFormats[i];
2928 0 : if( pFlyFormat->GetContent().GetContentIdx() &&
2929 0 : rIdx == *pFlyFormat->GetContent().GetContentIdx() )
2930 : {
2931 0 : pModify = pFlyFormat;
2932 0 : break;
2933 : }
2934 : }
2935 0 : }
2936 : }
2937 0 : break;
2938 :
2939 : case FLY_AT_PAGE:
2940 : {
2941 92 : sal_uInt16 nPgNum = aAnchorAttr.GetPageNum();
2942 92 : SwPageFrm *pPage = static_cast<SwPageFrm*>(GetDoc()->getIDocumentLayoutAccess().GetCurrentLayout()->Lower());
2943 92 : if( nPgNum == 0 && aAnchorAttr.GetContentAnchor() )
2944 : {
2945 1 : SwContentNode *pCNd = aAnchorAttr.GetContentAnchor()->nNode.GetNode().GetContentNode();
2946 1 : SwIterator<SwFrm,SwContentNode> aIter( *pCNd );
2947 1 : for ( SwFrm* pFrm = aIter.First(); pFrm != NULL; pFrm = aIter.Next() )
2948 : {
2949 1 : pPage = pFrm->FindPageFrm();
2950 1 : if( pPage )
2951 : {
2952 1 : nPgNum = pPage->GetPhyPageNum();
2953 1 : aAnchorAttr.SetPageNum( nPgNum );
2954 1 : aAnchorAttr.SetAnchor( 0 );
2955 1 : SetFormatAttr( aAnchorAttr );
2956 1 : break;
2957 : }
2958 1 : }
2959 : }
2960 253 : while ( pPage )
2961 : {
2962 92 : if ( pPage->GetPhyPageNum() == nPgNum )
2963 : {
2964 : // #i50432# - adjust synopsis of <PlaceFly(..)>
2965 23 : pPage->PlaceFly( 0, this );
2966 23 : break;
2967 : }
2968 69 : pPage = static_cast<SwPageFrm*>(pPage->GetNext());
2969 : }
2970 : }
2971 92 : break;
2972 : default:
2973 0 : break;
2974 : }
2975 :
2976 1048 : if( pModify )
2977 : {
2978 956 : SwIterator<SwFrm,SwModify> aIter( *pModify );
2979 2037 : for( SwFrm *pFrm = aIter.First(); pFrm; pFrm = aIter.Next() )
2980 : {
2981 2162 : bool bAdd = !pFrm->IsContentFrm() ||
2982 2162 : !static_cast<SwContentFrm*>(pFrm)->IsFollow();
2983 :
2984 1081 : if ( FLY_AT_FLY == aAnchorAttr.GetAnchorId() && !pFrm->IsFlyFrm() )
2985 : {
2986 0 : SwFrm* pFlyFrm = pFrm->FindFlyFrm();
2987 0 : if ( pFlyFrm )
2988 : {
2989 0 : pFrm = pFlyFrm;
2990 : }
2991 : else
2992 : {
2993 0 : aAnchorAttr.SetType( FLY_AT_PARA );
2994 0 : SetFormatAttr( aAnchorAttr );
2995 0 : MakeFrms();
2996 0 : return;
2997 : }
2998 : }
2999 :
3000 1081 : if( pFrm->GetDrawObjs() )
3001 : {
3002 : // #i28701# - new type <SwSortedObjs>
3003 787 : SwSortedObjs &rObjs = *pFrm->GetDrawObjs();
3004 10957 : for( size_t i = 0; i < rObjs.size(); ++i)
3005 : {
3006 : // #i28701# - consider changed type of
3007 : // <SwSortedObjs> entries.
3008 10479 : SwAnchoredObject* pObj = rObjs[i];
3009 14166 : if( pObj->ISA(SwFlyFrm) &&
3010 3687 : (&pObj->GetFrameFormat()) == this )
3011 : {
3012 309 : bAdd = false;
3013 309 : break;
3014 : }
3015 : }
3016 : }
3017 :
3018 1081 : if( bAdd )
3019 : {
3020 : SwFlyFrm *pFly;
3021 772 : switch( aAnchorAttr.GetAnchorId() )
3022 : {
3023 : case FLY_AT_FLY:
3024 0 : pFly = new SwFlyLayFrm( this, pFrm, pFrm );
3025 0 : break;
3026 :
3027 : case FLY_AT_PARA:
3028 : case FLY_AT_CHAR:
3029 711 : pFly = new SwFlyAtCntFrm( this, pFrm, pFrm );
3030 711 : break;
3031 :
3032 : default:
3033 : assert(false && "Neuer Ankertyp" );
3034 : //fall-through
3035 : case FLY_AS_CHAR:
3036 61 : pFly = new SwFlyInCntFrm( this, pFrm, pFrm );
3037 61 : break;
3038 : }
3039 772 : pFrm->AppendFly( pFly );
3040 772 : pFly->GetFormat()->SetObjTitle(GetObjTitle());
3041 772 : pFly->GetFormat()->SetObjDescription(GetObjDescription());
3042 772 : SwPageFrm *pPage = pFly->FindPageFrm();
3043 772 : if( pPage )
3044 772 : ::RegistFlys( pPage, pFly );
3045 : }
3046 956 : }
3047 1048 : }
3048 : }
3049 :
3050 20 : SwFlyFrm* SwFlyFrameFormat::GetFrm( const Point* pPoint, const bool bCalcFrm ) const
3051 : {
3052 : return static_cast<SwFlyFrm*>(::GetFrmOfModify( 0, *const_cast<SwModify*>(static_cast<SwModify const *>(this)), FRM_FLY,
3053 20 : pPoint, 0, bCalcFrm ));
3054 : }
3055 :
3056 0 : SwAnchoredObject* SwFlyFrameFormat::GetAnchoredObj( const Point* pPoint, const bool bCalcFrm ) const
3057 : {
3058 0 : SwFlyFrm* pFlyFrm( GetFrm( pPoint, bCalcFrm ) );
3059 0 : if ( pFlyFrm )
3060 : {
3061 0 : return dynamic_cast<SwAnchoredObject*>(pFlyFrm);
3062 : }
3063 : else
3064 : {
3065 0 : return 0L;
3066 : }
3067 : }
3068 :
3069 73 : bool SwFlyFrameFormat::GetInfo( SfxPoolItem& rInfo ) const
3070 : {
3071 73 : bool bRet = true;
3072 73 : switch( rInfo.Which() )
3073 : {
3074 : case RES_CONTENT_VISIBLE:
3075 : {
3076 0 : static_cast<SwPtrMsgPoolItem&>(rInfo).pObject = SwIterator<SwFrm,SwFormat>( *this ).First();
3077 : }
3078 0 : bRet = false;
3079 0 : break;
3080 :
3081 : default:
3082 73 : bRet = SwFrameFormat::GetInfo( rInfo );
3083 73 : break;
3084 : }
3085 73 : return bRet;
3086 : }
3087 :
3088 : // #i73249#
3089 984 : void SwFlyFrameFormat::SetObjTitle( const OUString& rTitle, bool bBroadcast )
3090 : {
3091 984 : SdrObject* pMasterObject = FindSdrObject();
3092 : OSL_ENSURE( pMasterObject, "<SwFlyFrameFormat::SetObjTitle(..)> - missing <SdrObject> instance" );
3093 984 : msTitle = rTitle;
3094 984 : if ( !pMasterObject )
3095 : {
3096 985 : return;
3097 : }
3098 :
3099 983 : if( bBroadcast )
3100 : {
3101 5 : SwStringMsgPoolItem aOld( RES_TITLE_CHANGED, pMasterObject->GetTitle() );
3102 10 : SwStringMsgPoolItem aNew( RES_TITLE_CHANGED, rTitle );
3103 5 : pMasterObject->SetTitle( rTitle );
3104 10 : ModifyNotification( &aOld, &aNew );
3105 : }
3106 : else
3107 : {
3108 978 : pMasterObject->SetTitle( rTitle );
3109 : }
3110 : }
3111 :
3112 1507 : OUString SwFlyFrameFormat::GetObjTitle() const
3113 : {
3114 1507 : const SdrObject* pMasterObject = FindSdrObject();
3115 : OSL_ENSURE( pMasterObject, "<SwFlyFrameFormat::GetObjTitle(..)> - missing <SdrObject> instance" );
3116 1507 : if ( !pMasterObject )
3117 : {
3118 29 : return msTitle;
3119 : }
3120 1478 : if (!pMasterObject->GetTitle().isEmpty())
3121 1 : return pMasterObject->GetTitle();
3122 : else
3123 1477 : return msTitle;
3124 : }
3125 :
3126 1063 : void SwFlyFrameFormat::SetObjDescription( const OUString& rDescription, bool bBroadcast )
3127 : {
3128 1063 : SdrObject* pMasterObject = FindSdrObject();
3129 : OSL_ENSURE( pMasterObject, "<SwFlyFrameFormat::SetDescription(..)> - missing <SdrObject> instance" );
3130 1063 : msDesc = rDescription;
3131 1063 : if ( !pMasterObject )
3132 : {
3133 1063 : return;
3134 : }
3135 :
3136 1063 : if( bBroadcast )
3137 : {
3138 85 : SwStringMsgPoolItem aOld( RES_DESCRIPTION_CHANGED, pMasterObject->GetDescription() );
3139 170 : SwStringMsgPoolItem aNew( RES_DESCRIPTION_CHANGED, rDescription );
3140 85 : pMasterObject->SetDescription( rDescription );
3141 170 : ModifyNotification( &aOld, &aNew );
3142 : }
3143 : else
3144 : {
3145 978 : pMasterObject->SetDescription( rDescription );
3146 : }
3147 : }
3148 :
3149 1481 : OUString SwFlyFrameFormat::GetObjDescription() const
3150 : {
3151 1481 : const SdrObject* pMasterObject = FindSdrObject();
3152 : OSL_ENSURE( pMasterObject, "<SwFlyFrameFormat::GetDescription(..)> - missing <SdrObject> instance" );
3153 1481 : if ( !pMasterObject )
3154 : {
3155 0 : return msDesc;
3156 : }
3157 1481 : if (!pMasterObject->GetDescription().isEmpty())
3158 131 : return pMasterObject->GetDescription();
3159 : else
3160 1350 : return msDesc;
3161 : }
3162 :
3163 : /** SwFlyFrameFormat::IsBackgroundTransparent - for #99657#
3164 :
3165 : OD 22.08.2002 - overriding virtual method and its default implementation,
3166 : because format of fly frame provides transparent backgrounds.
3167 : Method determines, if background of fly frame is transparent.
3168 :
3169 : @return true, if background color is transparent, but not "no fill"
3170 : or the transparency of a existing background graphic is set.
3171 : */
3172 5841 : bool SwFlyFrameFormat::IsBackgroundTransparent() const
3173 : {
3174 : //UUUU
3175 5841 : if (supportsFullDrawingLayerFillAttributeSet() && getSdrAllFillAttributesHelper())
3176 : {
3177 5841 : return getSdrAllFillAttributesHelper()->isTransparent();
3178 : }
3179 :
3180 : // NOTE: If background color is "no fill"/"auto fill" (COL_TRANSPARENT)
3181 : // and there is no background graphic, it "inherites" the background
3182 : // from its anchor.
3183 0 : SvxBrushItem aBackground(makeBackgroundBrushItem());
3184 0 : if ( (aBackground.GetColor().GetTransparency() != 0) &&
3185 0 : (aBackground.GetColor() != COL_TRANSPARENT)
3186 : )
3187 : {
3188 0 : return true;
3189 : }
3190 : else
3191 : {
3192 : const GraphicObject *pTmpGrf =
3193 0 : static_cast<const GraphicObject*>(aBackground.GetGraphicObject());
3194 0 : if ( (pTmpGrf) &&
3195 0 : (pTmpGrf->GetAttr().GetTransparency() != 0)
3196 : )
3197 : {
3198 0 : return true;
3199 : }
3200 : }
3201 :
3202 0 : return false;
3203 : }
3204 :
3205 : /** SwFlyFrameFormat::IsBackgroundBrushInherited - for #103898#
3206 :
3207 : OD 08.10.2002 - method to determine, if the brush for drawing the
3208 : background is "inherited" from its parent/grandparent.
3209 : This is the case, if no background graphic is set and the background
3210 : color is "no fill"/"auto fill"
3211 : NOTE: condition is "copied" from method <SwFrm::GetBackgroundBrush(..).
3212 :
3213 : @return true, if background brush is "inherited" from parent/grandparent
3214 : */
3215 2008 : bool SwFlyFrameFormat::IsBackgroundBrushInherited() const
3216 : {
3217 : //UUUU
3218 2008 : if (supportsFullDrawingLayerFillAttributeSet() && getSdrAllFillAttributesHelper())
3219 : {
3220 2008 : return !getSdrAllFillAttributesHelper()->isUsed();
3221 : }
3222 : else
3223 : {
3224 0 : SvxBrushItem aBackground(makeBackgroundBrushItem());
3225 0 : if ( (aBackground.GetColor() == COL_TRANSPARENT) &&
3226 0 : !(aBackground.GetGraphicObject()) )
3227 : {
3228 0 : return true;
3229 0 : }
3230 : }
3231 :
3232 0 : return false;
3233 : }
3234 :
3235 : // #125892#
3236 0 : SwHandleAnchorNodeChg::SwHandleAnchorNodeChg( SwFlyFrameFormat& _rFlyFrameFormat,
3237 : const SwFormatAnchor& _rNewAnchorFormat,
3238 : SwFlyFrm* _pKeepThisFlyFrm )
3239 : : mrFlyFrameFormat( _rFlyFrameFormat ),
3240 0 : mbAnchorNodeChanged( false )
3241 : {
3242 0 : const RndStdIds nNewAnchorType( _rNewAnchorFormat.GetAnchorId() );
3243 0 : if ( ((nNewAnchorType == FLY_AT_PARA) ||
3244 0 : (nNewAnchorType == FLY_AT_CHAR)) &&
3245 0 : _rNewAnchorFormat.GetContentAnchor() &&
3246 0 : _rNewAnchorFormat.GetContentAnchor()->nNode.GetNode().GetContentNode() )
3247 : {
3248 0 : const SwFormatAnchor& aOldAnchorFormat( _rFlyFrameFormat.GetAnchor() );
3249 0 : if ( aOldAnchorFormat.GetAnchorId() == nNewAnchorType &&
3250 0 : aOldAnchorFormat.GetContentAnchor() &&
3251 0 : aOldAnchorFormat.GetContentAnchor()->nNode.GetNode().GetContentNode() &&
3252 0 : aOldAnchorFormat.GetContentAnchor()->nNode !=
3253 0 : _rNewAnchorFormat.GetContentAnchor()->nNode )
3254 : {
3255 : // determine 'old' number of anchor frames
3256 0 : sal_uInt32 nOldNumOfAnchFrm( 0L );
3257 0 : SwIterator<SwFrm,SwContentNode> aOldIter( *(aOldAnchorFormat.GetContentAnchor()->nNode.GetNode().GetContentNode()) );
3258 0 : for( SwFrm* pOld = aOldIter.First(); pOld; pOld = aOldIter.Next() )
3259 : {
3260 0 : ++nOldNumOfAnchFrm;
3261 : }
3262 : // determine 'new' number of anchor frames
3263 0 : sal_uInt32 nNewNumOfAnchFrm( 0L );
3264 0 : SwIterator<SwFrm,SwContentNode> aNewIter( *(_rNewAnchorFormat.GetContentAnchor()->nNode.GetNode().GetContentNode()) );
3265 0 : for( SwFrm* pNew = aNewIter.First(); pNew; pNew = aNewIter.Next() )
3266 : {
3267 0 : ++nNewNumOfAnchFrm;
3268 : }
3269 0 : if ( nOldNumOfAnchFrm != nNewNumOfAnchFrm )
3270 : {
3271 : // delete existing fly frames except <_pKeepThisFlyFrm>
3272 0 : SwIterator<SwFrm,SwFormat> aIter( mrFlyFrameFormat );
3273 0 : SwFrm* pFrm = aIter.First();
3274 0 : if ( pFrm )
3275 : {
3276 0 : do {
3277 0 : if ( pFrm != _pKeepThisFlyFrm )
3278 : {
3279 0 : pFrm->Cut();
3280 0 : SwFrm::DestroyFrm(pFrm);
3281 : }
3282 : } while( 0 != ( pFrm = aIter.Next() ));
3283 : }
3284 : // indicate, that re-creation of fly frames necessary
3285 0 : mbAnchorNodeChanged = true;
3286 0 : }
3287 : }
3288 : }
3289 0 : }
3290 :
3291 0 : SwHandleAnchorNodeChg::~SwHandleAnchorNodeChg()
3292 : {
3293 0 : if ( mbAnchorNodeChanged )
3294 : {
3295 0 : mrFlyFrameFormat.MakeFrms();
3296 : }
3297 0 : }
3298 :
3299 : // class SwDrawFrameFormat
3300 : // Partially implemented inline in hxx
3301 :
3302 10298 : TYPEINIT1( SwDrawFrameFormat, SwFrameFormat );
3303 59 : IMPL_FIXEDMEMPOOL_NEWDEL( SwDrawFrameFormat )
3304 :
3305 7329 : SwDrawFrameFormat::~SwDrawFrameFormat()
3306 : {
3307 2443 : SwContact *pContact = FindContactObj();
3308 2443 : delete pContact;
3309 4886 : }
3310 :
3311 1260 : void SwDrawFrameFormat::MakeFrms()
3312 : {
3313 1260 : SwDrawContact *pContact = static_cast<SwDrawContact*>(FindContactObj());
3314 1260 : if ( pContact )
3315 1260 : pContact->ConnectToLayout();
3316 1260 : }
3317 :
3318 4082 : void SwDrawFrameFormat::DelFrms()
3319 : {
3320 4082 : SwDrawContact *pContact = static_cast<SwDrawContact *>(FindContactObj());
3321 4082 : if ( pContact ) //for the reader and other unpredictable things.
3322 4082 : pContact->DisconnectFromLayout();
3323 4082 : }
3324 :
3325 : // #i31698#
3326 4435 : SwFrameFormat::tLayoutDir SwDrawFrameFormat::GetLayoutDir() const
3327 : {
3328 4435 : return meLayoutDir;
3329 : }
3330 :
3331 2180 : void SwDrawFrameFormat::SetLayoutDir( const SwFrameFormat::tLayoutDir _eLayoutDir )
3332 : {
3333 2180 : meLayoutDir = _eLayoutDir;
3334 2180 : }
3335 :
3336 : // #i28749#
3337 1036 : sal_Int16 SwDrawFrameFormat::GetPositionLayoutDir() const
3338 : {
3339 1036 : return mnPositionLayoutDir;
3340 : }
3341 1039 : void SwDrawFrameFormat::SetPositionLayoutDir( const sal_Int16 _nPositionLayoutDir )
3342 : {
3343 1039 : switch ( _nPositionLayoutDir )
3344 : {
3345 : case text::PositionLayoutDir::PositionInHoriL2R:
3346 : case text::PositionLayoutDir::PositionInLayoutDirOfAnchor:
3347 : {
3348 1039 : mnPositionLayoutDir = _nPositionLayoutDir;
3349 : }
3350 1039 : break;
3351 : default:
3352 : {
3353 : OSL_FAIL( "<SwDrawFrameFormat::SetPositionLayoutDir(..)> - invalid attribute value." );
3354 : }
3355 : }
3356 1039 : }
3357 :
3358 0 : OUString SwDrawFrameFormat::GetDescription() const
3359 : {
3360 0 : OUString aResult;
3361 0 : const SdrObject * pSdrObj = FindSdrObject();
3362 :
3363 0 : if (pSdrObj)
3364 : {
3365 0 : if (pSdrObj != pSdrObjCached)
3366 : {
3367 0 : SdrObject * pSdrObjCopy = pSdrObj->Clone();
3368 0 : SdrUndoNewObj * pSdrUndo = new SdrUndoNewObj(*pSdrObjCopy);
3369 0 : sSdrObjCachedComment = pSdrUndo->GetComment();
3370 :
3371 0 : delete pSdrUndo;
3372 :
3373 0 : pSdrObjCached = pSdrObj;
3374 : }
3375 :
3376 0 : aResult = sSdrObjCachedComment;
3377 : }
3378 : else
3379 0 : aResult = SW_RESSTR(STR_GRAPHIC);
3380 :
3381 0 : return aResult;
3382 : }
3383 :
3384 0 : IMapObject* SwFrameFormat::GetIMapObject( const Point& rPoint,
3385 : const SwFlyFrm *pFly ) const
3386 : {
3387 0 : const SwFormatURL &rURL = GetURL();
3388 0 : if( !rURL.GetMap() )
3389 0 : return 0;
3390 :
3391 0 : if( !pFly )
3392 : {
3393 0 : pFly = SwIterator<SwFlyFrm,SwFormat>( *this ).First();
3394 0 : if( !pFly )
3395 0 : return 0;
3396 : }
3397 :
3398 : //Original size for OLE and graphic is TwipSize, otherwise the size of
3399 : //FrameFormat of the Fly.
3400 : const SwFrm *pRef;
3401 0 : const SwNoTextNode *pNd = 0;
3402 0 : Size aOrigSz;
3403 0 : if( pFly->Lower() && pFly->Lower()->IsNoTextFrm() )
3404 : {
3405 0 : pRef = pFly->Lower();
3406 0 : pNd = static_cast<const SwContentFrm*>(pRef)->GetNode()->GetNoTextNode();
3407 0 : aOrigSz = pNd->GetTwipSize();
3408 : }
3409 : else
3410 : {
3411 0 : pRef = pFly;
3412 0 : aOrigSz = pFly->GetFormat()->GetFrmSize().GetSize();
3413 : }
3414 :
3415 0 : if( aOrigSz.Width() != 0 && aOrigSz.Height() != 0 )
3416 : {
3417 0 : Point aPos( rPoint );
3418 0 : Size aActSz ( pRef == pFly ? pFly->Frm().SSize() : pRef->Prt().SSize() );
3419 0 : const MapMode aSrc ( MAP_TWIP );
3420 0 : const MapMode aDest( MAP_100TH_MM );
3421 0 : aOrigSz = OutputDevice::LogicToLogic( aOrigSz, aSrc, aDest );
3422 0 : aActSz = OutputDevice::LogicToLogic( aActSz, aSrc, aDest );
3423 0 : aPos -= pRef->Frm().Pos();
3424 0 : aPos -= pRef->Prt().Pos();
3425 0 : aPos = OutputDevice::LogicToLogic( aPos, aSrc, aDest );
3426 0 : sal_uInt32 nFlags = 0;
3427 0 : if ( pFly != pRef && pNd->IsGrfNode() )
3428 : {
3429 0 : const sal_uInt16 nMirror = pNd->GetSwAttrSet().
3430 0 : GetMirrorGrf().GetValue();
3431 0 : if ( RES_MIRROR_GRAPH_BOTH == nMirror )
3432 0 : nFlags = IMAP_MIRROR_HORZ | IMAP_MIRROR_VERT;
3433 0 : else if ( RES_MIRROR_GRAPH_VERT == nMirror )
3434 0 : nFlags = IMAP_MIRROR_VERT;
3435 0 : else if ( RES_MIRROR_GRAPH_HOR == nMirror )
3436 0 : nFlags = IMAP_MIRROR_HORZ;
3437 :
3438 : }
3439 0 : return const_cast<ImageMap*>(rURL.GetMap())->GetHitIMapObject( aOrigSz,
3440 0 : aActSz, aPos, nFlags );
3441 : }
3442 :
3443 0 : return 0;
3444 : }
3445 :
3446 : //UUUU
3447 142653 : drawinglayer::attribute::SdrAllFillAttributesHelperPtr SwFrameFormat::getSdrAllFillAttributesHelper() const
3448 : {
3449 142653 : if (supportsFullDrawingLayerFillAttributeSet())
3450 : {
3451 : // create FillAttributes on demand
3452 142653 : if(!maFillAttributes.get())
3453 : {
3454 10797 : const_cast< SwFrameFormat* >(this)->maFillAttributes.reset(new drawinglayer::attribute::SdrAllFillAttributesHelper(GetAttrSet()));
3455 : }
3456 : }
3457 : else
3458 : {
3459 : // FALLBACKBREAKHERE assert wrong usage
3460 : OSL_ENSURE(false, "getSdrAllFillAttributesHelper() call only valid for RES_FLYFRMFMT and RES_FRMFMT (!)");
3461 : }
3462 :
3463 142653 : return maFillAttributes;
3464 : }
3465 :
3466 11 : bool IsFlyFrameFormatInHeader(const SwFrameFormat& rFormat)
3467 : {
3468 11 : const SwFlyFrameFormat* pFlyFrameFormat = dynamic_cast<const SwFlyFrameFormat*>(&rFormat);
3469 11 : if (!pFlyFrameFormat)
3470 1 : return false;
3471 10 : SwFlyFrm* pFlyFrm = pFlyFrameFormat->GetFrm();
3472 10 : if (!pFlyFrm) // fdo#54648: "hidden" drawing object has no layout frame
3473 : {
3474 0 : return false;
3475 : }
3476 10 : SwPageFrm* pPageFrm = pFlyFrm->FindPageFrmOfAnchor();
3477 10 : SwFrm* pHeader = pPageFrm->Lower();
3478 10 : if (pHeader->GetType() == FRM_HEADER)
3479 : {
3480 2 : const SwFrm* pFrm = pFlyFrm->GetAnchorFrm();
3481 9 : while (pFrm)
3482 : {
3483 6 : if (pFrm == pHeader)
3484 1 : return true;
3485 5 : pFrm = pFrm->GetUpper();
3486 : }
3487 : }
3488 9 : return false;
3489 : }
3490 :
3491 : namespace sw {
3492 :
3493 912 : void CheckAnchoredFlyConsistency(SwDoc const& rDoc)
3494 : {
3495 : #if OSL_DEBUG_LEVEL > 0
3496 : SwNodes const& rNodes(rDoc.GetNodes());
3497 : sal_uLong const count(rNodes.Count());
3498 : for (sal_uLong i = 0; i != count; ++i)
3499 : {
3500 : SwNode const*const pNode(rNodes[i]);
3501 : std::vector<SwFrameFormat*> const*const pFlys(pNode->GetAnchoredFlys());
3502 : if (pFlys)
3503 : {
3504 : for (auto it = pFlys->begin(); it != pFlys->end(); ++it)
3505 : {
3506 : SwFormatAnchor const& rAnchor((**it).GetAnchor(false));
3507 : assert(&rAnchor.GetContentAnchor()->nNode.GetNode() == pNode);
3508 : }
3509 : }
3510 : }
3511 : SwFrameFormats const*const pSpzFrameFormats(rDoc.GetSpzFrameFormats());
3512 : if (pSpzFrameFormats)
3513 : {
3514 : for (auto it = pSpzFrameFormats->begin(); it != pSpzFrameFormats->end(); ++it)
3515 : {
3516 : SwFormatAnchor const& rAnchor((**it).GetAnchor(false));
3517 : if (FLY_AT_PAGE == rAnchor.GetAnchorId())
3518 : {
3519 : assert(!rAnchor.GetContentAnchor()
3520 : // for invalid documents that lack text:anchor-page-number
3521 : // it may have an anchor before MakeFrms() is called
3522 : || (!SwIterator<SwFrm, SwFrameFormat>(**it).First()));
3523 : }
3524 : else
3525 : {
3526 : SwNode & rNode(rAnchor.GetContentAnchor()->nNode.GetNode());
3527 : std::vector<SwFrameFormat*> const*const pFlys(rNode.GetAnchoredFlys());
3528 : assert(std::find(pFlys->begin(), pFlys->end(), *it) != pFlys->end());
3529 : switch (rAnchor.GetAnchorId())
3530 : {
3531 : case FLY_AT_FLY:
3532 : assert(rNode.IsStartNode());
3533 : break;
3534 : case FLY_AT_PARA:
3535 : assert(rNode.IsTextNode() || rNode.IsTableNode());
3536 : break;
3537 : case FLY_AS_CHAR:
3538 : case FLY_AT_CHAR:
3539 : assert(rNode.IsTextNode());
3540 : break;
3541 : default:
3542 : assert(false);
3543 : break;
3544 : }
3545 : }
3546 : }
3547 : }
3548 : #else
3549 : (void) rDoc;
3550 : #endif
3551 912 : }
3552 :
3553 177 : } // namespace sw
3554 :
3555 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|