rework PageMarginPopup to be a PopupWindowController

Change-Id: I60a66b9be14f79cd2968f4bd3d91740137ee9d85
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86782
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
index 228fff9..e2b1a8c 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
@@ -1206,6 +1206,17 @@
          <value>lo.writer.PageColumnToolBoxControl</value>
        </prop>
      </node>
      <node oor:name="PageMarginToolBoxControl" oor:op="replace">
        <prop oor:name="Command">
          <value>.uno:PageMargin</value>
        </prop>
        <prop oor:name="Module">
          <value/>
        </prop>
        <prop oor:name="Controller">
          <value>lo.writer.PageMarginToolBoxControl</value>
        </prop>
      </node>
      <node oor:name="com.sun.star.svx.FindTextToolboxController" oor:op="replace">
        <prop oor:name="Command">
          <value>.uno:FindText</value>
diff --git a/sw/inc/PageMarginPopup.hxx b/sw/inc/PageMarginPopup.hxx
index d06dc33..3a31544 100644
--- a/sw/inc/PageMarginPopup.hxx
+++ b/sw/inc/PageMarginPopup.hxx
@@ -19,21 +19,26 @@
#ifndef INCLUDED_SW_INC_PAGEMARGINPOPUP_HXX
#define INCLUDED_SW_INC_PAGEMARGINPOPUP_HXX

#include <sfx2/tbxctrl.hxx>
#include <svtools/popupwindowcontroller.hxx>
#include "swdllapi.h"

class PageMarginPopup final : public SfxToolBoxControl
class PageMarginPopup final : public svt::PopupWindowController
{
public:
    SFX_DECL_TOOLBOX_CONTROL();

    PageMarginPopup(sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx);
    PageMarginPopup(const css::uno::Reference<css::uno::XComponentContext>& rContext);
    virtual ~PageMarginPopup() override;

    virtual VclPtr<SfxPopupWindow> CreatePopupWindow() override;
    using svt::ToolboxController::createPopupWindow;
    virtual VclPtr<vcl::Window> createPopupWindow( vcl::Window* pParent ) override;

    // XServiceInfo
    virtual OUString SAL_CALL getImplementationName() override;
    virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;

    // XInitialization
    virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& rArguments ) override;
};

#endif


/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/app/swmodule.cxx b/sw/source/uibase/app/swmodule.cxx
index 9355dcb..88a0a53 100644
--- a/sw/source/uibase/app/swmodule.cxx
+++ b/sw/source/uibase/app/swmodule.cxx
@@ -279,7 +279,6 @@ void SwDLL::RegisterControls()
    svx::ParaLeftSpacingControl::RegisterControl(SID_ATTR_PARA_LEFTSPACE, pMod);
    svx::ParaRightSpacingControl::RegisterControl(SID_ATTR_PARA_RIGHTSPACE, pMod);
    svx::ParaFirstLineSpacingControl::RegisterControl(SID_ATTR_PARA_FIRSTLINESPACE, pMod);
    PageMarginPopup::RegisterControl(SID_ATTR_PAGE_MARGIN, pMod);
    PageOrientationPopup::RegisterControl(SID_ATTR_PAGE_ORIENTATION, pMod);

    SvxClipBoardControl::RegisterControl(SID_PASTE, pMod );
diff --git a/sw/source/uibase/sidebar/PageMarginControl.cxx b/sw/source/uibase/sidebar/PageMarginControl.cxx
index 69aa012..587f026 100644
--- a/sw/source/uibase/sidebar/PageMarginControl.cxx
+++ b/sw/source/uibase/sidebar/PageMarginControl.cxx
@@ -37,6 +37,7 @@

#include <swtypes.hxx>
#include <cmdid.h>
#include <PageMarginPopup.hxx>

#include <com/sun/star/document/XUndoManagerSupplier.hpp>
#include <com/sun/star/beans/NamedValue.hpp>
@@ -93,8 +94,8 @@ namespace

namespace sw { namespace sidebar {

PageMarginControl::PageMarginControl( sal_uInt16 nId, vcl::Window* pParent )
    : SfxPopupWindow( nId, pParent, "PageMarginControl", "modules/swriter/ui/pagemargincontrol.ui" )
PageMarginControl::PageMarginControl(PageMarginPopup* pControl, vcl::Window* pParent)
    : ToolbarPopup(pControl->getFrameInterface(), pParent, "PageMarginControl", "modules/swriter/ui/pagemargincontrol.ui")
    , m_nPageLeftMargin(0)
    , m_nPageRightMargin(0)
    , m_nPageTopMargin(0)
@@ -255,7 +256,7 @@ void PageMarginControl::dispose()
    m_pWidthHeightField.disposeAndClear();
    m_pContainer.disposeAndClear();

