1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_chart2.hxx" 26 27 #include "dlg_InsertTrendline.hrc" 28 #include "res_Trendline.hxx" 29 #include "res_Trendline_IDs.hrc" 30 #include "ResId.hxx" 31 #include "Strings.hrc" 32 #include "Bitmaps.hrc" 33 #include "Bitmaps_HC.hrc" 34 #include "chartview/ChartSfxItemIds.hxx" 35 36 #include <vector> 37 #include <algorithm> 38 39 // macro for selecting a normal or high contrast bitmap the stack variable 40 // bIsHighContrast must exist and reflect the correct state 41 #define SELECT_IMAGE(name) Image( SchResId( bIsHighContrast ? name ## _HC : name )) 42 43 namespace 44 { 45 template< class T > 46 long lcl_getRightEdge( T & rControl ) 47 { 48 return rControl.CalcMinimumSize().Width() + rControl.GetPosPixel().X() - rControl.GetParent()->GetPosPixel().X(); 49 } 50 51 template< class T > 52 void lcl_AdjustControlSize( T & rControl ) 53 { 54 Size aSize( rControl.GetSizePixel()); 55 aSize.setWidth( rControl.CalcMinimumSize().Width()); 56 rControl.SetSizePixel( aSize ); 57 } 58 59 void lcl_AdjustControlSize( Control & rControl, long nRightEdge ) 60 { 61 Size aSize( rControl.GetSizePixel()); 62 Point aPosition( rControl.GetPosPixel()); 63 aSize.setWidth( nRightEdge - aPosition.getX()); 64 rControl.SetSizePixel( aSize ); 65 } 66 67 } // anonymous namespace 68 69 namespace chart 70 { 71 72 enum StatTrendLine 73 { 74 TRENDLINE_NONE, 75 TRENDLINE_LINE, 76 TRENDLINE_LOG, 77 TRENDLINE_EXP, 78 TRENDLINE_POW 79 }; 80 81 TrendlineResources::TrendlineResources( Window * pParent, const SfxItemSet& rInAttrs, bool bNoneAvailable ) : 82 m_aFLType( pParent, SchResId( FL_TYPE )), 83 84 m_aRBNone( pParent, SchResId( RB_NONE )), 85 m_aRBLinear( pParent, SchResId( RB_LINEAR )), 86 m_aRBLogarithmic( pParent, SchResId( RB_LOGARITHMIC )), 87 m_aRBExponential( pParent, SchResId( RB_EXPONENTIAL )), 88 m_aRBPower( pParent, SchResId( RB_POWER )), 89 90 m_aFINone( pParent, SchResId( FI_NONE )), 91 m_aFILinear( pParent, SchResId( FI_LINEAR )), 92 m_aFILogarithmic( pParent, SchResId( FI_LOGARITHMIC )), 93 m_aFIExponential( pParent, SchResId( FI_EXPONENTIAL )), 94 m_aFIPower( pParent, SchResId( FI_POWER )), 95 96 m_aFLEquation( pParent, SchResId( FL_EQUATION )), 97 m_aCBShowEquation( pParent, SchResId( CB_SHOW_EQUATION )), 98 m_aCBShowCorrelationCoeff( pParent, SchResId( CB_SHOW_CORRELATION_COEFF )), 99 m_eTrendLineType( CHREGRESS_NONE ), 100 m_bNoneAvailable( bNoneAvailable ), 101 m_bTrendLineUnique( true ) 102 { 103 FillValueSets(); 104 105 if( m_bNoneAvailable ) 106 m_aRBNone.SetClickHdl( LINK(this, TrendlineResources, SelectTrendLine )); 107 else 108 m_aRBNone.Hide(); 109 110 m_aRBLinear.SetClickHdl( LINK(this, TrendlineResources, SelectTrendLine )); 111 m_aRBLogarithmic.SetClickHdl( LINK(this, TrendlineResources, SelectTrendLine )); 112 m_aRBExponential.SetClickHdl( LINK(this, TrendlineResources, SelectTrendLine )); 113 m_aRBPower.SetClickHdl( LINK(this, TrendlineResources, SelectTrendLine )); 114 115 Reset( rInAttrs ); 116 UpdateControlStates(); 117 } 118 119 TrendlineResources::~TrendlineResources() 120 {} 121 122 long TrendlineResources::adjustControlSizes() 123 { 124 // calculate right edge 125 ::std::vector< long > aControlRightEdges; 126 aControlRightEdges.push_back( lcl_getRightEdge( m_aRBNone )); 127 aControlRightEdges.push_back( lcl_getRightEdge( m_aRBLinear )); 128 aControlRightEdges.push_back( lcl_getRightEdge( m_aRBLogarithmic )); 129 aControlRightEdges.push_back( lcl_getRightEdge( m_aRBExponential )); 130 aControlRightEdges.push_back( lcl_getRightEdge( m_aRBPower )); 131 aControlRightEdges.push_back( lcl_getRightEdge( m_aCBShowEquation )); 132 aControlRightEdges.push_back( lcl_getRightEdge( m_aCBShowCorrelationCoeff )); 133 134 lcl_AdjustControlSize( m_aRBNone ); 135 lcl_AdjustControlSize( m_aRBLinear ); 136 lcl_AdjustControlSize( m_aRBLogarithmic ); 137 lcl_AdjustControlSize( m_aRBExponential ); 138 lcl_AdjustControlSize( m_aRBPower ); 139 lcl_AdjustControlSize( m_aCBShowEquation ); 140 lcl_AdjustControlSize( m_aCBShowCorrelationCoeff ); 141 142 // Note: FixedLine has no CalcMinimumSize, workaround: use a FixedText 143 FixedText aDummyTextCtrl( m_aFLType.GetParent()); 144 aDummyTextCtrl.SetText( m_aFLType.GetText()); 145 aControlRightEdges.push_back( lcl_getRightEdge( aDummyTextCtrl )); 146 aDummyTextCtrl.SetText( m_aFLEquation.GetText()); 147 aControlRightEdges.push_back( lcl_getRightEdge( aDummyTextCtrl )); 148 149 long nRightEdgeOfControls = *(::std::max_element( aControlRightEdges.begin(), aControlRightEdges.end())); 150 // leave some more space after the longest text 151 nRightEdgeOfControls += m_aFLType.LogicToPixel( Size( 6, 0 ), MapMode( MAP_APPFONT )).getWidth(); 152 153 lcl_AdjustControlSize( m_aFLType, nRightEdgeOfControls ); 154 lcl_AdjustControlSize( m_aFLEquation, nRightEdgeOfControls ); 155 156 return nRightEdgeOfControls; 157 } 158 159 IMPL_LINK( TrendlineResources, SelectTrendLine, RadioButton *, pRadioButton ) 160 { 161 if( pRadioButton == &m_aRBLinear ) 162 m_eTrendLineType = CHREGRESS_LINEAR; 163 else if( pRadioButton == &m_aRBLogarithmic ) 164 m_eTrendLineType = CHREGRESS_LOG; 165 else if( pRadioButton == &m_aRBExponential ) 166 m_eTrendLineType = CHREGRESS_EXP; 167 else if( pRadioButton == &m_aRBPower ) 168 m_eTrendLineType = CHREGRESS_POWER; 169 else if( pRadioButton == &m_aRBNone ) 170 { 171 OSL_ASSERT( m_bNoneAvailable ); 172 m_eTrendLineType = CHREGRESS_NONE; 173 } 174 m_bTrendLineUnique = true; 175 176 UpdateControlStates(); 177 178 return 0; 179 } 180 181 void TrendlineResources::Reset( const SfxItemSet& rInAttrs ) 182 { 183 const SfxPoolItem *pPoolItem = NULL; 184 SfxItemState aState = SFX_ITEM_UNKNOWN; 185 186 aState = rInAttrs.GetItemState( SCHATTR_REGRESSION_TYPE, sal_True, &pPoolItem ); 187 m_bTrendLineUnique = ( aState != SFX_ITEM_DONTCARE ); 188 if( aState == SFX_ITEM_SET ) 189 { 190 const SvxChartRegressItem * pItem = dynamic_cast< const SvxChartRegressItem * >( pPoolItem ); 191 if( pItem ) 192 m_eTrendLineType = pItem->GetValue(); 193 } 194 195 aState = rInAttrs.GetItemState( SCHATTR_REGRESSION_SHOW_EQUATION, sal_True, &pPoolItem ); 196 if( aState == SFX_ITEM_DONTCARE ) 197 { 198 m_aCBShowEquation.EnableTriState( sal_True ); 199 m_aCBShowEquation.SetState( STATE_DONTKNOW ); 200 } 201 else 202 { 203 m_aCBShowEquation.EnableTriState( sal_False ); 204 if( aState == SFX_ITEM_SET ) 205 m_aCBShowEquation.Check( static_cast< const SfxBoolItem * >( pPoolItem )->GetValue()); 206 } 207 208 aState = rInAttrs.GetItemState( SCHATTR_REGRESSION_SHOW_COEFF, sal_True, &pPoolItem ); 209 if( aState == SFX_ITEM_DONTCARE ) 210 { 211 m_aCBShowCorrelationCoeff.EnableTriState( sal_True ); 212 m_aCBShowCorrelationCoeff.SetState( STATE_DONTKNOW ); 213 } 214 else 215 { 216 m_aCBShowCorrelationCoeff.EnableTriState( sal_False ); 217 if( aState == SFX_ITEM_SET ) 218 m_aCBShowCorrelationCoeff.Check( static_cast< const SfxBoolItem * >( pPoolItem )->GetValue()); 219 } 220 221 if( m_bTrendLineUnique ) 222 { 223 switch( m_eTrendLineType ) 224 { 225 case CHREGRESS_LINEAR : 226 m_aRBLinear.Check(); 227 break; 228 case CHREGRESS_LOG : 229 m_aRBLogarithmic.Check(); 230 break; 231 case CHREGRESS_EXP : 232 m_aRBExponential.Check(); 233 break; 234 case CHREGRESS_POWER : 235 m_aRBPower.Check(); 236 break; 237 case CHREGRESS_NONE: 238 OSL_ASSERT( m_bNoneAvailable ); 239 m_aRBNone.Check(); 240 break; 241 } 242 } 243 } 244 245 sal_Bool TrendlineResources::FillItemSet(SfxItemSet& rOutAttrs) const 246 { 247 if( m_bTrendLineUnique ) 248 rOutAttrs.Put( SvxChartRegressItem( m_eTrendLineType, SCHATTR_REGRESSION_TYPE )); 249 if( m_aCBShowEquation.GetState() != STATE_DONTKNOW ) 250 rOutAttrs.Put( SfxBoolItem( SCHATTR_REGRESSION_SHOW_EQUATION, m_aCBShowEquation.IsChecked() )); 251 if( m_aCBShowCorrelationCoeff.GetState() != STATE_DONTKNOW ) 252 rOutAttrs.Put( SfxBoolItem( SCHATTR_REGRESSION_SHOW_COEFF, m_aCBShowCorrelationCoeff.IsChecked() )); 253 return sal_True; 254 } 255 256 void TrendlineResources::FillValueSets() 257 { 258 bool bIsHighContrast = ( true && m_aFLType.GetSettings().GetStyleSettings().GetHighContrastMode() ); 259 260 if( m_bNoneAvailable ) 261 m_aFINone.SetImage( SELECT_IMAGE( BMP_REGRESSION_NONE )); 262 m_aFILinear.SetImage( SELECT_IMAGE( BMP_REGRESSION_LINEAR )); 263 m_aFILogarithmic.SetImage( SELECT_IMAGE( BMP_REGRESSION_LOG )); 264 m_aFIExponential.SetImage( SELECT_IMAGE( BMP_REGRESSION_EXP )); 265 m_aFIPower.SetImage( SELECT_IMAGE( BMP_REGRESSION_POWER )); 266 } 267 268 void TrendlineResources::UpdateControlStates() 269 { 270 if( m_bNoneAvailable ) 271 { 272 bool bEnableEquationControls = !m_bTrendLineUnique || (m_eTrendLineType != CHREGRESS_NONE); 273 m_aCBShowEquation.Enable( bEnableEquationControls ); 274 m_aCBShowCorrelationCoeff.Enable( bEnableEquationControls ); 275 } 276 } 277 278 } // namespace chart 279