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