tdf#146423 don't set a size-request during a size-alloc

and use a better width calculation

Change-Id: Ib873a8ed9e6424c09630650af352ba5a20c674b5
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128077
Tested-by: Jenkins
Reviewed-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
diff --git a/cui/source/options/optcolor.cxx b/cui/source/options/optcolor.cxx
index ebe066b..8024adb 100644
--- a/cui/source/options/optcolor.cxx
+++ b/cui/source/options/optcolor.cxx
@@ -188,7 +188,10 @@ public:
        return *m_xBox;
    }

    void AdjustExtraWidths(int nTextWidth);
    int GetLabelIndent() const
    {
        return m_nCheckBoxLabelOffset;
    }

private:
    // Chapter -- horizontal group separator stripe with text
@@ -207,10 +210,9 @@ private:
    {
    public:
        Entry(weld::Window* pTopLevel, weld::Builder& rBuilder, const char* pTextWidget, const char* pColorWidget,
              const Color& rColor, tools::Long nCheckBoxLabelOffset, bool bCheckBox, bool bShow);
              const Color& rColor, int nCheckBoxLabelOffset, bool bCheckBox, bool bShow);
    public:
        void SetText(const OUString& rLabel) { dynamic_cast<weld::Label&>(*m_xText).set_label(rLabel); }
        void set_width_request(int nTextWidth) { m_xText->set_size_request(nTextWidth, -1); }
        int get_height_request() const
        {
            return std::max(m_xText->get_preferred_size().Height(),
@@ -239,6 +241,7 @@ private:

private:
    weld::Window* m_pTopLevel;
    int m_nCheckBoxLabelOffset;
    std::unique_ptr<weld::Builder> m_xBuilder;
    std::unique_ptr<weld::Box> m_xBox;
    std::unique_ptr<weld::Widget> m_xWidget1;
@@ -280,7 +283,7 @@ ColorConfigWindow_Impl::Chapter::Chapter(weld::Builder& rBuilder, const char* pL
ColorConfigWindow_Impl::Entry::Entry(weld::Window* pTopLevel, weld::Builder& rBuilder,
                                     const char* pTextWidget, const char* pColorWidget,
                                     const Color& rColor,
                                     tools::Long nCheckBoxLabelOffset, bool bCheckBox, bool bShow)
                                     int nCheckBoxLabelOffset, bool bCheckBox, bool bShow)
    : m_xColorList(new ColorListBox(rBuilder.weld_menu_button(pColorWidget), [pTopLevel]{ return pTopLevel; }))
    , m_aDefaultColor(rColor)
{
@@ -365,8 +368,8 @@ ColorConfigWindow_Impl::ColorConfigWindow_Impl(weld::Window* pTopLevel, weld::Co
    : m_pTopLevel(pTopLevel)
    , m_xBuilder(Application::CreateBuilder(pParent, "cui/ui/colorconfigwin.ui"))
    , m_xBox(m_xBuilder->weld_box("ColorConfigWindow"))
    , m_xWidget1(m_xBuilder->weld_widget("doccolor"))
    , m_xWidget2(m_xBuilder->weld_widget("doccolor_lb"))
    , m_xWidget1(m_xBuilder->weld_widget("docboundaries"))
    , m_xWidget2(m_xBuilder->weld_widget("docboundaries_lb"))
{
    CreateEntries();
}
@@ -384,9 +387,8 @@ void ColorConfigWindow_Impl::CreateEntries()

    // Here we want to get the amount to add to the position of a FixedText to
    // get it to align its contents with that of a CheckBox
    tools::Long nCheckBoxLabelOffset = 0;
    {
        OUString sSampleText("X");
        OUString sSampleText("XXXXXX");
        std::unique_ptr<weld::CheckButton> xCheckBox(m_xBuilder->weld_check_button("docboundaries"));
        std::unique_ptr<weld::Label> xFixedText(m_xBuilder->weld_label("doccolor"));
        OUString sOrigCheck(xCheckBox->get_label());
@@ -397,7 +399,7 @@ void ColorConfigWindow_Impl::CreateEntries()
        Size aFixedSize(xFixedText->get_preferred_size());
        xCheckBox->set_label(sOrigCheck);
        xFixedText->set_label(sOrigFixed);
        nCheckBoxLabelOffset = aCheckSize.Width() - aFixedSize.Width();
        m_nCheckBoxLabelOffset = aCheckSize.Width() - aFixedSize.Width();
    }

    // creating entries
@@ -407,7 +409,7 @@ void ColorConfigWindow_Impl::CreateEntries()
        vEntries.push_back(std::make_shared<Entry>(m_pTopLevel, *m_xBuilder,
            vEntryInfo[i].pText, vEntryInfo[i].pColor,
            ColorConfig::GetDefaultColor(static_cast<ColorConfigEntry>(i)),
            nCheckBoxLabelOffset,
            m_nCheckBoxLabelOffset,
            vEntryInfo[i].bCheckBox,
            aModulesInstalled[vEntryInfo[i].eGroup]));
    }
@@ -441,18 +443,12 @@ void ColorConfigWindow_Impl::CreateEntries()
                aExtConfig.GetComponentColorConfigValue(sComponentName, i);
            vEntries.push_back(std::make_shared<Entry>(m_pTopLevel, *vExtBuilders.back(),
                "label", "button", aColorEntry.getDefaultColor(),
                nCheckBoxLabelOffset, false, true));
                m_nCheckBoxLabelOffset, false, true));
            vEntries.back()->SetText(aColorEntry.getDisplayName());
        }
    }
}

