1*cde9e8dcSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*cde9e8dcSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*cde9e8dcSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*cde9e8dcSAndrew Rist  * distributed with this work for additional information
6*cde9e8dcSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*cde9e8dcSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*cde9e8dcSAndrew Rist  * "License"); you may not use this file except in compliance
9*cde9e8dcSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*cde9e8dcSAndrew Rist  *
11*cde9e8dcSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*cde9e8dcSAndrew Rist  *
13*cde9e8dcSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*cde9e8dcSAndrew Rist  * software distributed under the License is distributed on an
15*cde9e8dcSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*cde9e8dcSAndrew Rist  * KIND, either express or implied.  See the License for the
17*cde9e8dcSAndrew Rist  * specific language governing permissions and limitations
18*cde9e8dcSAndrew Rist  * under the License.
19*cde9e8dcSAndrew Rist  *
20*cde9e8dcSAndrew Rist  *************************************************************/
21*cde9e8dcSAndrew Rist 
22*cde9e8dcSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_chart2.hxx"
26cdf0e10cSrcweir #include "StatisticsItemConverter.hxx"
27cdf0e10cSrcweir #include "SchWhichPairs.hxx"
28cdf0e10cSrcweir #include "macros.hxx"
29cdf0e10cSrcweir #include "RegressionCurveHelper.hxx"
30cdf0e10cSrcweir #include "ItemPropertyMap.hxx"
31cdf0e10cSrcweir #include "ErrorBar.hxx"
32cdf0e10cSrcweir #include "PropertyHelper.hxx"
33cdf0e10cSrcweir #include "ChartModelHelper.hxx"
34cdf0e10cSrcweir #include "ChartTypeHelper.hxx"
35cdf0e10cSrcweir #include "StatisticsHelper.hxx"
36cdf0e10cSrcweir 
37cdf0e10cSrcweir #include "GraphicPropertyItemConverter.hxx"
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #include <svl/stritem.hxx>
40cdf0e10cSrcweir #include <svx/chrtitem.hxx>
41cdf0e10cSrcweir #include <svl/intitem.hxx>
42cdf0e10cSrcweir #include <rtl/math.hxx>
43cdf0e10cSrcweir 
44cdf0e10cSrcweir #include <com/sun/star/chart2/DataPointLabel.hpp>
45cdf0e10cSrcweir #include <com/sun/star/chart2/XInternalDataProvider.hpp>
46cdf0e10cSrcweir #include <com/sun/star/chart/ErrorBarStyle.hpp>
47cdf0e10cSrcweir #include <com/sun/star/lang/XServiceName.hpp>
48cdf0e10cSrcweir 
49cdf0e10cSrcweir #include <functional>
50cdf0e10cSrcweir #include <algorithm>
51cdf0e10cSrcweir #include <vector>
52cdf0e10cSrcweir 
53cdf0e10cSrcweir using namespace ::com::sun::star;
54cdf0e10cSrcweir 
55cdf0e10cSrcweir namespace
56cdf0e10cSrcweir {
57cdf0e10cSrcweir 
58cdf0e10cSrcweir uno::Reference< beans::XPropertySet > lcl_GetYErrorBar(
59cdf0e10cSrcweir     const uno::Reference< beans::XPropertySet > & xProp )
60cdf0e10cSrcweir {
61cdf0e10cSrcweir     uno::Reference< beans::XPropertySet > xResult;
62cdf0e10cSrcweir 
63cdf0e10cSrcweir     if( xProp.is())
64cdf0e10cSrcweir         try
65cdf0e10cSrcweir         {
66cdf0e10cSrcweir             ( xProp->getPropertyValue( C2U( "ErrorBarY" )) >>= xResult );
67cdf0e10cSrcweir         }
68cdf0e10cSrcweir         catch( uno::Exception & ex )
69cdf0e10cSrcweir         {
70cdf0e10cSrcweir             ASSERT_EXCEPTION( ex );
71cdf0e10cSrcweir         }
72cdf0e10cSrcweir 
73cdf0e10cSrcweir     return xResult;
74cdf0e10cSrcweir }
75cdf0e10cSrcweir 
76cdf0e10cSrcweir ::chart::RegressionCurveHelper::tRegressionType lcl_convertRegressionType( SvxChartRegress eRegress )
77cdf0e10cSrcweir {
78cdf0e10cSrcweir     ::chart::RegressionCurveHelper::tRegressionType eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_NONE;
79cdf0e10cSrcweir     switch( eRegress )
80cdf0e10cSrcweir     {
81cdf0e10cSrcweir         case CHREGRESS_LINEAR:
82cdf0e10cSrcweir             eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_LINEAR;
83cdf0e10cSrcweir             break;
84cdf0e10cSrcweir         case CHREGRESS_LOG:
85cdf0e10cSrcweir             eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_LOG;
86cdf0e10cSrcweir             break;
87cdf0e10cSrcweir         case CHREGRESS_EXP:
88cdf0e10cSrcweir             eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_EXP;
89cdf0e10cSrcweir             break;
90cdf0e10cSrcweir         case CHREGRESS_POWER:
91cdf0e10cSrcweir             eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_POWER;
92cdf0e10cSrcweir             break;
93cdf0e10cSrcweir         case CHREGRESS_NONE:
94cdf0e10cSrcweir             break;
95cdf0e10cSrcweir     }
96cdf0e10cSrcweir     return eType;
97cdf0e10cSrcweir }
98cdf0e10cSrcweir 
99cdf0e10cSrcweir 
100cdf0e10cSrcweir uno::Reference< beans::XPropertySet > lcl_GetDefaultErrorBar()
101cdf0e10cSrcweir {
102cdf0e10cSrcweir     // todo: use a valid context
103cdf0e10cSrcweir     return uno::Reference< beans::XPropertySet >(
104cdf0e10cSrcweir         ::chart::createErrorBar( uno::Reference< uno::XComponentContext >()));
105cdf0e10cSrcweir }
106cdf0e10cSrcweir 
107cdf0e10cSrcweir void lcl_getErrorValues( const uno::Reference< beans::XPropertySet > & xErrorBarProp,
108cdf0e10cSrcweir                     double & rOutPosError, double & rOutNegError )
109cdf0e10cSrcweir {
110cdf0e10cSrcweir     if( ! xErrorBarProp.is())
111cdf0e10cSrcweir         return;
112cdf0e10cSrcweir 
113cdf0e10cSrcweir     try
114cdf0e10cSrcweir     {
115cdf0e10cSrcweir         xErrorBarProp->getPropertyValue( C2U( "PositiveError" )) >>= rOutPosError;
116cdf0e10cSrcweir         xErrorBarProp->getPropertyValue( C2U( "NegativeError" )) >>= rOutNegError;
117cdf0e10cSrcweir     }
118cdf0e10cSrcweir     catch( uno::Exception & ex )
119cdf0e10cSrcweir     {
120cdf0e10cSrcweir         ASSERT_EXCEPTION( ex );
121cdf0e10cSrcweir     }
122cdf0e10cSrcweir }
123cdf0e10cSrcweir 
124cdf0e10cSrcweir void lcl_getErrorIndicatorValues(
125cdf0e10cSrcweir     const uno::Reference< beans::XPropertySet > & xErrorBarProp,
126cdf0e10cSrcweir     bool & rOutShowPosError, bool & rOutShowNegError )
127cdf0e10cSrcweir {
128cdf0e10cSrcweir     if( ! xErrorBarProp.is())
129cdf0e10cSrcweir         return;
130cdf0e10cSrcweir 
131cdf0e10cSrcweir     try
132cdf0e10cSrcweir     {
133cdf0e10cSrcweir         xErrorBarProp->getPropertyValue( C2U( "ShowPositiveError" )) >>= rOutShowPosError;
134cdf0e10cSrcweir         xErrorBarProp->getPropertyValue( C2U( "ShowNegativeError" )) >>= rOutShowNegError;
135cdf0e10cSrcweir     }
136cdf0e10cSrcweir     catch( uno::Exception & ex )
137cdf0e10cSrcweir     {
138cdf0e10cSrcweir         ASSERT_EXCEPTION( ex );
139cdf0e10cSrcweir     }
140cdf0e10cSrcweir }
141cdf0e10cSrcweir 
142cdf0e10cSrcweir uno::Reference< beans::XPropertySet > lcl_getEquationProperties(
143cdf0e10cSrcweir     const uno::Reference< beans::XPropertySet > & xSeriesPropSet, const SfxItemSet * pItemSet )
144cdf0e10cSrcweir {
145cdf0e10cSrcweir     bool bEquationExists = true;
146cdf0e10cSrcweir 
147cdf0e10cSrcweir     // ensure that a trendline is on
148cdf0e10cSrcweir     if( pItemSet )
149cdf0e10cSrcweir     {
150cdf0e10cSrcweir         SvxChartRegress eRegress = CHREGRESS_NONE;
151cdf0e10cSrcweir         const SfxPoolItem *pPoolItem = NULL;
152cdf0e10cSrcweir         if( pItemSet->GetItemState( SCHATTR_REGRESSION_TYPE, sal_True, &pPoolItem ) == SFX_ITEM_SET )
153cdf0e10cSrcweir         {
154cdf0e10cSrcweir             eRegress = static_cast< const SvxChartRegressItem * >( pPoolItem )->GetValue();
155cdf0e10cSrcweir             bEquationExists = ( eRegress != CHREGRESS_NONE );
156cdf0e10cSrcweir         }
157cdf0e10cSrcweir     }
158cdf0e10cSrcweir 
159cdf0e10cSrcweir     if( bEquationExists )
160cdf0e10cSrcweir     {
161cdf0e10cSrcweir         uno::Reference< chart2::XRegressionCurveContainer > xRegCnt( xSeriesPropSet, uno::UNO_QUERY );
162cdf0e10cSrcweir         uno::Reference< chart2::XRegressionCurve > xCurve(
163cdf0e10cSrcweir             ::chart::RegressionCurveHelper::getFirstCurveNotMeanValueLine( xRegCnt ));
164cdf0e10cSrcweir         if( xCurve.is())
165cdf0e10cSrcweir         {
166cdf0e10cSrcweir             return xCurve->getEquationProperties();
167cdf0e10cSrcweir         }
168cdf0e10cSrcweir     }
169cdf0e10cSrcweir 
170cdf0e10cSrcweir     return uno::Reference< beans::XPropertySet >();
171cdf0e10cSrcweir }
172cdf0e10cSrcweir 
173cdf0e10cSrcweir } // anonymous namespace
174cdf0e10cSrcweir 
175cdf0e10cSrcweir namespace chart
176cdf0e10cSrcweir {
177cdf0e10cSrcweir namespace wrapper
178cdf0e10cSrcweir {
179cdf0e10cSrcweir 
180cdf0e10cSrcweir StatisticsItemConverter::StatisticsItemConverter(
181cdf0e10cSrcweir     const uno::Reference< frame::XModel > & xModel,
182cdf0e10cSrcweir     const uno::Reference< beans::XPropertySet > & rPropertySet,
183cdf0e10cSrcweir     SfxItemPool& rItemPool ) :
184cdf0e10cSrcweir         ItemConverter( rPropertySet, rItemPool ),
185cdf0e10cSrcweir         m_xModel( xModel )
186cdf0e10cSrcweir {
187cdf0e10cSrcweir     OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_NONE ) ==
188cdf0e10cSrcweir                 static_cast< int >( CHREGRESS_NONE ));
189cdf0e10cSrcweir     OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_LINEAR ) ==
190cdf0e10cSrcweir                 static_cast< int >( CHREGRESS_LINEAR ));
191cdf0e10cSrcweir     OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_LOG ) ==
192cdf0e10cSrcweir                 static_cast< int >( CHREGRESS_LOG ));
193cdf0e10cSrcweir     OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_EXP ) ==
194cdf0e10cSrcweir                 static_cast< int >( CHREGRESS_EXP ));
195cdf0e10cSrcweir     OSL_ASSERT( static_cast< int >( RegressionCurveHelper::REGRESSION_TYPE_POWER ) ==
196cdf0e10cSrcweir                 static_cast< int >( CHREGRESS_POWER ));
197cdf0e10cSrcweir }
198cdf0e10cSrcweir 
199cdf0e10cSrcweir StatisticsItemConverter::~StatisticsItemConverter()
200cdf0e10cSrcweir {}
201cdf0e10cSrcweir 
202cdf0e10cSrcweir const sal_uInt16 * StatisticsItemConverter::GetWhichPairs() const
203cdf0e10cSrcweir {
204cdf0e10cSrcweir     // must span all used items!
205cdf0e10cSrcweir     return nStatWhichPairs;
206cdf0e10cSrcweir }
207cdf0e10cSrcweir 
208cdf0e10cSrcweir bool StatisticsItemConverter::GetItemProperty(
209cdf0e10cSrcweir     tWhichIdType /* nWhichId */,
210cdf0e10cSrcweir     tPropertyNameWithMemberId & /* rOutProperty */ ) const
211cdf0e10cSrcweir {
212cdf0e10cSrcweir     return false;
213cdf0e10cSrcweir }
214cdf0e10cSrcweir 
215cdf0e10cSrcweir bool StatisticsItemConverter::ApplySpecialItem(
216cdf0e10cSrcweir     sal_uInt16 nWhichId, const SfxItemSet & rItemSet )
217cdf0e10cSrcweir     throw( uno::Exception )
218cdf0e10cSrcweir {
219cdf0e10cSrcweir     bool bChanged = false;
220cdf0e10cSrcweir     uno::Any aValue;
221cdf0e10cSrcweir 
222cdf0e10cSrcweir     switch( nWhichId )
223cdf0e10cSrcweir     {
224cdf0e10cSrcweir         case SCHATTR_STAT_AVERAGE:
225cdf0e10cSrcweir         {
226cdf0e10cSrcweir             uno::Reference< chart2::XRegressionCurveContainer > xRegCnt(
227cdf0e10cSrcweir                 GetPropertySet(), uno::UNO_QUERY );
228cdf0e10cSrcweir             bool bOldHasMeanValueLine = RegressionCurveHelper::hasMeanValueLine( xRegCnt );
229cdf0e10cSrcweir 
230cdf0e10cSrcweir             bool bNewHasMeanValueLine =
231cdf0e10cSrcweir                 static_cast< const SfxBoolItem & >( rItemSet.Get( nWhichId )).GetValue();
232cdf0e10cSrcweir 
233cdf0e10cSrcweir             if( bOldHasMeanValueLine != bNewHasMeanValueLine )
234cdf0e10cSrcweir             {
235cdf0e10cSrcweir                 if( ! bNewHasMeanValueLine )
236cdf0e10cSrcweir                     RegressionCurveHelper::removeMeanValueLine( xRegCnt );
237cdf0e10cSrcweir                 else
238cdf0e10cSrcweir                     RegressionCurveHelper::addMeanValueLine(
239cdf0e10cSrcweir                         xRegCnt, uno::Reference< uno::XComponentContext >(), GetPropertySet() );
240cdf0e10cSrcweir                 bChanged = true;
241cdf0e10cSrcweir             }
242cdf0e10cSrcweir         }
243cdf0e10cSrcweir         break;
244cdf0e10cSrcweir 
245cdf0e10cSrcweir         // Attention !!! This case must be passed before SCHATTR_STAT_PERCENT,
246cdf0e10cSrcweir         // SCHATTR_STAT_BIGERROR, SCHATTR_STAT_CONSTPLUS,
247cdf0e10cSrcweir         // SCHATTR_STAT_CONSTMINUS and SCHATTR_STAT_INDICATE
248cdf0e10cSrcweir         case SCHATTR_STAT_KIND_ERROR:
249cdf0e10cSrcweir         {
250cdf0e10cSrcweir             uno::Reference< beans::XPropertySet > xErrorBarProp(
251cdf0e10cSrcweir                 lcl_GetYErrorBar( GetPropertySet() ));
252cdf0e10cSrcweir 
253cdf0e10cSrcweir             SvxChartKindError eErrorKind =
254cdf0e10cSrcweir                 static_cast< const SvxChartKindErrorItem & >(
255cdf0e10cSrcweir                     rItemSet.Get( nWhichId )).GetValue();
256cdf0e10cSrcweir 
257cdf0e10cSrcweir             if( !xErrorBarProp.is() && eErrorKind == CHERROR_NONE)
258cdf0e10cSrcweir             {
259cdf0e10cSrcweir                 //nothing to do
260cdf0e10cSrcweir             }
261cdf0e10cSrcweir             else
262cdf0e10cSrcweir             {
263cdf0e10cSrcweir                 sal_Int32 nStyle = ::com::sun::star::chart::ErrorBarStyle::NONE;
264cdf0e10cSrcweir 
265cdf0e10cSrcweir                 switch( eErrorKind )
266cdf0e10cSrcweir                 {
267cdf0e10cSrcweir                     case CHERROR_NONE:
268cdf0e10cSrcweir                         nStyle = ::com::sun::star::chart::ErrorBarStyle::NONE; break;
269cdf0e10cSrcweir                     case CHERROR_VARIANT:
270cdf0e10cSrcweir                         nStyle = ::com::sun::star::chart::ErrorBarStyle::VARIANCE; break;
271cdf0e10cSrcweir                     case CHERROR_SIGMA:
272cdf0e10cSrcweir                         nStyle = ::com::sun::star::chart::ErrorBarStyle::STANDARD_DEVIATION; break;
273cdf0e10cSrcweir                     case CHERROR_PERCENT:
274cdf0e10cSrcweir                         nStyle = ::com::sun::star::chart::ErrorBarStyle::RELATIVE; break;
275cdf0e10cSrcweir                     case CHERROR_BIGERROR:
276cdf0e10cSrcweir                         nStyle = ::com::sun::star::chart::ErrorBarStyle::ERROR_MARGIN; break;
277cdf0e10cSrcweir                     case CHERROR_CONST:
278cdf0e10cSrcweir                         nStyle = ::com::sun::star::chart::ErrorBarStyle::ABSOLUTE; break;
279cdf0e10cSrcweir                     case CHERROR_STDERROR:
280cdf0e10cSrcweir                         nStyle = ::com::sun::star::chart::ErrorBarStyle::STANDARD_ERROR; break;
281cdf0e10cSrcweir                     case CHERROR_RANGE:
282cdf0e10cSrcweir                         nStyle = ::com::sun::star::chart::ErrorBarStyle::FROM_DATA; break;
283cdf0e10cSrcweir                 }
284cdf0e10cSrcweir 
285cdf0e10cSrcweir                 if( !xErrorBarProp.is() )
286cdf0e10cSrcweir                 {
287cdf0e10cSrcweir                     xErrorBarProp = lcl_GetDefaultErrorBar();
288cdf0e10cSrcweir                     GetPropertySet()->setPropertyValue(
289cdf0e10cSrcweir                         C2U( "ErrorBarY" ), uno::makeAny( xErrorBarProp ));
290cdf0e10cSrcweir                 }
291cdf0e10cSrcweir 
292cdf0e10cSrcweir                 xErrorBarProp->setPropertyValue( C2U( "ErrorBarStyle" ),
293cdf0e10cSrcweir                                                     uno::makeAny( nStyle ));
294cdf0e10cSrcweir                 bChanged = true;
295cdf0e10cSrcweir             }
296cdf0e10cSrcweir         }
297cdf0e10cSrcweir         break;
298cdf0e10cSrcweir 
299cdf0e10cSrcweir         case SCHATTR_STAT_PERCENT:
300cdf0e10cSrcweir         case SCHATTR_STAT_BIGERROR:
301cdf0e10cSrcweir         {
302cdf0e10cSrcweir             OSL_ENSURE( false, "Deprectaed item" );
303cdf0e10cSrcweir             uno::Reference< beans::XPropertySet > xErrorBarProp(
304cdf0e10cSrcweir                 lcl_GetYErrorBar( GetPropertySet()));
305cdf0e10cSrcweir             bool bOldHasErrorBar = xErrorBarProp.is();
306cdf0e10cSrcweir 
307cdf0e10cSrcweir             double fValue =
308cdf0e10cSrcweir                 static_cast< const SvxDoubleItem & >(
309cdf0e10cSrcweir                     rItemSet.Get( nWhichId )).GetValue();
310cdf0e10cSrcweir             double fPos, fNeg;
311cdf0e10cSrcweir             lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
312cdf0e10cSrcweir 
313cdf0e10cSrcweir             if( bOldHasErrorBar &&
314cdf0e10cSrcweir                 ! ( ::rtl::math::approxEqual( fPos, fValue ) &&
315cdf0e10cSrcweir                     ::rtl::math::approxEqual( fNeg, fValue )))
316cdf0e10cSrcweir             {
317cdf0e10cSrcweir                 xErrorBarProp->setPropertyValue( C2U( "PositiveError" ),
318cdf0e10cSrcweir                                                     uno::makeAny( fValue ));
319cdf0e10cSrcweir                 xErrorBarProp->setPropertyValue( C2U( "NegativeError" ),
320cdf0e10cSrcweir                                                     uno::makeAny( fValue ));
321cdf0e10cSrcweir                 bChanged = true;
322cdf0e10cSrcweir             }
323cdf0e10cSrcweir         }
324cdf0e10cSrcweir         break;
325cdf0e10cSrcweir 
326cdf0e10cSrcweir         case SCHATTR_STAT_CONSTPLUS:
327cdf0e10cSrcweir         {
328cdf0e10cSrcweir             uno::Reference< beans::XPropertySet > xErrorBarProp(
329cdf0e10cSrcweir                 lcl_GetYErrorBar( GetPropertySet()));
330cdf0e10cSrcweir             bool bOldHasErrorBar = xErrorBarProp.is();
331cdf0e10cSrcweir 
332cdf0e10cSrcweir             double fValue =
333cdf0e10cSrcweir                 static_cast< const SvxDoubleItem & >(
334cdf0e10cSrcweir                     rItemSet.Get( nWhichId )).GetValue();
335cdf0e10cSrcweir             double fPos, fNeg;
336cdf0e10cSrcweir             lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
337cdf0e10cSrcweir 
338cdf0e10cSrcweir             if( bOldHasErrorBar &&
339cdf0e10cSrcweir                 ! ::rtl::math::approxEqual( fPos, fValue ))
340cdf0e10cSrcweir             {
341cdf0e10cSrcweir                 xErrorBarProp->setPropertyValue( C2U( "PositiveError" ), uno::makeAny( fValue ));
342cdf0e10cSrcweir                 bChanged = true;
343cdf0e10cSrcweir             }
344cdf0e10cSrcweir         }
345cdf0e10cSrcweir         break;
346cdf0e10cSrcweir 
347cdf0e10cSrcweir         case SCHATTR_STAT_CONSTMINUS:
348cdf0e10cSrcweir         {
349cdf0e10cSrcweir             uno::Reference< beans::XPropertySet > xErrorBarProp(
350cdf0e10cSrcweir                 lcl_GetYErrorBar( GetPropertySet()));
351cdf0e10cSrcweir             bool bOldHasErrorBar = xErrorBarProp.is();
352cdf0e10cSrcweir 
353cdf0e10cSrcweir             double fValue =
354cdf0e10cSrcweir                 static_cast< const SvxDoubleItem & >(
355cdf0e10cSrcweir                     rItemSet.Get( nWhichId )).GetValue();
356cdf0e10cSrcweir             double fPos, fNeg;
357cdf0e10cSrcweir             lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
358cdf0e10cSrcweir 
359cdf0e10cSrcweir             if( bOldHasErrorBar &&
360cdf0e10cSrcweir                 ! ::rtl::math::approxEqual( fNeg, fValue ))
361cdf0e10cSrcweir             {
362cdf0e10cSrcweir                 xErrorBarProp->setPropertyValue( C2U( "NegativeError" ), uno::makeAny( fValue ));
363cdf0e10cSrcweir                 bChanged = true;
364cdf0e10cSrcweir             }
365cdf0e10cSrcweir         }
366cdf0e10cSrcweir         break;
367cdf0e10cSrcweir 
368cdf0e10cSrcweir         case SCHATTR_REGRESSION_TYPE:
369cdf0e10cSrcweir         {
370cdf0e10cSrcweir             SvxChartRegress eRegress =
371cdf0e10cSrcweir                 static_cast< const SvxChartRegressItem & >(
372cdf0e10cSrcweir                     rItemSet.Get( nWhichId )).GetValue();
373cdf0e10cSrcweir 
374cdf0e10cSrcweir             uno::Reference< chart2::XRegressionCurveContainer > xRegCnt(
375cdf0e10cSrcweir                 GetPropertySet(), uno::UNO_QUERY );
376cdf0e10cSrcweir 
377cdf0e10cSrcweir             if( eRegress == CHREGRESS_NONE )
378cdf0e10cSrcweir             {
379cdf0e10cSrcweir                 bChanged = RegressionCurveHelper::removeAllExceptMeanValueLine( xRegCnt );
380cdf0e10cSrcweir             }
381cdf0e10cSrcweir             else
382cdf0e10cSrcweir             {
383cdf0e10cSrcweir                 SvxChartRegress eOldRegress(
384cdf0e10cSrcweir                     static_cast< SvxChartRegress >(
385cdf0e10cSrcweir                         static_cast< sal_Int32 >(
386cdf0e10cSrcweir                             RegressionCurveHelper::getFirstRegressTypeNotMeanValueLine( xRegCnt ))));
387cdf0e10cSrcweir                 if( eOldRegress != eRegress )
388cdf0e10cSrcweir                 {
389cdf0e10cSrcweir                     RegressionCurveHelper::replaceOrAddCurveAndReduceToOne(
390cdf0e10cSrcweir                         lcl_convertRegressionType( eRegress ), xRegCnt,
391cdf0e10cSrcweir                         uno::Reference< uno::XComponentContext >());
392cdf0e10cSrcweir                     bChanged = true;
393cdf0e10cSrcweir                 }
394cdf0e10cSrcweir             }
395cdf0e10cSrcweir         }
396cdf0e10cSrcweir         break;
397cdf0e10cSrcweir 
398cdf0e10cSrcweir         case SCHATTR_REGRESSION_SHOW_EQUATION:
399cdf0e10cSrcweir         {
400cdf0e10cSrcweir             uno::Reference< beans::XPropertySet > xEqProp( lcl_getEquationProperties( GetPropertySet(), &rItemSet ));
401cdf0e10cSrcweir             if( xEqProp.is())
402cdf0e10cSrcweir             {
403cdf0e10cSrcweir                 bool bShowEq = false;
404cdf0e10cSrcweir                 xEqProp->getPropertyValue( C2U("ShowEquation")) >>= bShowEq;
405cdf0e10cSrcweir                 bool bNewShowEq =
406cdf0e10cSrcweir                     static_cast< const SfxBoolItem & >( rItemSet.Get( nWhichId )).GetValue();
407cdf0e10cSrcweir                 if( bShowEq != bNewShowEq )
408cdf0e10cSrcweir                 {
409cdf0e10cSrcweir                     xEqProp->setPropertyValue( C2U("ShowEquation"), uno::makeAny( bNewShowEq ));
410cdf0e10cSrcweir                     bChanged = true;
411cdf0e10cSrcweir                 }
412cdf0e10cSrcweir             }
413cdf0e10cSrcweir         }
414cdf0e10cSrcweir         break;
415cdf0e10cSrcweir 
416cdf0e10cSrcweir         case SCHATTR_REGRESSION_SHOW_COEFF:
417cdf0e10cSrcweir         {
418cdf0e10cSrcweir             uno::Reference< beans::XPropertySet > xEqProp( lcl_getEquationProperties( GetPropertySet(), &rItemSet ));
419cdf0e10cSrcweir             if( xEqProp.is())
420cdf0e10cSrcweir             {
421cdf0e10cSrcweir                 bool bShowCoeff = false;
422cdf0e10cSrcweir                 xEqProp->getPropertyValue( C2U("ShowCorrelationCoefficient")) >>= bShowCoeff;
423cdf0e10cSrcweir                 bool bNewShowCoeff =
424cdf0e10cSrcweir                     static_cast< const SfxBoolItem & >( rItemSet.Get( nWhichId )).GetValue();
425cdf0e10cSrcweir                 if( bShowCoeff != bNewShowCoeff )
426cdf0e10cSrcweir                 {
427cdf0e10cSrcweir                     xEqProp->setPropertyValue( C2U("ShowCorrelationCoefficient"), uno::makeAny( bNewShowCoeff ));
428cdf0e10cSrcweir                     bChanged = true;
429cdf0e10cSrcweir                 }
430cdf0e10cSrcweir             }
431cdf0e10cSrcweir         }
432cdf0e10cSrcweir         break;
433cdf0e10cSrcweir 
434cdf0e10cSrcweir         case SCHATTR_STAT_INDICATE:
435cdf0e10cSrcweir         {
436cdf0e10cSrcweir             uno::Reference< beans::XPropertySet > xErrorBarProp(
437cdf0e10cSrcweir                 lcl_GetYErrorBar( GetPropertySet()));
438cdf0e10cSrcweir             bool bOldHasErrorBar = xErrorBarProp.is();
439cdf0e10cSrcweir 
440cdf0e10cSrcweir             SvxChartIndicate eIndicate =
441cdf0e10cSrcweir                 static_cast< const SvxChartIndicateItem & >(
442cdf0e10cSrcweir                     rItemSet.Get( nWhichId )).GetValue();
443cdf0e10cSrcweir 
444cdf0e10cSrcweir             bool bNewIndPos = (eIndicate == CHINDICATE_BOTH || eIndicate == CHINDICATE_UP );
445cdf0e10cSrcweir             bool bNewIndNeg = (eIndicate == CHINDICATE_BOTH || eIndicate == CHINDICATE_DOWN );
446cdf0e10cSrcweir 
447cdf0e10cSrcweir             bool bShowPos, bShowNeg;
448cdf0e10cSrcweir             lcl_getErrorIndicatorValues( xErrorBarProp, bShowPos, bShowNeg );
449cdf0e10cSrcweir 
450cdf0e10cSrcweir             if( bOldHasErrorBar &&
451cdf0e10cSrcweir                 ( bShowPos != bNewIndPos ||
452cdf0e10cSrcweir                   bShowNeg != bNewIndNeg ))
453cdf0e10cSrcweir             {
454cdf0e10cSrcweir                 xErrorBarProp->setPropertyValue( C2U( "ShowPositiveError" ), uno::makeAny( bNewIndPos ));
455cdf0e10cSrcweir                 xErrorBarProp->setPropertyValue( C2U( "ShowNegativeError" ), uno::makeAny( bNewIndNeg ));
456cdf0e10cSrcweir                 bChanged = true;
457cdf0e10cSrcweir             }
458cdf0e10cSrcweir         }
459cdf0e10cSrcweir         break;
460cdf0e10cSrcweir 
461cdf0e10cSrcweir         case SCHATTR_STAT_RANGE_POS:
462cdf0e10cSrcweir         case SCHATTR_STAT_RANGE_NEG:
463cdf0e10cSrcweir         {
464cdf0e10cSrcweir             // @todo: also be able to deal with x-error bars
465cdf0e10cSrcweir             const bool bYError = true;
466cdf0e10cSrcweir             uno::Reference< chart2::data::XDataSource > xErrorBarSource( lcl_GetYErrorBar( GetPropertySet()), uno::UNO_QUERY );
467cdf0e10cSrcweir             uno::Reference< chart2::XChartDocument > xChartDoc( m_xModel, uno::UNO_QUERY );
468cdf0e10cSrcweir             uno::Reference< chart2::data::XDataProvider > xDataProvider;
469cdf0e10cSrcweir 
470cdf0e10cSrcweir             if( xChartDoc.is())
471cdf0e10cSrcweir                 xDataProvider.set( xChartDoc->getDataProvider());
472cdf0e10cSrcweir             if( xErrorBarSource.is() && xDataProvider.is())
473cdf0e10cSrcweir             {
474cdf0e10cSrcweir                 ::rtl::OUString aNewRange( static_cast< const SfxStringItem & >( rItemSet.Get( nWhichId )).GetValue());
475cdf0e10cSrcweir                 bool bApplyNewRange = false;
476cdf0e10cSrcweir 
477cdf0e10cSrcweir                 bool bIsPositiveValue( nWhichId == SCHATTR_STAT_RANGE_POS );
478cdf0e10cSrcweir                 if( xChartDoc->hasInternalDataProvider())
479cdf0e10cSrcweir                 {
480cdf0e10cSrcweir                     if( aNewRange.getLength())
481cdf0e10cSrcweir                     {
482cdf0e10cSrcweir                         uno::Reference< chart2::data::XDataSequence > xSeq(
483cdf0e10cSrcweir                             StatisticsHelper::getErrorDataSequenceFromDataSource(
484cdf0e10cSrcweir                                 xErrorBarSource, bIsPositiveValue, bYError ));
485cdf0e10cSrcweir                         if( ! xSeq.is())
486cdf0e10cSrcweir                         {
487cdf0e10cSrcweir                             // no data range for error bars yet => create
488cdf0e10cSrcweir                             uno::Reference< chart2::XInternalDataProvider > xIntDataProvider( xDataProvider, uno::UNO_QUERY );
489cdf0e10cSrcweir                             OSL_ASSERT( xIntDataProvider.is());
490cdf0e10cSrcweir                             if( xIntDataProvider.is())
491cdf0e10cSrcweir                             {
492cdf0e10cSrcweir                                 xIntDataProvider->appendSequence();
493cdf0e10cSrcweir                                 aNewRange = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("last"));
494cdf0e10cSrcweir                                 bApplyNewRange = true;
495cdf0e10cSrcweir                             }
496cdf0e10cSrcweir                         }
497cdf0e10cSrcweir                     }
498cdf0e10cSrcweir                 }
499cdf0e10cSrcweir                 else
500cdf0e10cSrcweir                 {
501cdf0e10cSrcweir                     uno::Reference< chart2::data::XDataSequence > xSeq(
502cdf0e10cSrcweir                         StatisticsHelper::getErrorDataSequenceFromDataSource(
503cdf0e10cSrcweir                             xErrorBarSource, bIsPositiveValue, bYError ));
504cdf0e10cSrcweir                     bApplyNewRange =
505cdf0e10cSrcweir                         ! ( xSeq.is() && aNewRange.equals( xSeq->getSourceRangeRepresentation()));
506cdf0e10cSrcweir                 }
507cdf0e10cSrcweir 
508cdf0e10cSrcweir                 if( bApplyNewRange )
509cdf0e10cSrcweir                     StatisticsHelper::setErrorDataSequence(
510cdf0e10cSrcweir                         xErrorBarSource, xDataProvider, aNewRange, bIsPositiveValue, bYError );
511cdf0e10cSrcweir             }
512cdf0e10cSrcweir         }
513cdf0e10cSrcweir         break;
514cdf0e10cSrcweir     }
515cdf0e10cSrcweir 
516cdf0e10cSrcweir     return bChanged;
517cdf0e10cSrcweir }
518cdf0e10cSrcweir 
519cdf0e10cSrcweir void StatisticsItemConverter::FillSpecialItem(
520cdf0e10cSrcweir     sal_uInt16 nWhichId, SfxItemSet & rOutItemSet ) const
521cdf0e10cSrcweir     throw( uno::Exception )
522cdf0e10cSrcweir {
523cdf0e10cSrcweir     switch( nWhichId )
524cdf0e10cSrcweir     {
525cdf0e10cSrcweir         case SCHATTR_STAT_AVERAGE:
526cdf0e10cSrcweir             rOutItemSet.Put(
527cdf0e10cSrcweir                 SfxBoolItem( nWhichId,
528cdf0e10cSrcweir                              RegressionCurveHelper::hasMeanValueLine(
529cdf0e10cSrcweir                                  uno::Reference< chart2::XRegressionCurveContainer >(
530cdf0e10cSrcweir                                      GetPropertySet(), uno::UNO_QUERY ))));
531cdf0e10cSrcweir             break;
532cdf0e10cSrcweir 
533cdf0e10cSrcweir         case SCHATTR_STAT_KIND_ERROR:
534cdf0e10cSrcweir         {
535cdf0e10cSrcweir             SvxChartKindError eErrorKind = CHERROR_NONE;
536cdf0e10cSrcweir             uno::Reference< beans::XPropertySet > xErrorBarProp(
537cdf0e10cSrcweir                 lcl_GetYErrorBar( GetPropertySet()));
538cdf0e10cSrcweir             if( xErrorBarProp.is() )
539cdf0e10cSrcweir             {
540cdf0e10cSrcweir                 sal_Int32 nStyle = 0;
541cdf0e10cSrcweir                 if( xErrorBarProp->getPropertyValue( C2U( "ErrorBarStyle" )) >>= nStyle )
542cdf0e10cSrcweir                 {
543cdf0e10cSrcweir                     switch( nStyle )
544cdf0e10cSrcweir                     {
545cdf0e10cSrcweir                         case ::com::sun::star::chart::ErrorBarStyle::NONE:
546cdf0e10cSrcweir                             break;
547cdf0e10cSrcweir                         case ::com::sun::star::chart::ErrorBarStyle::VARIANCE:
548cdf0e10cSrcweir                             eErrorKind = CHERROR_VARIANT; break;
549cdf0e10cSrcweir                         case ::com::sun::star::chart::ErrorBarStyle::STANDARD_DEVIATION:
550cdf0e10cSrcweir                             eErrorKind = CHERROR_SIGMA; break;
551cdf0e10cSrcweir                         case ::com::sun::star::chart::ErrorBarStyle::ABSOLUTE:
552cdf0e10cSrcweir                             eErrorKind = CHERROR_CONST; break;
553cdf0e10cSrcweir                         case ::com::sun::star::chart::ErrorBarStyle::RELATIVE:
554cdf0e10cSrcweir                             eErrorKind = CHERROR_PERCENT; break;
555cdf0e10cSrcweir                         case ::com::sun::star::chart::ErrorBarStyle::ERROR_MARGIN:
556cdf0e10cSrcweir                             eErrorKind = CHERROR_BIGERROR; break;
557cdf0e10cSrcweir                         case ::com::sun::star::chart::ErrorBarStyle::STANDARD_ERROR:
558cdf0e10cSrcweir                             eErrorKind = CHERROR_STDERROR; break;
559cdf0e10cSrcweir                         case ::com::sun::star::chart::ErrorBarStyle::FROM_DATA:
560cdf0e10cSrcweir                             eErrorKind = CHERROR_RANGE; break;
561cdf0e10cSrcweir                     }
562cdf0e10cSrcweir                 }
563cdf0e10cSrcweir             }
564cdf0e10cSrcweir             rOutItemSet.Put( SvxChartKindErrorItem( eErrorKind, SCHATTR_STAT_KIND_ERROR ));
565cdf0e10cSrcweir         }
566cdf0e10cSrcweir         break;
567cdf0e10cSrcweir 
568cdf0e10cSrcweir         case SCHATTR_STAT_PERCENT:
569cdf0e10cSrcweir         {
570cdf0e10cSrcweir             uno::Reference< beans::XPropertySet > xErrorBarProp( lcl_GetYErrorBar( GetPropertySet()));
571cdf0e10cSrcweir             if( xErrorBarProp.is())
572cdf0e10cSrcweir             {
573cdf0e10cSrcweir                 double fPos, fNeg;
574cdf0e10cSrcweir                 lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
575cdf0e10cSrcweir                 rOutItemSet.Put( SvxDoubleItem( ( fPos + fNeg ) / 2.0, nWhichId ));
576cdf0e10cSrcweir             }
577cdf0e10cSrcweir         }
578cdf0e10cSrcweir         break;
579cdf0e10cSrcweir 
580cdf0e10cSrcweir         case SCHATTR_STAT_BIGERROR:
581cdf0e10cSrcweir         {
582cdf0e10cSrcweir             uno::Reference< beans::XPropertySet > xErrorBarProp( lcl_GetYErrorBar( GetPropertySet()));
583cdf0e10cSrcweir             if( xErrorBarProp.is())
584cdf0e10cSrcweir             {
585cdf0e10cSrcweir                 double fPos, fNeg;
586cdf0e10cSrcweir                 lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
587cdf0e10cSrcweir                 rOutItemSet.Put( SvxDoubleItem( ( fPos + fNeg ) / 2.0, nWhichId ));
588cdf0e10cSrcweir             }
589cdf0e10cSrcweir         }
590cdf0e10cSrcweir         break;
591cdf0e10cSrcweir 
592cdf0e10cSrcweir         case SCHATTR_STAT_CONSTPLUS:
593cdf0e10cSrcweir         {
594cdf0e10cSrcweir             uno::Reference< beans::XPropertySet > xErrorBarProp( lcl_GetYErrorBar( GetPropertySet()));
595cdf0e10cSrcweir             if( xErrorBarProp.is())
596cdf0e10cSrcweir             {
597cdf0e10cSrcweir                 double fPos, fNeg;
598cdf0e10cSrcweir                 lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
599cdf0e10cSrcweir                 rOutItemSet.Put( SvxDoubleItem( fPos, nWhichId ));
600cdf0e10cSrcweir             }
601cdf0e10cSrcweir         }
602cdf0e10cSrcweir         break;
603cdf0e10cSrcweir 
604cdf0e10cSrcweir         case SCHATTR_STAT_CONSTMINUS:
605cdf0e10cSrcweir         {
606cdf0e10cSrcweir             uno::Reference< beans::XPropertySet > xErrorBarProp( lcl_GetYErrorBar( GetPropertySet()));
607cdf0e10cSrcweir             if( xErrorBarProp.is())
608cdf0e10cSrcweir             {
609cdf0e10cSrcweir                 double fPos, fNeg;
610cdf0e10cSrcweir                 lcl_getErrorValues( xErrorBarProp, fPos, fNeg );
611cdf0e10cSrcweir                 rOutItemSet.Put( SvxDoubleItem( fNeg, nWhichId ));
612cdf0e10cSrcweir             }
613cdf0e10cSrcweir         }
614cdf0e10cSrcweir         break;
615cdf0e10cSrcweir 
616cdf0e10cSrcweir         case SCHATTR_REGRESSION_TYPE:
617cdf0e10cSrcweir         {
618cdf0e10cSrcweir             SvxChartRegress eRegress = static_cast< SvxChartRegress >(
619cdf0e10cSrcweir                 static_cast< sal_Int32 >(
620cdf0e10cSrcweir                     RegressionCurveHelper::getFirstRegressTypeNotMeanValueLine(
621cdf0e10cSrcweir                         uno::Reference< chart2::XRegressionCurveContainer >(
622cdf0e10cSrcweir                             GetPropertySet(), uno::UNO_QUERY ) )));
623cdf0e10cSrcweir             rOutItemSet.Put( SvxChartRegressItem( eRegress, SCHATTR_REGRESSION_TYPE ));
624cdf0e10cSrcweir         }
625cdf0e10cSrcweir         break;
626cdf0e10cSrcweir 
627cdf0e10cSrcweir         case SCHATTR_REGRESSION_SHOW_EQUATION:
628cdf0e10cSrcweir         {
629cdf0e10cSrcweir             bool bShowEq = false;
630cdf0e10cSrcweir             uno::Reference< beans::XPropertySet > xEqProp( lcl_getEquationProperties( GetPropertySet(), 0 ));
631cdf0e10cSrcweir             if( xEqProp.is())
632cdf0e10cSrcweir                 xEqProp->getPropertyValue( C2U("ShowEquation")) >>= bShowEq;
633cdf0e10cSrcweir             rOutItemSet.Put( SfxBoolItem( nWhichId, bShowEq ));
634cdf0e10cSrcweir         }
635cdf0e10cSrcweir         break;
636cdf0e10cSrcweir 
637cdf0e10cSrcweir         case SCHATTR_REGRESSION_SHOW_COEFF:
638cdf0e10cSrcweir         {
639cdf0e10cSrcweir             bool bShowCoeff = false;
640cdf0e10cSrcweir             uno::Reference< beans::XPropertySet > xEqProp( lcl_getEquationProperties( GetPropertySet(), 0 ));
641cdf0e10cSrcweir             if( xEqProp.is())
642cdf0e10cSrcweir                 xEqProp->getPropertyValue( C2U("ShowCorrelationCoefficient")) >>= bShowCoeff;
643cdf0e10cSrcweir             rOutItemSet.Put( SfxBoolItem( nWhichId, bShowCoeff ));
644cdf0e10cSrcweir         }
645cdf0e10cSrcweir         break;
646cdf0e10cSrcweir 
647cdf0e10cSrcweir         case SCHATTR_STAT_INDICATE:
648cdf0e10cSrcweir         {
649cdf0e10cSrcweir             uno::Reference< beans::XPropertySet > xErrorBarProp( lcl_GetYErrorBar( GetPropertySet()));
650cdf0e10cSrcweir             SvxChartIndicate eIndicate = CHINDICATE_BOTH;
651cdf0e10cSrcweir             if( xErrorBarProp.is())
652cdf0e10cSrcweir             {
653cdf0e10cSrcweir                 bool bShowPos, bShowNeg;
654cdf0e10cSrcweir                 lcl_getErrorIndicatorValues( xErrorBarProp, bShowPos, bShowNeg );
655cdf0e10cSrcweir 
656cdf0e10cSrcweir                 if( bShowPos )
657cdf0e10cSrcweir                 {
658cdf0e10cSrcweir                     if( bShowNeg )
659cdf0e10cSrcweir                         eIndicate = CHINDICATE_BOTH;
660cdf0e10cSrcweir                     else
661cdf0e10cSrcweir                         eIndicate = CHINDICATE_UP;
662cdf0e10cSrcweir                 }
663cdf0e10cSrcweir                 else
664cdf0e10cSrcweir                 {
665cdf0e10cSrcweir                     if( bShowNeg )
666cdf0e10cSrcweir                         eIndicate = CHINDICATE_DOWN;
667cdf0e10cSrcweir                     else
668cdf0e10cSrcweir                         eIndicate = CHINDICATE_NONE;
669cdf0e10cSrcweir                 }
670cdf0e10cSrcweir             }
671cdf0e10cSrcweir             rOutItemSet.Put( SvxChartIndicateItem( eIndicate, SCHATTR_STAT_INDICATE ));
672cdf0e10cSrcweir         }
673cdf0e10cSrcweir         break;
674cdf0e10cSrcweir 
675cdf0e10cSrcweir         case SCHATTR_STAT_RANGE_POS:
676cdf0e10cSrcweir         case SCHATTR_STAT_RANGE_NEG:
677cdf0e10cSrcweir         {
678cdf0e10cSrcweir             uno::Reference< chart2::data::XDataSource > xErrorBarSource( lcl_GetYErrorBar( GetPropertySet()), uno::UNO_QUERY );
679cdf0e10cSrcweir             if( xErrorBarSource.is())
680cdf0e10cSrcweir             {
681cdf0e10cSrcweir                 uno::Reference< chart2::data::XDataSequence > xSeq(
682cdf0e10cSrcweir                     StatisticsHelper::getErrorDataSequenceFromDataSource(
683cdf0e10cSrcweir                         xErrorBarSource, (nWhichId == SCHATTR_STAT_RANGE_POS) /*, true */ /* y */ ));
684cdf0e10cSrcweir                 if( xSeq.is())
685cdf0e10cSrcweir                     rOutItemSet.Put( SfxStringItem( nWhichId, String( xSeq->getSourceRangeRepresentation())));
686cdf0e10cSrcweir             }
687cdf0e10cSrcweir         }
688cdf0e10cSrcweir         break;
689cdf0e10cSrcweir    }
690cdf0e10cSrcweir }
691cdf0e10cSrcweir 
692cdf0e10cSrcweir } //  namespace wrapper
693cdf0e10cSrcweir } //  namespace chart
694