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_chart2.hxx"
26 
27 #include "WrappedSymbolProperties.hxx"
28 #include "WrappedSeriesOrDiagramProperty.hxx"
29 #include "macros.hxx"
30 #include "FastPropertyIdRanges.hxx"
31 #include "ChartTypeHelper.hxx"
32 #include <com/sun/star/chart2/Symbol.hpp>
33 #include <com/sun/star/chart2/SymbolStyle.hpp>
34 #include <com/sun/star/awt/Size.hpp>
35 #include <com/sun/star/beans/PropertyAttribute.hpp>
36 #include <com/sun/star/chart/ChartSymbolType.hpp>
37 #include <com/sun/star/drawing/LineStyle.hpp>
38 
39 #include <com/sun/star/graphic/XGraphicProvider.hpp>
40 
41 // for UNO_NAME_GRAPHOBJ_URLPREFIX
42 #include <editeng/unoprnms.hxx>
43 
44 // for Graphic
45 #include <vcl/graph.hxx>
46 // for GraphicObject
47 #include <svtools/grfmgr.hxx>
48 #include <vcl/outdev.hxx>
49 
50 #include <comphelper/processfactory.hxx>
51 
52 using namespace ::com::sun::star;
53 using ::com::sun::star::uno::Any;
54 using ::com::sun::star::uno::Reference;
55 using ::com::sun::star::uno::Sequence;
56 using ::com::sun::star::beans::Property;
57 using ::rtl::OUString;
58 
59 //.............................................................................
60 namespace chart
61 {
62 namespace wrapper
63 {
64 
65 
66 //-----------------------------------------------------------------------------
67 //-----------------------------------------------------------------------------
68 //-----------------------------------------------------------------------------
69 
70 class WrappedSymbolTypeProperty : public WrappedSeriesOrDiagramProperty< sal_Int32 >
71 {
72 public:
73     virtual sal_Int32 getValueFromSeries( const Reference< beans::XPropertySet >& xSeriesPropertySet ) const;
74     virtual void setValueToSeries( const Reference< beans::XPropertySet >& xSeriesPropertySet, sal_Int32 aNewValue ) const;
75 
76     virtual Any getPropertyValue( const Reference< beans::XPropertySet >& xInnerPropertySet ) const
77                             throw ( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException);
78     virtual beans::PropertyState getPropertyState( const Reference< beans::XPropertyState >& xInnerPropertyState ) const
79                         throw (beans::UnknownPropertyException, uno::RuntimeException);
80 
81     explicit WrappedSymbolTypeProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact,
82                                         tSeriesOrDiagramPropertyType ePropertyType );
83     virtual ~WrappedSymbolTypeProperty();
84 };
85 
86 class WrappedSymbolBitmapURLProperty : public WrappedSeriesOrDiagramProperty< OUString >
87 {
88 public:
89     virtual OUString getValueFromSeries( const Reference< beans::XPropertySet >& xSeriesPropertySet ) const;
90     virtual void setValueToSeries( const Reference< beans::XPropertySet >& xSeriesPropertySet, OUString aNewGraphicURL ) const;
91 
92     explicit WrappedSymbolBitmapURLProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact,
93                                              tSeriesOrDiagramPropertyType ePropertyType );
94     virtual ~WrappedSymbolBitmapURLProperty();
95 };
96 
97 class WrappedSymbolSizeProperty : public WrappedSeriesOrDiagramProperty< awt::Size >
98 {
99 public:
100     virtual awt::Size getValueFromSeries( const Reference< beans::XPropertySet >& xSeriesPropertySet ) const;
101     virtual void setValueToSeries( const Reference< beans::XPropertySet >& xSeriesPropertySet, awt::Size aNewSize ) const;
102     virtual beans::PropertyState getPropertyState( const Reference< beans::XPropertyState >& xInnerPropertyState ) const
103                         throw (beans::UnknownPropertyException, uno::RuntimeException);
104 
105     explicit WrappedSymbolSizeProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact,
106                                         tSeriesOrDiagramPropertyType ePropertyType );
107     virtual ~WrappedSymbolSizeProperty();
108 };
109 
110 class WrappedSymbolAndLinesProperty : public WrappedSeriesOrDiagramProperty< sal_Bool >
111 {
112 public:
113     virtual sal_Bool getValueFromSeries( const Reference< beans::XPropertySet >& xSeriesPropertySet ) const;
114     virtual void setValueToSeries( const Reference< beans::XPropertySet >& xSeriesPropertySet, sal_Bool bDrawLines ) const;
115     virtual beans::PropertyState getPropertyState( const Reference< beans::XPropertyState >& xInnerPropertyState ) const
116                         throw (beans::UnknownPropertyException, uno::RuntimeException);
117 
118     explicit WrappedSymbolAndLinesProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact,
119                                             tSeriesOrDiagramPropertyType ePropertyType );
120     virtual ~WrappedSymbolAndLinesProperty();
121 };
122 
123 namespace
124 {
125 enum
126 {
127     //symbol properties
128     PROP_CHART_SYMBOL_TYPE = FAST_PROPERTY_ID_START_CHART_SYMBOL_PROP,
129     PROP_CHART_SYMBOL_BITMAP_URL,
130     PROP_CHART_SYMBOL_SIZE,
131     PROP_CHART_SYMBOL_AND_LINES
132 };
133 
134 sal_Int32 lcl_getSymbolType( const ::com::sun::star::chart2::Symbol& rSymbol )
135 {
136     sal_Int32 nSymbol = ::com::sun::star::chart::ChartSymbolType::NONE;
137     switch( rSymbol.Style )
138     {
139         case chart2::SymbolStyle_NONE:
140             break;
141         case chart2::SymbolStyle_AUTO:
142             nSymbol = ::com::sun::star::chart::ChartSymbolType::AUTO;
143             break;
144         case chart2::SymbolStyle_STANDARD:
145             nSymbol = rSymbol.StandardSymbol%15;
146             break;
147         case chart2::SymbolStyle_POLYGON://new feature
148             nSymbol = ::com::sun::star::chart::ChartSymbolType::AUTO;
149             break;
150         case chart2::SymbolStyle_GRAPHIC:
151             nSymbol = ::com::sun::star::chart::ChartSymbolType::BITMAPURL;
152             break;
153         default:
154             nSymbol = ::com::sun::star::chart::ChartSymbolType::AUTO;
155             break;
156     }
157     return nSymbol;
158 }
159 void lcl_setSymbolTypeToSymbol( sal_Int32 nSymbolType, chart2::Symbol& rSymbol )
160 {
161     switch( nSymbolType )
162     {
163         case ::com::sun::star::chart::ChartSymbolType::NONE:
164             rSymbol.Style = chart2::SymbolStyle_NONE;
165             break;
166         case ::com::sun::star::chart::ChartSymbolType::AUTO:
167             rSymbol.Style = chart2::SymbolStyle_AUTO;
168             break;
169         case ::com::sun::star::chart::ChartSymbolType::BITMAPURL:
170             rSymbol.Style = chart2::SymbolStyle_GRAPHIC;
171             break;
172         default:
173             rSymbol.Style = chart2::SymbolStyle_STANDARD;
174             rSymbol.StandardSymbol = nSymbolType;
175             break;
176     }
177 }
178 
179 void lcl_addWrappedProperties( std::vector< WrappedProperty* >& rList
180                                     , ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact
181                                     , tSeriesOrDiagramPropertyType ePropertyType )
182 {
183     rList.push_back( new WrappedSymbolTypeProperty( spChart2ModelContact, ePropertyType ) );
184     rList.push_back( new WrappedSymbolBitmapURLProperty( spChart2ModelContact, ePropertyType ) );
185     rList.push_back( new WrappedSymbolSizeProperty( spChart2ModelContact, ePropertyType  ) );
186     rList.push_back( new WrappedSymbolAndLinesProperty( spChart2ModelContact, ePropertyType  ) );
187 }
188 
189 }//anonymous namespace
190 
191 //-----------------------------------------------------------------------------
192 //-----------------------------------------------------------------------------
193 //-----------------------------------------------------------------------------
194 void WrappedSymbolProperties::addProperties( ::std::vector< Property > & rOutProperties )
195 {
196     rOutProperties.push_back(
197         Property( C2U( "SymbolType" ),
198                   PROP_CHART_SYMBOL_TYPE,
199                   ::getCppuType( reinterpret_cast< sal_Int32 * >(0)),
200                   beans::PropertyAttribute::BOUND
201                   | beans::PropertyAttribute::MAYBEDEFAULT ));
202 
203     rOutProperties.push_back(
204         Property( C2U( "SymbolBitmapURL" ),
205                   PROP_CHART_SYMBOL_BITMAP_URL,
206                   ::getCppuType( reinterpret_cast< ::rtl::OUString * >(0)),
207                   beans::PropertyAttribute::BOUND
208                   | beans::PropertyAttribute::MAYBEDEFAULT ));
209 
210     rOutProperties.push_back(
211         Property( C2U( "SymbolSize" ),
212                   PROP_CHART_SYMBOL_SIZE,
213                   ::getCppuType( reinterpret_cast< awt::Size * >(0)),
214                   beans::PropertyAttribute::BOUND
215                   | beans::PropertyAttribute::MAYBEDEFAULT ));
216 
217     rOutProperties.push_back(
218         Property( C2U( "Lines" ),
219                   PROP_CHART_SYMBOL_AND_LINES,
220                   ::getBooleanCppuType(),
221                   beans::PropertyAttribute::BOUND
222                   | beans::PropertyAttribute::MAYBEDEFAULT ));
223 }
224 
225 //-----------------------------------------------------------------------------
226 //-----------------------------------------------------------------------------
227 
228 void WrappedSymbolProperties::addWrappedPropertiesForSeries( std::vector< WrappedProperty* >& rList
229                                     , ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact )
230 {
231     lcl_addWrappedProperties( rList, spChart2ModelContact, DATA_SERIES );
232 }
233 
234 //-----------------------------------------------------------------------------
235 //-----------------------------------------------------------------------------
236 
237 void WrappedSymbolProperties::addWrappedPropertiesForDiagram( std::vector< WrappedProperty* >& rList
238                                     , ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact )
239 {
240     lcl_addWrappedProperties( rList, spChart2ModelContact, DIAGRAM );
241 }
242 
243 //-----------------------------------------------------------------------------
244 //-----------------------------------------------------------------------------
245 //-----------------------------------------------------------------------------
246 
247 WrappedSymbolTypeProperty::WrappedSymbolTypeProperty(
248     ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact,
249     tSeriesOrDiagramPropertyType ePropertyType )
250         : WrappedSeriesOrDiagramProperty< sal_Int32 >( C2U("SymbolType")
251             , uno::makeAny( ::com::sun::star::chart::ChartSymbolType::NONE )
252             , spChart2ModelContact
253             , ePropertyType )
254 {
255 }
256 WrappedSymbolTypeProperty::~WrappedSymbolTypeProperty()
257 {
258 }
259 
260 sal_Int32 WrappedSymbolTypeProperty::getValueFromSeries( const Reference< beans::XPropertySet >& xSeriesPropertySet ) const
261 {
262     sal_Int32 aRet = 0;
263     m_aDefaultValue >>= aRet;
264     chart2::Symbol aSymbol;
265     if( xSeriesPropertySet.is() && ( xSeriesPropertySet->getPropertyValue(C2U("Symbol")) >>= aSymbol ) )
266         aRet = lcl_getSymbolType( aSymbol );
267     return aRet;
268 }
269 
270 void WrappedSymbolTypeProperty::setValueToSeries( const Reference< beans::XPropertySet >& xSeriesPropertySet, sal_Int32 nSymbolType ) const
271 {
272     if(!xSeriesPropertySet.is())
273         return;
274 
275     chart2::Symbol aSymbol;
276     xSeriesPropertySet->getPropertyValue(C2U("Symbol")) >>= aSymbol;
277 
278     lcl_setSymbolTypeToSymbol( nSymbolType, aSymbol );
279     xSeriesPropertySet->setPropertyValue( C2U("Symbol"), uno::makeAny( aSymbol ) );
280 }
281 
282 Any WrappedSymbolTypeProperty::getPropertyValue( const Reference< beans::XPropertySet >& xInnerPropertySet ) const
283                             throw ( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
284 {
285     //the old chart (< OOo 2.3) needs symbol-type="automatic" at the plot-area if any of the series should be able to have symbols
286     if( m_ePropertyType == DIAGRAM )
287     {
288         bool bHasAmbiguousValue = false;
289         sal_Int32 aValue = 0;
290         if( detectInnerValue( aValue, bHasAmbiguousValue ) )
291         {
292             if(bHasAmbiguousValue)
293             {
294                 m_aOuterValue = uno::makeAny( ::com::sun::star::chart::ChartSymbolType::AUTO );
295             }
296             else
297             {
298                 if( ::com::sun::star::chart::ChartSymbolType::NONE == aValue )
299                     m_aOuterValue = uno::makeAny( ::com::sun::star::chart::ChartSymbolType::NONE );
300                 else
301                     m_aOuterValue = uno::makeAny( ::com::sun::star::chart::ChartSymbolType::AUTO );
302             }
303         }
304         return m_aOuterValue;
305     }
306     else
307     {
308         ::com::sun::star::uno::Any aRet( m_aDefaultValue );
309         aRet <<= getValueFromSeries( xInnerPropertySet );
310         return aRet;
311     }
312 }
313 
314 beans::PropertyState WrappedSymbolTypeProperty::getPropertyState( const Reference< beans::XPropertyState >& xInnerPropertyState ) const
315                         throw (beans::UnknownPropertyException, uno::RuntimeException)
316 {
317     //the special situation for this property here is that the diagram default can be
318     //different from the normal default and different from all sinlges series values
319     //so we need to return PropertyState_DIRECT_VALUE for more cases
320 
321     if( m_ePropertyType == DATA_SERIES && //single series or point
322         m_spChart2ModelContact.get())
323     {
324         Reference< chart2::XDiagram > xDiagram( m_spChart2ModelContact->getChart2Diagram() );
325         Reference< chart2::XDataSeries > xSeries( xInnerPropertyState, uno::UNO_QUERY );
326         Reference< chart2::XChartType > xChartType( DiagramHelper::getChartTypeOfSeries( xDiagram, xSeries ) );
327         if( ChartTypeHelper::isSupportingSymbolProperties( xChartType, 2 ) )
328             return beans::PropertyState_DIRECT_VALUE;
329     }
330     return WrappedProperty::getPropertyState( xInnerPropertyState );
331 }
332 
333 //-----------------------------------------------------------------------------
334 //-----------------------------------------------------------------------------
335 //-----------------------------------------------------------------------------
336 
337 WrappedSymbolBitmapURLProperty::WrappedSymbolBitmapURLProperty(
338     ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact,
339     tSeriesOrDiagramPropertyType ePropertyType )
340         : WrappedSeriesOrDiagramProperty< OUString >( C2U("SymbolBitmapURL")
341             , uno::makeAny( OUString() ), spChart2ModelContact, ePropertyType  )
342 {
343 }
344 
345 WrappedSymbolBitmapURLProperty::~WrappedSymbolBitmapURLProperty()
346 {
347 }
348 
349 OUString WrappedSymbolBitmapURLProperty::getValueFromSeries( const Reference< beans::XPropertySet >& xSeriesPropertySet ) const
350 {
351     OUString aRet;
352     m_aDefaultValue >>= aRet;
353     chart2::Symbol aSymbol;
354     if( xSeriesPropertySet.is() && ( xSeriesPropertySet->getPropertyValue(C2U("Symbol")) >>= aSymbol )
355         && aSymbol.Graphic.is())
356     {
357         GraphicObject aGrObj( Graphic( aSymbol.Graphic ));
358         aRet = OUString( RTL_CONSTASCII_USTRINGPARAM( UNO_NAME_GRAPHOBJ_URLPREFIX ));
359         aRet += OUString::createFromAscii( aGrObj.GetUniqueID().GetBuffer());
360     }
361     return aRet;
362 }
363 
364 void WrappedSymbolBitmapURLProperty::setValueToSeries(
365     const Reference< beans::XPropertySet >& xSeriesPropertySet,
366     OUString aNewGraphicURL ) const
367 {
368     if(!xSeriesPropertySet.is())
369         return;
370 
371     chart2::Symbol aSymbol;
372     if( xSeriesPropertySet->getPropertyValue(C2U("Symbol")) >>= aSymbol )
373     {
374         bool bMatchesPrefix =
375             aNewGraphicURL.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( UNO_NAME_GRAPHOBJ_URLPREFIX ));
376         if( bMatchesPrefix )
377         {
378             GraphicObject aGrObj = GraphicObject(
379                 ByteString( U2C( aNewGraphicURL.copy( sizeof( UNO_NAME_GRAPHOBJ_URLPREFIX ) - 1 ))));
380             aSymbol.Graphic.set( aGrObj.GetGraphic().GetXGraphic());
381             xSeriesPropertySet->setPropertyValue( C2U("Symbol"), uno::makeAny( aSymbol ) );
382         }
383         else
384         {
385             try
386             {
387                 // @todo: get factory from some context?
388                 Reference< lang::XMultiServiceFactory > xFact( comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
389                 Reference< graphic::XGraphicProvider > xGraphProv(
390                     xFact->createInstance( C2U("com.sun.star.graphic.GraphicProvider")), uno::UNO_QUERY_THROW );
391                 Sequence< beans::PropertyValue > aArgs(1);
392                 aArgs[0] = beans::PropertyValue(
393                     C2U("URL"), -1, uno::makeAny( aNewGraphicURL ),
394                     beans::PropertyState_DIRECT_VALUE );
395                 aSymbol.Graphic.set( xGraphProv->queryGraphic( aArgs ));
396                 OSL_ENSURE( aSymbol.Graphic.is(), "Invalid URL for Symbol Bitmap" );
397                 xSeriesPropertySet->setPropertyValue( C2U("Symbol"), uno::makeAny( aSymbol ) );
398             }
399             catch( const uno::Exception & ex )
400             {
401                 ASSERT_EXCEPTION( ex );
402             }
403         }
404     }
405 }
406 
407 
408 //-----------------------------------------------------------------------------
409 //-----------------------------------------------------------------------------
410 //-----------------------------------------------------------------------------
411 
412 namespace
413 {
414 
415 void lcl_correctSymbolSizeForBitmaps( chart2::Symbol& rSymbol )
416 {
417     if( rSymbol.Style != chart2::SymbolStyle_GRAPHIC )
418         return;
419     if( rSymbol.Size.Width != -1 )
420         return;
421     if( rSymbol.Size.Height != -1 )
422         return;
423 
424     //find a good automatic size
425     try
426     {
427         const awt::Size aDefaultSize(250,250);
428         awt::Size aSize = aDefaultSize;
429         uno::Reference< beans::XPropertySet > xProp( rSymbol.Graphic, uno::UNO_QUERY );
430         if( xProp.is() )
431         {
432             bool bFoundSize = false;
433             try
434             {
435                 if( (xProp->getPropertyValue( C2U( "Size100thMM" ) ) >>= aSize) )
436                 {
437                     if( aSize.Width == 0 && aSize.Height == 0 )
438                         aSize = aDefaultSize;
439                     else
440                         bFoundSize = true;
441                 }
442             }
443             catch( uno::Exception& e )
444             {
445                 ASSERT_EXCEPTION( e );
446             }
447 
448             if(!bFoundSize)
449             {
450                 awt::Size aAWTPixelSize(10,10);
451                 if(  (xProp->getPropertyValue( C2U( "SizePixel" ) ) >>= aAWTPixelSize) )
452                 {
453                     Size aPixelSize(aAWTPixelSize.Width,aAWTPixelSize.Height);
454                     Size aNewSize = ( OutputDevice::LogicToLogic( aPixelSize, MAP_PIXEL, MAP_100TH_MM ));
455                     aSize = awt::Size( aNewSize.Width(), aNewSize.Height() );
456 
457                     if( aSize.Width == 0 && aSize.Height == 0 )
458                         aSize = aDefaultSize;
459                 }
460             }
461         }
462         rSymbol.Size = aSize;
463     }
464     catch( uno::Exception& e )
465     {
466         ASSERT_EXCEPTION( e );
467     }
468 }
469 
470 }//end anonymous namespace
471 
472 WrappedSymbolSizeProperty::WrappedSymbolSizeProperty(
473     ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact,
474     tSeriesOrDiagramPropertyType ePropertyType )
475         : WrappedSeriesOrDiagramProperty< awt::Size >( C2U("SymbolSize")
476             , uno::makeAny( awt::Size(250,250) ), spChart2ModelContact, ePropertyType  )
477 {
478 }
479 
480 WrappedSymbolSizeProperty::~WrappedSymbolSizeProperty()
481 {
482 }
483 
484 awt::Size WrappedSymbolSizeProperty::getValueFromSeries( const Reference< beans::XPropertySet >& xSeriesPropertySet ) const
485 {
486     awt::Size aRet;
487     m_aDefaultValue >>= aRet;
488     chart2::Symbol aSymbol;
489     if( xSeriesPropertySet.is() && ( xSeriesPropertySet->getPropertyValue(C2U("Symbol")) >>= aSymbol ))
490         aRet = aSymbol.Size;
491     return aRet;
492 }
493 
494 void WrappedSymbolSizeProperty::setValueToSeries(
495     const Reference< beans::XPropertySet >& xSeriesPropertySet,
496     awt::Size aNewSize ) const
497 {
498     if(!xSeriesPropertySet.is())
499         return;
500 
501     chart2::Symbol aSymbol;
502     if( xSeriesPropertySet->getPropertyValue(C2U("Symbol")) >>= aSymbol )
503     {
504         aSymbol.Size = aNewSize;
505         lcl_correctSymbolSizeForBitmaps(aSymbol);
506         xSeriesPropertySet->setPropertyValue( C2U("Symbol"), uno::makeAny( aSymbol ) );
507     }
508 }
509 
510 beans::PropertyState WrappedSymbolSizeProperty::getPropertyState( const Reference< beans::XPropertyState >& xInnerPropertyState ) const
511                         throw (beans::UnknownPropertyException, uno::RuntimeException)
512 {
513     //only export symbol size if necessary
514     if( m_ePropertyType == DIAGRAM )
515         return beans::PropertyState_DEFAULT_VALUE;
516 
517     try
518     {
519         chart2::Symbol aSymbol;
520         Reference< beans::XPropertySet > xSeriesPropertySet( xInnerPropertyState, uno::UNO_QUERY );
521         if( xSeriesPropertySet.is() && ( xSeriesPropertySet->getPropertyValue(C2U("Symbol")) >>= aSymbol ))
522         {
523             if(  chart2::SymbolStyle_NONE != aSymbol.Style )
524                 return beans::PropertyState_DIRECT_VALUE;
525         }
526     }
527     catch( const uno::Exception & ex )
528     {
529         ASSERT_EXCEPTION( ex );
530     }
531     return beans::PropertyState_DEFAULT_VALUE;
532 }
533 
534 //-----------------------------------------------------------------------------
535 //-----------------------------------------------------------------------------
536 //-----------------------------------------------------------------------------
537 
538 WrappedSymbolAndLinesProperty::WrappedSymbolAndLinesProperty(
539     ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact,
540     tSeriesOrDiagramPropertyType ePropertyType )
541         : WrappedSeriesOrDiagramProperty< sal_Bool >( C2U("Lines")
542             , uno::makeAny( sal_True ), spChart2ModelContact, ePropertyType  )
543 {
544 }
545 
546 WrappedSymbolAndLinesProperty::~WrappedSymbolAndLinesProperty()
547 {
548 }
549 
550 sal_Bool WrappedSymbolAndLinesProperty::getValueFromSeries( const Reference< beans::XPropertySet >& /*xSeriesPropertySet*/ ) const
551 {
552     //do not export this property anymore, instead use a linestyle none for no lines
553     return sal_True;
554 }
555 
556 void WrappedSymbolAndLinesProperty::setValueToSeries(
557     const Reference< beans::XPropertySet >& xSeriesPropertySet,
558     sal_Bool bDrawLines ) const
559 {
560     if(!xSeriesPropertySet.is())
561         return;
562 
563     drawing::LineStyle eOldLineStyle( drawing::LineStyle_SOLID );
564     xSeriesPropertySet->getPropertyValue( C2U("LineStyle") ) >>= eOldLineStyle;
565     if( bDrawLines )
566     {
567         //#i114298# don't overwrite dashed lines with solid lines here
568         if( eOldLineStyle == drawing::LineStyle_NONE )
569             xSeriesPropertySet->setPropertyValue( C2U("LineStyle"), uno::makeAny( drawing::LineStyle_SOLID ) );
570     }
571     else
572     {
573         if( eOldLineStyle != drawing::LineStyle_NONE )
574             xSeriesPropertySet->setPropertyValue( C2U("LineStyle"), uno::makeAny( drawing::LineStyle_NONE ) );
575     }
576 }
577 
578 beans::PropertyState WrappedSymbolAndLinesProperty::getPropertyState( const Reference< beans::XPropertyState >& /*xInnerPropertyState*/ ) const
579                         throw (beans::UnknownPropertyException, uno::RuntimeException)
580 {
581     //do not export this property anymore, instead use a linestyle none for no lines
582     return beans::PropertyState_DEFAULT_VALUE;
583 }
584 
585 //-----------------------------------------------------------------------------
586 //-----------------------------------------------------------------------------
587 //-----------------------------------------------------------------------------
588 
589 } //namespace wrapper
590 } //namespace chart
591 //.............................................................................
592