void ColorConfigWindow_Impl::AdjustExtraWidths(int nTextWidth)
{
    for (size_t i = SAL_N_ELEMENTS(vEntryInfo); i < vEntries.size(); ++i)
        vEntries[i]->set_width_request(nTextWidth);
}

// SetLinks()
void ColorConfigWindow_Impl::SetLinks(Link<weld::Toggleable&,void> const& aCheckLink,
                                      Link<ColorListBox&,void> const& aColorLink,
@@ -591,7 +587,6 @@ class ColorConfigCtrl_Impl
public:
    explicit ColorConfigCtrl_Impl(weld::Window* pTopLevel, weld::Builder& rbuilder);

    void AdjustExtraWidths(int nTextWidth) { m_xScrollWindow->AdjustExtraWidths(nTextWidth); }
    void SetConfig (EditableColorConfig& rConfig) { pColorConfig = &rConfig; }
    void SetExtendedConfig (EditableExtendedColorConfig& rConfig) { pExtColorConfig = &rConfig; }
    void Update();
@@ -611,6 +606,10 @@ public:
    {
        return m_xScrollWindow->GetWidget2();
    }
    int GetLabelIndent() const
    {
        return m_xScrollWindow->GetLabelIndent();
    }
};

ColorConfigCtrl_Impl::ColorConfigCtrl_Impl(weld::Window* pTopLevel, weld::Builder& rBuilder)
@@ -689,6 +688,7 @@ IMPL_LINK(ColorConfigCtrl_Impl, ControlFocusHdl, weld::Widget&, rCtrl, void)
SvxColorOptionsTabPage::SvxColorOptionsTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rCoreSet)
    : SfxTabPage(pPage, pController, "cui/ui/optappearancepage.ui", "OptAppearancePage", &rCoreSet)
    , bFillItemSetCalled(false)
    , m_nSizeAllocEventId(nullptr)
    , m_xColorSchemeLB(m_xBuilder->weld_combo_box("colorschemelb"))
    , m_xSaveSchemePB(m_xBuilder->weld_button("save"))
    , m_xDeleteSchemePB(m_xBuilder->weld_button("delete"))
@@ -734,6 +734,8 @@ SvxColorOptionsTabPage::~SvxColorOptionsTabPage()
        pExtColorConfig.reset();
    }
    m_xColorConfigCT.reset();
    if (m_nSizeAllocEventId)
        Application::RemoveUserEvent(m_nSizeAllocEventId);
}

std::unique_ptr<SfxTabPage> SvxColorOptionsTabPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rAttrSet)
@@ -865,17 +867,29 @@ void SvxColorOptionsTabPage::FillUserData()

IMPL_LINK_NOARG(SvxColorOptionsTabPage, AdjustHeaderBar, const Size&, void)
{
    if (m_nSizeAllocEventId)
        return;
    m_nSizeAllocEventId = Application::PostUserEvent(LINK(this, SvxColorOptionsTabPage, PostAdjustHeaderBar));
}

