merge common code together

Change-Id: I26cb6184bd607b86c807219d6afbd9d445f346d0
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87964
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/svx/source/sidebar/paragraph/ParaSpacingWindow.cxx b/svx/source/sidebar/paragraph/ParaSpacingWindow.cxx
index 9815a06..f098f29 100644
--- a/svx/source/sidebar/paragraph/ParaSpacingWindow.cxx
+++ b/svx/source/sidebar/paragraph/ParaSpacingWindow.cxx
@@ -34,17 +34,48 @@ using namespace svx;
#define MAX_SC_SD               116220200
#define NEGA_MAXVALUE          -10000000

// ParaULSpacingWindow

ParaULSpacingWindow::ParaULSpacingWindow(vcl::Window* pParent)
InterimItemWindow::InterimItemWindow(vcl::Window* pParent, const OUString& rUIXMLDescription, const OString& rID)
    : Control(pParent, WB_TABSTOP)
    , m_eUnit(MapUnit::MapTwip)
{
    m_xVclContentArea = VclPtr<VclVBox>::Create(this);
    m_xVclContentArea->Show();
    m_xBuilder.reset(Application::CreateInterimBuilder(m_xVclContentArea, "svx/ui/paraulspacing.ui"));
    m_xContainer = m_xBuilder->weld_container("ParaULSpacingWindow");
    m_xBuilder.reset(Application::CreateInterimBuilder(m_xVclContentArea, rUIXMLDescription));
    m_xContainer = m_xBuilder->weld_container(rID);
}

InterimItemWindow::~InterimItemWindow()
{
    disposeOnce();
}

void InterimItemWindow::dispose()
{
    m_xContainer.reset();
    m_xBuilder.reset();
    m_xVclContentArea.disposeAndClear();

    Control::dispose();
}

void InterimItemWindow::Resize()
{
    vcl::Window *pChild = GetWindow(GetWindowType::FirstChild);
    assert(pChild);
    VclContainer::setLayoutAllocation(*pChild, Point(0, 0), GetSizePixel());
    Control::Resize();
}

Size InterimItemWindow::GetOptimalSize() const
{
    return VclContainer::getLayoutRequisition(*GetWindow(GetWindowType::FirstChild));
}

// ParaULSpacingWindow

ParaULSpacingWindow::ParaULSpacingWindow(vcl::Window* pParent)
    : InterimItemWindow(pParent, "svx/ui/paraulspacing.ui", "ParaULSpacingWindow")
    , m_eUnit(MapUnit::MapTwip)
{
    m_xAboveSpacing = std::make_unique<SvxRelativeField>(m_xBuilder->weld_metric_spin_button("aboveparaspacing", FieldUnit::CM));
    m_xBelowSpacing = std::make_unique<SvxRelativeField>(m_xBuilder->weld_metric_spin_button("belowparaspacing", FieldUnit::CM));
    m_xAboveContainer = m_xBuilder->weld_container("above");
@@ -71,11 +102,7 @@ void ParaULSpacingWindow::dispose()
    m_xAboveContainer.reset();
    m_xBelowContainer.reset();

    m_xContainer.reset();
    m_xBuilder.reset();
    m_xVclContentArea.disposeAndClear();

    Control::dispose();
    InterimItemWindow::dispose();
}

void ParaULSpacingWindow::SetUnit(FieldUnit eUnit)
@@ -102,19 +129,6 @@ void ParaULSpacingWindow::SetValue(const SvxULSpaceItem* pItem)
    m_xBelowSpacing->set_value(nVal, FieldUnit::MM_100TH);
}

void ParaULSpacingWindow::Resize()
{
    vcl::Window *pChild = GetWindow(GetWindowType::FirstChild);
    assert(pChild);
    VclContainer::setLayoutAllocation(*pChild, Point(0, 0), GetSizePixel());
    Control::Resize();
}

Size ParaULSpacingWindow::GetOptimalSize() const
{
    return VclContainer::getLayoutRequisition(*GetWindow(GetWindowType::FirstChild));
}