    SfxPopupWindow::dispose();
    ToolbarPopup::dispose();
}

void PageMarginControl::SetMetricFieldMaxValues( const Size& rPageSize )
diff --git a/sw/source/uibase/sidebar/PageMarginControl.hxx b/sw/source/uibase/sidebar/PageMarginControl.hxx
index fe54b4e..77f4cdb 100644
--- a/sw/source/uibase/sidebar/PageMarginControl.hxx
+++ b/sw/source/uibase/sidebar/PageMarginControl.hxx
@@ -19,7 +19,7 @@
#ifndef INCLUDED_SW_SOURCE_UIBASE_SIDEBAR_PAGEMARGINCONTROL_HXX
#define INCLUDED_SW_SOURCE_UIBASE_SIDEBAR_PAGEMARGINCONTROL_HXX

#include <sfx2/tbxctrl.hxx>
#include <svtools/toolbarmenu.hxx>
#include <vcl/fixed.hxx>
#include <vcl/field.hxx>
#include <vcl/layout.hxx>
@@ -33,12 +33,14 @@
// #i19922# - tdf#126051 see cui/source/tabpages/page.cxx and svx/source/dialog/hdft.cxx
static const long MINBODY = 56;  // 1mm in twips rounded

class PageMarginPopup;

namespace sw { namespace sidebar {

class PageMarginControl : public SfxPopupWindow
class PageMarginControl final : public svtools::ToolbarPopup
{
public:
    explicit PageMarginControl( sal_uInt16 nId, vcl::Window* pParent );
    explicit PageMarginControl(PageMarginPopup* pControl, vcl::Window* pParent);
    virtual ~PageMarginControl() override;
    virtual void dispose() override;

diff --git a/sw/source/uibase/sidebar/PageMarginPopup.cxx b/sw/source/uibase/sidebar/PageMarginPopup.cxx
index 29a27c3..f22604a 100644
--- a/sw/source/uibase/sidebar/PageMarginPopup.cxx
+++ b/sw/source/uibase/sidebar/PageMarginPopup.cxx
@@ -20,26 +20,46 @@
#include "PageMarginControl.hxx"
#include <vcl/toolbox.hxx>

SFX_IMPL_TOOLBOX_CONTROL(PageMarginPopup, SfxVoidItem);

PageMarginPopup::PageMarginPopup(sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx)
    : SfxToolBoxControl(nSlotId, nId, rTbx)
PageMarginPopup::PageMarginPopup(const css::uno::Reference<css::uno::XComponentContext>& rContext)
    : PopupWindowController(rContext, nullptr, OUString())
{
    rTbx.SetItemBits(nId, ToolBoxItemBits::DROPDOWNONLY | rTbx.GetItemBits(nId));
}

void PageMarginPopup::initialize( const css::uno::Sequence< css::uno::Any >& rArguments )
{
    PopupWindowController::initialize(rArguments);

    ToolBox* pToolBox = nullptr;
    sal_uInt16 nId = 0;
    if (getToolboxId(nId, &pToolBox) && pToolBox->GetItemCommand(nId) == m_aCommandURL)
        pToolBox->SetItemBits(nId, ToolBoxItemBits::DROPDOWNONLY | pToolBox->GetItemBits(nId));
}

PageMarginPopup::~PageMarginPopup()
{
}

VclPtr<SfxPopupWindow> PageMarginPopup::CreatePopupWindow()
VclPtr<vcl::Window> PageMarginPopup::createPopupWindow(vcl::Window* pParent)
{
    VclPtr<sw::sidebar::PageMarginControl> pControl = VclPtr<sw::sidebar::PageMarginControl>::Create(GetSlotId(), &GetToolBox());
    pControl->StartPopupMode(&GetToolBox(), FloatWinPopupFlags::GrabFocus);
    SetPopupWindow(pControl);

    return pControl;
    return VclPtr<sw::sidebar::PageMarginControl>::Create(this, pParent);
}

OUString PageMarginPopup::getImplementationName()
{
    return "lo.writer.PageMarginToolBoxControl";
}

css::uno::Sequence<OUString> PageMarginPopup::getSupportedServiceNames()
{
    return { "com.sun.star.frame.ToolbarController" };
}

extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
lo_writer_PageMarginToolBoxControl_get_implementation(
    css::uno::XComponentContext* rContext,
    css::uno::Sequence<css::uno::Any> const & )
{
    return cppu::acquire(new PageMarginPopup(rContext));
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/util/sw.component b/sw/util/sw.component
index a6fac07..18cbdc0 100644
--- a/sw/util/sw.component
+++ b/sw/util/sw.component
@@ -55,6 +55,10 @@
    constructor="lo_writer_PageColumnToolBoxControl_get_implementation">
    <service name="com.sun.star.frame.ToolbarController"/>
  </implementation>
  <implementation name="lo.writer.PageMarginToolBoxControl"
    constructor="lo_writer_PageMarginToolBoxControl_get_implementation">
    <service name="com.sun.star.frame.ToolbarController"/>
  </implementation>
  <implementation name="SwXModule"
      constructor="SwXModule_get_implementation">
    <service name="com.sun.star.text.GlobalSettings"/>