IMPL_LINK_NOARG(SvxColorOptionsTabPage, PostAdjustHeaderBar, void*, void)
{
    m_nSizeAllocEventId = nullptr;

    // horizontal positions
    int nX0 = 0, nX1, nX2, y, width, height;
    int nX1, nX2, nX3, y, width, height;
    if (!m_rWidget1.get_extents_relative_to(*m_xTable, nX1, y, width, height))
        return;
    if (!m_rWidget2.get_extents_relative_to(*m_xTable, nX2, y, width, height))
        return;
    auto nTextWidth1 = nX1 - nX0;
    auto nTextWidth2 = nX2 - nX1;
    if (!m_xTable->get_extents_relative_to(*m_xTable, nX3, y, width, height))
        return;

    // 6 is the column-spacing of the parent grid of these labels
    auto nTextWidth1 = nX1 + m_xColorConfigCT->GetLabelIndent() - 6;
    m_xOnFT->set_size_request(nTextWidth1, -1);
    m_xElementFT->set_size_request(nTextWidth2, -1);
    m_xColorConfigCT->AdjustExtraWidths(nTextWidth2 - 12);
    auto nTextWidth3 = width - nX2;
    m_xColorFT->set_size_request(nTextWidth3, -1);
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cui/source/options/optcolor.hxx b/cui/source/options/optcolor.hxx
index de84e06..ede03dc 100644
--- a/cui/source/options/optcolor.hxx
+++ b/cui/source/options/optcolor.hxx
@@ -23,10 +23,14 @@
namespace svtools {class EditableColorConfig;class EditableExtendedColorConfig;}
class ColorConfigCtrl_Impl;
class AbstractSvxNameDialog;
struct ImplSVEvent;

class SvxColorOptionsTabPage : public SfxTabPage
{
    bool bFillItemSetCalled;

    ImplSVEvent* m_nSizeAllocEventId;

    std::unique_ptr<weld::ComboBox> m_xColorSchemeLB;
    std::unique_ptr<weld::Button> m_xSaveSchemePB;
    std::unique_ptr<weld::Button> m_xDeleteSchemePB;
@@ -45,6 +49,7 @@ class SvxColorOptionsTabPage : public SfxTabPage
    DECL_LINK(SaveDeleteHdl_Impl, weld::Button&, void);
    DECL_LINK(CheckNameHdl_Impl, AbstractSvxNameDialog&, bool);
    DECL_LINK(AdjustHeaderBar, const Size&, void);
    DECL_LINK(PostAdjustHeaderBar, void *, void);
    void UpdateColorConfig();

public:
diff --git a/cui/uiconfig/ui/colorconfigwin.ui b/cui/uiconfig/ui/colorconfigwin.ui
index d640b0f..2bde28f 100644
--- a/cui/uiconfig/ui/colorconfigwin.ui
+++ b/cui/uiconfig/ui/colorconfigwin.ui
@@ -8,6 +8,7 @@
    <property name="margin-start">6</property>
    <property name="margin-end">6</property>
    <property name="margin-top">6</property>
    <property name="hexpand">True</property>
    <property name="orientation">vertical</property>
    <property name="spacing">12</property>
    <child>
diff --git a/cui/uiconfig/ui/optappearancepage.ui b/cui/uiconfig/ui/optappearancepage.ui
index 9b94b8a..e6625ea 100644
--- a/cui/uiconfig/ui/optappearancepage.ui
+++ b/cui/uiconfig/ui/optappearancepage.ui
@@ -215,10 +215,10 @@
                <property name="column_spacing">6</property>
                <child>
                  <object class="GtkLabel" id="uielements">
                    <property name="width_request">250</property>
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="no_show_all">True</property>
                    <property name="hexpand">True</property>
                    <property name="label" translatable="yes" context="optappearancepage|uielements">User interface elements</property>
                    <property name="xalign">0</property>
                  </object>
@@ -229,11 +229,9 @@
                </child>
                <child>
                  <object class="GtkLabel" id="colorsetting">
                    <property name="width_request">150</property>
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="no_show_all">True</property>
                    <property name="hexpand">True</property>
                    <property name="label" translatable="yes" context="optappearancepage|colorsetting">Color setting</property>
                    <property name="xalign">0</property>
                  </object>