IMPL_LINK_NOARG(ParaULSpacingWindow, ModifySpacingHdl, weld::MetricSpinButton&, void)
{
    SfxDispatcher* pDisp = SfxViewFrame::Current()->GetBindings().GetDispatcher();
@@ -162,14 +176,9 @@ void ParaBelowSpacingWindow::GetFocus()
// ParaLRSpacingWindow

ParaLRSpacingWindow::ParaLRSpacingWindow(vcl::Window* pParent)
    : Control(pParent, WB_TABSTOP)
    : InterimItemWindow(pParent, "svx/ui/paralrspacing.ui", "ParaLRSpacingWindow")
    , m_eUnit(MapUnit::MapTwip)
{
    m_xVclContentArea = VclPtr<VclVBox>::Create(this);
    m_xVclContentArea->Show();
    m_xBuilder.reset(Application::CreateInterimBuilder(m_xVclContentArea, "svx/ui/paralrspacing.ui"));
    m_xContainer = m_xBuilder->weld_container("ParaLRSpacingWindow");

    m_xBeforeSpacing = std::make_unique<SvxRelativeField>(m_xBuilder->weld_metric_spin_button("beforetextindent", FieldUnit::CM));
    m_xAfterSpacing = std::make_unique<SvxRelativeField>(m_xBuilder->weld_metric_spin_button("aftertextindent", FieldUnit::CM));
    m_xFLSpacing = std::make_unique<SvxRelativeField>(m_xBuilder->weld_metric_spin_button("firstlineindent", FieldUnit::CM));
@@ -202,11 +211,7 @@ void ParaLRSpacingWindow::dispose()
    m_xAfterContainer.reset();
    m_xFirstLineContainer.reset();

    m_xContainer.reset();
    m_xBuilder.reset();
    m_xVclContentArea.disposeAndClear();

    Control::dispose();
    InterimItemWindow::dispose();
}

void ParaLRSpacingWindow::SetContext(const vcl::EnumContext& eContext)
@@ -311,19 +316,6 @@ void ParaLRSpacingWindow::SetValue(SfxItemState eState, const SfxPoolItem* pStat
    }
}

void ParaLRSpacingWindow::Resize()
{
    vcl::Window *pChild = GetWindow(GetWindowType::FirstChild);
    assert(pChild);
    VclContainer::setLayoutAllocation(*pChild, Point(0, 0), GetSizePixel());
    Control::Resize();
}

Size ParaLRSpacingWindow::GetOptimalSize() const
{
    return VclContainer::getLayoutRequisition(*GetWindow(GetWindowType::FirstChild));
}

void ParaLRSpacingWindow::SetUnit(FieldUnit eUnit)
{
    m_xBeforeSpacing->SetFieldUnit(eUnit);
diff --git a/svx/source/sidebar/paragraph/ParaSpacingWindow.hxx b/svx/source/sidebar/paragraph/ParaSpacingWindow.hxx
index 36dd90a..d25030c 100644
--- a/svx/source/sidebar/paragraph/ParaSpacingWindow.hxx
+++ b/svx/source/sidebar/paragraph/ParaSpacingWindow.hxx
@@ -27,9 +27,26 @@

using namespace com::sun::star;

class InterimItemWindow : public Control
{
public:
    virtual ~InterimItemWindow() override;
    virtual void dispose() override;

    virtual void Resize() override;
    virtual Size GetOptimalSize() const override;

protected:
    InterimItemWindow(vcl::Window* pParent, const OUString& rUIXMLDescription, const OString& rID);

    std::unique_ptr<weld::Builder> m_xBuilder;
    VclPtr<vcl::Window> m_xVclContentArea;
    std::unique_ptr<weld::Container> m_xContainer;
};

namespace svx {

class ParaULSpacingWindow : public Control
class ParaULSpacingWindow : public InterimItemWindow
{
public:
    virtual ~ParaULSpacingWindow() override;
@@ -38,16 +55,9 @@ public:
    void SetValue(const SvxULSpaceItem* pItem);
    void SetUnit(FieldUnit eUnit);

    virtual void Resize() override;
    virtual Size GetOptimalSize() const override;

protected:
    ParaULSpacingWindow(vcl::Window* pParent);

    std::unique_ptr<weld::Builder> m_xBuilder;
    VclPtr<vcl::Window> m_xVclContentArea;
    std::unique_ptr<weld::Container> m_xContainer;

    std::unique_ptr<SvxRelativeField> m_xAboveSpacing;
    std::unique_ptr<SvxRelativeField> m_xBelowSpacing;
    std::unique_ptr<weld::Container> m_xAboveContainer;
@@ -72,15 +82,12 @@ public:
    virtual void GetFocus() override;
};

class ParaLRSpacingWindow : public Control
class ParaLRSpacingWindow : public InterimItemWindow
{
public:
    virtual ~ParaLRSpacingWindow() override;
    virtual void dispose() override;

    virtual void Resize() override;
    virtual Size GetOptimalSize() const override;

    void SetValue(SfxItemState eState, const SfxPoolItem* pState);
    void SetUnit(FieldUnit eUnit);
    void SetContext(const vcl::EnumContext& eContext);
@@ -88,10 +95,6 @@ public:
protected:
    ParaLRSpacingWindow(vcl::Window* pParent);

    std::unique_ptr<weld::Builder> m_xBuilder;
    VclPtr<vcl::Window> m_xVclContentArea;
    std::unique_ptr<weld::Container> m_xContainer;

    std::unique_ptr<SvxRelativeField> m_xBeforeSpacing;
    std::unique_ptr<SvxRelativeField> m_xAfterSpacing;
    std::unique_ptr<SvxRelativeField> m_xFLSpacing;