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/drawing/PolyPolygonBezierCoords.hpp>
21 : #include <com/sun/star/drawing/Hatch.hpp>
22 : #include <com/sun/star/drawing/LineStyle.hpp>
23 : #include <com/sun/star/drawing/LineDash.hpp>
24 : #include <com/sun/star/drawing/DashStyle.hpp>
25 : #include <com/sun/star/awt/Point.hpp>
26 : #include <com/sun/star/drawing/PointSequence.hpp>
27 : #include <com/sun/star/drawing/FillStyle.hpp>
28 : #include <com/sun/star/awt/Gradient.hpp>
29 : #include <com/sun/star/uno/Sequence.hxx>
30 : #include <com/sun/star/beans/PropertyValue.hpp>
31 : #include <svl/itempool.hxx>
32 : #include <editeng/memberids.hrc>
33 : #include <tools/stream.hxx>
34 : #include <tools/mapunit.hxx>
35 :
36 : #include "svx/unoapi.hxx"
37 : #include <svl/style.hxx>
38 :
39 : #include <tools/bigint.hxx>
40 : #include <svl/itemset.hxx>
41 : #include <svx/dialogs.hrc>
42 : #include "svx/svdstr.hrc"
43 : #include "svx/xattr.hxx"
44 : #include <svx/xtable.hxx>
45 : #include <svx/dialmgr.hxx>
46 : #include <editeng/itemtype.hxx>
47 : #include <svx/xdef.hxx>
48 : #include <svx/unomid.hxx>
49 : #include <svx/svdmodel.hxx>
50 : #include <basegfx/polygon/b2dpolygon.hxx>
51 : #include <basegfx/point/b2dpoint.hxx>
52 : #include <basegfx/vector/b2dvector.hxx>
53 : #include <basegfx/tools/unotools.hxx>
54 : #include <vcl/gradient.hxx>
55 :
56 : #include <stdio.h>
57 :
58 : using namespace ::rtl;
59 : using namespace ::com::sun::star;
60 :
61 : #define VCLTOSVCOL( rCol ) (sal_uInt16)((((sal_uInt16)(rCol))<<8)|(rCol))
62 :
63 0 : TYPEINIT1_AUTOFACTORY(NameOrIndex, SfxStringItem);
64 :
65 0 : long ScaleMetricValue( long nVal, long nMul, long nDiv )
66 : {
67 0 : BigInt aVal( nVal );
68 :
69 0 : aVal *= nMul;
70 :
71 0 : if ( aVal.IsNeg() != ( nDiv < 0 ) )
72 0 : aVal-=nDiv/2; // for correct rounding
73 : else
74 0 : aVal+=nDiv/2; // for correct rounding
75 :
76 0 : aVal/=nDiv;
77 :
78 0 : return long( aVal );
79 : }
80 :
81 0 : NameOrIndex::NameOrIndex(sal_uInt16 _nWhich, sal_Int32 nIndex) :
82 : SfxStringItem(_nWhich, OUString()),
83 0 : nPalIndex(nIndex)
84 : {
85 0 : }
86 :
87 0 : NameOrIndex::NameOrIndex(sal_uInt16 _nWhich, const OUString& rName) :
88 : SfxStringItem(_nWhich, rName),
89 0 : nPalIndex(-1)
90 : {
91 0 : }
92 :
93 0 : NameOrIndex::NameOrIndex(sal_uInt16 _nWhich, SvStream& rIn) :
94 0 : SfxStringItem(_nWhich, rIn)
95 : {
96 0 : rIn.ReadInt32( nPalIndex );
97 0 : }
98 :
99 0 : NameOrIndex::NameOrIndex(const NameOrIndex& rNameOrIndex) :
100 : SfxStringItem(rNameOrIndex),
101 0 : nPalIndex(rNameOrIndex.nPalIndex)
102 : {
103 0 : }
104 :
105 0 : bool NameOrIndex::operator==(const SfxPoolItem& rItem) const
106 : {
107 0 : return ( SfxStringItem::operator==(rItem) &&
108 0 : ((const NameOrIndex&) rItem).nPalIndex == nPalIndex );
109 : }
110 :
111 0 : SfxPoolItem* NameOrIndex::Clone(SfxItemPool* /*pPool*/) const
112 : {
113 :
114 0 : return new NameOrIndex(*this);
115 : }
116 :
117 0 : SfxPoolItem* NameOrIndex::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
118 : {
119 0 : return new NameOrIndex(Which(), rIn);
120 : }
121 :
122 0 : SvStream& NameOrIndex::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
123 : {
124 0 : SfxStringItem::Store( rOut, nItemVersion );
125 0 : rOut.WriteInt32( nPalIndex );
126 0 : return rOut;
127 : }
128 :
129 : /** this static checks if the given NameOrIndex item has a unique name for its value.
130 : The returned String is a unique name for an item with this value in both given pools.
131 : Argument pPool2 can be null.
132 : If returned string equals NameOrIndex->GetName(), the name was already unique.
133 : */
134 0 : OUString NameOrIndex::CheckNamedItem( const NameOrIndex* pCheckItem, const sal_uInt16 nWhich, const SfxItemPool* pPool1, const SfxItemPool* /*pPool2*/, SvxCompareValueFunc pCompareValueFunc, sal_uInt16 nPrefixResId, const XPropertyListRef &pDefaults )
135 : {
136 0 : bool bForceNew = false;
137 :
138 0 : OUString aUniqueName = SvxUnogetInternalNameForItem(nWhich, pCheckItem->GetName());
139 :
140 : // 2. if we have a name check if there is already an item with the
141 : // same name in the documents pool with a different line end or start
142 :
143 0 : if (!aUniqueName.isEmpty() && pPool1)
144 : {
145 0 : const sal_uInt32 nCount = pPool1->GetItemCount2( nWhich );
146 :
147 : const NameOrIndex *pItem;
148 0 : for( sal_uInt32 nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
149 : {
150 0 : pItem = (NameOrIndex*)pPool1->GetItem2( nWhich, nSurrogate );
151 :
152 0 : if( pItem && ( pItem->GetName() == pCheckItem->GetName() ) )
153 : {
154 : // if there is already an item with the same name and the same
155 : // value its ok to set it
156 0 : if( !pCompareValueFunc( pItem, pCheckItem ) )
157 : {
158 : // same name but different value, we need a new name for this item
159 0 : aUniqueName = "";
160 0 : bForceNew = true;
161 : }
162 0 : break;
163 : }
164 : }
165 : }
166 :
167 : // if we have no name yet, find existing item with same conent or
168 : // create a unique name
169 0 : if (aUniqueName.isEmpty())
170 : {
171 0 : sal_Int32 nUserIndex = 1;
172 0 : const ResId aRes(SVX_RES(nPrefixResId));
173 0 : OUString aUser( aRes.toString() );
174 0 : aUser += " ";
175 :
176 0 : if( pDefaults.get() )
177 : {
178 0 : const int nCount = pDefaults->Count();
179 : int nIndex;
180 0 : for( nIndex = 0; nIndex < nCount; nIndex++ )
181 : {
182 0 : XPropertyEntry* pEntry = pDefaults->Get(nIndex);
183 0 : if( pEntry )
184 : {
185 0 : bool bFound = false;
186 :
187 0 : switch( nWhich )
188 : {
189 : case XATTR_FILLBITMAP:
190 : {
191 0 : const GraphicObject& rGraphicObjectA(((XFillBitmapItem*)pCheckItem)->GetGraphicObject());
192 0 : const GraphicObject& rGraphicObjectB(((XBitmapEntry*)pEntry)->GetGraphicObject());
193 :
194 0 : bFound = (rGraphicObjectA == rGraphicObjectB);
195 0 : break;
196 : }
197 : case XATTR_LINEDASH:
198 0 : bFound = (((XLineDashItem*)pCheckItem)->GetDashValue() == ((XDashEntry*)pEntry) ->GetDash());
199 0 : break;
200 : case XATTR_LINESTART:
201 0 : bFound = (((XLineStartItem*)pCheckItem)->GetLineStartValue() == ((XLineEndEntry*)pEntry)->GetLineEnd());
202 0 : break;
203 : case XATTR_LINEEND:
204 0 : bFound = (((XLineEndItem*)pCheckItem)->GetLineEndValue() == ((XLineEndEntry*)pEntry)->GetLineEnd());
205 0 : break;
206 : case XATTR_FILLGRADIENT:
207 0 : bFound = (((XFillGradientItem*)pCheckItem)->GetGradientValue() == ((XGradientEntry*)pEntry)->GetGradient());
208 0 : break;
209 : case XATTR_FILLHATCH:
210 0 : bFound = (((XFillHatchItem*)pCheckItem)->GetHatchValue() == ((XHatchEntry*)pEntry)->GetHatch());
211 0 : break;
212 : }
213 :
214 0 : if( bFound )
215 : {
216 0 : aUniqueName = pEntry->GetName();
217 0 : break;
218 : }
219 : else
220 : {
221 0 : OUString aEntryName = pEntry->GetName();
222 0 : if(aEntryName.getLength() >= aUser.getLength())
223 : {
224 0 : sal_Int32 nThisIndex = aEntryName.copy( aUser.getLength() ).toInt32();
225 0 : if( nThisIndex >= nUserIndex )
226 0 : nUserIndex = nThisIndex + 1;
227 0 : }
228 : }
229 : }
230 : }
231 : }
232 :
233 0 : if (aUniqueName.isEmpty() && pPool1)
234 : {
235 0 : const sal_uInt32 nCount = pPool1->GetItemCount2( nWhich );
236 : const NameOrIndex *pItem;
237 0 : for( sal_uInt32 nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
238 : {
239 0 : pItem = (NameOrIndex*)pPool1->GetItem2( nWhich, nSurrogate );
240 :
241 0 : if( pItem && !pItem->GetName().isEmpty() )
242 : {
243 0 : if( !bForceNew && pCompareValueFunc( pItem, pCheckItem ) )
244 0 : return pItem->GetName();
245 :
246 0 : if( pItem->GetName().startsWith( aUser ) )
247 : {
248 0 : sal_Int32 nThisIndex = pItem->GetName().copy( aUser.getLength() ).toInt32();
249 0 : if( nThisIndex >= nUserIndex )
250 0 : nUserIndex = nThisIndex + 1;
251 : }
252 : }
253 : }
254 0 : aUniqueName = aUser;
255 0 : aUniqueName += OUString::number( nUserIndex );
256 0 : }
257 : }
258 :
259 0 : return aUniqueName;
260 : }
261 :
262 : // class XColorItem
263 :
264 0 : TYPEINIT1_AUTOFACTORY(XColorItem, NameOrIndex);
265 :
266 0 : XColorItem::XColorItem(sal_uInt16 _nWhich, sal_Int32 nIndex, const Color& rTheColor) :
267 : NameOrIndex(_nWhich, nIndex),
268 0 : aColor(rTheColor)
269 : {
270 0 : }
271 :
272 0 : XColorItem::XColorItem(sal_uInt16 _nWhich, const OUString& rName, const Color& rTheColor) :
273 : NameOrIndex(_nWhich, rName),
274 0 : aColor(rTheColor)
275 : {
276 0 : }
277 :
278 0 : XColorItem::XColorItem(sal_uInt16 _nWhich, const Color& rTheColor)
279 : : NameOrIndex(_nWhich, OUString())
280 0 : , aColor(rTheColor)
281 : {
282 0 : }
283 :
284 0 : XColorItem::XColorItem(const XColorItem& rItem) :
285 : NameOrIndex(rItem),
286 0 : aColor(rItem.aColor)
287 : {
288 0 : }
289 :
290 0 : XColorItem::XColorItem(sal_uInt16 _nWhich, SvStream& rIn) :
291 0 : NameOrIndex(_nWhich, rIn)
292 : {
293 0 : if (!IsIndex())
294 : {
295 0 : ReadColor( rIn, aColor );
296 : }
297 0 : }
298 :
299 0 : SfxPoolItem* XColorItem::Clone(SfxItemPool* /*pPool*/) const
300 : {
301 0 : return new XColorItem(*this);
302 : }
303 :
304 0 : bool XColorItem::operator==(const SfxPoolItem& rItem) const
305 : {
306 0 : return ( NameOrIndex::operator==(rItem) &&
307 0 : ((const XColorItem&) rItem).aColor == aColor );
308 : }
309 :
310 0 : SfxPoolItem* XColorItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
311 : {
312 0 : return new XColorItem(Which(), rIn);
313 : }
314 :
315 0 : SvStream& XColorItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
316 : {
317 0 : NameOrIndex::Store( rOut, nItemVersion );
318 :
319 0 : if ( !IsIndex() )
320 : {
321 0 : WriteColor( rOut, aColor );
322 : }
323 :
324 0 : return rOut;
325 : }
326 :
327 0 : const Color& XColorItem::GetColorValue(const XColorList* pTable) const
328 : {
329 0 : if (!IsIndex())
330 0 : return aColor;
331 : else
332 0 : return pTable->GetColor(GetIndex())->GetColor();
333 :
334 : }
335 :
336 0 : bool XColorItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
337 : {
338 0 : rVal <<= (sal_Int32)GetColorValue().GetRGBColor();
339 0 : return true;
340 : }
341 :
342 0 : bool XColorItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
343 : {
344 0 : sal_Int32 nValue = 0;
345 0 : rVal >>= nValue;
346 0 : SetColorValue( nValue );
347 :
348 0 : return true;
349 : }
350 :
351 : // --- line attributes ---
352 :
353 : // class XLineStyleItem
354 :
355 0 : TYPEINIT1_AUTOFACTORY(XLineStyleItem, SfxEnumItem);
356 :
357 0 : XLineStyleItem::XLineStyleItem(XLineStyle eTheLineStyle) :
358 0 : SfxEnumItem(XATTR_LINESTYLE, sal::static_int_cast< sal_uInt16 >(eTheLineStyle))
359 : {
360 0 : }
361 :
362 0 : XLineStyleItem::XLineStyleItem(SvStream& rIn) :
363 0 : SfxEnumItem(XATTR_LINESTYLE, rIn)
364 : {
365 0 : }
366 :
367 0 : SfxPoolItem* XLineStyleItem::Clone(SfxItemPool* /*pPool*/) const
368 : {
369 0 : return new XLineStyleItem( *this );
370 : }
371 :
372 0 : SfxPoolItem* XLineStyleItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
373 : {
374 0 : return new XLineStyleItem(rIn);
375 : }
376 :
377 0 : SfxItemPresentation XLineStyleItem::GetPresentation
378 : (
379 : SfxItemPresentation ePres,
380 : SfxMapUnit /*eCoreUnit*/,
381 : SfxMapUnit /*ePresUnit*/,
382 : OUString& rText, const IntlWrapper *
383 : ) const
384 : {
385 0 : rText = OUString();
386 :
387 0 : switch ( ePres )
388 : {
389 : case SFX_ITEM_PRESENTATION_NONE:
390 0 : return ePres;
391 : case SFX_ITEM_PRESENTATION_COMPLETE:
392 : case SFX_ITEM_PRESENTATION_NAMELESS:
393 : {
394 0 : sal_uInt16 nId = 0;
395 :
396 0 : switch( (sal_uInt16)GetValue() )
397 : {
398 : case XLINE_NONE:
399 0 : nId = RID_SVXSTR_INVISIBLE;
400 0 : break;
401 : case XLINE_SOLID:
402 0 : nId = RID_SVXSTR_SOLID;
403 0 : break;
404 : }
405 :
406 0 : if ( nId )
407 0 : rText = SVX_RESSTR( nId );
408 0 : return ePres;
409 : }
410 : default:
411 0 : return SFX_ITEM_PRESENTATION_NONE;
412 : }
413 : }
414 :
415 0 : bool XLineStyleItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
416 : {
417 0 : ::com::sun::star::drawing::LineStyle eLS = (::com::sun::star::drawing::LineStyle)GetValue();
418 0 : rVal <<= eLS;
419 0 : return true;
420 : }
421 :
422 0 : bool XLineStyleItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
423 : {
424 : ::com::sun::star::drawing::LineStyle eLS;
425 0 : if(!(rVal >>= eLS ))
426 : {
427 : // also try an int (for Basic)
428 0 : sal_Int32 nLS = 0;
429 0 : if(!(rVal >>= nLS))
430 0 : return false;
431 0 : eLS = (::com::sun::star::drawing::LineStyle)nLS;
432 : }
433 :
434 0 : SetValue( sal::static_int_cast< sal_uInt16 >( eLS ) );
435 0 : return true;
436 : }
437 :
438 0 : sal_uInt16 XLineStyleItem::GetValueCount() const
439 : {
440 0 : return 3;
441 : }
442 :
443 : // class XDash
444 :
445 0 : XDash::XDash(XDashStyle eTheDash, sal_uInt16 nTheDots, sal_uIntPtr nTheDotLen,
446 : sal_uInt16 nTheDashes, sal_uIntPtr nTheDashLen, sal_uIntPtr nTheDistance) :
447 : eDash(eTheDash),
448 : nDots(nTheDots),
449 : nDotLen(nTheDotLen),
450 : nDashes(nTheDashes),
451 : nDashLen(nTheDashLen),
452 0 : nDistance(nTheDistance)
453 : {
454 0 : }
455 :
456 0 : bool XDash::operator==(const XDash& rDash) const
457 : {
458 0 : return ( eDash == rDash.eDash &&
459 0 : nDots == rDash.nDots &&
460 0 : nDotLen == rDash.nDotLen &&
461 0 : nDashes == rDash.nDashes &&
462 0 : nDashLen == rDash.nDashLen &&
463 0 : nDistance == rDash.nDistance );
464 : }
465 :
466 : // XDash is translated into an array of doubles which describe the lengths of the
467 : // dashes, dots and empty passages. It returns the complete length of the full DashDot
468 : // sequence and fills the given vetor of doubles accordingly (also resizing, so deleting it).
469 : static double SMALLEST_DASH_WIDTH(26.95);
470 :
471 0 : double XDash::CreateDotDashArray(::std::vector< double >& rDotDashArray, double fLineWidth) const
472 : {
473 0 : double fFullDotDashLen(0.0);
474 0 : const sal_uInt16 nNumDotDashArray = (GetDots() + GetDashes()) * 2;
475 0 : rDotDashArray.resize( nNumDotDashArray, 0.0 );
476 : sal_uInt16 a;
477 0 : sal_uInt16 nIns(0);
478 0 : double fDashDotDistance = (double)GetDistance();
479 0 : double fSingleDashLen = (double)GetDashLen();
480 0 : double fSingleDotLen = (double)GetDotLen();
481 :
482 0 : if(GetDashStyle() == XDASH_RECTRELATIVE || GetDashStyle() == XDASH_ROUNDRELATIVE)
483 : {
484 0 : if(fLineWidth != 0.0)
485 : {
486 0 : double fFactor = fLineWidth / 100.0;
487 :
488 0 : if(GetDashes())
489 : {
490 0 : if(GetDashLen())
491 : {
492 : // is a dash
493 0 : fSingleDashLen *= fFactor;
494 : }
495 : else
496 : {
497 : // is a dot
498 0 : fSingleDashLen = fLineWidth;
499 : }
500 : }
501 :
502 0 : if(GetDots())
503 : {
504 0 : if(GetDotLen())
505 : {
506 : // is a dash
507 0 : fSingleDotLen *= fFactor;
508 : }
509 : else
510 : {
511 : // is a dot
512 0 : fSingleDotLen = fLineWidth;
513 : }
514 : }
515 :
516 0 : if(GetDashes() || GetDots())
517 : {
518 0 : if(GetDistance())
519 : {
520 0 : fDashDotDistance *= fFactor;
521 : }
522 : else
523 : {
524 0 : fDashDotDistance = fLineWidth;
525 : }
526 : }
527 : }
528 : else
529 : {
530 0 : if(GetDashes())
531 : {
532 0 : if(GetDashLen())
533 : {
534 : // is a dash
535 0 : fSingleDashLen = (SMALLEST_DASH_WIDTH * fSingleDashLen) / 100.0;
536 : }
537 : else
538 : {
539 : // is a dot
540 0 : fSingleDashLen = SMALLEST_DASH_WIDTH;
541 : }
542 : }
543 :
544 0 : if(GetDots())
545 : {
546 0 : if(GetDotLen())
547 : {
548 : // is a dash
549 0 : fSingleDotLen = (SMALLEST_DASH_WIDTH * fSingleDotLen) / 100.0;
550 : }
551 : else
552 : {
553 : // is a dot
554 0 : fSingleDotLen = SMALLEST_DASH_WIDTH;
555 : }
556 : }
557 :
558 0 : if(GetDashes() || GetDots())
559 : {
560 0 : if(GetDistance())
561 : {
562 : // dash as distance
563 0 : fDashDotDistance = (SMALLEST_DASH_WIDTH * fDashDotDistance) / 100.0;
564 : }
565 : else
566 : {
567 : // dot as distance
568 0 : fDashDotDistance = SMALLEST_DASH_WIDTH;
569 : }
570 : }
571 : }
572 : }
573 : else
574 : {
575 : // smallest dot size compare value
576 0 : double fDotCompVal(fLineWidth != 0.0 ? fLineWidth : SMALLEST_DASH_WIDTH);
577 :
578 : // absolute values
579 0 : if(GetDashes())
580 : {
581 0 : if(GetDashLen())
582 : {
583 : // is a dash
584 0 : if(fSingleDashLen < SMALLEST_DASH_WIDTH)
585 : {
586 0 : fSingleDashLen = SMALLEST_DASH_WIDTH;
587 : }
588 : }
589 : else
590 : {
591 : // is a dot
592 0 : if(fSingleDashLen < fDotCompVal)
593 : {
594 0 : fSingleDashLen = fDotCompVal;
595 : }
596 : }
597 : }
598 :
599 0 : if(GetDots())
600 : {
601 0 : if(GetDotLen())
602 : {
603 : // is a dash
604 0 : if(fSingleDotLen < SMALLEST_DASH_WIDTH)
605 : {
606 0 : fSingleDotLen = SMALLEST_DASH_WIDTH;
607 : }
608 : }
609 : else
610 : {
611 : // is a dot
612 0 : if(fSingleDotLen < fDotCompVal)
613 : {
614 0 : fSingleDotLen = fDotCompVal;
615 : }
616 : }
617 : }
618 :
619 0 : if(GetDashes() || GetDots())
620 : {
621 0 : if(GetDistance())
622 : {
623 : // dash as distance
624 0 : if(fDashDotDistance < SMALLEST_DASH_WIDTH)
625 : {
626 0 : fDashDotDistance = SMALLEST_DASH_WIDTH;
627 : }
628 : }
629 : else
630 : {
631 : // dot as distance
632 0 : if(fDashDotDistance < fDotCompVal)
633 : {
634 0 : fDashDotDistance = fDotCompVal;
635 : }
636 : }
637 : }
638 : }
639 :
640 0 : for(a=0;a<GetDots();a++)
641 : {
642 0 : rDotDashArray[nIns++] = fSingleDotLen;
643 0 : fFullDotDashLen += fSingleDotLen;
644 0 : rDotDashArray[nIns++] = fDashDotDistance;
645 0 : fFullDotDashLen += fDashDotDistance;
646 : }
647 :
648 0 : for(a=0;a<GetDashes();a++)
649 : {
650 0 : rDotDashArray[nIns++] = fSingleDashLen;
651 0 : fFullDotDashLen += fSingleDashLen;
652 0 : rDotDashArray[nIns++] = fDashDotDistance;
653 0 : fFullDotDashLen += fDashDotDistance;
654 : }
655 :
656 0 : return fFullDotDashLen;
657 : }
658 :
659 : // class XLineDashItem
660 :
661 0 : TYPEINIT1_AUTOFACTORY(XLineDashItem, NameOrIndex);
662 :
663 0 : XLineDashItem::XLineDashItem(const OUString& rName, const XDash& rTheDash) :
664 : NameOrIndex(XATTR_LINEDASH, rName),
665 0 : aDash(rTheDash)
666 : {
667 0 : }
668 :
669 0 : XLineDashItem::XLineDashItem(const XLineDashItem& rItem) :
670 : NameOrIndex(rItem),
671 0 : aDash(rItem.aDash)
672 : {
673 0 : }
674 :
675 0 : XLineDashItem::XLineDashItem(SvStream& rIn) :
676 0 : NameOrIndex(XATTR_LINEDASH, rIn)
677 : {
678 0 : if (!IsIndex())
679 : {
680 : sal_uInt16 nSTemp;
681 : sal_uInt32 nLTemp;
682 : sal_Int32 nITemp;
683 :
684 0 : rIn.ReadInt32( nITemp ); aDash.SetDashStyle((XDashStyle)nITemp);
685 0 : rIn.ReadUInt16( nSTemp ); aDash.SetDots(nSTemp);
686 0 : rIn.ReadUInt32( nLTemp ); aDash.SetDotLen(nLTemp);
687 0 : rIn.ReadUInt16( nSTemp ); aDash.SetDashes(nSTemp);
688 0 : rIn.ReadUInt32( nLTemp ); aDash.SetDashLen(nLTemp);
689 0 : rIn.ReadUInt32( nLTemp ); aDash.SetDistance(nLTemp);
690 : }
691 0 : }
692 :
693 0 : XLineDashItem::XLineDashItem(SfxItemPool* /*pPool*/, const XDash& rTheDash)
694 : : NameOrIndex( XATTR_LINEDASH, -1 ),
695 0 : aDash(rTheDash)
696 : {
697 0 : }
698 :
699 0 : SfxPoolItem* XLineDashItem::Clone(SfxItemPool* /*pPool*/) const
700 : {
701 0 : return new XLineDashItem(*this);
702 : }
703 :
704 0 : bool XLineDashItem::operator==(const SfxPoolItem& rItem) const
705 : {
706 0 : return ( NameOrIndex::operator==(rItem) &&
707 0 : aDash == ((const XLineDashItem&) rItem).aDash );
708 : }
709 :
710 0 : SfxPoolItem* XLineDashItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
711 : {
712 0 : return new XLineDashItem(rIn);
713 : }
714 :
715 0 : SvStream& XLineDashItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
716 : {
717 0 : NameOrIndex::Store( rOut, nItemVersion );
718 :
719 0 : if (!IsIndex())
720 : {
721 0 : rOut.WriteInt32( (sal_Int32) aDash.GetDashStyle() );
722 0 : rOut.WriteUInt16( aDash.GetDots() );
723 0 : rOut.WriteUInt32( (sal_uInt32) aDash.GetDotLen() );
724 0 : rOut.WriteUInt16( aDash.GetDashes() );
725 0 : rOut.WriteUInt32( (sal_uInt32) aDash.GetDashLen() );
726 0 : rOut.WriteUInt32( (sal_uInt32) aDash.GetDistance() );
727 : }
728 :
729 0 : return rOut;
730 : }
731 :
732 0 : const XDash& XLineDashItem::GetDashValue() const
733 : {
734 0 : return aDash;
735 : }
736 :
737 0 : SfxItemPresentation XLineDashItem::GetPresentation
738 : (
739 : SfxItemPresentation ePres,
740 : SfxMapUnit /*eCoreUnit*/,
741 : SfxMapUnit /*ePresUnit*/,
742 : OUString& rText, const IntlWrapper *
743 : ) const
744 : {
745 0 : switch ( ePres )
746 : {
747 : case SFX_ITEM_PRESENTATION_NONE:
748 0 : rText = OUString();
749 0 : return ePres;
750 : case SFX_ITEM_PRESENTATION_NAMELESS:
751 : case SFX_ITEM_PRESENTATION_COMPLETE:
752 0 : rText = GetName();
753 0 : return ePres;
754 : default:
755 0 : return SFX_ITEM_PRESENTATION_NONE;
756 : }
757 : }
758 :
759 0 : bool XLineDashItem::HasMetrics() const
760 : {
761 0 : return true;
762 : }
763 :
764 0 : bool XLineDashItem::ScaleMetrics(long nMul, long nDiv)
765 : {
766 0 : aDash.SetDotLen( ScaleMetricValue( aDash.GetDotLen(), nMul, nDiv ) );
767 0 : aDash.SetDashLen( ScaleMetricValue( aDash.GetDashLen(), nMul, nDiv ) );
768 0 : aDash.SetDistance( ScaleMetricValue( aDash.GetDistance(), nMul, nDiv ) );
769 0 : return true;
770 : }
771 :
772 0 : bool XLineDashItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const
773 : {
774 0 : nMemberId &= ~CONVERT_TWIPS;
775 :
776 0 : switch ( nMemberId )
777 : {
778 : case 0:
779 : {
780 0 : uno::Sequence< beans::PropertyValue > aPropSeq( 2 );
781 :
782 0 : ::com::sun::star::drawing::LineDash aLineDash;
783 :
784 0 : const XDash& rXD = GetDashValue();
785 0 : aLineDash.Style = (::com::sun::star::drawing::DashStyle)((sal_uInt16)rXD.GetDashStyle());
786 0 : aLineDash.Dots = rXD.GetDots();
787 0 : aLineDash.DotLen = rXD.GetDotLen();
788 0 : aLineDash.Dashes = rXD.GetDashes();
789 0 : aLineDash.DashLen = rXD.GetDashLen();
790 0 : aLineDash.Distance = rXD.GetDistance();
791 :
792 0 : OUString aApiName = SvxUnogetApiNameForItem(Which(), GetName());
793 0 : aPropSeq[0].Name = "Name";
794 0 : aPropSeq[0].Value = uno::makeAny( aApiName );
795 0 : aPropSeq[1].Name = "LineDash";
796 0 : aPropSeq[1].Value = uno::makeAny( aLineDash );
797 0 : rVal = uno::makeAny( aPropSeq );
798 0 : break;
799 : }
800 :
801 : case MID_NAME:
802 : {
803 0 : OUString aApiName = SvxUnogetApiNameForItem(Which(), GetName());
804 0 : rVal <<= aApiName;
805 0 : break;
806 : }
807 :
808 : case MID_LINEDASH:
809 : {
810 0 : const XDash& rXD = GetDashValue();
811 :
812 0 : ::com::sun::star::drawing::LineDash aLineDash;
813 :
814 0 : aLineDash.Style = (::com::sun::star::drawing::DashStyle)((sal_uInt16)rXD.GetDashStyle());
815 0 : aLineDash.Dots = rXD.GetDots();
816 0 : aLineDash.DotLen = rXD.GetDotLen();
817 0 : aLineDash.Dashes = rXD.GetDashes();
818 0 : aLineDash.DashLen = rXD.GetDashLen();
819 0 : aLineDash.Distance = rXD.GetDistance();
820 :
821 0 : rVal <<= aLineDash;
822 0 : break;
823 : }
824 :
825 : case MID_LINEDASH_STYLE:
826 : {
827 0 : const XDash& rXD = GetDashValue();
828 0 : rVal <<= (::com::sun::star::drawing::DashStyle)((sal_Int16)rXD.GetDashStyle());
829 0 : break;
830 : }
831 :
832 : case MID_LINEDASH_DOTS:
833 : {
834 0 : const XDash& rXD = GetDashValue();
835 0 : rVal <<= rXD.GetDots();
836 0 : break;
837 : }
838 :
839 : case MID_LINEDASH_DOTLEN:
840 : {
841 0 : const XDash& rXD = GetDashValue();
842 0 : rVal <<= rXD.GetDotLen();
843 0 : break;
844 : }
845 :
846 : case MID_LINEDASH_DASHES:
847 : {
848 0 : const XDash& rXD = GetDashValue();
849 0 : rVal <<= rXD.GetDashes();
850 0 : break;
851 : }
852 :
853 : case MID_LINEDASH_DASHLEN:
854 : {
855 0 : const XDash& rXD = GetDashValue();
856 0 : rVal <<= rXD.GetDashLen();
857 0 : break;
858 : }
859 :
860 : case MID_LINEDASH_DISTANCE:
861 : {
862 0 : const XDash& rXD = GetDashValue();
863 0 : rVal <<= rXD.GetDistance();
864 0 : break;
865 : }
866 :
867 0 : default: OSL_FAIL("Wrong MemberId!"); return false;
868 : }
869 :
870 0 : return true;
871 : }
872 :
873 0 : bool XLineDashItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
874 : {
875 0 : nMemberId &= ~CONVERT_TWIPS;
876 :
877 0 : switch ( nMemberId )
878 : {
879 : case 0:
880 : {
881 0 : uno::Sequence< beans::PropertyValue > aPropSeq;
882 0 : ::com::sun::star::drawing::LineDash aLineDash;
883 0 : OUString aName;
884 0 : bool bLineDash( false );
885 :
886 0 : if ( rVal >>= aPropSeq )
887 : {
888 0 : for ( sal_Int32 n = 0; n < aPropSeq.getLength(); n++ )
889 : {
890 0 : if ( aPropSeq[n].Name == "Name" )
891 0 : aPropSeq[n].Value >>= aName;
892 0 : else if ( aPropSeq[n].Name == "LineDash" )
893 : {
894 0 : if ( aPropSeq[n].Value >>= aLineDash )
895 0 : bLineDash = true;
896 : }
897 : }
898 :
899 0 : SetName( aName );
900 0 : if ( bLineDash )
901 : {
902 0 : XDash aXDash;
903 :
904 0 : aXDash.SetDashStyle((XDashStyle)((sal_uInt16)(aLineDash.Style)));
905 0 : aXDash.SetDots(aLineDash.Dots);
906 0 : aXDash.SetDotLen(aLineDash.DotLen);
907 0 : aXDash.SetDashes(aLineDash.Dashes);
908 0 : aXDash.SetDashLen(aLineDash.DashLen);
909 0 : aXDash.SetDistance(aLineDash.Distance);
910 :
911 0 : if((0 == aXDash.GetDots()) && (0 == aXDash.GetDashes()))
912 0 : aXDash.SetDots(1);
913 :
914 0 : SetDashValue( aXDash );
915 : }
916 :
917 0 : return true;
918 : }
919 :
920 0 : return false;
921 : }
922 :
923 : case MID_NAME:
924 : {
925 0 : OUString aName;
926 0 : if (!(rVal >>= aName))
927 0 : return false;
928 0 : SetName( aName );
929 0 : break;
930 : }
931 :
932 : case MID_LINEDASH:
933 : {
934 0 : ::com::sun::star::drawing::LineDash aLineDash;
935 0 : if(!(rVal >>= aLineDash))
936 0 : return false;
937 :
938 0 : XDash aXDash;
939 :
940 0 : aXDash.SetDashStyle((XDashStyle)((sal_uInt16)(aLineDash.Style)));
941 0 : aXDash.SetDots(aLineDash.Dots);
942 0 : aXDash.SetDotLen(aLineDash.DotLen);
943 0 : aXDash.SetDashes(aLineDash.Dashes);
944 0 : aXDash.SetDashLen(aLineDash.DashLen);
945 0 : aXDash.SetDistance(aLineDash.Distance);
946 :
947 0 : if((0 == aXDash.GetDots()) && (0 == aXDash.GetDashes()))
948 0 : aXDash.SetDots(1);
949 :
950 0 : SetDashValue( aXDash );
951 0 : break;
952 : }
953 :
954 : case MID_LINEDASH_STYLE:
955 : {
956 0 : sal_Int16 nVal = sal_Int16();
957 0 : if(!(rVal >>= nVal))
958 0 : return false;
959 :
960 0 : XDash aXDash = GetDashValue();
961 0 : aXDash.SetDashStyle((XDashStyle)((sal_uInt16)(nVal)));
962 :
963 0 : if((0 == aXDash.GetDots()) && (0 == aXDash.GetDashes()))
964 0 : aXDash.SetDots(1);
965 :
966 0 : SetDashValue( aXDash );
967 :
968 0 : break;
969 : }
970 :
971 : case MID_LINEDASH_DOTS:
972 : case MID_LINEDASH_DASHES:
973 : {
974 0 : sal_Int16 nVal = sal_Int16();
975 0 : if(!(rVal >>= nVal))
976 0 : return false;
977 :
978 0 : XDash aXDash = GetDashValue();
979 0 : if ( nMemberId == MID_LINEDASH_DOTS )
980 0 : aXDash.SetDots( nVal );
981 : else
982 0 : aXDash.SetDashes( nVal );
983 :
984 0 : if((0 == aXDash.GetDots()) && (0 == aXDash.GetDashes()))
985 0 : aXDash.SetDots(1);
986 :
987 0 : SetDashValue( aXDash );
988 0 : break;
989 : }
990 :
991 : case MID_LINEDASH_DOTLEN:
992 : case MID_LINEDASH_DASHLEN:
993 : case MID_LINEDASH_DISTANCE:
994 : {
995 0 : sal_Int32 nVal = 0;
996 0 : if(!(rVal >>= nVal))
997 0 : return false;
998 :
999 0 : XDash aXDash = GetDashValue();
1000 0 : if ( nMemberId == MID_LINEDASH_DOTLEN )
1001 0 : aXDash.SetDotLen( nVal );
1002 0 : else if ( nMemberId == MID_LINEDASH_DASHLEN )
1003 0 : aXDash.SetDashLen( nVal );
1004 : else
1005 0 : aXDash.SetDistance( nVal );
1006 :
1007 0 : if((0 == aXDash.GetDots()) && (0 == aXDash.GetDashes()))
1008 0 : aXDash.SetDots(1);
1009 :
1010 0 : SetDashValue( aXDash );
1011 0 : break;
1012 : }
1013 : }
1014 :
1015 0 : return true;
1016 : }
1017 :
1018 0 : bool XLineDashItem::CompareValueFunc( const NameOrIndex* p1, const NameOrIndex* p2 )
1019 : {
1020 0 : return ((XLineDashItem*)p1)->GetDashValue() == ((XLineDashItem*)p2)->GetDashValue();
1021 : }
1022 :
1023 0 : XLineDashItem* XLineDashItem::checkForUniqueItem( SdrModel* pModel ) const
1024 : {
1025 0 : if( pModel )
1026 : {
1027 : const OUString aUniqueName = NameOrIndex::CheckNamedItem(
1028 0 : this, XATTR_LINEDASH, &pModel->GetItemPool(),
1029 0 : pModel->GetStyleSheetPool() ? &pModel->GetStyleSheetPool()->GetPool() : NULL,
1030 : XLineDashItem::CompareValueFunc, RID_SVXSTR_DASH11,
1031 0 : pModel->GetPropertyList( XDASH_LIST ) );
1032 :
1033 : // if the given name is not valid, replace it!
1034 0 : if( aUniqueName != GetName() )
1035 0 : return new XLineDashItem( aUniqueName, aDash );
1036 : }
1037 :
1038 0 : return (XLineDashItem*)this;
1039 : }
1040 :
1041 : // class XLineWidthItem
1042 :
1043 0 : TYPEINIT1_AUTOFACTORY(XLineWidthItem, SfxMetricItem);
1044 :
1045 0 : XLineWidthItem::XLineWidthItem(long nWidth) :
1046 0 : SfxMetricItem(XATTR_LINEWIDTH, nWidth)
1047 : {
1048 0 : }
1049 :
1050 0 : XLineWidthItem::XLineWidthItem(SvStream& rIn) :
1051 0 : SfxMetricItem(XATTR_LINEWIDTH, rIn)
1052 : {
1053 0 : }
1054 :
1055 0 : SfxPoolItem* XLineWidthItem::Clone(SfxItemPool* /*pPool*/) const
1056 : {
1057 0 : return new XLineWidthItem(*this);
1058 : }
1059 :
1060 0 : SfxPoolItem* XLineWidthItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
1061 : {
1062 0 : return new XLineWidthItem(rIn);
1063 : }
1064 :
1065 0 : SfxItemPresentation XLineWidthItem::GetPresentation
1066 : (
1067 : SfxItemPresentation ePres,
1068 : SfxMapUnit eCoreUnit,
1069 : SfxMapUnit ePresUnit,
1070 : OUString& rText, const IntlWrapper * pIntl
1071 : ) const
1072 : {
1073 0 : switch ( ePres )
1074 : {
1075 : case SFX_ITEM_PRESENTATION_NONE:
1076 0 : rText = OUString();
1077 0 : return ePres;
1078 : case SFX_ITEM_PRESENTATION_NAMELESS:
1079 : case SFX_ITEM_PRESENTATION_COMPLETE:
1080 0 : rText = GetMetricText( (long) GetValue(),
1081 0 : eCoreUnit, ePresUnit, pIntl) +
1082 0 : " " + EE_RESSTR( GetMetricId( ePresUnit) );
1083 0 : return ePres;
1084 : default:
1085 0 : return SFX_ITEM_PRESENTATION_NONE;
1086 : }
1087 : }
1088 :
1089 0 : bool XLineWidthItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const
1090 : {
1091 0 : sal_Int32 nValue = GetValue();
1092 0 : if( 0 != (nMemberId&CONVERT_TWIPS) )
1093 0 : nValue = convertTwipToMm100(nValue);
1094 :
1095 0 : rVal <<= nValue;
1096 0 : return true;
1097 : }
1098 :
1099 0 : bool XLineWidthItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
1100 : {
1101 0 : sal_Int32 nValue = 0;
1102 0 : rVal >>= nValue;
1103 0 : if( 0 != (nMemberId&CONVERT_TWIPS) )
1104 0 : nValue = convertMm100ToTwip(nValue);
1105 :
1106 0 : SetValue( nValue );
1107 0 : return true;
1108 : }
1109 :
1110 : // class XLineColorItem
1111 :
1112 0 : TYPEINIT1_AUTOFACTORY(XLineColorItem, XColorItem);
1113 :
1114 0 : XLineColorItem::XLineColorItem(sal_Int32 nIndex, const Color& rTheColor) :
1115 0 : XColorItem(XATTR_LINECOLOR, nIndex, rTheColor)
1116 : {
1117 0 : }
1118 :
1119 0 : XLineColorItem::XLineColorItem(const OUString& rName, const Color& rTheColor) :
1120 0 : XColorItem(XATTR_LINECOLOR, rName, rTheColor)
1121 : {
1122 0 : }
1123 :
1124 0 : XLineColorItem::XLineColorItem(SvStream& rIn) :
1125 0 : XColorItem(XATTR_LINECOLOR, rIn)
1126 : {
1127 0 : }
1128 :
1129 0 : SfxPoolItem* XLineColorItem::Clone(SfxItemPool* /*pPool*/) const
1130 : {
1131 0 : return new XLineColorItem(*this);
1132 : }
1133 :
1134 0 : SfxPoolItem* XLineColorItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
1135 : {
1136 0 : return new XLineColorItem(rIn);
1137 : }
1138 :
1139 0 : SfxItemPresentation XLineColorItem::GetPresentation
1140 : (
1141 : SfxItemPresentation ePres,
1142 : SfxMapUnit /*eCoreUnit*/,
1143 : SfxMapUnit /*ePresUnit*/,
1144 : OUString& rText, const IntlWrapper *
1145 : ) const
1146 : {
1147 0 : switch ( ePres )
1148 : {
1149 : case SFX_ITEM_PRESENTATION_NONE:
1150 0 : rText = OUString();
1151 0 : return ePres;
1152 : case SFX_ITEM_PRESENTATION_NAMELESS:
1153 : case SFX_ITEM_PRESENTATION_COMPLETE:
1154 0 : rText = GetName();
1155 0 : return ePres;
1156 : default:
1157 0 : return SFX_ITEM_PRESENTATION_NONE;
1158 : }
1159 : }
1160 :
1161 0 : bool XLineColorItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
1162 : {
1163 0 : rVal <<= (sal_Int32)GetColorValue().GetRGBColor();
1164 0 : return true;
1165 : }
1166 :
1167 0 : bool XLineColorItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
1168 : {
1169 0 : sal_Int32 nValue = 0;
1170 0 : if(!(rVal >>= nValue))
1171 0 : return false;
1172 :
1173 0 : SetColorValue( nValue );
1174 0 : return true;
1175 : }
1176 :
1177 : // --- tooling for simple spooling B2DPolygon to file and back ---
1178 :
1179 : namespace
1180 : {
1181 0 : void streamOutB2DPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPolygon, SvStream& rOut)
1182 : {
1183 0 : const sal_uInt32 nPolygonCount(rPolyPolygon.count());
1184 0 : rOut.WriteUInt32( nPolygonCount );
1185 :
1186 0 : for(sal_uInt32 a(0L); a < nPolygonCount; a++)
1187 : {
1188 0 : const basegfx::B2DPolygon aCandidate(rPolyPolygon.getB2DPolygon(a));
1189 0 : const sal_uInt32 nPointCount(aCandidate.count());
1190 0 : const sal_uInt8 bClosed(aCandidate.isClosed() ? 1 : 0);
1191 0 : const sal_uInt8 bControlPoints(aCandidate.areControlPointsUsed() ? 1 : 0);
1192 0 : rOut.WriteUInt32( nPointCount );
1193 0 : rOut.WriteUChar( bClosed );
1194 0 : rOut.WriteUChar( bControlPoints );
1195 :
1196 0 : for(sal_uInt32 b(0L); b < nPointCount; b++)
1197 : {
1198 0 : const basegfx::B2DPoint aPoint(aCandidate.getB2DPoint(b));
1199 0 : rOut.WriteDouble( aPoint.getX() );
1200 0 : rOut.WriteDouble( aPoint.getY() );
1201 :
1202 0 : if(bControlPoints)
1203 : {
1204 0 : const sal_uInt8 bEdgeIsCurve(aCandidate.isPrevControlPointUsed(b) || aCandidate.isNextControlPointUsed(b) ? 1 : 0);
1205 0 : rOut.WriteUChar( bEdgeIsCurve );
1206 :
1207 0 : if(bEdgeIsCurve)
1208 : {
1209 0 : const basegfx::B2DVector aControlVectorA(aCandidate.getPrevControlPoint(b));
1210 0 : rOut.WriteDouble( aControlVectorA.getX() );
1211 0 : rOut.WriteDouble( aControlVectorA.getY() );
1212 :
1213 0 : const basegfx::B2DVector aControlVectorB(aCandidate.getNextControlPoint(b));
1214 0 : rOut.WriteDouble( aControlVectorB.getX() );
1215 0 : rOut.WriteDouble( aControlVectorB.getY() );
1216 : }
1217 : }
1218 0 : }
1219 0 : }
1220 0 : }
1221 :
1222 0 : basegfx::B2DPolyPolygon streamInB2DPolyPolygon(SvStream& rIn)
1223 : {
1224 0 : basegfx::B2DPolyPolygon aRetval;
1225 : sal_uInt32 nPolygonCount;
1226 0 : rIn.ReadUInt32( nPolygonCount );
1227 :
1228 0 : for(sal_uInt32 a(0L); a < nPolygonCount; a++)
1229 : {
1230 : sal_uInt32 nPointCount;
1231 : sal_uInt8 bClosed;
1232 : sal_uInt8 bControlPoints;
1233 :
1234 0 : rIn.ReadUInt32( nPointCount );
1235 0 : rIn.ReadUChar( bClosed );
1236 0 : rIn.ReadUChar( bControlPoints );
1237 :
1238 0 : basegfx::B2DPolygon aCandidate;
1239 0 : aCandidate.setClosed(0 != bClosed);
1240 :
1241 0 : for(sal_uInt32 b(0L); b < nPointCount; b++)
1242 : {
1243 : double fX, fY;
1244 0 : rIn.ReadDouble( fX );
1245 0 : rIn.ReadDouble( fY );
1246 0 : aCandidate.append(basegfx::B2DPoint(fX, fY));
1247 :
1248 0 : if(0 != bControlPoints)
1249 : {
1250 : sal_uInt8 bEdgeIsCurve;
1251 0 : rIn.ReadUChar( bEdgeIsCurve );
1252 :
1253 0 : if(0 != bEdgeIsCurve)
1254 : {
1255 0 : rIn.ReadDouble( fX );
1256 0 : rIn.ReadDouble( fY );
1257 0 : aCandidate.setPrevControlPoint(b, basegfx::B2DVector(fX, fY));
1258 :
1259 0 : rIn.ReadDouble( fX );
1260 0 : rIn.ReadDouble( fY );
1261 0 : aCandidate.setNextControlPoint(b, basegfx::B2DVector(fX, fY));
1262 : }
1263 : }
1264 : }
1265 :
1266 0 : aRetval.append(aCandidate);
1267 0 : }
1268 :
1269 0 : return aRetval;
1270 : }
1271 : }
1272 :
1273 : // class XLineStartItem
1274 :
1275 0 : TYPEINIT1_AUTOFACTORY(XLineStartItem, NameOrIndex);
1276 :
1277 0 : XLineStartItem::XLineStartItem(sal_Int32 nIndex)
1278 0 : : NameOrIndex(XATTR_LINESTART, nIndex)
1279 : {
1280 0 : }
1281 :
1282 0 : XLineStartItem::XLineStartItem(const OUString& rName, const basegfx::B2DPolyPolygon& rPolyPolygon)
1283 : : NameOrIndex(XATTR_LINESTART, rName),
1284 0 : maPolyPolygon(rPolyPolygon)
1285 : {
1286 0 : }
1287 :
1288 0 : XLineStartItem::XLineStartItem(const XLineStartItem& rItem)
1289 : : NameOrIndex(rItem),
1290 0 : maPolyPolygon(rItem.maPolyPolygon)
1291 : {
1292 0 : }
1293 :
1294 0 : XLineStartItem::XLineStartItem(SvStream& rIn) :
1295 0 : NameOrIndex(XATTR_LINESTART, rIn)
1296 : {
1297 0 : if (!IsIndex())
1298 : {
1299 0 : maPolyPolygon = streamInB2DPolyPolygon(rIn);
1300 : }
1301 0 : }
1302 :
1303 0 : XLineStartItem::XLineStartItem(SfxItemPool* /*pPool*/, const basegfx::B2DPolyPolygon& rPolyPolygon)
1304 : : NameOrIndex( XATTR_LINESTART, -1 ),
1305 0 : maPolyPolygon(rPolyPolygon)
1306 : {
1307 0 : }
1308 :
1309 0 : SfxPoolItem* XLineStartItem::Clone(SfxItemPool* /*pPool*/) const
1310 : {
1311 0 : return new XLineStartItem(*this);
1312 : }
1313 :
1314 0 : bool XLineStartItem::operator==(const SfxPoolItem& rItem) const
1315 : {
1316 0 : return ( NameOrIndex::operator==(rItem) && ((const XLineStartItem&) rItem).maPolyPolygon == maPolyPolygon );
1317 : }
1318 :
1319 0 : SfxPoolItem* XLineStartItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
1320 : {
1321 0 : return new XLineStartItem(rIn);
1322 : }
1323 :
1324 0 : SvStream& XLineStartItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
1325 : {
1326 0 : NameOrIndex::Store( rOut, nItemVersion );
1327 :
1328 0 : if (!IsIndex())
1329 : {
1330 0 : streamOutB2DPolyPolygon(maPolyPolygon, rOut);
1331 : }
1332 :
1333 0 : return rOut;
1334 : }
1335 :
1336 0 : basegfx::B2DPolyPolygon XLineStartItem::GetLineStartValue() const
1337 : {
1338 0 : return maPolyPolygon;
1339 : }
1340 :
1341 0 : SfxItemPresentation XLineStartItem::GetPresentation
1342 : (
1343 : SfxItemPresentation ePres,
1344 : SfxMapUnit /*eCoreUnit*/,
1345 : SfxMapUnit /*ePresUnit*/,
1346 : OUString& rText, const IntlWrapper *
1347 : ) const
1348 : {
1349 0 : switch ( ePres )
1350 : {
1351 : case SFX_ITEM_PRESENTATION_NONE:
1352 0 : rText = OUString();
1353 0 : return ePres;
1354 : case SFX_ITEM_PRESENTATION_NAMELESS:
1355 : case SFX_ITEM_PRESENTATION_COMPLETE:
1356 0 : rText = GetName();
1357 0 : return ePres;
1358 : default:
1359 0 : return SFX_ITEM_PRESENTATION_NONE;
1360 : }
1361 : }
1362 :
1363 0 : bool XLineStartItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const
1364 : {
1365 0 : nMemberId &= ~CONVERT_TWIPS;
1366 0 : if( nMemberId == MID_NAME )
1367 : {
1368 0 : OUString aApiName = SvxUnogetApiNameForItem(Which(), GetName());
1369 0 : rVal <<= aApiName;
1370 : }
1371 : else
1372 : {
1373 0 : com::sun::star::drawing::PolyPolygonBezierCoords aBezier;
1374 0 : basegfx::unotools::b2DPolyPolygonToPolyPolygonBezier( maPolyPolygon, aBezier );
1375 0 : rVal <<= aBezier;
1376 : }
1377 :
1378 0 : return true;
1379 : }
1380 :
1381 0 : bool XLineStartItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
1382 : {
1383 0 : nMemberId &= ~CONVERT_TWIPS;
1384 0 : if( nMemberId == MID_NAME )
1385 : {
1386 0 : return false;
1387 : }
1388 : else
1389 : {
1390 0 : maPolyPolygon.clear();
1391 :
1392 0 : if( rVal.hasValue() && rVal.getValue() )
1393 : {
1394 0 : if( rVal.getValueType() != ::getCppuType((const com::sun::star::drawing::PolyPolygonBezierCoords*)0) )
1395 0 : return false;
1396 :
1397 0 : com::sun::star::drawing::PolyPolygonBezierCoords* pCoords = (com::sun::star::drawing::PolyPolygonBezierCoords*)rVal.getValue();
1398 0 : if( pCoords->Coordinates.getLength() > 0 )
1399 : {
1400 0 : maPolyPolygon = basegfx::unotools::polyPolygonBezierToB2DPolyPolygon( *pCoords );
1401 : // #i72807# close line start/end polygons hard
1402 : // maPolyPolygon.setClosed(true);
1403 : }
1404 : }
1405 : }
1406 :
1407 0 : return true;
1408 : }
1409 :
1410 : /** this function searches in both the models pool and the styles pool for XLineStartItem
1411 : and XLineEndItem with the same value or name and returns an item with the value of
1412 : this item and a unique name for an item with this value. */
1413 0 : XLineStartItem* XLineStartItem::checkForUniqueItem( SdrModel* pModel ) const
1414 : {
1415 0 : if( pModel )
1416 : {
1417 0 : XLineStartItem* pTempItem = NULL;
1418 0 : const XLineStartItem* pLineStartItem = this;
1419 :
1420 0 : OUString aUniqueName( GetName() );
1421 :
1422 0 : if( !maPolyPolygon.count() )
1423 : {
1424 : // if the polygon is empty, check if the name is empty
1425 0 : if( aUniqueName.isEmpty() )
1426 0 : return (XLineStartItem*)this;
1427 :
1428 : // force empty name for empty polygons
1429 0 : return new XLineStartItem( "", maPolyPolygon );
1430 : }
1431 :
1432 0 : if( maPolyPolygon.count() > 1L )
1433 : {
1434 : // check if the polygon is closed
1435 0 : if(!maPolyPolygon.isClosed())
1436 : {
1437 : // force a closed polygon
1438 0 : basegfx::B2DPolyPolygon aNew(maPolyPolygon);
1439 0 : aNew.setClosed(true);
1440 0 : pTempItem = new XLineStartItem( aUniqueName, aNew );
1441 0 : pLineStartItem = pTempItem;
1442 : }
1443 : }
1444 :
1445 0 : bool bForceNew = false;
1446 :
1447 : // 2. if we have a name check if there is already an item with the
1448 : // same name in the documents pool with a different line end or start
1449 :
1450 : sal_uInt32 nCount, nSurrogate;
1451 :
1452 0 : const SfxItemPool* pPool1 = &pModel->GetItemPool();
1453 0 : if( !aUniqueName.isEmpty() && pPool1 )
1454 : {
1455 0 : nCount = pPool1->GetItemCount2( XATTR_LINESTART );
1456 :
1457 0 : for( nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
1458 : {
1459 0 : const XLineStartItem* pItem = (const XLineStartItem*)pPool1->GetItem2( XATTR_LINESTART, nSurrogate );
1460 :
1461 0 : if( pItem && ( pItem->GetName() == pLineStartItem->GetName() ) )
1462 : {
1463 : // if there is already an item with the same name and the same
1464 : // value its ok to set it
1465 0 : if( pItem->GetLineStartValue() != pLineStartItem->GetLineStartValue() )
1466 : {
1467 : // same name but different value, we need a new name for this item
1468 0 : aUniqueName = "";
1469 0 : bForceNew = true;
1470 : }
1471 0 : break;
1472 : }
1473 : }
1474 :
1475 0 : if( !bForceNew )
1476 : {
1477 0 : nCount = pPool1->GetItemCount2( XATTR_LINEEND );
1478 :
1479 0 : for( nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
1480 : {
1481 0 : const XLineEndItem* pItem = (const XLineEndItem*)pPool1->GetItem2( XATTR_LINEEND, nSurrogate );
1482 :
1483 0 : if( pItem && ( pItem->GetName() == pLineStartItem->GetName() ) )
1484 : {
1485 : // if there is already an item with the same name and the same
1486 : // value its ok to set it
1487 0 : if( pItem->GetLineEndValue() != pLineStartItem->GetLineStartValue() )
1488 : {
1489 : // same name but different value, we need a new name for this item
1490 0 : aUniqueName = "";
1491 0 : bForceNew = true;
1492 : }
1493 0 : break;
1494 : }
1495 : }
1496 : }
1497 : }
1498 :
1499 0 : const SfxItemPool* pPool2 = pModel->GetStyleSheetPool() ? &pModel->GetStyleSheetPool()->GetPool() : NULL;
1500 0 : if( !aUniqueName.isEmpty() && pPool2)
1501 : {
1502 0 : nCount = pPool2->GetItemCount2( XATTR_LINESTART );
1503 0 : for( nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
1504 : {
1505 0 : const XLineStartItem* pItem = (const XLineStartItem*)pPool2->GetItem2( XATTR_LINESTART, nSurrogate );
1506 :
1507 0 : if( pItem && ( pItem->GetName() == pLineStartItem->GetName() ) )
1508 : {
1509 : // if there is already an item with the same name and the same
1510 : // value its ok to set it
1511 0 : if( pItem->GetLineStartValue() != pLineStartItem->GetLineStartValue() )
1512 : {
1513 : // same name but different value, we need a new name for this item
1514 0 : aUniqueName = "";
1515 0 : bForceNew = true;
1516 : }
1517 0 : break;
1518 : }
1519 : }
1520 :
1521 0 : if( !bForceNew )
1522 : {
1523 0 : nCount = pPool2->GetItemCount2( XATTR_LINEEND );
1524 0 : for( nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
1525 : {
1526 0 : const XLineEndItem* pItem = (const XLineEndItem*)pPool2->GetItem2( XATTR_LINEEND, nSurrogate );
1527 :
1528 0 : if( pItem && ( pItem->GetName() == pLineStartItem->GetName() ) )
1529 : {
1530 : // if there is already an item with the same name and the same
1531 : // value its ok to set it
1532 0 : if( pItem->GetLineEndValue() != pLineStartItem->GetLineStartValue() )
1533 : {
1534 : // same name but different value, we need a new name for this item
1535 0 : aUniqueName = "";
1536 0 : bForceNew = true;
1537 : }
1538 0 : break;
1539 : }
1540 : }
1541 : }
1542 : }
1543 :
1544 : // if we have no name yet, find existing item with same conent or
1545 : // create a unique name
1546 0 : if( aUniqueName.isEmpty() )
1547 : {
1548 0 : bool bFoundExisting = false;
1549 :
1550 0 : sal_Int32 nUserIndex = 1;
1551 0 : const ResId aRes(SVX_RES(RID_SVXSTR_LINEEND));
1552 0 : const OUString aUser( aRes.toString() );
1553 :
1554 0 : if( pPool1 )
1555 : {
1556 0 : nCount = pPool1->GetItemCount2( XATTR_LINESTART );
1557 : sal_uInt32 nSurrogate2;
1558 :
1559 0 : for( nSurrogate2 = 0; nSurrogate2 < nCount; nSurrogate2++ )
1560 : {
1561 0 : const XLineStartItem* pItem = (const XLineStartItem*)pPool1->GetItem2( XATTR_LINESTART, nSurrogate2 );
1562 :
1563 0 : if( pItem && !pItem->GetName().isEmpty() )
1564 : {
1565 0 : if( !bForceNew && pItem->GetLineStartValue() == pLineStartItem->GetLineStartValue() )
1566 : {
1567 0 : aUniqueName = pItem->GetName();
1568 0 : bFoundExisting = true;
1569 0 : break;
1570 : }
1571 :
1572 0 : if( pItem->GetName().startsWith( aUser ) )
1573 : {
1574 0 : sal_Int32 nThisIndex = pItem->GetName().copy( aUser.getLength() ).toInt32();
1575 0 : if( nThisIndex >= nUserIndex )
1576 0 : nUserIndex = nThisIndex + 1;
1577 : }
1578 : }
1579 : }
1580 :
1581 0 : nCount = pPool1->GetItemCount2( XATTR_LINEEND );
1582 0 : for( nSurrogate2 = 0; nSurrogate2 < nCount; nSurrogate2++ )
1583 : {
1584 0 : const XLineEndItem* pItem = (const XLineEndItem*)pPool1->GetItem2( XATTR_LINEEND, nSurrogate2 );
1585 :
1586 0 : if( pItem && !pItem->GetName().isEmpty() )
1587 : {
1588 0 : if( !bForceNew && pItem->GetLineEndValue() == pLineStartItem->GetLineStartValue() )
1589 : {
1590 0 : aUniqueName = pItem->GetName();
1591 0 : bFoundExisting = true;
1592 0 : break;
1593 : }
1594 :
1595 0 : if( pItem->GetName().startsWith( aUser ) )
1596 : {
1597 0 : sal_Int32 nThisIndex = pItem->GetName().copy( aUser.getLength() ).toInt32();
1598 0 : if( nThisIndex >= nUserIndex )
1599 0 : nUserIndex = nThisIndex + 1;
1600 : }
1601 : }
1602 : }
1603 : }
1604 :
1605 0 : if( !bFoundExisting )
1606 : {
1607 0 : aUniqueName = aUser;
1608 0 : aUniqueName += " ";
1609 0 : aUniqueName += OUString::number( nUserIndex );
1610 0 : }
1611 : }
1612 :
1613 : // if the given name is not valid, replace it!
1614 0 : if( aUniqueName != GetName() || pTempItem )
1615 : {
1616 0 : if( pTempItem )
1617 : {
1618 0 : pTempItem->SetName( aUniqueName );
1619 0 : return pTempItem;
1620 : }
1621 : else
1622 : {
1623 0 : return new XLineStartItem( aUniqueName, maPolyPolygon );
1624 : }
1625 0 : }
1626 : }
1627 :
1628 0 : return (XLineStartItem*)this;
1629 : }
1630 :
1631 : // class XLineEndItem
1632 :
1633 0 : TYPEINIT1_AUTOFACTORY(XLineEndItem, NameOrIndex);
1634 :
1635 0 : XLineEndItem::XLineEndItem(sal_Int32 nIndex)
1636 0 : : NameOrIndex(XATTR_LINEEND, nIndex)
1637 : {
1638 0 : }
1639 :
1640 0 : XLineEndItem::XLineEndItem(const OUString& rName, const basegfx::B2DPolyPolygon& rPolyPolygon)
1641 : : NameOrIndex(XATTR_LINEEND, rName),
1642 0 : maPolyPolygon(rPolyPolygon)
1643 : {
1644 0 : }
1645 :
1646 0 : XLineEndItem::XLineEndItem(const XLineEndItem& rItem)
1647 : : NameOrIndex(rItem),
1648 0 : maPolyPolygon(rItem.maPolyPolygon)
1649 : {
1650 0 : }
1651 :
1652 0 : XLineEndItem::XLineEndItem(SvStream& rIn) :
1653 0 : NameOrIndex(XATTR_LINEEND, rIn)
1654 : {
1655 0 : if (!IsIndex())
1656 : {
1657 0 : maPolyPolygon = streamInB2DPolyPolygon(rIn);
1658 : }
1659 0 : }
1660 :
1661 0 : XLineEndItem::XLineEndItem(SfxItemPool* /*pPool*/, const basegfx::B2DPolyPolygon& rPolyPolygon)
1662 : : NameOrIndex( XATTR_LINEEND, -1 ),
1663 0 : maPolyPolygon(rPolyPolygon)
1664 : {
1665 0 : }
1666 :
1667 0 : SfxPoolItem* XLineEndItem::Clone(SfxItemPool* /*pPool*/) const
1668 : {
1669 0 : return new XLineEndItem(*this);
1670 : }
1671 :
1672 0 : bool XLineEndItem::operator==(const SfxPoolItem& rItem) const
1673 : {
1674 0 : return ( NameOrIndex::operator==(rItem) && ((const XLineEndItem&) rItem).maPolyPolygon == maPolyPolygon );
1675 : }
1676 :
1677 0 : SfxPoolItem* XLineEndItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
1678 : {
1679 0 : return new XLineEndItem(rIn);
1680 : }
1681 :
1682 0 : SvStream& XLineEndItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
1683 : {
1684 0 : NameOrIndex::Store( rOut, nItemVersion );
1685 :
1686 0 : if (!IsIndex())
1687 : {
1688 0 : streamOutB2DPolyPolygon(maPolyPolygon, rOut);
1689 : }
1690 :
1691 0 : return rOut;
1692 : }
1693 :
1694 0 : basegfx::B2DPolyPolygon XLineEndItem::GetLineEndValue() const
1695 : {
1696 0 : return maPolyPolygon;
1697 : }
1698 :
1699 : /** this function searches in both the models pool and the styles pool for XLineStartItem
1700 : and XLineEndItem with the same value or name and returns an item with the value of
1701 : this item and a unique name for an item with this value. */
1702 0 : XLineEndItem* XLineEndItem::checkForUniqueItem( SdrModel* pModel ) const
1703 : {
1704 0 : if( pModel )
1705 : {
1706 0 : XLineEndItem* pTempItem = NULL;
1707 0 : const XLineEndItem* pLineEndItem = this;
1708 :
1709 0 : OUString aUniqueName( GetName() );
1710 :
1711 0 : if( !maPolyPolygon.count() )
1712 : {
1713 : // if the polygon is empty, check if the name is empty
1714 0 : if( aUniqueName.isEmpty() )
1715 0 : return (XLineEndItem*)this;
1716 :
1717 : // force empty name for empty polygons
1718 0 : return new XLineEndItem( "", maPolyPolygon );
1719 : }
1720 :
1721 0 : if( maPolyPolygon.count() > 1L )
1722 : {
1723 : // check if the polygon is closed
1724 0 : if(!maPolyPolygon.isClosed())
1725 : {
1726 : // force a closed polygon
1727 0 : basegfx::B2DPolyPolygon aNew(maPolyPolygon);
1728 0 : aNew.setClosed(true);
1729 0 : pTempItem = new XLineEndItem( aUniqueName, aNew );
1730 0 : pLineEndItem = pTempItem;
1731 : }
1732 : }
1733 :
1734 0 : bool bForceNew = false;
1735 :
1736 : // 2. if we have a name check if there is already an item with the
1737 : // same name in the documents pool with a different line end or start
1738 :
1739 : sal_uInt16 nCount, nSurrogate;
1740 :
1741 0 : const SfxItemPool* pPool1 = &pModel->GetItemPool();
1742 0 : if( !aUniqueName.isEmpty() && pPool1 )
1743 : {
1744 0 : nCount = pPool1->GetItemCount2( XATTR_LINESTART );
1745 :
1746 0 : for( nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
1747 : {
1748 0 : const XLineStartItem* pItem = (const XLineStartItem*)pPool1->GetItem2( XATTR_LINESTART, nSurrogate );
1749 :
1750 0 : if( pItem && ( pItem->GetName() == pLineEndItem->GetName() ) )
1751 : {
1752 : // if there is already an item with the same name and the same
1753 : // value its ok to set it
1754 0 : if( pItem->GetLineStartValue() != pLineEndItem->GetLineEndValue() )
1755 : {
1756 : // same name but different value, we need a new name for this item
1757 0 : aUniqueName = "";
1758 0 : bForceNew = true;
1759 : }
1760 0 : break;
1761 : }
1762 : }
1763 :
1764 0 : if( !bForceNew )
1765 : {
1766 0 : nCount = pPool1->GetItemCount2( XATTR_LINEEND );
1767 :
1768 0 : for( nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
1769 : {
1770 0 : const XLineEndItem* pItem = (const XLineEndItem*)pPool1->GetItem2( XATTR_LINEEND, nSurrogate );
1771 :
1772 0 : if( pItem && ( pItem->GetName() == pLineEndItem->GetName() ) )
1773 : {
1774 : // if there is already an item with the same name and the same
1775 : // value its ok to set it
1776 0 : if( pItem->GetLineEndValue() != pLineEndItem->GetLineEndValue() )
1777 : {
1778 : // same name but different value, we need a new name for this item
1779 0 : aUniqueName = "";
1780 0 : bForceNew = true;
1781 : }
1782 0 : break;
1783 : }
1784 : }
1785 : }
1786 : }
1787 :
1788 0 : const SfxItemPool* pPool2 = pModel->GetStyleSheetPool() ? &pModel->GetStyleSheetPool()->GetPool() : NULL;
1789 0 : if( !aUniqueName.isEmpty() && pPool2)
1790 : {
1791 0 : nCount = pPool2->GetItemCount2( XATTR_LINESTART );
1792 0 : for( nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
1793 : {
1794 0 : const XLineStartItem* pItem = (const XLineStartItem*)pPool2->GetItem2( XATTR_LINESTART, nSurrogate );
1795 :
1796 0 : if( pItem && ( pItem->GetName() == pLineEndItem->GetName() ) )
1797 : {
1798 : // if there is already an item with the same name and the same
1799 : // value its ok to set it
1800 0 : if( pItem->GetLineStartValue() != pLineEndItem->GetLineEndValue() )
1801 : {
1802 : // same name but different value, we need a new name for this item
1803 0 : aUniqueName = "";
1804 0 : bForceNew = true;
1805 : }
1806 0 : break;
1807 : }
1808 : }
1809 :
1810 0 : if( !bForceNew )
1811 : {
1812 0 : nCount = pPool2->GetItemCount2( XATTR_LINEEND );
1813 0 : for( nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
1814 : {
1815 0 : const XLineEndItem* pItem = (const XLineEndItem*)pPool2->GetItem2( XATTR_LINEEND, nSurrogate );
1816 :
1817 0 : if( pItem && ( pItem->GetName() == pLineEndItem->GetName() ) )
1818 : {
1819 : // if there is already an item with the same name and the same
1820 : // value its ok to set it
1821 0 : if( pItem->GetLineEndValue() != pLineEndItem->GetLineEndValue() )
1822 : {
1823 : // same name but different value, we need a new name for this item
1824 0 : aUniqueName = "";
1825 0 : bForceNew = true;
1826 : }
1827 0 : break;
1828 : }
1829 : }
1830 : }
1831 : }
1832 :
1833 : // if we have no name yet, find existing item with same conent or
1834 : // create a unique name
1835 0 : if( aUniqueName.isEmpty() )
1836 : {
1837 0 : bool bFoundExisting = false;
1838 :
1839 0 : sal_Int32 nUserIndex = 1;
1840 0 : const ResId aRes(SVX_RES(RID_SVXSTR_LINEEND));
1841 0 : const OUString aUser( aRes.toString() );
1842 :
1843 0 : if( pPool1 )
1844 : {
1845 0 : nCount = pPool1->GetItemCount2( XATTR_LINESTART );
1846 : sal_uInt32 nSurrogate2;
1847 :
1848 0 : for( nSurrogate2 = 0; nSurrogate2 < nCount; nSurrogate2++ )
1849 : {
1850 0 : const XLineStartItem* pItem = (const XLineStartItem*)pPool1->GetItem2( XATTR_LINESTART, nSurrogate2 );
1851 :
1852 0 : if( pItem && !pItem->GetName().isEmpty() )
1853 : {
1854 0 : if( !bForceNew && pItem->GetLineStartValue() == pLineEndItem->GetLineEndValue() )
1855 : {
1856 0 : aUniqueName = pItem->GetName();
1857 0 : bFoundExisting = true;
1858 0 : break;
1859 : }
1860 :
1861 0 : if( pItem->GetName().startsWith( aUser ) )
1862 : {
1863 0 : sal_Int32 nThisIndex = pItem->GetName().copy( aUser.getLength() ).toInt32();
1864 0 : if( nThisIndex >= nUserIndex )
1865 0 : nUserIndex = nThisIndex + 1;
1866 : }
1867 : }
1868 : }
1869 :
1870 0 : nCount = pPool1->GetItemCount2( XATTR_LINEEND );
1871 0 : for( nSurrogate2 = 0; nSurrogate2 < nCount; nSurrogate2++ )
1872 : {
1873 0 : const XLineEndItem* pItem = (const XLineEndItem*)pPool1->GetItem2( XATTR_LINEEND, nSurrogate2 );
1874 :
1875 0 : if( pItem && !pItem->GetName().isEmpty() )
1876 : {
1877 0 : if( !bForceNew && pItem->GetLineEndValue() == pLineEndItem->GetLineEndValue() )
1878 : {
1879 0 : aUniqueName = pItem->GetName();
1880 0 : bFoundExisting = true;
1881 0 : break;
1882 : }
1883 :
1884 0 : if( pItem->GetName().startsWith( aUser ) )
1885 : {
1886 0 : sal_Int32 nThisIndex = pItem->GetName().copy( aUser.getLength() ).toInt32();
1887 0 : if( nThisIndex >= nUserIndex )
1888 0 : nUserIndex = nThisIndex + 1;
1889 : }
1890 : }
1891 : }
1892 : }
1893 :
1894 0 : if( !bFoundExisting )
1895 : {
1896 0 : aUniqueName = aUser;
1897 0 : aUniqueName += " ";
1898 0 : aUniqueName += OUString::number( nUserIndex );
1899 0 : }
1900 : }
1901 :
1902 : // if the given name is not valid, replace it!
1903 0 : if( aUniqueName != GetName() || pTempItem )
1904 : {
1905 0 : if( pTempItem )
1906 : {
1907 0 : pTempItem->SetName( aUniqueName );
1908 0 : return pTempItem;
1909 : }
1910 : else
1911 : {
1912 0 : return new XLineEndItem( aUniqueName, maPolyPolygon );
1913 : }
1914 0 : }
1915 : }
1916 :
1917 0 : return (XLineEndItem*)this;
1918 : }
1919 :
1920 0 : SfxItemPresentation XLineEndItem::GetPresentation
1921 : (
1922 : SfxItemPresentation ePres,
1923 : SfxMapUnit /*eCoreUnit*/,
1924 : SfxMapUnit /*ePresUnit*/,
1925 : OUString& rText, const IntlWrapper *
1926 : ) const
1927 : {
1928 0 : switch ( ePres )
1929 : {
1930 : case SFX_ITEM_PRESENTATION_NONE:
1931 0 : rText = OUString();
1932 0 : return ePres;
1933 : case SFX_ITEM_PRESENTATION_NAMELESS:
1934 : case SFX_ITEM_PRESENTATION_COMPLETE:
1935 0 : rText = GetName();
1936 0 : return ePres;
1937 : default:
1938 0 : return SFX_ITEM_PRESENTATION_NONE;
1939 : }
1940 : }
1941 :
1942 0 : bool XLineEndItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const
1943 : {
1944 0 : nMemberId &= ~CONVERT_TWIPS;
1945 0 : if( nMemberId == MID_NAME )
1946 : {
1947 0 : OUString aApiName = SvxUnogetApiNameForItem(Which(), GetName());
1948 0 : rVal <<= aApiName;
1949 : }
1950 : else
1951 : {
1952 0 : com::sun::star::drawing::PolyPolygonBezierCoords aBezier;
1953 0 : basegfx::unotools::b2DPolyPolygonToPolyPolygonBezier( maPolyPolygon, aBezier );
1954 0 : rVal <<= aBezier;
1955 : }
1956 0 : return true;
1957 : }
1958 :
1959 0 : bool XLineEndItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
1960 : {
1961 0 : nMemberId &= ~CONVERT_TWIPS;
1962 0 : if( nMemberId == MID_NAME )
1963 : {
1964 0 : return false;
1965 : }
1966 : else
1967 : {
1968 0 : maPolyPolygon.clear();
1969 :
1970 0 : if( rVal.hasValue() && rVal.getValue() )
1971 : {
1972 0 : if( rVal.getValueType() != ::getCppuType((const com::sun::star::drawing::PolyPolygonBezierCoords*)0) )
1973 0 : return false;
1974 :
1975 0 : com::sun::star::drawing::PolyPolygonBezierCoords* pCoords = (com::sun::star::drawing::PolyPolygonBezierCoords*)rVal.getValue();
1976 0 : if( pCoords->Coordinates.getLength() > 0 )
1977 : {
1978 0 : maPolyPolygon = basegfx::unotools::polyPolygonBezierToB2DPolyPolygon( *pCoords );
1979 : // #i72807# close line start/end polygons hard
1980 : // maPolyPolygon.setClosed(true);
1981 : }
1982 : }
1983 : }
1984 :
1985 0 : return true;
1986 : }
1987 :
1988 : // class XLineStartWidthItem
1989 :
1990 0 : TYPEINIT1_AUTOFACTORY(XLineStartWidthItem, SfxMetricItem);
1991 :
1992 0 : XLineStartWidthItem::XLineStartWidthItem(long nWidth) :
1993 0 : SfxMetricItem(XATTR_LINESTARTWIDTH, nWidth)
1994 : {
1995 0 : }
1996 :
1997 0 : XLineStartWidthItem::XLineStartWidthItem(SvStream& rIn) :
1998 0 : SfxMetricItem(XATTR_LINESTARTWIDTH, rIn)
1999 : {
2000 0 : }
2001 :
2002 0 : SfxPoolItem* XLineStartWidthItem::Clone(SfxItemPool* /*pPool*/) const
2003 : {
2004 0 : return new XLineStartWidthItem(*this);
2005 : }
2006 :
2007 0 : SfxPoolItem* XLineStartWidthItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
2008 : {
2009 0 : return new XLineStartWidthItem(rIn);
2010 : }
2011 :
2012 0 : SfxItemPresentation XLineStartWidthItem::GetPresentation
2013 : (
2014 : SfxItemPresentation ePres,
2015 : SfxMapUnit eCoreUnit,
2016 : SfxMapUnit ePresUnit,
2017 : OUString& rText, const IntlWrapper * pIntl
2018 : ) const
2019 : {
2020 0 : switch ( ePres )
2021 : {
2022 : case SFX_ITEM_PRESENTATION_NONE:
2023 0 : rText = OUString();
2024 0 : return ePres;
2025 : case SFX_ITEM_PRESENTATION_NAMELESS:
2026 : case SFX_ITEM_PRESENTATION_COMPLETE:
2027 0 : rText = GetMetricText( (long) GetValue(),
2028 0 : eCoreUnit, ePresUnit, pIntl) +
2029 0 : " " + EE_RESSTR( GetMetricId( ePresUnit) );
2030 0 : return ePres;
2031 : default:
2032 0 : return SFX_ITEM_PRESENTATION_NONE;
2033 : }
2034 : }
2035 :
2036 0 : bool XLineStartWidthItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
2037 : {
2038 0 : rVal <<= (sal_Int32)GetValue();
2039 0 : return true;
2040 : }
2041 :
2042 0 : bool XLineStartWidthItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
2043 : {
2044 0 : sal_Int32 nValue = 0;
2045 0 : rVal >>= nValue;
2046 0 : SetValue( nValue );
2047 0 : return true;
2048 : }
2049 :
2050 : // class XLineEndWidthItem
2051 :
2052 0 : TYPEINIT1_AUTOFACTORY(XLineEndWidthItem, SfxMetricItem);
2053 :
2054 0 : XLineEndWidthItem::XLineEndWidthItem(long nWidth) :
2055 0 : SfxMetricItem(XATTR_LINEENDWIDTH, nWidth)
2056 : {
2057 0 : }
2058 :
2059 0 : XLineEndWidthItem::XLineEndWidthItem(SvStream& rIn) :
2060 0 : SfxMetricItem(XATTR_LINEENDWIDTH, rIn)
2061 : {
2062 0 : }
2063 :
2064 0 : SfxPoolItem* XLineEndWidthItem::Clone(SfxItemPool* /*pPool*/) const
2065 : {
2066 0 : return new XLineEndWidthItem(*this);
2067 : }
2068 :
2069 0 : SfxPoolItem* XLineEndWidthItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
2070 : {
2071 0 : return new XLineEndWidthItem(rIn);
2072 : }
2073 :
2074 0 : SfxItemPresentation XLineEndWidthItem::GetPresentation
2075 : (
2076 : SfxItemPresentation ePres,
2077 : SfxMapUnit eCoreUnit,
2078 : SfxMapUnit ePresUnit,
2079 : OUString& rText, const IntlWrapper *pIntl
2080 : ) const
2081 : {
2082 0 : switch ( ePres )
2083 : {
2084 : case SFX_ITEM_PRESENTATION_NONE:
2085 0 : rText = OUString();
2086 0 : return ePres;
2087 : case SFX_ITEM_PRESENTATION_NAMELESS:
2088 : case SFX_ITEM_PRESENTATION_COMPLETE:
2089 0 : rText = GetMetricText( (long) GetValue(),
2090 0 : eCoreUnit, ePresUnit, pIntl) +
2091 0 : " " + EE_RESSTR( GetMetricId( ePresUnit) );
2092 0 : return ePres;
2093 : default:
2094 0 : return SFX_ITEM_PRESENTATION_NONE;
2095 : }
2096 : }
2097 :
2098 0 : bool XLineEndWidthItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
2099 : {
2100 0 : rVal <<= (sal_Int32)GetValue();
2101 0 : return true;
2102 : }
2103 :
2104 0 : bool XLineEndWidthItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
2105 : {
2106 0 : sal_Int32 nValue = 0;
2107 0 : rVal >>= nValue;
2108 0 : SetValue( nValue );
2109 0 : return true;
2110 : }
2111 :
2112 : // class XLineStartCenterItem
2113 :
2114 0 : TYPEINIT1_AUTOFACTORY(XLineStartCenterItem, SfxBoolItem);
2115 :
2116 0 : XLineStartCenterItem::XLineStartCenterItem(bool bStartCenter) :
2117 0 : SfxBoolItem(XATTR_LINESTARTCENTER, bStartCenter)
2118 : {
2119 0 : }
2120 :
2121 0 : XLineStartCenterItem::XLineStartCenterItem(SvStream& rIn) :
2122 0 : SfxBoolItem(XATTR_LINESTARTCENTER, rIn)
2123 : {
2124 0 : }
2125 :
2126 0 : SfxPoolItem* XLineStartCenterItem::Clone(SfxItemPool* /*pPool*/) const
2127 : {
2128 0 : return new XLineStartCenterItem(*this);
2129 : }
2130 :
2131 0 : SfxPoolItem* XLineStartCenterItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
2132 : {
2133 0 : return new XLineStartCenterItem(rIn);
2134 : }
2135 :
2136 0 : SfxItemPresentation XLineStartCenterItem::GetPresentation
2137 : (
2138 : SfxItemPresentation ePres,
2139 : SfxMapUnit /*eCoreUnit*/,
2140 : SfxMapUnit /*ePresUnit*/,
2141 : OUString& rText, const IntlWrapper *
2142 : ) const
2143 : {
2144 0 : switch ( ePres )
2145 : {
2146 : case SFX_ITEM_PRESENTATION_NONE:
2147 0 : rText = OUString();
2148 0 : return ePres;
2149 : case SFX_ITEM_PRESENTATION_NAMELESS:
2150 : case SFX_ITEM_PRESENTATION_COMPLETE:
2151 0 : rText = OUString( ResId( GetValue() ? RID_SVXSTR_CENTERED :
2152 0 : RID_SVXSTR_NOTCENTERED, DIALOG_MGR() ) );
2153 0 : return ePres;
2154 : default:
2155 0 : return SFX_ITEM_PRESENTATION_NONE;
2156 : }
2157 : }
2158 :
2159 0 : bool XLineStartCenterItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
2160 : {
2161 0 : sal_Bool bValue = GetValue();
2162 0 : rVal.setValue( &bValue, ::getCppuBooleanType() );
2163 0 : return true;
2164 : }
2165 :
2166 0 : bool XLineStartCenterItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
2167 : {
2168 0 : if( !rVal.hasValue() || rVal.getValueType() != ::getCppuBooleanType() )
2169 0 : return false;
2170 :
2171 0 : SetValue( *(sal_Bool*)rVal.getValue() );
2172 0 : return true;
2173 : }
2174 :
2175 : // class XLineEndCenterItem
2176 :
2177 0 : TYPEINIT1_AUTOFACTORY(XLineEndCenterItem, SfxBoolItem);
2178 :
2179 0 : XLineEndCenterItem::XLineEndCenterItem(bool bEndCenter) :
2180 0 : SfxBoolItem(XATTR_LINEENDCENTER, bEndCenter)
2181 : {
2182 0 : }
2183 :
2184 0 : XLineEndCenterItem::XLineEndCenterItem(SvStream& rIn) :
2185 0 : SfxBoolItem(XATTR_LINEENDCENTER, rIn)
2186 : {
2187 0 : }
2188 :
2189 0 : SfxPoolItem* XLineEndCenterItem::Clone(SfxItemPool* /*pPool*/) const
2190 : {
2191 0 : return new XLineEndCenterItem(*this);
2192 : }
2193 :
2194 0 : SfxPoolItem* XLineEndCenterItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
2195 : {
2196 0 : return new XLineEndCenterItem(rIn);
2197 : }
2198 :
2199 0 : SfxItemPresentation XLineEndCenterItem::GetPresentation
2200 : (
2201 : SfxItemPresentation ePres,
2202 : SfxMapUnit /*eCoreUnit*/,
2203 : SfxMapUnit /*ePresUnit*/,
2204 : OUString& rText, const IntlWrapper *
2205 : ) const
2206 : {
2207 0 : switch ( ePres )
2208 : {
2209 : case SFX_ITEM_PRESENTATION_NONE:
2210 0 : rText = OUString();
2211 0 : return ePres;
2212 : case SFX_ITEM_PRESENTATION_NAMELESS:
2213 : case SFX_ITEM_PRESENTATION_COMPLETE:
2214 0 : rText = OUString( ResId( GetValue() ? RID_SVXSTR_CENTERED :
2215 0 : RID_SVXSTR_NOTCENTERED, DIALOG_MGR() ) );
2216 0 : return ePres;
2217 : default:
2218 0 : return SFX_ITEM_PRESENTATION_NONE;
2219 : }
2220 : }
2221 :
2222 0 : bool XLineEndCenterItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
2223 : {
2224 0 : sal_Bool bValue = GetValue();
2225 0 : rVal.setValue( &bValue, ::getCppuBooleanType() );
2226 0 : return true;
2227 : }
2228 :
2229 0 : bool XLineEndCenterItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
2230 : {
2231 0 : if( !rVal.hasValue() || rVal.getValueType() != ::getCppuBooleanType() )
2232 0 : return false;
2233 :
2234 0 : SetValue( *(sal_Bool*)rVal.getValue() );
2235 0 : return true;
2236 : }
2237 :
2238 : // --- fill attributes ---
2239 :
2240 : // class XFillStyleItem
2241 :
2242 0 : TYPEINIT1_AUTOFACTORY(XFillStyleItem, SfxEnumItem);
2243 :
2244 0 : XFillStyleItem::XFillStyleItem(XFillStyle eFillStyle) :
2245 0 : SfxEnumItem(XATTR_FILLSTYLE, sal::static_int_cast< sal_uInt16 >(eFillStyle))
2246 : {
2247 0 : }
2248 :
2249 0 : XFillStyleItem::XFillStyleItem(XFillStyle eFillStyle, sal_uInt16 nWhich_) :
2250 0 : SfxEnumItem(nWhich_, sal::static_int_cast< sal_uInt16 >(eFillStyle))
2251 : {
2252 0 : }
2253 :
2254 0 : XFillStyleItem::XFillStyleItem(SvStream& rIn) :
2255 0 : SfxEnumItem(XATTR_FILLSTYLE, rIn)
2256 : {
2257 0 : }
2258 :
2259 0 : SfxPoolItem* XFillStyleItem::Clone(SfxItemPool* /*pPool*/) const
2260 : {
2261 0 : return new XFillStyleItem( *this );
2262 : }
2263 :
2264 0 : SfxPoolItem* XFillStyleItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
2265 : {
2266 0 : return new XFillStyleItem(rIn);
2267 : }
2268 :
2269 0 : SfxItemPresentation XFillStyleItem::GetPresentation
2270 : (
2271 : SfxItemPresentation ePres,
2272 : SfxMapUnit /*eCoreUnit*/,
2273 : SfxMapUnit /*ePresUnit*/,
2274 : OUString& rText, const IntlWrapper *
2275 : ) const
2276 : {
2277 0 : rText = OUString();
2278 :
2279 0 : switch ( ePres )
2280 : {
2281 : case SFX_ITEM_PRESENTATION_NONE:
2282 0 : return ePres;
2283 :
2284 : case SFX_ITEM_PRESENTATION_NAMELESS:
2285 : case SFX_ITEM_PRESENTATION_COMPLETE:
2286 : {
2287 0 : sal_uInt16 nId = 0;
2288 :
2289 0 : switch( (sal_uInt16)GetValue() )
2290 : {
2291 : case XFILL_NONE:
2292 0 : nId = RID_SVXSTR_INVISIBLE;
2293 0 : break;
2294 : case XFILL_SOLID:
2295 0 : nId = RID_SVXSTR_SOLID;
2296 0 : break;
2297 : case XFILL_GRADIENT:
2298 0 : nId = RID_SVXSTR_GRADIENT;
2299 0 : break;
2300 : case XFILL_HATCH:
2301 0 : nId = RID_SVXSTR_HATCH;
2302 0 : break;
2303 : case XFILL_BITMAP:
2304 0 : nId = RID_SVXSTR_BITMAP;
2305 0 : break;
2306 : }
2307 :
2308 0 : if ( nId )
2309 0 : rText = SVX_RESSTR( nId );
2310 0 : return ePres;
2311 : }
2312 : default:
2313 0 : return SFX_ITEM_PRESENTATION_NONE;
2314 : }
2315 : }
2316 :
2317 0 : sal_uInt16 XFillStyleItem::GetValueCount() const
2318 : {
2319 0 : return 5;
2320 : }
2321 :
2322 0 : bool XFillStyleItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
2323 : {
2324 0 : ::com::sun::star::drawing::FillStyle eFS = (::com::sun::star::drawing::FillStyle)GetValue();
2325 :
2326 0 : rVal <<= eFS;
2327 :
2328 0 : return true;
2329 : }
2330 :
2331 0 : bool XFillStyleItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
2332 : {
2333 : ::com::sun::star::drawing::FillStyle eFS;
2334 0 : if(!(rVal >>= eFS))
2335 : {
2336 : // also try an int (for Basic)
2337 0 : sal_Int32 nFS = 0;
2338 0 : if(!(rVal >>= nFS))
2339 0 : return false;
2340 0 : eFS = (::com::sun::star::drawing::FillStyle)nFS;
2341 : }
2342 :
2343 0 : SetValue( sal::static_int_cast< sal_uInt16 >( eFS ) );
2344 :
2345 0 : return true;
2346 : }
2347 :
2348 : // class XFillColorItem
2349 :
2350 0 : TYPEINIT1_AUTOFACTORY(XFillColorItem, XColorItem);
2351 :
2352 0 : XFillColorItem::XFillColorItem(sal_Int32 nIndex, const Color& rTheColor) :
2353 0 : XColorItem(XATTR_FILLCOLOR, nIndex, rTheColor)
2354 : {
2355 0 : }
2356 :
2357 0 : XFillColorItem::XFillColorItem(const OUString& rName, const Color& rTheColor) :
2358 0 : XColorItem(XATTR_FILLCOLOR, rName, rTheColor)
2359 : {
2360 0 : }
2361 :
2362 0 : XFillColorItem::XFillColorItem(SvStream& rIn) :
2363 0 : XColorItem(XATTR_FILLCOLOR, rIn)
2364 : {
2365 0 : }
2366 :
2367 0 : SfxPoolItem* XFillColorItem::Clone(SfxItemPool* /*pPool*/) const
2368 : {
2369 0 : return new XFillColorItem(*this);
2370 : }
2371 :
2372 0 : SfxPoolItem* XFillColorItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
2373 : {
2374 0 : return new XFillColorItem(rIn);
2375 : }
2376 :
2377 0 : SfxItemPresentation XFillColorItem::GetPresentation
2378 : (
2379 : SfxItemPresentation ePres,
2380 : SfxMapUnit /*eCoreUnit*/,
2381 : SfxMapUnit /*ePresUnit*/,
2382 : OUString& rText, const IntlWrapper *
2383 : ) const
2384 : {
2385 0 : switch ( ePres )
2386 : {
2387 : case SFX_ITEM_PRESENTATION_NONE:
2388 0 : rText = OUString();
2389 0 : return ePres;
2390 : case SFX_ITEM_PRESENTATION_NAMELESS:
2391 : case SFX_ITEM_PRESENTATION_COMPLETE:
2392 0 : rText = GetName();
2393 0 : return ePres;
2394 : default:
2395 0 : return SFX_ITEM_PRESENTATION_NONE;
2396 : }
2397 : }
2398 :
2399 0 : bool XFillColorItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
2400 : {
2401 0 : rVal <<= (sal_Int32)GetColorValue().GetRGBColor();
2402 :
2403 0 : return true;
2404 : }
2405 :
2406 0 : bool XFillColorItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
2407 : {
2408 0 : sal_Int32 nValue = 0;
2409 0 : if(!(rVal >>= nValue ))
2410 0 : return false;
2411 :
2412 0 : SetColorValue( nValue );
2413 0 : return true;
2414 : }
2415 :
2416 : // class XSecondaryFillColorItem
2417 :
2418 0 : TYPEINIT1_AUTOFACTORY(XSecondaryFillColorItem, XColorItem);
2419 :
2420 0 : XSecondaryFillColorItem::XSecondaryFillColorItem(const OUString& rName, const Color& rTheColor) :
2421 0 : XColorItem(XATTR_SECONDARYFILLCOLOR, rName, rTheColor)
2422 : {
2423 0 : }
2424 :
2425 0 : XSecondaryFillColorItem::XSecondaryFillColorItem( SvStream& rIn ) :
2426 0 : XColorItem(XATTR_SECONDARYFILLCOLOR, rIn)
2427 : {
2428 0 : }
2429 :
2430 0 : SfxPoolItem* XSecondaryFillColorItem::Clone(SfxItemPool* /*pPool*/) const
2431 : {
2432 0 : return new XSecondaryFillColorItem(*this);
2433 : }
2434 :
2435 0 : SfxPoolItem* XSecondaryFillColorItem::Create( SvStream& rIn, sal_uInt16 nVer ) const
2436 : {
2437 0 : if ( nVer >= 2 )
2438 0 : return new XSecondaryFillColorItem( rIn );
2439 : else
2440 0 : return new XSecondaryFillColorItem( "", Color(0,184,255) );
2441 : }
2442 :
2443 0 : sal_uInt16 XSecondaryFillColorItem::GetVersion( sal_uInt16 /*nFileFormatVersion*/ ) const
2444 : {
2445 0 : return 2;
2446 : }
2447 :
2448 0 : SfxItemPresentation XSecondaryFillColorItem::GetPresentation
2449 : (
2450 : SfxItemPresentation ePres,
2451 : SfxMapUnit /*eCoreUnit*/,
2452 : SfxMapUnit /*ePresUnit*/,
2453 : OUString& rText, const IntlWrapper *
2454 : ) const
2455 : {
2456 0 : switch ( ePres )
2457 : {
2458 : case SFX_ITEM_PRESENTATION_NONE:
2459 0 : rText = OUString();
2460 0 : return ePres;
2461 : case SFX_ITEM_PRESENTATION_NAMELESS:
2462 : case SFX_ITEM_PRESENTATION_COMPLETE:
2463 0 : rText = GetName();
2464 0 : return ePres;
2465 : default:
2466 0 : return SFX_ITEM_PRESENTATION_NONE;
2467 : }
2468 : }
2469 :
2470 : // class XGradient
2471 :
2472 0 : XGradient::XGradient() :
2473 : eStyle( XGRAD_LINEAR ),
2474 : aStartColor( Color( COL_BLACK ) ),
2475 : aEndColor( Color( COL_WHITE ) ),
2476 : nAngle( 0 ),
2477 : nBorder( 0 ),
2478 : nOfsX( 50 ),
2479 : nOfsY( 50 ),
2480 : nIntensStart( 100 ),
2481 : nIntensEnd( 100 ),
2482 0 : nStepCount( 0 )
2483 : {
2484 0 : }
2485 :
2486 0 : XGradient::XGradient(const Color& rStart, const Color& rEnd,
2487 : XGradientStyle eTheStyle, long nTheAngle, sal_uInt16 nXOfs,
2488 : sal_uInt16 nYOfs, sal_uInt16 nTheBorder,
2489 : sal_uInt16 nStartIntens, sal_uInt16 nEndIntens,
2490 : sal_uInt16 nSteps) :
2491 : eStyle(eTheStyle),
2492 : aStartColor(rStart),
2493 : aEndColor(rEnd),
2494 : nAngle(nTheAngle),
2495 : nBorder(nTheBorder),
2496 : nOfsX(nXOfs),
2497 : nOfsY(nYOfs),
2498 : nIntensStart(nStartIntens),
2499 : nIntensEnd(nEndIntens),
2500 0 : nStepCount(nSteps)
2501 : {
2502 0 : }
2503 :
2504 0 : bool XGradient::operator==(const XGradient& rGradient) const
2505 : {
2506 0 : return ( eStyle == rGradient.eStyle &&
2507 0 : aStartColor == rGradient.aStartColor &&
2508 0 : aEndColor == rGradient.aEndColor &&
2509 0 : nAngle == rGradient.nAngle &&
2510 0 : nBorder == rGradient.nBorder &&
2511 0 : nOfsX == rGradient.nOfsX &&
2512 0 : nOfsY == rGradient.nOfsY &&
2513 0 : nIntensStart == rGradient.nIntensStart &&
2514 0 : nIntensEnd == rGradient.nIntensEnd &&
2515 0 : nStepCount == rGradient.nStepCount );
2516 : }
2517 :
2518 0 : Gradient XGradient::VclGradient() const
2519 : {
2520 0 : Gradient aGradient;
2521 0 : aGradient.SetStyle((GradientStyle)eStyle);
2522 0 : aGradient.SetStartColor(aStartColor);
2523 0 : aGradient.SetEndColor(aEndColor);
2524 0 : aGradient.SetAngle(nAngle);
2525 0 : aGradient.SetBorder(nBorder);
2526 0 : aGradient.SetOfsX(nOfsX);
2527 0 : aGradient.SetOfsY(nOfsY);
2528 0 : aGradient.SetStartIntensity(nIntensStart);
2529 0 : aGradient.SetEndIntensity(nIntensEnd);
2530 0 : aGradient.SetSteps(nStepCount);
2531 0 : return aGradient;
2532 : }
2533 :
2534 : // class XFillGradientItem
2535 :
2536 0 : TYPEINIT1_AUTOFACTORY(XFillGradientItem, NameOrIndex);
2537 :
2538 0 : XFillGradientItem::XFillGradientItem(sal_Int32 nIndex,
2539 : const XGradient& rTheGradient) :
2540 : NameOrIndex(XATTR_FILLGRADIENT, nIndex),
2541 0 : aGradient(rTheGradient)
2542 : {
2543 0 : }
2544 :
2545 0 : XFillGradientItem::XFillGradientItem(const OUString& rName,
2546 : const XGradient& rTheGradient, sal_uInt16 nWhich)
2547 : : NameOrIndex(nWhich, rName)
2548 0 : , aGradient(rTheGradient)
2549 : {
2550 0 : }
2551 :
2552 0 : XFillGradientItem::XFillGradientItem(const XFillGradientItem& rItem) :
2553 : NameOrIndex(rItem),
2554 0 : aGradient(rItem.aGradient)
2555 : {
2556 0 : }
2557 :
2558 0 : XFillGradientItem::XFillGradientItem(SvStream& rIn, sal_uInt16 nVer) :
2559 : NameOrIndex(XATTR_FILLGRADIENT, rIn),
2560 0 : aGradient(COL_BLACK, COL_WHITE)
2561 : {
2562 0 : if (!IsIndex())
2563 : {
2564 : sal_uInt16 nUSTemp;
2565 : sal_uInt16 nRed;
2566 : sal_uInt16 nGreen;
2567 : sal_uInt16 nBlue;
2568 : sal_Int16 nITemp;
2569 : sal_Int32 nLTemp;
2570 :
2571 0 : rIn.ReadInt16( nITemp ); aGradient.SetGradientStyle((XGradientStyle)nITemp);
2572 0 : rIn.ReadUInt16( nRed );
2573 0 : rIn.ReadUInt16( nGreen );
2574 0 : rIn.ReadUInt16( nBlue );
2575 0 : Color aCol;
2576 0 : aCol = Color( (sal_uInt8)( nRed >> 8 ), (sal_uInt8)( nGreen >> 8 ), (sal_uInt8)( nBlue >> 8 ) );
2577 0 : aGradient.SetStartColor( aCol );
2578 :
2579 0 : rIn.ReadUInt16( nRed );
2580 0 : rIn.ReadUInt16( nGreen );
2581 0 : rIn.ReadUInt16( nBlue );
2582 0 : aCol = Color( (sal_uInt8)( nRed >> 8 ), (sal_uInt8)( nGreen >> 8 ), (sal_uInt8)( nBlue >> 8 ) );
2583 0 : aGradient.SetEndColor(aCol);
2584 0 : rIn.ReadInt32( nLTemp ); aGradient.SetAngle(nLTemp);
2585 0 : rIn.ReadUInt16( nUSTemp ); aGradient.SetBorder(nUSTemp);
2586 0 : rIn.ReadUInt16( nUSTemp ); aGradient.SetXOffset(nUSTemp);
2587 0 : rIn.ReadUInt16( nUSTemp ); aGradient.SetYOffset(nUSTemp);
2588 0 : rIn.ReadUInt16( nUSTemp ); aGradient.SetStartIntens(nUSTemp);
2589 0 : rIn.ReadUInt16( nUSTemp ); aGradient.SetEndIntens(nUSTemp);
2590 :
2591 : // for newer versions consider the step width as well
2592 0 : if (nVer >= 1)
2593 : {
2594 0 : rIn.ReadUInt16( nUSTemp ); aGradient.SetSteps(nUSTemp);
2595 : }
2596 : }
2597 0 : }
2598 :
2599 0 : XFillGradientItem::XFillGradientItem( const XGradient& rTheGradient )
2600 : : NameOrIndex( XATTR_FILLGRADIENT, -1 ),
2601 0 : aGradient(rTheGradient)
2602 : {
2603 0 : }
2604 :
2605 0 : SfxPoolItem* XFillGradientItem::Clone(SfxItemPool* /*pPool*/) const
2606 : {
2607 0 : return new XFillGradientItem(*this);
2608 : }
2609 :
2610 0 : bool XFillGradientItem::operator==(const SfxPoolItem& rItem) const
2611 : {
2612 0 : return ( NameOrIndex::operator==(rItem) &&
2613 0 : aGradient == ((const XFillGradientItem&) rItem).aGradient );
2614 : }
2615 :
2616 0 : SfxPoolItem* XFillGradientItem::Create(SvStream& rIn, sal_uInt16 nVer) const
2617 : {
2618 0 : return new XFillGradientItem(rIn, nVer);
2619 : }
2620 :
2621 0 : SvStream& XFillGradientItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
2622 : {
2623 0 : NameOrIndex::Store( rOut, nItemVersion );
2624 :
2625 0 : if (!IsIndex())
2626 : {
2627 0 : rOut.WriteInt16( (sal_Int16)aGradient.GetGradientStyle() );
2628 :
2629 : sal_uInt16 nTmp;
2630 :
2631 0 : nTmp = VCLTOSVCOL( aGradient.GetStartColor().GetRed() ); rOut.WriteUInt16( nTmp );
2632 0 : nTmp = VCLTOSVCOL( aGradient.GetStartColor().GetGreen() ); rOut.WriteUInt16( nTmp );
2633 0 : nTmp = VCLTOSVCOL( aGradient.GetStartColor().GetBlue() ); rOut.WriteUInt16( nTmp );
2634 0 : nTmp = VCLTOSVCOL( aGradient.GetEndColor().GetRed() ); rOut.WriteUInt16( nTmp );
2635 0 : nTmp = VCLTOSVCOL( aGradient.GetEndColor().GetGreen() ); rOut.WriteUInt16( nTmp );
2636 0 : nTmp = VCLTOSVCOL( aGradient.GetEndColor().GetBlue() ); rOut.WriteUInt16( nTmp );
2637 :
2638 0 : rOut.WriteInt32( (sal_Int32) aGradient.GetAngle() );
2639 0 : rOut.WriteUInt16( aGradient.GetBorder() );
2640 0 : rOut.WriteUInt16( aGradient.GetXOffset() );
2641 0 : rOut.WriteUInt16( aGradient.GetYOffset() );
2642 0 : rOut.WriteUInt16( aGradient.GetStartIntens() );
2643 0 : rOut.WriteUInt16( aGradient.GetEndIntens() );
2644 0 : rOut.WriteUInt16( aGradient.GetSteps() );
2645 : }
2646 :
2647 0 : return rOut;
2648 : }
2649 :
2650 0 : const XGradient& XFillGradientItem::GetGradientValue() const // GetValue -> GetGradientValue
2651 : {
2652 0 : if (!IsIndex())
2653 0 : return aGradient;
2654 : // ToDo: This should fail. We never called this code with a table so this should always
2655 : // have failed. Thus, I'm thinking that XFillGradientItem can't be an Index.
2656 0 : return aGradient;
2657 : }
2658 :
2659 0 : sal_uInt16 XFillGradientItem::GetVersion( sal_uInt16 /*nFileFormatVersion*/) const
2660 : {
2661 : // !!! this version number also represents the version number of superclasses
2662 : // !!! (e.g. XFillFloatTransparenceItem); if you make any changes here,
2663 : // !!! the superclass is also affected
2664 0 : return 1;
2665 : }
2666 :
2667 0 : SfxItemPresentation XFillGradientItem::GetPresentation
2668 : (
2669 : SfxItemPresentation ePres,
2670 : SfxMapUnit /*eCoreUnit*/,
2671 : SfxMapUnit /*ePresUnit*/,
2672 : OUString& rText, const IntlWrapper *
2673 : ) const
2674 : {
2675 0 : switch ( ePres )
2676 : {
2677 : case SFX_ITEM_PRESENTATION_NONE:
2678 0 : rText = OUString();
2679 0 : return ePres;
2680 : case SFX_ITEM_PRESENTATION_NAMELESS:
2681 : case SFX_ITEM_PRESENTATION_COMPLETE:
2682 0 : rText = GetName();
2683 0 : return ePres;
2684 : default:
2685 0 : return SFX_ITEM_PRESENTATION_NONE;
2686 : }
2687 : }
2688 :
2689 0 : bool XFillGradientItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const
2690 : {
2691 0 : nMemberId &= ~CONVERT_TWIPS;
2692 0 : switch ( nMemberId )
2693 : {
2694 : case 0:
2695 : {
2696 0 : uno::Sequence< beans::PropertyValue > aPropSeq( 2 );
2697 :
2698 0 : ::com::sun::star::awt::Gradient aGradient2;
2699 :
2700 0 : const XGradient& aXGradient = GetGradientValue();
2701 0 : aGradient2.Style = (::com::sun::star::awt::GradientStyle) aXGradient.GetGradientStyle();
2702 0 : aGradient2.StartColor = (sal_Int32)aXGradient.GetStartColor().GetColor();
2703 0 : aGradient2.EndColor = (sal_Int32)aXGradient.GetEndColor().GetColor();
2704 0 : aGradient2.Angle = (short)aXGradient.GetAngle();
2705 0 : aGradient2.Border = aXGradient.GetBorder();
2706 0 : aGradient2.XOffset = aXGradient.GetXOffset();
2707 0 : aGradient2.YOffset = aXGradient.GetYOffset();
2708 0 : aGradient2.StartIntensity = aXGradient.GetStartIntens();
2709 0 : aGradient2.EndIntensity = aXGradient.GetEndIntens();
2710 0 : aGradient2.StepCount = aXGradient.GetSteps();
2711 :
2712 0 : OUString aApiName = SvxUnogetApiNameForItem(Which(), GetName());
2713 0 : aPropSeq[0].Name = "Name";
2714 0 : aPropSeq[0].Value = uno::makeAny( aApiName );
2715 0 : aPropSeq[1].Name = "FillGradient";
2716 0 : aPropSeq[1].Value = uno::makeAny( aGradient2 );
2717 0 : rVal = uno::makeAny( aPropSeq );
2718 0 : break;
2719 : }
2720 :
2721 : case MID_FILLGRADIENT:
2722 : {
2723 0 : const XGradient& aXGradient = GetGradientValue();
2724 0 : ::com::sun::star::awt::Gradient aGradient2;
2725 :
2726 0 : aGradient2.Style = (::com::sun::star::awt::GradientStyle) aXGradient.GetGradientStyle();
2727 0 : aGradient2.StartColor = (sal_Int32)aXGradient.GetStartColor().GetColor();
2728 0 : aGradient2.EndColor = (sal_Int32)aXGradient.GetEndColor().GetColor();
2729 0 : aGradient2.Angle = (short)aXGradient.GetAngle();
2730 0 : aGradient2.Border = aXGradient.GetBorder();
2731 0 : aGradient2.XOffset = aXGradient.GetXOffset();
2732 0 : aGradient2.YOffset = aXGradient.GetYOffset();
2733 0 : aGradient2.StartIntensity = aXGradient.GetStartIntens();
2734 0 : aGradient2.EndIntensity = aXGradient.GetEndIntens();
2735 0 : aGradient2.StepCount = aXGradient.GetSteps();
2736 :
2737 0 : rVal <<= aGradient2;
2738 0 : break;
2739 : }
2740 :
2741 : case MID_NAME:
2742 : {
2743 0 : OUString aApiName = SvxUnogetApiNameForItem(Which(), GetName());
2744 0 : rVal <<= aApiName;
2745 0 : break;
2746 : }
2747 :
2748 0 : case MID_GRADIENT_STYLE: rVal <<= (sal_Int16)GetGradientValue().GetGradientStyle(); break;
2749 0 : case MID_GRADIENT_STARTCOLOR: rVal <<= (sal_Int32)GetGradientValue().GetStartColor().GetColor(); break;
2750 0 : case MID_GRADIENT_ENDCOLOR: rVal <<= (sal_Int32)GetGradientValue().GetEndColor().GetColor(); break;
2751 0 : case MID_GRADIENT_ANGLE: rVal <<= (sal_Int16)GetGradientValue().GetAngle(); break;
2752 0 : case MID_GRADIENT_BORDER: rVal <<= GetGradientValue().GetBorder(); break;
2753 0 : case MID_GRADIENT_XOFFSET: rVal <<= GetGradientValue().GetXOffset(); break;
2754 0 : case MID_GRADIENT_YOFFSET: rVal <<= GetGradientValue().GetYOffset(); break;
2755 0 : case MID_GRADIENT_STARTINTENSITY: rVal <<= GetGradientValue().GetStartIntens(); break;
2756 0 : case MID_GRADIENT_ENDINTENSITY: rVal <<= GetGradientValue().GetEndIntens(); break;
2757 0 : case MID_GRADIENT_STEPCOUNT: rVal <<= GetGradientValue().GetSteps(); break;
2758 :
2759 0 : default: OSL_FAIL("Wrong MemberId!"); return false;
2760 : }
2761 :
2762 0 : return true;
2763 : }
2764 :
2765 0 : bool XFillGradientItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
2766 : {
2767 0 : nMemberId &= ~CONVERT_TWIPS;
2768 :
2769 0 : switch ( nMemberId )
2770 : {
2771 : case 0:
2772 : {
2773 0 : uno::Sequence< beans::PropertyValue > aPropSeq;
2774 0 : ::com::sun::star::awt::Gradient aGradient2;
2775 0 : OUString aName;
2776 0 : bool bGradient( false );
2777 :
2778 0 : if ( rVal >>= aPropSeq )
2779 : {
2780 0 : for ( sal_Int32 n = 0; n < aPropSeq.getLength(); n++ )
2781 : {
2782 0 : if ( aPropSeq[n].Name == "Name" )
2783 0 : aPropSeq[n].Value >>= aName;
2784 0 : else if ( aPropSeq[n].Name == "FillGradient" )
2785 : {
2786 0 : if ( aPropSeq[n].Value >>= aGradient2 )
2787 0 : bGradient = true;
2788 : }
2789 : }
2790 :
2791 0 : SetName( aName );
2792 0 : if ( bGradient )
2793 : {
2794 0 : XGradient aXGradient;
2795 :
2796 0 : aXGradient.SetGradientStyle( (XGradientStyle) aGradient2.Style );
2797 0 : aXGradient.SetStartColor( aGradient2.StartColor );
2798 0 : aXGradient.SetEndColor( aGradient2.EndColor );
2799 0 : aXGradient.SetAngle( aGradient2.Angle );
2800 0 : aXGradient.SetBorder( aGradient2.Border );
2801 0 : aXGradient.SetXOffset( aGradient2.XOffset );
2802 0 : aXGradient.SetYOffset( aGradient2.YOffset );
2803 0 : aXGradient.SetStartIntens( aGradient2.StartIntensity );
2804 0 : aXGradient.SetEndIntens( aGradient2.EndIntensity );
2805 0 : aXGradient.SetSteps( aGradient2.StepCount );
2806 :
2807 0 : SetGradientValue( aXGradient );
2808 : }
2809 :
2810 0 : return true;
2811 : }
2812 :
2813 0 : return false;
2814 : }
2815 :
2816 : case MID_NAME:
2817 : {
2818 0 : OUString aName;
2819 0 : if (!(rVal >>= aName ))
2820 0 : return false;
2821 0 : SetName( aName );
2822 0 : break;
2823 : }
2824 :
2825 : case MID_FILLGRADIENT:
2826 : {
2827 0 : ::com::sun::star::awt::Gradient aGradient2;
2828 0 : if(!(rVal >>= aGradient2))
2829 0 : return false;
2830 :
2831 0 : XGradient aXGradient;
2832 :
2833 0 : aXGradient.SetGradientStyle( (XGradientStyle) aGradient2.Style );
2834 0 : aXGradient.SetStartColor( aGradient2.StartColor );
2835 0 : aXGradient.SetEndColor( aGradient2.EndColor );
2836 0 : aXGradient.SetAngle( aGradient2.Angle );
2837 0 : aXGradient.SetBorder( aGradient2.Border );
2838 0 : aXGradient.SetXOffset( aGradient2.XOffset );
2839 0 : aXGradient.SetYOffset( aGradient2.YOffset );
2840 0 : aXGradient.SetStartIntens( aGradient2.StartIntensity );
2841 0 : aXGradient.SetEndIntens( aGradient2.EndIntensity );
2842 0 : aXGradient.SetSteps( aGradient2.StepCount );
2843 :
2844 0 : SetGradientValue( aXGradient );
2845 0 : break;
2846 : }
2847 :
2848 : case MID_GRADIENT_STARTCOLOR:
2849 : case MID_GRADIENT_ENDCOLOR:
2850 : {
2851 0 : sal_Int32 nVal = 0;
2852 0 : if(!(rVal >>= nVal ))
2853 0 : return false;
2854 :
2855 0 : XGradient aXGradient = GetGradientValue();
2856 :
2857 0 : if ( nMemberId == MID_GRADIENT_STARTCOLOR )
2858 0 : aXGradient.SetStartColor( nVal );
2859 : else
2860 0 : aXGradient.SetEndColor( nVal );
2861 0 : SetGradientValue( aXGradient );
2862 0 : break;
2863 : }
2864 :
2865 : case MID_GRADIENT_STYLE:
2866 : case MID_GRADIENT_ANGLE:
2867 : case MID_GRADIENT_BORDER:
2868 : case MID_GRADIENT_STARTINTENSITY:
2869 : case MID_GRADIENT_ENDINTENSITY:
2870 : case MID_GRADIENT_STEPCOUNT:
2871 : case MID_GRADIENT_XOFFSET:
2872 : case MID_GRADIENT_YOFFSET:
2873 : {
2874 0 : sal_Int16 nVal = sal_Int16();
2875 0 : if(!(rVal >>= nVal ))
2876 0 : return false;
2877 :
2878 0 : XGradient aXGradient = GetGradientValue();
2879 :
2880 0 : switch ( nMemberId )
2881 : {
2882 : case MID_GRADIENT_STYLE:
2883 0 : aXGradient.SetGradientStyle( (XGradientStyle)nVal ); break;
2884 : case MID_GRADIENT_ANGLE:
2885 0 : aXGradient.SetAngle( nVal ); break;
2886 : case MID_GRADIENT_BORDER:
2887 0 : aXGradient.SetBorder( nVal ); break;
2888 : case MID_GRADIENT_STARTINTENSITY:
2889 0 : aXGradient.SetStartIntens( nVal ); break;
2890 : case MID_GRADIENT_ENDINTENSITY:
2891 0 : aXGradient.SetEndIntens( nVal ); break;
2892 : case MID_GRADIENT_STEPCOUNT:
2893 0 : aXGradient.SetSteps( nVal ); break;
2894 : case MID_GRADIENT_XOFFSET:
2895 0 : aXGradient.SetXOffset( nVal ); break;
2896 : case MID_GRADIENT_YOFFSET:
2897 0 : aXGradient.SetYOffset( nVal ); break;
2898 : }
2899 :
2900 0 : SetGradientValue( aXGradient );
2901 0 : break;
2902 : }
2903 : }
2904 :
2905 0 : return true;
2906 : }
2907 :
2908 0 : bool XFillGradientItem::CompareValueFunc( const NameOrIndex* p1, const NameOrIndex* p2 )
2909 : {
2910 0 : return ((XFillGradientItem*)p1)->GetGradientValue() == ((XFillGradientItem*)p2)->GetGradientValue();
2911 : }
2912 :
2913 0 : XFillGradientItem* XFillGradientItem::checkForUniqueItem( SdrModel* pModel ) const
2914 : {
2915 0 : if( pModel )
2916 : {
2917 : const OUString aUniqueName = NameOrIndex::CheckNamedItem(
2918 0 : this, Which(), &pModel->GetItemPool(),
2919 0 : pModel->GetStyleSheetPool() ? &pModel->GetStyleSheetPool()->GetPool() : NULL,
2920 : XFillGradientItem::CompareValueFunc, RID_SVXSTR_GRADIENT,
2921 0 : pModel->GetPropertyList( XGRADIENT_LIST ) );
2922 :
2923 : // if the given name is not valid, replace it!
2924 0 : if( aUniqueName != GetName() )
2925 0 : return new XFillGradientItem( aUniqueName, aGradient, Which() );
2926 : }
2927 :
2928 0 : return (XFillGradientItem*)this;
2929 : }
2930 :
2931 : // class XFillFloatTransparenceItem -
2932 :
2933 0 : TYPEINIT1_AUTOFACTORY( XFillFloatTransparenceItem, XFillGradientItem );
2934 :
2935 0 : XFillFloatTransparenceItem::XFillFloatTransparenceItem() :
2936 0 : bEnabled( false )
2937 : {
2938 0 : SetWhich( XATTR_FILLFLOATTRANSPARENCE );
2939 0 : }
2940 :
2941 0 : XFillFloatTransparenceItem::XFillFloatTransparenceItem(const OUString& rName, const XGradient& rGradient, bool bEnable ) :
2942 : XFillGradientItem ( rName, rGradient ),
2943 0 : bEnabled ( bEnable )
2944 : {
2945 0 : SetWhich( XATTR_FILLFLOATTRANSPARENCE );
2946 0 : }
2947 :
2948 0 : XFillFloatTransparenceItem::XFillFloatTransparenceItem( const XFillFloatTransparenceItem& rItem ) :
2949 : XFillGradientItem ( rItem ),
2950 0 : bEnabled ( rItem.bEnabled )
2951 : {
2952 0 : SetWhich( XATTR_FILLFLOATTRANSPARENCE );
2953 0 : }
2954 :
2955 0 : XFillFloatTransparenceItem::XFillFloatTransparenceItem(SfxItemPool* /*pPool*/, const XGradient& rTheGradient, bool bEnable )
2956 : : XFillGradientItem ( -1, rTheGradient ),
2957 0 : bEnabled ( bEnable )
2958 : {
2959 0 : SetWhich( XATTR_FILLFLOATTRANSPARENCE );
2960 0 : }
2961 :
2962 0 : bool XFillFloatTransparenceItem::operator==( const SfxPoolItem& rItem ) const
2963 : {
2964 0 : return ( NameOrIndex::operator==(rItem) ) &&
2965 0 : ( GetGradientValue() == ((const XFillGradientItem&)rItem).GetGradientValue() ) &&
2966 0 : ( bEnabled == ( (XFillFloatTransparenceItem&) rItem ).bEnabled );
2967 : }
2968 :
2969 0 : SfxPoolItem* XFillFloatTransparenceItem::Clone( SfxItemPool* /*pPool*/) const
2970 : {
2971 0 : return new XFillFloatTransparenceItem( *this );
2972 : }
2973 :
2974 0 : sal_uInt16 XFillFloatTransparenceItem::GetVersion( sal_uInt16 nFileFormatVersion ) const
2975 : {
2976 : // !!! if version number of this object must be increased, please !!!
2977 : // !!! increase version number of base class XFillGradientItem !!!
2978 0 : return XFillGradientItem::GetVersion( nFileFormatVersion );
2979 : }
2980 :
2981 0 : bool XFillFloatTransparenceItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const
2982 : {
2983 0 : return XFillGradientItem::QueryValue( rVal, nMemberId );
2984 : }
2985 :
2986 0 : bool XFillFloatTransparenceItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
2987 : {
2988 0 : return XFillGradientItem::PutValue( rVal, nMemberId );
2989 : }
2990 :
2991 0 : SfxItemPresentation XFillFloatTransparenceItem::GetPresentation( SfxItemPresentation ePres,
2992 : SfxMapUnit eCoreUnit, SfxMapUnit ePresUnit,
2993 : OUString& rText,
2994 : const IntlWrapper * pIntlWrapper ) const
2995 : {
2996 0 : return XFillGradientItem::GetPresentation( ePres, eCoreUnit, ePresUnit, rText, pIntlWrapper );
2997 : }
2998 :
2999 0 : bool XFillFloatTransparenceItem::CompareValueFunc( const NameOrIndex* p1, const NameOrIndex* p2 )
3000 : {
3001 0 : return ((XFillFloatTransparenceItem*)p1)->IsEnabled() == ((XFillFloatTransparenceItem*)p2)->IsEnabled() &&
3002 0 : ((XFillFloatTransparenceItem*)p1)->GetGradientValue() == ((XFillFloatTransparenceItem*)p2)->GetGradientValue();
3003 : }
3004 :
3005 0 : XFillFloatTransparenceItem* XFillFloatTransparenceItem::checkForUniqueItem( SdrModel* pModel ) const
3006 : {
3007 : // #85953# unique name only necessary when enabled
3008 0 : if(IsEnabled())
3009 : {
3010 0 : if( pModel )
3011 : {
3012 : const OUString aUniqueName = NameOrIndex::CheckNamedItem( this,
3013 : XATTR_FILLFLOATTRANSPARENCE,
3014 0 : &pModel->GetItemPool(),
3015 0 : pModel->GetStyleSheetPool() ? &pModel->GetStyleSheetPool()->GetPool() : NULL,
3016 : XFillFloatTransparenceItem::CompareValueFunc,
3017 : RID_SVXSTR_TRASNGR0,
3018 0 : XPropertyListRef() );
3019 :
3020 : // if the given name is not valid, replace it!
3021 0 : if( aUniqueName != GetName() )
3022 : {
3023 0 : return new XFillFloatTransparenceItem( aUniqueName, GetGradientValue(), true );
3024 0 : }
3025 : }
3026 : }
3027 : else
3028 : {
3029 : // #85953# if disabled, force name to empty string
3030 0 : if( !GetName().isEmpty() )
3031 : {
3032 0 : return new XFillFloatTransparenceItem(OUString(), GetGradientValue(), false);
3033 : }
3034 : }
3035 :
3036 0 : return (XFillFloatTransparenceItem*)this;
3037 : }
3038 :
3039 : // class XHatch
3040 :
3041 0 : XHatch::XHatch(const Color& rCol, XHatchStyle eTheStyle, long nTheDistance,
3042 : long nTheAngle) :
3043 : eStyle(eTheStyle),
3044 : aColor(rCol),
3045 : nDistance(nTheDistance),
3046 0 : nAngle(nTheAngle)
3047 : {
3048 0 : }
3049 :
3050 0 : bool XHatch::operator==(const XHatch& rHatch) const
3051 : {
3052 0 : return ( eStyle == rHatch.eStyle &&
3053 0 : aColor == rHatch.aColor &&
3054 0 : nDistance == rHatch.nDistance &&
3055 0 : nAngle == rHatch.nAngle );
3056 : }
3057 :
3058 : // class XFillHatchItem
3059 :
3060 0 : TYPEINIT1_AUTOFACTORY(XFillHatchItem, NameOrIndex);
3061 :
3062 0 : XFillHatchItem::XFillHatchItem(const OUString& rName,
3063 : const XHatch& rTheHatch) :
3064 : NameOrIndex(XATTR_FILLHATCH, rName),
3065 0 : aHatch(rTheHatch)
3066 : {
3067 0 : }
3068 :
3069 0 : XFillHatchItem::XFillHatchItem(const XFillHatchItem& rItem) :
3070 : NameOrIndex(rItem),
3071 0 : aHatch(rItem.aHatch)
3072 : {
3073 0 : }
3074 :
3075 0 : XFillHatchItem::XFillHatchItem(SvStream& rIn) :
3076 : NameOrIndex(XATTR_FILLHATCH, rIn),
3077 0 : aHatch(COL_BLACK)
3078 : {
3079 0 : if (!IsIndex())
3080 : {
3081 : sal_uInt16 nRed;
3082 : sal_uInt16 nGreen;
3083 : sal_uInt16 nBlue;
3084 : sal_Int16 nITemp;
3085 : sal_Int32 nLTemp;
3086 :
3087 0 : rIn.ReadInt16( nITemp ); aHatch.SetHatchStyle((XHatchStyle)nITemp);
3088 0 : rIn.ReadUInt16( nRed );
3089 0 : rIn.ReadUInt16( nGreen );
3090 0 : rIn.ReadUInt16( nBlue );
3091 :
3092 0 : Color aCol;
3093 0 : aCol = Color( (sal_uInt8)( nRed >> 8 ), (sal_uInt8)( nGreen >> 8 ), (sal_uInt8)( nBlue >> 8 ) );
3094 0 : aHatch.SetColor(aCol);
3095 0 : rIn.ReadInt32( nLTemp ); aHatch.SetDistance(nLTemp);
3096 0 : rIn.ReadInt32( nLTemp ); aHatch.SetAngle(nLTemp);
3097 : }
3098 0 : }
3099 :
3100 0 : XFillHatchItem::XFillHatchItem(SfxItemPool* /*pPool*/, const XHatch& rTheHatch)
3101 : : NameOrIndex( XATTR_FILLHATCH, -1 ),
3102 0 : aHatch(rTheHatch)
3103 : {
3104 0 : }
3105 :
3106 0 : SfxPoolItem* XFillHatchItem::Clone(SfxItemPool* /*pPool*/) const
3107 : {
3108 0 : return new XFillHatchItem(*this);
3109 : }
3110 :
3111 0 : bool XFillHatchItem::operator==(const SfxPoolItem& rItem) const
3112 : {
3113 0 : return ( NameOrIndex::operator==(rItem) &&
3114 0 : aHatch == ((const XFillHatchItem&) rItem).aHatch );
3115 : }
3116 :
3117 0 : SfxPoolItem* XFillHatchItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
3118 : {
3119 0 : return new XFillHatchItem(rIn);
3120 : }
3121 :
3122 0 : SvStream& XFillHatchItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
3123 : {
3124 0 : NameOrIndex::Store( rOut, nItemVersion );
3125 :
3126 0 : if (!IsIndex())
3127 : {
3128 0 : rOut.WriteInt16( (sal_Int16)aHatch.GetHatchStyle() );
3129 :
3130 : sal_uInt16 nTmp;
3131 0 : nTmp = VCLTOSVCOL( aHatch.GetColor().GetRed() ); rOut.WriteUInt16( nTmp );
3132 0 : nTmp = VCLTOSVCOL( aHatch.GetColor().GetGreen() ); rOut.WriteUInt16( nTmp );
3133 0 : nTmp = VCLTOSVCOL( aHatch.GetColor().GetBlue() ); rOut.WriteUInt16( nTmp );
3134 :
3135 0 : rOut.WriteInt32( (sal_Int32) aHatch.GetDistance() );
3136 0 : rOut.WriteInt32( (sal_Int32) aHatch.GetAngle() );
3137 : }
3138 :
3139 0 : return rOut;
3140 : }
3141 :
3142 0 : const XHatch& XFillHatchItem::GetHatchValue() const // GetValue -> GetHatchValue
3143 : {
3144 0 : return aHatch;
3145 : }
3146 :
3147 0 : SfxItemPresentation XFillHatchItem::GetPresentation
3148 : (
3149 : SfxItemPresentation ePres,
3150 : SfxMapUnit /*eCoreUnit*/,
3151 : SfxMapUnit /*ePresUnit*/,
3152 : OUString& rText, const IntlWrapper *
3153 : ) const
3154 : {
3155 0 : switch ( ePres )
3156 : {
3157 : case SFX_ITEM_PRESENTATION_NONE:
3158 0 : rText = OUString();
3159 0 : return ePres;
3160 : case SFX_ITEM_PRESENTATION_NAMELESS:
3161 : case SFX_ITEM_PRESENTATION_COMPLETE:
3162 0 : rText = GetName();
3163 0 : return ePres;
3164 : default:
3165 0 : return SFX_ITEM_PRESENTATION_NONE;
3166 : }
3167 : }
3168 :
3169 0 : bool XFillHatchItem::HasMetrics() const
3170 : {
3171 0 : return true;
3172 : }
3173 :
3174 0 : bool XFillHatchItem::ScaleMetrics(long nMul, long nDiv)
3175 : {
3176 0 : aHatch.SetDistance( ScaleMetricValue( aHatch.GetDistance(), nMul, nDiv ) );
3177 0 : return true;
3178 : }
3179 :
3180 0 : bool XFillHatchItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const
3181 : {
3182 0 : nMemberId &= ~CONVERT_TWIPS;
3183 :
3184 0 : switch ( nMemberId )
3185 : {
3186 : case 0:
3187 : {
3188 0 : uno::Sequence< beans::PropertyValue > aPropSeq( 2 );
3189 :
3190 0 : ::com::sun::star::drawing::Hatch aUnoHatch;
3191 :
3192 0 : aUnoHatch.Style = (::com::sun::star::drawing::HatchStyle)aHatch.GetHatchStyle();
3193 0 : aUnoHatch.Color = aHatch.GetColor().GetColor();
3194 0 : aUnoHatch.Distance = aHatch.GetDistance();
3195 0 : aUnoHatch.Angle = aHatch.GetAngle();
3196 :
3197 0 : OUString aApiName = SvxUnogetApiNameForItem(Which(), GetName());
3198 0 : aPropSeq[0].Name = "Name";
3199 0 : aPropSeq[0].Value = uno::makeAny( aApiName );
3200 0 : aPropSeq[1].Name = "FillHatch";
3201 0 : aPropSeq[1].Value = uno::makeAny( aUnoHatch );
3202 0 : rVal = uno::makeAny( aPropSeq );
3203 0 : break;
3204 : }
3205 :
3206 : case MID_FILLHATCH:
3207 : {
3208 0 : ::com::sun::star::drawing::Hatch aUnoHatch;
3209 :
3210 0 : aUnoHatch.Style = (::com::sun::star::drawing::HatchStyle)aHatch.GetHatchStyle();
3211 0 : aUnoHatch.Color = aHatch.GetColor().GetColor();
3212 0 : aUnoHatch.Distance = aHatch.GetDistance();
3213 0 : aUnoHatch.Angle = aHatch.GetAngle();
3214 0 : rVal <<= aUnoHatch;
3215 0 : break;
3216 : }
3217 :
3218 : case MID_NAME:
3219 : {
3220 0 : OUString aApiName = SvxUnogetApiNameForItem(Which(), GetName());
3221 0 : rVal <<= aApiName;
3222 0 : break;
3223 : }
3224 :
3225 : case MID_HATCH_STYLE:
3226 0 : rVal <<= (::com::sun::star::drawing::HatchStyle)aHatch.GetHatchStyle(); break;
3227 : case MID_HATCH_COLOR:
3228 0 : rVal <<= (sal_Int32)aHatch.GetColor().GetColor(); break;
3229 : case MID_HATCH_DISTANCE:
3230 0 : rVal <<= aHatch.GetDistance(); break;
3231 : case MID_HATCH_ANGLE:
3232 0 : rVal <<= aHatch.GetAngle(); break;
3233 :
3234 0 : default: OSL_FAIL("Wrong MemberId!"); return false;
3235 : }
3236 :
3237 0 : return true;
3238 : }
3239 :
3240 0 : bool XFillHatchItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
3241 : {
3242 0 : nMemberId &= ~CONVERT_TWIPS;
3243 :
3244 0 : switch ( nMemberId )
3245 : {
3246 : case 0:
3247 : {
3248 0 : uno::Sequence< beans::PropertyValue > aPropSeq;
3249 0 : ::com::sun::star::drawing::Hatch aUnoHatch;
3250 0 : OUString aName;
3251 0 : bool bHatch( false );
3252 :
3253 0 : if ( rVal >>= aPropSeq )
3254 : {
3255 0 : for ( sal_Int32 n = 0; n < aPropSeq.getLength(); n++ )
3256 : {
3257 0 : if ( aPropSeq[n].Name == "Name" )
3258 0 : aPropSeq[n].Value >>= aName;
3259 0 : else if ( aPropSeq[n].Name == "FillHatch" )
3260 : {
3261 0 : if ( aPropSeq[n].Value >>= aUnoHatch )
3262 0 : bHatch = true;
3263 : }
3264 : }
3265 :
3266 0 : SetName( aName );
3267 0 : if ( bHatch )
3268 : {
3269 0 : aHatch.SetHatchStyle( (XHatchStyle)aUnoHatch.Style );
3270 0 : aHatch.SetColor( aUnoHatch.Color );
3271 0 : aHatch.SetDistance( aUnoHatch.Distance );
3272 0 : aHatch.SetAngle( aUnoHatch.Angle );
3273 : }
3274 :
3275 0 : return true;
3276 : }
3277 :
3278 0 : return false;
3279 : }
3280 :
3281 : case MID_FILLHATCH:
3282 : {
3283 0 : ::com::sun::star::drawing::Hatch aUnoHatch;
3284 0 : if(!(rVal >>= aUnoHatch))
3285 0 : return false;
3286 :
3287 0 : aHatch.SetHatchStyle( (XHatchStyle)aUnoHatch.Style );
3288 0 : aHatch.SetColor( aUnoHatch.Color );
3289 0 : aHatch.SetDistance( aUnoHatch.Distance );
3290 0 : aHatch.SetAngle( aUnoHatch.Angle );
3291 0 : break;
3292 : }
3293 :
3294 : case MID_NAME:
3295 : {
3296 0 : OUString aName;
3297 0 : if (!(rVal >>= aName ))
3298 0 : return false;
3299 0 : SetName( aName );
3300 0 : break;
3301 : }
3302 :
3303 : case MID_HATCH_STYLE:
3304 : {
3305 0 : sal_Int16 nVal = sal_Int16();
3306 0 : if (!(rVal >>= nVal ))
3307 0 : return false;
3308 0 : aHatch.SetHatchStyle( (XHatchStyle)nVal );
3309 0 : break;
3310 : }
3311 :
3312 : case MID_HATCH_COLOR:
3313 : case MID_HATCH_DISTANCE:
3314 : case MID_HATCH_ANGLE:
3315 : {
3316 0 : sal_Int32 nVal = 0;
3317 0 : if (!(rVal >>= nVal ))
3318 0 : return false;
3319 :
3320 0 : if ( nMemberId == MID_HATCH_COLOR )
3321 0 : aHatch.SetColor( nVal );
3322 0 : else if ( nMemberId == MID_HATCH_DISTANCE )
3323 0 : aHatch.SetDistance( nVal );
3324 : else
3325 0 : aHatch.SetAngle( nVal );
3326 0 : break;
3327 : }
3328 :
3329 0 : default: OSL_FAIL("Wrong MemberId!"); return false;
3330 : }
3331 :
3332 0 : return true;
3333 : }
3334 :
3335 0 : bool XFillHatchItem::CompareValueFunc( const NameOrIndex* p1, const NameOrIndex* p2 )
3336 : {
3337 0 : return ((XFillHatchItem*)p1)->GetHatchValue() == ((XFillHatchItem*)p2)->GetHatchValue();
3338 : }
3339 :
3340 0 : XFillHatchItem* XFillHatchItem::checkForUniqueItem( SdrModel* pModel ) const
3341 : {
3342 0 : if( pModel )
3343 : {
3344 : const OUString aUniqueName = NameOrIndex::CheckNamedItem(
3345 0 : this, XATTR_FILLHATCH, &pModel->GetItemPool(),
3346 0 : pModel->GetStyleSheetPool() ? &pModel->GetStyleSheetPool()->GetPool() : NULL,
3347 : XFillHatchItem::CompareValueFunc, RID_SVXSTR_HATCH10,
3348 0 : pModel->GetPropertyList( XHATCH_LIST ) );
3349 :
3350 : // if the given name is not valid, replace it!
3351 0 : if( aUniqueName != GetName() )
3352 0 : return new XFillHatchItem( aUniqueName, aHatch );
3353 : }
3354 :
3355 0 : return (XFillHatchItem*)this;
3356 : }
3357 :
3358 : // --- form text attributes ---
3359 :
3360 : // class XFormTextStyleItem
3361 :
3362 0 : TYPEINIT1_AUTOFACTORY(XFormTextStyleItem, SfxEnumItem);
3363 :
3364 0 : XFormTextStyleItem::XFormTextStyleItem(XFormTextStyle eTheStyle) :
3365 0 : SfxEnumItem(XATTR_FORMTXTSTYLE, sal::static_int_cast< sal_uInt16 >(eTheStyle))
3366 : {
3367 0 : }
3368 :
3369 0 : XFormTextStyleItem::XFormTextStyleItem(SvStream& rIn) :
3370 0 : SfxEnumItem(XATTR_FORMTXTSTYLE, rIn)
3371 : {
3372 0 : }
3373 :
3374 0 : SfxPoolItem* XFormTextStyleItem::Clone(SfxItemPool* /*pPool*/) const
3375 : {
3376 0 : return new XFormTextStyleItem( *this );
3377 : }
3378 :
3379 0 : SfxPoolItem* XFormTextStyleItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
3380 : {
3381 0 : return new XFormTextStyleItem(rIn);
3382 : }
3383 :
3384 0 : sal_uInt16 XFormTextStyleItem::GetValueCount() const
3385 : {
3386 0 : return 5;
3387 : }
3388 :
3389 0 : bool XFormTextStyleItem::QueryValue( uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
3390 : {
3391 0 : rVal <<= (sal_Int32)GetValue();
3392 0 : return true;
3393 : }
3394 :
3395 0 : bool XFormTextStyleItem::PutValue( const uno::Any& rVal, sal_uInt8 /*nMemberId*/)
3396 : {
3397 0 : sal_Int32 nValue = 0;
3398 0 : rVal >>= nValue;
3399 0 : SetValue(sal::static_int_cast< sal_uInt16 >(nValue));
3400 :
3401 0 : return true;
3402 : }
3403 :
3404 : // class XFormTextAdjustItem
3405 :
3406 0 : TYPEINIT1_AUTOFACTORY(XFormTextAdjustItem, SfxEnumItem);
3407 :
3408 0 : XFormTextAdjustItem::XFormTextAdjustItem(XFormTextAdjust eTheAdjust) :
3409 0 : SfxEnumItem(XATTR_FORMTXTADJUST, sal::static_int_cast< sal_uInt16 >(eTheAdjust))
3410 : {
3411 0 : }
3412 :
3413 0 : XFormTextAdjustItem::XFormTextAdjustItem(SvStream& rIn) :
3414 0 : SfxEnumItem(XATTR_FORMTXTADJUST, rIn)
3415 : {
3416 0 : }
3417 :
3418 0 : SfxPoolItem* XFormTextAdjustItem::Clone(SfxItemPool* /*pPool*/) const
3419 : {
3420 0 : return new XFormTextAdjustItem( *this );
3421 : }
3422 :
3423 0 : SfxPoolItem* XFormTextAdjustItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
3424 : {
3425 0 : return new XFormTextAdjustItem(rIn);
3426 : }
3427 :
3428 0 : sal_uInt16 XFormTextAdjustItem::GetValueCount() const
3429 : {
3430 0 : return 4;
3431 : }
3432 :
3433 0 : bool XFormTextAdjustItem::QueryValue( uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
3434 : {
3435 0 : rVal <<= (sal_Int32)GetValue();
3436 0 : return true;
3437 : }
3438 :
3439 0 : bool XFormTextAdjustItem::PutValue( const uno::Any& rVal, sal_uInt8 /*nMemberId*/)
3440 : {
3441 0 : sal_Int32 nValue = 0;
3442 0 : rVal >>= nValue;
3443 0 : SetValue(sal::static_int_cast< sal_uInt16 >(nValue));
3444 :
3445 0 : return true;
3446 : }
3447 :
3448 : // class XFormTextDistanceItem
3449 :
3450 0 : TYPEINIT1_AUTOFACTORY(XFormTextDistanceItem, SfxMetricItem);
3451 :
3452 0 : XFormTextDistanceItem::XFormTextDistanceItem(long nDist) :
3453 0 : SfxMetricItem(XATTR_FORMTXTDISTANCE, nDist)
3454 : {
3455 0 : }
3456 :
3457 0 : XFormTextDistanceItem::XFormTextDistanceItem(SvStream& rIn) :
3458 0 : SfxMetricItem(XATTR_FORMTXTDISTANCE, rIn)
3459 : {
3460 0 : }
3461 :
3462 0 : SfxPoolItem* XFormTextDistanceItem::Clone(SfxItemPool* /*pPool*/) const
3463 : {
3464 0 : return new XFormTextDistanceItem(*this);
3465 : }
3466 :
3467 0 : SfxPoolItem* XFormTextDistanceItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
3468 : {
3469 0 : return new XFormTextDistanceItem(rIn);
3470 : }
3471 :
3472 : // class XFormTextStartItem
3473 :
3474 0 : TYPEINIT1_AUTOFACTORY(XFormTextStartItem, SfxMetricItem);
3475 :
3476 0 : XFormTextStartItem::XFormTextStartItem(long nStart) :
3477 0 : SfxMetricItem(XATTR_FORMTXTSTART, nStart)
3478 : {
3479 0 : }
3480 :
3481 0 : XFormTextStartItem::XFormTextStartItem(SvStream& rIn) :
3482 0 : SfxMetricItem(XATTR_FORMTXTSTART, rIn)
3483 : {
3484 0 : }
3485 :
3486 0 : SfxPoolItem* XFormTextStartItem::Clone(SfxItemPool* /*pPool*/) const
3487 : {
3488 0 : return new XFormTextStartItem(*this);
3489 : }
3490 :
3491 0 : SfxPoolItem* XFormTextStartItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
3492 : {
3493 0 : return new XFormTextStartItem(rIn);
3494 : }
3495 :
3496 : // class XFormTextMirrorItem
3497 :
3498 0 : TYPEINIT1_AUTOFACTORY(XFormTextMirrorItem, SfxBoolItem);
3499 :
3500 0 : XFormTextMirrorItem::XFormTextMirrorItem(bool bMirror) :
3501 0 : SfxBoolItem(XATTR_FORMTXTMIRROR, bMirror)
3502 : {
3503 0 : }
3504 :
3505 0 : XFormTextMirrorItem::XFormTextMirrorItem(SvStream& rIn) :
3506 0 : SfxBoolItem(XATTR_FORMTXTMIRROR, rIn)
3507 : {
3508 0 : }
3509 :
3510 0 : SfxPoolItem* XFormTextMirrorItem::Clone(SfxItemPool* /*pPool*/) const
3511 : {
3512 0 : return new XFormTextMirrorItem(*this);
3513 : }
3514 :
3515 0 : SfxPoolItem* XFormTextMirrorItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
3516 : {
3517 0 : return new XFormTextMirrorItem(rIn);
3518 : }
3519 :
3520 : // class XFormTextOutlineItem
3521 :
3522 0 : TYPEINIT1_AUTOFACTORY(XFormTextOutlineItem, SfxBoolItem);
3523 :
3524 0 : XFormTextOutlineItem::XFormTextOutlineItem(bool bOutline) :
3525 0 : SfxBoolItem(XATTR_FORMTXTOUTLINE, bOutline)
3526 : {
3527 0 : }
3528 :
3529 0 : XFormTextOutlineItem::XFormTextOutlineItem(SvStream& rIn) :
3530 0 : SfxBoolItem(XATTR_FORMTXTOUTLINE, rIn)
3531 : {
3532 0 : }
3533 :
3534 0 : SfxPoolItem* XFormTextOutlineItem::Clone(SfxItemPool* /*pPool*/) const
3535 : {
3536 0 : return new XFormTextOutlineItem(*this);
3537 : }
3538 :
3539 0 : SfxPoolItem* XFormTextOutlineItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
3540 : {
3541 0 : return new XFormTextOutlineItem(rIn);
3542 : }
3543 :
3544 : // class XFormTextShadowItem
3545 :
3546 0 : TYPEINIT1_AUTOFACTORY(XFormTextShadowItem, SfxEnumItem);
3547 :
3548 0 : XFormTextShadowItem::XFormTextShadowItem(XFormTextShadow eFormTextShadow) :
3549 : SfxEnumItem(
3550 0 : XATTR_FORMTXTSHADOW, sal::static_int_cast< sal_uInt16 >(eFormTextShadow))
3551 : {
3552 0 : }
3553 :
3554 0 : XFormTextShadowItem::XFormTextShadowItem(SvStream& rIn) :
3555 0 : SfxEnumItem(XATTR_FORMTXTSHADOW, rIn)
3556 : {
3557 0 : }
3558 :
3559 0 : SfxPoolItem* XFormTextShadowItem::Clone(SfxItemPool* /*pPool*/) const
3560 : {
3561 0 : return new XFormTextShadowItem( *this );
3562 : }
3563 :
3564 0 : SfxPoolItem* XFormTextShadowItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
3565 : {
3566 0 : return new XFormTextShadowItem(rIn);
3567 : }
3568 :
3569 0 : sal_uInt16 XFormTextShadowItem::GetValueCount() const
3570 : {
3571 0 : return 3;
3572 : }
3573 :
3574 0 : bool XFormTextShadowItem::QueryValue( uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
3575 : {
3576 0 : rVal <<= (sal_Int32)GetValue();
3577 0 : return true;
3578 : }
3579 :
3580 0 : bool XFormTextShadowItem::PutValue( const uno::Any& rVal, sal_uInt8 /*nMemberId*/)
3581 : {
3582 0 : sal_Int32 nValue = 0;
3583 0 : rVal >>= nValue;
3584 0 : SetValue(sal::static_int_cast< sal_uInt16 >(nValue));
3585 :
3586 0 : return true;
3587 : }
3588 :
3589 : // class XFormTextShadowColorItem
3590 :
3591 0 : TYPEINIT1_AUTOFACTORY(XFormTextShadowColorItem, XColorItem);
3592 :
3593 0 : XFormTextShadowColorItem::XFormTextShadowColorItem(const OUString& rName,
3594 : const Color& rTheColor) :
3595 0 : XColorItem(XATTR_FORMTXTSHDWCOLOR, rName, rTheColor)
3596 : {
3597 0 : }
3598 :
3599 0 : XFormTextShadowColorItem::XFormTextShadowColorItem(SvStream& rIn) :
3600 0 : XColorItem(XATTR_FORMTXTSHDWCOLOR, rIn)
3601 : {
3602 0 : }
3603 :
3604 0 : SfxPoolItem* XFormTextShadowColorItem::Clone(SfxItemPool* /*pPool*/) const
3605 : {
3606 0 : return new XFormTextShadowColorItem(*this);
3607 : }
3608 :
3609 0 : SfxPoolItem* XFormTextShadowColorItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
3610 : {
3611 0 : return new XFormTextShadowColorItem(rIn);
3612 : }
3613 :
3614 : // class XFormTextShadowXValItem
3615 :
3616 0 : TYPEINIT1_AUTOFACTORY(XFormTextShadowXValItem, SfxMetricItem);
3617 :
3618 0 : XFormTextShadowXValItem::XFormTextShadowXValItem(long nVal) :
3619 0 : SfxMetricItem(XATTR_FORMTXTSHDWXVAL, nVal)
3620 : {
3621 0 : }
3622 :
3623 0 : XFormTextShadowXValItem::XFormTextShadowXValItem(SvStream& rIn) :
3624 0 : SfxMetricItem(XATTR_FORMTXTSHDWXVAL, rIn)
3625 : {
3626 0 : }
3627 :
3628 0 : SfxPoolItem* XFormTextShadowXValItem::Clone(SfxItemPool* /*pPool*/) const
3629 : {
3630 0 : return new XFormTextShadowXValItem(*this);
3631 : }
3632 :
3633 0 : SfxPoolItem* XFormTextShadowXValItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
3634 : {
3635 0 : return new XFormTextShadowXValItem(rIn);
3636 : }
3637 :
3638 : // class XFormTextShadowYValItem
3639 :
3640 0 : TYPEINIT1_AUTOFACTORY(XFormTextShadowYValItem, SfxMetricItem);
3641 :
3642 0 : XFormTextShadowYValItem::XFormTextShadowYValItem(long nVal) :
3643 0 : SfxMetricItem(XATTR_FORMTXTSHDWYVAL, nVal)
3644 : {
3645 0 : }
3646 :
3647 0 : XFormTextShadowYValItem::XFormTextShadowYValItem(SvStream& rIn) :
3648 0 : SfxMetricItem(XATTR_FORMTXTSHDWYVAL, rIn)
3649 : {
3650 0 : }
3651 :
3652 0 : SfxPoolItem* XFormTextShadowYValItem::Clone(SfxItemPool* /*pPool*/) const
3653 : {
3654 0 : return new XFormTextShadowYValItem(*this);
3655 : }
3656 :
3657 0 : SfxPoolItem* XFormTextShadowYValItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
3658 : {
3659 0 : return new XFormTextShadowYValItem(rIn);
3660 : }
3661 :
3662 : // class XFormTextHideFormItem
3663 :
3664 0 : TYPEINIT1_AUTOFACTORY(XFormTextHideFormItem, SfxBoolItem);
3665 :
3666 0 : XFormTextHideFormItem::XFormTextHideFormItem(bool bHide) :
3667 0 : SfxBoolItem(XATTR_FORMTXTHIDEFORM, bHide)
3668 : {
3669 0 : }
3670 :
3671 0 : XFormTextHideFormItem::XFormTextHideFormItem(SvStream& rIn) :
3672 0 : SfxBoolItem(XATTR_FORMTXTHIDEFORM, rIn)
3673 : {
3674 0 : }
3675 :
3676 0 : SfxPoolItem* XFormTextHideFormItem::Clone(SfxItemPool* /*pPool*/) const
3677 : {
3678 0 : return new XFormTextHideFormItem(*this);
3679 : }
3680 :
3681 0 : SfxPoolItem* XFormTextHideFormItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
3682 : {
3683 0 : return new XFormTextHideFormItem(rIn);
3684 : }
3685 :
3686 : // --- SetItems ---
3687 :
3688 0 : TYPEINIT1(XLineAttrSetItem, SfxSetItem);
3689 :
3690 : /// a line attribute set item
3691 0 : XLineAttrSetItem::XLineAttrSetItem( SfxItemSet* pItemSet ) :
3692 0 : SfxSetItem( XATTRSET_LINE, pItemSet)
3693 : {
3694 0 : }
3695 :
3696 0 : XLineAttrSetItem::XLineAttrSetItem( SfxItemPool* pItemPool ) :
3697 : SfxSetItem( XATTRSET_LINE,
3698 0 : new SfxItemSet( *pItemPool, XATTR_LINE_FIRST, XATTR_LINE_LAST))
3699 : {
3700 0 : }
3701 :
3702 0 : XLineAttrSetItem::XLineAttrSetItem( const XLineAttrSetItem& rLineAttr ) :
3703 0 : SfxSetItem( rLineAttr )
3704 : {
3705 0 : }
3706 :
3707 0 : XLineAttrSetItem::XLineAttrSetItem( const XLineAttrSetItem& rLineAttr,
3708 : SfxItemPool* pItemPool) :
3709 0 : SfxSetItem( rLineAttr, pItemPool )
3710 : {
3711 0 : }
3712 :
3713 0 : SfxPoolItem* XLineAttrSetItem::Clone( SfxItemPool* pPool ) const
3714 : {
3715 0 : return new XLineAttrSetItem( *this, pPool );
3716 : }
3717 :
3718 : /// create a set item out of a stream
3719 0 : SfxPoolItem* XLineAttrSetItem::Create( SvStream& rStream, sal_uInt16 /*nVersion*/) const
3720 : {
3721 0 : SfxItemSet *pSet2 = new SfxItemSet( *GetItemSet().GetPool(),
3722 0 : XATTR_LINE_FIRST, XATTR_LINE_LAST);
3723 0 : pSet2->Load( rStream );
3724 0 : return new XLineAttrSetItem( pSet2 );
3725 : }
3726 :
3727 : /// save a set item in a stream
3728 0 : SvStream& XLineAttrSetItem::Store( SvStream& rStream, sal_uInt16 nItemVersion ) const
3729 : {
3730 0 : return SfxSetItem::Store( rStream, nItemVersion );
3731 : }
3732 :
3733 :
3734 0 : TYPEINIT1(XFillAttrSetItem, SfxSetItem);
3735 :
3736 : /// fill attribute set item
3737 0 : XFillAttrSetItem::XFillAttrSetItem( SfxItemSet* pItemSet ) :
3738 0 : SfxSetItem( XATTRSET_FILL, pItemSet)
3739 : {
3740 0 : }
3741 :
3742 0 : XFillAttrSetItem::XFillAttrSetItem( SfxItemPool* pItemPool ) :
3743 : SfxSetItem( XATTRSET_FILL,
3744 0 : new SfxItemSet( *pItemPool, XATTR_FILL_FIRST, XATTR_FILL_LAST))
3745 : {
3746 0 : }
3747 :
3748 0 : XFillAttrSetItem::XFillAttrSetItem( const XFillAttrSetItem& rFillAttr ) :
3749 0 : SfxSetItem( rFillAttr )
3750 : {
3751 0 : }
3752 :
3753 0 : XFillAttrSetItem::XFillAttrSetItem( const XFillAttrSetItem& rFillAttr,
3754 : SfxItemPool* pItemPool ) :
3755 0 : SfxSetItem( rFillAttr, pItemPool )
3756 : {
3757 0 : }
3758 :
3759 0 : SfxPoolItem* XFillAttrSetItem::Clone( SfxItemPool* pPool ) const
3760 : {
3761 0 : return new XFillAttrSetItem( *this, pPool );
3762 : }
3763 :
3764 : /// create a set item out of a stream
3765 0 : SfxPoolItem* XFillAttrSetItem::Create( SvStream& rStream, sal_uInt16 /*nVersion*/) const
3766 : {
3767 0 : SfxItemSet *pSet2 = new SfxItemSet( *GetItemSet().GetPool(),
3768 0 : XATTR_FILL_FIRST, XATTR_FILL_LAST);
3769 0 : pSet2->Load( rStream );
3770 0 : return new XFillAttrSetItem( pSet2 );
3771 : }
3772 :
3773 : /// save a set item in a stream
3774 0 : SvStream& XFillAttrSetItem::Store( SvStream& rStream, sal_uInt16 nItemVersion ) const
3775 : {
3776 0 : return SfxSetItem::Store( rStream, nItemVersion );
3777 : }
3778 :
3779 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|