Switch the weld::Entry and weld::TextView handlers
that are called when the text changes due to user
interaction to pass a weld::TextWidget& param
instead of a weld::Entry& and weld::TextView&
one respectively.
Adjust related methods across the code base accordingly.
This unifies the behavior for both of these
weld::TextWidget subclasses and prepares for
deduplicating the logic and moving it to the
common base class in an upcoming commit.
That will also ensure they stay in sync.
(Change also motivated by the fact that their behavior was
differing before
Change-Id: I03d2a13cd84d53d806eb9e363f49c4b6be28d938
Author: Michael Weghorn <m.weghorn@posteo.de>
Date: Thu Jul 9 13:08:58 2026 +0200
tdf#130857 weld: Don't signal about programmatic TextView text change
.)
Change-Id: I5572fc88caf577fae9a23a39f1ec4f2179935a99
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/207936
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
719 lines
25 KiB
C++
719 lines
25 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
* with this work for additional information regarding copyright
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
*/
|
|
|
|
#include <res_ErrorBar.hxx>
|
|
#include <bitmaps.hlst>
|
|
#include <RangeSelectionHelper.hxx>
|
|
#include <helpids.h>
|
|
#include <chartview/ChartSfxItemIds.hxx>
|
|
#include <vcl/weld/Builder.hxx>
|
|
#include <vcl/weld/Button.hxx>
|
|
#include <vcl/weld/CheckButton.hxx>
|
|
#include <vcl/weld/ComboBox.hxx>
|
|
#include <vcl/weld/Frame.hxx>
|
|
#include <vcl/weld/Image.hxx>
|
|
#include <vcl/weld/Label.hxx>
|
|
#include <vcl/weld/MetricSpinButton.hxx>
|
|
#include <vcl/weld/RadioButton.hxx>
|
|
|
|
#include <ChartModel.hxx>
|
|
|
|
#include <rtl/math.hxx>
|
|
#include <comphelper/diagnose_ex.hxx>
|
|
#include <osl/diagnose.h>
|
|
#include <svl/stritem.hxx>
|
|
#include <tools/fldunit.hxx>
|
|
|
|
#define CHART_LB_FUNCTION_STD_ERROR 0
|
|
#define CHART_LB_FUNCTION_STD_DEV 1
|
|
#define CHART_LB_FUNCTION_VARIANCE 2
|
|
#define CHART_LB_FUNCTION_ERROR_MARGIN 3
|
|
|
|
using namespace ::com::sun::star;
|
|
|
|
namespace
|
|
{
|
|
|
|
sal_uInt16 lcl_getLbEntryPosByErrorKind( SvxChartKindError eErrorKind )
|
|
{
|
|
sal_uInt16 nResult = 0;
|
|
switch( eErrorKind )
|
|
{
|
|
// for these cases select the default in the list box
|
|
case SvxChartKindError::NONE:
|
|
case SvxChartKindError::Percent:
|
|
case SvxChartKindError::Const:
|
|
case SvxChartKindError::Range:
|
|
case SvxChartKindError::Sigma:
|
|
nResult = CHART_LB_FUNCTION_STD_DEV;
|
|
break;
|
|
case SvxChartKindError::Variant:
|
|
nResult = CHART_LB_FUNCTION_VARIANCE;
|
|
break;
|
|
case SvxChartKindError::BigError:
|
|
nResult = CHART_LB_FUNCTION_ERROR_MARGIN;
|
|
break;
|
|
case SvxChartKindError::StdError:
|
|
nResult = CHART_LB_FUNCTION_STD_ERROR;
|
|
break;
|
|
}
|
|
return nResult;
|
|
}
|
|
} // anonymous namespace
|
|
|
|
namespace chart
|
|
{
|
|
|
|
ErrorBarResources::ErrorBarResources(weld::Builder* pParent, weld::DialogController* pController,
|
|
const SfxItemSet& rInAttrs, bool bNoneAvailable,
|
|
tErrorBarType eType /* = ERROR_BAR_Y */ )
|
|
: m_eErrorKind( SvxChartKindError::NONE )
|
|
, m_eIndicate( SvxChartIndicate::Both )
|
|
, m_bErrorKindUnique( true )
|
|
, m_bIndicatorUnique( true )
|
|
, m_bRangePosUnique( true )
|
|
, m_bRangeNegUnique( true )
|
|
, m_eErrorBarType( eType )
|
|
, m_nConstDecimalDigits( 1 )
|
|
, m_nConstSpinSize( 1 )
|
|
, m_fPlusValue(0.0)
|
|
, m_fMinusValue(0.0)
|
|
, m_pController(pController)
|
|
, m_pCurrentRangeChoosingField( nullptr )
|
|
, m_bHasInternalDataProvider( true )
|
|
, m_bEnableDataTableDialog( true )
|
|
, m_xRbNone(pParent->weld_radio_button(u"RB_NONE"_ustr))
|
|
, m_xRbConst(pParent->weld_radio_button(u"RB_CONST"_ustr))
|
|
, m_xRbPercent(pParent->weld_radio_button(u"RB_PERCENT"_ustr))
|
|
, m_xRbFunction(pParent->weld_radio_button(u"RB_FUNCTION"_ustr))
|
|
, m_xRbRange(pParent->weld_radio_button(u"RB_RANGE"_ustr))
|
|
, m_xLbFunction(pParent->weld_combo_box(u"LB_FUNCTION"_ustr))
|
|
, m_xFlParameters(pParent->weld_frame(u"framePARAMETERS"_ustr))
|
|
, m_xBxPositive(pParent->weld_widget(u"boxPOSITIVE"_ustr))
|
|
, m_xMfPositive(pParent->weld_metric_spin_button(u"MF_POSITIVE"_ustr, FieldUnit::NONE))
|
|
, m_xEdRangePositive(pParent->weld_entry(u"ED_RANGE_POSITIVE"_ustr))
|
|
, m_xIbRangePositive(pParent->weld_button(u"IB_RANGE_POSITIVE"_ustr))
|
|
, m_xBxNegative(pParent->weld_widget(u"boxNEGATIVE"_ustr))
|
|
, m_xMfNegative(pParent->weld_metric_spin_button(u"MF_NEGATIVE"_ustr, FieldUnit::NONE))
|
|
, m_xEdRangeNegative(pParent->weld_entry(u"ED_RANGE_NEGATIVE"_ustr))
|
|
, m_xIbRangeNegative(pParent->weld_button(u"IB_RANGE_NEGATIVE"_ustr))
|
|
, m_xCbSyncPosNeg(pParent->weld_check_button(u"CB_SYN_POS_NEG"_ustr))
|
|
, m_xRbBoth(pParent->weld_radio_button(u"RB_BOTH"_ustr))
|
|
, m_xRbPositive(pParent->weld_radio_button(u"RB_POSITIVE"_ustr))
|
|
, m_xRbNegative(pParent->weld_radio_button(u"RB_NEGATIVE"_ustr))
|
|
, m_xFiBoth(pParent->weld_image(u"FI_BOTH"_ustr))
|
|
, m_xFiPositive(pParent->weld_image(u"FI_POSITIVE"_ustr))
|
|
, m_xFiNegative(pParent->weld_image(u"FI_NEGATIVE"_ustr))
|
|
, m_xUIStringPos(pParent->weld_label(u"STR_DATA_SELECT_RANGE_FOR_POSITIVE_ERRORBARS"_ustr))
|
|
, m_xUIStringNeg(pParent->weld_label(u"STR_DATA_SELECT_RANGE_FOR_NEGATIVE_ERRORBARS"_ustr))
|
|
, m_xUIStringRbRange(pParent->weld_label(u"STR_CONTROLTEXT_ERROR_BARS_FROM_DATA"_ustr))
|
|
{
|
|
if( bNoneAvailable )
|
|
m_xRbNone->connect_toggled(LINK(this, ErrorBarResources, CategoryChosen));
|
|
else
|
|
m_xRbNone->hide();
|
|
|
|
m_xRbConst->connect_toggled( LINK( this, ErrorBarResources, CategoryChosen ));
|
|
m_xRbPercent->connect_toggled( LINK( this, ErrorBarResources, CategoryChosen ));
|
|
m_xRbFunction->connect_toggled( LINK( this, ErrorBarResources, CategoryChosen ));
|
|
m_xRbRange->connect_toggled( LINK( this, ErrorBarResources, CategoryChosen ));
|
|
m_xLbFunction->connect_changed( LINK( this, ErrorBarResources, CategoryChosen2 ));
|
|
|
|
m_xCbSyncPosNeg->set_active( false );
|
|
m_xCbSyncPosNeg->connect_toggled( LINK( this, ErrorBarResources, SynchronizePosAndNeg ));
|
|
|
|
m_xMfPositive->connect_value_changed( LINK( this, ErrorBarResources, PosValueChanged ));
|
|
m_xEdRangePositive->connect_changed( LINK( this, ErrorBarResources, RangeChanged ));
|
|
m_xEdRangeNegative->connect_changed( LINK( this, ErrorBarResources, RangeChanged ));
|
|
|
|
m_xRbPositive->connect_toggled( LINK( this, ErrorBarResources, IndicatorChanged ));
|
|
m_xRbNegative->connect_toggled( LINK( this, ErrorBarResources, IndicatorChanged ));
|
|
m_xRbBoth->connect_toggled( LINK( this, ErrorBarResources, IndicatorChanged ));
|
|
|
|
m_xIbRangePositive->connect_clicked( LINK( this, ErrorBarResources, ChooseRange ));
|
|
m_xIbRangeNegative->connect_clicked( LINK( this, ErrorBarResources, ChooseRange ));
|
|
|
|
FillValueSets();
|
|
Reset( rInAttrs );
|
|
}
|
|
|
|
ErrorBarResources::~ErrorBarResources()
|
|
{
|
|
}
|
|
|
|
void ErrorBarResources::SetErrorBarType( tErrorBarType eNewType )
|
|
{
|
|
if( m_eErrorBarType != eNewType )
|
|
{
|
|
m_eErrorBarType = eNewType;
|
|
FillValueSets();
|
|
}
|
|
}
|
|
|
|
void ErrorBarResources::SetChartDocumentForRangeChoosing(
|
|
const rtl::Reference<::chart::ChartModel> & xChartDocument )
|
|
{
|
|
if( xChartDocument.is())
|
|
{
|
|
m_bHasInternalDataProvider = xChartDocument->hasInternalDataProvider();
|
|
uno::Reference< beans::XPropertySet > xProps( static_cast<cppu::OWeakObject*>(xChartDocument.get()), uno::UNO_QUERY );
|
|
if ( xProps.is() )
|
|
{
|
|
try
|
|
{
|
|
xProps->getPropertyValue(u"EnableDataTableDialog"_ustr) >>= m_bEnableDataTableDialog;
|
|
}
|
|
catch( const uno::Exception& )
|
|
{
|
|
TOOLS_WARN_EXCEPTION("chart2", "" );
|
|
}
|
|
}
|
|
}
|
|
m_apRangeSelectionHelper.reset( new RangeSelectionHelper( xChartDocument ));
|
|
|
|
// has internal data provider => rename "cell range" to "from data"
|
|
OSL_ASSERT(m_apRangeSelectionHelper);
|
|
if( m_bHasInternalDataProvider )
|
|
{
|
|
m_xRbRange->set_label(m_xUIStringRbRange->get_label());
|
|
m_xRbRange->set_help_id(HID_SCH_ERROR_BARS_FROM_DATA);
|
|
}
|
|
|
|
if( m_xRbRange->get_active())
|
|
{
|
|
isRangeFieldContentValid( *m_xEdRangePositive );
|
|
isRangeFieldContentValid( *m_xEdRangeNegative );
|
|
}
|
|
}
|
|
|
|
void ErrorBarResources::SetAxisMinorStepWidthForErrorBarDecimals( double fMinorStepWidth )
|
|
{
|
|
if( fMinorStepWidth < 0 )
|
|
fMinorStepWidth = -fMinorStepWidth;
|
|
|
|
sal_Int32 nExponent = static_cast< sal_Int32 >( ::rtl::math::approxFloor( log10( fMinorStepWidth )));
|
|
if( nExponent <= 0 )
|
|
{
|
|
// one digit precision more
|
|
m_nConstDecimalDigits = static_cast< sal_uInt16 >( (-nExponent) + 1 );
|
|
m_nConstSpinSize = 10;
|
|
}
|
|
else
|
|
{
|
|
m_nConstDecimalDigits = 0;
|
|
m_nConstSpinSize = static_cast< sal_Int64 >( pow( 10.0, static_cast<int>(nExponent) ));
|
|
}
|
|
}
|
|
|
|
void ErrorBarResources::UpdateControlStates()
|
|
{
|
|
// function
|
|
bool bIsFunction = m_xRbFunction->get_active();
|
|
m_xLbFunction->set_sensitive( bIsFunction );
|
|
|
|
// range buttons
|
|
m_xRbRange->set_sensitive( !m_bHasInternalDataProvider || m_bEnableDataTableDialog );
|
|
bool bShowRange = m_xRbRange->get_active();
|
|
bool bCanChooseRange =
|
|
( bShowRange &&
|
|
m_apRangeSelectionHelper &&
|
|
m_apRangeSelectionHelper->hasRangeSelection());
|
|
|
|
m_xMfPositive->set_visible( ! bShowRange );
|
|
m_xMfNegative->set_visible( ! bShowRange );
|
|
|
|
// use range but without range chooser => hide controls
|
|
m_xEdRangePositive->set_visible( bShowRange && ! m_bHasInternalDataProvider );
|
|
m_xIbRangePositive->set_visible( bCanChooseRange );
|
|
m_xEdRangeNegative->set_visible( bShowRange && ! m_bHasInternalDataProvider );
|
|
m_xIbRangeNegative->set_visible( bCanChooseRange );
|
|
|
|
bool bShowPosNegAndSync = ! (bShowRange && m_bHasInternalDataProvider);
|
|
m_xFlParameters->set_visible( bShowPosNegAndSync );
|
|
|
|
// unit for metric fields
|
|
bool bIsErrorMargin(
|
|
( m_xRbFunction->get_active()) &&
|
|
( m_xLbFunction->get_active() == CHART_LB_FUNCTION_ERROR_MARGIN ));
|
|
bool bIsPercentage( m_xRbPercent->get_active() || bIsErrorMargin );
|
|
FieldUnit eFieldUnit = FieldUnit::NONE;
|
|
|
|
if( bIsPercentage )
|
|
{
|
|
eFieldUnit = FieldUnit::PERCENT;
|
|
m_xMfPositive->set_digits( 1 );
|
|
m_xMfPositive->set_increments(10, 100, FieldUnit::NONE);
|
|
m_xMfNegative->set_digits( 1 );
|
|
m_xMfNegative->set_increments(10, 100, FieldUnit::NONE);
|
|
}
|
|
else
|
|
{
|
|
m_xMfPositive->set_digits( m_nConstDecimalDigits );
|
|
m_xMfPositive->set_increments(m_nConstSpinSize, m_nConstSpinSize * 10, FieldUnit::NONE);
|
|
m_xMfNegative->set_digits( m_nConstDecimalDigits );
|
|
m_xMfNegative->set_increments(m_nConstSpinSize, m_nConstSpinSize * 10, FieldUnit::NONE);
|
|
}
|
|
|
|
sal_Int32 nPlusValue = static_cast< sal_Int32 >( m_fPlusValue * pow(10.0,m_xMfPositive->get_digits()) );
|
|
sal_Int32 nMinusValue = static_cast< sal_Int32 >( m_fMinusValue * pow(10.0,m_xMfNegative->get_digits()) );
|
|
|
|
m_xMfPositive->set_value(nPlusValue, FieldUnit::NONE);
|
|
m_xMfNegative->set_value(nMinusValue, FieldUnit::NONE);
|
|
|
|
m_xMfPositive->set_unit(eFieldUnit);
|
|
m_xMfNegative->set_unit(eFieldUnit);
|
|
|
|
// positive and negative value fields
|
|
bool bPosEnabled = ( m_xRbPositive->get_active() || m_xRbBoth->get_active());
|
|
bool bNegEnabled = ( m_xRbNegative->get_active() || m_xRbBoth->get_active());
|
|
if( !( bPosEnabled || bNegEnabled ))
|
|
{
|
|
// all three controls are not checked -> ambiguous state
|
|
bPosEnabled = true;
|
|
bNegEnabled = true;
|
|
}
|
|
|
|
// functions with only one parameter
|
|
bool bOneParameterCategory =
|
|
bIsErrorMargin || m_xRbPercent->get_active();
|
|
if( bOneParameterCategory )
|
|
{
|
|
m_xCbSyncPosNeg->set_active(true);
|
|
}
|
|
|
|
if( m_xCbSyncPosNeg->get_active())
|
|
{
|
|
bPosEnabled = true;
|
|
bNegEnabled = false;
|
|
}
|
|
|
|
// all functions except error margin take no arguments
|
|
if( m_xRbFunction->get_active() && ( m_xLbFunction->get_active() != CHART_LB_FUNCTION_ERROR_MARGIN ))
|
|
{
|
|
bPosEnabled = false;
|
|
bNegEnabled = false;
|
|
}
|
|
|
|
// enable/disable pos/neg fields
|
|
m_xBxPositive->set_sensitive( bPosEnabled );
|
|
m_xBxNegative->set_sensitive( bNegEnabled );
|
|
if( bShowRange )
|
|
{
|
|
m_xEdRangePositive->set_sensitive( bPosEnabled );
|
|
m_xIbRangePositive->set_sensitive( bPosEnabled );
|
|
m_xEdRangeNegative->set_sensitive( bNegEnabled );
|
|
m_xIbRangeNegative->set_sensitive( bNegEnabled );
|
|
}
|
|
else
|
|
{
|
|
m_xMfPositive->set_sensitive( bPosEnabled );
|
|
m_xMfNegative->set_sensitive( bNegEnabled );
|
|
}
|
|
|
|
m_xCbSyncPosNeg->set_sensitive( !bOneParameterCategory && ( bPosEnabled || bNegEnabled ));
|
|
|
|
// mark invalid entries in the range fields
|
|
if( bShowRange && ! m_bHasInternalDataProvider )
|
|
{
|
|
isRangeFieldContentValid( *m_xEdRangePositive );
|
|
isRangeFieldContentValid( *m_xEdRangeNegative );
|
|
}
|
|
}
|
|
|
|
IMPL_LINK_NOARG( ErrorBarResources, CategoryChosen2, weld::ComboBox&, void )
|
|
{
|
|
CategoryChosen(*m_xRbConst);
|
|
}
|
|
|
|
IMPL_LINK_NOARG( ErrorBarResources, CategoryChosen, weld::Toggleable&, void )
|
|
{
|
|
m_bErrorKindUnique = true;
|
|
SvxChartKindError eOldError = m_eErrorKind;
|
|
|
|
if( m_xRbNone->get_active())
|
|
m_eErrorKind = SvxChartKindError::NONE;
|
|
else if( m_xRbConst->get_active())
|
|
m_eErrorKind = SvxChartKindError::Const;
|
|
else if( m_xRbPercent->get_active())
|
|
m_eErrorKind = SvxChartKindError::Percent;
|
|
else if( m_xRbRange->get_active())
|
|
m_eErrorKind = SvxChartKindError::Range;
|
|
else if( m_xRbFunction->get_active())
|
|
{
|
|
switch( m_xLbFunction->get_active())
|
|
{
|
|
case CHART_LB_FUNCTION_STD_ERROR:
|
|
m_eErrorKind = SvxChartKindError::StdError; break;
|
|
case CHART_LB_FUNCTION_STD_DEV:
|
|
m_eErrorKind = SvxChartKindError::Sigma; break;
|
|
case CHART_LB_FUNCTION_VARIANCE:
|
|
m_eErrorKind = SvxChartKindError::Variant; break;
|
|
case CHART_LB_FUNCTION_ERROR_MARGIN:
|
|
m_eErrorKind = SvxChartKindError::BigError; break;
|
|
default:
|
|
m_bErrorKindUnique = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
OSL_FAIL( "Unknown category chosen" );
|
|
m_bErrorKindUnique = false;
|
|
}
|
|
|
|
// changed to range
|
|
if( m_eErrorKind == SvxChartKindError::Range &&
|
|
eOldError != SvxChartKindError::Range )
|
|
{
|
|
m_xCbSyncPosNeg->set_active(
|
|
(!m_xEdRangePositive->get_text().isEmpty()) &&
|
|
m_xEdRangePositive->get_text() == m_xEdRangeNegative->get_text());
|
|
}
|
|
// changed from range
|
|
else if( m_eErrorKind != SvxChartKindError::Range &&
|
|
eOldError == SvxChartKindError::Range )
|
|
{
|
|
m_xCbSyncPosNeg->set_active( m_xMfPositive->get_value(FieldUnit::NONE) == m_xMfNegative->get_value(FieldUnit::NONE));
|
|
}
|
|
|
|
UpdateControlStates();
|
|
}
|
|
|
|
IMPL_LINK_NOARG(ErrorBarResources, SynchronizePosAndNeg, weld::Toggleable&, void)
|
|
{
|
|
UpdateControlStates();
|
|
PosValueChanged( *m_xMfPositive );
|
|
}
|
|
|
|
IMPL_LINK_NOARG(ErrorBarResources, PosValueChanged, weld::MetricSpinButton&, void)
|
|
{
|
|
if( m_xCbSyncPosNeg->get_active())
|
|
{
|
|
if( m_xRbRange->get_active())
|
|
{
|
|
m_xEdRangeNegative->set_text( m_xEdRangePositive->get_text());
|
|
m_bRangeNegUnique = m_bRangePosUnique;
|
|
}
|
|
else
|
|
m_xMfNegative->set_value(m_xMfPositive->get_value(FieldUnit::NONE), FieldUnit::NONE);
|
|
}
|
|
}
|
|
|
|
IMPL_LINK_NOARG(ErrorBarResources, IndicatorChanged, weld::Toggleable&, void)
|
|
{
|
|
m_bIndicatorUnique = true;
|
|
if( m_xRbBoth->get_active())
|
|
m_eIndicate = SvxChartIndicate::Both;
|
|
else if( m_xRbPositive->get_active())
|
|
m_eIndicate = SvxChartIndicate::Up;
|
|
else if( m_xRbNegative->get_active())
|
|
m_eIndicate = SvxChartIndicate::Down;
|
|
else
|
|
m_bIndicatorUnique = false;
|
|
|
|
UpdateControlStates();
|
|
}
|
|
|
|
IMPL_LINK(ErrorBarResources, ChooseRange, weld::Button&, rButton, void)
|
|
{
|
|
OSL_ASSERT(m_apRangeSelectionHelper);
|
|
if (!m_apRangeSelectionHelper)
|
|
return;
|
|
OSL_ASSERT( m_pCurrentRangeChoosingField == nullptr );
|
|
|
|
OUString aUIString;
|
|
|
|
if (&rButton == m_xIbRangePositive.get())
|
|
{
|
|
m_pCurrentRangeChoosingField = m_xEdRangePositive.get();
|
|
aUIString = m_xUIStringPos->get_label();
|
|
}
|
|
else
|
|
{
|
|
m_pCurrentRangeChoosingField = m_xEdRangeNegative.get();
|
|
aUIString = m_xUIStringNeg->get_label();
|
|
}
|
|
|
|
enableRangeChoosing(true, m_pController);
|
|
m_apRangeSelectionHelper->chooseRange(
|
|
m_pCurrentRangeChoosingField->get_text(),
|
|
aUIString, *this );
|
|
}
|
|
|
|
IMPL_LINK(ErrorBarResources, RangeChanged, weld::TextWidget&, rEdit, void)
|
|
{
|
|
if( &rEdit == m_xEdRangePositive.get() )
|
|
{
|
|
m_bRangePosUnique = true;
|
|
PosValueChanged( *m_xMfPositive );
|
|
}
|
|
else
|
|
{
|
|
m_bRangeNegUnique = true;
|
|
}
|
|
|
|
isRangeFieldContentValid(dynamic_cast<weld::Entry&>(rEdit));
|
|
}
|
|
|
|
void ErrorBarResources::Reset(const SfxItemSet& rInAttrs)
|
|
{
|
|
const SfxPoolItem *pPoolItem = nullptr;
|
|
|
|
// category
|
|
m_eErrorKind = SvxChartKindError::NONE;
|
|
SfxItemState aState = rInAttrs.GetItemState( SCHATTR_STAT_KIND_ERROR, true, &pPoolItem );
|
|
m_bErrorKindUnique = ( aState != SfxItemState::INVALID );
|
|
|
|
if( aState == SfxItemState::SET )
|
|
m_eErrorKind = pPoolItem->StaticWhichCast(SCHATTR_STAT_KIND_ERROR).GetValue();
|
|
|
|
m_xLbFunction->set_active( lcl_getLbEntryPosByErrorKind( m_eErrorKind ));
|
|
|
|
if( m_bErrorKindUnique )
|
|
{
|
|
switch( m_eErrorKind )
|
|
{
|
|
case SvxChartKindError::NONE:
|
|
m_xRbNone->set_active(true);
|
|
break;
|
|
case SvxChartKindError::Percent:
|
|
m_xRbPercent->set_active(true);
|
|
break;
|
|
case SvxChartKindError::Const:
|
|
m_xRbConst->set_active(true);
|
|
break;
|
|
case SvxChartKindError::StdError:
|
|
case SvxChartKindError::Variant:
|
|
case SvxChartKindError::Sigma:
|
|
case SvxChartKindError::BigError:
|
|
m_xRbFunction->set_active(true);
|
|
break;
|
|
case SvxChartKindError::Range:
|
|
m_xRbRange->set_active(true);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_xRbNone->set_active( false );
|
|
m_xRbConst->set_active( false );
|
|
m_xRbPercent->set_active( false );
|
|
m_xRbFunction->set_active( false );
|
|
}
|
|
|
|
// parameters
|
|
if( const SvxDoubleItem* pDoubleItem = rInAttrs.GetItemIfSet( SCHATTR_STAT_CONSTPLUS ) )
|
|
{
|
|
m_fPlusValue = pDoubleItem->GetValue();
|
|
}
|
|
|
|
if( const SvxDoubleItem* pStatItem = rInAttrs.GetItemIfSet( SCHATTR_STAT_CONSTMINUS ) )
|
|
{
|
|
m_fMinusValue = pStatItem->GetValue();
|
|
|
|
if( m_eErrorKind != SvxChartKindError::Range &&
|
|
m_fPlusValue == m_fMinusValue )
|
|
m_xCbSyncPosNeg->set_active(true);
|
|
}
|
|
|
|
// indicator
|
|
aState = rInAttrs.GetItemState( SCHATTR_STAT_INDICATE, true, &pPoolItem );
|
|
m_bIndicatorUnique = ( aState != SfxItemState::INVALID );
|
|
if( aState == SfxItemState::SET)
|
|
m_eIndicate = pPoolItem->StaticWhichCast(SCHATTR_STAT_INDICATE).GetValue();
|
|
|
|
if( m_bIndicatorUnique )
|
|
{
|
|
switch( m_eIndicate )
|
|
{
|
|
case SvxChartIndicate::NONE :
|
|
// no longer used, use both as default
|
|
m_eIndicate = SvxChartIndicate::Both;
|
|
[[fallthrough]]; // to BOTH
|
|
case SvxChartIndicate::Both :
|
|
m_xRbBoth->set_active(true); break;
|
|
case SvxChartIndicate::Up :
|
|
m_xRbPositive->set_active(true); break;
|
|
case SvxChartIndicate::Down :
|
|
m_xRbNegative->set_active(true); break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_xRbBoth->set_active( false );
|
|
m_xRbPositive->set_active( false );
|
|
m_xRbNegative->set_active( false );
|
|
}
|
|
|
|
// ranges
|
|
aState = rInAttrs.GetItemState( SCHATTR_STAT_RANGE_POS, true, &pPoolItem );
|
|
m_bRangePosUnique = ( aState != SfxItemState::INVALID );
|
|
if( aState == SfxItemState::SET )
|
|
{
|
|
OUString sRangePositive = pPoolItem->StaticWhichCast(SCHATTR_STAT_RANGE_POS).GetValue();
|
|
m_xEdRangePositive->set_text( sRangePositive );
|
|
}
|
|
|
|
aState = rInAttrs.GetItemState( SCHATTR_STAT_RANGE_NEG, true, &pPoolItem );
|
|
m_bRangeNegUnique = ( aState != SfxItemState::INVALID );
|
|
if( aState == SfxItemState::SET )
|
|
{
|
|
OUString sRangeNegative = pPoolItem->StaticWhichCast(SCHATTR_STAT_RANGE_NEG).GetValue();
|
|
m_xEdRangeNegative->set_text( sRangeNegative );
|
|
if( m_eErrorKind == SvxChartKindError::Range &&
|
|
!sRangeNegative.isEmpty() &&
|
|
sRangeNegative == m_xEdRangePositive->get_text() )
|
|
m_xCbSyncPosNeg->set_active(true);
|
|
}
|
|
|
|
UpdateControlStates();
|
|
}
|
|
|
|
void ErrorBarResources::FillItemSet(SfxItemSet& rOutAttrs) const
|
|
{
|
|
if( m_bErrorKindUnique )
|
|
rOutAttrs.Put( SvxChartKindErrorItem( m_eErrorKind, SCHATTR_STAT_KIND_ERROR ));
|
|
if( m_bIndicatorUnique )
|
|
rOutAttrs.Put( SvxChartIndicateItem( m_eIndicate, SCHATTR_STAT_INDICATE ));
|
|
|
|
if( m_bErrorKindUnique )
|
|
{
|
|
if( m_eErrorKind == SvxChartKindError::Range )
|
|
{
|
|
OUString aPosRange;
|
|
OUString aNegRange;
|
|
if( m_bHasInternalDataProvider )
|
|
{
|
|
// the strings aPosRange/aNegRange have to be set to a non-empty
|
|
// arbitrary string to generate error-bar sequences
|
|
aPosRange = "x";
|
|
aNegRange = aPosRange;
|
|
}
|
|
else
|
|
{
|
|
aPosRange = m_xEdRangePositive->get_text();
|
|
if( m_xCbSyncPosNeg->get_active())
|
|
aNegRange = aPosRange;
|
|
else
|
|
aNegRange = m_xEdRangeNegative->get_text();
|
|
}
|
|
|
|
if( m_bRangePosUnique )
|
|
rOutAttrs.Put( SfxStringItem( SCHATTR_STAT_RANGE_POS, aPosRange ));
|
|
if( m_bRangeNegUnique )
|
|
rOutAttrs.Put( SfxStringItem( SCHATTR_STAT_RANGE_NEG, aNegRange ));
|
|
}
|
|
else if( m_eErrorKind == SvxChartKindError::Const ||
|
|
m_eErrorKind == SvxChartKindError::Percent ||
|
|
m_eErrorKind == SvxChartKindError::BigError )
|
|
{
|
|
double fPosValue = static_cast< double >( m_xMfPositive->get_value(FieldUnit::NONE)) /
|
|
pow( 10.0, m_xMfPositive->get_digits());
|
|
double fNegValue = 0.0;
|
|
|
|
if( m_xCbSyncPosNeg->get_active())
|
|
fNegValue = fPosValue;
|
|
else
|
|
fNegValue = static_cast< double >( m_xMfNegative->get_value(FieldUnit::NONE)) /
|
|
pow( 10.0, m_xMfNegative->get_digits());
|
|
|
|
rOutAttrs.Put( SvxDoubleItem( fPosValue, SCHATTR_STAT_CONSTPLUS ));
|
|
rOutAttrs.Put( SvxDoubleItem( fNegValue, SCHATTR_STAT_CONSTMINUS ));
|
|
}
|
|
}
|
|
|
|
rOutAttrs.Put( SfxBoolItem( SCHATTR_STAT_ERRORBAR_TYPE , m_eErrorBarType == ERROR_BAR_Y ));
|
|
}
|
|
|
|
void ErrorBarResources::FillValueSets()
|
|
{
|
|
if( m_eErrorBarType == ERROR_BAR_Y )
|
|
{
|
|
m_xFiNegative->set_from_icon_name(BMP_INDICATE_DOWN);
|
|
m_xFiPositive->set_from_icon_name(BMP_INDICATE_UP);
|
|
m_xFiBoth->set_from_icon_name(BMP_INDICATE_BOTH_VERTI);
|
|
}
|
|
else if( m_eErrorBarType == ERROR_BAR_X )
|
|
{
|
|
m_xFiNegative->set_from_icon_name(BMP_INDICATE_LEFT);
|
|
m_xFiPositive->set_from_icon_name(BMP_INDICATE_RIGHT);
|
|
m_xFiBoth->set_from_icon_name(BMP_INDICATE_BOTH_HORI);
|
|
}
|
|
}
|
|
|
|
void ErrorBarResources::listeningFinished(
|
|
const OUString & rNewRange )
|
|
{
|
|
OSL_ASSERT(m_apRangeSelectionHelper);
|
|
if (!m_apRangeSelectionHelper)
|
|
return;
|
|
|
|
// rNewRange becomes invalid after removing the listener
|
|
OUString aRange( rNewRange );
|
|
|
|
// stop listening
|
|
m_apRangeSelectionHelper->stopRangeListening();
|
|
|
|
// change edit field
|
|
// if( m_pParentWindow )
|
|
// {
|
|
// m_pParentWindow->ToTop();
|
|
// m_pParentWindow->grab_focus();
|
|
// }
|
|
|
|
if( m_pCurrentRangeChoosingField )
|
|
{
|
|
m_pCurrentRangeChoosingField->set_text( aRange );
|
|
m_pCurrentRangeChoosingField->grab_focus();
|
|
PosValueChanged( *m_xMfPositive );
|
|
}
|
|
|
|
m_pCurrentRangeChoosingField = nullptr;
|
|
|
|
UpdateControlStates();
|
|
enableRangeChoosing(false, m_pController);
|
|
}
|
|
|
|
void ErrorBarResources::disposingRangeSelection()
|
|
{
|
|
OSL_ASSERT(m_apRangeSelectionHelper);
|
|
if (m_apRangeSelectionHelper)
|
|
m_apRangeSelectionHelper->stopRangeListening( false );
|
|
}
|
|
|
|
void ErrorBarResources::isRangeFieldContentValid(weld::Entry& rEdit)
|
|
{
|
|
OUString aRange( rEdit.get_text());
|
|
bool bIsValid = ( aRange.isEmpty() ) ||
|
|
( m_apRangeSelectionHelper &&
|
|
m_apRangeSelectionHelper->verifyCellRange( aRange ));
|
|
|
|
if( bIsValid || !rEdit.get_sensitive())
|
|
{
|
|
rEdit.set_message_type(weld::EntryMessageType::Normal);
|
|
}
|
|
else
|
|
{
|
|
rEdit.set_message_type(weld::EntryMessageType::Error);
|
|
}
|
|
}
|
|
|
|
} //namespace chart
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|