Related: tdf#150196 can't change away from "indeterminate" state

Change-Id: Iefa29d422eb810b4f1404bb9582fac508e1853f7
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137637
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/chart2/source/controller/dialogs/res_DataLabel.cxx b/chart2/source/controller/dialogs/res_DataLabel.cxx
index 3c6950e..8addcd6 100644
--- a/chart2/source/controller/dialogs/res_DataLabel.cxx
+++ b/chart2/source/controller/dialogs/res_DataLabel.cxx
@@ -64,12 +64,18 @@ bool lcl_ReadNumberFormatFromItemSet( const SfxItemSet& rSet, TypedWhichId<SfxUI
    return bSet;
}

void lcl_setBoolItemToCheckBox(const SfxItemSet& rInAttrs, TypedWhichId<SfxBoolItem> nWhichId, weld::CheckButton& rCheckbox)
void lcl_setBoolItemToCheckBox(const SfxItemSet& rInAttrs, TypedWhichId<SfxBoolItem> nWhichId, weld::CheckButton& rCheckbox, weld::TriStateEnabled& rTriState)
{
    if( const SfxBoolItem* pPoolItem = rInAttrs.GetItemIfSet(nWhichId) )
    {
        rCheckbox.set_active(pPoolItem->GetValue());
        rTriState.bTriStateEnabled = false;
    }
    else
    {
        rCheckbox.set_state(TRISTATE_INDET);
        rTriState.bTriStateEnabled = true;
    }
}

}//end anonymous namespace
@@ -170,9 +176,15 @@ IMPL_LINK(DataLabelResources, NumberFormatDialogHdl, weld::Button&, rButton, voi
    }

    if (&rButton == m_xPB_NumberFormatForValue.get() && !m_xCBNumber->get_active())
    {
        m_xCBNumber->set_active(true);
        m_aNumberState.bTriStateEnabled = false;
    }
    else if (&rButton == m_xPB_NumberFormatForPercent.get() && !m_xCBPercent->get_active())
    {
        m_xCBPercent->set_active(true);
        m_aPercentState.bTriStateEnabled = false;
    }

    SfxItemSet aNumberSet = NumberFormatDialog::CreateEmptyItemSetForNumberFormatDialog( *m_pPool );
    aNumberSet.Put (SvxNumberInfoItem( m_pNumberFormatter, SID_ATTR_NUMBERFORMAT_INFO));
@@ -209,8 +221,22 @@ IMPL_LINK(DataLabelResources, NumberFormatDialogHdl, weld::Button&, rButton, voi
    }
}

IMPL_LINK_NOARG(DataLabelResources, CheckHdl, weld::Toggleable&, void)
IMPL_LINK(DataLabelResources, CheckHdl, weld::Toggleable&, rToggle, void)
{
    if (&rToggle == m_xCBNumber.get())
        m_aNumberState.ButtonToggled(rToggle);
    else if (&rToggle == m_xCBPercent.get())
        m_aPercentState.ButtonToggled(rToggle);
    else if (&rToggle == m_xCBCategory.get())
        m_aCategoryState.ButtonToggled(rToggle);
    else if (&rToggle == m_xCBSymbol.get())
        m_aSymbolState.ButtonToggled(rToggle);
    else if (&rToggle == m_xCBDataSeries.get())
        m_aDataSeriesState.ButtonToggled(rToggle);
    else if (&rToggle == m_xCBWrapText.get())
        m_aWrapTextState.ButtonToggled(rToggle);
    else if (&rToggle == m_xCBCustomLeaderLines.get())
        m_aCustomLeaderLinesState.ButtonToggled(rToggle);
    EnableControls();
}

