1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: res_ErrorBar.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_chart2.hxx"
34 #include "res_ErrorBar.hxx"
35 #include "res_ErrorBar_IDs.hrc"
37 #include "Strings.hrc"
38 #include "Bitmaps.hrc"
39 #include "Bitmaps_HC.hrc"
40 #include "RangeSelectionHelper.hxx"
41 // for RANGE_SELECTION_INVALID_RANGE_BACKGROUND_COLOR
42 #include "TabPageNotifiable.hxx"
44 #include <rtl/math.hxx>
45 #include <vcl/dialog.hxx>
46 #include <svtools/stritem.hxx>
48 using namespace ::com::sun::star
;
52 void lcl_enableRangeChoosing( bool bEnable
, Dialog
* pDialog
)
56 pDialog
->Show( bEnable
? FALSE
: TRUE
);
57 pDialog
->SetModalInputMode( bEnable
? FALSE
: TRUE
);
61 sal_uInt16
lcl_getLbEntryPosByErrorKind( SvxChartKindError eErrorKind
)
63 sal_uInt16 nResult
= 0;
66 // for these cases select the default in the list box
71 nResult
= CHART_LB_FUNCTION_STD_DEV
;
74 nResult
= CHART_LB_FUNCTION_VARIANCE
;
77 nResult
= CHART_LB_FUNCTION_STD_DEV
;
79 case CHERROR_BIGERROR
:
80 nResult
= CHART_LB_FUNCTION_ERROR_MARGIN
;
82 case CHERROR_STDERROR
:
83 nResult
= CHART_LB_FUNCTION_STD_ERROR
;
88 } // anonymous namespace
91 //.............................................................................
94 //.............................................................................
96 // macro for selecting a normal or high contrast bitmap the stack variable
97 // bIsHighContrast must exist and reflect the correct state
98 #define SELECT_IMAGE(name) Image( SchResId( bIsHighContrast ? name ## _HC : name ))
107 ErrorBarResources::ErrorBarResources( Window
* pParent
, Dialog
* pParentDialog
,
108 const SfxItemSet
& rInAttrs
, bool bNoneAvailable
,
109 tErrorBarType eType
/* = ERROR_BAR_Y */ ) :
111 m_aFlErrorCategory( pParent
, SchResId( FL_ERROR
)),
112 m_aRbNone( pParent
, SchResId( RB_NONE
)),
113 m_aRbConst( pParent
, SchResId( RB_CONST
)),
114 m_aRbPercent( pParent
, SchResId( RB_PERCENT
)),
115 m_aRbFunction( pParent
, SchResId( RB_FUNCTION
)),
116 m_aRbRange( pParent
, SchResId( RB_RANGE
)),
117 m_aLbFunction( pParent
, SchResId( LB_FUNCTION
)),
119 m_aFlParameters( pParent
, SchResId( FL_PARAMETERS
)),
120 m_aFtPositive( pParent
, SchResId( FT_POSITIVE
)),
121 m_aMfPositive( pParent
, SchResId( MF_POSITIVE
)),
122 m_aEdRangePositive( pParent
, SchResId( ED_RANGE_POSITIVE
)),
123 m_aIbRangePositive( pParent
, SchResId( IB_RANGE_POSITIVE
)),
124 m_aFtNegative( pParent
, SchResId( FT_NEGATIVE
)),
125 m_aMfNegative( pParent
, SchResId( MF_NEGATIVE
)),
126 m_aEdRangeNegative( pParent
, SchResId( ED_RANGE_NEGATIVE
)),
127 m_aIbRangeNegative( pParent
, SchResId( IB_RANGE_NEGATIVE
)),
128 m_aCbSyncPosNeg( pParent
, SchResId( CB_SYN_POS_NEG
)),
130 m_aFlIndicate( pParent
, SchResId( FL_INDICATE
)),
131 m_aRbBoth( pParent
, SchResId( RB_BOTH
)),
132 m_aRbPositive( pParent
, SchResId( RB_POSITIVE
)),
133 m_aRbNegative( pParent
, SchResId( RB_NEGATIVE
)),
134 m_aFiBoth( pParent
, SchResId( FI_BOTH
)),
135 m_aFiPositive( pParent
, SchResId( FI_POSITIVE
)),
136 m_aFiNegative( pParent
, SchResId( FI_NEGATIVE
)),
138 m_eErrorKind( CHERROR_NONE
),
139 m_eIndicate( CHINDICATE_BOTH
),
140 m_bErrorKindUnique( true ),
141 m_bIndicatorUnique( true ),
142 m_bPlusUnique( true ),
143 m_bMinusUnique( true ),
144 m_bRangePosUnique( true ),
145 m_bRangeNegUnique( true ),
146 m_bNoneAvailable( bNoneAvailable
),
147 m_eErrorBarType( eType
),
148 m_nConstDecimalDigits( 1 ),
149 m_nConstSpinSize( 1 ),
150 m_pParentWindow( pParent
),
151 m_pParentDialog( pParentDialog
),
152 m_pCurrentRangeChoosingField( 0 ),
153 m_bHasInternalDataProvider( true )
155 if( m_bNoneAvailable
)
156 m_aRbNone
.SetClickHdl( LINK( this, ErrorBarResources
, CategoryChosen
));
160 m_aRbConst
.SetClickHdl( LINK( this, ErrorBarResources
, CategoryChosen
));
161 m_aRbPercent
.SetClickHdl( LINK( this, ErrorBarResources
, CategoryChosen
));
162 m_aRbFunction
.SetClickHdl( LINK( this, ErrorBarResources
, CategoryChosen
));
163 m_aRbRange
.SetClickHdl( LINK( this, ErrorBarResources
, CategoryChosen
));
164 m_aLbFunction
.SetSelectHdl( LINK( this, ErrorBarResources
, CategoryChosen
));
166 m_aCbSyncPosNeg
.Check( FALSE
);
167 m_aCbSyncPosNeg
.SetToggleHdl( LINK( this, ErrorBarResources
, SynchronizePosAndNeg
));
169 m_aMfPositive
.SetModifyHdl( LINK( this, ErrorBarResources
, PosValueChanged
));
170 m_aEdRangePositive
.SetModifyHdl( LINK( this, ErrorBarResources
, RangeChanged
));
171 m_aEdRangeNegative
.SetModifyHdl( LINK( this, ErrorBarResources
, RangeChanged
));
173 m_aRbPositive
.SetClickHdl( LINK( this, ErrorBarResources
, IndicatorChanged
));
174 m_aRbNegative
.SetClickHdl( LINK( this, ErrorBarResources
, IndicatorChanged
));
175 m_aRbBoth
.SetClickHdl( LINK( this, ErrorBarResources
, IndicatorChanged
));
177 m_aIbRangePositive
.SetClickHdl( LINK( this, ErrorBarResources
, ChooseRange
));
178 m_aIbRangeNegative
.SetClickHdl( LINK( this, ErrorBarResources
, ChooseRange
));
179 m_aIbRangePositive
.SetQuickHelpText( String( SchResId( STR_TIP_SELECT_RANGE
)));
180 m_aIbRangeNegative
.SetQuickHelpText( String( SchResId( STR_TIP_SELECT_RANGE
)));
186 ErrorBarResources::~ErrorBarResources()
190 void ErrorBarResources::SetErrorBarType( tErrorBarType eNewType
)
192 if( m_eErrorBarType
!= eNewType
)
194 m_eErrorBarType
= eNewType
;
199 void ErrorBarResources::SetChartDocumentForRangeChoosing(
200 const uno::Reference
< chart2::XChartDocument
> & xChartDocument
)
202 if( xChartDocument
.is())
203 m_bHasInternalDataProvider
= xChartDocument
->hasInternalDataProvider();
204 m_apRangeSelectionHelper
.reset( new RangeSelectionHelper( xChartDocument
));
206 // has internal data provider => rename "cell range" to "from data"
207 OSL_ASSERT( m_apRangeSelectionHelper
.get());
208 if( m_bHasInternalDataProvider
)
210 m_aRbRange
.SetText( String( SchResId( STR_CONTROLTEXT_ERROR_BARS_FROM_DATA
)));
213 if( m_aRbRange
.IsChecked())
215 isRangeFieldContentValid( m_aEdRangePositive
);
216 isRangeFieldContentValid( m_aEdRangeNegative
);
220 void ErrorBarResources::SetAxisMinorStepWidthForErrorBarDecimals( double fMinorStepWidth
)
222 if( fMinorStepWidth
< 0 )
223 fMinorStepWidth
= -fMinorStepWidth
;
225 sal_Int32 nExponent
= static_cast< sal_Int32
>( ::rtl::math::approxFloor( log10( fMinorStepWidth
)));
228 // one digit precision more
229 m_nConstDecimalDigits
= static_cast< sal_uInt16
>( (-nExponent
) + 1 );
230 m_nConstSpinSize
= 10;
234 m_nConstDecimalDigits
= 0;
235 m_nConstSpinSize
= static_cast< sal_Int64
>( pow( 10.0, (int)nExponent
));
239 void ErrorBarResources::UpdateControlStates()
242 bool bIsFunction
= m_aRbFunction
.IsChecked();
243 m_aLbFunction
.Enable( bIsFunction
);
246 bool bShowRange
= ( m_aRbRange
.IsChecked());
247 bool bCanChooseRange
=
249 m_apRangeSelectionHelper
.get() &&
250 m_apRangeSelectionHelper
->hasRangeSelection());
252 m_aMfPositive
.Show( ! bShowRange
);
253 m_aMfNegative
.Show( ! bShowRange
);
255 // use range but without range chooser => hide controls
256 m_aEdRangePositive
.Show( bShowRange
&& ! m_bHasInternalDataProvider
);
257 m_aIbRangePositive
.Show( bCanChooseRange
);
258 m_aEdRangeNegative
.Show( bShowRange
&& ! m_bHasInternalDataProvider
);
259 m_aIbRangeNegative
.Show( bCanChooseRange
);
261 bool bShowPosNegAndSync
= ! (bShowRange
&& m_bHasInternalDataProvider
);
262 m_aFtPositive
.Show( bShowPosNegAndSync
);
263 m_aFtNegative
.Show( bShowPosNegAndSync
);
264 m_aCbSyncPosNeg
.Show( bShowPosNegAndSync
);
265 m_aFlParameters
.Show( bShowPosNegAndSync
);
267 // unit for metric fields
269 ( m_aRbFunction
.IsChecked()) &&
270 ( m_aLbFunction
.GetSelectEntryPos() == CHART_LB_FUNCTION_ERROR_MARGIN
));
271 bool bIsPercentage( m_aRbPercent
.IsChecked() || bIsErrorMargin
);
276 aCustomUnit
= String( RTL_CONSTASCII_USTRINGPARAM( " %" ));
277 m_aMfPositive
.SetDecimalDigits( 1 );
278 m_aMfPositive
.SetSpinSize( 10 );
279 m_aMfNegative
.SetDecimalDigits( 1 );
280 m_aMfNegative
.SetSpinSize( 10 );
284 m_aMfPositive
.SetDecimalDigits( m_nConstDecimalDigits
);
285 m_aMfPositive
.SetSpinSize( m_nConstSpinSize
);
286 m_aMfNegative
.SetDecimalDigits( m_nConstDecimalDigits
);
287 m_aMfNegative
.SetSpinSize( m_nConstSpinSize
);
289 m_aMfPositive
.SetCustomUnitText( aCustomUnit
);
290 m_aMfNegative
.SetCustomUnitText( aCustomUnit
);
292 // positive and negative value fields
293 bool bPosEnabled
= ( m_aRbPositive
.IsChecked() || m_aRbBoth
.IsChecked());
294 bool bNegEnabled
= ( m_aRbNegative
.IsChecked() || m_aRbBoth
.IsChecked());
295 if( !( bPosEnabled
|| bNegEnabled
))
297 // all three controls are not checked -> ambiguous state
302 // functions with only one parameter
303 bool bOneParameterCategory
=
304 bIsErrorMargin
|| m_aRbPercent
.IsChecked();
305 if( bOneParameterCategory
)
307 m_aCbSyncPosNeg
.Check();
310 if( m_aCbSyncPosNeg
.IsChecked())
316 // all functions except error margin take no arguments
317 if( m_aRbFunction
.IsChecked() &&
318 ( m_aLbFunction
.GetSelectEntryPos() != CHART_LB_FUNCTION_ERROR_MARGIN
))
324 // enable/disable pos/neg fields
325 m_aFtPositive
.Enable( bPosEnabled
);
326 m_aFtNegative
.Enable( bNegEnabled
);
329 m_aEdRangePositive
.Enable( bPosEnabled
);
330 m_aIbRangePositive
.Enable( bPosEnabled
);
331 m_aEdRangeNegative
.Enable( bNegEnabled
);
332 m_aIbRangeNegative
.Enable( bNegEnabled
);
336 m_aMfPositive
.Enable( bPosEnabled
);
337 m_aMfNegative
.Enable( bNegEnabled
);
340 m_aCbSyncPosNeg
.Enable(
341 !bOneParameterCategory
&&
342 ( bPosEnabled
|| bNegEnabled
));
344 // mark invalid entries in the range fields
345 if( bShowRange
&& ! m_bHasInternalDataProvider
)
347 isRangeFieldContentValid( m_aEdRangePositive
);
348 isRangeFieldContentValid( m_aEdRangeNegative
);
352 IMPL_LINK( ErrorBarResources
, CategoryChosen
, void *, )
354 m_bErrorKindUnique
= true;
355 SvxChartKindError eOldError
= m_eErrorKind
;
357 if( m_aRbNone
.IsChecked())
358 m_eErrorKind
= CHERROR_NONE
;
359 else if( m_aRbConst
.IsChecked())
360 m_eErrorKind
= CHERROR_CONST
;
361 else if( m_aRbPercent
.IsChecked())
362 m_eErrorKind
= CHERROR_PERCENT
;
363 else if( m_aRbRange
.IsChecked())
364 m_eErrorKind
= CHERROR_RANGE
;
365 else if( m_aRbFunction
.IsChecked())
367 if( m_aLbFunction
.GetSelectEntryCount() == 1 )
369 switch( m_aLbFunction
.GetSelectEntryPos())
371 case CHART_LB_FUNCTION_STD_ERROR
:
372 m_eErrorKind
= CHERROR_STDERROR
; break;
373 case CHART_LB_FUNCTION_STD_DEV
:
374 m_eErrorKind
= CHERROR_SIGMA
; break;
375 case CHART_LB_FUNCTION_VARIANCE
:
376 m_eErrorKind
= CHERROR_VARIANT
; break;
377 case CHART_LB_FUNCTION_ERROR_MARGIN
:
378 m_eErrorKind
= CHERROR_BIGERROR
; break;
380 m_bErrorKindUnique
= false;
384 m_bErrorKindUnique
= false;
388 OSL_ENSURE( false, "Unknown category chosen" );
389 m_bErrorKindUnique
= false;
393 if( m_eErrorKind
== CHERROR_RANGE
&&
394 eOldError
!= CHERROR_RANGE
)
396 m_aCbSyncPosNeg
.Check(
397 (m_aEdRangePositive
.GetText().Len() > 0) &&
398 m_aEdRangePositive
.GetText().Equals(
399 m_aEdRangeNegative
.GetText()));
401 // changed from range
402 else if( m_eErrorKind
!= CHERROR_RANGE
&&
403 eOldError
== CHERROR_RANGE
)
405 m_aCbSyncPosNeg
.Check(
406 m_aMfPositive
.GetValue() == m_aMfNegative
.GetValue());
409 UpdateControlStates();
413 IMPL_LINK( ErrorBarResources
, SynchronizePosAndNeg
, void *, EMPTYARG
)
415 UpdateControlStates();
416 PosValueChanged( 0 );
420 IMPL_LINK( ErrorBarResources
, PosValueChanged
, void *, EMPTYARG
)
422 if( m_aCbSyncPosNeg
.IsChecked())
424 if( m_aRbRange
.IsChecked())
426 m_aEdRangeNegative
.SetText( m_aEdRangePositive
.GetText());
427 m_bRangeNegUnique
= m_bRangePosUnique
;
430 m_aMfNegative
.SetValue( m_aMfPositive
.GetValue());
436 IMPL_LINK( ErrorBarResources
, IndicatorChanged
, void *, EMPTYARG
)
438 m_bIndicatorUnique
= true;
439 if( m_aRbBoth
.IsChecked())
440 m_eIndicate
= CHINDICATE_BOTH
;
441 else if( m_aRbPositive
.IsChecked())
442 m_eIndicate
= CHINDICATE_UP
;
443 else if( m_aRbNegative
.IsChecked())
444 m_eIndicate
= CHINDICATE_DOWN
;
446 m_bIndicatorUnique
= false;
448 UpdateControlStates();
452 IMPL_LINK( ErrorBarResources
, ChooseRange
, RangeSelectionButton
*, pButton
)
454 OSL_ASSERT( m_apRangeSelectionHelper
.get());
455 if( ! m_apRangeSelectionHelper
.get())
457 OSL_ASSERT( m_pCurrentRangeChoosingField
== 0 );
459 ::rtl::OUString aUIString
;
460 if( pButton
== &m_aIbRangePositive
)
462 m_pCurrentRangeChoosingField
= &m_aEdRangePositive
;
463 aUIString
= ::rtl::OUString( String( SchResId( STR_DATA_SELECT_RANGE_FOR_POSITIVE_ERRORBARS
)));
467 m_pCurrentRangeChoosingField
= &m_aEdRangeNegative
;
468 aUIString
= ::rtl::OUString( String( SchResId( STR_DATA_SELECT_RANGE_FOR_NEGATIVE_ERRORBARS
)));
471 OSL_ASSERT( m_pParentDialog
);
472 if( m_pParentDialog
)
474 lcl_enableRangeChoosing( true, m_pParentDialog
);
475 m_apRangeSelectionHelper
->chooseRange(
476 m_pCurrentRangeChoosingField
->GetText(),
480 m_pCurrentRangeChoosingField
= 0;
485 IMPL_LINK( ErrorBarResources
, RangeChanged
, Edit
*, pEdit
)
487 if( pEdit
== & m_aEdRangePositive
)
489 m_bRangePosUnique
= true;
490 PosValueChanged( 0 );
494 m_bRangeNegUnique
= true;
497 isRangeFieldContentValid( *pEdit
);
502 void ErrorBarResources::Reset(const SfxItemSet
& rInAttrs
)
504 const SfxPoolItem
*pPoolItem
= NULL
;
505 SfxItemState aState
= SFX_ITEM_UNKNOWN
;
508 m_eErrorKind
= CHERROR_NONE
;
509 aState
= rInAttrs
.GetItemState( SCHATTR_STAT_KIND_ERROR
, TRUE
, &pPoolItem
);
510 m_bErrorKindUnique
= ( aState
!= SFX_ITEM_DONTCARE
);
512 if( aState
== SFX_ITEM_SET
)
513 m_eErrorKind
= ((const SvxChartKindErrorItem
*) pPoolItem
)->GetValue();
515 m_aLbFunction
.SelectEntryPos( lcl_getLbEntryPosByErrorKind( m_eErrorKind
));
517 if( m_bErrorKindUnique
)
519 switch( m_eErrorKind
)
524 case CHERROR_PERCENT
:
525 m_aRbPercent
.Check();
530 case CHERROR_STDERROR
:
531 case CHERROR_VARIANT
:
533 case CHERROR_BIGERROR
:
534 m_aRbFunction
.Check();
543 m_aRbNone
.Check( FALSE
);
544 m_aRbConst
.Check( FALSE
);
545 m_aRbPercent
.Check( FALSE
);
546 m_aRbFunction
.Check( FALSE
);
550 aState
= rInAttrs
.GetItemState( SCHATTR_STAT_CONSTPLUS
, TRUE
, &pPoolItem
);
551 m_bPlusUnique
= ( aState
!= SFX_ITEM_DONTCARE
);
552 double fPlusValue
= 0.0;
553 if( aState
== SFX_ITEM_SET
)
555 fPlusValue
= ((const SvxDoubleItem
*) pPoolItem
)->GetValue();
556 sal_Int32 nPlusValue
= static_cast< sal_Int32
>( fPlusValue
* pow(10.0,m_aMfPositive
.GetDecimalDigits()) );
557 m_aMfPositive
.SetValue( nPlusValue
);
560 aState
= rInAttrs
.GetItemState( SCHATTR_STAT_CONSTMINUS
, TRUE
, &pPoolItem
);
561 m_bMinusUnique
= ( aState
!= SFX_ITEM_DONTCARE
);
562 double fMinusValue
= 0.0;
563 if( aState
== SFX_ITEM_SET
)
565 fMinusValue
= ((const SvxDoubleItem
*) pPoolItem
)->GetValue();
566 sal_Int32 nMinusValue
= static_cast< sal_Int32
>( fMinusValue
* pow(10.0,m_aMfNegative
.GetDecimalDigits()) );
567 m_aMfNegative
.SetValue( nMinusValue
);
569 if( m_eErrorKind
!= CHERROR_RANGE
&&
570 fPlusValue
== fMinusValue
)
571 m_aCbSyncPosNeg
.Check();
575 aState
= rInAttrs
.GetItemState( SCHATTR_STAT_INDICATE
, TRUE
, &pPoolItem
);
576 m_bIndicatorUnique
= ( aState
!= SFX_ITEM_DONTCARE
);
577 if( aState
== SFX_ITEM_SET
)
578 m_eIndicate
= ((const SvxChartIndicateItem
* ) pPoolItem
)->GetValue();
580 if( m_bIndicatorUnique
)
582 switch( m_eIndicate
)
584 case CHINDICATE_NONE
:
585 // no longer used, use both as default
586 m_eIndicate
= CHINDICATE_BOTH
;
587 // fall-through intended to BOTH
588 case CHINDICATE_BOTH
:
589 m_aRbBoth
.Check(); break;
591 m_aRbPositive
.Check(); break;
592 case CHINDICATE_DOWN
:
593 m_aRbNegative
.Check(); break;
598 m_aRbBoth
.Check( FALSE
);
599 m_aRbPositive
.Check( FALSE
);
600 m_aRbNegative
.Check( FALSE
);
604 aState
= rInAttrs
.GetItemState( SCHATTR_STAT_RANGE_POS
, TRUE
, &pPoolItem
);
605 m_bRangePosUnique
= ( aState
!= SFX_ITEM_DONTCARE
);
606 if( aState
== SFX_ITEM_SET
)
608 String sRangePositive
= (static_cast< const SfxStringItem
* >( pPoolItem
))->GetValue();
609 m_aEdRangePositive
.SetText( sRangePositive
);
612 aState
= rInAttrs
.GetItemState( SCHATTR_STAT_RANGE_NEG
, TRUE
, &pPoolItem
);
613 m_bRangeNegUnique
= ( aState
!= SFX_ITEM_DONTCARE
);
614 if( aState
== SFX_ITEM_SET
)
616 String sRangeNegative
= (static_cast< const SfxStringItem
* >( pPoolItem
))->GetValue();
617 m_aEdRangeNegative
.SetText( sRangeNegative
);
618 if( m_eErrorKind
== CHERROR_RANGE
&&
619 sRangeNegative
.Len() > 0 &&
620 sRangeNegative
.Equals( m_aEdRangePositive
.GetText()))
621 m_aCbSyncPosNeg
.Check();
624 UpdateControlStates();
627 BOOL
ErrorBarResources::FillItemSet(SfxItemSet
& rOutAttrs
) const
629 if( m_bErrorKindUnique
)
630 rOutAttrs
.Put( SvxChartKindErrorItem( m_eErrorKind
, SCHATTR_STAT_KIND_ERROR
));
631 if( m_bIndicatorUnique
)
632 rOutAttrs
.Put( SvxChartIndicateItem( m_eIndicate
, SCHATTR_STAT_INDICATE
));
634 if( m_bErrorKindUnique
)
636 if( m_eErrorKind
== CHERROR_RANGE
)
640 if( m_bHasInternalDataProvider
)
642 // the strings aPosRange/aNegRange have to be set to a non-empty
643 // arbitrary string to generate error-bar sequences
644 aPosRange
.Assign( sal_Unicode('x'));
645 aNegRange
= aPosRange
;
649 aPosRange
= m_aEdRangePositive
.GetText();
650 if( m_aCbSyncPosNeg
.IsChecked())
651 aNegRange
= aPosRange
;
653 aNegRange
= m_aEdRangeNegative
.GetText();
656 if( m_bRangePosUnique
)
657 rOutAttrs
.Put( SfxStringItem( SCHATTR_STAT_RANGE_POS
, aPosRange
));
658 if( m_bRangeNegUnique
)
659 rOutAttrs
.Put( SfxStringItem( SCHATTR_STAT_RANGE_NEG
, aNegRange
));
661 else if( m_eErrorKind
== CHERROR_CONST
||
662 m_eErrorKind
== CHERROR_PERCENT
||
663 m_eErrorKind
== CHERROR_BIGERROR
)
665 double fPosValue
= static_cast< double >( m_aMfPositive
.GetValue()) /
666 pow( 10.0, m_aMfPositive
.GetDecimalDigits());
667 double fNegValue
= 0.0;
669 if( m_aCbSyncPosNeg
.IsChecked())
670 fNegValue
= fPosValue
;
672 fNegValue
= static_cast< double >( m_aMfNegative
.GetValue()) /
673 pow( 10.0, m_aMfNegative
.GetDecimalDigits());
675 rOutAttrs
.Put( SvxDoubleItem( fPosValue
, SCHATTR_STAT_CONSTPLUS
));
676 rOutAttrs
.Put( SvxDoubleItem( fNegValue
, SCHATTR_STAT_CONSTMINUS
));
683 void ErrorBarResources::FillValueSets()
685 bool bIsHighContrast
= ( true && m_aRbConst
.GetDisplayBackground().GetColor().IsDark() );
687 // do not scale images, show then centered
688 // m_aFiPositive.SetStyle( (m_aFiPositive.GetStyle() & (~WB_SCALE)) | WB_CENTER );
689 // m_aFiNegative.SetStyle( (m_aFiNegative.GetStyle() & (~WB_SCALE)) | WB_CENTER );
690 // m_aFiBoth.SetStyle( (m_aFiBoth.GetStyle() & (~WB_SCALE)) | WB_CENTER );
692 if( m_eErrorBarType
== ERROR_BAR_Y
)
694 m_aFiNegative
.SetImage( SELECT_IMAGE( BMP_INDICATE_DOWN
));
695 m_aFiPositive
.SetImage( SELECT_IMAGE( BMP_INDICATE_UP
));
696 m_aFiBoth
.SetImage( SELECT_IMAGE( BMP_INDICATE_BOTH_VERTI
));
698 else if( m_eErrorBarType
== ERROR_BAR_X
)
700 m_aFiNegative
.SetImage( SELECT_IMAGE( BMP_INDICATE_LEFT
));
701 m_aFiPositive
.SetImage( SELECT_IMAGE( BMP_INDICATE_RIGHT
));
702 m_aFiBoth
.SetImage( SELECT_IMAGE( BMP_INDICATE_BOTH_HORI
));
706 void ErrorBarResources::listeningFinished(
707 const ::rtl::OUString
& rNewRange
)
709 OSL_ASSERT( m_apRangeSelectionHelper
.get());
710 if( ! m_apRangeSelectionHelper
.get())
713 // rNewRange becomes invalid after removing the listener
714 ::rtl::OUString
aRange( rNewRange
);
716 // m_rDialogModel.startControllerLockTimer();
719 m_apRangeSelectionHelper
->stopRangeListening();
722 if( m_pParentWindow
)
724 m_pParentWindow
->ToTop();
725 m_pParentWindow
->GrabFocus();
728 if( m_pCurrentRangeChoosingField
)
730 m_pCurrentRangeChoosingField
->SetText( String( aRange
));
731 m_pCurrentRangeChoosingField
->GrabFocus();
732 PosValueChanged( 0 );
735 m_pCurrentRangeChoosingField
= 0;
737 UpdateControlStates();
738 OSL_ASSERT( m_pParentDialog
);
739 if( m_pParentDialog
)
740 lcl_enableRangeChoosing( false, m_pParentDialog
);
743 void ErrorBarResources::disposingRangeSelection()
745 OSL_ASSERT( m_apRangeSelectionHelper
.get());
746 if( m_apRangeSelectionHelper
.get())
747 m_apRangeSelectionHelper
->stopRangeListening( false );
750 bool ErrorBarResources::isRangeFieldContentValid( Edit
& rEdit
)
752 ::rtl::OUString
aRange( rEdit
.GetText());
753 bool bIsValid
= ( aRange
.getLength() == 0 ) ||
754 ( m_apRangeSelectionHelper
.get() &&
755 m_apRangeSelectionHelper
->verifyCellRange( aRange
));
757 if( bIsValid
|| !rEdit
.IsEnabled())
759 rEdit
.SetControlForeground();
760 rEdit
.SetControlBackground();
764 rEdit
.SetControlBackground( RANGE_SELECTION_INVALID_RANGE_BACKGROUND_COLOR
);
765 rEdit
.SetControlForeground( RANGE_SELECTION_INVALID_RANGE_FOREGROUND_COLOR
);
771 //.............................................................................
773 //.............................................................................