1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_chart2.hxx"
26*b1cdbd2cSJim Jagielski #include "VDataSeries.hxx"
27*b1cdbd2cSJim Jagielski #include "ObjectIdentifier.hxx"
28*b1cdbd2cSJim Jagielski #include "macros.hxx"
29*b1cdbd2cSJim Jagielski #include "CommonConverters.hxx"
30*b1cdbd2cSJim Jagielski #include "LabelPositionHelper.hxx"
31*b1cdbd2cSJim Jagielski #include "ChartTypeHelper.hxx"
32*b1cdbd2cSJim Jagielski #include "ContainerHelper.hxx"
33*b1cdbd2cSJim Jagielski #include "DataSeriesHelper.hxx"
34*b1cdbd2cSJim Jagielski #include "RegressionCurveHelper.hxx"
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/MissingValueTreatment.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/Symbol.hpp>
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski //#include "CommonConverters.hxx"
40*b1cdbd2cSJim Jagielski #include <rtl/math.hxx>
41*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertyState.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/LineStyle.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/TextVerticalAdjust.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/TextHorizontalAdjust.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/text/WritingMode.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XDataSource.hpp>
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski //.............................................................................
51*b1cdbd2cSJim Jagielski namespace chart
52*b1cdbd2cSJim Jagielski {
53*b1cdbd2cSJim Jagielski //.............................................................................
54*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
55*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::chart2;
56*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference;
57*b1cdbd2cSJim Jagielski 
init(const uno::Reference<data::XDataSequence> & xModel)58*b1cdbd2cSJim Jagielski void VDataSequence::init( const uno::Reference< data::XDataSequence >& xModel )
59*b1cdbd2cSJim Jagielski {
60*b1cdbd2cSJim Jagielski     Model = xModel;
61*b1cdbd2cSJim Jagielski     Doubles = DataSequenceToDoubleSequence( xModel );
62*b1cdbd2cSJim Jagielski }
63*b1cdbd2cSJim Jagielski 
is() const64*b1cdbd2cSJim Jagielski bool VDataSequence::is() const
65*b1cdbd2cSJim Jagielski {
66*b1cdbd2cSJim Jagielski     return Model.is();
67*b1cdbd2cSJim Jagielski }
clear()68*b1cdbd2cSJim Jagielski void VDataSequence::clear()
69*b1cdbd2cSJim Jagielski {
70*b1cdbd2cSJim Jagielski     Model = NULL;
71*b1cdbd2cSJim Jagielski     Doubles.realloc(0);
72*b1cdbd2cSJim Jagielski }
73*b1cdbd2cSJim Jagielski 
getValue(sal_Int32 index) const74*b1cdbd2cSJim Jagielski double VDataSequence::getValue( sal_Int32 index ) const
75*b1cdbd2cSJim Jagielski {
76*b1cdbd2cSJim Jagielski     if( 0<=index && index<Doubles.getLength() )
77*b1cdbd2cSJim Jagielski         return Doubles[index];
78*b1cdbd2cSJim Jagielski     else
79*b1cdbd2cSJim Jagielski     {
80*b1cdbd2cSJim Jagielski         double fNan;
81*b1cdbd2cSJim Jagielski         ::rtl::math::setNan( & fNan );
82*b1cdbd2cSJim Jagielski         return fNan;
83*b1cdbd2cSJim Jagielski     }
84*b1cdbd2cSJim Jagielski }
85*b1cdbd2cSJim Jagielski 
detectNumberFormatKey(sal_Int32 index) const86*b1cdbd2cSJim Jagielski sal_Int32 VDataSequence::detectNumberFormatKey( sal_Int32 index ) const
87*b1cdbd2cSJim Jagielski {
88*b1cdbd2cSJim Jagielski     sal_Int32 nNumberFormatKey = -1;
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski     // -1 is allowed and means a key for the whole sequence
91*b1cdbd2cSJim Jagielski     if( -1<=index && index<Doubles.getLength() &&
92*b1cdbd2cSJim Jagielski         Model.is())
93*b1cdbd2cSJim Jagielski     {
94*b1cdbd2cSJim Jagielski         nNumberFormatKey = Model->getNumberFormatKeyByIndex( index );
95*b1cdbd2cSJim Jagielski     }
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski     return nNumberFormatKey;
98*b1cdbd2cSJim Jagielski }
99*b1cdbd2cSJim Jagielski 
getLength() const100*b1cdbd2cSJim Jagielski sal_Int32 VDataSequence::getLength() const
101*b1cdbd2cSJim Jagielski {
102*b1cdbd2cSJim Jagielski     return Doubles.getLength();
103*b1cdbd2cSJim Jagielski }
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski namespace
106*b1cdbd2cSJim Jagielski {
107*b1cdbd2cSJim Jagielski struct lcl_LessXOfPoint
108*b1cdbd2cSJim Jagielski {
operator ()chart::__anon1feaefcc0111::lcl_LessXOfPoint109*b1cdbd2cSJim Jagielski     inline bool operator() ( const std::vector< double >& first,
110*b1cdbd2cSJim Jagielski                              const std::vector< double >& second )
111*b1cdbd2cSJim Jagielski     {
112*b1cdbd2cSJim Jagielski         if( first.size() > 0 && second.size() > 0 )
113*b1cdbd2cSJim Jagielski         {
114*b1cdbd2cSJim Jagielski             return first[0]<second[0];
115*b1cdbd2cSJim Jagielski         }
116*b1cdbd2cSJim Jagielski         return false;
117*b1cdbd2cSJim Jagielski     }
118*b1cdbd2cSJim Jagielski };
119*b1cdbd2cSJim Jagielski 
lcl_clearIfNoValuesButTextIsContained(VDataSequence & rData,const uno::Reference<data::XDataSequence> & xDataSequence)120*b1cdbd2cSJim Jagielski void lcl_clearIfNoValuesButTextIsContained( VDataSequence& rData, const uno::Reference<data::XDataSequence>& xDataSequence )
121*b1cdbd2cSJim Jagielski {
122*b1cdbd2cSJim Jagielski     //#i71686#, #i101968#, #i102428#
123*b1cdbd2cSJim Jagielski     sal_Int32 nCount = rData.Doubles.getLength();
124*b1cdbd2cSJim Jagielski     for( sal_Int32 i = 0; i < nCount; ++i )
125*b1cdbd2cSJim Jagielski     {
126*b1cdbd2cSJim Jagielski         if( !::rtl::math::isNan( rData.Doubles[i] ) )
127*b1cdbd2cSJim Jagielski             return;
128*b1cdbd2cSJim Jagielski     }
129*b1cdbd2cSJim Jagielski     //no double value is countained
130*b1cdbd2cSJim Jagielski     //is there any text?
131*b1cdbd2cSJim Jagielski     uno::Sequence< rtl::OUString > aStrings( DataSequenceToStringSequence( xDataSequence ) );
132*b1cdbd2cSJim Jagielski     sal_Int32 nTextCount = aStrings.getLength();
133*b1cdbd2cSJim Jagielski     for( sal_Int32 j = 0; j < nTextCount; ++j )
134*b1cdbd2cSJim Jagielski     {
135*b1cdbd2cSJim Jagielski         if( aStrings[j].getLength() )
136*b1cdbd2cSJim Jagielski         {
137*b1cdbd2cSJim Jagielski             rData.clear();
138*b1cdbd2cSJim Jagielski             return;
139*b1cdbd2cSJim Jagielski         }
140*b1cdbd2cSJim Jagielski     }
141*b1cdbd2cSJim Jagielski     //no content at all
142*b1cdbd2cSJim Jagielski }
143*b1cdbd2cSJim Jagielski 
lcl_maybeReplaceNanWithZero(double & rfValue,sal_Int32 nMissingValueTreatment)144*b1cdbd2cSJim Jagielski void lcl_maybeReplaceNanWithZero( double& rfValue, sal_Int32 nMissingValueTreatment )
145*b1cdbd2cSJim Jagielski {
146*b1cdbd2cSJim Jagielski     if( nMissingValueTreatment == ::com::sun::star::chart::MissingValueTreatment::USE_ZERO
147*b1cdbd2cSJim Jagielski         && (::rtl::math::isNan(rfValue) || ::rtl::math::isInf(rfValue)) )
148*b1cdbd2cSJim Jagielski             rfValue = 0.0;
149*b1cdbd2cSJim Jagielski }
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski }
152*b1cdbd2cSJim Jagielski 
VDataSeries(const uno::Reference<XDataSeries> & xDataSeries)153*b1cdbd2cSJim Jagielski VDataSeries::VDataSeries( const uno::Reference< XDataSeries >& xDataSeries )
154*b1cdbd2cSJim Jagielski     : m_nPolygonIndex(0)
155*b1cdbd2cSJim Jagielski     , m_fLogicMinX(0.0)
156*b1cdbd2cSJim Jagielski     , m_fLogicMaxX(0.0)
157*b1cdbd2cSJim Jagielski     , m_fLogicZPos(0.0)
158*b1cdbd2cSJim Jagielski     , m_xGroupShape(NULL)
159*b1cdbd2cSJim Jagielski     , m_xLabelsGroupShape(NULL)
160*b1cdbd2cSJim Jagielski     , m_xErrorBarsGroupShape(NULL)
161*b1cdbd2cSJim Jagielski     , m_xFrontSubGroupShape(NULL)
162*b1cdbd2cSJim Jagielski     , m_xBackSubGroupShape(NULL)
163*b1cdbd2cSJim Jagielski     , m_xDataSeries(xDataSeries)
164*b1cdbd2cSJim Jagielski     , m_aDataSequences()
165*b1cdbd2cSJim Jagielski     , m_nPointCount(0)
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski     , m_aValues_X()
168*b1cdbd2cSJim Jagielski     , m_aValues_Y()
169*b1cdbd2cSJim Jagielski     , m_aValues_Z()
170*b1cdbd2cSJim Jagielski     , m_aValues_Y_Min()
171*b1cdbd2cSJim Jagielski     , m_aValues_Y_Max()
172*b1cdbd2cSJim Jagielski     , m_aValues_Y_First()
173*b1cdbd2cSJim Jagielski     , m_aValues_Y_Last()
174*b1cdbd2cSJim Jagielski     , m_aValues_Bubble_Size()
175*b1cdbd2cSJim Jagielski     , m_pValueSequenceForDataLabelNumberFormatDetection(&m_aValues_Y)
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski     , m_fYMeanValue(1.0)
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski     , m_aAttributedDataPointIndexList()
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski     , m_eStackingDirection(StackingDirection_NO_STACKING)
182*b1cdbd2cSJim Jagielski     , m_nAxisIndex(0)
183*b1cdbd2cSJim Jagielski     , m_bConnectBars(sal_False)
184*b1cdbd2cSJim Jagielski     , m_bGroupBarsPerAxis(sal_True)
185*b1cdbd2cSJim Jagielski     , m_nStartingAngle(90)
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski     , m_aSeriesParticle()
188*b1cdbd2cSJim Jagielski     , m_aCID()
189*b1cdbd2cSJim Jagielski     , m_aPointCID_Stub()
190*b1cdbd2cSJim Jagielski     , m_aLabelCID_Stub()
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski     , m_nGlobalSeriesIndex(0)
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski     , m_apLabel_Series(NULL)
195*b1cdbd2cSJim Jagielski     , m_apLabelPropNames_Series(NULL)
196*b1cdbd2cSJim Jagielski     , m_apLabelPropValues_Series(NULL)
197*b1cdbd2cSJim Jagielski     , m_apSymbolProperties_Series(NULL)
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski     , m_apLabel_AttributedPoint(NULL)
200*b1cdbd2cSJim Jagielski     , m_apLabelPropNames_AttributedPoint(NULL)
201*b1cdbd2cSJim Jagielski     , m_apLabelPropValues_AttributedPoint(NULL)
202*b1cdbd2cSJim Jagielski     , m_apSymbolProperties_AttributedPoint(NULL)
203*b1cdbd2cSJim Jagielski     , m_apSymbolProperties_InvisibleSymbolForSelection(NULL)
204*b1cdbd2cSJim Jagielski     , m_nCurrentAttributedPoint(-1)
205*b1cdbd2cSJim Jagielski     , m_nMissingValueTreatment(::com::sun::star::chart::MissingValueTreatment::LEAVE_GAP)
206*b1cdbd2cSJim Jagielski     , m_bAllowPercentValueInDataLabel(false)
207*b1cdbd2cSJim Jagielski {
208*b1cdbd2cSJim Jagielski     ::rtl::math::setNan( & m_fYMeanValue );
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski     uno::Reference<data::XDataSource> xDataSource =
211*b1cdbd2cSJim Jagielski             uno::Reference<data::XDataSource>( xDataSeries, uno::UNO_QUERY );
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski     m_aDataSequences = xDataSource->getDataSequences();
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski     for(sal_Int32 nN = m_aDataSequences.getLength();nN--;)
216*b1cdbd2cSJim Jagielski     {
217*b1cdbd2cSJim Jagielski         if(!m_aDataSequences[nN].is())
218*b1cdbd2cSJim Jagielski             continue;
219*b1cdbd2cSJim Jagielski         uno::Reference<data::XDataSequence>  xDataSequence( m_aDataSequences[nN]->getValues());
220*b1cdbd2cSJim Jagielski         uno::Reference<beans::XPropertySet> xProp(xDataSequence, uno::UNO_QUERY );
221*b1cdbd2cSJim Jagielski 	    if( xProp.is())
222*b1cdbd2cSJim Jagielski 	    {
223*b1cdbd2cSJim Jagielski 		    try
224*b1cdbd2cSJim Jagielski 		    {
225*b1cdbd2cSJim Jagielski                 uno::Any aARole = xProp->getPropertyValue( C2U( "Role" ) );
226*b1cdbd2cSJim Jagielski                 rtl::OUString aRole;
227*b1cdbd2cSJim Jagielski                 aARole >>= aRole;
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski                 if( aRole.equals(C2U("values-x")) )
230*b1cdbd2cSJim Jagielski                 {
231*b1cdbd2cSJim Jagielski                     m_aValues_X.init( xDataSequence );
232*b1cdbd2cSJim Jagielski                     lcl_clearIfNoValuesButTextIsContained( m_aValues_X, xDataSequence );
233*b1cdbd2cSJim Jagielski                 }
234*b1cdbd2cSJim Jagielski                 else if( aRole.equals(C2U("values-y")) )
235*b1cdbd2cSJim Jagielski                     m_aValues_Y.init( xDataSequence );
236*b1cdbd2cSJim Jagielski                 else if( aRole.equals(C2U("values-min")) )
237*b1cdbd2cSJim Jagielski                     m_aValues_Y_Min.init( xDataSequence );
238*b1cdbd2cSJim Jagielski                 else if( aRole.equals(C2U("values-max")) )
239*b1cdbd2cSJim Jagielski                     m_aValues_Y_Max.init( xDataSequence );
240*b1cdbd2cSJim Jagielski                 else if( aRole.equals(C2U("values-first")) )
241*b1cdbd2cSJim Jagielski                     m_aValues_Y_First.init( xDataSequence );
242*b1cdbd2cSJim Jagielski                 else if( aRole.equals(C2U("values-last")) )
243*b1cdbd2cSJim Jagielski                     m_aValues_Y_Last.init( xDataSequence );
244*b1cdbd2cSJim Jagielski                 else if( aRole.equals(C2U("values-size")) )
245*b1cdbd2cSJim Jagielski                     m_aValues_Bubble_Size.init( xDataSequence );
246*b1cdbd2cSJim Jagielski             }
247*b1cdbd2cSJim Jagielski             catch( uno::Exception& e )
248*b1cdbd2cSJim Jagielski 		    {
249*b1cdbd2cSJim Jagielski                 ASSERT_EXCEPTION( e );
250*b1cdbd2cSJim Jagielski             }
251*b1cdbd2cSJim Jagielski         }
252*b1cdbd2cSJim Jagielski     }
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski     //determine the point count
255*b1cdbd2cSJim Jagielski     m_nPointCount = m_aValues_Y.getLength();
256*b1cdbd2cSJim Jagielski     {
257*b1cdbd2cSJim Jagielski         if( m_nPointCount < m_aValues_Bubble_Size.getLength() )
258*b1cdbd2cSJim Jagielski             m_nPointCount = m_aValues_Bubble_Size.getLength();
259*b1cdbd2cSJim Jagielski         if( m_nPointCount < m_aValues_Y_Min.getLength() )
260*b1cdbd2cSJim Jagielski             m_nPointCount = m_aValues_Y_Min.getLength();
261*b1cdbd2cSJim Jagielski         if( m_nPointCount < m_aValues_Y_Max.getLength() )
262*b1cdbd2cSJim Jagielski             m_nPointCount = m_aValues_Y_Max.getLength();
263*b1cdbd2cSJim Jagielski         if( m_nPointCount < m_aValues_Y_First.getLength() )
264*b1cdbd2cSJim Jagielski             m_nPointCount = m_aValues_Y_First.getLength();
265*b1cdbd2cSJim Jagielski         if( m_nPointCount < m_aValues_Y_Last.getLength() )
266*b1cdbd2cSJim Jagielski             m_nPointCount = m_aValues_Y_Last.getLength();
267*b1cdbd2cSJim Jagielski     }
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski     uno::Reference<beans::XPropertySet> xProp(xDataSeries, uno::UNO_QUERY );
270*b1cdbd2cSJim Jagielski     if( xProp.is())
271*b1cdbd2cSJim Jagielski 	{
272*b1cdbd2cSJim Jagielski 		try
273*b1cdbd2cSJim Jagielski 		{
274*b1cdbd2cSJim Jagielski             //get AttributedDataPoints
275*b1cdbd2cSJim Jagielski             xProp->getPropertyValue( C2U( "AttributedDataPoints" ) ) >>= m_aAttributedDataPointIndexList;
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski             xProp->getPropertyValue( C2U( "StackingDirection" ) ) >>= m_eStackingDirection;
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski             xProp->getPropertyValue( C2U( "AttachedAxisIndex" ) ) >>= m_nAxisIndex;
280*b1cdbd2cSJim Jagielski             if(m_nAxisIndex<0)
281*b1cdbd2cSJim Jagielski                 m_nAxisIndex=0;
282*b1cdbd2cSJim Jagielski         }
283*b1cdbd2cSJim Jagielski         catch( uno::Exception& e )
284*b1cdbd2cSJim Jagielski 		{
285*b1cdbd2cSJim Jagielski             ASSERT_EXCEPTION( e );
286*b1cdbd2cSJim Jagielski         }
287*b1cdbd2cSJim Jagielski     }
288*b1cdbd2cSJim Jagielski }
289*b1cdbd2cSJim Jagielski 
~VDataSeries()290*b1cdbd2cSJim Jagielski VDataSeries::~VDataSeries()
291*b1cdbd2cSJim Jagielski {
292*b1cdbd2cSJim Jagielski }
293*b1cdbd2cSJim Jagielski 
doSortByXValues()294*b1cdbd2cSJim Jagielski void VDataSeries::doSortByXValues()
295*b1cdbd2cSJim Jagielski {
296*b1cdbd2cSJim Jagielski     if( m_aValues_X.is() && m_aValues_X.Doubles.getLength() )
297*b1cdbd2cSJim Jagielski     {
298*b1cdbd2cSJim Jagielski         //prepare a vector vor sorting
299*b1cdbd2cSJim Jagielski         std::vector< ::std::vector< double > > aTmp;//outer vector are points, inner vector are the different values of athe point
300*b1cdbd2cSJim Jagielski         double fNan;
301*b1cdbd2cSJim Jagielski         ::rtl::math::setNan( & fNan );
302*b1cdbd2cSJim Jagielski         sal_Int32 nPointIndex = 0;
303*b1cdbd2cSJim Jagielski         for( nPointIndex=0; nPointIndex < m_nPointCount; nPointIndex++ )
304*b1cdbd2cSJim Jagielski         {
305*b1cdbd2cSJim Jagielski             std::vector< double > aSinglePoint;
306*b1cdbd2cSJim Jagielski             aSinglePoint.push_back( (nPointIndex < m_aValues_X.Doubles.getLength()) ? m_aValues_X.Doubles[nPointIndex] : fNan );
307*b1cdbd2cSJim Jagielski             aSinglePoint.push_back( (nPointIndex < m_aValues_Y.Doubles.getLength()) ? m_aValues_Y.Doubles[nPointIndex] : fNan );
308*b1cdbd2cSJim Jagielski             aTmp.push_back( aSinglePoint );
309*b1cdbd2cSJim Jagielski         }
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski         //do sort
312*b1cdbd2cSJim Jagielski         std::stable_sort( aTmp.begin(), aTmp.end(), lcl_LessXOfPoint() );
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski         //fill the sorted points back to the mambers
315*b1cdbd2cSJim Jagielski         m_aValues_X.Doubles.realloc( m_nPointCount );
316*b1cdbd2cSJim Jagielski         m_aValues_Y.Doubles.realloc( m_nPointCount );
317*b1cdbd2cSJim Jagielski 
318*b1cdbd2cSJim Jagielski         for( nPointIndex=0; nPointIndex < m_nPointCount; nPointIndex++ )
319*b1cdbd2cSJim Jagielski         {
320*b1cdbd2cSJim Jagielski             m_aValues_X.Doubles[nPointIndex]=aTmp[nPointIndex][0];
321*b1cdbd2cSJim Jagielski             m_aValues_Y.Doubles[nPointIndex]=aTmp[nPointIndex][1];
322*b1cdbd2cSJim Jagielski         }
323*b1cdbd2cSJim Jagielski     }
324*b1cdbd2cSJim Jagielski }
325*b1cdbd2cSJim Jagielski 
getModel() const326*b1cdbd2cSJim Jagielski uno::Reference< XDataSeries > VDataSeries::getModel() const
327*b1cdbd2cSJim Jagielski {
328*b1cdbd2cSJim Jagielski     return m_xDataSeries;
329*b1cdbd2cSJim Jagielski }
330*b1cdbd2cSJim Jagielski 
releaseShapes()331*b1cdbd2cSJim Jagielski void VDataSeries::releaseShapes()
332*b1cdbd2cSJim Jagielski {
333*b1cdbd2cSJim Jagielski     m_xGroupShape.set(0);
334*b1cdbd2cSJim Jagielski     m_xLabelsGroupShape.set(0);
335*b1cdbd2cSJim Jagielski     m_xErrorBarsGroupShape.set(0);
336*b1cdbd2cSJim Jagielski     m_xFrontSubGroupShape.set(0);
337*b1cdbd2cSJim Jagielski     m_xBackSubGroupShape.set(0);
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski     m_aPolyPolygonShape3D.SequenceX.realloc(0);
340*b1cdbd2cSJim Jagielski     m_aPolyPolygonShape3D.SequenceY.realloc(0);
341*b1cdbd2cSJim Jagielski     m_aPolyPolygonShape3D.SequenceZ.realloc(0);
342*b1cdbd2cSJim Jagielski     m_nPolygonIndex = 0;
343*b1cdbd2cSJim Jagielski }
344*b1cdbd2cSJim Jagielski 
setCategoryXAxis()345*b1cdbd2cSJim Jagielski void VDataSeries::setCategoryXAxis()
346*b1cdbd2cSJim Jagielski {
347*b1cdbd2cSJim Jagielski     m_aValues_X.clear();
348*b1cdbd2cSJim Jagielski     m_bAllowPercentValueInDataLabel = true;
349*b1cdbd2cSJim Jagielski }
350*b1cdbd2cSJim Jagielski 
setXValues(const Reference<chart2::data::XDataSequence> & xValues)351*b1cdbd2cSJim Jagielski void VDataSeries::setXValues( const Reference< chart2::data::XDataSequence >& xValues )
352*b1cdbd2cSJim Jagielski {
353*b1cdbd2cSJim Jagielski     m_aValues_X.clear();
354*b1cdbd2cSJim Jagielski     m_aValues_X.init( xValues );
355*b1cdbd2cSJim Jagielski     m_bAllowPercentValueInDataLabel = true;
356*b1cdbd2cSJim Jagielski }
357*b1cdbd2cSJim Jagielski 
setXValuesIfNone(const Reference<chart2::data::XDataSequence> & xValues)358*b1cdbd2cSJim Jagielski void VDataSeries::setXValuesIfNone( const Reference< chart2::data::XDataSequence >& xValues )
359*b1cdbd2cSJim Jagielski {
360*b1cdbd2cSJim Jagielski     if( m_aValues_X.is() )
361*b1cdbd2cSJim Jagielski         return;
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski     m_aValues_X.init( xValues );
364*b1cdbd2cSJim Jagielski     lcl_clearIfNoValuesButTextIsContained( m_aValues_X, xValues );
365*b1cdbd2cSJim Jagielski }
366*b1cdbd2cSJim Jagielski 
setGlobalSeriesIndex(sal_Int32 nGlobalSeriesIndex)367*b1cdbd2cSJim Jagielski void VDataSeries::setGlobalSeriesIndex( sal_Int32 nGlobalSeriesIndex )
368*b1cdbd2cSJim Jagielski {
369*b1cdbd2cSJim Jagielski     m_nGlobalSeriesIndex = nGlobalSeriesIndex;
370*b1cdbd2cSJim Jagielski }
371*b1cdbd2cSJim Jagielski 
setParticle(const rtl::OUString & rSeriesParticle)372*b1cdbd2cSJim Jagielski void VDataSeries::setParticle( const rtl::OUString& rSeriesParticle )
373*b1cdbd2cSJim Jagielski {
374*b1cdbd2cSJim Jagielski     m_aSeriesParticle = rSeriesParticle;
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski     //get CID
377*b1cdbd2cSJim Jagielski     m_aCID = ObjectIdentifier::createClassifiedIdentifierForParticle( m_aSeriesParticle );
378*b1cdbd2cSJim Jagielski     m_aPointCID_Stub = ObjectIdentifier::createSeriesSubObjectStub( OBJECTTYPE_DATA_POINT, m_aSeriesParticle );
379*b1cdbd2cSJim Jagielski 
380*b1cdbd2cSJim Jagielski     m_aLabelCID_Stub = ObjectIdentifier::createClassifiedIdentifierWithParent(
381*b1cdbd2cSJim Jagielski                         OBJECTTYPE_DATA_LABEL, ::rtl::OUString(), getLabelsCID() );
382*b1cdbd2cSJim Jagielski }
getSeriesParticle() const383*b1cdbd2cSJim Jagielski rtl::OUString VDataSeries::getSeriesParticle() const
384*b1cdbd2cSJim Jagielski {
385*b1cdbd2cSJim Jagielski     return m_aSeriesParticle;
386*b1cdbd2cSJim Jagielski }
getCID() const387*b1cdbd2cSJim Jagielski rtl::OUString VDataSeries::getCID() const
388*b1cdbd2cSJim Jagielski {
389*b1cdbd2cSJim Jagielski     return m_aCID;
390*b1cdbd2cSJim Jagielski }
getPointCID_Stub() const391*b1cdbd2cSJim Jagielski rtl::OUString VDataSeries::getPointCID_Stub() const
392*b1cdbd2cSJim Jagielski {
393*b1cdbd2cSJim Jagielski     return m_aPointCID_Stub;
394*b1cdbd2cSJim Jagielski }
getErrorBarsCID() const395*b1cdbd2cSJim Jagielski rtl::OUString VDataSeries::getErrorBarsCID() const
396*b1cdbd2cSJim Jagielski {
397*b1cdbd2cSJim Jagielski     rtl::OUString aChildParticle( ObjectIdentifier::getStringForType( OBJECTTYPE_DATA_ERRORS ) );
398*b1cdbd2cSJim Jagielski     aChildParticle+=(C2U("="));
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski     return ObjectIdentifier::createClassifiedIdentifierForParticles(
401*b1cdbd2cSJim Jagielski             m_aSeriesParticle, aChildParticle );
402*b1cdbd2cSJim Jagielski }
getLabelsCID() const403*b1cdbd2cSJim Jagielski rtl::OUString VDataSeries::getLabelsCID() const
404*b1cdbd2cSJim Jagielski {
405*b1cdbd2cSJim Jagielski     rtl::OUString aChildParticle( ObjectIdentifier::getStringForType( OBJECTTYPE_DATA_LABELS ) );
406*b1cdbd2cSJim Jagielski     aChildParticle+=(C2U("="));
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski     return ObjectIdentifier::createClassifiedIdentifierForParticles(
409*b1cdbd2cSJim Jagielski             m_aSeriesParticle, aChildParticle );
410*b1cdbd2cSJim Jagielski }
getLabelCID_Stub() const411*b1cdbd2cSJim Jagielski rtl::OUString VDataSeries::getLabelCID_Stub() const
412*b1cdbd2cSJim Jagielski {
413*b1cdbd2cSJim Jagielski     return m_aLabelCID_Stub;
414*b1cdbd2cSJim Jagielski }
getDataCurveCID(sal_Int32 nCurveIndex,bool bAverageLine) const415*b1cdbd2cSJim Jagielski rtl::OUString VDataSeries::getDataCurveCID( sal_Int32 nCurveIndex, bool bAverageLine ) const
416*b1cdbd2cSJim Jagielski {
417*b1cdbd2cSJim Jagielski     rtl::OUString aRet;
418*b1cdbd2cSJim Jagielski     aRet = ObjectIdentifier::createDataCurveCID( m_aSeriesParticle, nCurveIndex, bAverageLine );
419*b1cdbd2cSJim Jagielski     return aRet;
420*b1cdbd2cSJim Jagielski }
421*b1cdbd2cSJim Jagielski 
getDataCurveEquationCID(sal_Int32 nCurveIndex) const422*b1cdbd2cSJim Jagielski rtl::OUString VDataSeries::getDataCurveEquationCID( sal_Int32 nCurveIndex ) const
423*b1cdbd2cSJim Jagielski {
424*b1cdbd2cSJim Jagielski     rtl::OUString aRet;
425*b1cdbd2cSJim Jagielski     aRet = ObjectIdentifier::createDataCurveEquationCID( m_aSeriesParticle, nCurveIndex );
426*b1cdbd2cSJim Jagielski     return aRet;
427*b1cdbd2cSJim Jagielski }
setPageReferenceSize(const awt::Size & rPageRefSize)428*b1cdbd2cSJim Jagielski void VDataSeries::setPageReferenceSize( const awt::Size & rPageRefSize )
429*b1cdbd2cSJim Jagielski {
430*b1cdbd2cSJim Jagielski     m_aReferenceSize = rPageRefSize;
431*b1cdbd2cSJim Jagielski }
432*b1cdbd2cSJim Jagielski 
getStackingDirection() const433*b1cdbd2cSJim Jagielski StackingDirection VDataSeries::getStackingDirection() const
434*b1cdbd2cSJim Jagielski {
435*b1cdbd2cSJim Jagielski     return m_eStackingDirection;
436*b1cdbd2cSJim Jagielski }
getAttachedAxisIndex() const437*b1cdbd2cSJim Jagielski sal_Int32 VDataSeries::getAttachedAxisIndex() const
438*b1cdbd2cSJim Jagielski {
439*b1cdbd2cSJim Jagielski     return m_nAxisIndex;
440*b1cdbd2cSJim Jagielski }
setConnectBars(sal_Bool bConnectBars)441*b1cdbd2cSJim Jagielski void VDataSeries::setConnectBars( sal_Bool bConnectBars )
442*b1cdbd2cSJim Jagielski {
443*b1cdbd2cSJim Jagielski     m_bConnectBars = bConnectBars;
444*b1cdbd2cSJim Jagielski }
getConnectBars() const445*b1cdbd2cSJim Jagielski sal_Bool VDataSeries::getConnectBars() const
446*b1cdbd2cSJim Jagielski {
447*b1cdbd2cSJim Jagielski     return m_bConnectBars;
448*b1cdbd2cSJim Jagielski }
setGroupBarsPerAxis(sal_Bool bGroupBarsPerAxis)449*b1cdbd2cSJim Jagielski void VDataSeries::setGroupBarsPerAxis( sal_Bool bGroupBarsPerAxis )
450*b1cdbd2cSJim Jagielski {
451*b1cdbd2cSJim Jagielski     m_bGroupBarsPerAxis = bGroupBarsPerAxis;
452*b1cdbd2cSJim Jagielski }
getGroupBarsPerAxis() const453*b1cdbd2cSJim Jagielski sal_Bool VDataSeries::getGroupBarsPerAxis() const
454*b1cdbd2cSJim Jagielski {
455*b1cdbd2cSJim Jagielski     return m_bGroupBarsPerAxis;
456*b1cdbd2cSJim Jagielski }
457*b1cdbd2cSJim Jagielski 
setStartingAngle(sal_Int32 nStartingAngle)458*b1cdbd2cSJim Jagielski void VDataSeries::setStartingAngle( sal_Int32 nStartingAngle )
459*b1cdbd2cSJim Jagielski {
460*b1cdbd2cSJim Jagielski     m_nStartingAngle = nStartingAngle;
461*b1cdbd2cSJim Jagielski }
getStartingAngle() const462*b1cdbd2cSJim Jagielski sal_Int32 VDataSeries::getStartingAngle() const
463*b1cdbd2cSJim Jagielski {
464*b1cdbd2cSJim Jagielski     return m_nStartingAngle;
465*b1cdbd2cSJim Jagielski }
466*b1cdbd2cSJim Jagielski 
setAttachedAxisIndex(sal_Int32 nAttachedAxisIndex)467*b1cdbd2cSJim Jagielski void VDataSeries::setAttachedAxisIndex( sal_Int32 nAttachedAxisIndex )
468*b1cdbd2cSJim Jagielski {
469*b1cdbd2cSJim Jagielski     if( nAttachedAxisIndex < 0 )
470*b1cdbd2cSJim Jagielski         nAttachedAxisIndex = 0;
471*b1cdbd2cSJim Jagielski     m_nAxisIndex = nAttachedAxisIndex;
472*b1cdbd2cSJim Jagielski }
473*b1cdbd2cSJim Jagielski 
getTotalPointCount() const474*b1cdbd2cSJim Jagielski sal_Int32 VDataSeries::getTotalPointCount() const
475*b1cdbd2cSJim Jagielski {
476*b1cdbd2cSJim Jagielski     return m_nPointCount;
477*b1cdbd2cSJim Jagielski }
478*b1cdbd2cSJim Jagielski 
getXValue(sal_Int32 index) const479*b1cdbd2cSJim Jagielski double VDataSeries::getXValue( sal_Int32 index ) const
480*b1cdbd2cSJim Jagielski {
481*b1cdbd2cSJim Jagielski     double fRet = 0.0;
482*b1cdbd2cSJim Jagielski     if(m_aValues_X.is())
483*b1cdbd2cSJim Jagielski     {
484*b1cdbd2cSJim Jagielski         if( 0<=index && index<m_aValues_X.getLength() )
485*b1cdbd2cSJim Jagielski             fRet = m_aValues_X.Doubles[index];
486*b1cdbd2cSJim Jagielski         else
487*b1cdbd2cSJim Jagielski             ::rtl::math::setNan( &fRet );
488*b1cdbd2cSJim Jagielski     }
489*b1cdbd2cSJim Jagielski     else
490*b1cdbd2cSJim Jagielski     {
491*b1cdbd2cSJim Jagielski         // #i70133# always return correct X position - needed for short data series
492*b1cdbd2cSJim Jagielski         if( 0<=index /*&& index < m_nPointCount*/ )
493*b1cdbd2cSJim Jagielski             fRet = index+1;//first category (index 0) matches with real number 1.0
494*b1cdbd2cSJim Jagielski         else
495*b1cdbd2cSJim Jagielski             ::rtl::math::setNan( &fRet );
496*b1cdbd2cSJim Jagielski     }
497*b1cdbd2cSJim Jagielski     lcl_maybeReplaceNanWithZero( fRet, getMissingValueTreatment() );
498*b1cdbd2cSJim Jagielski     return fRet;
499*b1cdbd2cSJim Jagielski }
500*b1cdbd2cSJim Jagielski 
getYValue(sal_Int32 index) const501*b1cdbd2cSJim Jagielski double VDataSeries::getYValue( sal_Int32 index ) const
502*b1cdbd2cSJim Jagielski {
503*b1cdbd2cSJim Jagielski     double fRet = 0.0;
504*b1cdbd2cSJim Jagielski     if(m_aValues_Y.is())
505*b1cdbd2cSJim Jagielski     {
506*b1cdbd2cSJim Jagielski         if( 0<=index && index<m_aValues_Y.getLength() )
507*b1cdbd2cSJim Jagielski             fRet = m_aValues_Y.Doubles[index];
508*b1cdbd2cSJim Jagielski         else
509*b1cdbd2cSJim Jagielski             ::rtl::math::setNan( &fRet );
510*b1cdbd2cSJim Jagielski     }
511*b1cdbd2cSJim Jagielski     else
512*b1cdbd2cSJim Jagielski     {
513*b1cdbd2cSJim Jagielski         // #i70133# always return correct X position - needed for short data series
514*b1cdbd2cSJim Jagielski         if( 0<=index /*&& index < m_nPointCount*/ )
515*b1cdbd2cSJim Jagielski             fRet = index+1;//first category (index 0) matches with real number 1.0
516*b1cdbd2cSJim Jagielski         else
517*b1cdbd2cSJim Jagielski             ::rtl::math::setNan( &fRet );
518*b1cdbd2cSJim Jagielski     }
519*b1cdbd2cSJim Jagielski     lcl_maybeReplaceNanWithZero( fRet, getMissingValueTreatment() );
520*b1cdbd2cSJim Jagielski     return fRet;
521*b1cdbd2cSJim Jagielski }
522*b1cdbd2cSJim Jagielski 
getY_Min(sal_Int32 index) const523*b1cdbd2cSJim Jagielski double VDataSeries::getY_Min( sal_Int32 index ) const
524*b1cdbd2cSJim Jagielski {
525*b1cdbd2cSJim Jagielski     return m_aValues_Y_Min.getValue( index );
526*b1cdbd2cSJim Jagielski }
getY_Max(sal_Int32 index) const527*b1cdbd2cSJim Jagielski double VDataSeries::getY_Max( sal_Int32 index ) const
528*b1cdbd2cSJim Jagielski {
529*b1cdbd2cSJim Jagielski     return m_aValues_Y_Max.getValue( index );
530*b1cdbd2cSJim Jagielski }
getY_First(sal_Int32 index) const531*b1cdbd2cSJim Jagielski double VDataSeries::getY_First( sal_Int32 index ) const
532*b1cdbd2cSJim Jagielski {
533*b1cdbd2cSJim Jagielski     return m_aValues_Y_First.getValue( index );
534*b1cdbd2cSJim Jagielski }
getY_Last(sal_Int32 index) const535*b1cdbd2cSJim Jagielski double VDataSeries::getY_Last( sal_Int32 index ) const
536*b1cdbd2cSJim Jagielski {
537*b1cdbd2cSJim Jagielski     return m_aValues_Y_Last.getValue( index );
538*b1cdbd2cSJim Jagielski }
getBubble_Size(sal_Int32 index) const539*b1cdbd2cSJim Jagielski double VDataSeries::getBubble_Size( sal_Int32 index ) const
540*b1cdbd2cSJim Jagielski {
541*b1cdbd2cSJim Jagielski     return m_aValues_Bubble_Size.getValue( index );
542*b1cdbd2cSJim Jagielski }
543*b1cdbd2cSJim Jagielski 
hasExplicitNumberFormat(sal_Int32 nPointIndex,bool bForPercentage) const544*b1cdbd2cSJim Jagielski bool VDataSeries::hasExplicitNumberFormat( sal_Int32 nPointIndex, bool bForPercentage ) const
545*b1cdbd2cSJim Jagielski {
546*b1cdbd2cSJim Jagielski     rtl::OUString aPropName( bForPercentage ? C2U( "PercentageNumberFormat" ) : C2U( "NumberFormat" ) );
547*b1cdbd2cSJim Jagielski     bool bHasNumberFormat = false;
548*b1cdbd2cSJim Jagielski     uno::Reference< beans::XPropertySet > xPointProp( this->getPropertiesOfPoint( nPointIndex ));
549*b1cdbd2cSJim Jagielski     sal_Int32 nNumberFormat = -1;
550*b1cdbd2cSJim Jagielski     if( xPointProp.is() && (xPointProp->getPropertyValue(aPropName) >>= nNumberFormat) )
551*b1cdbd2cSJim Jagielski         bHasNumberFormat = true;
552*b1cdbd2cSJim Jagielski     return bHasNumberFormat;
553*b1cdbd2cSJim Jagielski }
getExplicitNumberFormat(sal_Int32 nPointIndex,bool bForPercentage) const554*b1cdbd2cSJim Jagielski sal_Int32 VDataSeries::getExplicitNumberFormat( sal_Int32 nPointIndex, bool bForPercentage ) const
555*b1cdbd2cSJim Jagielski {
556*b1cdbd2cSJim Jagielski     rtl::OUString aPropName( bForPercentage ? C2U( "PercentageNumberFormat" ) : C2U( "NumberFormat" ) );
557*b1cdbd2cSJim Jagielski     sal_Int32 nNumberFormat = -1;
558*b1cdbd2cSJim Jagielski     uno::Reference< beans::XPropertySet > xPointProp( this->getPropertiesOfPoint( nPointIndex ));
559*b1cdbd2cSJim Jagielski     if( xPointProp.is() )
560*b1cdbd2cSJim Jagielski         xPointProp->getPropertyValue(aPropName) >>= nNumberFormat;
561*b1cdbd2cSJim Jagielski     return nNumberFormat;
562*b1cdbd2cSJim Jagielski }
setRoleOfSequenceForDataLabelNumberFormatDetection(const rtl::OUString & rRole)563*b1cdbd2cSJim Jagielski void VDataSeries::setRoleOfSequenceForDataLabelNumberFormatDetection( const rtl::OUString& rRole )
564*b1cdbd2cSJim Jagielski {
565*b1cdbd2cSJim Jagielski     if( rRole.equals(C2U("values-y")) )
566*b1cdbd2cSJim Jagielski         m_pValueSequenceForDataLabelNumberFormatDetection = &m_aValues_Y;
567*b1cdbd2cSJim Jagielski     else if( rRole.equals(C2U("values-size")) )
568*b1cdbd2cSJim Jagielski         m_pValueSequenceForDataLabelNumberFormatDetection = &m_aValues_Bubble_Size;
569*b1cdbd2cSJim Jagielski     else if( rRole.equals(C2U("values-min")) )
570*b1cdbd2cSJim Jagielski         m_pValueSequenceForDataLabelNumberFormatDetection = &m_aValues_Y_Min;
571*b1cdbd2cSJim Jagielski     else if( rRole.equals(C2U("values-max")) )
572*b1cdbd2cSJim Jagielski         m_pValueSequenceForDataLabelNumberFormatDetection = &m_aValues_Y_Max;
573*b1cdbd2cSJim Jagielski     else if( rRole.equals(C2U("values-first")) )
574*b1cdbd2cSJim Jagielski         m_pValueSequenceForDataLabelNumberFormatDetection = &m_aValues_Y_First;
575*b1cdbd2cSJim Jagielski     else if( rRole.equals(C2U("values-last")) )
576*b1cdbd2cSJim Jagielski         m_pValueSequenceForDataLabelNumberFormatDetection = &m_aValues_Y_Last;
577*b1cdbd2cSJim Jagielski     else if( rRole.equals(C2U("values-x")) )
578*b1cdbd2cSJim Jagielski         m_pValueSequenceForDataLabelNumberFormatDetection = &m_aValues_X;
579*b1cdbd2cSJim Jagielski }
shouldLabelNumberFormatKeyBeDetectedFromYAxis() const580*b1cdbd2cSJim Jagielski bool VDataSeries::shouldLabelNumberFormatKeyBeDetectedFromYAxis() const
581*b1cdbd2cSJim Jagielski {
582*b1cdbd2cSJim Jagielski     if( m_pValueSequenceForDataLabelNumberFormatDetection == &m_aValues_Bubble_Size )
583*b1cdbd2cSJim Jagielski         return false;
584*b1cdbd2cSJim Jagielski     else if( m_pValueSequenceForDataLabelNumberFormatDetection == &m_aValues_X )
585*b1cdbd2cSJim Jagielski         return false;
586*b1cdbd2cSJim Jagielski     return true;
587*b1cdbd2cSJim Jagielski }
detectNumberFormatKey(sal_Int32 index) const588*b1cdbd2cSJim Jagielski sal_Int32 VDataSeries::detectNumberFormatKey( sal_Int32 index ) const
589*b1cdbd2cSJim Jagielski {
590*b1cdbd2cSJim Jagielski     sal_Int32 nRet = 0;
591*b1cdbd2cSJim Jagielski     if( m_pValueSequenceForDataLabelNumberFormatDetection )
592*b1cdbd2cSJim Jagielski         nRet = m_pValueSequenceForDataLabelNumberFormatDetection->detectNumberFormatKey( index );
593*b1cdbd2cSJim Jagielski     return nRet;
594*b1cdbd2cSJim Jagielski }
595*b1cdbd2cSJim Jagielski 
getLabelPlacement(sal_Int32 nPointIndex,const uno::Reference<chart2::XChartType> & xChartType,sal_Int32 nDimensionCount,sal_Bool bSwapXAndY) const596*b1cdbd2cSJim Jagielski sal_Int32 VDataSeries::getLabelPlacement( sal_Int32 nPointIndex, const uno::Reference< chart2::XChartType >& xChartType, sal_Int32 nDimensionCount, sal_Bool bSwapXAndY ) const
597*b1cdbd2cSJim Jagielski {
598*b1cdbd2cSJim Jagielski     sal_Int32 nLabelPlacement=0;
599*b1cdbd2cSJim Jagielski     try
600*b1cdbd2cSJim Jagielski     {
601*b1cdbd2cSJim Jagielski         uno::Reference< beans::XPropertySet > xPointProps( this->getPropertiesOfPoint( nPointIndex ) );
602*b1cdbd2cSJim Jagielski         if( xPointProps.is() )
603*b1cdbd2cSJim Jagielski             xPointProps->getPropertyValue( C2U( "LabelPlacement" ) ) >>= nLabelPlacement;
604*b1cdbd2cSJim Jagielski 
605*b1cdbd2cSJim Jagielski         //ensure that the set label placement is supported by this charttype
606*b1cdbd2cSJim Jagielski 
607*b1cdbd2cSJim Jagielski         uno::Sequence < sal_Int32 > aAvailablePlacements( ChartTypeHelper::getSupportedLabelPlacements(
608*b1cdbd2cSJim Jagielski                 xChartType, nDimensionCount, bSwapXAndY, m_xDataSeries ) );
609*b1cdbd2cSJim Jagielski 
610*b1cdbd2cSJim Jagielski         for( sal_Int32 nN = 0; nN < aAvailablePlacements.getLength(); nN++ )
611*b1cdbd2cSJim Jagielski             if( aAvailablePlacements[nN] == nLabelPlacement )
612*b1cdbd2cSJim Jagielski                 return nLabelPlacement; //ok
613*b1cdbd2cSJim Jagielski 
614*b1cdbd2cSJim Jagielski         //otherwise use the first supported one
615*b1cdbd2cSJim Jagielski         if( aAvailablePlacements.getLength() )
616*b1cdbd2cSJim Jagielski         {
617*b1cdbd2cSJim Jagielski             nLabelPlacement = aAvailablePlacements[0];
618*b1cdbd2cSJim Jagielski             return nLabelPlacement;
619*b1cdbd2cSJim Jagielski         }
620*b1cdbd2cSJim Jagielski 
621*b1cdbd2cSJim Jagielski         DBG_ERROR("no label placement supported");
622*b1cdbd2cSJim Jagielski     }
623*b1cdbd2cSJim Jagielski     catch( uno::Exception& e )
624*b1cdbd2cSJim Jagielski     {
625*b1cdbd2cSJim Jagielski         ASSERT_EXCEPTION( e );
626*b1cdbd2cSJim Jagielski     }
627*b1cdbd2cSJim Jagielski     return nLabelPlacement;
628*b1cdbd2cSJim Jagielski }
629*b1cdbd2cSJim Jagielski 
getMinimumofAllDifferentYValues(sal_Int32 index) const630*b1cdbd2cSJim Jagielski double VDataSeries::getMinimumofAllDifferentYValues( sal_Int32 index ) const
631*b1cdbd2cSJim Jagielski {
632*b1cdbd2cSJim Jagielski     double fMin=0.0;
633*b1cdbd2cSJim Jagielski     ::rtl::math::setInf(&fMin, false);
634*b1cdbd2cSJim Jagielski 
635*b1cdbd2cSJim Jagielski     if( !m_aValues_Y.is() &&
636*b1cdbd2cSJim Jagielski         (m_aValues_Y_Min.is() || m_aValues_Y_Max.is()
637*b1cdbd2cSJim Jagielski         || m_aValues_Y_First.is() || m_aValues_Y_Last.is() ) )
638*b1cdbd2cSJim Jagielski     {
639*b1cdbd2cSJim Jagielski         double fY_Min = getY_Min( index );
640*b1cdbd2cSJim Jagielski         double fY_Max = getY_Max( index );
641*b1cdbd2cSJim Jagielski         double fY_First = getY_First( index );
642*b1cdbd2cSJim Jagielski         double fY_Last = getY_Last( index );
643*b1cdbd2cSJim Jagielski 
644*b1cdbd2cSJim Jagielski         if(fMin>fY_First)
645*b1cdbd2cSJim Jagielski             fMin=fY_First;
646*b1cdbd2cSJim Jagielski         if(fMin>fY_Last)
647*b1cdbd2cSJim Jagielski             fMin=fY_Last;
648*b1cdbd2cSJim Jagielski         if(fMin>fY_Min)
649*b1cdbd2cSJim Jagielski             fMin=fY_Min;
650*b1cdbd2cSJim Jagielski         if(fMin>fY_Max)
651*b1cdbd2cSJim Jagielski             fMin=fY_Max;
652*b1cdbd2cSJim Jagielski     }
653*b1cdbd2cSJim Jagielski     else
654*b1cdbd2cSJim Jagielski     {
655*b1cdbd2cSJim Jagielski         double fY = getYValue( index );
656*b1cdbd2cSJim Jagielski         if(fMin>fY)
657*b1cdbd2cSJim Jagielski             fMin=fY;
658*b1cdbd2cSJim Jagielski     }
659*b1cdbd2cSJim Jagielski 
660*b1cdbd2cSJim Jagielski     if( ::rtl::math::isInf(fMin) )
661*b1cdbd2cSJim Jagielski         ::rtl::math::setNan(&fMin);
662*b1cdbd2cSJim Jagielski 
663*b1cdbd2cSJim Jagielski     return fMin;
664*b1cdbd2cSJim Jagielski }
665*b1cdbd2cSJim Jagielski 
getMaximumofAllDifferentYValues(sal_Int32 index) const666*b1cdbd2cSJim Jagielski double VDataSeries::getMaximumofAllDifferentYValues( sal_Int32 index ) const
667*b1cdbd2cSJim Jagielski {
668*b1cdbd2cSJim Jagielski     double fMax=0.0;
669*b1cdbd2cSJim Jagielski     ::rtl::math::setInf(&fMax, true);
670*b1cdbd2cSJim Jagielski 
671*b1cdbd2cSJim Jagielski     if( !m_aValues_Y.is() &&
672*b1cdbd2cSJim Jagielski         (m_aValues_Y_Min.is() || m_aValues_Y_Max.is()
673*b1cdbd2cSJim Jagielski         || m_aValues_Y_First.is() || m_aValues_Y_Last.is() ) )
674*b1cdbd2cSJim Jagielski     {
675*b1cdbd2cSJim Jagielski         double fY_Min = getY_Min( index );
676*b1cdbd2cSJim Jagielski         double fY_Max = getY_Max( index );
677*b1cdbd2cSJim Jagielski         double fY_First = getY_First( index );
678*b1cdbd2cSJim Jagielski         double fY_Last = getY_Last( index );
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski         if(fMax<fY_First)
681*b1cdbd2cSJim Jagielski             fMax=fY_First;
682*b1cdbd2cSJim Jagielski         if(fMax<fY_Last)
683*b1cdbd2cSJim Jagielski             fMax=fY_Last;
684*b1cdbd2cSJim Jagielski         if(fMax<fY_Min)
685*b1cdbd2cSJim Jagielski             fMax=fY_Min;
686*b1cdbd2cSJim Jagielski         if(fMax<fY_Max)
687*b1cdbd2cSJim Jagielski             fMax=fY_Max;
688*b1cdbd2cSJim Jagielski     }
689*b1cdbd2cSJim Jagielski     else
690*b1cdbd2cSJim Jagielski     {
691*b1cdbd2cSJim Jagielski         double fY = getYValue( index );
692*b1cdbd2cSJim Jagielski         if(fMax<fY)
693*b1cdbd2cSJim Jagielski             fMax=fY;
694*b1cdbd2cSJim Jagielski     }
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski     if( ::rtl::math::isInf(fMax) )
697*b1cdbd2cSJim Jagielski         ::rtl::math::setNan(&fMax);
698*b1cdbd2cSJim Jagielski 
699*b1cdbd2cSJim Jagielski     return fMax;
700*b1cdbd2cSJim Jagielski }
701*b1cdbd2cSJim Jagielski 
getAllX() const702*b1cdbd2cSJim Jagielski uno::Sequence< double > VDataSeries::getAllX() const
703*b1cdbd2cSJim Jagielski {
704*b1cdbd2cSJim Jagielski     if(!m_aValues_X.is() && !m_aValues_X.getLength() && m_nPointCount)
705*b1cdbd2cSJim Jagielski     {
706*b1cdbd2cSJim Jagielski         //init x values from category indexes
707*b1cdbd2cSJim Jagielski         //first category (index 0) matches with real number 1.0
708*b1cdbd2cSJim Jagielski         m_aValues_X.Doubles.realloc( m_nPointCount );
709*b1cdbd2cSJim Jagielski         for(sal_Int32 nN=m_aValues_X.getLength();nN--;)
710*b1cdbd2cSJim Jagielski             m_aValues_X.Doubles[nN] = nN+1;
711*b1cdbd2cSJim Jagielski     }
712*b1cdbd2cSJim Jagielski     return m_aValues_X.Doubles;
713*b1cdbd2cSJim Jagielski }
714*b1cdbd2cSJim Jagielski 
getAllY() const715*b1cdbd2cSJim Jagielski uno::Sequence< double > VDataSeries::getAllY() const
716*b1cdbd2cSJim Jagielski {
717*b1cdbd2cSJim Jagielski     if(!m_aValues_Y.is() && !m_aValues_Y.getLength() && m_nPointCount)
718*b1cdbd2cSJim Jagielski     {
719*b1cdbd2cSJim Jagielski         //init y values from indexes
720*b1cdbd2cSJim Jagielski         //first y-value (index 0) matches with real number 1.0
721*b1cdbd2cSJim Jagielski         m_aValues_Y.Doubles.realloc( m_nPointCount );
722*b1cdbd2cSJim Jagielski         for(sal_Int32 nN=m_aValues_Y.getLength();nN--;)
723*b1cdbd2cSJim Jagielski             m_aValues_Y.Doubles[nN] = nN+1;
724*b1cdbd2cSJim Jagielski     }
725*b1cdbd2cSJim Jagielski     return m_aValues_Y.Doubles;
726*b1cdbd2cSJim Jagielski }
727*b1cdbd2cSJim Jagielski 
getYMeanValue() const728*b1cdbd2cSJim Jagielski double VDataSeries::getYMeanValue() const
729*b1cdbd2cSJim Jagielski {
730*b1cdbd2cSJim Jagielski     if( ::rtl::math::isNan( m_fYMeanValue ) )
731*b1cdbd2cSJim Jagielski     {
732*b1cdbd2cSJim Jagielski         uno::Reference< XRegressionCurveCalculator > xCalculator( RegressionCurveHelper::createRegressionCurveCalculatorByServiceName( C2U("com.sun.star.chart2.MeanValueRegressionCurve") ) );
733*b1cdbd2cSJim Jagielski         uno::Sequence< double > aXValuesDummy;
734*b1cdbd2cSJim Jagielski         xCalculator->recalculateRegression( aXValuesDummy, getAllY() );
735*b1cdbd2cSJim Jagielski         double fXDummy = 1.0;
736*b1cdbd2cSJim Jagielski         m_fYMeanValue = xCalculator->getCurveValue( fXDummy );
737*b1cdbd2cSJim Jagielski     }
738*b1cdbd2cSJim Jagielski     return m_fYMeanValue;
739*b1cdbd2cSJim Jagielski }
740*b1cdbd2cSJim Jagielski 
getSymbolPropertiesFromPropertySet(const uno::Reference<beans::XPropertySet> & xProp)741*b1cdbd2cSJim Jagielski ::std::auto_ptr< Symbol > getSymbolPropertiesFromPropertySet(
742*b1cdbd2cSJim Jagielski         const uno::Reference< beans::XPropertySet >& xProp )
743*b1cdbd2cSJim Jagielski {
744*b1cdbd2cSJim Jagielski     ::std::auto_ptr< Symbol > apSymbolProps( new Symbol() );
745*b1cdbd2cSJim Jagielski     try
746*b1cdbd2cSJim Jagielski     {
747*b1cdbd2cSJim Jagielski         if( xProp->getPropertyValue( C2U( "Symbol" ) ) >>= *apSymbolProps )
748*b1cdbd2cSJim Jagielski         {
749*b1cdbd2cSJim Jagielski             //use main color to fill symbols
750*b1cdbd2cSJim Jagielski             xProp->getPropertyValue( C2U( "Color" ) ) >>= apSymbolProps->FillColor;
751*b1cdbd2cSJim Jagielski             // border of symbols always same as fill color
752*b1cdbd2cSJim Jagielski             apSymbolProps->BorderColor = apSymbolProps->FillColor;
753*b1cdbd2cSJim Jagielski         }
754*b1cdbd2cSJim Jagielski         else
755*b1cdbd2cSJim Jagielski             apSymbolProps.reset();
756*b1cdbd2cSJim Jagielski     }
757*b1cdbd2cSJim Jagielski     catch( uno::Exception &e)
758*b1cdbd2cSJim Jagielski     {
759*b1cdbd2cSJim Jagielski         ASSERT_EXCEPTION( e );
760*b1cdbd2cSJim Jagielski     }
761*b1cdbd2cSJim Jagielski     return apSymbolProps;
762*b1cdbd2cSJim Jagielski }
763*b1cdbd2cSJim Jagielski 
getSymbolProperties(sal_Int32 index) const764*b1cdbd2cSJim Jagielski Symbol* VDataSeries::getSymbolProperties( sal_Int32 index ) const
765*b1cdbd2cSJim Jagielski {
766*b1cdbd2cSJim Jagielski     Symbol* pRet=NULL;
767*b1cdbd2cSJim Jagielski     if( isAttributedDataPoint( index ) )
768*b1cdbd2cSJim Jagielski     {
769*b1cdbd2cSJim Jagielski         adaptPointCache( index );
770*b1cdbd2cSJim Jagielski         if(!m_apSymbolProperties_AttributedPoint.get())
771*b1cdbd2cSJim Jagielski             m_apSymbolProperties_AttributedPoint = getSymbolPropertiesFromPropertySet( this->getPropertiesOfPoint( index ) );
772*b1cdbd2cSJim Jagielski         pRet = m_apSymbolProperties_AttributedPoint.get();
773*b1cdbd2cSJim Jagielski         //if a single data point does not have symbols but the dataseries itself has symbols
774*b1cdbd2cSJim Jagielski         //we create an invisible symbol shape to enable selection of that point
775*b1cdbd2cSJim Jagielski         if( !pRet || pRet->Style == SymbolStyle_NONE )
776*b1cdbd2cSJim Jagielski         {
777*b1cdbd2cSJim Jagielski             if(!m_apSymbolProperties_Series.get())
778*b1cdbd2cSJim Jagielski                 m_apSymbolProperties_Series = getSymbolPropertiesFromPropertySet( this->getPropertiesOfSeries() );
779*b1cdbd2cSJim Jagielski             if( m_apSymbolProperties_Series.get() && m_apSymbolProperties_Series->Style != SymbolStyle_NONE )
780*b1cdbd2cSJim Jagielski             {
781*b1cdbd2cSJim Jagielski                 if(!m_apSymbolProperties_InvisibleSymbolForSelection.get())
782*b1cdbd2cSJim Jagielski                 {
783*b1cdbd2cSJim Jagielski                     m_apSymbolProperties_InvisibleSymbolForSelection = ::std::auto_ptr< Symbol >( new Symbol() );
784*b1cdbd2cSJim Jagielski                     m_apSymbolProperties_InvisibleSymbolForSelection->Style = SymbolStyle_STANDARD;
785*b1cdbd2cSJim Jagielski                     m_apSymbolProperties_InvisibleSymbolForSelection->StandardSymbol = 0;//square
786*b1cdbd2cSJim Jagielski                     m_apSymbolProperties_InvisibleSymbolForSelection->Size = m_apSymbolProperties_Series->Size;
787*b1cdbd2cSJim Jagielski                     m_apSymbolProperties_InvisibleSymbolForSelection->BorderColor = 0xff000000;//invisible
788*b1cdbd2cSJim Jagielski                     m_apSymbolProperties_InvisibleSymbolForSelection->FillColor = 0xff000000;//invisible
789*b1cdbd2cSJim Jagielski                 }
790*b1cdbd2cSJim Jagielski                 pRet = m_apSymbolProperties_InvisibleSymbolForSelection.get();
791*b1cdbd2cSJim Jagielski             }
792*b1cdbd2cSJim Jagielski         }
793*b1cdbd2cSJim Jagielski     }
794*b1cdbd2cSJim Jagielski     else
795*b1cdbd2cSJim Jagielski     {
796*b1cdbd2cSJim Jagielski         if(!m_apSymbolProperties_Series.get())
797*b1cdbd2cSJim Jagielski             m_apSymbolProperties_Series = getSymbolPropertiesFromPropertySet( this->getPropertiesOfSeries() );
798*b1cdbd2cSJim Jagielski         pRet = m_apSymbolProperties_Series.get();
799*b1cdbd2cSJim Jagielski     }
800*b1cdbd2cSJim Jagielski 
801*b1cdbd2cSJim Jagielski     if( pRet && pRet->Style == SymbolStyle_AUTO )
802*b1cdbd2cSJim Jagielski     {
803*b1cdbd2cSJim Jagielski         pRet->Style = SymbolStyle_STANDARD;
804*b1cdbd2cSJim Jagielski 
805*b1cdbd2cSJim Jagielski         sal_Int32 nIndex = m_nGlobalSeriesIndex;
806*b1cdbd2cSJim Jagielski         if(m_aValues_X.is())
807*b1cdbd2cSJim Jagielski             nIndex++;
808*b1cdbd2cSJim Jagielski         pRet->StandardSymbol = nIndex;
809*b1cdbd2cSJim Jagielski     }
810*b1cdbd2cSJim Jagielski 
811*b1cdbd2cSJim Jagielski     return pRet;
812*b1cdbd2cSJim Jagielski }
813*b1cdbd2cSJim Jagielski 
getYErrorBarProperties(sal_Int32 index) const814*b1cdbd2cSJim Jagielski uno::Reference< beans::XPropertySet > VDataSeries::getYErrorBarProperties( sal_Int32 index ) const
815*b1cdbd2cSJim Jagielski {
816*b1cdbd2cSJim Jagielski     uno::Reference< beans::XPropertySet > xErrorBarProp;
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski     uno::Reference< beans::XPropertySet > xPointProp( this->getPropertiesOfPoint( index ));
819*b1cdbd2cSJim Jagielski     if( xPointProp.is() )
820*b1cdbd2cSJim Jagielski         xPointProp->getPropertyValue( C2U( "ErrorBarY" )) >>= xErrorBarProp;
821*b1cdbd2cSJim Jagielski     return xErrorBarProp;
822*b1cdbd2cSJim Jagielski }
823*b1cdbd2cSJim Jagielski 
hasPointOwnColor(sal_Int32 index) const824*b1cdbd2cSJim Jagielski bool VDataSeries::hasPointOwnColor( sal_Int32 index ) const
825*b1cdbd2cSJim Jagielski {
826*b1cdbd2cSJim Jagielski     if( !isAttributedDataPoint(index) )
827*b1cdbd2cSJim Jagielski         return false;
828*b1cdbd2cSJim Jagielski 
829*b1cdbd2cSJim Jagielski     try
830*b1cdbd2cSJim Jagielski     {
831*b1cdbd2cSJim Jagielski         uno::Reference< beans::XPropertyState > xPointState( this->getPropertiesOfPoint(index), uno::UNO_QUERY_THROW );
832*b1cdbd2cSJim Jagielski         return (xPointState->getPropertyState( C2U("Color")) != beans::PropertyState_DEFAULT_VALUE );
833*b1cdbd2cSJim Jagielski     }
834*b1cdbd2cSJim Jagielski     catch( uno::Exception& e)
835*b1cdbd2cSJim Jagielski     {
836*b1cdbd2cSJim Jagielski         ASSERT_EXCEPTION( e );
837*b1cdbd2cSJim Jagielski     }
838*b1cdbd2cSJim Jagielski     return false;
839*b1cdbd2cSJim Jagielski }
840*b1cdbd2cSJim Jagielski 
isAttributedDataPoint(sal_Int32 index) const841*b1cdbd2cSJim Jagielski bool VDataSeries::isAttributedDataPoint( sal_Int32 index ) const
842*b1cdbd2cSJim Jagielski {
843*b1cdbd2cSJim Jagielski     //returns true if the data point assigned by the given index has set it's own properties
844*b1cdbd2cSJim Jagielski     if( index>=m_nPointCount || m_nPointCount==0)
845*b1cdbd2cSJim Jagielski         return false;
846*b1cdbd2cSJim Jagielski     for(sal_Int32 nN=m_aAttributedDataPointIndexList.getLength();nN--;)
847*b1cdbd2cSJim Jagielski     {
848*b1cdbd2cSJim Jagielski         if(index==m_aAttributedDataPointIndexList[nN])
849*b1cdbd2cSJim Jagielski             return true;
850*b1cdbd2cSJim Jagielski     }
851*b1cdbd2cSJim Jagielski     return false;
852*b1cdbd2cSJim Jagielski }
853*b1cdbd2cSJim Jagielski 
isVaryColorsByPoint() const854*b1cdbd2cSJim Jagielski bool VDataSeries::isVaryColorsByPoint() const
855*b1cdbd2cSJim Jagielski {
856*b1cdbd2cSJim Jagielski     bool bVaryColorsByPoint = false;
857*b1cdbd2cSJim Jagielski     Reference< beans::XPropertySet > xSeriesProp( this->getPropertiesOfSeries() );
858*b1cdbd2cSJim Jagielski     if( xSeriesProp.is() )
859*b1cdbd2cSJim Jagielski         xSeriesProp->getPropertyValue( C2U("VaryColorsByPoint") ) >>= bVaryColorsByPoint;
860*b1cdbd2cSJim Jagielski     return bVaryColorsByPoint;
861*b1cdbd2cSJim Jagielski }
862*b1cdbd2cSJim Jagielski 
getPropertiesOfPoint(sal_Int32 index) const863*b1cdbd2cSJim Jagielski uno::Reference< beans::XPropertySet > VDataSeries::getPropertiesOfPoint( sal_Int32 index ) const
864*b1cdbd2cSJim Jagielski {
865*b1cdbd2cSJim Jagielski     if( isAttributedDataPoint( index ) )
866*b1cdbd2cSJim Jagielski         return m_xDataSeries->getDataPointByIndex(index);
867*b1cdbd2cSJim Jagielski     return this->getPropertiesOfSeries();
868*b1cdbd2cSJim Jagielski }
869*b1cdbd2cSJim Jagielski 
getPropertiesOfSeries() const870*b1cdbd2cSJim Jagielski uno::Reference< beans::XPropertySet > VDataSeries::getPropertiesOfSeries() const
871*b1cdbd2cSJim Jagielski {
872*b1cdbd2cSJim Jagielski     return  uno::Reference<beans::XPropertySet>(m_xDataSeries, uno::UNO_QUERY );
873*b1cdbd2cSJim Jagielski }
874*b1cdbd2cSJim Jagielski 
getDataPointLabelFromPropertySet(const uno::Reference<beans::XPropertySet> & xProp)875*b1cdbd2cSJim Jagielski ::std::auto_ptr< DataPointLabel > getDataPointLabelFromPropertySet(
876*b1cdbd2cSJim Jagielski         const uno::Reference< beans::XPropertySet >& xProp )
877*b1cdbd2cSJim Jagielski {
878*b1cdbd2cSJim Jagielski     ::std::auto_ptr< DataPointLabel > apLabel( new DataPointLabel() );
879*b1cdbd2cSJim Jagielski     try
880*b1cdbd2cSJim Jagielski     {
881*b1cdbd2cSJim Jagielski         if( !(xProp->getPropertyValue( C2U( "Label" ) ) >>= *apLabel) )
882*b1cdbd2cSJim Jagielski             apLabel.reset();
883*b1cdbd2cSJim Jagielski     }
884*b1cdbd2cSJim Jagielski     catch( uno::Exception &e)
885*b1cdbd2cSJim Jagielski     {
886*b1cdbd2cSJim Jagielski         ASSERT_EXCEPTION( e );
887*b1cdbd2cSJim Jagielski     }
888*b1cdbd2cSJim Jagielski     return apLabel;
889*b1cdbd2cSJim Jagielski }
890*b1cdbd2cSJim Jagielski 
adaptPointCache(sal_Int32 nNewPointIndex) const891*b1cdbd2cSJim Jagielski void VDataSeries::adaptPointCache( sal_Int32 nNewPointIndex ) const
892*b1cdbd2cSJim Jagielski {
893*b1cdbd2cSJim Jagielski     if( m_nCurrentAttributedPoint != nNewPointIndex )
894*b1cdbd2cSJim Jagielski     {
895*b1cdbd2cSJim Jagielski         m_apLabel_AttributedPoint.reset();
896*b1cdbd2cSJim Jagielski         m_apLabelPropNames_AttributedPoint.reset();
897*b1cdbd2cSJim Jagielski         m_apLabelPropValues_AttributedPoint.reset();
898*b1cdbd2cSJim Jagielski         m_apSymbolProperties_AttributedPoint.reset();
899*b1cdbd2cSJim Jagielski         m_nCurrentAttributedPoint = nNewPointIndex;
900*b1cdbd2cSJim Jagielski     }
901*b1cdbd2cSJim Jagielski }
902*b1cdbd2cSJim Jagielski 
getDataPointLabel(sal_Int32 index) const903*b1cdbd2cSJim Jagielski DataPointLabel* VDataSeries::getDataPointLabel( sal_Int32 index ) const
904*b1cdbd2cSJim Jagielski {
905*b1cdbd2cSJim Jagielski     DataPointLabel* pRet = NULL;
906*b1cdbd2cSJim Jagielski     if( isAttributedDataPoint( index ) )
907*b1cdbd2cSJim Jagielski     {
908*b1cdbd2cSJim Jagielski         adaptPointCache( index );
909*b1cdbd2cSJim Jagielski         if( !m_apLabel_AttributedPoint.get() )
910*b1cdbd2cSJim Jagielski             m_apLabel_AttributedPoint = getDataPointLabelFromPropertySet( this->getPropertiesOfPoint( index ) );
911*b1cdbd2cSJim Jagielski         pRet = m_apLabel_AttributedPoint.get();
912*b1cdbd2cSJim Jagielski     }
913*b1cdbd2cSJim Jagielski     else
914*b1cdbd2cSJim Jagielski     {
915*b1cdbd2cSJim Jagielski         if(!m_apLabel_Series.get())
916*b1cdbd2cSJim Jagielski             m_apLabel_Series = getDataPointLabelFromPropertySet( this->getPropertiesOfPoint( index ) );
917*b1cdbd2cSJim Jagielski         pRet = m_apLabel_Series.get();
918*b1cdbd2cSJim Jagielski     }
919*b1cdbd2cSJim Jagielski     if( !m_bAllowPercentValueInDataLabel )
920*b1cdbd2cSJim Jagielski     {
921*b1cdbd2cSJim Jagielski         if( pRet )
922*b1cdbd2cSJim Jagielski             pRet->ShowNumberInPercent = false;
923*b1cdbd2cSJim Jagielski     }
924*b1cdbd2cSJim Jagielski     return pRet;
925*b1cdbd2cSJim Jagielski }
926*b1cdbd2cSJim Jagielski 
getDataPointLabelIfLabel(sal_Int32 index) const927*b1cdbd2cSJim Jagielski DataPointLabel* VDataSeries::getDataPointLabelIfLabel( sal_Int32 index ) const
928*b1cdbd2cSJim Jagielski {
929*b1cdbd2cSJim Jagielski     DataPointLabel* pLabel = this->getDataPointLabel( index );
930*b1cdbd2cSJim Jagielski     if( !pLabel || (!pLabel->ShowNumber && !pLabel->ShowNumberInPercent
931*b1cdbd2cSJim Jagielski         && !pLabel->ShowCategoryName ) )
932*b1cdbd2cSJim Jagielski         return 0;
933*b1cdbd2cSJim Jagielski     return pLabel;
934*b1cdbd2cSJim Jagielski }
935*b1cdbd2cSJim Jagielski 
getTextLabelMultiPropertyLists(sal_Int32 index,tNameSequence * & pPropNames,tAnySequence * & pPropValues) const936*b1cdbd2cSJim Jagielski bool VDataSeries::getTextLabelMultiPropertyLists( sal_Int32 index
937*b1cdbd2cSJim Jagielski     , tNameSequence*& pPropNames
938*b1cdbd2cSJim Jagielski     , tAnySequence*& pPropValues ) const
939*b1cdbd2cSJim Jagielski {
940*b1cdbd2cSJim Jagielski     pPropNames = NULL; pPropValues = NULL;
941*b1cdbd2cSJim Jagielski     uno::Reference< beans::XPropertySet > xTextProp;
942*b1cdbd2cSJim Jagielski     bool bDoDynamicFontResize = false;
943*b1cdbd2cSJim Jagielski     if( isAttributedDataPoint( index ) )
944*b1cdbd2cSJim Jagielski     {
945*b1cdbd2cSJim Jagielski         adaptPointCache( index );
946*b1cdbd2cSJim Jagielski         if(!m_apLabelPropValues_AttributedPoint.get())
947*b1cdbd2cSJim Jagielski         {
948*b1cdbd2cSJim Jagielski             pPropNames = new tNameSequence();
949*b1cdbd2cSJim Jagielski             pPropValues = new tAnySequence();
950*b1cdbd2cSJim Jagielski             xTextProp.set( this->getPropertiesOfPoint( index ));
951*b1cdbd2cSJim Jagielski             PropertyMapper::getTextLabelMultiPropertyLists( xTextProp, *pPropNames, *pPropValues );
952*b1cdbd2cSJim Jagielski             m_apLabelPropNames_AttributedPoint = ::std::auto_ptr< tNameSequence >(pPropNames);
953*b1cdbd2cSJim Jagielski             m_apLabelPropValues_AttributedPoint = ::std::auto_ptr< tAnySequence >(pPropValues);
954*b1cdbd2cSJim Jagielski             bDoDynamicFontResize = true;
955*b1cdbd2cSJim Jagielski         }
956*b1cdbd2cSJim Jagielski         pPropNames = m_apLabelPropNames_AttributedPoint.get();
957*b1cdbd2cSJim Jagielski         pPropValues = m_apLabelPropValues_AttributedPoint.get();
958*b1cdbd2cSJim Jagielski     }
959*b1cdbd2cSJim Jagielski     else
960*b1cdbd2cSJim Jagielski     {
961*b1cdbd2cSJim Jagielski         if(!m_apLabelPropValues_Series.get())
962*b1cdbd2cSJim Jagielski         {
963*b1cdbd2cSJim Jagielski             pPropNames = new tNameSequence();
964*b1cdbd2cSJim Jagielski             pPropValues = new tAnySequence();
965*b1cdbd2cSJim Jagielski             xTextProp.set( this->getPropertiesOfPoint( index ));
966*b1cdbd2cSJim Jagielski             PropertyMapper::getTextLabelMultiPropertyLists( xTextProp, *pPropNames, *pPropValues );
967*b1cdbd2cSJim Jagielski             m_apLabelPropNames_Series = ::std::auto_ptr< tNameSequence >(pPropNames);
968*b1cdbd2cSJim Jagielski             m_apLabelPropValues_Series = ::std::auto_ptr< tAnySequence >(pPropValues);
969*b1cdbd2cSJim Jagielski             bDoDynamicFontResize = true;
970*b1cdbd2cSJim Jagielski         }
971*b1cdbd2cSJim Jagielski         pPropNames = m_apLabelPropNames_Series.get();
972*b1cdbd2cSJim Jagielski         pPropValues = m_apLabelPropValues_Series.get();
973*b1cdbd2cSJim Jagielski     }
974*b1cdbd2cSJim Jagielski 
975*b1cdbd2cSJim Jagielski     if( bDoDynamicFontResize &&
976*b1cdbd2cSJim Jagielski         pPropNames && pPropValues &&
977*b1cdbd2cSJim Jagielski         xTextProp.is())
978*b1cdbd2cSJim Jagielski     {
979*b1cdbd2cSJim Jagielski         LabelPositionHelper::doDynamicFontResize( *pPropValues, *pPropNames, xTextProp, m_aReferenceSize );
980*b1cdbd2cSJim Jagielski     }
981*b1cdbd2cSJim Jagielski     if(pPropNames&&pPropValues)
982*b1cdbd2cSJim Jagielski         return true;
983*b1cdbd2cSJim Jagielski     return false;
984*b1cdbd2cSJim Jagielski }
985*b1cdbd2cSJim Jagielski 
setMissingValueTreatment(sal_Int32 nMissingValueTreatment)986*b1cdbd2cSJim Jagielski void VDataSeries::setMissingValueTreatment( sal_Int32 nMissingValueTreatment )
987*b1cdbd2cSJim Jagielski {
988*b1cdbd2cSJim Jagielski     m_nMissingValueTreatment = nMissingValueTreatment;
989*b1cdbd2cSJim Jagielski }
990*b1cdbd2cSJim Jagielski 
getMissingValueTreatment() const991*b1cdbd2cSJim Jagielski sal_Int32 VDataSeries::getMissingValueTreatment() const
992*b1cdbd2cSJim Jagielski {
993*b1cdbd2cSJim Jagielski     return m_nMissingValueTreatment;
994*b1cdbd2cSJim Jagielski }
995*b1cdbd2cSJim Jagielski 
996*b1cdbd2cSJim Jagielski //.............................................................................
997*b1cdbd2cSJim Jagielski } //namespace chart
998*b1cdbd2cSJim Jagielski //.............................................................................
999