@@ -308,13 +334,13 @@ void DataLabelResources::Reset(const SfxItemSet& rInAttrs)
    // default state
    m_xCBSymbol->set_sensitive( false );

    lcl_setBoolItemToCheckBox( rInAttrs, SCHATTR_DATADESCR_SHOW_NUMBER, *m_xCBNumber );
    lcl_setBoolItemToCheckBox( rInAttrs, SCHATTR_DATADESCR_SHOW_PERCENTAGE, *m_xCBPercent );
    lcl_setBoolItemToCheckBox( rInAttrs, SCHATTR_DATADESCR_SHOW_CATEGORY, *m_xCBCategory );
    lcl_setBoolItemToCheckBox( rInAttrs, SCHATTR_DATADESCR_SHOW_SYMBOL, *m_xCBSymbol );
    lcl_setBoolItemToCheckBox( rInAttrs, SCHATTR_DATADESCR_SHOW_DATA_SERIES_NAME, *m_xCBDataSeries );
    lcl_setBoolItemToCheckBox( rInAttrs, SCHATTR_DATADESCR_WRAP_TEXT, *m_xCBWrapText );
    lcl_setBoolItemToCheckBox( rInAttrs, SCHATTR_DATADESCR_CUSTOM_LEADER_LINES, *m_xCBCustomLeaderLines );
    lcl_setBoolItemToCheckBox( rInAttrs, SCHATTR_DATADESCR_SHOW_NUMBER, *m_xCBNumber, m_aNumberState );
    lcl_setBoolItemToCheckBox( rInAttrs, SCHATTR_DATADESCR_SHOW_PERCENTAGE, *m_xCBPercent, m_aPercentState );
    lcl_setBoolItemToCheckBox( rInAttrs, SCHATTR_DATADESCR_SHOW_CATEGORY, *m_xCBCategory, m_aCategoryState );
    lcl_setBoolItemToCheckBox( rInAttrs, SCHATTR_DATADESCR_SHOW_SYMBOL, *m_xCBSymbol, m_aSymbolState );
    lcl_setBoolItemToCheckBox( rInAttrs, SCHATTR_DATADESCR_SHOW_DATA_SERIES_NAME, *m_xCBDataSeries, m_aDataSeriesState );
    lcl_setBoolItemToCheckBox( rInAttrs, SCHATTR_DATADESCR_WRAP_TEXT, *m_xCBWrapText, m_aWrapTextState );
    lcl_setBoolItemToCheckBox( rInAttrs, SCHATTR_DATADESCR_CUSTOM_LEADER_LINES, *m_xCBCustomLeaderLines, m_aCustomLeaderLinesState );

    m_bNumberFormatMixedState = !lcl_ReadNumberFormatFromItemSet( rInAttrs, SID_ATTR_NUMBERFORMAT_VALUE, SID_ATTR_NUMBERFORMAT_SOURCE, m_nNumberFormatForValue, m_bSourceFormatForValue, m_bSourceFormatMixedState );
    m_bPercentFormatMixedState = !lcl_ReadNumberFormatFromItemSet( rInAttrs, SCHATTR_PERCENT_NUMBERFORMAT_VALUE, SCHATTR_PERCENT_NUMBERFORMAT_SOURCE, m_nNumberFormatForPercent, m_bSourceFormatForPercent ,  m_bPercentSourceMixedState);
diff --git a/chart2/source/controller/dialogs/res_DataLabel.hxx b/chart2/source/controller/dialogs/res_DataLabel.hxx
index 56115b2..625b949 100644
--- a/chart2/source/controller/dialogs/res_DataLabel.hxx
+++ b/chart2/source/controller/dialogs/res_DataLabel.hxx
@@ -58,6 +58,14 @@ private:
    weld::Window*       m_pWindow;
    SfxItemPool*        m_pPool;

    weld::TriStateEnabled m_aNumberState;
    weld::TriStateEnabled m_aPercentState;
    weld::TriStateEnabled m_aCategoryState;
    weld::TriStateEnabled m_aSymbolState;
    weld::TriStateEnabled m_aDataSeriesState;
    weld::TriStateEnabled m_aWrapTextState;
    weld::TriStateEnabled m_aCustomLeaderLinesState;

    std::unique_ptr<weld::CheckButton> m_xCBNumber;
    std::unique_ptr<weld::Button> m_xPB_NumberFormatForValue;
    std::unique_ptr<weld::CheckButton> m_xCBPercent;