Resolves: tdf#125106 fix cell protect TriState toggles

and merge duplicated TriStateEnabled class

Reviewed-on: https://gerrit.libreoffice.org/71905
Tested-by: Xisco Faulí <xiscofauli@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
(cherry picked from commit 2376db068d8194d3455681a559369e50743e29f3)

Change-Id: I1f145558fe9d86682e03481fb2800386d04d2b1d
Reviewed-on: https://gerrit.libreoffice.org/71994
Reviewed-by: Michael Stahl <Michael.Stahl@cib.de>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/cui/source/inc/paragrph.hxx b/cui/source/inc/paragrph.hxx
index 183dbba..b741934 100644
--- a/cui/source/inc/paragrph.hxx
+++ b/cui/source/inc/paragrph.hxx
@@ -184,18 +184,6 @@ public:
    virtual void            PageCreated(const SfxAllItemSet& aSet) override;
};

struct TriStateEnabled
{
    TriState eState;
    bool bTriStateEnabled;
    TriStateEnabled()
        : eState(TRISTATE_INDET)
        , bTriStateEnabled(true)
    {
    }
    void ButtonToggled(weld::ToggleButton& rToggle);
};

// class SvxExtParagraphTabPage ------------------------------------------
/*
    [Description]
@@ -235,14 +223,14 @@ protected:
private:
    SvxExtParagraphTabPage(TabPageParent pParent, const SfxItemSet& rSet);

    TriStateEnabled aHyphenState;
    TriStateEnabled aPageBreakState;
    TriStateEnabled aApplyCollState;
    TriStateEnabled aPageNumState;
    TriStateEnabled aKeepTogetherState;
    TriStateEnabled aKeepParaState;
    TriStateEnabled aOrphanState;
    TriStateEnabled aWidowState;
    weld::TriStateEnabled aHyphenState;
    weld::TriStateEnabled aPageBreakState;
    weld::TriStateEnabled aApplyCollState;
    weld::TriStateEnabled aPageNumState;
    weld::TriStateEnabled aKeepTogetherState;
    weld::TriStateEnabled aKeepParaState;
    weld::TriStateEnabled aOrphanState;
    weld::TriStateEnabled aWidowState;

    bool                bPageBreak;
    bool                bHtmlMode;
diff --git a/cui/source/tabpages/paragrph.cxx b/cui/source/tabpages/paragrph.cxx
index a8d9d8a..3551517 100644
--- a/cui/source/tabpages/paragrph.cxx
+++ b/cui/source/tabpages/paragrph.cxx
@@ -2063,26 +2063,6 @@ IMPL_LINK(SvxExtParagraphTabPage, WidowHdl_Impl, weld::ToggleButton&, rToggle, v
    WidowHdl();
}

void TriStateEnabled::ButtonToggled(weld::ToggleButton& rToggle)
{
    if (bTriStateEnabled)
    {
        switch (eState)
        {
            case TRISTATE_INDET:
                rToggle.set_state(TRISTATE_FALSE);
                break;
            case TRISTATE_TRUE:
                rToggle.set_state(TRISTATE_INDET);
                break;
            case TRISTATE_FALSE:
                rToggle.set_state(TRISTATE_TRUE);
                break;
        }
    }
    eState = rToggle.get_state();
}

IMPL_LINK(SvxExtParagraphTabPage, OrphanHdl_Impl, weld::ToggleButton&, rToggle, void)
{
    aOrphanState.ButtonToggled(rToggle);
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 4498290..a124cd09 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -627,6 +627,18 @@ public:
    virtual void connect_toggled(const Link<ToggleButton&, void>& rLink) { m_aToggleHdl = rLink; }
};

struct VCL_DLLPUBLIC TriStateEnabled
{
    TriState eState;
    bool bTriStateEnabled;
    TriStateEnabled()
        : eState(TRISTATE_INDET)
        , bTriStateEnabled(true)
    {
    }
    void ButtonToggled(ToggleButton& rToggle);
};

class VCL_DLLPUBLIC MenuButton : virtual public ToggleButton
{
protected:
diff --git a/sc/source/ui/attrdlg/tabpages.cxx b/sc/source/ui/attrdlg/tabpages.cxx
index 4e82125..8795514 100644
--- a/sc/source/ui/attrdlg/tabpages.cxx
+++ b/sc/source/ui/attrdlg/tabpages.cxx
@@ -49,10 +49,10 @@ ScTabPageProtection::ScTabPageProtection(TabPageParent pParent, const SfxItemSet
    //  States will be set in Reset
    bTriEnabled = bDontCare = bProtect = bHideForm = bHideCell = bHidePrint = false;

    m_xBtnProtect->connect_toggled(LINK(this, ScTabPageProtection, ButtonClickHdl));
    m_xBtnHideCell->connect_toggled(LINK(this, ScTabPageProtection, ButtonClickHdl));
    m_xBtnHideFormula->connect_toggled(LINK(this, ScTabPageProtection, ButtonClickHdl));
    m_xBtnHidePrint->connect_toggled(LINK(this, ScTabPageProtection, ButtonClickHdl));
    m_xBtnProtect->connect_toggled(LINK(this, ScTabPageProtection, ProtectClickHdl));
    m_xBtnHideCell->connect_toggled(LINK(this, ScTabPageProtection, HideCellClickHdl));
    m_xBtnHideFormula->connect_toggled(LINK(this, ScTabPageProtection, HideFormulaClickHdl));
    m_xBtnHidePrint->connect_toggled(LINK(this, ScTabPageProtection, HidePrintClickHdl));
}

ScTabPageProtection::~ScTabPageProtection()
@@ -98,14 +98,10 @@ void ScTabPageProtection::Reset( const SfxItemSet* rCoreAttrs )
        bHidePrint = pProtAttr->GetHidePrint();
    }

    //  Start Controls
    if (bTriEnabled)
    {
        m_xBtnProtect->set_state(TRISTATE_INDET);
        m_xBtnHideCell->set_state(TRISTATE_INDET);
        m_xBtnHideFormula->set_state(TRISTATE_INDET);
        m_xBtnHidePrint->set_state(TRISTATE_INDET);
    }
    aHideCellState.bTriStateEnabled = bTriEnabled;
    aProtectState.bTriStateEnabled = bTriEnabled;
    aHideFormulaState.bTriStateEnabled = bTriEnabled;
    aHidePrintState.bTriStateEnabled = bTriEnabled;

    UpdateButtons();
}
@@ -148,7 +144,31 @@ DeactivateRC ScTabPageProtection::DeactivatePage( SfxItemSet* pSetP )
    return DeactivateRC::LeavePage;
}

IMPL_LINK(ScTabPageProtection, ButtonClickHdl, weld::ToggleButton&, rBox, void)
IMPL_LINK(ScTabPageProtection, ProtectClickHdl, weld::ToggleButton&, rBox, void)
{
    aProtectState.ButtonToggled(rBox);
    ButtonClick(rBox);
}

IMPL_LINK(ScTabPageProtection, HideCellClickHdl, weld::ToggleButton&, rBox, void)
{
    aHideCellState.ButtonToggled(rBox);
    ButtonClick(rBox);
}

IMPL_LINK(ScTabPageProtection, HideFormulaClickHdl, weld::ToggleButton&, rBox, void)
{
    aHideFormulaState.ButtonToggled(rBox);
    ButtonClick(rBox);
}

IMPL_LINK(ScTabPageProtection, HidePrintClickHdl, weld::ToggleButton&, rBox, void)
{
    aHidePrintState.ButtonToggled(rBox);
    ButtonClick(rBox);
}

void ScTabPageProtection::ButtonClick(weld::ToggleButton& rBox)
{
    TriState eState = rBox.get_state();
    if (eState == TRISTATE_INDET)
@@ -192,6 +212,11 @@ void ScTabPageProtection::UpdateButtons()
        m_xBtnHidePrint->set_state(bHidePrint ? TRISTATE_TRUE : TRISTATE_FALSE);
    }

    aHideCellState.eState = m_xBtnHideCell->get_state();
    aProtectState.eState = m_xBtnProtect->get_state();
    aHideFormulaState.eState = m_xBtnHideFormula->get_state();
    aHidePrintState.eState = m_xBtnHidePrint->get_state();

    bool bEnable = (m_xBtnHideCell->get_state() != TRISTATE_TRUE);
    {
        m_xBtnProtect->set_sensitive(bEnable);
diff --git a/sc/source/ui/inc/tabpages.hxx b/sc/source/ui/inc/tabpages.hxx
index 8abd667..16046ab 100644
--- a/sc/source/ui/inc/tabpages.hxx
+++ b/sc/source/ui/inc/tabpages.hxx
@@ -50,14 +50,23 @@ private:
    bool            bHideCell;
    bool            bHidePrint;

    weld::TriStateEnabled aHideCellState;
    weld::TriStateEnabled aProtectState;
    weld::TriStateEnabled aHideFormulaState;
    weld::TriStateEnabled aHidePrintState;

    std::unique_ptr<weld::CheckButton> m_xBtnHideCell;
    std::unique_ptr<weld::CheckButton> m_xBtnProtect;
    std::unique_ptr<weld::CheckButton> m_xBtnHideFormula;
    std::unique_ptr<weld::CheckButton> m_xBtnHidePrint;

    // Handler:
    DECL_LINK(ButtonClickHdl, weld::ToggleButton&, void);
    void        UpdateButtons();
    DECL_LINK(ProtectClickHdl, weld::ToggleButton&, void);
    DECL_LINK(HideCellClickHdl, weld::ToggleButton&, void);
    DECL_LINK(HideFormulaClickHdl, weld::ToggleButton&, void);
    DECL_LINK(HidePrintClickHdl, weld::ToggleButton&, void);
    void ButtonClick(weld::ToggleButton& rBox);
    void UpdateButtons();
};

#endif // INCLUDED_SC_SOURCE_UI_INC_TABPAGES_HXX
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index bce3b38..0f92561 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -3836,6 +3836,26 @@ namespace weld
            m_xContentArea->move(m_xRelocate.get(), m_xOrigParent.get());
        }
    }

    void TriStateEnabled::ButtonToggled(weld::ToggleButton& rToggle)
    {
        if (bTriStateEnabled)
        {
            switch (eState)
            {
                case TRISTATE_INDET:
                    rToggle.set_state(TRISTATE_FALSE);
                    break;
                case TRISTATE_TRUE:
                    rToggle.set_state(TRISTATE_INDET);
                    break;
                case TRISTATE_FALSE:
                    rToggle.set_state(TRISTATE_TRUE);
                    break;
            }
        }
        eState = rToggle.get_state();
    }
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */