add a scheme to host welded toolbar dropdown windows in unwelded toolbars

Change-Id: I72c9896798740a760eac479bdccaf7825872c01b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86420
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/include/sfx2/weldutils.hxx b/include/sfx2/weldutils.hxx
index 8ea9996..cfcf545 100644
--- a/include/sfx2/weldutils.hxx
+++ b/include/sfx2/weldutils.hxx
@@ -16,7 +16,6 @@
#include <com/sun/star/uno/Reference.hxx>
#include <tools/link.hxx>
#include <sfx2/dllapi.h>
#include <svtools/toolbarmenu.hxx>
#include <vcl/svapp.hxx>
#include <vcl/weld.hxx>

@@ -53,19 +52,6 @@ public:
    ~ToolbarUnoDispatcher();
};

class SFX2_DLLPUBLIC WeldToolbarPopup : public svtools::ToolbarPopupBase
{
protected:
    std::unique_ptr<weld::Builder> m_xBuilder;
    std::unique_ptr<weld::Container> m_xTopLevel;

public:
    WeldToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame, weld::Widget* pParent,
                     const OUString& rUIFile, const OString& rId);
    virtual ~WeldToolbarPopup() override;
    weld::Container* getTopLevel() { return m_xTopLevel.get(); }
};

#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/svtools/popupwindowcontroller.hxx b/include/svtools/popupwindowcontroller.hxx
index 1666c8a..be39cc8 100644
--- a/include/svtools/popupwindowcontroller.hxx
+++ b/include/svtools/popupwindowcontroller.hxx
@@ -32,10 +32,8 @@

namespace vcl { class Window; }

namespace svtools
{
    class ToolbarPopupBase;
}
class InterimToolbarPopup;
class WeldToolbarPopup;

namespace svt
{
@@ -69,7 +67,8 @@ public:
    virtual css::uno::Reference< css::awt::XWindow > SAL_CALL createPopupWindow() override;

protected:
    std::unique_ptr<svtools::ToolbarPopupBase> mxPopover;
    std::unique_ptr<WeldToolbarPopup> mxPopover;
    VclPtr<InterimToolbarPopup> mxInterimPopover;

private:
    std::unique_ptr<PopupWindowControllerImpl, o3tl::default_delete<PopupWindowControllerImpl>>  mxImpl;
diff --git a/include/svtools/toolbarmenu.hxx b/include/svtools/toolbarmenu.hxx
index 01c8652..1ff5079 100644
--- a/include/svtools/toolbarmenu.hxx
+++ b/include/svtools/toolbarmenu.hxx
@@ -26,6 +26,7 @@

#include <rtl/ref.hxx>
#include <vcl/dockwin.hxx>
#include <vcl/weld.hxx>

namespace com :: sun :: star :: frame { class XFrame; }
namespace com :: sun :: star :: frame { struct FeatureStateEvent; }
@@ -152,6 +153,45 @@ private:

} // namespace svtools

class SVT_DLLPUBLIC WeldToolbarPopup : public svtools::ToolbarPopupBase
{
private:
    DECL_LINK(FocusHdl, weld::Widget&, void);

protected:
    std::unique_ptr<weld::Builder> m_xBuilder;
    std::unique_ptr<weld::Container> m_xTopLevel;
    std::unique_ptr<weld::Container> m_xContainer;

public:
    WeldToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame,
                     weld::Widget* pParent, const OUString& rUIFile, const OString& rId);
    virtual ~WeldToolbarPopup() override;
    weld::Container* getTopLevel() { return m_xTopLevel.get(); }
    weld::Container* getContainer() { return m_xContainer.get(); }

    virtual void GrabFocus() = 0;
};

class SVT_DLLPUBLIC InterimToolbarPopup : public svtools::ToolbarPopup
{
protected:
    VclPtr<vcl::Window> m_xBox;
    std::unique_ptr<weld::Builder> m_xBuilder;
    std::unique_ptr<weld::Container> m_xContainer;

    WeldToolbarPopup* m_pPopup;
public:
    InterimToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame, vcl::Window* pParent, WeldToolbarPopup* pPopup);
    weld::Container* getContainer() { return m_xContainer.get(); }
    virtual void dispose() override;
    virtual ~InterimToolbarPopup() override;

    virtual void GetFocus() override;

    using ToolbarPopup::EndPopupMode;
};

#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/svx/colorwindow.hxx b/include/svx/colorwindow.hxx
index 257d1e6..67e5aeb 100644
--- a/include/svx/colorwindow.hxx
+++ b/include/svx/colorwindow.hxx
@@ -126,11 +126,9 @@ public:
    weld::Widget* get_widget() const;
};

class SVX_DLLPUBLIC ColorWindow final : public svtools::ToolbarPopupBase
class SVX_DLLPUBLIC ColorWindow final : public WeldToolbarPopup
{
private:
    std::unique_ptr<weld::Builder> m_xBuilder;

    const sal_uInt16    theSlotId;
    OUString            maCommand;
    weld::Window* const mpParentWindow;
@@ -141,7 +139,6 @@ private:

    std::unique_ptr<ColorValueSet> mxColorSet;
    std::unique_ptr<ColorValueSet> mxRecentColorSet;
    std::unique_ptr<weld::Container> mxTopLevel;
    std::unique_ptr<weld::ComboBox> mxPaletteListBox;
    std::unique_ptr<weld::Button> mxButtonAutoColor;
    std::unique_ptr<weld::Button> mxButtonNoneColor;
@@ -169,7 +166,6 @@ public:
                const css::uno::Reference< css::frame::XFrame >& rFrame,
                weld::Window* pParentWindow, const MenuOrToolMenuButton &rMenuButton,
                ColorSelectFunction const& rColorSelectFunction);
    weld::Container* getTopLevel() { return mxTopLevel.get(); }
    virtual ~ColorWindow() override;
    void                ShowNoneButton();
    void                SetNoSelection();
@@ -178,11 +174,11 @@ public:
    void                SelectEntry(const Color& rColor);
    NamedColor          GetSelectEntryColor() const;

    DECL_LINK(FocusHdl, weld::Widget&, void);

    virtual void        statusChanged( const css::frame::FeatureStateEvent& rEvent ) override;

    void SetSelectedHdl( const Link<const NamedColor&, void>& rLink ) { maSelectedLink = rLink; }

    virtual void GrabFocus() override;
};

#endif
diff --git a/sfx2/source/toolbox/weldutils.cxx b/sfx2/source/toolbox/weldutils.cxx
index 434f6c4..52cf254 100644
--- a/sfx2/source/toolbox/weldutils.cxx
+++ b/sfx2/source/toolbox/weldutils.cxx
@@ -132,15 +132,4 @@ void ToolbarUnoDispatcher::dispose()

ToolbarUnoDispatcher::~ToolbarUnoDispatcher() { dispose(); }

WeldToolbarPopup::WeldToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame,
                                   weld::Widget* pParent, const OUString& rUIFile,
                                   const OString& rId)
    : ToolbarPopupBase(rFrame)
    , m_xBuilder(Application::CreateBuilder(pParent, rUIFile))
    , m_xTopLevel(m_xBuilder->weld_container(rId))
{
}

WeldToolbarPopup::~WeldToolbarPopup() {}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svtools/source/control/toolbarmenu.cxx b/svtools/source/control/toolbarmenu.cxx
index 2479873..7b12d91 100644
--- a/svtools/source/control/toolbarmenu.cxx
+++ b/svtools/source/control/toolbarmenu.cxx
@@ -30,6 +30,7 @@
#include <vcl/settings.hxx>
#include <vcl/commandevent.hxx>
#include <vcl/event.hxx>
#include <vcl/svapp.hxx>

#include <svtools/framestatuslistener.hxx>
#include <svtools/valueset.hxx>
@@ -1514,8 +1515,57 @@ void ToolbarMenu::SetSelectHdl( const Link<ToolbarMenu*,void>& rLink )
    mpImpl->maSelectHdl = rLink;
}


}

WeldToolbarPopup::WeldToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame,
                                   weld::Widget* pParent, const OUString& rUIFile,
                                   const OString& rId)
    : ToolbarPopupBase(rFrame)
    , m_xBuilder(Application::CreateBuilder(pParent, rUIFile))
    , m_xTopLevel(m_xBuilder->weld_container(rId))
    , m_xContainer(m_xBuilder->weld_container("container"))
{
    m_xTopLevel->connect_focus_in(LINK(this, WeldToolbarPopup, FocusHdl));
}

WeldToolbarPopup::~WeldToolbarPopup()
{
}

IMPL_LINK_NOARG(WeldToolbarPopup, FocusHdl, weld::Widget&, void)
{
    GrabFocus();
}

InterimToolbarPopup::InterimToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame, vcl::Window* pParent, WeldToolbarPopup* pPopup)
    : ToolbarPopup(rFrame, pParent, "InterimDockParent", "svx/ui/interimdockparent.ui")
    , m_xBox(get<vcl::Window>("box"))
    , m_xBuilder(Application::CreateInterimBuilder(m_xBox.get(), "svx/ui/interimparent.ui"))
    , m_xContainer(m_xBuilder->weld_container("container"))
    , m_pPopup(pPopup)
{
    // move the WeldToolbarPopup contents into this interim toolbar so welded contents can appear as a dropdown in an unwelded toolbar
    m_pPopup->getTopLevel()->move(m_pPopup->getContainer(), m_xContainer.get());
}

void InterimToolbarPopup::GetFocus()
{
    ToolbarPopup::GetFocus();
    m_pPopup->GrabFocus();
}

void InterimToolbarPopup::dispose()
{
    // move the contents back where it belongs
    m_xContainer->move(m_pPopup->getContainer(), m_pPopup->getTopLevel());
    m_xContainer.reset();
    m_xBox.clear();
    ToolbarPopup::dispose();
}

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

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svtools/source/uno/popupwindowcontroller.cxx b/svtools/source/uno/popupwindowcontroller.cxx
index cc283adb..7b1e335 100644
--- a/svtools/source/uno/popupwindowcontroller.cxx
+++ b/svtools/source/uno/popupwindowcontroller.cxx
@@ -176,6 +176,7 @@ sal_Bool SAL_CALL PopupWindowController::supportsService( const OUString& Servic
// XComponent
void SAL_CALL PopupWindowController::dispose()
{
    mxInterimPopover.clear();
    mxPopover.reset();
    mxImpl.reset();
    svt::ToolboxController::dispose();
@@ -238,7 +239,10 @@ Reference< awt::XWindow > SAL_CALL PopupWindowController::createPopupWindow()

void PopupWindowController::EndPopupMode()
{
    m_pToolbar->set_menu_item_active(m_aCommandURL.toUtf8(), false);
    if (m_pToolbar)
        m_pToolbar->set_menu_item_active(m_aCommandURL.toUtf8(), false);
    else if (mxInterimPopover)
        mxInterimPopover->EndPopupMode();
}

}
diff --git a/svx/UIConfig_svx.mk b/svx/UIConfig_svx.mk
index 529ab82..070e52ad 100644
--- a/svx/UIConfig_svx.mk
+++ b/svx/UIConfig_svx.mk
@@ -62,6 +62,8 @@ $(eval $(call gb_UIConfig_add_uifiles,svx,\
	svx/uiconfig/ui/headfootformatpage \
	svx/uiconfig/ui/imapdialog \
	svx/uiconfig/ui/imapmenu \
	svx/uiconfig/ui/interimdockparent \
	svx/uiconfig/ui/interimparent \
	svx/uiconfig/ui/linkwarndialog \
	svx/uiconfig/ui/mediaplayback \
	svx/uiconfig/ui/namespacedialog \
diff --git a/svx/source/tbxctrls/bulletsnumbering.cxx b/svx/source/tbxctrls/bulletsnumbering.cxx
index 157d01a..d33f790 100644
--- a/svx/source/tbxctrls/bulletsnumbering.cxx
+++ b/svx/source/tbxctrls/bulletsnumbering.cxx
@@ -16,6 +16,7 @@
#include <svtools/popupwindowcontroller.hxx>
#include <svtools/toolbarmenu.hxx>
#include <sfx2/weldutils.hxx>
#include <sfx2/tbxctrl.hxx>
#include <svx/strings.hrc>
#include <svx/dialmgr.hxx>
#include <svx/numvset.hxx>
@@ -27,24 +28,7 @@ namespace {

class NumberingToolBoxControl;

class NumberingPopup : public svtools::ToolbarMenu
{
    NumberingPageType const mePageType;
    NumberingToolBoxControl& mrController;
    VclPtr<SvxNumValueSet> mpValueSet;
    DECL_LINK( VSSelectToolbarMenuHdl, ToolbarMenu*, void );
    DECL_LINK( VSSelectValueSetHdl, ValueSet*, void );
    void VSSelectHdl(void const *);
public:
    NumberingPopup( NumberingToolBoxControl& rController,
                    vcl::Window* pParent, NumberingPageType ePageType );
    virtual ~NumberingPopup() override;
    virtual void dispose() override;

    virtual void statusChanged( const css::frame::FeatureStateEvent& rEvent ) override;
};

class SvxNumberingPopup : public WeldToolbarPopup
class NumberingPopup : public WeldToolbarPopup
{
    NumberingPageType const mePageType;
    NumberingToolBoxControl& mrController;
@@ -53,10 +37,11 @@ class SvxNumberingPopup : public WeldToolbarPopup
    std::unique_ptr<weld::Button> mxMoreButton;
    DECL_LINK(VSSelectValueSetHdl, SvtValueSet*, void);
    DECL_LINK(VSButtonClickSetHdl, weld::Button&, void);
    DECL_LINK(FocusHdl, weld::Widget&, void);

    virtual void GrabFocus() override;

public:
    SvxNumberingPopup(NumberingToolBoxControl& rController, weld::Toolbar* pParent, NumberingPageType ePageType);
    NumberingPopup(NumberingToolBoxControl& rController, weld::Widget* pParent, NumberingPageType ePageType);

    virtual void statusChanged( const css::frame::FeatureStateEvent& rEvent ) override;
};
@@ -81,74 +66,8 @@ public:

}

NumberingPopup::NumberingPopup( NumberingToolBoxControl& rController,
                                vcl::Window* pParent, NumberingPageType ePageType ) :
    ToolbarMenu( rController.getFrameInterface(), pParent, WB_STDPOPUP ),
    mePageType( ePageType ),
    mrController( rController )
{
    WinBits nBits = WB_TABSTOP | WB_MENUSTYLEVALUESET | WB_FLATVALUESET | WB_NO_DIRECTSELECT;
    mpValueSet = VclPtr<SvxNumValueSet>::Create( this, nBits );
    mpValueSet->init( mePageType );

    if ( mePageType != NumberingPageType::BULLET )
    {
        css::uno::Reference< css::text::XDefaultNumberingProvider > xDefNum = css::text::DefaultNumberingProvider::create( mrController.getContext() );
        if ( xDefNum.is() )
        {
            css::lang::Locale aLocale = GetSettings().GetLanguageTag().getLocale();
            css::uno::Reference< css::text::XNumberingFormatter > xFormat( xDefNum, css::uno::UNO_QUERY );

            if ( mePageType == NumberingPageType::SINGLENUM )
            {
                css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > > aNumberings(
                    xDefNum->getDefaultContinuousNumberingLevels( aLocale ) );
                mpValueSet->SetNumberingSettings( aNumberings, xFormat, aLocale );
            }
            else if ( mePageType == NumberingPageType::OUTLINE )
            {
                css::uno::Sequence< css::uno::Reference< css::container::XIndexAccess > > aOutline(
                    xDefNum->getDefaultOutlineNumberings( aLocale ) );
                mpValueSet->SetOutlineNumberingSettings( aOutline, xFormat, aLocale );
            }
        }
    }

    Size aItemSize(LogicToPixel(Size(30, 42), MapMode(MapUnit::MapAppFont)));
    mpValueSet->SetExtraSpacing( 2 );
    mpValueSet->SetOutputSizePixel( mpValueSet->CalcWindowSizePixel( aItemSize ) );
    mpValueSet->SetColor( GetSettings().GetStyleSettings().GetFieldColor() );

    appendEntry( 0, mpValueSet );
    appendSeparator();

    OUString aMoreItemText;
    if ( mePageType == NumberingPageType::BULLET )
    {
        aMoreItemText = SvxResId( RID_SVXSTR_MOREBULLETS );
        AddStatusListener( ".uno:CurrentBulletListType" );
    }
    else if ( mePageType == NumberingPageType::SINGLENUM )
    {
        aMoreItemText = SvxResId( RID_SVXSTR_MORENUMBERING );
        AddStatusListener( ".uno:CurrentNumListType" );
    }
    else
    {
        aMoreItemText = SvxResId( RID_SVXSTR_MORE );
        AddStatusListener( ".uno:CurrentOutlineType" );
    }

    appendEntry( 1, aMoreItemText,
        vcl::CommandInfoProvider::GetImageForCommand( ".uno:OutlineBullet", mrController.getFrameInterface() ) );

    SetOutputSizePixel( getMenuSize() );
    mpValueSet->SetSelectHdl( LINK( this, NumberingPopup, VSSelectValueSetHdl ) );
    SetSelectHdl( LINK( this, NumberingPopup, VSSelectToolbarMenuHdl ) );
}

SvxNumberingPopup::SvxNumberingPopup(NumberingToolBoxControl& rController,
                                     weld::Toolbar* pParent, NumberingPageType ePageType)
NumberingPopup::NumberingPopup(NumberingToolBoxControl& rController,
                               weld::Widget* pParent, NumberingPageType ePageType)
    : WeldToolbarPopup(rController.getFrameInterface(), pParent, "svx/ui/numberingwindow.ui", "NumberingWindow")
    , mePageType(ePageType)
    , mrController(rController)
@@ -156,8 +75,6 @@ SvxNumberingPopup::SvxNumberingPopup(NumberingToolBoxControl& rController,
    , mxValueSetWin(new weld::CustomWeld(*m_xBuilder, "valueset", *mxValueSet))
    , mxMoreButton(m_xBuilder->weld_button("more"))
{
    m_xTopLevel->connect_focus_in(LINK(this, SvxNumberingPopup, FocusHdl));

    mxValueSet->SetStyle(WB_MENUSTYLEVALUESET | WB_FLATVALUESET | WB_NO_DIRECTSELECT);
    mxValueSet->init(mePageType);

@@ -213,33 +130,13 @@ SvxNumberingPopup::SvxNumberingPopup(NumberingToolBoxControl& rController,
    auto xImage = vcl::CommandInfoProvider::GetXGraphicForCommand(".uno:OutlineBullet", mrController.getFrameInterface());
    mxMoreButton->set_image(xImage);
    mxMoreButton->set_label(aMoreItemText);
    mxMoreButton->connect_clicked(LINK(this, SvxNumberingPopup, VSButtonClickSetHdl));
    mxMoreButton->connect_clicked(LINK(this, NumberingPopup, VSButtonClickSetHdl));

    mxValueSet->SetSelectHdl(LINK(this, SvxNumberingPopup, VSSelectValueSetHdl));
}

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

void NumberingPopup::dispose()
{
    mpValueSet.clear();
    ToolbarMenu::dispose();
    mxValueSet->SetSelectHdl(LINK(this, NumberingPopup, VSSelectValueSetHdl));
}

void NumberingPopup::statusChanged( const css::frame::FeatureStateEvent& rEvent )
{
    mpValueSet->SetNoSelection();

    sal_Int32 nSelItem;
    if ( rEvent.State >>= nSelItem )
        mpValueSet->SelectItem( nSelItem );
}

void SvxNumberingPopup::statusChanged( const css::frame::FeatureStateEvent& rEvent )
{
    mxValueSet->SetNoSelection();

    sal_Int32 nSelItem;
@@ -247,12 +144,7 @@ void SvxNumberingPopup::statusChanged( const css::frame::FeatureStateEvent& rEve
        mxValueSet->SelectItem( nSelItem );
}

IMPL_LINK( NumberingPopup, VSSelectValueSetHdl, ValueSet*, pControl, void )
{
    VSSelectHdl(pControl);
}

IMPL_LINK_NOARG(SvxNumberingPopup, VSSelectValueSetHdl, SvtValueSet*, void)
IMPL_LINK_NOARG(NumberingPopup, VSSelectValueSetHdl, SvtValueSet*, void)
{
    mrController.EndPopupMode();

@@ -274,12 +166,12 @@ IMPL_LINK_NOARG(SvxNumberingPopup, VSSelectValueSetHdl, SvtValueSet*, void)
    }
}

IMPL_LINK_NOARG(SvxNumberingPopup, FocusHdl, weld::Widget&, void)
void NumberingPopup::GrabFocus()
{
    mxValueSet->GrabFocus();
}

IMPL_LINK_NOARG(SvxNumberingPopup, VSButtonClickSetHdl, weld::Button&, void)
IMPL_LINK_NOARG(NumberingPopup, VSButtonClickSetHdl, weld::Button&, void)
{
    mrController.EndPopupMode();

@@ -287,43 +179,6 @@ IMPL_LINK_NOARG(SvxNumberingPopup, VSButtonClickSetHdl, weld::Button&, void)
    mrController.dispatchCommand( ".uno:OutlineBullet", aArgs );
}

IMPL_LINK( NumberingPopup, VSSelectToolbarMenuHdl, ToolbarMenu*, pControl, void )
{
    VSSelectHdl(pControl);
}

void NumberingPopup::VSSelectHdl(void const * pControl)
{
    if ( IsInPopupMode() )
        EndPopupMode();

    if ( pControl == mpValueSet )
    {
        sal_uInt16 nSelItem = mpValueSet->GetSelectedItemId();
        if ( mePageType == NumberingPageType::BULLET )
        {
            auto aArgs( comphelper::InitPropertySequence( { { "SetBullet", css::uno::makeAny( nSelItem ) } } ) );
            mrController.dispatchCommand( ".uno:SetBullet", aArgs );
        }
        else if ( mePageType == NumberingPageType::SINGLENUM )
        {
            auto aArgs( comphelper::InitPropertySequence( { { "SetNumber", css::uno::makeAny( nSelItem ) } } ) );
            mrController.dispatchCommand( ".uno:SetNumber", aArgs );
        }
        else
        {
            auto aArgs( comphelper::InitPropertySequence( { { "SetOutline", css::uno::makeAny( nSelItem ) } } ) );
            mrController.dispatchCommand( ".uno:SetOutline", aArgs );
        }
    }
    else if ( getSelectedEntryId() == 1 )
    {
        auto aArgs( comphelper::InitPropertySequence( { { "Page", css::uno::makeAny( OUString("customize") ) } } ) );
        mrController.dispatchCommand( ".uno:OutlineBullet", aArgs );
    }
}


NumberingToolBoxControl::NumberingToolBoxControl( const css::uno::Reference< css::uno::XComponentContext >& rxContext ):
    svt::PopupWindowController( rxContext, css::uno::Reference< css::frame::XFrame >(), OUString() ),
    mePageType( NumberingPageType::SINGLENUM )
@@ -332,7 +187,11 @@ NumberingToolBoxControl::NumberingToolBoxControl( const css::uno::Reference< css

VclPtr<vcl::Window> NumberingToolBoxControl::createPopupWindow( vcl::Window* pParent )
{
    return VclPtr<NumberingPopup>::Create( *this, pParent, mePageType );
    mxInterimPopover = VclPtr<InterimToolbarPopup>::Create(getFrameInterface(), pParent, mxPopover.get());

    mxInterimPopover->Show();

    return mxInterimPopover;
}

void SAL_CALL NumberingToolBoxControl::initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
@@ -344,22 +203,25 @@ void SAL_CALL NumberingToolBoxControl::initialize( const css::uno::Sequence< css
    else if ( m_aCommandURL == ".uno:SetOutline" )
        mePageType = NumberingPageType::OUTLINE;

    if (m_pToolbar)
    {
        const OString aId(m_aCommandURL.toUtf8());

        auto xPopover = std::make_unique<SvxNumberingPopup>(*this, m_pToolbar, mePageType);

        m_pToolbar->set_item_popover(aId, xPopover->getTopLevel());
        mxPopover = std::move(xPopover);
        return;
    }

    ToolBoxItemBits nBits = ( mePageType == NumberingPageType::OUTLINE ) ? ToolBoxItemBits::DROPDOWNONLY : ToolBoxItemBits::DROPDOWN;
    ToolBox* pToolBox = nullptr;
    sal_uInt16 nId = 0;
    if ( getToolboxId( nId, &pToolBox ) )
    bool bVcl = getToolboxId(nId, &pToolBox);

    weld::Widget* pParent;
    if (pToolBox)
        pParent = pToolBox->GetFrameWeld();
    else
        pParent = m_pToolbar;
    mxPopover = std::make_unique<NumberingPopup>(*this, pParent, mePageType);

    if (bVcl)
        pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) | nBits );
    else if (m_pToolbar)
    {
        const OString aId(m_aCommandURL.toUtf8());
        m_pToolbar->set_item_popover(aId, mxPopover->getTopLevel());
    }
}

OUString SAL_CALL NumberingToolBoxControl::getImplementationName()
diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx
index a63b13b..93f589a 100644
--- a/svx/source/tbxctrls/tbcontrl.cxx
+++ b/svx/source/tbxctrls/tbcontrl.cxx
@@ -1783,8 +1783,7 @@ ColorWindow::ColorWindow(const OUString& rCommand,
                         weld::Window*              pParentWindow,
                         const MenuOrToolMenuButton& rMenuButton,
                         ColorSelectFunction const & aFunction)
    : ToolbarPopupBase(rFrame)
    , m_xBuilder(Application::CreateBuilder(rMenuButton.get_widget(), "svx/ui/colorwindow.ui"))
    : WeldToolbarPopup(rFrame, rMenuButton.get_widget(), "svx/ui/colorwindow.ui", "palette_popup_window")
    , theSlotId(nSlotId)
    , maCommand(rCommand)
    , mpParentWindow(pParentWindow)
@@ -1794,7 +1793,6 @@ ColorWindow::ColorWindow(const OUString& rCommand,
    , maColorSelectFunction(aFunction)
    , mxColorSet(new ColorValueSet(m_xBuilder->weld_scrolled_window("colorsetwin")))
    , mxRecentColorSet(new ColorValueSet(nullptr))
    , mxTopLevel(m_xBuilder->weld_container("palette_popup_window"))
    , mxPaletteListBox(m_xBuilder->weld_combo_box("palette_listbox"))
    , mxButtonAutoColor(m_xBuilder->weld_button("auto_color_button"))
    , mxButtonNoneColor(m_xBuilder->weld_button("none_color_button"))
@@ -1865,8 +1863,7 @@ ColorWindow::ColorWindow(const OUString& rCommand,

    mxColorSet->SetSelectHdl(LINK( this, ColorWindow, SelectHdl));
    mxRecentColorSet->SetSelectHdl(LINK( this, ColorWindow, SelectHdl));
    mxTopLevel->set_help_id(HID_POPUP_COLOR);
    mxTopLevel->connect_focus_in(LINK(this, ColorWindow, FocusHdl));
    m_xTopLevel->set_help_id(HID_POPUP_COLOR);
    mxColorSet->SetHelpId(HID_POPUP_COLOR_CTRL);

    mxPaletteManager->ReloadColorSet(*mxColorSet);
@@ -1887,7 +1884,7 @@ ColorWindow::ColorWindow(const OUString& rCommand,
    }
}

IMPL_LINK_NOARG(ColorWindow, FocusHdl, weld::Widget&, void)
void ColorWindow::GrabFocus()
{
    if (mxColorSet->IsNoSelection() && mpDefaultButton)
        mpDefaultButton->grab_focus();
@@ -3502,9 +3499,10 @@ void SvxColorToolBoxControl::initialize( const css::uno::Sequence<css::uno::Any>
        if ( m_bSplitButton )
            xPopover->SetSelectedHdl( LINK( this, SvxColorToolBoxControl, SelectedHdl ) );

        m_pToolbar->set_item_popover(aId, xPopover->getTopLevel());
        mxPopover = std::move(xPopover);

        m_pToolbar->set_item_popover(aId, mxPopover->getTopLevel());

        m_xBtnUpdater.reset(new svx::ToolboxButtonColorUpdater(m_nSlotId, aId, m_pToolbar, !m_bSplitButton, aCommandLabel, m_xFrame));
        return;
    }
@@ -3811,9 +3809,10 @@ namespace
        std::vector<OUString> m_aFormatEntries;
        LanguageType          m_eFormatLanguage;
        DECL_LINK(RowActivatedHdl, weld::TreeView&, bool);
        DECL_LINK(FocusHdl, weld::Widget&, void);
        DECL_LINK(OKHdl, weld::Button&, void);

        virtual void GrabFocus() override;

    public:
        CurrencyList_Impl(SvxCurrencyToolBoxControl* pControl, weld::Widget* pParent, OUString& rSelectedFormat, LanguageType& eSelectedLanguage)
            : WeldToolbarPopup(pControl->getFrameInterface(), pParent, "svx/ui/currencywindow.ui", "CurrencyWindow")
@@ -3824,8 +3823,6 @@ namespace
            , m_rSelectedFormat(rSelectedFormat)
            , m_eSelectedLanguage(eSelectedLanguage)
        {
            m_xTopLevel->connect_focus_in(LINK(this, CurrencyList_Impl, FocusHdl));

            m_xCurrencyLb->set_size_request(-1, m_xCurrencyLb->get_height_rows(12));

            std::vector< OUString > aList;
@@ -3871,7 +3868,7 @@ namespace
        }
    };

    IMPL_LINK_NOARG(CurrencyList_Impl, FocusHdl, weld::Widget&, void)
    void CurrencyList_Impl::GrabFocus()
    {
        m_xCurrencyLb->grab_focus();
    }
@@ -4302,7 +4299,7 @@ ColorListBox::ColorListBox(std::unique_ptr<weld::MenuButton> pControl, weld::Win
IMPL_LINK(ColorListBox, ToggleHdl, weld::ToggleButton&, rButton, void)
{
    if (rButton.get_active())
        getColorWindow()->FocusHdl(*m_xButton);
        getColorWindow()->GrabFocus();
}

ColorListBox::~ColorListBox()
diff --git a/svx/uiconfig/ui/interimdockparent.ui b/svx/uiconfig/ui/interimdockparent.ui
new file mode 100644
index 0000000..45b9a79
--- /dev/null
+++ b/svx/uiconfig/ui/interimdockparent.ui
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface domain="svx">
  <requires lib="gtk+" version="3.18"/>
  <object class="GtkWindow" id="InterimDockParent">
    <property name="can_focus">False</property>
    <property name="hexpand">True</property>
    <property name="vexpand">True</property>
    <property name="border_width">4</property>
    <property name="resizable">False</property>
    <property name="destroy_with_parent">True</property>
    <property name="type_hint">popup-menu</property>
    <property name="skip_pager_hint">True</property>
    <property name="deletable">False</property>
    <child>
      <placeholder/>
    </child>
    <child>
      <object class="GtkBox" id="box">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <property name="spacing">6</property>
        <child>
          <placeholder/>
        </child>
      </object>
    </child>
  </object>
</interface>
diff --git a/svx/uiconfig/ui/interimparent.ui b/svx/uiconfig/ui/interimparent.ui
new file mode 100644
index 0000000..b033058
--- /dev/null
+++ b/svx/uiconfig/ui/interimparent.ui
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface domain="svx">
  <requires lib="gtk+" version="3.18"/>
  <object class="GtkBox" id="container">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="orientation">vertical</property>
    <property name="spacing">6</property>
    <child>
      <placeholder/>
    </child>
  </object>
</interface>
diff --git a/svx/uiconfig/ui/numberingwindow.ui b/svx/uiconfig/ui/numberingwindow.ui
index 60abdc3..3985407 100644
--- a/svx/uiconfig/ui/numberingwindow.ui
+++ b/svx/uiconfig/ui/numberingwindow.ui
@@ -7,7 +7,7 @@
    <property name="no_show_all">True</property>
    <property name="border_width">4</property>
    <child>
      <object class="GtkBox">
      <object class="GtkBox" id="container">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
diff --git a/vcl/source/window/dockwin.cxx b/vcl/source/window/dockwin.cxx
index 108a7d5..411de5b 100644
--- a/vcl/source/window/dockwin.cxx
+++ b/vcl/source/window/dockwin.cxx
@@ -1052,7 +1052,7 @@ IMPL_LINK_NOARG(DockingWindow, ImplHandleLayoutTimerHdl, Timer*, void)
{
    if (!isLayoutEnabled())
    {
        SAL_WARN("vcl.layout", "DockingWindow has become non-layout because extra children have been added directly to it.");
        SAL_WARN_IF(GetWindow(GetWindowType::FirstChild), "vcl.layout", "DockingWindow has become non-layout because extra children have been added directly to it.");
        return;
    }
    setPosSizeOnContainee();