1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_chart2.hxx" 26 #include "RegressionCurveHelper.hxx" 27 #include "RegressionCurveItemConverter.hxx" 28 #include "SchWhichPairs.hxx" 29 #include "macros.hxx" 30 #include "ItemPropertyMap.hxx" 31 #include "GraphicPropertyItemConverter.hxx" 32 33 #include <com/sun/star/chart2/XRegressionCurve.hpp> 34 35 // for SfxBoolItem 36 #include <svl/eitem.hxx> 37 #include <svx/chrtitem.hxx> 38 39 #include <functional> 40 #include <algorithm> 41 42 using namespace ::com::sun::star; 43 44 namespace 45 { 46 47 ::chart::RegressionCurveHelper::tRegressionType lcl_convertRegressionType( SvxChartRegress eRegress ) 48 { 49 ::chart::RegressionCurveHelper::tRegressionType eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_NONE; 50 switch( eRegress ) 51 { 52 case CHREGRESS_LINEAR: 53 eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_LINEAR; 54 break; 55 case CHREGRESS_LOG: 56 eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_LOG; 57 break; 58 case CHREGRESS_EXP: 59 eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_EXP; 60 break; 61 case CHREGRESS_POWER: 62 eType = ::chart::RegressionCurveHelper::REGRESSION_TYPE_POWER; 63 break; 64 case CHREGRESS_NONE: 65 break; 66 } 67 return eType; 68 } 69 70 } // anonymous namespace 71 72 namespace chart 73 { 74 namespace wrapper 75 { 76 77 RegressionCurveItemConverter::RegressionCurveItemConverter( 78 const uno::Reference< beans::XPropertySet > & rPropertySet, 79 const uno::Reference< chart2::XRegressionCurveContainer > & xRegCurveCnt, 80 SfxItemPool& rItemPool, 81 SdrModel& rDrawModel, 82 const uno::Reference< lang::XMultiServiceFactory > & xNamedPropertyContainerFactory ) : 83 ItemConverter( rPropertySet, rItemPool ), 84 m_spGraphicConverter( new GraphicPropertyItemConverter( 85 rPropertySet, rItemPool, rDrawModel, 86 xNamedPropertyContainerFactory, 87 GraphicPropertyItemConverter::LINE_PROPERTIES )), 88 m_xCurveContainer( xRegCurveCnt ) 89 {} 90 91 RegressionCurveItemConverter::~RegressionCurveItemConverter() 92 {} 93 94 void RegressionCurveItemConverter::FillItemSet( SfxItemSet & rOutItemSet ) const 95 { 96 m_spGraphicConverter->FillItemSet( rOutItemSet ); 97 98 // own items 99 ItemConverter::FillItemSet( rOutItemSet ); 100 } 101 102 bool RegressionCurveItemConverter::ApplyItemSet( const SfxItemSet & rItemSet ) 103 { 104 bool bResult = m_spGraphicConverter->ApplyItemSet( rItemSet ); 105 106 // own items 107 return ItemConverter::ApplyItemSet( rItemSet ) || bResult; 108 } 109 110 const sal_uInt16 * RegressionCurveItemConverter::GetWhichPairs() const 111 { 112 // must span all used items! 113 return nRegressionCurveWhichPairs; 114 } 115 116 bool RegressionCurveItemConverter::GetItemProperty( 117 tWhichIdType /* nWhichId */, tPropertyNameWithMemberId & /* rOutProperty */ ) const 118 { 119 // No own (non-special) properties 120 return false; 121 } 122 123 124 bool RegressionCurveItemConverter::ApplySpecialItem( 125 sal_uInt16 nWhichId, const SfxItemSet & rItemSet ) 126 throw( uno::Exception ) 127 { 128 uno::Reference< chart2::XRegressionCurve > xCurve( GetPropertySet(), uno::UNO_QUERY ); 129 bool bChanged = false; 130 131 switch( nWhichId ) 132 { 133 case SCHATTR_REGRESSION_TYPE: 134 { 135 OSL_ASSERT( xCurve.is()); 136 if( xCurve.is()) 137 { 138 SvxChartRegress eRegress = static_cast< SvxChartRegress >( 139 static_cast< sal_Int32 >( RegressionCurveHelper::getRegressionType( xCurve ))); 140 SvxChartRegress eNewRegress = static_cast< const SvxChartRegressItem & >( 141 rItemSet.Get( nWhichId )).GetValue(); 142 if( eRegress != eNewRegress ) 143 { 144 // note that changing the regression type changes the object 145 // for which this converter was created. Not optimal, but 146 // currently the only way to handle the type in the 147 // regression curve properties dialog 148 RegressionCurveHelper::replaceOrAddCurveAndReduceToOne( 149 lcl_convertRegressionType( eNewRegress ), m_xCurveContainer, 150 uno::Reference< uno::XComponentContext >()); 151 uno::Reference< beans::XPropertySet > xNewPropSet( 152 RegressionCurveHelper::getFirstCurveNotMeanValueLine( m_xCurveContainer ), 153 uno::UNO_QUERY ); 154 OSL_ASSERT( xNewPropSet.is()); 155 if( xNewPropSet.is()) 156 { 157 resetPropertySet( xNewPropSet ); 158 bChanged = true; 159 } 160 } 161 } 162 } 163 break; 164 165 case SCHATTR_REGRESSION_SHOW_EQUATION: 166 { 167 OSL_ASSERT( xCurve.is()); 168 if( xCurve.is()) 169 { 170 bool bNewShow = static_cast< sal_Bool >( 171 static_cast< const SfxBoolItem & >( 172 rItemSet.Get( nWhichId )).GetValue()); 173 174 uno::Reference< beans::XPropertySet > xEqProp( xCurve->getEquationProperties()); 175 OSL_ASSERT( xEqProp.is()); 176 bool bOldShow = false; 177 if( xEqProp.is() && 178 (xEqProp->getPropertyValue( C2U( "ShowEquation" )) >>= bOldShow) && 179 bOldShow != bNewShow ) 180 { 181 xEqProp->setPropertyValue( C2U( "ShowEquation" ), uno::makeAny( bNewShow )); 182 bChanged = true; 183 } 184 } 185 } 186 break; 187 188 case SCHATTR_REGRESSION_SHOW_COEFF: 189 { 190 OSL_ASSERT( xCurve.is()); 191 if( xCurve.is()) 192 { 193 bool bNewShow = static_cast< sal_Bool >( 194 static_cast< const SfxBoolItem & >( 195 rItemSet.Get( nWhichId )).GetValue()); 196 197 uno::Reference< beans::XPropertySet > xEqProp( xCurve->getEquationProperties()); 198 OSL_ASSERT( xEqProp.is()); 199 bool bOldShow = false; 200 if( xEqProp.is() && 201 (xEqProp->getPropertyValue( C2U( "ShowCorrelationCoefficient" )) >>= bOldShow) && 202 bOldShow != bNewShow ) 203 { 204 xEqProp->setPropertyValue( C2U( "ShowCorrelationCoefficient" ), uno::makeAny( bNewShow )); 205 bChanged = true; 206 } 207 } 208 } 209 break; 210 } 211 212 return bChanged; 213 } 214 215 void RegressionCurveItemConverter::FillSpecialItem( 216 sal_uInt16 nWhichId, SfxItemSet & rOutItemSet ) const 217 throw( uno::Exception ) 218 { 219 uno::Reference< chart2::XRegressionCurve > xCurve( GetPropertySet(), uno::UNO_QUERY ); 220 221 switch( nWhichId ) 222 { 223 case SCHATTR_REGRESSION_TYPE: 224 { 225 OSL_ASSERT( xCurve.is()); 226 if( xCurve.is()) 227 { 228 SvxChartRegress eRegress = static_cast< SvxChartRegress >( 229 static_cast< sal_Int32 >( RegressionCurveHelper::getRegressionType( xCurve ))); 230 rOutItemSet.Put( SvxChartRegressItem( eRegress, SCHATTR_REGRESSION_TYPE )); 231 } 232 } 233 break; 234 235 case SCHATTR_REGRESSION_SHOW_EQUATION: 236 { 237 OSL_ASSERT( xCurve.is()); 238 if( xCurve.is()) 239 { 240 uno::Reference< beans::XPropertySet > xEqProp( xCurve->getEquationProperties()); 241 OSL_ASSERT( xEqProp.is()); 242 bool bShow = false; 243 if( xEqProp.is() && 244 (xEqProp->getPropertyValue( C2U( "ShowEquation" )) >>= bShow)) 245 { 246 rOutItemSet.Put( SfxBoolItem( nWhichId, bShow )); 247 } 248 } 249 } 250 break; 251 252 case SCHATTR_REGRESSION_SHOW_COEFF: 253 { 254 OSL_ASSERT( xCurve.is()); 255 if( xCurve.is()) 256 { 257 uno::Reference< beans::XPropertySet > xEqProp( xCurve->getEquationProperties()); 258 OSL_ASSERT( xEqProp.is()); 259 bool bShow = false; 260 if( xEqProp.is() && 261 (xEqProp->getPropertyValue( C2U( "ShowCorrelationCoefficient" )) >>= bShow)) 262 { 263 rOutItemSet.Put( SfxBoolItem( nWhichId, bShow )); 264 } 265 } 266 } 267 break; 268 } 269 } 270 271 } // namespace wrapper 272 } // namespace chart 273