xref: /AOO41X/main/svx/source/xoutdev/xattr.cxx (revision 7b6b9ddb4b63a97ea0214b9472b5270bbf674949)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 
27 // include ---------------------------------------------------------------
28 #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
29 #include <com/sun/star/drawing/Hatch.hpp>
30 #include <com/sun/star/drawing/LineStyle.hpp>
31 #include <com/sun/star/drawing/LineDash.hpp>
32 #include <com/sun/star/drawing/DashStyle.hpp>
33 #include <com/sun/star/awt/Point.hpp>
34 #include <com/sun/star/drawing/PointSequence.hpp>
35 #include <com/sun/star/drawing/FillStyle.hpp>
36 #include <com/sun/star/awt/Gradient.hpp>
37 #include <com/sun/star/uno/Sequence.hxx>
38 #include <com/sun/star/beans/PropertyValue.hpp>
39 #include <svl/itempool.hxx>
40 #include <editeng/memberids.hrc>
41 #include <tools/stream.hxx>
42 
43 #include "svx/unoapi.hxx"
44 #include <svl/style.hxx>
45 #include "unopolyhelper.hxx"
46 
47 #include <tools/bigint.hxx>
48 #include <svl/itemset.hxx>
49 #include <svx/dialogs.hrc>
50 #include "svx/svdstr.hrc"
51 #include "svx/xattr.hxx"
52 #include <svx/xtable.hxx>
53 #include <svx/dialmgr.hxx>
54 #include <editeng/itemtype.hxx>
55 #include <svx/xdef.hxx>
56 #include <svx/unomid.hxx>
57 #include <svx/svdmodel.hxx>
58 #include <basegfx/polygon/b2dpolygon.hxx>
59 #include <basegfx/point/b2dpoint.hxx>
60 #include <basegfx/vector/b2dvector.hxx>
61 
62 #include <stdio.h>
63 
64 using namespace ::rtl;
65 using namespace ::com::sun::star;
66 
67 #define GLOBALOVERFLOW
68 
69 #define TWIP_TO_MM100(TWIP)     ((TWIP) >= 0 ? (((TWIP)*127L+36L)/72L) : (((TWIP)*127L-36L)/72L))
70 #define MM100_TO_TWIP(MM100)    ((MM100) >= 0 ? (((MM100)*72L+63L)/127L) : (((MM100)*72L-63L)/127L))
71 
72 /************************************************************************/
73 
74 #define VCLTOSVCOL( rCol ) (sal_uInt16)((((sal_uInt16)(rCol))<<8)|(rCol))
75 
76 /************************************************************************/
77 
78 XubString aNameOrIndexEmptyString;
79 
80 TYPEINIT1_AUTOFACTORY(NameOrIndex, SfxStringItem);
81 
82 /*************************************************************************
83 |*
84 |*
85 |*
86 \*************************************************************************/
87 
88 long ScaleMetricValue( long nVal, long nMul, long nDiv )
89 {
90     BigInt aVal( nVal );
91 
92     aVal *= nMul;
93 
94     if ( aVal.IsNeg() != ( nDiv < 0 ) )
95         aVal-=nDiv/2; // fuer korrektes Runden
96     else
97         aVal+=nDiv/2; // fuer korrektes Runden
98 
99     aVal/=nDiv;
100 
101     return long( aVal );
102 }
103 
104 /*************************************************************************
105 |*
106 |*    NameOrIndex::NameOrIndex(sal_uInt16 nWhich, sal_Int32 nIndex)
107 |*
108 |*    Beschreibung
109 |*    Ersterstellung    14.11.94
110 |*    Letzte Aenderung  14.11.94
111 |*
112 *************************************************************************/
113 
114 NameOrIndex::NameOrIndex(sal_uInt16 _nWhich, sal_Int32 nIndex) :
115     SfxStringItem(_nWhich, aNameOrIndexEmptyString),
116     nPalIndex(nIndex)
117 {
118 }
119 
120 /*************************************************************************
121 |*
122 |*    NameOrIndex::NameOrIndex(sal_uInt16 nWhich, const String& rName)
123 |*
124 |*    Beschreibung
125 |*    Ersterstellung    14.11.94
126 |*    Letzte Aenderung  14.11.94
127 |*
128 *************************************************************************/
129 
130 NameOrIndex::NameOrIndex(sal_uInt16 _nWhich, const XubString& rName) :
131     SfxStringItem(_nWhich, rName),
132     nPalIndex(-1)
133 {
134 }
135 
136 /*************************************************************************
137 |*
138 |*    NameOrIndex::NameOrIndex(sal_uInt16 nWhich, SvStream& rIn)
139 |*
140 |*    Beschreibung
141 |*    Ersterstellung    14.11.94
142 |*    Letzte Aenderung  14.11.94
143 |*
144 *************************************************************************/
145 
146 NameOrIndex::NameOrIndex(sal_uInt16 _nWhich, SvStream& rIn) :
147     SfxStringItem(_nWhich, rIn)
148 {
149     rIn >> nPalIndex;
150 }
151 
152 /*************************************************************************
153 |*
154 |*    NameOrIndex::NameOrIndex(const NameOrIndex& rNameOrIndex)
155 |*
156 |*    Beschreibung
157 |*    Ersterstellung    14.11.94
158 |*    Letzte Aenderung  14.11.94
159 |*
160 *************************************************************************/
161 
162 NameOrIndex::NameOrIndex(const NameOrIndex& rNameOrIndex) :
163     SfxStringItem(rNameOrIndex),
164     nPalIndex(rNameOrIndex.nPalIndex)
165 {
166 }
167 
168 /*************************************************************************
169 |*
170 |*    int NameOrIndex::operator==(const SfxPoolItem& rItem) const
171 |*
172 |*    Beschreibung
173 |*    Ersterstellung    14.11.94
174 |*    Letzte Aenderung  14.11.94
175 |*
176 *************************************************************************/
177 
178 int NameOrIndex::operator==(const SfxPoolItem& rItem) const
179 {
180     return ( SfxStringItem::operator==(rItem) &&
181             ((const NameOrIndex&) rItem).nPalIndex == nPalIndex );
182 }
183 
184 /*************************************************************************
185 |*
186 |*    SfxPoolItem* NameOrIndex::Clone(SfxItemPool* pPool) const
187 |*
188 |*    Beschreibung
189 |*    Ersterstellung    14.11.94
190 |*    Letzte Aenderung  14.11.94
191 |*
192 *************************************************************************/
193 
194 SfxPoolItem* NameOrIndex::Clone(SfxItemPool* /*pPool*/) const
195 {
196 
197     return new NameOrIndex(*this);
198 }
199 
200 /*************************************************************************
201 |*
202 |*    SfxPoolItem* NameOrIndex::Create(SvStream& rIn, sal_uInt16 nVer) const
203 |*
204 |*    Beschreibung
205 |*    Ersterstellung    14.11.94
206 |*    Letzte Aenderung  14.11.94
207 |*
208 *************************************************************************/
209 
210 SfxPoolItem* NameOrIndex::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
211 {
212     return new NameOrIndex(Which(), rIn);
213 }
214 
215 /*************************************************************************
216 |*
217 |*    SvStream* NameOrIndex::Store(SvStream& rIn) const
218 |*
219 |*    Beschreibung
220 |*    Ersterstellung    14.11.94
221 |*    Letzte Aenderung  14.11.94
222 |*
223 *************************************************************************/
224 
225 SvStream& NameOrIndex::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
226 {
227     SfxStringItem::Store( rOut, nItemVersion );
228     rOut << nPalIndex;
229     return rOut;
230 }
231 
232 /** this static checks if the given NameOrIndex item has a unique name for its value.
233     The returned String is a unique name for an item with this value in both given pools.
234     Argument pPool2 can be null.
235     If returned string equals NameOrIndex->GetName(), the name was already unique.
236 */
237 String NameOrIndex::CheckNamedItem( const NameOrIndex* pCheckItem, const sal_uInt16 nWhich, const SfxItemPool* pPool1, const SfxItemPool* /*pPool2*/, SvxCompareValueFunc pCompareValueFunc, sal_uInt16 nPrefixResId, XPropertyList* pDefaults )
238 {
239     sal_Bool bForceNew = sal_False;
240 
241     String aUniqueName;
242     SvxUnogetInternalNameForItem( nWhich, pCheckItem->GetName(), aUniqueName );
243 
244     // 2. if we have a name check if there is already an item with the
245     // same name in the documents pool with a different line end or start
246 
247     if( aUniqueName.Len() && pPool1 )
248     {
249         const sal_uInt32 nCount = pPool1->GetItemCount2( nWhich );
250 
251         const NameOrIndex *pItem;
252         for( sal_uInt32 nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
253         {
254             pItem = (NameOrIndex*)pPool1->GetItem2( nWhich, nSurrogate );
255 
256             if( pItem && ( pItem->GetName() == pCheckItem->GetName() ) )
257             {
258                 // if there is already an item with the same name and the same
259                 // value its ok to set it
260                 if( !pCompareValueFunc( pItem, pCheckItem ) )
261                 {
262                     // same name but different value, we need a new name for this item
263                     aUniqueName = String();
264                     bForceNew = sal_True;
265                 }
266                 break;
267             }
268         }
269     }
270 
271     // if we have no name yet, find existing item with same conent or
272     // create a unique name
273     if( aUniqueName.Len() == 0 )
274     {
275         sal_Int32 nUserIndex = 1;
276         const ResId aRes(SVX_RES(nPrefixResId));
277         String aUser( aRes );
278         aUser += sal_Unicode( ' ' );
279 
280         if( pDefaults )
281         {
282             const int nCount = pDefaults->Count();
283             int nIndex;
284             for( nIndex = 0; nIndex < nCount; nIndex++ )
285             {
286                 XPropertyEntry* pEntry = pDefaults->Get( nIndex, 0 );
287                 if( pEntry )
288                 {
289                     bool bFound = false;
290 
291                     switch( nWhich )
292                     {
293                     case XATTR_FILLBITMAP:
294                     {
295                         const GraphicObject& rGraphicObjectA(((XFillBitmapItem*)pCheckItem)->GetGraphicObject());
296                         const GraphicObject& rGraphicObjectB(((XBitmapEntry*)pEntry)->GetGraphicObject());
297 
298                         bFound = (rGraphicObjectA == rGraphicObjectB);
299                         break;
300                     }
301                     case XATTR_LINEDASH:
302                         bFound = (((XLineDashItem*)pCheckItem)->GetDashValue() == ((XDashEntry*)pEntry) ->GetDash());
303                         break;
304                     case XATTR_LINESTART:
305                         bFound = (((XLineStartItem*)pCheckItem)->GetLineStartValue() == ((XLineEndEntry*)pEntry)->GetLineEnd());
306                         break;
307                     case XATTR_LINEEND:
308                         bFound = (((XLineEndItem*)pCheckItem)->GetLineEndValue() == ((XLineEndEntry*)pEntry)->GetLineEnd());
309                         break;
310                     case XATTR_FILLGRADIENT:
311                         bFound = (((XFillGradientItem*)pCheckItem)->GetGradientValue() == ((XGradientEntry*)pEntry)->GetGradient());
312                         break;
313                     case XATTR_FILLHATCH:
314                         bFound = (((XFillHatchItem*)pCheckItem)->GetHatchValue() == ((XHatchEntry*)pEntry)->GetHatch());
315                         break;
316                     }
317 
318                     if( bFound )
319                     {
320                         aUniqueName = pEntry->GetName();
321                         break;
322                     }
323                     else
324                     {
325                         sal_Int32 nThisIndex = pEntry->GetName().Copy( aUser.Len() ).ToInt32();
326                         if( nThisIndex >= nUserIndex )
327                             nUserIndex = nThisIndex + 1;
328                     }
329                 }
330             }
331         }
332 
333         if( (aUniqueName.Len() == 0) && pPool1 )
334         {
335             const sal_uInt32 nCount = pPool1->GetItemCount2( nWhich );
336             const NameOrIndex *pItem;
337             for( sal_uInt32 nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
338             {
339                 pItem = (NameOrIndex*)pPool1->GetItem2( nWhich, nSurrogate );
340 
341                 if( pItem && pItem->GetName().Len() )
342                 {
343                     if( !bForceNew && pCompareValueFunc( pItem, pCheckItem ) )
344                         return pItem->GetName();
345 
346                     if( pItem->GetName().CompareTo( aUser, aUser.Len() ) == 0 )
347                     {
348                         sal_Int32 nThisIndex = pItem->GetName().Copy( aUser.Len() ).ToInt32();
349                         if( nThisIndex >= nUserIndex )
350                             nUserIndex = nThisIndex + 1;
351                     }
352                 }
353             }
354             aUniqueName = aUser;
355             aUniqueName += String::CreateFromInt32( nUserIndex );
356         }
357     }
358 
359     return aUniqueName;
360 }
361 
362 //*************************************************************************
363 
364 // -------------------
365 // class XColorItem
366 // -------------------
367 TYPEINIT1_AUTOFACTORY(XColorItem, NameOrIndex);
368 
369 /*************************************************************************
370 |*
371 |*    XColorItem::XColorItem(sal_uInt16 nWhich, sal_Int32 nIndex, const Color& rTheColor)
372 |*
373 \************************************************************************/
374 
375 XColorItem::XColorItem(sal_uInt16 _nWhich, sal_Int32 nIndex, const Color& rTheColor) :
376     NameOrIndex(_nWhich, nIndex),
377     aColor(rTheColor)
378 {
379 }
380 
381 /*************************************************************************
382 |*
383 |*    XColorItem::XColorItem(sal_uInt16 nWhich, const String& rName, const Color& rTheColor)
384 |*
385 \************************************************************************/
386 
387 XColorItem::XColorItem(sal_uInt16 _nWhich, const XubString& rName, const Color& rTheColor) :
388     NameOrIndex(_nWhich, rName),
389     aColor(rTheColor)
390 {
391 }
392 
393 /*************************************************************************
394 |*
395 |*    XColorItem::XColorItem(const XColorItem& rItem)
396 |*
397 \************************************************************************/
398 
399 XColorItem::XColorItem(const XColorItem& rItem) :
400     NameOrIndex(rItem),
401     aColor(rItem.aColor)
402 {
403 }
404 
405 /*************************************************************************
406 |*
407 |*    XColorItem::XColorItem(sal_uInt16 nWhich, SvStream& rIn)
408 |*
409 \************************************************************************/
410 
411 XColorItem::XColorItem(sal_uInt16 _nWhich, SvStream& rIn) :
412     NameOrIndex(_nWhich, rIn)
413 {
414     if (!IsIndex())
415     {
416         rIn >> aColor;
417     }
418 }
419 
420 /*************************************************************************
421 |*
422 |*    XColorItem::Clone(SfxItemPool* pPool) const
423 |*
424 \************************************************************************/
425 
426 SfxPoolItem* XColorItem::Clone(SfxItemPool* /*pPool*/) const
427 {
428     return new XColorItem(*this);
429 }
430 
431 /*************************************************************************
432 |*
433 |*    int XColorItem::operator==(const SfxPoolItem& rItem) const
434 |*
435 \************************************************************************/
436 
437 int XColorItem::operator==(const SfxPoolItem& rItem) const
438 {
439     return ( NameOrIndex::operator==(rItem) &&
440             ((const XColorItem&) rItem).aColor == aColor );
441 }
442 
443 /*************************************************************************
444 |*
445 |*    SfxPoolItem* XColorItem::Create(SvStream& rIn, sal_uInt16 nVer) const
446 |*
447 \************************************************************************/
448 
449 SfxPoolItem* XColorItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
450 {
451     return new XColorItem(Which(), rIn);
452 }
453 
454 /*************************************************************************
455 |*
456 |*    SfxPoolItem* XColorItem::Store(SvStream& rOut) const
457 |*
458 \************************************************************************/
459 
460 SvStream& XColorItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
461 {
462     NameOrIndex::Store( rOut, nItemVersion );
463 
464     if ( !IsIndex() )
465     {
466         rOut << aColor;
467     }
468 
469     return rOut;
470 }
471 
472 /*************************************************************************
473 |*
474 |*    const XColor& XColorItem::GetColorValue(const XColorTable* pTable) const
475 |*
476 \************************************************************************/
477 
478 const Color& XColorItem::GetColorValue(const XColorTable* pTable) const
479 {
480     if (!IsIndex())
481         return aColor;
482     else
483         return pTable->GetColor(GetIndex())->GetColor();
484 
485 }
486 
487 sal_Bool XColorItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
488 {
489     rVal <<= (sal_Int32)GetColorValue().GetRGBColor();
490     return sal_True;
491 }
492 
493 sal_Bool XColorItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
494 {
495     sal_Int32 nValue = 0;
496     rVal >>= nValue;
497     SetColorValue( nValue );
498 
499     return sal_True;
500 }
501 
502 
503 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
504 //                           Linienattribute
505 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
506 
507 //---------------------
508 // class XLineStyleItem
509 //---------------------
510 TYPEINIT1_AUTOFACTORY(XLineStyleItem, SfxEnumItem);
511 
512 /*************************************************************************
513 |*
514 |*    XLineStyleItem::XLineStyleItem(XLineStyle eTheLineStyle)
515 |*
516 |*    Beschreibung
517 |*    Ersterstellung    15.11.94
518 |*    Letzte Aenderung  18.11.94
519 |*
520 *************************************************************************/
521 
522 XLineStyleItem::XLineStyleItem(XLineStyle eTheLineStyle) :
523     SfxEnumItem(XATTR_LINESTYLE, sal::static_int_cast< sal_uInt16 >(eTheLineStyle))
524 {
525 }
526 
527 /*************************************************************************
528 |*
529 |*    XLineStyleItem::XLineStyleItem(SvStream& rIn)
530 |*
531 |*    Beschreibung
532 |*    Ersterstellung    15.11.94
533 |*    Letzte Aenderung  15.11.94
534 |*
535 *************************************************************************/
536 
537 XLineStyleItem::XLineStyleItem(SvStream& rIn) :
538     SfxEnumItem(XATTR_LINESTYLE, rIn)
539 {
540 }
541 
542 /*************************************************************************
543 |*
544 |*    XLineStyleItem::Clone(SfxItemPool* pPool) const
545 |*
546 |*    Beschreibung
547 |*    Ersterstellung    09.11.94
548 |*    Letzte Aenderung  09.11.94
549 |*
550 *************************************************************************/
551 
552 SfxPoolItem* XLineStyleItem::Clone(SfxItemPool* /*pPool*/) const
553 {
554     return new XLineStyleItem( *this );
555 }
556 
557 /*************************************************************************
558 |*
559 |*    SfxPoolItem* XLineStyleItem::Create(SvStream& rIn, sal_uInt16 nVer) const
560 |*
561 |*    Beschreibung
562 |*    Ersterstellung    15.11.94
563 |*    Letzte Aenderung  15.11.94
564 |*
565 *************************************************************************/
566 
567 SfxPoolItem* XLineStyleItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
568 {
569     return new XLineStyleItem(rIn);
570 }
571 
572 //------------------------------------------------------------------------
573 
574 SfxItemPresentation XLineStyleItem::GetPresentation
575 (
576     SfxItemPresentation ePres,
577     SfxMapUnit          /*eCoreUnit*/,
578     SfxMapUnit          /*ePresUnit*/,
579     XubString&          rText, const IntlWrapper *
580 )   const
581 {
582     rText.Erase();
583 
584     switch ( ePres )
585     {
586         case SFX_ITEM_PRESENTATION_NONE:
587             return ePres;
588         case SFX_ITEM_PRESENTATION_COMPLETE:
589         case SFX_ITEM_PRESENTATION_NAMELESS:
590         {
591             sal_uInt16 nId = 0;
592 
593             switch( (sal_uInt16)GetValue() )
594             {
595                 case XLINE_NONE:
596                     nId = RID_SVXSTR_INVISIBLE;
597                     break;
598                 case XLINE_SOLID:
599                     nId = RID_SVXSTR_SOLID;
600                     break;
601             }
602 
603             if ( nId )
604                 rText = SVX_RESSTR( nId );
605             return ePres;
606         }
607         default:
608             return SFX_ITEM_PRESENTATION_NONE;
609     }
610 }
611 
612 sal_Bool XLineStyleItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
613 {
614     ::com::sun::star::drawing::LineStyle eLS = (::com::sun::star::drawing::LineStyle)GetValue();
615     rVal <<= eLS;
616     return sal_True;
617 }
618 
619 sal_Bool XLineStyleItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
620 {
621     ::com::sun::star::drawing::LineStyle eLS;
622     if(!(rVal >>= eLS ))
623     {
624         // also try an int (for Basic)
625         sal_Int32 nLS = 0;
626         if(!(rVal >>= nLS))
627             return sal_False;
628         eLS = (::com::sun::star::drawing::LineStyle)nLS;
629     }
630 
631     SetValue( sal::static_int_cast< sal_uInt16 >( eLS ) );
632     return sal_True;
633 }
634 
635 //------------------------------------------------------------------------
636 
637 sal_uInt16 XLineStyleItem::GetValueCount() const
638 {
639     return 3;
640 }
641 
642 
643 // ------------
644 // class XDash
645 // ------------
646 /*************************************************************************
647 |*
648 |*    XDash::XDash(XDashStyle, sal_uInt16, sal_uIntPtr, sal_uInt16, sal_uIntPtr, sal_uIntPtr)
649 |*
650 |*    Beschreibung
651 |*    Ersterstellung    21.11.94
652 |*    Letzte Aenderung  21.11.94
653 |*
654 *************************************************************************/
655 
656 XDash::XDash(XDashStyle eTheDash, sal_uInt16 nTheDots, sal_uIntPtr nTheDotLen,
657              sal_uInt16 nTheDashes, sal_uIntPtr nTheDashLen, sal_uIntPtr nTheDistance) :
658     eDash(eTheDash),
659     nDots(nTheDots),
660     nDotLen(nTheDotLen),
661     nDashes(nTheDashes),
662     nDashLen(nTheDashLen),
663     nDistance(nTheDistance)
664 {
665 }
666 
667 /*************************************************************************
668 |*
669 |*    int XDash::operator==(const SfxPoolItem& rItem) const
670 |*
671 |*    Beschreibung
672 |*    Ersterstellung    29.11.94
673 |*    Letzte Aenderung  29.11.94
674 |*
675 *************************************************************************/
676 
677 bool XDash::operator==(const XDash& rDash) const
678 {
679     return ( eDash      == rDash.eDash      &&
680              nDots      == rDash.nDots      &&
681              nDotLen    == rDash.nDotLen    &&
682              nDashes    == rDash.nDashes    &&
683              nDashLen   == rDash.nDashLen   &&
684              nDistance  == rDash.nDistance );
685 }
686 
687 // XDash is translated into an array of doubles which describe the lengths of the
688 // dashes, dots and empty passages. It returns the complete length of the full DashDot
689 // sequence and fills the given vetor of doubles accordingly (also resizing, so deleting it).
690 static double SMALLEST_DASH_WIDTH(26.95);
691 double XDash::CreateDotDashArray(::std::vector< double >& rDotDashArray, double fLineWidth) const
692 {
693     double fFullDotDashLen(0.0);
694     const sal_uInt16 nNumDotDashArray = (GetDots() + GetDashes()) * 2;
695     rDotDashArray.resize( nNumDotDashArray, 0.0 );
696     sal_uInt16 a;
697     sal_uInt16 nIns(0);
698     double fDashDotDistance = (double)GetDistance();
699     double fSingleDashLen = (double)GetDashLen();
700     double fSingleDotLen = (double)GetDotLen();
701 
702     if(GetDashStyle() == XDASH_RECTRELATIVE || GetDashStyle() == XDASH_ROUNDRELATIVE)
703     {
704         if(fLineWidth != 0.0)
705         {
706             double fFactor = fLineWidth / 100.0;
707 
708             if(GetDashes())
709             {
710                 if(GetDashLen())
711                 {
712                     // is a dash
713                     fSingleDashLen *= fFactor;
714                 }
715                 else
716                 {
717                     // is a dot
718                     fSingleDashLen = fLineWidth;
719                 }
720             }
721 
722             if(GetDots())
723             {
724                 if(GetDotLen())
725                 {
726                     // is a dash
727                     fSingleDotLen *= fFactor;
728                 }
729                 else
730                 {
731                     // is a dot
732                     fSingleDotLen = fLineWidth;
733                 }
734             }
735 
736             if(GetDashes() || GetDots())
737             {
738                 if(GetDistance())
739                 {
740                     fDashDotDistance *= fFactor;
741                 }
742                 else
743                 {
744                     fDashDotDistance = fLineWidth;
745                 }
746             }
747         }
748         else
749         {
750             if(GetDashes())
751             {
752                 if(GetDashLen())
753                 {
754                     // is a dash
755                     fSingleDashLen = (SMALLEST_DASH_WIDTH * fSingleDashLen) / 100.0;
756                 }
757                 else
758                 {
759                     // is a dot
760                     fSingleDashLen = SMALLEST_DASH_WIDTH;
761                 }
762             }
763 
764             if(GetDots())
765             {
766                 if(GetDotLen())
767                 {
768                     // is a dash
769                     fSingleDotLen = (SMALLEST_DASH_WIDTH * fSingleDotLen) / 100.0;
770                 }
771                 else
772                 {
773                     // is a dot
774                     fSingleDotLen = SMALLEST_DASH_WIDTH;
775                 }
776             }
777 
778             if(GetDashes() || GetDots())
779             {
780                 if(GetDistance())
781                 {
782                     // dash as distance
783                     fDashDotDistance = (SMALLEST_DASH_WIDTH * fDashDotDistance) / 100.0;
784                 }
785                 else
786                 {
787                     // dot as distance
788                     fDashDotDistance = SMALLEST_DASH_WIDTH;
789                 }
790             }
791         }
792     }
793     else
794     {
795         // smallest dot size compare value
796         double fDotCompVal(fLineWidth != 0.0 ? fLineWidth : SMALLEST_DASH_WIDTH);
797 
798         // absolute values
799         if(GetDashes())
800         {
801             if(GetDashLen())
802             {
803                 // is a dash
804                 if(fSingleDashLen < SMALLEST_DASH_WIDTH)
805                 {
806                     fSingleDashLen = SMALLEST_DASH_WIDTH;
807                 }
808             }
809             else
810             {
811                 // is a dot
812                 if(fSingleDashLen < fDotCompVal)
813                 {
814                     fSingleDashLen = fDotCompVal;
815                 }
816             }
817         }
818 
819         if(GetDots())
820         {
821             if(GetDotLen())
822             {
823                 // is a dash
824                 if(fSingleDotLen < SMALLEST_DASH_WIDTH)
825                 {
826                     fSingleDotLen = SMALLEST_DASH_WIDTH;
827                 }
828             }
829             else
830             {
831                 // is a dot
832                 if(fSingleDotLen < fDotCompVal)
833                 {
834                     fSingleDotLen = fDotCompVal;
835                 }
836             }
837         }
838 
839         if(GetDashes() || GetDots())
840         {
841             if(GetDistance())
842             {
843                 // dash as distance
844                 if(fDashDotDistance < SMALLEST_DASH_WIDTH)
845                 {
846                     fDashDotDistance = SMALLEST_DASH_WIDTH;
847                 }
848             }
849             else
850             {
851                 // dot as distance
852                 if(fDashDotDistance < fDotCompVal)
853                 {
854                     fDashDotDistance = fDotCompVal;
855                 }
856             }
857         }
858     }
859 
860     for(a=0;a<GetDots();a++)
861     {
862         rDotDashArray[nIns++] = fSingleDotLen;
863         fFullDotDashLen += fSingleDotLen;
864         rDotDashArray[nIns++] = fDashDotDistance;
865         fFullDotDashLen += fDashDotDistance;
866     }
867 
868     for(a=0;a<GetDashes();a++)
869     {
870         rDotDashArray[nIns++] = fSingleDashLen;
871         fFullDotDashLen += fSingleDashLen;
872         rDotDashArray[nIns++] = fDashDotDistance;
873         fFullDotDashLen += fDashDotDistance;
874     }
875 
876     return fFullDotDashLen;
877 }
878 
879 // -------------------
880 // class XLineDashItem
881 // -------------------
882 TYPEINIT1_AUTOFACTORY(XLineDashItem, NameOrIndex);
883 
884 /*************************************************************************
885 |*
886 |*    XLineDashItem::XLineDashItem(sal_Int32 nIndex, const XDash& rTheDash)
887 |*
888 |*    Beschreibung
889 |*    Ersterstellung    15.11.94
890 |*    Letzte Aenderung  15.11.94
891 |*
892 *************************************************************************/
893 
894 XLineDashItem::XLineDashItem(sal_Int32 nIndex, const XDash& rTheDash) :
895     NameOrIndex(XATTR_LINEDASH, nIndex),
896     aDash(rTheDash)
897 {
898 }
899 
900 /*************************************************************************
901 |*
902 |*    XLineDashItem::XLineDashItem(const String& rName, const XDash& rTheDash)
903 |*
904 |*    Beschreibung
905 |*    Ersterstellung    15.11.94
906 |*    Letzte Aenderung  15.11.94
907 |*
908 *************************************************************************/
909 
910 XLineDashItem::XLineDashItem(const XubString& rName, const XDash& rTheDash) :
911     NameOrIndex(XATTR_LINEDASH, rName),
912     aDash(rTheDash)
913 {
914 }
915 
916 /*************************************************************************
917 |*
918 |*    XLineDashItem::XLineDashItem(const XLineDashItem& rItem)
919 |*
920 |*    Beschreibung
921 |*    Ersterstellung    15.11.94
922 |*    Letzte Aenderung  15.11.94
923 |*
924 *************************************************************************/
925 
926 XLineDashItem::XLineDashItem(const XLineDashItem& rItem) :
927     NameOrIndex(rItem),
928     aDash(rItem.aDash)
929 {
930 }
931 
932 /*************************************************************************
933 |*
934 |*    XLineDashItem::XLineDashItem(SvStream& rIn)
935 |*
936 |*    Beschreibung
937 |*    Ersterstellung    15.11.94
938 |*    Letzte Aenderung  15.11.94
939 |*
940 *************************************************************************/
941 
942 XLineDashItem::XLineDashItem(SvStream& rIn) :
943     NameOrIndex(XATTR_LINEDASH, rIn)
944 {
945     if (!IsIndex())
946     {
947         sal_uInt16  nSTemp;
948         sal_uInt32  nLTemp;
949         sal_Int32   nITemp;
950 
951         rIn >> nITemp; aDash.SetDashStyle((XDashStyle)nITemp);
952         rIn >> nSTemp; aDash.SetDots(nSTemp);
953         rIn >> nLTemp; aDash.SetDotLen(nLTemp);
954         rIn >> nSTemp; aDash.SetDashes(nSTemp);
955         rIn >> nLTemp; aDash.SetDashLen(nLTemp);
956         rIn >> nLTemp; aDash.SetDistance(nLTemp);
957     }
958 }
959 
960 //*************************************************************************
961 
962 XLineDashItem::XLineDashItem(SfxItemPool* /*pPool*/, const XDash& rTheDash)
963 :   NameOrIndex( XATTR_LINEDASH, -1 ),
964     aDash(rTheDash)
965 {
966 }
967 
968 //*************************************************************************
969 
970 XLineDashItem::XLineDashItem(SfxItemPool* /*pPool*/)
971 : NameOrIndex(XATTR_LINEDASH, -1 )
972 {
973 }
974 
975 /*************************************************************************
976 |*
977 |*    XLineDashItem::Clone(SfxItemPool* pPool) const
978 |*
979 |*    Beschreibung
980 |*    Ersterstellung    15.11.94
981 |*    Letzte Aenderung  15.11.94
982 |*
983 *************************************************************************/
984 
985 SfxPoolItem* XLineDashItem::Clone(SfxItemPool* /*pPool*/) const
986 {
987     return new XLineDashItem(*this);
988 }
989 
990 /*************************************************************************
991 |*
992 |*    int XLineDashItem::operator==(const SfxPoolItem& rItem) const
993 |*
994 |*    Beschreibung
995 |*    Ersterstellung    15.11.94
996 |*    Letzte Aenderung  15.11.94
997 |*
998 *************************************************************************/
999 
1000 int XLineDashItem::operator==(const SfxPoolItem& rItem) const
1001 {
1002     return ( NameOrIndex::operator==(rItem) &&
1003              aDash == ((const XLineDashItem&) rItem).aDash );
1004 }
1005 
1006 /*************************************************************************
1007 |*
1008 |*    SfxPoolItem* XLineDashItem::Create(SvStream& rIn, sal_uInt16 nVer) const
1009 |*
1010 |*    Beschreibung
1011 |*    Ersterstellung    15.11.94
1012 |*    Letzte Aenderung  15.11.94
1013 |*
1014 *************************************************************************/
1015 
1016 SfxPoolItem* XLineDashItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
1017 {
1018     return new XLineDashItem(rIn);
1019 }
1020 
1021 /*************************************************************************
1022 |*
1023 |*    SfxPoolItem* XLineDashItem::Store(SvStream& rOut) const
1024 |*
1025 |*    Beschreibung
1026 |*    Ersterstellung    15.11.94
1027 |*    Letzte Aenderung  15.11.94
1028 |*
1029 *************************************************************************/
1030 
1031 SvStream& XLineDashItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
1032 {
1033     NameOrIndex::Store( rOut, nItemVersion );
1034 
1035     if (!IsIndex())
1036     {
1037         rOut << (sal_Int32) aDash.GetDashStyle();
1038         rOut << aDash.GetDots();
1039         rOut << (sal_uInt32) aDash.GetDotLen();
1040         rOut << aDash.GetDashes();
1041         rOut << (sal_uInt32) aDash.GetDashLen();
1042         rOut << (sal_uInt32) aDash.GetDistance();
1043     }
1044 
1045     return rOut;
1046 }
1047 
1048 /*************************************************************************
1049 |*
1050 |*    const XDash& XLineDashItem::GetValue(const XDashTable* pTable) const
1051 |*
1052 |*    Beschreibung
1053 |*    Ersterstellung    15.11.94
1054 |*    Letzte Aenderung  18.11.94
1055 |*
1056 *************************************************************************/
1057 
1058 const XDash& XLineDashItem::GetDashValue(const XDashTable* pTable) const // GetValue -> GetDashValue
1059 {
1060     if (!IsIndex())
1061         return aDash;
1062     else
1063         return pTable->GetDash(GetIndex())->GetDash();
1064 }
1065 
1066 //------------------------------------------------------------------------
1067 
1068 SfxItemPresentation XLineDashItem::GetPresentation
1069 (
1070     SfxItemPresentation ePres,
1071     SfxMapUnit          /*eCoreUnit*/,
1072     SfxMapUnit          /*ePresUnit*/,
1073     XubString&          rText, const IntlWrapper *
1074 )   const
1075 {
1076     switch ( ePres )
1077     {
1078         case SFX_ITEM_PRESENTATION_NONE:
1079             rText.Erase();
1080             return ePres;
1081         case SFX_ITEM_PRESENTATION_NAMELESS:
1082         case SFX_ITEM_PRESENTATION_COMPLETE:
1083             rText = GetName();
1084             return ePres;
1085         default:
1086             return SFX_ITEM_PRESENTATION_NONE;
1087     }
1088 }
1089 
1090 //------------------------------------------------------------------------
1091 
1092 FASTBOOL XLineDashItem::HasMetrics() const
1093 {
1094     return sal_True;
1095 }
1096 
1097 //------------------------------------------------------------------------
1098 
1099 FASTBOOL XLineDashItem::ScaleMetrics(long nMul, long nDiv)
1100 {
1101     aDash.SetDotLen( ScaleMetricValue( aDash.GetDotLen(), nMul, nDiv ) );
1102     aDash.SetDashLen( ScaleMetricValue( aDash.GetDashLen(), nMul, nDiv ) );
1103     aDash.SetDistance( ScaleMetricValue( aDash.GetDistance(), nMul, nDiv ) );
1104     return sal_True;
1105 }
1106 
1107 sal_Bool XLineDashItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const
1108 {
1109 //    sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
1110     nMemberId &= ~CONVERT_TWIPS;
1111 
1112     switch ( nMemberId )
1113     {
1114         case 0:
1115         {
1116             uno::Sequence< beans::PropertyValue > aPropSeq( 2 );
1117 
1118             ::com::sun::star::drawing::LineDash aLineDash;
1119 
1120             const XDash& rXD = GetDashValue();
1121             aLineDash.Style = (::com::sun::star::drawing::DashStyle)((sal_uInt16)rXD.GetDashStyle());
1122             aLineDash.Dots = rXD.GetDots();
1123             aLineDash.DotLen = rXD.GetDotLen();
1124             aLineDash.Dashes = rXD.GetDashes();
1125             aLineDash.DashLen = rXD.GetDashLen();
1126             aLineDash.Distance = rXD.GetDistance();
1127 
1128             rtl::OUString aApiName;
1129             SvxUnogetApiNameForItem( Which(), GetName(), aApiName );
1130             aPropSeq[0].Name    = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ));
1131             aPropSeq[0].Value   = uno::makeAny( aApiName );
1132             aPropSeq[1].Name    = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LineDash" ));
1133             aPropSeq[1].Value   = uno::makeAny( aLineDash );
1134             rVal = uno::makeAny( aPropSeq );
1135             break;
1136         }
1137 
1138         case MID_NAME:
1139         {
1140             rtl::OUString aApiName;
1141             SvxUnogetApiNameForItem( Which(), GetName(), aApiName );
1142             rVal <<= aApiName;
1143             break;
1144         }
1145 
1146         case MID_LINEDASH:
1147         {
1148             const XDash& rXD = GetDashValue();
1149 
1150             ::com::sun::star::drawing::LineDash aLineDash;
1151 
1152             aLineDash.Style = (::com::sun::star::drawing::DashStyle)((sal_uInt16)rXD.GetDashStyle());
1153             aLineDash.Dots = rXD.GetDots();
1154             aLineDash.DotLen = rXD.GetDotLen();
1155             aLineDash.Dashes = rXD.GetDashes();
1156             aLineDash.DashLen = rXD.GetDashLen();
1157             aLineDash.Distance = rXD.GetDistance();
1158 
1159             rVal <<= aLineDash;
1160             break;
1161         }
1162 
1163         case MID_LINEDASH_STYLE:
1164         {
1165             const XDash& rXD = GetDashValue();
1166             rVal <<= (::com::sun::star::drawing::DashStyle)((sal_Int16)rXD.GetDashStyle());
1167             break;
1168         }
1169 
1170         case MID_LINEDASH_DOTS:
1171         {
1172             const XDash& rXD = GetDashValue();
1173             rVal <<= rXD.GetDots();
1174             break;
1175         }
1176 
1177         case MID_LINEDASH_DOTLEN:
1178         {
1179             const XDash& rXD = GetDashValue();
1180             rVal <<= rXD.GetDotLen();
1181             break;
1182         }
1183 
1184         case MID_LINEDASH_DASHES:
1185         {
1186             const XDash& rXD = GetDashValue();
1187             rVal <<= rXD.GetDashes();
1188             break;
1189         }
1190 
1191         case MID_LINEDASH_DASHLEN:
1192         {
1193             const XDash& rXD = GetDashValue();
1194             rVal <<= rXD.GetDashLen();
1195             break;
1196         }
1197 
1198         case MID_LINEDASH_DISTANCE:
1199         {
1200             const XDash& rXD = GetDashValue();
1201             rVal <<= rXD.GetDistance();
1202             break;
1203         }
1204 
1205         default: DBG_ERROR("Wrong MemberId!"); return sal_False;
1206     }
1207 
1208     return sal_True;
1209 }
1210 
1211 sal_Bool XLineDashItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
1212 {
1213 //    sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
1214     nMemberId &= ~CONVERT_TWIPS;
1215 
1216     switch ( nMemberId )
1217     {
1218         case 0:
1219         {
1220             uno::Sequence< beans::PropertyValue >   aPropSeq;
1221             ::com::sun::star::drawing::LineDash     aLineDash;
1222             rtl::OUString                           aName;
1223             sal_Bool                                bLineDash( sal_False );
1224 
1225             if ( rVal >>= aPropSeq )
1226             {
1227                 for ( sal_Int32 n = 0; n < aPropSeq.getLength(); n++ )
1228                 {
1229                     if ( aPropSeq[n].Name.equalsAsciiL( "Name", 4  ))
1230                         aPropSeq[n].Value >>= aName;
1231                     else if ( aPropSeq[n].Name.equalsAsciiL( "LineDash", 8 ))
1232                     {
1233                         if ( aPropSeq[n].Value >>= aLineDash )
1234                             bLineDash = sal_True;
1235                     }
1236                 }
1237 
1238                 SetName( aName );
1239                 if ( bLineDash )
1240                 {
1241                     XDash aXDash;
1242 
1243                     aXDash.SetDashStyle((XDashStyle)((sal_uInt16)(aLineDash.Style)));
1244                     aXDash.SetDots(aLineDash.Dots);
1245                     aXDash.SetDotLen(aLineDash.DotLen);
1246                     aXDash.SetDashes(aLineDash.Dashes);
1247                     aXDash.SetDashLen(aLineDash.DashLen);
1248                     aXDash.SetDistance(aLineDash.Distance);
1249 
1250                     if((0 == aXDash.GetDots()) && (0 == aXDash.GetDashes()))
1251                         aXDash.SetDots(1);
1252 
1253                     SetDashValue( aXDash );
1254                 }
1255 
1256                 return sal_True;
1257             }
1258 
1259             return sal_False;
1260         }
1261 
1262         case MID_NAME:
1263         {
1264             rtl::OUString aName;
1265             if (!(rVal >>= aName))
1266                 return sal_False;
1267             SetName( aName );
1268             break;
1269         }
1270 
1271         case MID_LINEDASH:
1272         {
1273             ::com::sun::star::drawing::LineDash aLineDash;
1274             if(!(rVal >>= aLineDash))
1275                 return sal_False;
1276 
1277             XDash aXDash;
1278 
1279             aXDash.SetDashStyle((XDashStyle)((sal_uInt16)(aLineDash.Style)));
1280             aXDash.SetDots(aLineDash.Dots);
1281             aXDash.SetDotLen(aLineDash.DotLen);
1282             aXDash.SetDashes(aLineDash.Dashes);
1283             aXDash.SetDashLen(aLineDash.DashLen);
1284             aXDash.SetDistance(aLineDash.Distance);
1285 
1286             if((0 == aXDash.GetDots()) && (0 == aXDash.GetDashes()))
1287                 aXDash.SetDots(1);
1288 
1289             SetDashValue( aXDash );
1290             break;
1291         }
1292 
1293         case MID_LINEDASH_STYLE:
1294         {
1295             sal_Int16 nVal = sal_Int16();
1296             if(!(rVal >>= nVal))
1297                 return sal_False;
1298 
1299             XDash aXDash = GetDashValue();
1300             aXDash.SetDashStyle((XDashStyle)((sal_uInt16)(nVal)));
1301 
1302             if((0 == aXDash.GetDots()) && (0 == aXDash.GetDashes()))
1303                 aXDash.SetDots(1);
1304 
1305             SetDashValue( aXDash );
1306 
1307             break;
1308         }
1309 
1310         case MID_LINEDASH_DOTS:
1311         case MID_LINEDASH_DASHES:
1312         {
1313             sal_Int16 nVal = sal_Int16();
1314             if(!(rVal >>= nVal))
1315                 return sal_False;
1316 
1317             XDash aXDash = GetDashValue();
1318             if ( nMemberId == MID_LINEDASH_DOTS )
1319                 aXDash.SetDots( nVal );
1320             else
1321                 aXDash.SetDashes( nVal );
1322 
1323             if((0 == aXDash.GetDots()) && (0 == aXDash.GetDashes()))
1324                 aXDash.SetDots(1);
1325 
1326             SetDashValue( aXDash );
1327             break;
1328         }
1329 
1330         case MID_LINEDASH_DOTLEN:
1331         case MID_LINEDASH_DASHLEN:
1332         case MID_LINEDASH_DISTANCE:
1333         {
1334             sal_Int32 nVal = 0;
1335             if(!(rVal >>= nVal))
1336                 return sal_False;
1337 
1338             XDash aXDash = GetDashValue();
1339             if ( nMemberId == MID_LINEDASH_DOTLEN )
1340                 aXDash.SetDotLen( nVal );
1341             else if ( nMemberId == MID_LINEDASH_DASHLEN )
1342                 aXDash.SetDashLen( nVal );
1343             else
1344                 aXDash.SetDistance( nVal );
1345 
1346             if((0 == aXDash.GetDots()) && (0 == aXDash.GetDashes()))
1347                 aXDash.SetDots(1);
1348 
1349             SetDashValue( aXDash );
1350             break;
1351         }
1352     }
1353 
1354     return sal_True;
1355 }
1356 
1357 sal_Bool XLineDashItem::CompareValueFunc( const NameOrIndex* p1, const NameOrIndex* p2 )
1358 {
1359     return ((XLineDashItem*)p1)->GetDashValue() == ((XLineDashItem*)p2)->GetDashValue();
1360 }
1361 
1362 XLineDashItem* XLineDashItem::checkForUniqueItem( SdrModel* pModel ) const
1363 {
1364     if( pModel )
1365     {
1366         const String aUniqueName = NameOrIndex::CheckNamedItem( this,
1367                                                                 XATTR_LINEDASH,
1368                                                                 &pModel->GetItemPool(),
1369                                                                 pModel->GetStyleSheetPool() ? &pModel->GetStyleSheetPool()->GetPool() : NULL,
1370                                                                 XLineDashItem::CompareValueFunc,
1371                                                                 RID_SVXSTR_DASH11,
1372                                                                 pModel->GetDashList() );
1373 
1374         // if the given name is not valid, replace it!
1375         if( aUniqueName != GetName() )
1376         {
1377             return new XLineDashItem( aUniqueName, aDash );
1378         }
1379     }
1380 
1381     return (XLineDashItem*)this;
1382 }
1383 
1384 // -------------------
1385 // class XLineWidthItem
1386 // -------------------
1387 TYPEINIT1_AUTOFACTORY(XLineWidthItem, SfxMetricItem);
1388 
1389 /*************************************************************************
1390 |*
1391 |*    XLineWidthItem::XLineWidthItem(long nWidth)
1392 |*
1393 |*    Beschreibung
1394 |*    Ersterstellung    15.11.94
1395 |*    Letzte Aenderung  18.11.94
1396 |*
1397 *************************************************************************/
1398 
1399 XLineWidthItem::XLineWidthItem(long nWidth) :
1400     SfxMetricItem(XATTR_LINEWIDTH, nWidth)
1401 {
1402 }
1403 
1404 /*************************************************************************
1405 |*
1406 |*    XLineWidthItem::XLineWidthItem(SvStream& rIn)
1407 |*
1408 |*    Beschreibung
1409 |*    Ersterstellung    15.11.94
1410 |*    Letzte Aenderung  15.11.94
1411 |*
1412 *************************************************************************/
1413 
1414 XLineWidthItem::XLineWidthItem(SvStream& rIn) :
1415     SfxMetricItem(XATTR_LINEWIDTH, rIn)
1416 {
1417 }
1418 
1419 /*************************************************************************
1420 |*
1421 |*    XLineWidthItem::Clone(SfxItemPool* pPool) const
1422 |*
1423 |*    Beschreibung
1424 |*    Ersterstellung    15.11.94
1425 |*    Letzte Aenderung  15.11.94
1426 |*
1427 *************************************************************************/
1428 
1429 SfxPoolItem* XLineWidthItem::Clone(SfxItemPool* /*pPool*/) const
1430 {
1431     return new XLineWidthItem(*this);
1432 }
1433 
1434 /*************************************************************************
1435 |*
1436 |*    SfxPoolItem* XLineWidthItem::Create(SvStream& rIn, sal_uInt16 nVer) const
1437 |*
1438 |*    Beschreibung
1439 |*    Ersterstellung    15.11.94
1440 |*    Letzte Aenderung  15.11.94
1441 |*
1442 *************************************************************************/
1443 
1444 SfxPoolItem* XLineWidthItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
1445 {
1446     return new XLineWidthItem(rIn);
1447 }
1448 
1449 //------------------------------------------------------------------------
1450 
1451 SfxItemPresentation XLineWidthItem::GetPresentation
1452 (
1453     SfxItemPresentation ePres,
1454     SfxMapUnit          eCoreUnit,
1455     SfxMapUnit          ePresUnit,
1456     XubString&          rText, const IntlWrapper * pIntl
1457 )   const
1458 {
1459     switch ( ePres )
1460     {
1461         case SFX_ITEM_PRESENTATION_NONE:
1462             rText.Erase();
1463             return ePres;
1464         case SFX_ITEM_PRESENTATION_NAMELESS:
1465         case SFX_ITEM_PRESENTATION_COMPLETE:
1466             rText = GetMetricText( (long) GetValue(),
1467                                     eCoreUnit, ePresUnit, pIntl);
1468             rText += SVX_RESSTR( GetMetricId( ePresUnit) );
1469             return ePres;
1470         default:
1471             return SFX_ITEM_PRESENTATION_NONE;
1472     }
1473 }
1474 
1475 sal_Bool XLineWidthItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const
1476 {
1477     sal_Int32 nValue = GetValue();
1478     if( 0 != (nMemberId&CONVERT_TWIPS) )
1479         nValue = TWIP_TO_MM100(nValue);
1480 
1481     rVal <<= nValue;
1482     return sal_True;
1483 }
1484 
1485 sal_Bool XLineWidthItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
1486 {
1487     sal_Int32 nValue = 0;
1488     rVal >>= nValue;
1489     if( 0 != (nMemberId&CONVERT_TWIPS) )
1490         nValue = MM100_TO_TWIP(nValue);
1491 
1492     SetValue( nValue );
1493     return sal_True;
1494 }
1495 
1496 // -------------------
1497 // class XLineColorItem
1498 // -------------------
1499 TYPEINIT1_AUTOFACTORY(XLineColorItem, XColorItem);
1500 
1501 /*************************************************************************
1502 |*
1503 |*    XLineColorItem::XLineColorItem(sal_Int32 nIndex, const Color& rTheColor)
1504 |*
1505 |*    Beschreibung
1506 |*    Ersterstellung    15.11.94
1507 |*    Letzte Aenderung  15.11.94
1508 |*
1509 *************************************************************************/
1510 
1511 XLineColorItem::XLineColorItem(sal_Int32 nIndex, const Color& rTheColor) :
1512     XColorItem(XATTR_LINECOLOR, nIndex, rTheColor)
1513 {
1514 }
1515 
1516 /*************************************************************************
1517 |*
1518 |*    XLineColorItem::XLineColorItem(const XubString& rName, const Color& rTheColor)
1519 |*
1520 |*    Beschreibung
1521 |*    Ersterstellung    15.11.94
1522 |*    Letzte Aenderung  15.11.94
1523 |*
1524 *************************************************************************/
1525 
1526 XLineColorItem::XLineColorItem(const XubString& rName, const Color& rTheColor) :
1527     XColorItem(XATTR_LINECOLOR, rName, rTheColor)
1528 {
1529 }
1530 
1531 /*************************************************************************
1532 |*
1533 |*    XLineColorItem::XLineColorItem(SvStream& rIn)
1534 |*
1535 |*    Beschreibung
1536 |*    Ersterstellung    15.11.94
1537 |*    Letzte Aenderung  15.11.94
1538 |*
1539 *************************************************************************/
1540 
1541 XLineColorItem::XLineColorItem(SvStream& rIn) :
1542     XColorItem(XATTR_LINECOLOR, rIn)
1543 {
1544 }
1545 
1546 /*************************************************************************
1547 |*
1548 |*    XLineColorItem::Clone(SfxItemPool* pPool) const
1549 |*
1550 |*    Beschreibung
1551 |*    Ersterstellung    15.11.94
1552 |*    Letzte Aenderung  15.11.94
1553 |*
1554 *************************************************************************/
1555 
1556 SfxPoolItem* XLineColorItem::Clone(SfxItemPool* /*pPool*/) const
1557 {
1558     return new XLineColorItem(*this);
1559 }
1560 
1561 /*************************************************************************
1562 |*
1563 |*    SfxPoolItem* XLineColorItem::Create(SvStream& rIn, sal_uInt16 nVer) const
1564 |*
1565 |*    Beschreibung
1566 |*    Ersterstellung    15.11.94
1567 |*    Letzte Aenderung  15.11.94
1568 |*
1569 *************************************************************************/
1570 
1571 SfxPoolItem* XLineColorItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
1572 {
1573     return new XLineColorItem(rIn);
1574 }
1575 
1576 //------------------------------------------------------------------------
1577 
1578 SfxItemPresentation XLineColorItem::GetPresentation
1579 (
1580     SfxItemPresentation ePres,
1581     SfxMapUnit          /*eCoreUnit*/,
1582     SfxMapUnit          /*ePresUnit*/,
1583     XubString&          rText, const IntlWrapper *
1584 )   const
1585 {
1586     switch ( ePres )
1587     {
1588         case SFX_ITEM_PRESENTATION_NONE:
1589             rText.Erase();
1590             return ePres;
1591         case SFX_ITEM_PRESENTATION_NAMELESS:
1592         case SFX_ITEM_PRESENTATION_COMPLETE:
1593             rText = GetName();
1594             return ePres;
1595         default:
1596             return SFX_ITEM_PRESENTATION_NONE;
1597     }
1598 }
1599 
1600 sal_Bool XLineColorItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
1601 {
1602     rVal <<= (sal_Int32)GetColorValue().GetRGBColor();
1603     return sal_True;
1604 }
1605 
1606 sal_Bool XLineColorItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
1607 {
1608     sal_Int32 nValue = 0;
1609     if(!(rVal >>= nValue))
1610         return sal_False;
1611 
1612     SetColorValue( nValue );
1613     return sal_True;
1614 }
1615 
1616 //////////////////////////////////////////////////////////////////////////////
1617 // tooling for simple spooling B2DPolygon to file and back
1618 
1619 namespace
1620 {
1621     void streamOutB2DPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPolygon, SvStream& rOut)
1622     {
1623         const sal_uInt32 nPolygonCount(rPolyPolygon.count());
1624         rOut << nPolygonCount;
1625 
1626         for(sal_uInt32 a(0L); a < nPolygonCount; a++)
1627         {
1628             const basegfx::B2DPolygon aCandidate(rPolyPolygon.getB2DPolygon(a));
1629             const sal_uInt32 nPointCount(aCandidate.count());
1630             const sal_uInt8 bClosed(aCandidate.isClosed() ? 1 : 0);
1631             const sal_uInt8 bControlPoints(aCandidate.areControlPointsUsed() ? 1 : 0);
1632             rOut << nPointCount;
1633             rOut << bClosed;
1634             rOut << bControlPoints;
1635 
1636             for(sal_uInt32 b(0L); b < nPointCount; b++)
1637             {
1638                 const basegfx::B2DPoint aPoint(aCandidate.getB2DPoint(b));
1639                 rOut << aPoint.getX();
1640                 rOut << aPoint.getY();
1641 
1642                 if(bControlPoints)
1643                 {
1644                     const sal_uInt8 bEdgeIsCurve(aCandidate.isPrevControlPointUsed(b) || aCandidate.isNextControlPointUsed(b) ? 1 : 0);
1645                     rOut << bEdgeIsCurve;
1646 
1647                     if(bEdgeIsCurve)
1648                     {
1649                         const basegfx::B2DVector aControlVectorA(aCandidate.getPrevControlPoint(b));
1650                         rOut << aControlVectorA.getX();
1651                         rOut << aControlVectorA.getY();
1652 
1653                         const basegfx::B2DVector aControlVectorB(aCandidate.getNextControlPoint(b));
1654                         rOut << aControlVectorB.getX();
1655                         rOut << aControlVectorB.getY();
1656                     }
1657                 }
1658             }
1659         }
1660     }
1661 
1662     basegfx::B2DPolyPolygon streamInB2DPolyPolygon(SvStream& rIn)
1663     {
1664         basegfx::B2DPolyPolygon aRetval;
1665         sal_uInt32 nPolygonCount;
1666         rIn >> nPolygonCount;
1667 
1668         for(sal_uInt32 a(0L); a < nPolygonCount; a++)
1669         {
1670             sal_uInt32 nPointCount;
1671             sal_uInt8 bClosed;
1672             sal_uInt8 bControlPoints;
1673 
1674             rIn >> nPointCount;
1675             rIn >> bClosed;
1676             rIn >> bControlPoints;
1677 
1678             basegfx::B2DPolygon aCandidate;
1679             aCandidate.setClosed(0 != bClosed);
1680 
1681             for(sal_uInt32 b(0L); b < nPointCount; b++)
1682             {
1683                 double fX, fY;
1684                 rIn >> fX;
1685                 rIn >> fY;
1686                 aCandidate.append(basegfx::B2DPoint(fX, fY));
1687 
1688                 if(0 != bControlPoints)
1689                 {
1690                     sal_uInt8 bEdgeIsCurve;
1691                     rIn >> bEdgeIsCurve;
1692 
1693                     if(0 != bEdgeIsCurve)
1694                     {
1695                         rIn >> fX;
1696                         rIn >> fY;
1697                         aCandidate.setPrevControlPoint(b, basegfx::B2DVector(fX, fY));
1698 
1699                         rIn >> fX;
1700                         rIn >> fY;
1701                         aCandidate.setNextControlPoint(b, basegfx::B2DVector(fX, fY));
1702                     }
1703                 }
1704             }
1705 
1706             aRetval.append(aCandidate);
1707         }
1708 
1709         return aRetval;
1710     }
1711 }
1712 
1713 //////////////////////////////////////////////////////////////////////////////
1714 
1715 // -----------------------
1716 // class XLineStartItem
1717 // -----------------------
1718 TYPEINIT1_AUTOFACTORY(XLineStartItem, NameOrIndex);
1719 
1720 /*************************************************************************
1721 |*
1722 |*    XLineStartItem::XLineStartItem(sal_Int32 nIndex)
1723 |*
1724 |*    Beschreibung
1725 |*    Ersterstellung    15.11.94
1726 |*    Letzte Aenderung  18.11.94
1727 |*
1728 *************************************************************************/
1729 
1730 XLineStartItem::XLineStartItem(sal_Int32 nIndex)
1731 :   NameOrIndex(XATTR_LINESTART, nIndex)
1732 {
1733 }
1734 
1735 /*************************************************************************
1736 |*
1737 |*    XLineStartItem::XLineStartItem(const XubString& rName,
1738 |*                                   const basegfx::B2DPolyPolygon& rXPolygon)
1739 |*
1740 |*    Beschreibung
1741 |*    Ersterstellung    15.11.94
1742 |*    Letzte Aenderung  18.11.94
1743 |*
1744 *************************************************************************/
1745 
1746 XLineStartItem::XLineStartItem(const XubString& rName, const basegfx::B2DPolyPolygon& rPolyPolygon)
1747 :   NameOrIndex(XATTR_LINESTART, rName),
1748     maPolyPolygon(rPolyPolygon)
1749 {
1750 }
1751 
1752 /*************************************************************************
1753 |*
1754 |*    XLineStartItem::XLineStartItem(const XLineStartItem& rItem)
1755 |*
1756 |*    Beschreibung
1757 |*    Ersterstellung    15.11.94
1758 |*    Letzte Aenderung  17.11.94
1759 |*
1760 *************************************************************************/
1761 
1762 XLineStartItem::XLineStartItem(const XLineStartItem& rItem)
1763 :   NameOrIndex(rItem),
1764     maPolyPolygon(rItem.maPolyPolygon)
1765 {
1766 }
1767 
1768 /*************************************************************************
1769 |*
1770 |*    XLineStartItem::XLineStartItem(SvStream& rIn)
1771 |*
1772 |*    Beschreibung
1773 |*    Ersterstellung    15.11.94
1774 |*    Letzte Aenderung  17.11.94
1775 |*
1776 *************************************************************************/
1777 
1778 XLineStartItem::XLineStartItem(SvStream& rIn) :
1779     NameOrIndex(XATTR_LINESTART, rIn)
1780 {
1781     if (!IsIndex())
1782     {
1783         maPolyPolygon = streamInB2DPolyPolygon(rIn);
1784     }
1785 }
1786 
1787 //*************************************************************************
1788 
1789 XLineStartItem::XLineStartItem(SfxItemPool* /*pPool*/, const basegfx::B2DPolyPolygon& rPolyPolygon)
1790 :   NameOrIndex( XATTR_LINESTART, -1 ),
1791     maPolyPolygon(rPolyPolygon)
1792 {
1793 }
1794 
1795 //*************************************************************************
1796 
1797 XLineStartItem::XLineStartItem(SfxItemPool* /*pPool*/)
1798 :   NameOrIndex(XATTR_LINESTART, -1 )
1799 {
1800 }
1801 
1802 /*************************************************************************
1803 |*
1804 |*    XLineStartItem::Clone(SfxItemPool* pPool) const
1805 |*
1806 |*    Beschreibung
1807 |*    Ersterstellung    15.11.94
1808 |*    Letzte Aenderung  15.11.94
1809 |*
1810 *************************************************************************/
1811 
1812 SfxPoolItem* XLineStartItem::Clone(SfxItemPool* /*pPool*/) const
1813 {
1814     return new XLineStartItem(*this);
1815 }
1816 
1817 /*************************************************************************
1818 |*
1819 |*    int XLineStartItem::operator==(const SfxPoolItem& rItem) const
1820 |*
1821 |*    Beschreibung
1822 |*    Ersterstellung    15.11.94
1823 |*    Letzte Aenderung  18.11.94
1824 |*
1825 *************************************************************************/
1826 
1827 int XLineStartItem::operator==(const SfxPoolItem& rItem) const
1828 {
1829     return ( NameOrIndex::operator==(rItem) && ((const XLineStartItem&) rItem).maPolyPolygon == maPolyPolygon );
1830 }
1831 
1832 /*************************************************************************
1833 |*
1834 |*    SfxPoolItem* XLineStartItem::Create(SvStream& rIn, sal_uInt16 nVer) const
1835 |*
1836 |*    Beschreibung
1837 |*    Ersterstellung    15.11.94
1838 |*    Letzte Aenderung  15.11.94
1839 |*
1840 *************************************************************************/
1841 
1842 SfxPoolItem* XLineStartItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
1843 {
1844     return new XLineStartItem(rIn);
1845 }
1846 
1847 /*************************************************************************
1848 |*
1849 |*    SfxPoolItem* XLineStartItem::Store(SvStream& rOut) const
1850 |*
1851 |*    Beschreibung
1852 |*    Ersterstellung    15.11.94
1853 |*    Letzte Aenderung  18.11.94
1854 |*
1855 *************************************************************************/
1856 
1857 SvStream& XLineStartItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
1858 {
1859     NameOrIndex::Store( rOut, nItemVersion );
1860 
1861     if (!IsIndex())
1862     {
1863         streamOutB2DPolyPolygon(maPolyPolygon, rOut);
1864     }
1865 
1866     return rOut;
1867 }
1868 
1869 /*************************************************************************
1870 |*
1871 |*    const basegfx::B2DPolyPolygon& XLineStartItem::GetValue(const XLineEndTable* pTable)
1872 |*                                             const
1873 |*
1874 |*    Beschreibung
1875 |*    Ersterstellung    15.11.94
1876 |*    Letzte Aenderung  18.11.94
1877 |*
1878 *************************************************************************/
1879 
1880 basegfx::B2DPolyPolygon XLineStartItem::GetLineStartValue(const XLineEndTable* pTable) const
1881 {
1882     if (!IsIndex())
1883     {
1884         return maPolyPolygon;
1885     }
1886     else
1887     {
1888         return pTable->GetLineEnd(GetIndex())->GetLineEnd();
1889     }
1890 }
1891 
1892 //------------------------------------------------------------------------
1893 
1894 SfxItemPresentation XLineStartItem::GetPresentation
1895 (
1896     SfxItemPresentation ePres,
1897     SfxMapUnit          /*eCoreUnit*/,
1898     SfxMapUnit          /*ePresUnit*/,
1899     XubString&          rText, const IntlWrapper *
1900 )   const
1901 {
1902     switch ( ePres )
1903     {
1904         case SFX_ITEM_PRESENTATION_NONE:
1905             rText.Erase();
1906             return ePres;
1907         case SFX_ITEM_PRESENTATION_NAMELESS:
1908         case SFX_ITEM_PRESENTATION_COMPLETE:
1909             rText = GetName();
1910             return ePres;
1911         default:
1912         return SFX_ITEM_PRESENTATION_NONE;
1913     }
1914 }
1915 
1916 sal_Bool XLineStartItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const
1917 {
1918 //    sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
1919     nMemberId &= ~CONVERT_TWIPS;
1920     if( nMemberId == MID_NAME )
1921     {
1922         rtl::OUString aApiName;
1923         SvxUnogetApiNameForItem( Which(), GetName(), aApiName );
1924         rVal <<= aApiName;
1925     }
1926     else
1927     {
1928         com::sun::star::drawing::PolyPolygonBezierCoords aBezier;
1929         SvxConvertB2DPolyPolygonToPolyPolygonBezier( maPolyPolygon, aBezier );
1930         rVal <<= aBezier;
1931     }
1932 
1933     return sal_True;
1934 }
1935 
1936 sal_Bool XLineStartItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
1937 {
1938 //    sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
1939     nMemberId &= ~CONVERT_TWIPS;
1940     if( nMemberId == MID_NAME )
1941     {
1942         return sal_False;
1943     }
1944     else
1945     {
1946         maPolyPolygon.clear();
1947 
1948         if( rVal.hasValue() && rVal.getValue() )
1949         {
1950             if( rVal.getValueType() != ::getCppuType((const com::sun::star::drawing::PolyPolygonBezierCoords*)0) )
1951                 return sal_False;
1952 
1953             com::sun::star::drawing::PolyPolygonBezierCoords* pCoords = (com::sun::star::drawing::PolyPolygonBezierCoords*)rVal.getValue();
1954             if( pCoords->Coordinates.getLength() > 0 )
1955             {
1956                 maPolyPolygon = SvxConvertPolyPolygonBezierToB2DPolyPolygon( pCoords );
1957                 // #i72807# close line start/end polygons hard
1958                 // maPolyPolygon.setClosed(true);
1959             }
1960         }
1961     }
1962 
1963     return sal_True;
1964 }
1965 
1966 /** this function searches in both the models pool and the styles pool for XLineStartItem
1967     and XLineEndItem with the same value or name and returns an item with the value of
1968     this item and a unique name for an item with this value. */
1969 XLineStartItem* XLineStartItem::checkForUniqueItem( SdrModel* pModel ) const
1970 {
1971     if( pModel )
1972     {
1973         XLineStartItem* pTempItem = NULL;
1974         const XLineStartItem* pLineStartItem = this;
1975 
1976         String aUniqueName( GetName() );
1977 
1978         if( !maPolyPolygon.count() )
1979         {
1980             // if the polygon is empty, check if the name is empty
1981             if( aUniqueName.Len() == 0 )
1982                 return (XLineStartItem*)this;
1983 
1984             // force empty name for empty polygons
1985             return new XLineStartItem( String(), maPolyPolygon );
1986         }
1987 
1988         if( maPolyPolygon.count() > 1L )
1989         {
1990             // check if the polygon is closed
1991             if(!maPolyPolygon.isClosed())
1992             {
1993                 // force a closed polygon
1994                 basegfx::B2DPolyPolygon aNew(maPolyPolygon);
1995                 aNew.setClosed(true);
1996                 pTempItem = new XLineStartItem( aUniqueName, aNew );
1997                 pLineStartItem = pTempItem;
1998             }
1999         }
2000 
2001         sal_Bool bForceNew = sal_False;
2002 
2003         // 2. if we have a name check if there is already an item with the
2004         // same name in the documents pool with a different line end or start
2005 
2006         sal_uInt32 nCount, nSurrogate;
2007 
2008         const SfxItemPool* pPool1 = &pModel->GetItemPool();
2009         if( aUniqueName.Len() && pPool1 )
2010         {
2011             nCount = pPool1->GetItemCount2( XATTR_LINESTART );
2012 
2013             for( nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
2014             {
2015                 const XLineStartItem* pItem = (const XLineStartItem*)pPool1->GetItem2( XATTR_LINESTART, nSurrogate );
2016 
2017                 if( pItem && ( pItem->GetName() == pLineStartItem->GetName() ) )
2018                 {
2019                     // if there is already an item with the same name and the same
2020                     // value its ok to set it
2021                     if( pItem->GetLineStartValue() != pLineStartItem->GetLineStartValue() )
2022                     {
2023                         // same name but different value, we need a new name for this item
2024                         aUniqueName = String();
2025                         bForceNew = sal_True;
2026                     }
2027                     break;
2028                 }
2029             }
2030 
2031             if( !bForceNew )
2032             {
2033                 nCount = pPool1->GetItemCount2( XATTR_LINEEND );
2034 
2035                 for( nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
2036                 {
2037                     const XLineEndItem* pItem = (const XLineEndItem*)pPool1->GetItem2( XATTR_LINEEND, nSurrogate );
2038 
2039                     if( pItem && ( pItem->GetName() == pLineStartItem->GetName() ) )
2040                     {
2041                         // if there is already an item with the same name and the same
2042                         // value its ok to set it
2043                         if( pItem->GetLineEndValue() != pLineStartItem->GetLineStartValue() )
2044                         {
2045                             // same name but different value, we need a new name for this item
2046                             aUniqueName = String();
2047                             bForceNew = sal_True;
2048                         }
2049                         break;
2050                     }
2051                 }
2052             }
2053         }
2054 
2055         const SfxItemPool* pPool2 = pModel->GetStyleSheetPool() ? &pModel->GetStyleSheetPool()->GetPool() : NULL;
2056         if( aUniqueName.Len() && pPool2)
2057         {
2058             nCount = pPool2->GetItemCount2( XATTR_LINESTART );
2059             for( nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
2060             {
2061                 const XLineStartItem* pItem = (const XLineStartItem*)pPool2->GetItem2( XATTR_LINESTART, nSurrogate );
2062 
2063                 if( pItem && ( pItem->GetName() == pLineStartItem->GetName() ) )
2064                 {
2065                     // if there is already an item with the same name and the same
2066                     // value its ok to set it
2067                     if( pItem->GetLineStartValue() != pLineStartItem->GetLineStartValue() )
2068                     {
2069                         // same name but different value, we need a new name for this item
2070                         aUniqueName = String();
2071                         bForceNew = sal_True;
2072                     }
2073                     break;
2074                 }
2075             }
2076 
2077             if( !bForceNew )
2078             {
2079                 nCount = pPool2->GetItemCount2( XATTR_LINEEND );
2080                 for( nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
2081                 {
2082                     const XLineEndItem* pItem = (const XLineEndItem*)pPool2->GetItem2( XATTR_LINEEND, nSurrogate );
2083 
2084                     if( pItem && ( pItem->GetName() == pLineStartItem->GetName() ) )
2085                     {
2086                         // if there is already an item with the same name and the same
2087                         // value its ok to set it
2088                         if( pItem->GetLineEndValue() != pLineStartItem->GetLineStartValue() )
2089                         {
2090                             // same name but different value, we need a new name for this item
2091                             aUniqueName = String();
2092                             bForceNew = sal_True;
2093                         }
2094                         break;
2095                     }
2096                 }
2097             }
2098         }
2099 
2100         // if we have no name yet, find existing item with same conent or
2101         // create a unique name
2102         if( aUniqueName.Len() == 0 )
2103         {
2104             sal_Bool bFoundExisting = sal_False;
2105 
2106             sal_Int32 nUserIndex = 1;
2107             const ResId aRes(SVX_RES(RID_SVXSTR_LINEEND));
2108             const String aUser( aRes );
2109 
2110             if( pPool1 )
2111             {
2112                 nCount = pPool1->GetItemCount2( XATTR_LINESTART );
2113                 sal_uInt32 nSurrogate2;
2114 
2115                 for( nSurrogate2 = 0; nSurrogate2 < nCount; nSurrogate2++ )
2116                 {
2117                     const XLineStartItem* pItem = (const XLineStartItem*)pPool1->GetItem2( XATTR_LINESTART, nSurrogate2 );
2118 
2119                     if( pItem && pItem->GetName().Len() )
2120                     {
2121                         if( !bForceNew && pItem->GetLineStartValue() == pLineStartItem->GetLineStartValue() )
2122                         {
2123                             aUniqueName = pItem->GetName();
2124                             bFoundExisting = sal_True;
2125                             break;
2126                         }
2127 
2128                         if( pItem->GetName().CompareTo( aUser, aUser.Len() ) == 0 )
2129                         {
2130                             sal_Int32 nThisIndex = pItem->GetName().Copy( aUser.Len() ).ToInt32();
2131                             if( nThisIndex >= nUserIndex )
2132                                 nUserIndex = nThisIndex + 1;
2133                         }
2134                     }
2135                 }
2136 
2137                 nCount = pPool1->GetItemCount2( XATTR_LINEEND );
2138                 for( nSurrogate2 = 0; nSurrogate2 < nCount; nSurrogate2++ )
2139                 {
2140                     const XLineEndItem* pItem = (const XLineEndItem*)pPool1->GetItem2( XATTR_LINEEND, nSurrogate2 );
2141 
2142                     if( pItem && pItem->GetName().Len() )
2143                     {
2144                         if( !bForceNew && pItem->GetLineEndValue() == pLineStartItem->GetLineStartValue() )
2145                         {
2146                             aUniqueName = pItem->GetName();
2147                             bFoundExisting = sal_True;
2148                             break;
2149                         }
2150 
2151                         if( pItem->GetName().CompareTo( aUser, aUser.Len() ) == 0 )
2152                         {
2153                             sal_Int32 nThisIndex = pItem->GetName().Copy( aUser.Len() ).ToInt32();
2154                             if( nThisIndex >= nUserIndex )
2155                                 nUserIndex = nThisIndex + 1;
2156                         }
2157                     }
2158                 }
2159             }
2160 
2161             if( !bFoundExisting )
2162             {
2163                 aUniqueName = aUser;
2164                 aUniqueName += sal_Unicode(' ');
2165                 aUniqueName += String::CreateFromInt32( nUserIndex );
2166             }
2167         }
2168 
2169         // if the given name is not valid, replace it!
2170         if( aUniqueName != GetName() || pTempItem )
2171         {
2172             if( pTempItem )
2173             {
2174                 pTempItem->SetName( aUniqueName );
2175                 return pTempItem;
2176             }
2177             else
2178             {
2179                 return new XLineStartItem( aUniqueName, maPolyPolygon );
2180             }
2181         }
2182     }
2183 
2184     return (XLineStartItem*)this;
2185 }
2186 
2187 // ---------------------
2188 // class XLineEndItem
2189 // ---------------------
2190 TYPEINIT1_AUTOFACTORY(XLineEndItem, NameOrIndex);
2191 
2192 /*************************************************************************
2193 |*
2194 |*    XLineEndItem::XLineEndItem(sal_Int32 nIndex)
2195 |*
2196 |*    Beschreibung
2197 |*    Ersterstellung    15.11.94
2198 |*    Letzte Aenderung  18.11.94
2199 |*
2200 *************************************************************************/
2201 
2202 XLineEndItem::XLineEndItem(sal_Int32 nIndex)
2203 :   NameOrIndex(XATTR_LINEEND, nIndex)
2204 {
2205 }
2206 
2207 /*************************************************************************
2208 |*
2209 |*    XLineEndItem::XLineEndItem(const XubString& rName,
2210 |*                               const basegfx::B2DPolyPolygon& rXPolygon)
2211 |*
2212 |*    Beschreibung
2213 |*    Ersterstellung    15.11.94
2214 |*    Letzte Aenderung  18.11.94
2215 |*
2216 *************************************************************************/
2217 
2218 XLineEndItem::XLineEndItem(const XubString& rName, const basegfx::B2DPolyPolygon& rPolyPolygon)
2219 :   NameOrIndex(XATTR_LINEEND, rName),
2220     maPolyPolygon(rPolyPolygon)
2221 {
2222 }
2223 
2224 /*************************************************************************
2225 |*
2226 |*    XLineEndItem::XLineEndItem(const XLineEndItem& rItem)
2227 |*
2228 |*    Beschreibung
2229 |*    Ersterstellung    15.11.94
2230 |*    Letzte Aenderung  18.11.94
2231 |*
2232 *************************************************************************/
2233 
2234 XLineEndItem::XLineEndItem(const XLineEndItem& rItem)
2235 :   NameOrIndex(rItem),
2236     maPolyPolygon(rItem.maPolyPolygon)
2237 {
2238 }
2239 
2240 /*************************************************************************
2241 |*
2242 |*    XLineEndItem::XLineEndItem(SvStream& rIn)
2243 |*
2244 |*    Beschreibung
2245 |*    Ersterstellung    15.11.94
2246 |*    Letzte Aenderung  17.11.94
2247 |*
2248 *************************************************************************/
2249 
2250 XLineEndItem::XLineEndItem(SvStream& rIn) :
2251     NameOrIndex(XATTR_LINEEND, rIn)
2252 {
2253     if (!IsIndex())
2254     {
2255         maPolyPolygon = streamInB2DPolyPolygon(rIn);
2256     }
2257 }
2258 
2259 //*************************************************************************
2260 
2261 XLineEndItem::XLineEndItem(SfxItemPool* /*pPool*/, const basegfx::B2DPolyPolygon& rPolyPolygon)
2262 :   NameOrIndex( XATTR_LINEEND, -1 ),
2263     maPolyPolygon(rPolyPolygon)
2264 {
2265 }
2266 
2267 //*************************************************************************
2268 
2269 XLineEndItem::XLineEndItem(SfxItemPool* /*pPool*/)
2270 :   NameOrIndex(XATTR_LINEEND, -1 )
2271 {
2272 }
2273 
2274 /*************************************************************************
2275 |*
2276 |*    XLineEndItem::Clone(SfxItemPool* pPool) const
2277 |*
2278 |*    Beschreibung
2279 |*    Ersterstellung    15.11.94
2280 |*    Letzte Aenderung  15.11.94
2281 |*
2282 *************************************************************************/
2283 
2284 SfxPoolItem* XLineEndItem::Clone(SfxItemPool* /*pPool*/) const
2285 {
2286     return new XLineEndItem(*this);
2287 }
2288 
2289 /*************************************************************************
2290 |*
2291 |*    int XLineEndItem::operator==(const SfxPoolItem& rItem) const
2292 |*
2293 |*    Beschreibung
2294 |*    Ersterstellung    15.11.94
2295 |*    Letzte Aenderung  17.11.94
2296 |*
2297 *************************************************************************/
2298 
2299 int XLineEndItem::operator==(const SfxPoolItem& rItem) const
2300 {
2301     return ( NameOrIndex::operator==(rItem) && ((const XLineEndItem&) rItem).maPolyPolygon == maPolyPolygon );
2302 }
2303 
2304 /*************************************************************************
2305 |*
2306 |*    SfxPoolItem* XLineEndItem::Create(SvStream& rIn, sal_uInt16 nVer) const
2307 |*
2308 |*    Beschreibung
2309 |*    Ersterstellung    15.11.94
2310 |*    Letzte Aenderung  15.11.94
2311 |*
2312 *************************************************************************/
2313 
2314 SfxPoolItem* XLineEndItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
2315 {
2316     return new XLineEndItem(rIn);
2317 }
2318 
2319 /*************************************************************************
2320 |*
2321 |*    SfxPoolItem* XLineEndItem::Store(SvStream& rOut) const
2322 |*
2323 |*    Beschreibung
2324 |*    Ersterstellung    15.11.94
2325 |*    Letzte Aenderung  17.11.94
2326 |*
2327 *************************************************************************/
2328 
2329 SvStream& XLineEndItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
2330 {
2331     NameOrIndex::Store( rOut, nItemVersion );
2332 
2333     if (!IsIndex())
2334     {
2335         streamOutB2DPolyPolygon(maPolyPolygon, rOut);
2336     }
2337 
2338     return rOut;
2339 }
2340 
2341 /*************************************************************************
2342 |*
2343 |*    const basegfx::B2DPolyPolygon& XLineEndItem::GetValue(const XLineEndTable* pTable) const
2344 |*
2345 |*    Beschreibung
2346 |*    Ersterstellung    15.11.94
2347 |*    Letzte Aenderung  18.11.94
2348 |*
2349 *************************************************************************/
2350 
2351 basegfx::B2DPolyPolygon XLineEndItem::GetLineEndValue(const XLineEndTable* pTable) const
2352 {
2353     if (!IsIndex())
2354     {
2355         return maPolyPolygon;
2356     }
2357     else
2358     {
2359         return pTable->GetLineEnd(GetIndex())->GetLineEnd();
2360     }
2361 }
2362 
2363 
2364 /** this function searches in both the models pool and the styles pool for XLineStartItem
2365     and XLineEndItem with the same value or name and returns an item with the value of
2366     this item and a unique name for an item with this value. */
2367 XLineEndItem* XLineEndItem::checkForUniqueItem( SdrModel* pModel ) const
2368 {
2369     if( pModel )
2370     {
2371         XLineEndItem* pTempItem = NULL;
2372         const XLineEndItem* pLineEndItem = this;
2373 
2374         String aUniqueName( GetName() );
2375 
2376         if( !maPolyPolygon.count() )
2377         {
2378             // if the polygon is empty, check if the name is empty
2379             if( aUniqueName.Len() == 0 )
2380                 return (XLineEndItem*)this;
2381 
2382             // force empty name for empty polygons
2383             return new XLineEndItem( String(), maPolyPolygon );
2384         }
2385 
2386         if( maPolyPolygon.count() > 1L )
2387         {
2388             // check if the polygon is closed
2389             if(!maPolyPolygon.isClosed())
2390             {
2391                 // force a closed polygon
2392                 basegfx::B2DPolyPolygon aNew(maPolyPolygon);
2393                 aNew.setClosed(true);
2394                 pTempItem = new XLineEndItem( aUniqueName, aNew );
2395                 pLineEndItem = pTempItem;
2396             }
2397         }
2398 
2399         sal_Bool bForceNew = sal_False;
2400 
2401         // 2. if we have a name check if there is already an item with the
2402         // same name in the documents pool with a different line end or start
2403 
2404         sal_uInt16 nCount, nSurrogate;
2405 
2406         const SfxItemPool* pPool1 = &pModel->GetItemPool();
2407         if( aUniqueName.Len() && pPool1 )
2408         {
2409             nCount = pPool1->GetItemCount2( XATTR_LINESTART );
2410 
2411             for( nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
2412             {
2413                 const XLineStartItem* pItem = (const XLineStartItem*)pPool1->GetItem2( XATTR_LINESTART, nSurrogate );
2414 
2415                 if( pItem && ( pItem->GetName() == pLineEndItem->GetName() ) )
2416                 {
2417                     // if there is already an item with the same name and the same
2418                     // value its ok to set it
2419                     if( pItem->GetLineStartValue() != pLineEndItem->GetLineEndValue() )
2420                     {
2421                         // same name but different value, we need a new name for this item
2422                         aUniqueName = String();
2423                         bForceNew = sal_True;
2424                     }
2425                     break;
2426                 }
2427             }
2428 
2429             if( !bForceNew )
2430             {
2431                 nCount = pPool1->GetItemCount2( XATTR_LINEEND );
2432 
2433                 for( nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
2434                 {
2435                     const XLineEndItem* pItem = (const XLineEndItem*)pPool1->GetItem2( XATTR_LINEEND, nSurrogate );
2436 
2437                     if( pItem && ( pItem->GetName() == pLineEndItem->GetName() ) )
2438                     {
2439                         // if there is already an item with the same name and the same
2440                         // value its ok to set it
2441                         if( pItem->GetLineEndValue() != pLineEndItem->GetLineEndValue() )
2442                         {
2443                             // same name but different value, we need a new name for this item
2444                             aUniqueName = String();
2445                             bForceNew = sal_True;
2446                         }
2447                         break;
2448                     }
2449                 }
2450             }
2451         }
2452 
2453         const SfxItemPool* pPool2 = pModel->GetStyleSheetPool() ? &pModel->GetStyleSheetPool()->GetPool() : NULL;
2454         if( aUniqueName.Len() && pPool2)
2455         {
2456             nCount = pPool2->GetItemCount2( XATTR_LINESTART );
2457             for( nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
2458             {
2459                 const XLineStartItem* pItem = (const XLineStartItem*)pPool2->GetItem2( XATTR_LINESTART, nSurrogate );
2460 
2461                 if( pItem && ( pItem->GetName() == pLineEndItem->GetName() ) )
2462                 {
2463                     // if there is already an item with the same name and the same
2464                     // value its ok to set it
2465                     if( pItem->GetLineStartValue() != pLineEndItem->GetLineEndValue() )
2466                     {
2467                         // same name but different value, we need a new name for this item
2468                         aUniqueName = String();
2469                         bForceNew = sal_True;
2470                     }
2471                     break;
2472                 }
2473             }
2474 
2475             if( !bForceNew )
2476             {
2477                 nCount = pPool2->GetItemCount2( XATTR_LINEEND );
2478                 for( nSurrogate = 0; nSurrogate < nCount; nSurrogate++ )
2479                 {
2480                     const XLineEndItem* pItem = (const XLineEndItem*)pPool2->GetItem2( XATTR_LINEEND, nSurrogate );
2481 
2482                     if( pItem && ( pItem->GetName() == pLineEndItem->GetName() ) )
2483                     {
2484                         // if there is already an item with the same name and the same
2485                         // value its ok to set it
2486                         if( pItem->GetLineEndValue() != pLineEndItem->GetLineEndValue() )
2487                         {
2488                             // same name but different value, we need a new name for this item
2489                             aUniqueName = String();
2490                             bForceNew = sal_True;
2491                         }
2492                         break;
2493                     }
2494                 }
2495             }
2496         }
2497 
2498         // if we have no name yet, find existing item with same conent or
2499         // create a unique name
2500         if( aUniqueName.Len() == 0 )
2501         {
2502             sal_Bool bFoundExisting = sal_False;
2503 
2504             sal_Int32 nUserIndex = 1;
2505             const ResId aRes(SVX_RES(RID_SVXSTR_LINEEND));
2506             const String aUser( aRes );
2507 
2508             if( pPool1 )
2509             {
2510                 nCount = pPool1->GetItemCount2( XATTR_LINESTART );
2511                 sal_uInt32 nSurrogate2;
2512 
2513                 for( nSurrogate2 = 0; nSurrogate2 < nCount; nSurrogate2++ )
2514                 {
2515                     const XLineStartItem* pItem = (const XLineStartItem*)pPool1->GetItem2( XATTR_LINESTART, nSurrogate2 );
2516 
2517                     if( pItem && pItem->GetName().Len() )
2518                     {
2519                         if( !bForceNew && pItem->GetLineStartValue() == pLineEndItem->GetLineEndValue() )
2520                         {
2521                             aUniqueName = pItem->GetName();
2522                             bFoundExisting = sal_True;
2523                             break;
2524                         }
2525 
2526                         if( pItem->GetName().CompareTo( aUser, aUser.Len() ) == 0 )
2527                         {
2528                             sal_Int32 nThisIndex = pItem->GetName().Copy( aUser.Len() ).ToInt32();
2529                             if( nThisIndex >= nUserIndex )
2530                                 nUserIndex = nThisIndex + 1;
2531                         }
2532                     }
2533                 }
2534 
2535                 nCount = pPool1->GetItemCount2( XATTR_LINEEND );
2536                 for( nSurrogate2 = 0; nSurrogate2 < nCount; nSurrogate2++ )
2537                 {
2538                     const XLineEndItem* pItem = (const XLineEndItem*)pPool1->GetItem2( XATTR_LINEEND, nSurrogate2 );
2539 
2540                     if( pItem && pItem->GetName().Len() )
2541                     {
2542                         if( !bForceNew && pItem->GetLineEndValue() == pLineEndItem->GetLineEndValue() )
2543                         {
2544                             aUniqueName = pItem->GetName();
2545                             bFoundExisting = sal_True;
2546                             break;
2547                         }
2548 
2549                         if( pItem->GetName().CompareTo( aUser, aUser.Len() ) == 0 )
2550                         {
2551                             sal_Int32 nThisIndex = pItem->GetName().Copy( aUser.Len() ).ToInt32();
2552                             if( nThisIndex >= nUserIndex )
2553                                 nUserIndex = nThisIndex + 1;
2554                         }
2555                     }
2556                 }
2557             }
2558 
2559             if( !bFoundExisting )
2560             {
2561                 aUniqueName = aUser;
2562                 aUniqueName += sal_Unicode(' ');
2563                 aUniqueName += String::CreateFromInt32( nUserIndex );
2564             }
2565         }
2566 
2567         // if the given name is not valid, replace it!
2568         if( aUniqueName != GetName() || pTempItem )
2569         {
2570             if( pTempItem )
2571             {
2572                 pTempItem->SetName( aUniqueName );
2573                 return pTempItem;
2574             }
2575             else
2576             {
2577                 return new XLineEndItem( aUniqueName, maPolyPolygon );
2578             }
2579         }
2580     }
2581 
2582     return (XLineEndItem*)this;
2583 }
2584 
2585 
2586 //------------------------------------------------------------------------
2587 
2588 SfxItemPresentation XLineEndItem::GetPresentation
2589 (
2590     SfxItemPresentation ePres,
2591     SfxMapUnit          /*eCoreUnit*/,
2592     SfxMapUnit          /*ePresUnit*/,
2593     XubString&          rText, const IntlWrapper *
2594 )   const
2595 {
2596     switch ( ePres )
2597     {
2598         case SFX_ITEM_PRESENTATION_NONE:
2599             rText.Erase();
2600             return ePres;
2601         case SFX_ITEM_PRESENTATION_NAMELESS:
2602         case SFX_ITEM_PRESENTATION_COMPLETE:
2603             rText = GetName();
2604             return ePres;
2605         default:
2606             return SFX_ITEM_PRESENTATION_NONE;
2607     }
2608 }
2609 
2610 sal_Bool XLineEndItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const
2611 {
2612 //    sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
2613     nMemberId &= ~CONVERT_TWIPS;
2614     if( nMemberId == MID_NAME )
2615     {
2616         rtl::OUString aApiName;
2617         SvxUnogetApiNameForItem( Which(), GetName(), aApiName );
2618         rVal <<= aApiName;
2619     }
2620     else
2621     {
2622         com::sun::star::drawing::PolyPolygonBezierCoords aBezier;
2623         SvxConvertB2DPolyPolygonToPolyPolygonBezier( maPolyPolygon, aBezier );
2624         rVal <<= aBezier;
2625     }
2626     return sal_True;
2627 }
2628 
2629 sal_Bool XLineEndItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
2630 {
2631 //    sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
2632     nMemberId &= ~CONVERT_TWIPS;
2633     if( nMemberId == MID_NAME )
2634     {
2635         return sal_False;
2636     }
2637     else
2638     {
2639         maPolyPolygon.clear();
2640 
2641         if( rVal.hasValue() && rVal.getValue() )
2642         {
2643             if( rVal.getValueType() != ::getCppuType((const com::sun::star::drawing::PolyPolygonBezierCoords*)0) )
2644                 return sal_False;
2645 
2646             com::sun::star::drawing::PolyPolygonBezierCoords* pCoords = (com::sun::star::drawing::PolyPolygonBezierCoords*)rVal.getValue();
2647             if( pCoords->Coordinates.getLength() > 0 )
2648             {
2649                 maPolyPolygon = SvxConvertPolyPolygonBezierToB2DPolyPolygon( pCoords );
2650                 // #i72807# close line start/end polygons hard
2651                 // maPolyPolygon.setClosed(true);
2652             }
2653         }
2654     }
2655 
2656     return sal_True;
2657 }
2658 
2659 // ----------------------------
2660 // class XLineStartWidthItem
2661 // ----------------------------
2662 TYPEINIT1_AUTOFACTORY(XLineStartWidthItem, SfxMetricItem);
2663 
2664 /*************************************************************************
2665 |*
2666 |*    XLineStartWidthItem::XLineStartWidthItem(sal_Int32 nWidth)
2667 |*
2668 |*    Beschreibung
2669 |*    Ersterstellung    15.11.94
2670 |*    Letzte Aenderung  18.11.94
2671 |*
2672 *************************************************************************/
2673 
2674 XLineStartWidthItem::XLineStartWidthItem(long nWidth) :
2675     SfxMetricItem(XATTR_LINESTARTWIDTH, nWidth)
2676 {
2677 }
2678 
2679 /*************************************************************************
2680 |*
2681 |*    XLineStartWidthItem::XLineStartWidthItem(SvStream& rIn)
2682 |*
2683 |*    Beschreibung
2684 |*    Ersterstellung    15.11.94
2685 |*    Letzte Aenderung  15.11.94
2686 |*
2687 *************************************************************************/
2688 
2689 XLineStartWidthItem::XLineStartWidthItem(SvStream& rIn) :
2690     SfxMetricItem(XATTR_LINESTARTWIDTH, rIn)
2691 {
2692 }
2693 
2694 /*************************************************************************
2695 |*
2696 |*    XLineStartWidthItem::Clone(SfxItemPool* pPool) const
2697 |*
2698 |*    Beschreibung
2699 |*    Ersterstellung    15.11.94
2700 |*    Letzte Aenderung  15.11.94
2701 |*
2702 *************************************************************************/
2703 
2704 SfxPoolItem* XLineStartWidthItem::Clone(SfxItemPool* /*pPool*/) const
2705 {
2706     return new XLineStartWidthItem(*this);
2707 }
2708 
2709 /*************************************************************************
2710 |*
2711 |*    SfxPoolItem* XLineStartWidthItem::Create(SvStream& rIn, sal_uInt16 nVer)
2712 |*                                              const
2713 |*
2714 |*    Beschreibung
2715 |*    Ersterstellung    15.11.94
2716 |*    Letzte Aenderung  15.11.94
2717 |*
2718 *************************************************************************/
2719 
2720 SfxPoolItem* XLineStartWidthItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
2721 {
2722     return new XLineStartWidthItem(rIn);
2723 }
2724 
2725 //------------------------------------------------------------------------
2726 
2727 SfxItemPresentation XLineStartWidthItem::GetPresentation
2728 (
2729     SfxItemPresentation ePres,
2730     SfxMapUnit          eCoreUnit,
2731     SfxMapUnit          ePresUnit,
2732     XubString&          rText, const IntlWrapper * pIntl
2733 )   const
2734 {
2735     switch ( ePres )
2736     {
2737         case SFX_ITEM_PRESENTATION_NONE:
2738             rText.Erase();
2739             return ePres;
2740         case SFX_ITEM_PRESENTATION_NAMELESS:
2741         case SFX_ITEM_PRESENTATION_COMPLETE:
2742             rText = GetMetricText( (long) GetValue(),
2743                                     eCoreUnit, ePresUnit, pIntl);
2744             rText += SVX_RESSTR( GetMetricId( ePresUnit) );
2745             return ePres;
2746         default:
2747             return SFX_ITEM_PRESENTATION_NONE;
2748     }
2749 }
2750 
2751 sal_Bool XLineStartWidthItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
2752 {
2753     rVal <<= (sal_Int32)GetValue();
2754     return sal_True;
2755 }
2756 
2757 sal_Bool XLineStartWidthItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
2758 {
2759     sal_Int32 nValue = 0;
2760     rVal >>= nValue;
2761     SetValue( nValue );
2762     return sal_True;
2763 }
2764 
2765 
2766 
2767 // --------------------------
2768 // class XLineEndWidthItem
2769 // --------------------------
2770 TYPEINIT1_AUTOFACTORY(XLineEndWidthItem, SfxMetricItem);
2771 
2772 /*************************************************************************
2773 |*
2774 |*    XLineEndWidthItem::XLineEndWidthItem(long nWidth)
2775 |*
2776 |*    Beschreibung
2777 |*    Ersterstellung    15.11.94
2778 |*    Letzte Aenderung  15.11.94
2779 |*
2780 *************************************************************************/
2781 
2782 XLineEndWidthItem::XLineEndWidthItem(long nWidth) :
2783    SfxMetricItem(XATTR_LINEENDWIDTH, nWidth)
2784 {
2785 }
2786 
2787 /*************************************************************************
2788 |*
2789 |*    XLineEndWidthItem::XLineEndWidthItem(SvStream& rIn)
2790 |*
2791 |*    Beschreibung
2792 |*    Ersterstellung    15.11.94
2793 |*    Letzte Aenderung  15.11.94
2794 |*
2795 *************************************************************************/
2796 
2797 XLineEndWidthItem::XLineEndWidthItem(SvStream& rIn) :
2798     SfxMetricItem(XATTR_LINEENDWIDTH, rIn)
2799 {
2800 }
2801 
2802 /*************************************************************************
2803 |*
2804 |*    XLineEndWidthItem::Clone(SfxItemPool* pPool) const
2805 |*
2806 |*    Beschreibung
2807 |*    Ersterstellung    15.11.94
2808 |*    Letzte Aenderung  15.11.94
2809 |*
2810 *************************************************************************/
2811 
2812 SfxPoolItem* XLineEndWidthItem::Clone(SfxItemPool* /*pPool*/) const
2813 {
2814     return new XLineEndWidthItem(*this);
2815 }
2816 
2817 /*************************************************************************
2818 |*
2819 |*    SfxPoolItem* XLineEndWidthItem::Create(SvStream& rIn, sal_uInt16 nVer) const
2820 |*
2821 |*    Beschreibung
2822 |*    Ersterstellung    15.11.94
2823 |*    Letzte Aenderung  15.11.94
2824 |*
2825 *************************************************************************/
2826 
2827 SfxPoolItem* XLineEndWidthItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
2828 {
2829     return new XLineEndWidthItem(rIn);
2830 }
2831 
2832 //------------------------------------------------------------------------
2833 
2834 SfxItemPresentation XLineEndWidthItem::GetPresentation
2835 (
2836     SfxItemPresentation ePres,
2837     SfxMapUnit          eCoreUnit,
2838     SfxMapUnit          ePresUnit,
2839     XubString&          rText, const IntlWrapper *pIntl
2840 )   const
2841 {
2842     switch ( ePres )
2843     {
2844         case SFX_ITEM_PRESENTATION_NONE:
2845             rText.Erase();
2846             return ePres;
2847         case SFX_ITEM_PRESENTATION_NAMELESS:
2848         case SFX_ITEM_PRESENTATION_COMPLETE:
2849             rText = GetMetricText( (long) GetValue(),
2850                                     eCoreUnit, ePresUnit, pIntl);
2851             rText += SVX_RESSTR( GetMetricId( ePresUnit) );
2852             return ePres;
2853         default:
2854             return SFX_ITEM_PRESENTATION_NONE;
2855     }
2856 }
2857 
2858 sal_Bool XLineEndWidthItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
2859 {
2860     rVal <<= (sal_Int32)GetValue();
2861     return sal_True;
2862 }
2863 
2864 sal_Bool XLineEndWidthItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
2865 {
2866     sal_Int32 nValue = 0;
2867     rVal >>= nValue;
2868     SetValue( nValue );
2869     return sal_True;
2870 }
2871 
2872 
2873 // -----------------------------
2874 // class XLineStartCenterItem
2875 // -----------------------------
2876 TYPEINIT1_AUTOFACTORY(XLineStartCenterItem, SfxBoolItem);
2877 
2878 /*************************************************************************
2879 |*
2880 |*    XLineStartCenterItem::XLineStartCenterItem(sal_Bool bStartCenter)
2881 |*
2882 |*    Beschreibung
2883 |*    Ersterstellung    15.11.94
2884 |*    Letzte Aenderung  15.11.94
2885 |*
2886 *************************************************************************/
2887 
2888 XLineStartCenterItem::XLineStartCenterItem(sal_Bool bStartCenter) :
2889     SfxBoolItem(XATTR_LINESTARTCENTER, bStartCenter)
2890 {
2891 }
2892 
2893 /*************************************************************************
2894 |*
2895 |*    XLineStartCenterItem::XLineStartCenterItem(SvStream& rIn)
2896 |*
2897 |*    Beschreibung
2898 |*    Ersterstellung    15.11.94
2899 |*    Letzte Aenderung  15.11.94
2900 |*
2901 *************************************************************************/
2902 
2903 XLineStartCenterItem::XLineStartCenterItem(SvStream& rIn) :
2904     SfxBoolItem(XATTR_LINESTARTCENTER, rIn)
2905 {
2906 }
2907 
2908 /*************************************************************************
2909 |*
2910 |*    XLineStartCenterItem::Clone(SfxItemPool* pPool) const
2911 |*
2912 |*    Beschreibung
2913 |*    Ersterstellung    15.11.94
2914 |*    Letzte Aenderung  15.11.94
2915 |*
2916 *************************************************************************/
2917 
2918 SfxPoolItem* XLineStartCenterItem::Clone(SfxItemPool* /*pPool*/) const
2919 {
2920     return new XLineStartCenterItem(*this);
2921 }
2922 
2923 /*************************************************************************
2924 |*
2925 |*    SfxPoolItem* XLineStartCenterItem::Create(SvStream& rIn, sal_uInt16 nVer)
2926 |*                                              const
2927 |*
2928 |*    Beschreibung
2929 |*    Ersterstellung    15.11.94
2930 |*    Letzte Aenderung  15.11.94
2931 |*
2932 *************************************************************************/
2933 
2934 SfxPoolItem* XLineStartCenterItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
2935 {
2936     return new XLineStartCenterItem(rIn);
2937 }
2938 
2939 //------------------------------------------------------------------------
2940 
2941 SfxItemPresentation XLineStartCenterItem::GetPresentation
2942 (
2943     SfxItemPresentation ePres,
2944     SfxMapUnit          /*eCoreUnit*/,
2945     SfxMapUnit          /*ePresUnit*/,
2946     XubString&          rText, const IntlWrapper *
2947 )   const
2948 {
2949     switch ( ePres )
2950     {
2951         case SFX_ITEM_PRESENTATION_NONE:
2952             rText.Erase();
2953             return ePres;
2954         case SFX_ITEM_PRESENTATION_NAMELESS:
2955         case SFX_ITEM_PRESENTATION_COMPLETE:
2956             rText = XubString( ResId( GetValue() ? RID_SVXSTR_CENTERED :
2957                             RID_SVXSTR_NOTCENTERED, DIALOG_MGR() ) );
2958             return ePres;
2959         default:
2960             return SFX_ITEM_PRESENTATION_NONE;
2961     }
2962 }
2963 
2964 sal_Bool XLineStartCenterItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
2965 {
2966     sal_Bool bValue = GetValue();
2967     rVal.setValue( &bValue, ::getCppuBooleanType()  );
2968     return sal_True;
2969 }
2970 
2971 sal_Bool XLineStartCenterItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
2972 {
2973     if( !rVal.hasValue() || rVal.getValueType() != ::getCppuBooleanType() )
2974         return sal_False;
2975 
2976     SetValue( *(sal_Bool*)rVal.getValue() );
2977     return sal_True;
2978 }
2979 
2980 
2981 // ---------------------------
2982 // class XLineEndCenterItem
2983 // ---------------------------
2984 TYPEINIT1_AUTOFACTORY(XLineEndCenterItem, SfxBoolItem);
2985 
2986 /*************************************************************************
2987 |*
2988 |*    XLineEndCenterItem::XLineEndCenterItem(sal_Bool bEndCenter)
2989 |*
2990 |*    Beschreibung
2991 |*    Ersterstellung    15.11.94
2992 |*    Letzte Aenderung  15.11.94
2993 |*
2994 *************************************************************************/
2995 
2996 XLineEndCenterItem::XLineEndCenterItem(sal_Bool bEndCenter) :
2997     SfxBoolItem(XATTR_LINEENDCENTER, bEndCenter)
2998 {
2999 }
3000 
3001 /*************************************************************************
3002 |*
3003 |*    XLineEndCenterItem::XLineEndCenterItem(SvStream& rIn)
3004 |*
3005 |*    Beschreibung
3006 |*    Ersterstellung    15.11.94
3007 |*    Letzte Aenderung  15.11.94
3008 |*
3009 *************************************************************************/
3010 
3011 XLineEndCenterItem::XLineEndCenterItem(SvStream& rIn) :
3012     SfxBoolItem(XATTR_LINEENDCENTER, rIn)
3013 {
3014 }
3015 
3016 /*************************************************************************
3017 |*
3018 |*    XLineEndCenterItem::Clone(SfxItemPool* pPool) const
3019 |*
3020 |*    Beschreibung
3021 |*    Ersterstellung    15.11.94
3022 |*    Letzte Aenderung  15.11.94
3023 |*
3024 *************************************************************************/
3025 
3026 SfxPoolItem* XLineEndCenterItem::Clone(SfxItemPool* /*pPool*/) const
3027 {
3028     return new XLineEndCenterItem(*this);
3029 }
3030 
3031 /*************************************************************************
3032 |*
3033 |*    SfxPoolItem* XLineEndCenterItem::Create(SvStream& rIn, sal_uInt16 nVer)
3034 |*                                              const
3035 |*
3036 |*    Beschreibung
3037 |*    Ersterstellung    15.11.94
3038 |*    Letzte Aenderung  15.11.94
3039 |*
3040 *************************************************************************/
3041 
3042 SfxPoolItem* XLineEndCenterItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
3043 {
3044     return new XLineEndCenterItem(rIn);
3045 }
3046 
3047 //------------------------------------------------------------------------
3048 
3049 SfxItemPresentation XLineEndCenterItem::GetPresentation
3050 (
3051     SfxItemPresentation ePres,
3052     SfxMapUnit          /*eCoreUnit*/,
3053     SfxMapUnit          /*ePresUnit*/,
3054     XubString&          rText, const IntlWrapper *
3055 )   const
3056 {
3057     switch ( ePres )
3058     {
3059         case SFX_ITEM_PRESENTATION_NONE:
3060             rText.Erase();
3061             return ePres;
3062         case SFX_ITEM_PRESENTATION_NAMELESS:
3063         case SFX_ITEM_PRESENTATION_COMPLETE:
3064             rText = XubString( ResId( GetValue() ? RID_SVXSTR_CENTERED :
3065                             RID_SVXSTR_NOTCENTERED, DIALOG_MGR() ) );
3066             return ePres;
3067         default:
3068             return SFX_ITEM_PRESENTATION_NONE;
3069     }
3070 }
3071 
3072 sal_Bool XLineEndCenterItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
3073 {
3074     sal_Bool bValue = GetValue();
3075     rVal.setValue( &bValue, ::getCppuBooleanType()  );
3076     return sal_True;
3077 }
3078 
3079 sal_Bool XLineEndCenterItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
3080 {
3081     if( !rVal.hasValue() || rVal.getValueType() != ::getCppuBooleanType() )
3082         return sal_False;
3083 
3084     SetValue( *(sal_Bool*)rVal.getValue() );
3085     return sal_True;
3086 }
3087 
3088 
3089 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3090 //                           Fuellattribute
3091 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3092 
3093 // --------------------
3094 // class XFillStyleItem
3095 // --------------------
3096 TYPEINIT1_AUTOFACTORY(XFillStyleItem, SfxEnumItem);
3097 
3098 /*************************************************************************
3099 |*
3100 |*    XFillStyleItem::XFillStyleItem(XFillStyle eFillStyle)
3101 |*
3102 |*    Beschreibung
3103 |*    Ersterstellung    15.11.94
3104 |*    Letzte Aenderung  15.11.94
3105 |*
3106 *************************************************************************/
3107 
3108 XFillStyleItem::XFillStyleItem(XFillStyle eFillStyle) :
3109     SfxEnumItem(XATTR_FILLSTYLE, sal::static_int_cast< sal_uInt16 >(eFillStyle))
3110 {
3111 }
3112 
3113 /*************************************************************************
3114 |*
3115 |*    XFillStyleItem::XFillStyleItem(SvStream& rIn)
3116 |*
3117 |*    Beschreibung
3118 |*    Ersterstellung    15.11.94
3119 |*    Letzte Aenderung  15.11.94
3120 |*
3121 *************************************************************************/
3122 
3123 XFillStyleItem::XFillStyleItem(SvStream& rIn) :
3124     SfxEnumItem(XATTR_FILLSTYLE, rIn)
3125 {
3126 }
3127 
3128 /*************************************************************************
3129 |*
3130 |*    XFillStyleItem::Clone(SfxItemPool* pPool) const
3131 |*
3132 |*    Beschreibung
3133 |*    Ersterstellung    09.11.94
3134 |*    Letzte Aenderung  09.11.94
3135 |*
3136 *************************************************************************/
3137 
3138 SfxPoolItem* XFillStyleItem::Clone(SfxItemPool* /*pPool*/) const
3139 {
3140     return new XFillStyleItem( *this );
3141 }
3142 
3143 /*************************************************************************
3144 |*
3145 |*    SfxPoolItem* XFillStyleItem::Create(SvStream& rIn, sal_uInt16 nVer) const
3146 |*
3147 |*    Beschreibung
3148 |*    Ersterstellung    15.11.94
3149 |*    Letzte Aenderung  15.11.94
3150 |*
3151 *************************************************************************/
3152 
3153 SfxPoolItem* XFillStyleItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
3154 {
3155     return new XFillStyleItem(rIn);
3156 }
3157 
3158 //------------------------------------------------------------------------
3159 
3160 SfxItemPresentation XFillStyleItem::GetPresentation
3161 (
3162     SfxItemPresentation ePres,
3163     SfxMapUnit          /*eCoreUnit*/,
3164     SfxMapUnit          /*ePresUnit*/,
3165     XubString&          rText, const IntlWrapper *
3166 )   const
3167 {
3168     rText.Erase();
3169 
3170     switch ( ePres )
3171     {
3172         case SFX_ITEM_PRESENTATION_NONE:
3173             return ePres;
3174 
3175         case SFX_ITEM_PRESENTATION_NAMELESS:
3176         case SFX_ITEM_PRESENTATION_COMPLETE:
3177         {
3178             sal_uInt16 nId = 0;
3179 
3180             switch( (sal_uInt16)GetValue() )
3181             {
3182                 case XFILL_NONE:
3183                     nId = RID_SVXSTR_INVISIBLE;
3184                     break;
3185                 case XFILL_SOLID:
3186                     nId = RID_SVXSTR_SOLID;
3187                     break;
3188                 case XFILL_GRADIENT:
3189                     nId = RID_SVXSTR_GRADIENT;
3190                     break;
3191                 case XFILL_HATCH:
3192                     nId = RID_SVXSTR_HATCH;
3193                     break;
3194                 case XFILL_BITMAP:
3195                     nId = RID_SVXSTR_BITMAP;
3196                     break;
3197             }
3198 
3199             if ( nId )
3200                 rText = SVX_RESSTR( nId );
3201             return ePres;
3202         }
3203         default:
3204             return SFX_ITEM_PRESENTATION_NONE;
3205     }
3206 }
3207 
3208 //------------------------------------------------------------------------
3209 
3210 sal_uInt16 XFillStyleItem::GetValueCount() const
3211 {
3212     return 5;
3213 }
3214 
3215 // -----------------------------------------------------------------------
3216 sal_Bool XFillStyleItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
3217 {
3218     ::com::sun::star::drawing::FillStyle eFS = (::com::sun::star::drawing::FillStyle)GetValue();
3219 
3220     rVal <<= eFS;
3221 
3222     return sal_True;
3223 }
3224 
3225 // -----------------------------------------------------------------------
3226 sal_Bool XFillStyleItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
3227 {
3228     ::com::sun::star::drawing::FillStyle eFS;
3229     if(!(rVal >>= eFS))
3230     {
3231         // also try an int (for Basic)
3232         sal_Int32 nFS = 0;
3233         if(!(rVal >>= nFS))
3234             return sal_False;
3235         eFS = (::com::sun::star::drawing::FillStyle)nFS;
3236     }
3237 
3238     SetValue( sal::static_int_cast< sal_uInt16 >( eFS ) );
3239 
3240     return sal_True;
3241 }
3242 
3243 
3244 // -------------------
3245 // class XFillColorItem
3246 // -------------------
3247 TYPEINIT1_AUTOFACTORY(XFillColorItem, XColorItem);
3248 
3249 /*************************************************************************
3250 |*
3251 |*    XFillColorItem::XFillColorItem(sal_Int32 nIndex, const Color& rTheColor)
3252 |*
3253 |*    Beschreibung
3254 |*    Ersterstellung    15.11.94
3255 |*    Letzte Aenderung  15.11.94
3256 |*
3257 *************************************************************************/
3258 
3259 XFillColorItem::XFillColorItem(sal_Int32 nIndex, const Color& rTheColor) :
3260     XColorItem(XATTR_FILLCOLOR, nIndex, rTheColor)
3261 {
3262 }
3263 
3264 /*************************************************************************
3265 |*
3266 |*    XFillColorItem::XFillColorItem(const XubString& rName, const Color& rTheColor)
3267 |*
3268 |*    Beschreibung
3269 |*    Ersterstellung    15.11.94
3270 |*    Letzte Aenderung  15.11.94
3271 |*
3272 *************************************************************************/
3273 
3274 XFillColorItem::XFillColorItem(const XubString& rName, const Color& rTheColor) :
3275     XColorItem(XATTR_FILLCOLOR, rName, rTheColor)
3276 {
3277 }
3278 
3279 /*************************************************************************
3280 |*
3281 |*    XFillColorItem::XFillColorItem(SvStream& rIn)
3282 |*
3283 |*    Beschreibung
3284 |*    Ersterstellung    15.11.94
3285 |*    Letzte Aenderung  15.11.94
3286 |*
3287 *************************************************************************/
3288 
3289 XFillColorItem::XFillColorItem(SvStream& rIn) :
3290     XColorItem(XATTR_FILLCOLOR, rIn)
3291 {
3292 }
3293 
3294 /*************************************************************************
3295 |*
3296 |*    XFillColorItem::Clone(SfxItemPool* pPool) const
3297 |*
3298 |*    Beschreibung
3299 |*    Ersterstellung    15.11.94
3300 |*    Letzte Aenderung  15.11.94
3301 |*
3302 *************************************************************************/
3303 
3304 SfxPoolItem* XFillColorItem::Clone(SfxItemPool* /*pPool*/) const
3305 {
3306     return new XFillColorItem(*this);
3307 }
3308 
3309 /*************************************************************************
3310 |*
3311 |*    SfxPoolItem* XFillColorItem::Create(SvStream& rIn, sal_uInt16 nVer) const
3312 |*
3313 |*    Beschreibung
3314 |*    Ersterstellung    15.11.94
3315 |*    Letzte Aenderung  15.11.94
3316 |*
3317 *************************************************************************/
3318 
3319 SfxPoolItem* XFillColorItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
3320 {
3321     return new XFillColorItem(rIn);
3322 }
3323 
3324 //------------------------------------------------------------------------
3325 
3326 SfxItemPresentation XFillColorItem::GetPresentation
3327 (
3328     SfxItemPresentation ePres,
3329     SfxMapUnit          /*eCoreUnit*/,
3330     SfxMapUnit          /*ePresUnit*/,
3331     XubString&          rText, const IntlWrapper *
3332 )   const
3333 {
3334     switch ( ePres )
3335     {
3336         case SFX_ITEM_PRESENTATION_NONE:
3337             rText.Erase();
3338             return ePres;
3339         case SFX_ITEM_PRESENTATION_NAMELESS:
3340         case SFX_ITEM_PRESENTATION_COMPLETE:
3341             rText = GetName();
3342             return ePres;
3343         default:
3344             return SFX_ITEM_PRESENTATION_NONE;
3345     }
3346 }
3347 
3348 // -----------------------------------------------------------------------
3349 
3350 sal_Bool XFillColorItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
3351 {
3352     rVal <<= (sal_Int32)GetColorValue().GetRGBColor();
3353 
3354     return sal_True;
3355 }
3356 
3357 // -----------------------------------------------------------------------
3358 
3359 sal_Bool XFillColorItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
3360 {
3361     sal_Int32 nValue = 0;
3362     if(!(rVal >>= nValue ))
3363         return sal_False;
3364 
3365     SetColorValue( nValue );
3366     return sal_True;
3367 }
3368 
3369 // -----------------------------
3370 // class XSecondaryFillColorItem
3371 // -----------------------------
3372 TYPEINIT1_AUTOFACTORY(XSecondaryFillColorItem, XColorItem);
3373 
3374 XSecondaryFillColorItem::XSecondaryFillColorItem(sal_Int32 nIndex, const Color& rTheColor) :
3375     XColorItem(XATTR_SECONDARYFILLCOLOR, nIndex, rTheColor)
3376 {
3377 }
3378 
3379 XSecondaryFillColorItem::XSecondaryFillColorItem(const XubString& rName, const Color& rTheColor) :
3380     XColorItem(XATTR_SECONDARYFILLCOLOR, rName, rTheColor)
3381 {
3382 }
3383 
3384 XSecondaryFillColorItem::XSecondaryFillColorItem( SvStream& rIn ) :
3385     XColorItem(XATTR_SECONDARYFILLCOLOR, rIn)
3386 {
3387 }
3388 
3389 SfxPoolItem* XSecondaryFillColorItem::Clone(SfxItemPool* /*pPool*/) const
3390 {
3391     return new XSecondaryFillColorItem(*this);
3392 }
3393 
3394 SfxPoolItem* XSecondaryFillColorItem::Create( SvStream& rIn, sal_uInt16 nVer ) const
3395 {
3396     if ( nVer >= 2 )
3397         return new XSecondaryFillColorItem( rIn );
3398     else
3399         return new XSecondaryFillColorItem( String(), Color(0,184,255) );
3400 }
3401 sal_uInt16 XSecondaryFillColorItem::GetVersion( sal_uInt16 /*nFileFormatVersion*/ ) const
3402 {
3403     return 2;
3404 }
3405 SfxItemPresentation XSecondaryFillColorItem::GetPresentation
3406 (
3407     SfxItemPresentation ePres,
3408     SfxMapUnit          /*eCoreUnit*/,
3409     SfxMapUnit          /*ePresUnit*/,
3410     XubString&          rText, const IntlWrapper *
3411 )   const
3412 {
3413     switch ( ePres )
3414     {
3415         case SFX_ITEM_PRESENTATION_NONE:
3416             rText.Erase();
3417             return ePres;
3418         case SFX_ITEM_PRESENTATION_NAMELESS:
3419         case SFX_ITEM_PRESENTATION_COMPLETE:
3420             rText = GetName();
3421             return ePres;
3422         default:
3423             return SFX_ITEM_PRESENTATION_NONE;
3424     }
3425 }
3426 
3427 // ----------------
3428 // class XGradient
3429 // ----------------
3430 
3431 /*************************************************************************
3432 |*
3433 |*    XGradient::XGradient()
3434 |*
3435 *************************************************************************/
3436 
3437 XGradient::XGradient() :
3438     eStyle( XGRAD_LINEAR ),
3439     aStartColor( Color( COL_BLACK ) ),
3440     aEndColor( Color( COL_WHITE ) ),
3441     nAngle( 0 ),
3442     nBorder( 0 ),
3443     nOfsX( 50 ),
3444     nOfsY( 50 ),
3445     nIntensStart( 100 ),
3446     nIntensEnd( 100 ),
3447     nStepCount( 0 )
3448 {
3449 }
3450 
3451 /*************************************************************************
3452 |*
3453 |*    XGradient::XGradient(XGradientStyle, const Color&, const Color&,
3454 |*                         long, sal_uInt16, sal_uInt16, sal_uInt16)
3455 |*
3456 |*    Beschreibung
3457 |*    Ersterstellung    21.11.94
3458 |*    Letzte Aenderung  21.11.94
3459 |*
3460 *************************************************************************/
3461 
3462 XGradient::XGradient(const Color& rStart, const Color& rEnd,
3463                      XGradientStyle eTheStyle, long nTheAngle, sal_uInt16 nXOfs,
3464                      sal_uInt16 nYOfs, sal_uInt16 nTheBorder,
3465                      sal_uInt16 nStartIntens, sal_uInt16 nEndIntens,
3466                      sal_uInt16 nSteps) :
3467     eStyle(eTheStyle),
3468     aStartColor(rStart),
3469     aEndColor(rEnd),
3470     nAngle(nTheAngle),
3471     nBorder(nTheBorder),
3472     nOfsX(nXOfs),
3473     nOfsY(nYOfs),
3474     nIntensStart(nStartIntens),
3475     nIntensEnd(nEndIntens),
3476     nStepCount(nSteps)
3477 {
3478 }
3479 
3480 /*************************************************************************
3481 |*
3482 |*    int XGradient::operator==(const SfxPoolItem& rItem) const
3483 |*
3484 |*    Beschreibung
3485 |*    Ersterstellung    29.11.94
3486 |*    Letzte Aenderung  29.11.94
3487 |*
3488 *************************************************************************/
3489 
3490 bool XGradient::operator==(const XGradient& rGradient) const
3491 {
3492     return ( eStyle         == rGradient.eStyle         &&
3493              aStartColor    == rGradient.aStartColor    &&
3494              aEndColor      == rGradient.aEndColor      &&
3495              nAngle         == rGradient.nAngle         &&
3496              nBorder        == rGradient.nBorder        &&
3497              nOfsX          == rGradient.nOfsX          &&
3498              nOfsY          == rGradient.nOfsY          &&
3499              nIntensStart   == rGradient.nIntensStart   &&
3500              nIntensEnd     == rGradient.nIntensEnd     &&
3501              nStepCount     == rGradient.nStepCount );
3502 }
3503 
3504 
3505 // -----------------------
3506 // class XFillGradientItem
3507 // -----------------------
3508 TYPEINIT1_AUTOFACTORY(XFillGradientItem, NameOrIndex);
3509 
3510 /*************************************************************************
3511 |*
3512 |*    XFillGradientItem::XFillGradientItem(sal_Int32 nIndex,
3513 |*                                       const XGradient& rTheGradient)
3514 |*
3515 |*    Beschreibung
3516 |*    Ersterstellung    15.11.94
3517 |*    Letzte Aenderung  15.11.94
3518 |*
3519 *************************************************************************/
3520 
3521 XFillGradientItem::XFillGradientItem(sal_Int32 nIndex,
3522                                    const XGradient& rTheGradient) :
3523     NameOrIndex(XATTR_FILLGRADIENT, nIndex),
3524     aGradient(rTheGradient)
3525 {
3526 }
3527 
3528 /*************************************************************************
3529 |*
3530 |*    XFillGradientItem::XFillGradientItem(const XubString& rName,
3531 |*                                       const XGradient& rTheGradient)
3532 |*
3533 |*    Beschreibung
3534 |*    Ersterstellung    15.11.94
3535 |*    Letzte Aenderung  15.11.94
3536 |*
3537 *************************************************************************/
3538 
3539 XFillGradientItem::XFillGradientItem(const XubString& rName,
3540                                    const XGradient& rTheGradient) :
3541     NameOrIndex(XATTR_FILLGRADIENT, rName),
3542     aGradient(rTheGradient)
3543 {
3544 }
3545 
3546 /*************************************************************************
3547 |*
3548 |*    XFillGradientItem::XFillGradientItem(const XFillGradientItem& rItem)
3549 |*
3550 |*    Beschreibung
3551 |*    Ersterstellung    15.11.94
3552 |*    Letzte Aenderung  15.11.94
3553 |*
3554 *************************************************************************/
3555 
3556 XFillGradientItem::XFillGradientItem(const XFillGradientItem& rItem) :
3557     NameOrIndex(rItem),
3558     aGradient(rItem.aGradient)
3559 {
3560 }
3561 
3562 /*************************************************************************
3563 |*
3564 |*    XFillGradientItem::XFillGradientItem(SvStream& rIn)
3565 |*
3566 |*    Beschreibung
3567 |*    Ersterstellung    15.11.94
3568 |*    Letzte Aenderung  15.11.94
3569 |*
3570 *************************************************************************/
3571 
3572 XFillGradientItem::XFillGradientItem(SvStream& rIn, sal_uInt16 nVer) :
3573     NameOrIndex(XATTR_FILLGRADIENT, rIn),
3574     aGradient(COL_BLACK, COL_WHITE)
3575 {
3576     if (!IsIndex())
3577     {
3578         sal_uInt16 nUSTemp;
3579         sal_uInt16 nRed;
3580         sal_uInt16 nGreen;
3581         sal_uInt16 nBlue;
3582         sal_Int16  nITemp;
3583         sal_Int32  nLTemp;
3584 
3585         rIn >> nITemp; aGradient.SetGradientStyle((XGradientStyle)nITemp);
3586         rIn >> nRed;
3587         rIn >> nGreen;
3588         rIn >> nBlue;
3589         Color aCol;
3590         aCol = Color( (sal_uInt8)( nRed >> 8 ), (sal_uInt8)( nGreen >> 8 ), (sal_uInt8)( nBlue >> 8 ) );
3591         aGradient.SetStartColor( aCol );
3592 
3593         rIn >> nRed;
3594         rIn >> nGreen;
3595         rIn >> nBlue;
3596         aCol = Color( (sal_uInt8)( nRed >> 8 ), (sal_uInt8)( nGreen >> 8 ), (sal_uInt8)( nBlue >> 8 ) );
3597         aGradient.SetEndColor(aCol);
3598         rIn >> nLTemp; aGradient.SetAngle(nLTemp);
3599         rIn >> nUSTemp; aGradient.SetBorder(nUSTemp);
3600         rIn >> nUSTemp; aGradient.SetXOffset(nUSTemp);
3601         rIn >> nUSTemp; aGradient.SetYOffset(nUSTemp);
3602         rIn >> nUSTemp; aGradient.SetStartIntens(nUSTemp);
3603         rIn >> nUSTemp; aGradient.SetEndIntens(nUSTemp);
3604 
3605         // bei neueren Versionen wird zusaetzlich
3606         // die Schrittweite mit eingelesen
3607         if (nVer >= 1)
3608         {
3609             rIn >> nUSTemp; aGradient.SetSteps(nUSTemp);
3610         }
3611     }
3612 }
3613 
3614 //*************************************************************************
3615 
3616 XFillGradientItem::XFillGradientItem(SfxItemPool* /*pPool*/, const XGradient& rTheGradient)
3617 :   NameOrIndex( XATTR_FILLGRADIENT, -1 ),
3618     aGradient(rTheGradient)
3619 {
3620 }
3621 
3622 //*************************************************************************
3623 
3624 XFillGradientItem::XFillGradientItem(SfxItemPool* /*pPool*/)
3625 : NameOrIndex(XATTR_FILLGRADIENT, -1 )
3626 {
3627 }
3628 
3629 /*************************************************************************
3630 |*
3631 |*    XFillGradientItem::Clone(SfxItemPool* pPool) const
3632 |*
3633 |*    Beschreibung
3634 |*    Ersterstellung    15.11.94
3635 |*    Letzte Aenderung  15.11.94
3636 |*
3637 *************************************************************************/
3638 
3639 SfxPoolItem* XFillGradientItem::Clone(SfxItemPool* /*pPool*/) const
3640 {
3641     return new XFillGradientItem(*this);
3642 }
3643 
3644 /*************************************************************************
3645 |*
3646 |*    int XFillGradientItem::operator==(const SfxPoolItem& rItem) const
3647 |*
3648 |*    Beschreibung
3649 |*    Ersterstellung    15.11.94
3650 |*    Letzte Aenderung  15.11.94
3651 |*
3652 *************************************************************************/
3653 
3654 int XFillGradientItem::operator==(const SfxPoolItem& rItem) const
3655 {
3656     return ( NameOrIndex::operator==(rItem) &&
3657              aGradient == ((const XFillGradientItem&) rItem).aGradient );
3658 }
3659 
3660 /*************************************************************************
3661 |*
3662 |*    SfxPoolItem* XFillGradientItem::Create(SvStream& rIn, sal_uInt16 nVer) const
3663 |*
3664 |*    Beschreibung
3665 |*    Ersterstellung    15.11.94
3666 |*    Letzte Aenderung  15.11.94
3667 |*
3668 *************************************************************************/
3669 
3670 SfxPoolItem* XFillGradientItem::Create(SvStream& rIn, sal_uInt16 nVer) const
3671 {
3672     return new XFillGradientItem(rIn, nVer);
3673 }
3674 
3675 /*************************************************************************
3676 |*
3677 |*    SfxPoolItem* XFillGradientItem::Store(SvStream& rOut) const
3678 |*
3679 |*    Beschreibung
3680 |*    Ersterstellung    15.11.94
3681 |*    Letzte Aenderung  15.11.94
3682 |*
3683 *************************************************************************/
3684 
3685 SvStream& XFillGradientItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
3686 {
3687     NameOrIndex::Store( rOut, nItemVersion );
3688 
3689     if (!IsIndex())
3690     {
3691         rOut << (sal_Int16)aGradient.GetGradientStyle();
3692 
3693         sal_uInt16 nTmp;
3694 
3695         nTmp = VCLTOSVCOL( aGradient.GetStartColor().GetRed() ); rOut << nTmp;
3696         nTmp = VCLTOSVCOL( aGradient.GetStartColor().GetGreen() ); rOut << nTmp;
3697         nTmp = VCLTOSVCOL( aGradient.GetStartColor().GetBlue() ); rOut << nTmp;
3698         nTmp = VCLTOSVCOL( aGradient.GetEndColor().GetRed() ); rOut << nTmp;
3699         nTmp = VCLTOSVCOL( aGradient.GetEndColor().GetGreen() ); rOut << nTmp;
3700         nTmp = VCLTOSVCOL( aGradient.GetEndColor().GetBlue() ); rOut << nTmp;
3701 
3702         rOut << (sal_Int32) aGradient.GetAngle();
3703         rOut << aGradient.GetBorder();
3704         rOut << aGradient.GetXOffset();
3705         rOut << aGradient.GetYOffset();
3706         rOut << aGradient.GetStartIntens();
3707         rOut << aGradient.GetEndIntens();
3708         rOut << aGradient.GetSteps();
3709     }
3710 
3711     return rOut;
3712 }
3713 
3714 /*************************************************************************
3715 |*
3716 |*    const XGradient& XFillGradientItem::GetValue(const XGradientTable* pTable)
3717 |*                                                                 const
3718 |*
3719 |*    Beschreibung
3720 |*    Ersterstellung    15.11.94
3721 |*    Letzte Aenderung  18.11.94
3722 |*
3723 *************************************************************************/
3724 
3725 const XGradient& XFillGradientItem::GetGradientValue(const XGradientTable* pTable) const // GetValue -> GetGradientValue
3726 {
3727     if (!IsIndex())
3728         return aGradient;
3729     else
3730         return pTable->GetGradient(GetIndex())->GetGradient();
3731 }
3732 
3733 
3734 /*************************************************************************
3735 |*
3736 |*    sal_uInt16 XFillGradientItem::GetVersion() const
3737 |*
3738 |*    Beschreibung
3739 |*    Ersterstellung    01.11.95
3740 |*    Letzte Aenderung  01.11.95
3741 |*
3742 *************************************************************************/
3743 
3744 sal_uInt16 XFillGradientItem::GetVersion( sal_uInt16 /*nFileFormatVersion*/) const
3745 {
3746     // !!! this version number also represents the version number of superclasses
3747     // !!! (e.g. XFillFloatTransparenceItem); if you make any changes here,
3748     // !!! the superclass is also affected
3749     return 1;
3750 }
3751 
3752 //------------------------------------------------------------------------
3753 
3754 SfxItemPresentation XFillGradientItem::GetPresentation
3755 (
3756     SfxItemPresentation ePres,
3757     SfxMapUnit          /*eCoreUnit*/,
3758     SfxMapUnit          /*ePresUnit*/,
3759     XubString&          rText, const IntlWrapper *
3760 )   const
3761 {
3762     switch ( ePres )
3763     {
3764         case SFX_ITEM_PRESENTATION_NONE:
3765             rText.Erase();
3766             return ePres;
3767         case SFX_ITEM_PRESENTATION_NAMELESS:
3768         case SFX_ITEM_PRESENTATION_COMPLETE:
3769             rText = GetName();
3770             return ePres;
3771         default:
3772             return SFX_ITEM_PRESENTATION_NONE;
3773     }
3774 }
3775 
3776 // -----------------------------------------------------------------------
3777 sal_Bool XFillGradientItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const
3778 {
3779     //sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
3780     nMemberId &= ~CONVERT_TWIPS;
3781     switch ( nMemberId )
3782     {
3783         case 0:
3784         {
3785             uno::Sequence< beans::PropertyValue > aPropSeq( 2 );
3786 
3787             ::com::sun::star::awt::Gradient aGradient2;
3788 
3789             const XGradient& aXGradient = GetGradientValue();
3790             aGradient2.Style = (::com::sun::star::awt::GradientStyle) aXGradient.GetGradientStyle();
3791             aGradient2.StartColor = (sal_Int32)aXGradient.GetStartColor().GetColor();
3792             aGradient2.EndColor = (sal_Int32)aXGradient.GetEndColor().GetColor();
3793             aGradient2.Angle = (short)aXGradient.GetAngle();
3794             aGradient2.Border = aXGradient.GetBorder();
3795             aGradient2.XOffset = aXGradient.GetXOffset();
3796             aGradient2.YOffset = aXGradient.GetYOffset();
3797             aGradient2.StartIntensity = aXGradient.GetStartIntens();
3798             aGradient2.EndIntensity = aXGradient.GetEndIntens();
3799             aGradient2.StepCount = aXGradient.GetSteps();
3800 
3801             rtl::OUString aApiName;
3802             SvxUnogetApiNameForItem( Which(), GetName(), aApiName );
3803             aPropSeq[0].Name    = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ));
3804             aPropSeq[0].Value   = uno::makeAny( aApiName );
3805             aPropSeq[1].Name    = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillGradient" ));
3806             aPropSeq[1].Value   = uno::makeAny( aGradient2 );
3807             rVal = uno::makeAny( aPropSeq );
3808             break;
3809         }
3810 
3811         case MID_FILLGRADIENT:
3812         {
3813             const XGradient& aXGradient = GetGradientValue();
3814             ::com::sun::star::awt::Gradient aGradient2;
3815 
3816             aGradient2.Style = (::com::sun::star::awt::GradientStyle) aXGradient.GetGradientStyle();
3817             aGradient2.StartColor = (sal_Int32)aXGradient.GetStartColor().GetColor();
3818             aGradient2.EndColor = (sal_Int32)aXGradient.GetEndColor().GetColor();
3819             aGradient2.Angle = (short)aXGradient.GetAngle();
3820             aGradient2.Border = aXGradient.GetBorder();
3821             aGradient2.XOffset = aXGradient.GetXOffset();
3822             aGradient2.YOffset = aXGradient.GetYOffset();
3823             aGradient2.StartIntensity = aXGradient.GetStartIntens();
3824             aGradient2.EndIntensity = aXGradient.GetEndIntens();
3825             aGradient2.StepCount = aXGradient.GetSteps();
3826 
3827             rVal <<= aGradient2;
3828             break;
3829         }
3830 
3831         case MID_NAME:
3832         {
3833             rtl::OUString aApiName;
3834             SvxUnogetApiNameForItem( Which(), GetName(), aApiName );
3835             rVal <<= aApiName;
3836             break;
3837         }
3838 
3839         case MID_GRADIENT_STYLE: rVal <<= (sal_Int16)GetGradientValue().GetGradientStyle(); break;
3840         case MID_GRADIENT_STARTCOLOR: rVal <<= (sal_Int32)GetGradientValue().GetStartColor().GetColor(); break;
3841         case MID_GRADIENT_ENDCOLOR: rVal <<= (sal_Int32)GetGradientValue().GetEndColor().GetColor(); break;
3842         case MID_GRADIENT_ANGLE: rVal <<= (sal_Int16)GetGradientValue().GetAngle(); break;
3843         case MID_GRADIENT_BORDER: rVal <<= GetGradientValue().GetBorder(); break;
3844         case MID_GRADIENT_XOFFSET: rVal <<= GetGradientValue().GetXOffset(); break;
3845         case MID_GRADIENT_YOFFSET: rVal <<= GetGradientValue().GetYOffset(); break;
3846         case MID_GRADIENT_STARTINTENSITY: rVal <<= GetGradientValue().GetStartIntens(); break;
3847         case MID_GRADIENT_ENDINTENSITY: rVal <<= GetGradientValue().GetEndIntens(); break;
3848         case MID_GRADIENT_STEPCOUNT: rVal <<= GetGradientValue().GetSteps(); break;
3849 
3850         default: DBG_ERROR("Wrong MemberId!"); return sal_False;
3851     }
3852 
3853     return sal_True;
3854 }
3855 
3856 // -----------------------------------------------------------------------
3857 sal_Bool XFillGradientItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
3858 {
3859 //    sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
3860     nMemberId &= ~CONVERT_TWIPS;
3861 
3862     switch ( nMemberId )
3863     {
3864         case 0:
3865         {
3866             uno::Sequence< beans::PropertyValue >   aPropSeq;
3867             ::com::sun::star::awt::Gradient         aGradient2;
3868             rtl::OUString                           aName;
3869             bool                                    bGradient( false );
3870 
3871             if ( rVal >>= aPropSeq )
3872             {
3873                 for ( sal_Int32 n = 0; n < aPropSeq.getLength(); n++ )
3874                 {
3875                     if ( aPropSeq[n].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Name" )))
3876                         aPropSeq[n].Value >>= aName;
3877                     else if ( aPropSeq[n].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "FillGradient" )))
3878                     {
3879                         if ( aPropSeq[n].Value >>= aGradient2 )
3880                             bGradient = true;
3881                     }
3882                 }
3883 
3884                 SetName( aName );
3885                 if ( bGradient )
3886                 {
3887                     XGradient aXGradient;
3888 
3889                     aXGradient.SetGradientStyle( (XGradientStyle) aGradient2.Style );
3890                     aXGradient.SetStartColor( aGradient2.StartColor );
3891                     aXGradient.SetEndColor( aGradient2.EndColor );
3892                     aXGradient.SetAngle( aGradient2.Angle );
3893                     aXGradient.SetBorder( aGradient2.Border );
3894                     aXGradient.SetXOffset( aGradient2.XOffset );
3895                     aXGradient.SetYOffset( aGradient2.YOffset );
3896                     aXGradient.SetStartIntens( aGradient2.StartIntensity );
3897                     aXGradient.SetEndIntens( aGradient2.EndIntensity );
3898                     aXGradient.SetSteps( aGradient2.StepCount );
3899 
3900                     SetGradientValue( aXGradient );
3901                 }
3902 
3903                 return sal_True;
3904             }
3905 
3906             return sal_False;
3907         }
3908 
3909         case MID_NAME:
3910         {
3911             rtl::OUString aName;
3912             if (!(rVal >>= aName ))
3913                 return sal_False;
3914             SetName( aName );
3915             break;
3916         }
3917 
3918         case MID_FILLGRADIENT:
3919         {
3920             ::com::sun::star::awt::Gradient aGradient2;
3921             if(!(rVal >>= aGradient2))
3922                 return sal_False;
3923 
3924             XGradient aXGradient;
3925 
3926             aXGradient.SetGradientStyle( (XGradientStyle) aGradient2.Style );
3927             aXGradient.SetStartColor( aGradient2.StartColor );
3928             aXGradient.SetEndColor( aGradient2.EndColor );
3929             aXGradient.SetAngle( aGradient2.Angle );
3930             aXGradient.SetBorder( aGradient2.Border );
3931             aXGradient.SetXOffset( aGradient2.XOffset );
3932             aXGradient.SetYOffset( aGradient2.YOffset );
3933             aXGradient.SetStartIntens( aGradient2.StartIntensity );
3934             aXGradient.SetEndIntens( aGradient2.EndIntensity );
3935             aXGradient.SetSteps( aGradient2.StepCount );
3936 
3937             SetGradientValue( aXGradient );
3938             break;
3939         }
3940 
3941         case MID_GRADIENT_STARTCOLOR:
3942         case MID_GRADIENT_ENDCOLOR:
3943         {
3944             sal_Int32 nVal = 0;
3945             if(!(rVal >>= nVal ))
3946                 return sal_False;
3947 
3948             XGradient aXGradient = GetGradientValue();
3949 
3950             if ( nMemberId == MID_GRADIENT_STARTCOLOR )
3951                 aXGradient.SetStartColor( nVal );
3952             else
3953                 aXGradient.SetEndColor( nVal );
3954             SetGradientValue( aXGradient );
3955             break;
3956         }
3957 
3958         case MID_GRADIENT_STYLE:
3959         case MID_GRADIENT_ANGLE:
3960         case MID_GRADIENT_BORDER:
3961         case MID_GRADIENT_STARTINTENSITY:
3962         case MID_GRADIENT_ENDINTENSITY:
3963         case MID_GRADIENT_STEPCOUNT:
3964         case MID_GRADIENT_XOFFSET:
3965         case MID_GRADIENT_YOFFSET:
3966         {
3967             sal_Int16 nVal = sal_Int16();
3968             if(!(rVal >>= nVal ))
3969                 return sal_False;
3970 
3971             XGradient aXGradient = GetGradientValue();
3972 
3973             switch ( nMemberId )
3974             {
3975                 case MID_GRADIENT_STYLE:
3976                     aXGradient.SetGradientStyle( (XGradientStyle)nVal ); break;
3977                 case MID_GRADIENT_ANGLE:
3978                     aXGradient.SetAngle( nVal ); break;
3979                 case MID_GRADIENT_BORDER:
3980                     aXGradient.SetBorder( nVal ); break;
3981                 case MID_GRADIENT_STARTINTENSITY:
3982                     aXGradient.SetStartIntens( nVal ); break;
3983                 case MID_GRADIENT_ENDINTENSITY:
3984                     aXGradient.SetEndIntens( nVal ); break;
3985                 case MID_GRADIENT_STEPCOUNT:
3986                     aXGradient.SetSteps( nVal ); break;
3987                 case MID_GRADIENT_XOFFSET:
3988                     aXGradient.SetXOffset( nVal ); break;
3989                 case MID_GRADIENT_YOFFSET:
3990                     aXGradient.SetYOffset( nVal ); break;
3991             }
3992 
3993             SetGradientValue( aXGradient );
3994             break;
3995         }
3996     }
3997 
3998     return sal_True;
3999 }
4000 
4001 sal_Bool XFillGradientItem::CompareValueFunc( const NameOrIndex* p1, const NameOrIndex* p2 )
4002 {
4003     return ((XFillGradientItem*)p1)->GetGradientValue() == ((XFillGradientItem*)p2)->GetGradientValue();
4004 }
4005 
4006 XFillGradientItem* XFillGradientItem::checkForUniqueItem( SdrModel* pModel ) const
4007 {
4008     if( pModel )
4009     {
4010         const String aUniqueName = NameOrIndex::CheckNamedItem( this,
4011                                                                 XATTR_FILLGRADIENT,
4012                                                                 &pModel->GetItemPool(),
4013                                                                 pModel->GetStyleSheetPool() ? &pModel->GetStyleSheetPool()->GetPool() : NULL,
4014                                                                 XFillGradientItem::CompareValueFunc,
4015                                                                 RID_SVXSTR_GRADIENT,
4016                                                                 pModel->GetGradientList() );
4017 
4018         // if the given name is not valid, replace it!
4019         if( aUniqueName != GetName() )
4020         {
4021             return new XFillGradientItem( aUniqueName, aGradient );
4022         }
4023     }
4024 
4025     return (XFillGradientItem*)this;
4026 }
4027 
4028 // ----------------------------------
4029 // class XFillFloatTransparenceItem -
4030 // ----------------------------------
4031 
4032 TYPEINIT1_AUTOFACTORY( XFillFloatTransparenceItem, XFillGradientItem );
4033 
4034 // -----------------------------------------------------------------------------
4035 
4036 XFillFloatTransparenceItem::XFillFloatTransparenceItem() :
4037     bEnabled( sal_False )
4038 {
4039     SetWhich( XATTR_FILLFLOATTRANSPARENCE );
4040 }
4041 
4042 //------------------------------------------------------------------------
4043 
4044 XFillFloatTransparenceItem::XFillFloatTransparenceItem( sal_Int32 nIndex, const XGradient& rGradient, sal_Bool bEnable ) :
4045     XFillGradientItem   ( nIndex, rGradient ),
4046     bEnabled            ( bEnable )
4047 {
4048     SetWhich( XATTR_FILLFLOATTRANSPARENCE );
4049 }
4050 
4051 //------------------------------------------------------------------------
4052 
4053 XFillFloatTransparenceItem::XFillFloatTransparenceItem(const XubString& rName, const XGradient& rGradient, sal_Bool bEnable ) :
4054     XFillGradientItem   ( rName, rGradient ),
4055     bEnabled            ( bEnable )
4056 {
4057     SetWhich( XATTR_FILLFLOATTRANSPARENCE );
4058 }
4059 
4060 //------------------------------------------------------------------------
4061 
4062 XFillFloatTransparenceItem::XFillFloatTransparenceItem( const XFillFloatTransparenceItem& rItem ) :
4063     XFillGradientItem   ( rItem ),
4064     bEnabled            ( rItem.bEnabled )
4065 {
4066     SetWhich( XATTR_FILLFLOATTRANSPARENCE );
4067 }
4068 
4069 //------------------------------------------------------------------------
4070 
4071 //XFillFloatTransparenceItem::XFillFloatTransparenceItem( SvStream& rIn, sal_uInt16 nVer ) :
4072 //  XFillGradientItem   ( rIn, nVer )
4073 //{
4074 //  SetWhich( XATTR_FILLFLOATTRANSPARENCE );
4075 //  rIn >> bEnabled;
4076 //}
4077 
4078 //*************************************************************************
4079 
4080 XFillFloatTransparenceItem::XFillFloatTransparenceItem(SfxItemPool* /*pPool*/, const XGradient& rTheGradient, sal_Bool bEnable )
4081 :   XFillGradientItem   ( -1, rTheGradient ),
4082     bEnabled            ( bEnable )
4083 {
4084     SetWhich( XATTR_FILLFLOATTRANSPARENCE );
4085 }
4086 
4087 //*************************************************************************
4088 
4089 XFillFloatTransparenceItem::XFillFloatTransparenceItem(SfxItemPool* /*pPool*/)
4090 {
4091     SetWhich( XATTR_FILLFLOATTRANSPARENCE );
4092 }
4093 
4094 //------------------------------------------------------------------------
4095 
4096 int XFillFloatTransparenceItem::operator==( const SfxPoolItem& rItem ) const
4097 {
4098     return ( NameOrIndex::operator==(rItem) ) &&
4099             ( GetGradientValue() == ((const XFillGradientItem&)rItem).GetGradientValue() ) &&
4100              ( bEnabled == ( (XFillFloatTransparenceItem&) rItem ).bEnabled );
4101 }
4102 
4103 //------------------------------------------------------------------------
4104 
4105 SfxPoolItem* XFillFloatTransparenceItem::Clone( SfxItemPool* /*pPool*/) const
4106 {
4107     return new XFillFloatTransparenceItem( *this );
4108 }
4109 
4110 //------------------------------------------------------------------------
4111 
4112 //SfxPoolItem* XFillFloatTransparenceItem::Create( SvStream& rIn, sal_uInt16 nVer ) const
4113 //{
4114 //  return( ( 0 == nVer ) ? Clone( NULL ) : new XFillFloatTransparenceItem( rIn, nVer ) );
4115 //}
4116 
4117 //------------------------------------------------------------------------
4118 
4119 //SvStream& XFillFloatTransparenceItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
4120 //{
4121 //  XFillGradientItem::Store( rOut, nItemVersion );
4122 //  rOut << bEnabled;
4123 //  return rOut;
4124 //}
4125 
4126 //------------------------------------------------------------------------
4127 
4128 sal_uInt16 XFillFloatTransparenceItem::GetVersion( sal_uInt16 nFileFormatVersion ) const
4129 {
4130     // !!! if version number of this object must be increased, please   !!!
4131     // !!! increase version number of base class XFillGradientItem      !!!
4132     return XFillGradientItem::GetVersion( nFileFormatVersion );
4133 }
4134 
4135 //------------------------------------------------------------------------
4136 
4137 sal_Bool XFillFloatTransparenceItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const
4138 {
4139     return XFillGradientItem::QueryValue( rVal, nMemberId );
4140 }
4141 
4142 //------------------------------------------------------------------------
4143 
4144 sal_Bool XFillFloatTransparenceItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
4145 {
4146     return XFillGradientItem::PutValue( rVal, nMemberId );
4147 }
4148 
4149 //------------------------------------------------------------------------
4150 
4151 SfxItemPresentation XFillFloatTransparenceItem::GetPresentation(    SfxItemPresentation ePres,
4152                                                                     SfxMapUnit eCoreUnit, SfxMapUnit ePresUnit,
4153                                                                     XubString& rText,
4154                                                                     const IntlWrapper * pIntlWrapper ) const
4155 {
4156     return XFillGradientItem::GetPresentation( ePres, eCoreUnit, ePresUnit, rText, pIntlWrapper );
4157 }
4158 
4159 sal_Bool XFillFloatTransparenceItem::CompareValueFunc( const NameOrIndex* p1, const NameOrIndex* p2 )
4160 {
4161     return  ((XFillFloatTransparenceItem*)p1)->IsEnabled() == ((XFillFloatTransparenceItem*)p2)->IsEnabled() &&
4162             ((XFillFloatTransparenceItem*)p1)->GetGradientValue()  == ((XFillFloatTransparenceItem*)p2)->GetGradientValue();
4163 }
4164 
4165 XFillFloatTransparenceItem* XFillFloatTransparenceItem::checkForUniqueItem( SdrModel* pModel ) const
4166 {
4167     // #85953# unique name only necessary when enabled
4168     if(IsEnabled())
4169     {
4170         if( pModel )
4171         {
4172             const String aUniqueName = NameOrIndex::CheckNamedItem( this,
4173                                                                     XATTR_FILLFLOATTRANSPARENCE,
4174                                                                     &pModel->GetItemPool(),
4175                                                                     pModel->GetStyleSheetPool() ? &pModel->GetStyleSheetPool()->GetPool() : NULL,
4176                                                                     XFillFloatTransparenceItem::CompareValueFunc,
4177                                                                     RID_SVXSTR_TRASNGR0,
4178                                                                     NULL );
4179 
4180             // if the given name is not valid, replace it!
4181             if( aUniqueName != GetName() )
4182             {
4183                 return new XFillFloatTransparenceItem( aUniqueName, GetGradientValue(), sal_True );
4184             }
4185         }
4186     }
4187     else
4188     {
4189         // #85953# if disabled, force name to empty string
4190         if(GetName().Len())
4191         {
4192             return new XFillFloatTransparenceItem(String(), GetGradientValue(), sal_False);
4193         }
4194     }
4195 
4196     return (XFillFloatTransparenceItem*)this;
4197 }
4198 
4199 // -------------
4200 // class XHatch
4201 // -------------
4202 
4203 /*************************************************************************
4204 |*
4205 |*    XHatch::XHatch(XHatchStyle, const Color&, long, long)
4206 |*
4207 |*    Beschreibung
4208 |*    Ersterstellung    21.11.94
4209 |*    Letzte Aenderung  21.11.94
4210 |*
4211 *************************************************************************/
4212 
4213 XHatch::XHatch(const Color& rCol, XHatchStyle eTheStyle, long nTheDistance,
4214                long nTheAngle) :
4215     eStyle(eTheStyle),
4216     aColor(rCol),
4217     nDistance(nTheDistance),
4218     nAngle(nTheAngle)
4219 {
4220 }
4221 
4222 /*************************************************************************
4223 |*
4224 |*    int XHatch::operator==(const SfxPoolItem& rItem) const
4225 |*
4226 |*    Beschreibung
4227 |*    Ersterstellung    29.11.94
4228 |*    Letzte Aenderung  29.11.94
4229 |*
4230 *************************************************************************/
4231 
4232 bool XHatch::operator==(const XHatch& rHatch) const
4233 {
4234     return ( eStyle     == rHatch.eStyle    &&
4235              aColor     == rHatch.aColor    &&
4236              nDistance  == rHatch.nDistance &&
4237              nAngle     == rHatch.nAngle );
4238 }
4239 
4240 
4241 // -----------------------
4242 // class XFillHatchItem
4243 // -----------------------
4244 TYPEINIT1_AUTOFACTORY(XFillHatchItem, NameOrIndex);
4245 
4246 /*************************************************************************
4247 |*
4248 |*    XFillHatchItem::XFillHatchItem(sal_Int32 nIndex,
4249 |*                                 const XHatch& rTheHatch)
4250 |*
4251 |*    Beschreibung
4252 |*    Ersterstellung    15.11.94
4253 |*    Letzte Aenderung  15.11.94
4254 |*
4255 *************************************************************************/
4256 
4257 XFillHatchItem::XFillHatchItem(sal_Int32 nIndex,
4258                              const XHatch& rTheHatch) :
4259     NameOrIndex(XATTR_FILLHATCH, nIndex),
4260     aHatch(rTheHatch)
4261 {
4262 }
4263 
4264 /*************************************************************************
4265 |*
4266 |*    XFillHatchItem::XFillHatchItem(const XubString& rName,
4267 |*                                 const XHatch& rTheHatch)
4268 |*
4269 |*    Beschreibung
4270 |*    Ersterstellung    15.11.94
4271 |*    Letzte Aenderung  15.11.94
4272 |*
4273 *************************************************************************/
4274 
4275 XFillHatchItem::XFillHatchItem(const XubString& rName,
4276                              const XHatch& rTheHatch) :
4277     NameOrIndex(XATTR_FILLHATCH, rName),
4278     aHatch(rTheHatch)
4279 {
4280 }
4281 
4282 /*************************************************************************
4283 |*
4284 |*    XFillHatchItem::XFillHatchItem(const XFillHatchItem& rItem)
4285 |*
4286 |*    Beschreibung
4287 |*    Ersterstellung    15.11.94
4288 |*    Letzte Aenderung  15.11.94
4289 |*
4290 *************************************************************************/
4291 
4292 XFillHatchItem::XFillHatchItem(const XFillHatchItem& rItem) :
4293     NameOrIndex(rItem),
4294     aHatch(rItem.aHatch)
4295 {
4296 }
4297 
4298 /*************************************************************************
4299 |*
4300 |*    XFillHatchItem::XFillHatchItem(SvStream& rIn)
4301 |*
4302 |*    Beschreibung
4303 |*    Ersterstellung    15.11.94
4304 |*    Letzte Aenderung  15.11.94
4305 |*
4306 *************************************************************************/
4307 
4308 XFillHatchItem::XFillHatchItem(SvStream& rIn) :
4309     NameOrIndex(XATTR_FILLHATCH, rIn),
4310     aHatch(COL_BLACK)
4311 {
4312     if (!IsIndex())
4313     {
4314         sal_uInt16 nRed;
4315         sal_uInt16 nGreen;
4316         sal_uInt16 nBlue;
4317         sal_Int16  nITemp;
4318         sal_Int32  nLTemp;
4319 
4320         rIn >> nITemp; aHatch.SetHatchStyle((XHatchStyle)nITemp);
4321         rIn >> nRed;
4322         rIn >> nGreen;
4323         rIn >> nBlue;
4324 
4325         Color aCol;
4326         aCol = Color( (sal_uInt8)( nRed >> 8 ), (sal_uInt8)( nGreen >> 8 ), (sal_uInt8)( nBlue >> 8 ) );
4327         aHatch.SetColor(aCol);
4328         rIn >> nLTemp; aHatch.SetDistance(nLTemp);
4329         rIn >> nLTemp; aHatch.SetAngle(nLTemp);
4330     }
4331 }
4332 
4333 //*************************************************************************
4334 
4335 XFillHatchItem::XFillHatchItem(SfxItemPool* /*pPool*/, const XHatch& rTheHatch)
4336 :   NameOrIndex( XATTR_FILLHATCH, -1 ),
4337     aHatch(rTheHatch)
4338 {
4339 }
4340 
4341 //*************************************************************************
4342 
4343 XFillHatchItem::XFillHatchItem(SfxItemPool* /*pPool*/)
4344 : NameOrIndex(XATTR_FILLHATCH, -1 )
4345 {
4346 }
4347 
4348 /*************************************************************************
4349 |*
4350 |*    XFillHatchItem::Clone(SfxItemPool* pPool) const
4351 |*
4352 |*    Beschreibung
4353 |*    Ersterstellung    15.11.94
4354 |*    Letzte Aenderung  15.11.94
4355 |*
4356 *************************************************************************/
4357 
4358 SfxPoolItem* XFillHatchItem::Clone(SfxItemPool* /*pPool*/) const
4359 {
4360     return new XFillHatchItem(*this);
4361 }
4362 
4363 /*************************************************************************
4364 |*
4365 |*    int XFillHatchItem::operator==(const SfxPoolItem& rItem) const
4366 |*
4367 |*    Beschreibung
4368 |*    Ersterstellung    15.11.94
4369 |*    Letzte Aenderung  15.11.94
4370 |*
4371 *************************************************************************/
4372 
4373 int XFillHatchItem::operator==(const SfxPoolItem& rItem) const
4374 {
4375     return ( NameOrIndex::operator==(rItem) &&
4376              aHatch == ((const XFillHatchItem&) rItem).aHatch );
4377 }
4378 
4379 /*************************************************************************
4380 |*
4381 |*    SfxPoolItem* XFillHatchItem::Create(SvStream& rIn, sal_uInt16 nVer) const
4382 |*
4383 |*    Beschreibung
4384 |*    Ersterstellung    15.11.94
4385 |*    Letzte Aenderung  15.11.94
4386 |*
4387 *************************************************************************/
4388 
4389 SfxPoolItem* XFillHatchItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
4390 {
4391     return new XFillHatchItem(rIn);
4392 }
4393 
4394 /*************************************************************************
4395 |*
4396 |*    SfxPoolItem* XFillHatchItem::Store(SvStream& rOut) const
4397 |*
4398 |*    Beschreibung
4399 |*    Ersterstellung    15.11.94
4400 |*    Letzte Aenderung  15.11.94
4401 |*
4402 *************************************************************************/
4403 
4404 SvStream& XFillHatchItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
4405 {
4406     NameOrIndex::Store( rOut, nItemVersion );
4407 
4408     if (!IsIndex())
4409     {
4410         rOut << (sal_Int16)aHatch.GetHatchStyle();
4411 
4412         sal_uInt16 nTmp;
4413         nTmp = VCLTOSVCOL( aHatch.GetColor().GetRed() ); rOut << nTmp;
4414         nTmp = VCLTOSVCOL( aHatch.GetColor().GetGreen() ); rOut << nTmp;
4415         nTmp = VCLTOSVCOL( aHatch.GetColor().GetBlue() ); rOut << nTmp;
4416 
4417         rOut << (sal_Int32) aHatch.GetDistance();
4418         rOut << (sal_Int32) aHatch.GetAngle();
4419     }
4420 
4421     return rOut;
4422 }
4423 
4424 /*************************************************************************
4425 |*
4426 |*    const XHatch& XFillHatchItem::GetValue(const XHatchTable* pTable) const
4427 |*
4428 |*    Beschreibung
4429 |*    Ersterstellung    15.11.94
4430 |*    Letzte Aenderung  18.11.94
4431 |*
4432 *************************************************************************/
4433 
4434 const XHatch& XFillHatchItem::GetHatchValue(const XHatchTable* pTable) const // GetValue -> GetHatchValue
4435 {
4436     if (!IsIndex())
4437         return aHatch;
4438     else
4439         return pTable->GetHatch(GetIndex())->GetHatch();
4440 }
4441 
4442 //------------------------------------------------------------------------
4443 
4444 SfxItemPresentation XFillHatchItem::GetPresentation
4445 (
4446     SfxItemPresentation ePres,
4447     SfxMapUnit          /*eCoreUnit*/,
4448     SfxMapUnit          /*ePresUnit*/,
4449     XubString&          rText, const IntlWrapper *
4450 )   const
4451 {
4452     switch ( ePres )
4453     {
4454         case SFX_ITEM_PRESENTATION_NONE:
4455             rText.Erase();
4456             return ePres;
4457         case SFX_ITEM_PRESENTATION_NAMELESS:
4458         case SFX_ITEM_PRESENTATION_COMPLETE:
4459             rText = GetName();
4460             return ePres;
4461         default:
4462             return SFX_ITEM_PRESENTATION_NONE;
4463     }
4464 }
4465 
4466 //------------------------------------------------------------------------
4467 
4468 FASTBOOL XFillHatchItem::HasMetrics() const
4469 {
4470     return sal_True;
4471 }
4472 
4473 //------------------------------------------------------------------------
4474 
4475 FASTBOOL XFillHatchItem::ScaleMetrics(long nMul, long nDiv)
4476 {
4477     aHatch.SetDistance( ScaleMetricValue( aHatch.GetDistance(), nMul, nDiv ) );
4478     return sal_True;
4479 }
4480 
4481 // -----------------------------------------------------------------------
4482 sal_Bool XFillHatchItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const
4483 {
4484 //    sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
4485     nMemberId &= ~CONVERT_TWIPS;
4486 
4487     switch ( nMemberId )
4488     {
4489         case 0:
4490         {
4491             uno::Sequence< beans::PropertyValue > aPropSeq( 2 );
4492 
4493             ::com::sun::star::drawing::Hatch aUnoHatch;
4494 
4495             aUnoHatch.Style = (::com::sun::star::drawing::HatchStyle)aHatch.GetHatchStyle();
4496             aUnoHatch.Color = aHatch.GetColor().GetColor();
4497             aUnoHatch.Distance = aHatch.GetDistance();
4498             aUnoHatch.Angle = aHatch.GetAngle();
4499 
4500             rtl::OUString aApiName;
4501             SvxUnogetApiNameForItem( Which(), GetName(), aApiName );
4502             aPropSeq[0].Name    = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ));
4503             aPropSeq[0].Value   = uno::makeAny( aApiName );
4504             aPropSeq[1].Name    = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillHatch" ));
4505             aPropSeq[1].Value   = uno::makeAny( aUnoHatch );
4506             rVal = uno::makeAny( aPropSeq );
4507             break;
4508         }
4509 
4510         case MID_FILLHATCH:
4511         {
4512             ::com::sun::star::drawing::Hatch aUnoHatch;
4513 
4514             aUnoHatch.Style = (::com::sun::star::drawing::HatchStyle)aHatch.GetHatchStyle();
4515             aUnoHatch.Color = aHatch.GetColor().GetColor();
4516             aUnoHatch.Distance = aHatch.GetDistance();
4517             aUnoHatch.Angle = aHatch.GetAngle();
4518             rVal <<= aUnoHatch;
4519             break;
4520         }
4521 
4522         case MID_NAME:
4523         {
4524             rtl::OUString aApiName;
4525             SvxUnogetApiNameForItem( Which(), GetName(), aApiName );
4526             rVal <<= aApiName;
4527             break;
4528         }
4529 
4530         case MID_HATCH_STYLE:
4531             rVal <<= (::com::sun::star::drawing::HatchStyle)aHatch.GetHatchStyle(); break;
4532         case MID_HATCH_COLOR:
4533             rVal <<= (sal_Int32)aHatch.GetColor().GetColor(); break;
4534         case MID_HATCH_DISTANCE:
4535             rVal <<= aHatch.GetDistance(); break;
4536         case MID_HATCH_ANGLE:
4537             rVal <<= aHatch.GetAngle(); break;
4538 
4539         default: DBG_ERROR("Wrong MemberId!"); return sal_False;
4540     }
4541 
4542     return sal_True;
4543 }
4544 
4545 // -----------------------------------------------------------------------
4546 sal_Bool XFillHatchItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
4547 {
4548 //    sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
4549     nMemberId &= ~CONVERT_TWIPS;
4550 
4551     switch ( nMemberId )
4552     {
4553         case 0:
4554         {
4555             uno::Sequence< beans::PropertyValue >   aPropSeq;
4556             ::com::sun::star::drawing::Hatch        aUnoHatch;
4557             rtl::OUString                           aName;
4558             bool                                    bHatch( false );
4559 
4560             if ( rVal >>= aPropSeq )
4561             {
4562                 for ( sal_Int32 n = 0; n < aPropSeq.getLength(); n++ )
4563                 {
4564                     if ( aPropSeq[n].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Name" )))
4565                         aPropSeq[n].Value >>= aName;
4566                     else if ( aPropSeq[n].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "FillHatch" )))
4567                     {
4568                         if ( aPropSeq[n].Value >>= aUnoHatch )
4569                             bHatch = true;
4570                     }
4571                 }
4572 
4573                 SetName( aName );
4574                 if ( bHatch )
4575                 {
4576                     aHatch.SetHatchStyle( (XHatchStyle)aUnoHatch.Style );
4577                     aHatch.SetColor( aUnoHatch.Color );
4578                     aHatch.SetDistance( aUnoHatch.Distance );
4579                     aHatch.SetAngle( aUnoHatch.Angle );
4580                 }
4581 
4582                 return sal_True;
4583             }
4584 
4585             return sal_False;
4586         }
4587 
4588         case MID_FILLHATCH:
4589         {
4590             ::com::sun::star::drawing::Hatch aUnoHatch;
4591             if(!(rVal >>= aUnoHatch))
4592                 return sal_False;
4593 
4594             aHatch.SetHatchStyle( (XHatchStyle)aUnoHatch.Style );
4595             aHatch.SetColor( aUnoHatch.Color );
4596             aHatch.SetDistance( aUnoHatch.Distance );
4597             aHatch.SetAngle( aUnoHatch.Angle );
4598             break;
4599         }
4600 
4601         case MID_NAME:
4602         {
4603             rtl::OUString aName;
4604             if (!(rVal >>= aName ))
4605                 return sal_False;
4606             SetName( aName );
4607             break;
4608         }
4609 
4610         case MID_HATCH_STYLE:
4611         {
4612             sal_Int16 nVal = sal_Int16();
4613             if (!(rVal >>= nVal ))
4614                 return sal_False;
4615             aHatch.SetHatchStyle( (XHatchStyle)nVal );
4616             break;
4617         }
4618 
4619         case MID_HATCH_COLOR:
4620         case MID_HATCH_DISTANCE:
4621         case MID_HATCH_ANGLE:
4622         {
4623             sal_Int32 nVal = 0;
4624             if (!(rVal >>= nVal ))
4625                 return sal_False;
4626 
4627             if ( nMemberId == MID_HATCH_COLOR )
4628                 aHatch.SetColor( nVal );
4629             else if ( nMemberId == MID_HATCH_DISTANCE )
4630                 aHatch.SetDistance( nVal );
4631             else
4632                 aHatch.SetAngle( nVal );
4633             break;
4634         }
4635 
4636         default: DBG_ERROR("Wrong MemberId!"); return sal_False;
4637     }
4638 
4639     return sal_True;
4640 }
4641 
4642 sal_Bool XFillHatchItem::CompareValueFunc( const NameOrIndex* p1, const NameOrIndex* p2 )
4643 {
4644     return ((XFillHatchItem*)p1)->GetHatchValue() == ((XFillHatchItem*)p2)->GetHatchValue();
4645 }
4646 
4647 XFillHatchItem* XFillHatchItem::checkForUniqueItem( SdrModel* pModel ) const
4648 {
4649     if( pModel )
4650     {
4651         const String aUniqueName = NameOrIndex::CheckNamedItem( this,
4652                                                                 XATTR_FILLHATCH,
4653                                                                 &pModel->GetItemPool(),
4654                                                                 pModel->GetStyleSheetPool() ? &pModel->GetStyleSheetPool()->GetPool() : NULL,
4655                                                                 XFillHatchItem::CompareValueFunc,
4656                                                                 RID_SVXSTR_HATCH10,
4657                                                                 pModel->GetHatchList() );
4658 
4659         // if the given name is not valid, replace it!
4660         if( aUniqueName != GetName() )
4661         {
4662             return new XFillHatchItem( aUniqueName, aHatch );
4663         }
4664     }
4665 
4666     return (XFillHatchItem*)this;
4667 }
4668 
4669 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4670 //                          FormText-Attribute
4671 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4672 
4673 //-------------------------
4674 // class XFormTextStyleItem
4675 //-------------------------
4676 TYPEINIT1_AUTOFACTORY(XFormTextStyleItem, SfxEnumItem);
4677 
4678 /*************************************************************************
4679 |*
4680 |*    XFormTextStyleItem::XFormTextStyleItem()
4681 |*
4682 |*    Beschreibung
4683 |*    Ersterstellung    02.02.95 ESO
4684 |*    Letzte Aenderung  02.02.95 ESO
4685 |*
4686 *************************************************************************/
4687 
4688 XFormTextStyleItem::XFormTextStyleItem(XFormTextStyle eTheStyle) :
4689     SfxEnumItem(XATTR_FORMTXTSTYLE, sal::static_int_cast< sal_uInt16 >(eTheStyle))
4690 {
4691 }
4692 
4693 /*************************************************************************
4694 |*
4695 |*    XFormTextStyleItem::XFormTextStyleItem(SvStream& rIn)
4696 |*
4697 |*    Beschreibung
4698 |*    Ersterstellung    02.02.95 ESO
4699 |*    Letzte Aenderung  02.02.95 ESO
4700 |*
4701 *************************************************************************/
4702 
4703 XFormTextStyleItem::XFormTextStyleItem(SvStream& rIn) :
4704     SfxEnumItem(XATTR_FORMTXTSTYLE, rIn)
4705 {
4706 }
4707 
4708 /*************************************************************************
4709 |*
4710 |*    XFormTextStyleItem::Clone(SfxItemPool* pPool) const
4711 |*
4712 |*    Beschreibung
4713 |*    Ersterstellung    02.02.95 ESO
4714 |*    Letzte Aenderung  02.02.95 ESO
4715 |*
4716 *************************************************************************/
4717 
4718 SfxPoolItem* XFormTextStyleItem::Clone(SfxItemPool* /*pPool*/) const
4719 {
4720     return new XFormTextStyleItem( *this );
4721 }
4722 
4723 /*************************************************************************
4724 |*
4725 |*    SfxPoolItem* XFormTextStyleItem::Create(SvStream& rIn, sal_uInt16 nVer) const
4726 |*
4727 |*    Beschreibung
4728 |*    Ersterstellung    02.02.95 ESO
4729 |*    Letzte Aenderung  02.02.95 ESO
4730 |*
4731 *************************************************************************/
4732 
4733 SfxPoolItem* XFormTextStyleItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
4734 {
4735     return new XFormTextStyleItem(rIn);
4736 }
4737 
4738 /*************************************************************************
4739 |*
4740 |*
4741 |*
4742 \*************************************************************************/
4743 
4744 sal_uInt16 XFormTextStyleItem::GetValueCount() const
4745 {
4746     return 5;
4747 }
4748 
4749 /*************************************************************************
4750 |*
4751 |*
4752 |*
4753 \*************************************************************************/
4754 
4755 // #FontWork#
4756 sal_Bool XFormTextStyleItem::QueryValue( uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
4757 {
4758     rVal <<= (sal_Int32)GetValue();
4759     return sal_True;
4760 }
4761 
4762 /*************************************************************************
4763 |*
4764 |*
4765 |*
4766 \*************************************************************************/
4767 
4768 // #FontWork#
4769 sal_Bool XFormTextStyleItem::PutValue( const uno::Any& rVal, sal_uInt8 /*nMemberId*/)
4770 {
4771     sal_Int32 nValue = 0;
4772     rVal >>= nValue;
4773     SetValue(sal::static_int_cast< sal_uInt16 >(nValue));
4774 
4775     return sal_True;
4776 }
4777 
4778 //-------------------------
4779 // class XFormTextAdjustItem
4780 //-------------------------
4781 TYPEINIT1_AUTOFACTORY(XFormTextAdjustItem, SfxEnumItem);
4782 
4783 /*************************************************************************
4784 |*
4785 |*    XFormTextAdjustItem::XFormTextAdjustItem()
4786 |*
4787 |*    Beschreibung
4788 |*    Ersterstellung    02.02.95 ESO
4789 |*    Letzte Aenderung  02.02.95 ESO
4790 |*
4791 *************************************************************************/
4792 
4793 XFormTextAdjustItem::XFormTextAdjustItem(XFormTextAdjust eTheAdjust) :
4794     SfxEnumItem(XATTR_FORMTXTADJUST, sal::static_int_cast< sal_uInt16 >(eTheAdjust))
4795 {
4796 }
4797 
4798 /*************************************************************************
4799 |*
4800 |*    XFormTextAdjustItem::XFormTextAdjustItem(SvStream& rIn)
4801 |*
4802 |*    Beschreibung
4803 |*    Ersterstellung    02.02.95 ESO
4804 |*    Letzte Aenderung  02.02.95 ESO
4805 |*
4806 *************************************************************************/
4807 
4808 XFormTextAdjustItem::XFormTextAdjustItem(SvStream& rIn) :
4809     SfxEnumItem(XATTR_FORMTXTADJUST, rIn)
4810 {
4811 }
4812 
4813 /*************************************************************************
4814 |*
4815 |*    XFormTextAdjustItem::Clone(SfxItemPool* pPool) const
4816 |*
4817 |*    Beschreibung
4818 |*    Ersterstellung    02.02.95 ESO
4819 |*    Letzte Aenderung  02.02.95 ESO
4820 |*
4821 *************************************************************************/
4822 
4823 SfxPoolItem* XFormTextAdjustItem::Clone(SfxItemPool* /*pPool*/) const
4824 {
4825     return new XFormTextAdjustItem( *this );
4826 }
4827 
4828 /*************************************************************************
4829 |*
4830 |*    SfxPoolItem* XFormTextAdjustItem::Create(SvStream& rIn, sal_uInt16 nVer) const
4831 |*
4832 |*    Beschreibung
4833 |*    Ersterstellung    02.02.95 ESO
4834 |*    Letzte Aenderung  02.02.95 ESO
4835 |*
4836 *************************************************************************/
4837 
4838 SfxPoolItem* XFormTextAdjustItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
4839 {
4840     return new XFormTextAdjustItem(rIn);
4841 }
4842 
4843 /*************************************************************************
4844 |*
4845 |*
4846 |*
4847 \*************************************************************************/
4848 
4849 sal_uInt16 XFormTextAdjustItem::GetValueCount() const
4850 {
4851     return 4;
4852 }
4853 
4854 /*************************************************************************
4855 |*
4856 |*
4857 |*
4858 \*************************************************************************/
4859 
4860 // #FontWork#
4861 sal_Bool XFormTextAdjustItem::QueryValue( uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
4862 {
4863     rVal <<= (sal_Int32)GetValue();
4864     return sal_True;
4865 }
4866 
4867 /*************************************************************************
4868 |*
4869 |*
4870 |*
4871 \*************************************************************************/
4872 
4873 // #FontWork#
4874 sal_Bool XFormTextAdjustItem::PutValue( const uno::Any& rVal, sal_uInt8 /*nMemberId*/)
4875 {
4876     sal_Int32 nValue = 0;
4877     rVal >>= nValue;
4878     SetValue(sal::static_int_cast< sal_uInt16 >(nValue));
4879 
4880     return sal_True;
4881 }
4882 
4883 //----------------------------
4884 // class XFormTextDistanceItem
4885 //----------------------------
4886 TYPEINIT1_AUTOFACTORY(XFormTextDistanceItem, SfxMetricItem);
4887 
4888 /*************************************************************************
4889 |*
4890 |*    XFormTextDistanceItem::XFormTextDistanceItem()
4891 |*
4892 |*    Beschreibung
4893 |*    Ersterstellung    02.02.95 ESO
4894 |*    Letzte Aenderung  02.02.95 ESO
4895 |*
4896 *************************************************************************/
4897 
4898 XFormTextDistanceItem::XFormTextDistanceItem(long nDist) :
4899     SfxMetricItem(XATTR_FORMTXTDISTANCE, nDist)
4900 {
4901 }
4902 
4903 /*************************************************************************
4904 |*
4905 |*    XFormTextDistanceItem::XFormTextDistanceItem(SvStream& rIn)
4906 |*
4907 |*    Beschreibung
4908 |*    Ersterstellung    02.02.95 ESO
4909 |*    Letzte Aenderung  02.02.95 ESO
4910 |*
4911 *************************************************************************/
4912 
4913 XFormTextDistanceItem::XFormTextDistanceItem(SvStream& rIn) :
4914     SfxMetricItem(XATTR_FORMTXTDISTANCE, rIn)
4915 {
4916 }
4917 
4918 /*************************************************************************
4919 |*
4920 |*    XFormTextDistanceItem::Clone(SfxItemPool* pPool) const
4921 |*
4922 |*    Beschreibung
4923 |*    Ersterstellung    02.02.95 ESO
4924 |*    Letzte Aenderung  02.02.95 ESO
4925 |*
4926 *************************************************************************/
4927 
4928 SfxPoolItem* XFormTextDistanceItem::Clone(SfxItemPool* /*pPool*/) const
4929 {
4930     return new XFormTextDistanceItem(*this);
4931 }
4932 
4933 /*************************************************************************
4934 |*
4935 |*    SfxPoolItem* XFormTextDistanceItem::Create(SvStream& rIn, sal_uInt16 nVer) const
4936 |*
4937 |*    Beschreibung
4938 |*    Ersterstellung    02.02.95 ESO
4939 |*    Letzte Aenderung  02.02.95 ESO
4940 |*
4941 *************************************************************************/
4942 
4943 SfxPoolItem* XFormTextDistanceItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
4944 {
4945     return new XFormTextDistanceItem(rIn);
4946 }
4947 
4948 //-------------------------
4949 // class XFormTextStartItem
4950 //-------------------------
4951 TYPEINIT1_AUTOFACTORY(XFormTextStartItem, SfxMetricItem);
4952 
4953 /*************************************************************************
4954 |*
4955 |*    XFormTextStartItem::XFormTextStartItem(long nStart)
4956 |*
4957 |*    Beschreibung
4958 |*    Ersterstellung    02.02.95 ESO
4959 |*    Letzte Aenderung  02.02.95 ESO
4960 |*
4961 *************************************************************************/
4962 
4963 XFormTextStartItem::XFormTextStartItem(long nStart) :
4964     SfxMetricItem(XATTR_FORMTXTSTART, nStart)
4965 {
4966 }
4967 
4968 /*************************************************************************
4969 |*
4970 |*    XFormTextStartItem::XFormTextStartItem(SvStream& rIn)
4971 |*
4972 |*    Beschreibung
4973 |*    Ersterstellung    02.02.95 ESO
4974 |*    Letzte Aenderung  02.02.95 ESO
4975 |*
4976 *************************************************************************/
4977 
4978 XFormTextStartItem::XFormTextStartItem(SvStream& rIn) :
4979     SfxMetricItem(XATTR_FORMTXTSTART, rIn)
4980 {
4981 }
4982 
4983 /*************************************************************************
4984 |*
4985 |*    XFormTextStartItem::Clone(SfxItemPool* pPool) const
4986 |*
4987 |*    Beschreibung
4988 |*    Ersterstellung    02.02.95 ESO
4989 |*    Letzte Aenderung  02.02.95 ESO
4990 |*
4991 *************************************************************************/
4992 
4993 SfxPoolItem* XFormTextStartItem::Clone(SfxItemPool* /*pPool*/) const
4994 {
4995     return new XFormTextStartItem(*this);
4996 }
4997 
4998 /*************************************************************************
4999 |*
5000 |*    SfxPoolItem* XFormTextStartItem::Create(SvStream& rIn, sal_uInt16 nVer) const
5001 |*
5002 |*    Beschreibung
5003 |*    Ersterstellung    02.02.95 ESO
5004 |*    Letzte Aenderung  02.02.95 ESO
5005 |*
5006 *************************************************************************/
5007 
5008 SfxPoolItem* XFormTextStartItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
5009 {
5010     return new XFormTextStartItem(rIn);
5011 }
5012 
5013 // -------------------------
5014 // class XFormTextMirrorItem
5015 // -------------------------
5016 TYPEINIT1_AUTOFACTORY(XFormTextMirrorItem, SfxBoolItem);
5017 
5018 /*************************************************************************
5019 |*
5020 |*    XFormTextMirrorItem::XFormTextMirrorItem(sal_Bool bMirror)
5021 |*
5022 |*    Ersterstellung    06.02.95 ESO
5023 |*    Letzte Aenderung  06.02.95 ESO
5024 |*
5025 *************************************************************************/
5026 
5027 XFormTextMirrorItem::XFormTextMirrorItem(sal_Bool bMirror) :
5028     SfxBoolItem(XATTR_FORMTXTMIRROR, bMirror)
5029 {
5030 }
5031 
5032 /*************************************************************************
5033 |*
5034 |*    XFormTextMirrorItem::XFormTextMirrorItem(SvStream& rIn)
5035 |*
5036 |*    Ersterstellung    06.02.95 ESO
5037 |*    Letzte Aenderung  06.02.95 ESO
5038 |*
5039 *************************************************************************/
5040 
5041 XFormTextMirrorItem::XFormTextMirrorItem(SvStream& rIn) :
5042     SfxBoolItem(XATTR_FORMTXTMIRROR, rIn)
5043 {
5044 }
5045 
5046 /*************************************************************************
5047 |*
5048 |*    XFormTextMirrorItem::Clone(SfxItemPool* pPool) const
5049 |*
5050 |*    Ersterstellung    06.02.95 ESO
5051 |*    Letzte Aenderung  06.02.95 ESO
5052 |*
5053 *************************************************************************/
5054 
5055 SfxPoolItem* XFormTextMirrorItem::Clone(SfxItemPool* /*pPool*/) const
5056 {
5057     return new XFormTextMirrorItem(*this);
5058 }
5059 
5060 /*************************************************************************
5061 |*
5062 |*    SfxPoolItem* XFormTextMirrorItem::Create(SvStream& rIn, sal_uInt16 nVer)
5063 |*                                              const
5064 |*
5065 |*    Ersterstellung    06.02.95 ESO
5066 |*    Letzte Aenderung  06.02.95 ESO
5067 |*
5068 *************************************************************************/
5069 
5070 SfxPoolItem* XFormTextMirrorItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
5071 {
5072     return new XFormTextMirrorItem(rIn);
5073 }
5074 
5075 
5076 // --------------------------
5077 // class XFormTextOutlineItem
5078 // --------------------------
5079 TYPEINIT1_AUTOFACTORY(XFormTextOutlineItem, SfxBoolItem);
5080 
5081 /*************************************************************************
5082 |*
5083 |*    XFormTextOutlineItem::XFormTextOutlineItem()
5084 |*
5085 |*    Ersterstellung    27.06.95 ESO
5086 |*    Letzte Aenderung  27.06.95 ESO
5087 |*
5088 *************************************************************************/
5089 
5090 XFormTextOutlineItem::XFormTextOutlineItem(sal_Bool bOutline) :
5091     SfxBoolItem(XATTR_FORMTXTOUTLINE, bOutline)
5092 {
5093 }
5094 
5095 /*************************************************************************
5096 |*
5097 |*    XFormTextOutlineItem::XFormTextOutlineItem(SvStream& rIn)
5098 |*
5099 |*    Ersterstellung    27.06.95 ESO
5100 |*    Letzte Aenderung  27.06.95 ESO
5101 |*
5102 *************************************************************************/
5103 
5104 XFormTextOutlineItem::XFormTextOutlineItem(SvStream& rIn) :
5105     SfxBoolItem(XATTR_FORMTXTOUTLINE, rIn)
5106 {
5107 }
5108 
5109 /*************************************************************************
5110 |*
5111 |*    XFormTextOutlineItem::Clone(SfxItemPool* pPool) const
5112 |*
5113 |*    Ersterstellung    27.06.95 ESO
5114 |*    Letzte Aenderung  27.06.95 ESO
5115 |*
5116 *************************************************************************/
5117 
5118 SfxPoolItem* XFormTextOutlineItem::Clone(SfxItemPool* /*pPool*/) const
5119 {
5120     return new XFormTextOutlineItem(*this);
5121 }
5122 
5123 /*************************************************************************
5124 |*
5125 |*    SfxPoolItem* XFormTextOutlineItem::Create(SvStream& rIn, sal_uInt16 nVer)
5126 |*                                              const
5127 |*
5128 |*    Ersterstellung    27.06.95 ESO
5129 |*    Letzte Aenderung  27.06.95 ESO
5130 |*
5131 *************************************************************************/
5132 
5133 SfxPoolItem* XFormTextOutlineItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
5134 {
5135     return new XFormTextOutlineItem(rIn);
5136 }
5137 
5138 //--------------------------
5139 // class XFormTextShadowItem
5140 //--------------------------
5141 TYPEINIT1_AUTOFACTORY(XFormTextShadowItem, SfxEnumItem);
5142 
5143 /*************************************************************************
5144 |*
5145 |*    XFormTextShadowItem::XFormTextShadowItem()
5146 |*
5147 |*    Beschreibung
5148 |*    Ersterstellung    27.06.95
5149 |*    Letzte Aenderung  27.06.95
5150 |*
5151 *************************************************************************/
5152 
5153 XFormTextShadowItem::XFormTextShadowItem(XFormTextShadow eFormTextShadow) :
5154     SfxEnumItem(
5155         XATTR_FORMTXTSHADOW, sal::static_int_cast< sal_uInt16 >(eFormTextShadow))
5156 {
5157 }
5158 
5159 /*************************************************************************
5160 |*
5161 |*    XFormTextShadowItem::XFormTextShadowItem(SvStream& rIn)
5162 |*
5163 |*    Beschreibung
5164 |*    Ersterstellung    27.06.95
5165 |*    Letzte Aenderung  27.06.95
5166 |*
5167 *************************************************************************/
5168 
5169 XFormTextShadowItem::XFormTextShadowItem(SvStream& rIn) :
5170     SfxEnumItem(XATTR_FORMTXTSHADOW, rIn)
5171 {
5172 }
5173 
5174 /*************************************************************************
5175 |*
5176 |*    XFormTextShadowItem::Clone(SfxItemPool* pPool) const
5177 |*
5178 |*    Beschreibung
5179 |*    Ersterstellung    27.06.95
5180 |*    Letzte Aenderung  27.06.95
5181 |*
5182 *************************************************************************/
5183 
5184 SfxPoolItem* XFormTextShadowItem::Clone(SfxItemPool* /*pPool*/) const
5185 {
5186     return new XFormTextShadowItem( *this );
5187 }
5188 
5189 /*************************************************************************
5190 |*
5191 |*    SfxPoolItem* XFormTextShadowItem::Create(SvStream& rIn, sal_uInt16 nVer) const
5192 |*
5193 |*    Beschreibung
5194 |*    Ersterstellung    27.06.95
5195 |*    Letzte Aenderung  27.06.95
5196 |*
5197 *************************************************************************/
5198 
5199 SfxPoolItem* XFormTextShadowItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
5200 {
5201     return new XFormTextShadowItem(rIn);
5202 }
5203 
5204 
5205 /*************************************************************************
5206 |*
5207 |*
5208 |*
5209 \*************************************************************************/
5210 
5211 sal_uInt16 XFormTextShadowItem::GetValueCount() const
5212 {
5213     return 3;
5214 }
5215 
5216 /*************************************************************************
5217 |*
5218 |*
5219 |*
5220 \*************************************************************************/
5221 
5222 // #FontWork#
5223 sal_Bool XFormTextShadowItem::QueryValue( uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
5224 {
5225     rVal <<= (sal_Int32)GetValue();
5226     return sal_True;
5227 }
5228 
5229 /*************************************************************************
5230 |*
5231 |*
5232 |*
5233 \*************************************************************************/
5234 
5235 // #FontWork#
5236 sal_Bool XFormTextShadowItem::PutValue( const uno::Any& rVal, sal_uInt8 /*nMemberId*/)
5237 {
5238     sal_Int32 nValue = 0;
5239     rVal >>= nValue;
5240     SetValue(sal::static_int_cast< sal_uInt16 >(nValue));
5241 
5242     return sal_True;
5243 }
5244 
5245 // -------------------------------
5246 // class XFormTextShadowColorItem
5247 // -------------------------------
5248 TYPEINIT1_AUTOFACTORY(XFormTextShadowColorItem, XColorItem);
5249 
5250 /*************************************************************************
5251 |*
5252 |*    XFormTextShadowColorItem::XFormTextShadowColorItem()
5253 |*
5254 |*    Beschreibung
5255 |*    Ersterstellung    27.06.95
5256 |*    Letzte Aenderung  27.06.95
5257 |*
5258 *************************************************************************/
5259 
5260 XFormTextShadowColorItem::XFormTextShadowColorItem(sal_Int32 nIndex,
5261                                                      const Color& rTheColor) :
5262     XColorItem(XATTR_FORMTXTSHDWCOLOR, nIndex, rTheColor)
5263 {
5264 }
5265 
5266 /*************************************************************************
5267 |*
5268 |*    XFormTextShadowColorItem::XFormTextShadowColorItem(const XubString& rName, const Color& rTheColor)
5269 |*
5270 |*    Beschreibung
5271 |*    Ersterstellung    27.06.95
5272 |*    Letzte Aenderung  27.06.95
5273 |*
5274 *************************************************************************/
5275 
5276 XFormTextShadowColorItem::XFormTextShadowColorItem(const XubString& rName,
5277                                                      const Color& rTheColor) :
5278     XColorItem(XATTR_FORMTXTSHDWCOLOR, rName, rTheColor)
5279 {
5280 }
5281 
5282 /*************************************************************************
5283 |*
5284 |*    XFormTextShadowColorItem::XFormTextShadowColorItem(SvStream& rIn)
5285 |*
5286 |*    Beschreibung
5287 |*    Ersterstellung    27.06.95
5288 |*    Letzte Aenderung  27.06.95
5289 |*
5290 *************************************************************************/
5291 
5292 XFormTextShadowColorItem::XFormTextShadowColorItem(SvStream& rIn) :
5293     XColorItem(XATTR_FORMTXTSHDWCOLOR, rIn)
5294 {
5295 }
5296 
5297 /*************************************************************************
5298 |*
5299 |*    XFormTextShadowColorItem::Clone(SfxItemPool* pPool) const
5300 |*
5301 |*    Beschreibung
5302 |*    Ersterstellung    27.06.95
5303 |*    Letzte Aenderung  27.06.95
5304 |*
5305 *************************************************************************/
5306 
5307 SfxPoolItem* XFormTextShadowColorItem::Clone(SfxItemPool* /*pPool*/) const
5308 {
5309     return new XFormTextShadowColorItem(*this);
5310 }
5311 
5312 /*************************************************************************
5313 |*
5314 |*    SfxPoolItem* XFormTextShadowColorItem::Create(SvStream& rIn, sal_uInt16 nVer) const
5315 |*
5316 |*    Beschreibung
5317 |*    Ersterstellung    27.06.95
5318 |*    Letzte Aenderung  27.06.95
5319 |*
5320 *************************************************************************/
5321 
5322 SfxPoolItem* XFormTextShadowColorItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
5323 {
5324     return new XFormTextShadowColorItem(rIn);
5325 }
5326 
5327 //------------------------------
5328 // class XFormTextShadowXValItem
5329 //------------------------------
5330 TYPEINIT1_AUTOFACTORY(XFormTextShadowXValItem, SfxMetricItem);
5331 
5332 /*************************************************************************
5333 |*
5334 |*    XFormTextShadowXValItem::XFormTextShadowXValItem(long)
5335 |*
5336 |*    Beschreibung
5337 |*    Ersterstellung    28.06.95 ESO
5338 |*    Letzte Aenderung  28.06.95 ESO
5339 |*
5340 *************************************************************************/
5341 
5342 XFormTextShadowXValItem::XFormTextShadowXValItem(long nVal) :
5343     SfxMetricItem(XATTR_FORMTXTSHDWXVAL, nVal)
5344 {
5345 }
5346 
5347 /*************************************************************************
5348 |*
5349 |*    XFormTextShadowXValItem::XFormTextShadowXValItem(SvStream& rIn)
5350 |*
5351 |*    Beschreibung
5352 |*    Ersterstellung    28.06.95 ESO
5353 |*    Letzte Aenderung  28.06.95 ESO
5354 |*
5355 *************************************************************************/
5356 
5357 XFormTextShadowXValItem::XFormTextShadowXValItem(SvStream& rIn) :
5358     SfxMetricItem(XATTR_FORMTXTSHDWXVAL, rIn)
5359 {
5360 }
5361 
5362 /*************************************************************************
5363 |*
5364 |*    XFormTextShadowXValItem::Clone(SfxItemPool* pPool) const
5365 |*
5366 |*    Beschreibung
5367 |*    Ersterstellung    28.06.95 ESO
5368 |*    Letzte Aenderung  28.06.95 ESO
5369 |*
5370 *************************************************************************/
5371 
5372 SfxPoolItem* XFormTextShadowXValItem::Clone(SfxItemPool* /*pPool*/) const
5373 {
5374     return new XFormTextShadowXValItem(*this);
5375 }
5376 
5377 /*************************************************************************
5378 |*
5379 |*    SfxPoolItem* XFormTextShadowXValItem::Create(SvStream& rIn, sal_uInt16 nVer) const
5380 |*
5381 |*    Beschreibung
5382 |*    Ersterstellung    28.06.95 ESO
5383 |*    Letzte Aenderung  28.06.95 ESO
5384 |*
5385 *************************************************************************/
5386 
5387 SfxPoolItem* XFormTextShadowXValItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
5388 {
5389     return new XFormTextShadowXValItem(rIn);
5390 }
5391 
5392 //------------------------------
5393 // class XFormTextShadowYValItem
5394 //------------------------------
5395 TYPEINIT1_AUTOFACTORY(XFormTextShadowYValItem, SfxMetricItem);
5396 
5397 /*************************************************************************
5398 |*
5399 |*    XFormTextShadowYValItem::XFormTextShadowYValItem(long)
5400 |*
5401 |*    Beschreibung
5402 |*    Ersterstellung    28.06.95 ESO
5403 |*    Letzte Aenderung  28.06.95 ESO
5404 |*
5405 *************************************************************************/
5406 
5407 XFormTextShadowYValItem::XFormTextShadowYValItem(long nVal) :
5408     SfxMetricItem(XATTR_FORMTXTSHDWYVAL, nVal)
5409 {
5410 }
5411 
5412 /*************************************************************************
5413 |*
5414 |*    XFormTextShadowYValItem::XFormTextShadowYValItem(SvStream& rIn)
5415 |*
5416 |*    Beschreibung
5417 |*    Ersterstellung    28.06.95 ESO
5418 |*    Letzte Aenderung  28.06.95 ESO
5419 |*
5420 *************************************************************************/
5421 
5422 XFormTextShadowYValItem::XFormTextShadowYValItem(SvStream& rIn) :
5423     SfxMetricItem(XATTR_FORMTXTSHDWYVAL, rIn)
5424 {
5425 }
5426 
5427 /*************************************************************************
5428 |*
5429 |*    XFormTextShadowYValItem::Clone(SfxItemPool* pPool) const
5430 |*
5431 |*    Beschreibung
5432 |*    Ersterstellung    28.06.95 ESO
5433 |*    Letzte Aenderung  28.06.95 ESO
5434 |*
5435 *************************************************************************/
5436 
5437 SfxPoolItem* XFormTextShadowYValItem::Clone(SfxItemPool* /*pPool*/) const
5438 {
5439     return new XFormTextShadowYValItem(*this);
5440 }
5441 
5442 /*************************************************************************
5443 |*
5444 |*    SfxPoolItem* XFormTextShadowYValItem::Create(SvStream& rIn, sal_uInt16 nVer) const
5445 |*
5446 |*    Beschreibung
5447 |*    Ersterstellung    28.06.95 ESO
5448 |*    Letzte Aenderung  28.06.95 ESO
5449 |*
5450 *************************************************************************/
5451 
5452 SfxPoolItem* XFormTextShadowYValItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
5453 {
5454     return new XFormTextShadowYValItem(rIn);
5455 }
5456 
5457 //---------------------------
5458 // class XFormTextStdFormItem
5459 //---------------------------
5460 TYPEINIT1_AUTOFACTORY(XFormTextStdFormItem, SfxEnumItem);
5461 
5462 /*************************************************************************
5463 |*
5464 |*    XFormTextStdFormItem::XFormTextStdFormItem()
5465 |*
5466 |*    Beschreibung
5467 |*    Ersterstellung    27.06.95
5468 |*    Letzte Aenderung  27.06.95
5469 |*
5470 *************************************************************************/
5471 
5472 XFormTextStdFormItem::XFormTextStdFormItem(XFormTextStdForm eFormTextStdForm) :
5473     SfxEnumItem(
5474         XATTR_FORMTXTSTDFORM, sal::static_int_cast< sal_uInt16 >(eFormTextStdForm))
5475 {
5476 }
5477 
5478 /*************************************************************************
5479 |*
5480 |*    XFormTextStdFormItem::XFormTextStdFormItem(SvStream& rIn)
5481 |*
5482 |*    Beschreibung
5483 |*    Ersterstellung    27.06.95
5484 |*    Letzte Aenderung  27.06.95
5485 |*
5486 *************************************************************************/
5487 
5488 XFormTextStdFormItem::XFormTextStdFormItem(SvStream& rIn) :
5489     SfxEnumItem(XATTR_FORMTXTSTDFORM, rIn)
5490 {
5491 }
5492 
5493 /*************************************************************************
5494 |*
5495 |*    XFormTextStdFormItem::Clone(SfxItemPool* pPool) const
5496 |*
5497 |*    Beschreibung
5498 |*    Ersterstellung    27.06.95
5499 |*    Letzte Aenderung  27.06.95
5500 |*
5501 *************************************************************************/
5502 
5503 SfxPoolItem* XFormTextStdFormItem::Clone(SfxItemPool* /*pPool*/) const
5504 {
5505     return new XFormTextStdFormItem( *this );
5506 }
5507 
5508 /*************************************************************************
5509 |*
5510 |*    SfxPoolItem* XFormTextStdFormItem::Create(SvStream& rIn, sal_uInt16 nVer) const
5511 |*
5512 |*    Beschreibung
5513 |*    Ersterstellung    27.06.95
5514 |*    Letzte Aenderung  27.06.95
5515 |*
5516 *************************************************************************/
5517 
5518 SfxPoolItem* XFormTextStdFormItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
5519 {
5520     return new XFormTextStdFormItem(rIn);
5521 }
5522 
5523 
5524 /*************************************************************************
5525 |*
5526 |*
5527 |*
5528 \*************************************************************************/
5529 
5530 sal_uInt16 XFormTextStdFormItem::GetValueCount() const
5531 {
5532     return 3;
5533 }
5534 
5535 /*************************************************************************
5536 |*
5537 |*
5538 |*
5539 \*************************************************************************/
5540 
5541 // #FontWork#
5542 sal_Bool XFormTextStdFormItem::QueryValue( uno::Any& rVal, sal_uInt8 /*nMemberId*/) const
5543 {
5544     rVal <<= (sal_Int32)GetValue();
5545     return sal_True;
5546 }
5547 
5548 /*************************************************************************
5549 |*
5550 |*
5551 |*
5552 \*************************************************************************/
5553 
5554 // #FontWork#
5555 sal_Bool XFormTextStdFormItem::PutValue( const uno::Any& rVal, sal_uInt8 /*nMemberId*/)
5556 {
5557     sal_Int32 nValue = 0;
5558     rVal >>= nValue;
5559     SetValue(sal::static_int_cast< sal_uInt16 >(nValue));
5560 
5561     return sal_True;
5562 }
5563 
5564 // --------------------------
5565 // class XFormTextHideFormItem
5566 // --------------------------
5567 TYPEINIT1_AUTOFACTORY(XFormTextHideFormItem, SfxBoolItem);
5568 
5569 /*************************************************************************
5570 |*
5571 |*    XFormTextHideFormItem::XFormTextHideFormItem()
5572 |*
5573 |*    Ersterstellung    27.06.95 ESO
5574 |*    Letzte Aenderung  27.06.95 ESO
5575 |*
5576 *************************************************************************/
5577 
5578 XFormTextHideFormItem::XFormTextHideFormItem(sal_Bool bHide) :
5579     SfxBoolItem(XATTR_FORMTXTHIDEFORM, bHide)
5580 {
5581 }
5582 
5583 /*************************************************************************
5584 |*
5585 |*    XFormTextHideFormItem::XFormTextHideFormItem(SvStream& rIn)
5586 |*
5587 |*    Ersterstellung    27.06.95 ESO
5588 |*    Letzte Aenderung  27.06.95 ESO
5589 |*
5590 *************************************************************************/
5591 
5592 XFormTextHideFormItem::XFormTextHideFormItem(SvStream& rIn) :
5593     SfxBoolItem(XATTR_FORMTXTHIDEFORM, rIn)
5594 {
5595 }
5596 
5597 /*************************************************************************
5598 |*
5599 |*    XFormTextHideFormItem::Clone(SfxItemPool* pPool) const
5600 |*
5601 |*    Ersterstellung    27.06.95 ESO
5602 |*    Letzte Aenderung  27.06.95 ESO
5603 |*
5604 *************************************************************************/
5605 
5606 SfxPoolItem* XFormTextHideFormItem::Clone(SfxItemPool* /*pPool*/) const
5607 {
5608     return new XFormTextHideFormItem(*this);
5609 }
5610 
5611 /*************************************************************************
5612 |*
5613 |*    SfxPoolItem* XFormTextHideFormItem::Create(SvStream& rIn, sal_uInt16 nVer)
5614 |*                                              const
5615 |*
5616 |*    Ersterstellung    27.06.95 ESO
5617 |*    Letzte Aenderung  27.06.95 ESO
5618 |*
5619 *************************************************************************/
5620 
5621 SfxPoolItem* XFormTextHideFormItem::Create(SvStream& rIn, sal_uInt16 /*nVer*/) const
5622 {
5623     return new XFormTextHideFormItem(rIn);
5624 }
5625 
5626 
5627 
5628 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5629 //                              SetItems
5630 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5631 
5632 TYPEINIT1(XLineAttrSetItem, SfxSetItem);
5633 
5634 /*************************************************************************
5635 |*
5636 |* Konstruktoren fuer Linienattribute-SetItem
5637 |*
5638 \************************************************************************/
5639 
5640 XLineAttrSetItem::XLineAttrSetItem( SfxItemSet* pItemSet ) :
5641     SfxSetItem( XATTRSET_LINE, pItemSet)
5642 {
5643 }
5644 
5645 /************************************************************************/
5646 
5647 XLineAttrSetItem::XLineAttrSetItem( SfxItemPool* pItemPool ) :
5648     SfxSetItem( XATTRSET_LINE,
5649         new SfxItemSet( *pItemPool, XATTR_LINE_FIRST, XATTR_LINE_LAST))
5650 {
5651 }
5652 
5653 /************************************************************************/
5654 
5655 XLineAttrSetItem::XLineAttrSetItem( const XLineAttrSetItem& rLineAttr ) :
5656     SfxSetItem( rLineAttr )
5657 {
5658 }
5659 
5660 /************************************************************************/
5661 
5662 XLineAttrSetItem::XLineAttrSetItem( const XLineAttrSetItem& rLineAttr,
5663                                     SfxItemPool* pItemPool) :
5664     SfxSetItem( rLineAttr, pItemPool )
5665 {
5666 }
5667 
5668 /*************************************************************************
5669 |*
5670 |* Clone-Funktion
5671 |*
5672 \************************************************************************/
5673 
5674 SfxPoolItem* XLineAttrSetItem::Clone( SfxItemPool* pPool ) const
5675 {
5676     return new XLineAttrSetItem( *this, pPool );
5677 }
5678 
5679 /*************************************************************************
5680 |*
5681 |* SetItem aus Stream erzeugen
5682 |*
5683 \************************************************************************/
5684 
5685 SfxPoolItem* XLineAttrSetItem::Create( SvStream& rStream, sal_uInt16 /*nVersion*/) const
5686 {
5687     SfxItemSet *pSet2 = new SfxItemSet( *GetItemSet().GetPool(),
5688                                     XATTR_LINE_FIRST, XATTR_LINE_LAST);
5689     pSet2->Load( rStream );
5690     return new XLineAttrSetItem( pSet2 );
5691 }
5692 
5693 /*************************************************************************
5694 |*
5695 |* SetItem in Stream speichern
5696 |*
5697 \************************************************************************/
5698 
5699 SvStream& XLineAttrSetItem::Store( SvStream& rStream, sal_uInt16 nItemVersion ) const
5700 {
5701     return SfxSetItem::Store( rStream, nItemVersion );
5702 }
5703 
5704 
5705 TYPEINIT1(XFillAttrSetItem, SfxSetItem);
5706 
5707 /*************************************************************************
5708 |*
5709 |* Konstruktoren fuer Fuellattribute-SetItem
5710 |*
5711 \************************************************************************/
5712 
5713 XFillAttrSetItem::XFillAttrSetItem( SfxItemSet* pItemSet ) :
5714     SfxSetItem( XATTRSET_FILL, pItemSet)
5715 {
5716 }
5717 
5718 /************************************************************************/
5719 
5720 XFillAttrSetItem::XFillAttrSetItem( SfxItemPool* pItemPool ) :
5721     SfxSetItem( XATTRSET_FILL,
5722         new SfxItemSet( *pItemPool, XATTR_FILL_FIRST, XATTR_FILL_LAST))
5723 {
5724 }
5725 
5726 /************************************************************************/
5727 
5728 XFillAttrSetItem::XFillAttrSetItem( const XFillAttrSetItem& rFillAttr ) :
5729     SfxSetItem( rFillAttr )
5730 {
5731 }
5732 
5733 /************************************************************************/
5734 
5735 XFillAttrSetItem::XFillAttrSetItem( const XFillAttrSetItem& rFillAttr,
5736                                     SfxItemPool* pItemPool ) :
5737     SfxSetItem( rFillAttr, pItemPool )
5738 {
5739 }
5740 
5741 /*************************************************************************
5742 |*
5743 |* Clone-Funktion
5744 |*
5745 \************************************************************************/
5746 
5747 SfxPoolItem* XFillAttrSetItem::Clone( SfxItemPool* pPool ) const
5748 {
5749     return new XFillAttrSetItem( *this, pPool );
5750 }
5751 
5752 /*************************************************************************
5753 |*
5754 |* SetItem aus Stream erzeugen
5755 |*
5756 \************************************************************************/
5757 
5758 SfxPoolItem* XFillAttrSetItem::Create( SvStream& rStream, sal_uInt16 /*nVersion*/) const
5759 {
5760     SfxItemSet *pSet2 = new SfxItemSet( *GetItemSet().GetPool(),
5761                                     XATTR_FILL_FIRST, XATTR_FILL_LAST);
5762     pSet2->Load( rStream );
5763     return new XFillAttrSetItem( pSet2 );
5764 }
5765 
5766 /*************************************************************************
5767 |*
5768 |* SetItem in Stream speichern
5769 |*
5770 \************************************************************************/
5771 
5772 SvStream& XFillAttrSetItem::Store( SvStream& rStream, sal_uInt16 nItemVersion ) const
5773 {
5774     return SfxSetItem::Store( rStream, nItemVersion );
5775 }
5776 
5777 // eof
5778 
5779