weld writer's FrameControl MenuButtons

Change-Id: I507b043672ffd102f85110bed221a05b756500db
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107174
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/solenv/sanitizers/ui/modules/swriter.suppr b/solenv/sanitizers/ui/modules/swriter.suppr
index 5eec159..922203e 100644
--- a/solenv/sanitizers/ui/modules/swriter.suppr
+++ b/solenv/sanitizers/ui/modules/swriter.suppr
@@ -58,8 +58,10 @@ sw/uiconfig/swriter/ui/frmtypepage.ui://GtkCheckButton[@id='relheight'] missing-
sw/uiconfig/swriter/ui/gotopagedialog.ui://GtkLabel[@id='page_count'] orphan-label
sw/uiconfig/swriter/ui/gotopagedialog.ui://GtkEntry[@id='page'] no-labelled-by
sw/uiconfig/swriter/ui/gotopagedialog.ui://GtkLabel[@id='page_label'] orphan-label
sw/uiconfig/swriter/ui/headerfootermenu.ui://GtkMenuItem[@id='edit'] button-no-label
sw/uiconfig/swriter/ui/headerfootermenu.ui://GtkMenuItem[@id='delete'] button-no-label
sw/uiconfig/swriter/ui/hfmenubutton.ui://GtkMenuItem[@id='edit'] button-no-label
sw/uiconfig/swriter/ui/hfmenubutton.ui://GtkMenuItem[@id='delete'] button-no-label
sw/uiconfig/swriter/ui/hfmenubutton.ui://GtkButton[@id='button'] button-no-label
sw/uiconfig/swriter/ui/hfmenubutton.ui://GtkMenuButton[@id='menubutton'] button-no-label
sw/uiconfig/swriter/ui/inputeditbox.ui://GtkEntry[@id='entry'] no-labelled-by
sw/uiconfig/swriter/ui/insertbookmark.ui://GtkLabel[@id='lbForbiddenChars'] orphan-label
sw/uiconfig/swriter/ui/insertbreak.ui://GtkSpinButton[@id='pagenumsb'] missing-label-for
@@ -84,6 +86,7 @@ sw/uiconfig/swriter/ui/opttablepage.ui://GtkLabel[@id='label13'] orphan-label
sw/uiconfig/swriter/ui/opttablepage.ui://GtkLabel[@id='label4'] orphan-label
sw/uiconfig/swriter/ui/opttablepage.ui://GtkLabel[@id='label14'] orphan-label
sw/uiconfig/swriter/ui/outlinenumberingpage.ui://GtkDrawingArea[@id='preview'] no-labelled-by
sw/uiconfig/swriter/ui/pbmenubutton.ui://GtkMenuButton[@id='menubutton'] button-no-label
sw/uiconfig/swriter/ui/poseditbox.ui://GtkEntry[@id='entry'] no-labelled-by
sw/uiconfig/swriter/ui/mailmerge.ui://GtkLabel[@id='fieldlabel'] orphan-label
sw/uiconfig/swriter/ui/mailmerge.ui://GtkLabel[@id='mailformatlabel'] orphan-label
@@ -177,6 +180,7 @@ sw/uiconfig/swriter/ui/tokenwidget.ui://GtkButton[@id='left'] button-no-label
sw/uiconfig/swriter/ui/tokenwidget.ui://GtkButton[@id='right'] button-no-label
sw/uiconfig/swriter/ui/toxbuttonwidget.ui://GtkToggleButton[@id='button'] button-no-label
sw/uiconfig/swriter/ui/toxentrywidget.ui://GtkEntry[@id='entry'] no-labelled-by
sw/uiconfig/swriter/ui/unfloatbutton.ui://GtkButton[@id='button'] button-no-label
sw/uiconfig/swriter/ui/viewoptionspage.ui://GtkLabel[@id='measureunitlabel'] orphan-label
sw/uiconfig/swriter/ui/watermarkdialog.ui://GtkLabel[@id='TextLabel'] orphan-label
sw/uiconfig/swriter/ui/watermarkdialog.ui://GtkLabel[@id='FontLabel'] orphan-label
diff --git a/sw/UIConfig_swriter.mk b/sw/UIConfig_swriter.mk
index 33074fc..71a0632 100644
--- a/sw/UIConfig_swriter.mk
+++ b/sw/UIConfig_swriter.mk
@@ -161,7 +161,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/swriter,\
	sw/uiconfig/swriter/ui/frmtypepage \
	sw/uiconfig/swriter/ui/frmurlpage \
	sw/uiconfig/swriter/ui/gotopagedialog \
	sw/uiconfig/swriter/ui/headerfootermenu \
	sw/uiconfig/swriter/ui/hfmenubutton \
	sw/uiconfig/swriter/ui/indexentry \
	sw/uiconfig/swriter/ui/inputfielddialog \
	sw/uiconfig/swriter/ui/inputwinmenu \
@@ -204,6 +204,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/swriter,\
	sw/uiconfig/swriter/ui/outlinenumbering \
	sw/uiconfig/swriter/ui/outlinenumberingpage \
	sw/uiconfig/swriter/ui/outlinepositionpage \
	sw/uiconfig/swriter/ui/pbmenubutton \
	sw/uiconfig/swriter/ui/querycontinuebegindialog \
	sw/uiconfig/swriter/ui/querycontinueenddialog \
	sw/uiconfig/swriter/ui/querydefaultcompatdialog \
@@ -232,7 +233,6 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/swriter,\
	sw/uiconfig/swriter/ui/notebookbar_groups \
	sw/uiconfig/swriter/ui/notebookbar_groupedbar_full \
	sw/uiconfig/swriter/ui/notebookbar_groupedbar_compact \
	sw/uiconfig/swriter/ui/pagebreakmenu \
	sw/uiconfig/swriter/ui/pagecolumncontrol \
	sw/uiconfig/swriter/ui/pagemargincontrol \
	sw/uiconfig/swriter/ui/pageorientationcontrol \
@@ -295,6 +295,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/swriter,\
	sw/uiconfig/swriter/ui/tokenwidget \
	sw/uiconfig/swriter/ui/toxentrywidget \
	sw/uiconfig/swriter/ui/toxbuttonwidget \
	sw/uiconfig/swriter/ui/unfloatbutton \
	sw/uiconfig/swriter/ui/viewoptionspage \
	sw/uiconfig/swriter/ui/warndatasourcedialog \
	sw/uiconfig/swriter/ui/warnemaildialog \
diff --git a/sw/inc/strings.hrc b/sw/inc/strings.hrc
index e5f20d86..dacf67d 100644
--- a/sw/inc/strings.hrc
+++ b/sw/inc/strings.hrc
@@ -1229,6 +1229,8 @@

#define STR_UNFLOAT_TABLE                       NC_("STR_UNFLOAT_TABLE", "Un-float Table")

#define STR_PAGE_BREAK_BUTTON                   NC_("STR_PAGE_BREAK_BUTTON", "Edit page break")

#define STR_GRFILTER_OPENERROR                  NC_("STR_GRFILTER_OPENERROR", "Image file cannot be opened")
#define STR_GRFILTER_IOERROR                    NC_("STR_GRFILTER_IOERROR", "Image file cannot be read")
#define STR_GRFILTER_FORMATERROR                NC_("STR_GRFILTER_FORMATERROR", "Unknown image format")
diff --git a/sw/source/uibase/docvw/FrameControlsManager.cxx b/sw/source/uibase/docvw/FrameControlsManager.cxx
index 57603339..2232ca7 100644
--- a/sw/source/uibase/docvw/FrameControlsManager.cxx
+++ b/sw/source/uibase/docvw/FrameControlsManager.cxx
@@ -21,6 +21,8 @@
#include <OutlineContentVisibilityWin.hxx>
#include <ndtxt.hxx>
#include <IDocumentOutlineNodes.hxx>
#include <vcl/settings.hxx>
#include <vcl/svapp.hxx>

using namespace std;

@@ -177,10 +179,11 @@ void SwFrameControlsManager::SetUnfloatTableButton( const SwFlyFrame* pFlyFrame,
    pControl->ShowAll( bShow );
}

SwFrameMenuButtonBase::SwFrameMenuButtonBase( SwEditWin* pEditWin, const SwFrame* pFrame ) :
    MenuButton( pEditWin, WB_DIALOGCONTROL ),
    m_pEditWin( pEditWin ),
    m_pFrame( pFrame )
SwFrameMenuButtonBase::SwFrameMenuButtonBase(SwEditWin* pEditWin, const SwFrame* pFrame,
                                             const OUString& rUIXMLDescription, const OString& rID)
    : InterimItemWindow(pEditWin, rUIXMLDescription, rID)
    , m_pEditWin(pEditWin)
    , m_pFrame(pFrame)
{
}

@@ -302,7 +305,16 @@ void SwFrameMenuButtonBase::dispose()
{
    m_pEditWin.clear();
    m_pFrame = nullptr;
    MenuButton::dispose();
    m_xVirDev.disposeAndClear();
    InterimItemWindow::dispose();
}

void SwFrameMenuButtonBase::SetVirDevFont()
{
    // Get the font and configure it
    vcl::Font aFont = Application::GetSettings().GetStyleSettings().GetToolFont();
    if (vcl::Window* pDefaultDevice = dynamic_cast<vcl::Window*>(Application::GetDefaultDevice()))
        pDefaultDevice->SetPointFont(*m_xVirDev, aFont);
}

SwFrameControl::SwFrameControl( const VclPtr<vcl::Window> &pWindow )
diff --git a/sw/source/uibase/docvw/HeaderFooterWin.cxx b/sw/source/uibase/docvw/HeaderFooterWin.cxx
index 7305a44..0c4ed11 100644
--- a/sw/source/uibase/docvw/HeaderFooterWin.cxx
+++ b/sw/source/uibase/docvw/HeaderFooterWin.cxx
@@ -46,9 +46,9 @@
#include <vcl/canvastools.hxx>
#include <vcl/menu.hxx>
#include <vcl/metric.hxx>
#include <vcl/menubtn.hxx>
#include <vcl/svapp.hxx>
#include <vcl/settings.hxx>
#include <vcl/virdev.hxx>
#include <memory>

#define TEXT_PADDING 5
@@ -162,20 +162,20 @@ void SwFrameButtonPainter::PaintButton(drawinglayer::primitive2d::Primitive2DCon
}

SwHeaderFooterWin::SwHeaderFooterWin( SwEditWin* pEditWin, const SwFrame *pFrame, bool bHeader ) :
    SwFrameMenuButtonBase( pEditWin, pFrame ),
    m_aBuilder(nullptr, AllSettings::GetUIRootDir(), "modules/swriter/ui/headerfootermenu.ui", ""),
    SwFrameMenuButtonBase(pEditWin, pFrame, "modules/swriter/ui/hfmenubutton.ui", "HFMenuButton"),
    m_xMenuButton(m_xBuilder->weld_menu_button("menubutton")),
    m_xPushButton(m_xBuilder->weld_button("button")),
    m_bIsHeader( bHeader ),
    m_pPopupMenu(m_aBuilder.get_menu("menu")),
    m_pLine( nullptr ),
    m_bIsAppearing( false ),
    m_nFadeRate( 100 ),
    m_aFadeTimer( )
{
    //FIXME RenderContext
    m_xVirDev = m_xMenuButton->create_virtual_device();
    SetVirDevFont();

    // Get the font and configure it
    vcl::Font aFont = Application::GetSettings().GetStyleSettings().GetToolFont();
    SetZoomedPointFont(*this, aFont);
    m_xPushButton->connect_clicked(LINK(this, SwHeaderFooterWin, ClickHdl));
    m_xMenuButton->connect_selected(LINK(this, SwHeaderFooterWin, SelectHdl));

    // Create the line control
    m_pLine = VclPtr<SwDashedLine>::Create(GetEditWin(), &SwViewOption::GetHeaderFooterMarkColor);
@@ -185,17 +185,15 @@ SwHeaderFooterWin::SwHeaderFooterWin( SwEditWin* pEditWin, const SwFrame *pFrame
    // Rewrite the menu entries' text
    if (m_bIsHeader)
    {
        m_pPopupMenu->SetItemText(m_pPopupMenu->GetItemId("edit"), SwResId(STR_FORMAT_HEADER));
        m_pPopupMenu->SetItemText(m_pPopupMenu->GetItemId("delete"), SwResId(STR_DELETE_HEADER));
        m_xMenuButton->set_item_label("edit", SwResId(STR_FORMAT_HEADER));
        m_xMenuButton->set_item_label("delete", SwResId(STR_DELETE_HEADER));
    }
    else
    {
        m_pPopupMenu->SetItemText(m_pPopupMenu->GetItemId("edit"), SwResId(STR_FORMAT_FOOTER));
        m_pPopupMenu->SetItemText(m_pPopupMenu->GetItemId("delete"), SwResId(STR_DELETE_FOOTER));
        m_xMenuButton->set_item_label("edit", SwResId(STR_FORMAT_FOOTER));
        m_xMenuButton->set_item_label("delete", SwResId(STR_DELETE_FOOTER));
    }

    SetPopupMenu(m_pPopupMenu);

    m_aFadeTimer.SetTimeout(50);
    m_aFadeTimer.SetInvokeHandler(LINK(this, SwHeaderFooterWin, FadeHandler));
}
@@ -207,9 +205,9 @@ SwHeaderFooterWin::~SwHeaderFooterWin( )

void SwHeaderFooterWin::dispose()
{
    m_pPopupMenu.clear();
    m_aBuilder.disposeBuilder();
    m_pLine.disposeAndClear();
    m_xPushButton.reset();
    m_xMenuButton.reset();
    SwFrameMenuButtonBase::dispose();
}

@@ -234,12 +232,13 @@ void SwHeaderFooterWin::SetOffset(Point aOffset, tools::Long nXLineStart, tools:

    sal_Int32 nPos = m_sLabel.lastIndexOf("%1");
    m_sLabel = m_sLabel.replaceAt(nPos, 2, pDesc->GetName());
    m_xMenuButton->set_accessible_name(m_sLabel);

    // Compute the text size and get the box position & size from it
    ::tools::Rectangle aTextRect;
    GetTextBoundRect(aTextRect, m_sLabel);
    ::tools::Rectangle aTextPxRect = LogicToPixel(aTextRect);
    FontMetric aFontMetric = GetFontMetric(GetFont());
    m_xVirDev->GetTextBoundRect(aTextRect, m_sLabel);
    ::tools::Rectangle aTextPxRect = m_xVirDev->LogicToPixel(aTextRect);
    FontMetric aFontMetric = m_xVirDev->GetFontMetric(m_xVirDev->GetFont());
    Size aBoxSize (aTextPxRect.GetWidth() + BUTTON_WIDTH + TEXT_PADDING * 2,
                   aFontMetric.GetLineHeight() + TEXT_PADDING  * 2 );

@@ -258,6 +257,9 @@ void SwHeaderFooterWin::SetOffset(Point aOffset, tools::Long nXLineStart, tools:
    // Set the position & Size of the window
    SetPosSizePixel(aBoxPos, aBoxSize);

    m_xVirDev->SetOutputSizePixel(aBoxSize);
    PaintButton();

    double nYLinePos = aBoxPos.Y();
    if (!m_bIsHeader)
        nYLinePos += aBoxSize.Height();
@@ -268,6 +270,10 @@ void SwHeaderFooterWin::SetOffset(Point aOffset, tools::Long nXLineStart, tools:

void SwHeaderFooterWin::ShowAll(bool bShow)
{
    bool bIsEmptyHeaderFooter = IsEmptyHeaderFooter();
    m_xMenuButton->set_visible(!bIsEmptyHeaderFooter);
    m_xPushButton->set_visible(bIsEmptyHeaderFooter);

    if (!PopupMenu::IsInExecute())
    {
        m_bIsAppearing = bShow;
@@ -288,21 +294,24 @@ bool SwHeaderFooterWin::Contains( const Point &rDocPt ) const
    return aLineRect.IsInside(rDocPt);
}

void SwHeaderFooterWin::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle&)
void SwHeaderFooterWin::PaintButton()
{
    if (!m_xVirDev)
        return;

    // Use pixels for the rest of the drawing
    SetMapMode(MapMode(MapUnit::MapPixel));
    drawinglayer::primitive2d::Primitive2DContainer aSeq;
    const ::tools::Rectangle aRect(::tools::Rectangle(Point(0, 0), rRenderContext.PixelToLogic(GetSizePixel())));
    const ::tools::Rectangle aRect(::tools::Rectangle(Point(0, 0), m_xVirDev->PixelToLogic(GetSizePixel())));

    SwFrameButtonPainter::PaintButton(aSeq, aRect, m_bIsHeader);

    // Create the text primitive
    basegfx::BColor aLineColor = SwViewOption::GetHeaderFooterMarkColor().getBColor();
    B2DVector aFontSize;
    FontAttribute aFontAttr = drawinglayer::primitive2d::getFontAttributeFromVclFont(aFontSize, rRenderContext.GetFont(), false, false);
    FontAttribute aFontAttr = drawinglayer::primitive2d::getFontAttributeFromVclFont(aFontSize, m_xVirDev->GetFont(), false, false);

    FontMetric aFontMetric = rRenderContext.GetFontMetric(rRenderContext.GetFont());
    FontMetric aFontMetric = m_xVirDev->GetFontMetric(m_xVirDev->GetFont());
    double nTextOffsetY = aFontMetric.GetAscent() + TEXT_PADDING;
    Point aTextPos(TEXT_PADDING, nTextOffsetY);

@@ -320,7 +329,8 @@ void SwHeaderFooterWin::Paint(vcl::RenderContext& rRenderContext, const ::tools:
                           B2DSize(aRect.Right(), aRect.getHeight()));

    B2DPolygon aSign;
    if (IsEmptyHeaderFooter())
    bool bIsEmptyHeaderFooter = IsEmptyHeaderFooter();
    if (bIsEmptyHeaderFooter)
    {
        // Create the + polygon
        double nLeft = aSignArea.getMinX() + TEXT_PADDING;
@@ -367,7 +377,7 @@ void SwHeaderFooterWin::Paint(vcl::RenderContext& rRenderContext, const ::tools:
    // Create the processor and process the primitives
    const drawinglayer::geometry::ViewInformation2D aNewViewInfos;
    std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> pProcessor(
        drawinglayer::processor2d::createBaseProcessor2DFromOutputDevice(rRenderContext, aNewViewInfos));
        drawinglayer::processor2d::createBaseProcessor2DFromOutputDevice(*m_xVirDev, aNewViewInfos));

    // TODO Ghost it all if needed
    drawinglayer::primitive2d::Primitive2DContainer aGhostedSeq(1);
@@ -381,6 +391,11 @@ void SwHeaderFooterWin::Paint(vcl::RenderContext& rRenderContext, const ::tools:
                        new drawinglayer::primitive2d::ModifiedColorPrimitive2D(aSeq, aBColorModifier));

    pProcessor->process(aGhostedSeq);

    if (bIsEmptyHeaderFooter)
        m_xPushButton->set_custom_button(m_xVirDev.get());
    else
        m_xMenuButton->set_custom_button(m_xVirDev.get());
}

bool SwHeaderFooterWin::IsEmptyHeaderFooter( ) const
@@ -476,23 +491,22 @@ void SwHeaderFooterWin::SetReadonly( bool bReadonly )
    ShowAll( !bReadonly );
}

void SwHeaderFooterWin::MouseButtonDown( const MouseEvent& rMEvt )
IMPL_LINK_NOARG(SwHeaderFooterWin, ClickHdl, weld::Button&, void)
{
    if (IsEmptyHeaderFooter())
    {
        SwView& rView = GetEditWin()->GetView();
        SwWrtShell& rSh = rView.GetWrtShell();
    SwView& rView = GetEditWin()->GetView();
    SwWrtShell& rSh = rView.GetWrtShell();

        const OUString& rStyleName = GetPageFrame()->GetPageDesc()->GetName();
        rSh.ChangeHeaderOrFooter( rStyleName, m_bIsHeader, true, false );
    }
    else
        MenuButton::MouseButtonDown( rMEvt );
    const OUString& rStyleName = GetPageFrame()->GetPageDesc()->GetName();
    rSh.ChangeHeaderOrFooter( rStyleName, m_bIsHeader, true, false );

    m_xPushButton->hide();
    m_xMenuButton->show();
    PaintButton();
}

void SwHeaderFooterWin::Select()
IMPL_LINK(SwHeaderFooterWin, SelectHdl, const OString&, rIdent, void)
{
    ExecuteCommand(GetCurItemIdent());
    ExecuteCommand(rIdent);
}

IMPL_LINK_NOARG(SwHeaderFooterWin, FadeHandler, Timer *, void)
@@ -513,7 +527,7 @@ IMPL_LINK_NOARG(SwHeaderFooterWin, FadeHandler, Timer *, void)
        m_pLine->Show(false);
    }
    else
        Invalidate();
        PaintButton();

    if (IsVisible() && m_nFadeRate > 0 && m_nFadeRate < 100)
        m_aFadeTimer.Start();
diff --git a/sw/source/uibase/docvw/PageBreakWin.cxx b/sw/source/uibase/docvw/PageBreakWin.cxx
index 651ae32..6167369 100644
--- a/sw/source/uibase/docvw/PageBreakWin.cxx
+++ b/sw/source/uibase/docvw/PageBreakWin.cxx
@@ -24,6 +24,7 @@
#include <pagefrm.hxx>
#include <PostItMgr.hxx>
#include <FrameControlsManager.hxx>
#include <strings.hrc>
#include <uiitems.hxx>
#include <view.hxx>
#include <viewopt.hxx>
@@ -95,25 +96,27 @@ namespace
}

SwPageBreakWin::SwPageBreakWin( SwEditWin* pEditWin, const SwFrame *pFrame ) :
    SwFrameMenuButtonBase( pEditWin, pFrame ),
    m_aBuilder(nullptr, AllSettings::GetUIRootDir(), "modules/swriter/ui/pagebreakmenu.ui", ""),
    m_pPopupMenu(m_aBuilder.get_menu("menu")),
    SwFrameMenuButtonBase(pEditWin, pFrame, "modules/swriter/ui/pbmenubutton.ui", "PBMenuButton"),
    m_xMenuButton(m_xBuilder->weld_menu_button("menubutton")),
    m_pLine( nullptr ),
    m_bIsAppearing( false ),
    m_nFadeRate( 100 ),
    m_nDelayAppearing( 0 ),
    m_bDestroyed( false )
{
    m_xMenuButton->connect_toggled(LINK(this, SwPageBreakWin, ToggleHdl));
    m_xMenuButton->connect_selected(LINK(this, SwPageBreakWin, SelectHdl));
    m_xMenuButton->set_accessible_name(SwResId(STR_PAGE_BREAK_BUTTON));

    m_xVirDev = m_xMenuButton->create_virtual_device();
    SetVirDevFont();

    // Use pixels for the rest of the drawing
    SetMapMode( MapMode ( MapUnit::MapPixel ) );
    m_xVirDev->SetMapMode( MapMode ( MapUnit::MapPixel ) );

    // Create the line control
    m_pLine = VclPtr<SwBreakDashedLine>::Create( GetEditWin(), &SwViewOption::GetPageBreakColor, this );

    // Set the popup menu
    m_pPopupMenu->SetDeactivateHdl( LINK( this, SwPageBreakWin, HideHandler ) );
    SetPopupMenu(m_pPopupMenu);

    m_aFadeTimer.SetTimeout( 50 );
    m_aFadeTimer.SetInvokeHandler( LINK( this, SwPageBreakWin, FadeHandler ) );
}
@@ -129,15 +132,17 @@ void SwPageBreakWin::dispose()
    m_aFadeTimer.Stop();

    m_pLine.disposeAndClear();
    m_pPopupMenu.clear();
    m_aBuilder.disposeBuilder();

    m_xMenuButton.reset();
    SwFrameMenuButtonBase::dispose();
}

void SwPageBreakWin::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle&)
void SwPageBreakWin::PaintButton()
{
    const ::tools::Rectangle aRect(::tools::Rectangle(Point(0, 0), rRenderContext.PixelToLogic(GetSizePixel())));
    if (!m_xVirDev)
        return;

    const ::tools::Rectangle aRect(::tools::Rectangle(Point(0, 0), m_xVirDev->PixelToLogic(GetSizePixel())));

    // Properly paint the control
    BColor aColor = SwViewOption::GetPageBreakColor().getBColor();
@@ -209,17 +214,18 @@ void SwPageBreakWin::Paint(vcl::RenderContext& rRenderContext, const ::tools::Re
    // Create the processor and process the primitives
    const drawinglayer::geometry::ViewInformation2D aNewViewInfos;
    std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> pProcessor(
        drawinglayer::processor2d::createBaseProcessor2DFromOutputDevice(rRenderContext, aNewViewInfos));
        drawinglayer::processor2d::createBaseProcessor2DFromOutputDevice(*m_xVirDev, aNewViewInfos));

    pProcessor->process(aGhostedSeq);

    m_xMenuButton->set_custom_button(m_xVirDev.get());
}

void SwPageBreakWin::Select()
IMPL_LINK(SwPageBreakWin, SelectHdl, const OString&, rIdent, void)
{
    SwFrameControlPtr pThis = GetEditWin()->GetFrameControlsManager( ).GetControl( FrameControlType::PageBreak, GetFrame() );

    OString sIdent = GetCurItemIdent();
    if (sIdent == "edit")
    if (rIdent == "edit")
    {
        const SwLayoutFrame* pBodyFrame = static_cast< const SwLayoutFrame* >( GetPageFrame()->Lower() );
        while ( pBodyFrame && !pBodyFrame->IsBodyFrame() )
@@ -271,7 +277,7 @@ void SwPageBreakWin::Select()
            pEditWin->GrabFocus( );
        }
    }
    else if (sIdent == "delete")
    else if (rIdent == "delete")
    {
        const SwLayoutFrame* pBodyFrame = static_cast< const SwLayoutFrame* >( GetPageFrame()->Lower() );
        while ( pBodyFrame && !pBodyFrame->IsBodyFrame() )
@@ -307,25 +313,6 @@ void SwPageBreakWin::Select()
        Fade( false );
}

void SwPageBreakWin::MouseMove( const MouseEvent& rMEvt )
{
    if ( rMEvt.IsLeaveWindow() )
    {
        // don't fade if we just move to the 'line', or the popup menu is open
        Point aEventPos( rMEvt.GetPosPixel() + rMEvt.GetPosPixel() );
        if ( !Contains( aEventPos ) && !PopupMenu::IsInExecute() )
            Fade( false );
    }
    else if ( !IsVisible() )
        Fade( true );
}

void SwPageBreakWin::Activate( )
{
    Fade( true );
    MenuButton::Activate();
}

void SwPageBreakWin::UpdatePosition(const std::optional<Point>& xEvtPt)
{
    if ( xEvtPt )
@@ -390,6 +377,7 @@ void SwPageBreakWin::UpdatePosition(const std::optional<Point>& xEvtPt)
    // Set the button position
    Point aBtnPos( nBtnLeft, nYLineOffset - BUTTON_HEIGHT / 2 );
    SetPosSizePixel( aBtnPos, aBtnSize );
    m_xVirDev->SetOutputSizePixel(aBtnSize);

    // Set the line position
    Point aLinePos( nLineLeft, nYLineOffset - 5 );
@@ -429,11 +417,10 @@ void SwPageBreakWin::Fade( bool bFadeIn )
        m_aFadeTimer.Start( );
}

IMPL_LINK_NOARG(SwPageBreakWin, HideHandler, Menu *, bool)
IMPL_LINK(SwPageBreakWin, ToggleHdl, weld::ToggleButton&, rMenuButton, void)
{
    Fade( false );

    return false;
    // hide on dropdown, draw fully unfaded if dropdown before fully faded in
    Fade(rMenuButton.get_active());
}

IMPL_LINK_NOARG(SwPageBreakWin, FadeHandler, Timer *, void)
@@ -458,7 +445,7 @@ IMPL_LINK_NOARG(SwPageBreakWin, FadeHandler, Timer *, void)
    else
    {
        UpdatePosition();
        Invalidate();
        PaintButton();
    }

    if (IsVisible( ) && m_nFadeRate > 0 && m_nFadeRate < 100)
diff --git a/sw/source/uibase/docvw/UnfloatTableButton.cxx b/sw/source/uibase/docvw/UnfloatTableButton.cxx
index 4f7bda6..24e6780 100644
--- a/sw/source/uibase/docvw/UnfloatTableButton.cxx
+++ b/sw/source/uibase/docvw/UnfloatTableButton.cxx
@@ -46,20 +46,31 @@
#define BUTTON_WIDTH 12

UnfloatTableButton::UnfloatTableButton(SwEditWin* pEditWin, const SwFrame* pFrame)
    : SwFrameMenuButtonBase(pEditWin, pFrame)
    : SwFrameMenuButtonBase(pEditWin, pFrame, "modules/swriter/ui/unfloatbutton.ui",
                            "UnfloatButton")
    , m_xPushButton(m_xBuilder->weld_button("button"))
    , m_sLabel(SwResId(STR_UNFLOAT_TABLE))
{
    m_xPushButton->set_accessible_name(m_sLabel);
    m_xVirDev = m_xPushButton->create_virtual_device();
    SetVirDevFont();
}

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

void UnfloatTableButton::dispose()
{
    m_xPushButton.reset();
    SwFrameMenuButtonBase::dispose();
}

void UnfloatTableButton::SetOffset(Point aTopRightPixel)
{
    // Compute the text size and get the box position & size from it
    tools::Rectangle aTextRect;
    GetTextBoundRect(aTextRect, m_sLabel);
    tools::Rectangle aTextPxRect = LogicToPixel(aTextRect);
    FontMetric aFontMetric = GetFontMetric(GetFont());
    m_xVirDev->GetTextBoundRect(aTextRect, m_sLabel);
    tools::Rectangle aTextPxRect = m_xVirDev->LogicToPixel(aTextRect);
    FontMetric aFontMetric = m_xVirDev->GetFontMetric(m_xVirDev->GetFont());
    Size aBoxSize(aTextPxRect.GetWidth() + BUTTON_WIDTH + TEXT_PADDING * 2,
                  aFontMetric.GetLineHeight() + TEXT_PADDING * 2);

@@ -72,6 +83,9 @@ void UnfloatTableButton::SetOffset(Point aTopRightPixel)

    // Set the position & Size of the window
    SetPosSizePixel(aBoxPos, aBoxSize);
    m_xVirDev->SetOutputSizePixel(aBoxSize);

    PaintButton();
}

void UnfloatTableButton::MouseButtonDown(const MouseEvent& /*rMEvt*/)
@@ -177,12 +191,15 @@ void UnfloatTableButton::MouseButtonDown(const MouseEvent& /*rMEvt*/)
    }
}

void UnfloatTableButton::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&)
void UnfloatTableButton::PaintButton()
{
    SetMapMode(MapMode(MapUnit::MapPixel));
    if (!m_xVirDev)
        return;

    m_xVirDev->SetMapMode(MapMode(MapUnit::MapPixel));
    drawinglayer::primitive2d::Primitive2DContainer aSeq;
    const ::tools::Rectangle aRect(
        ::tools::Rectangle(Point(0, 0), rRenderContext.PixelToLogic(GetSizePixel())));
        ::tools::Rectangle(Point(0, 0), m_xVirDev->PixelToLogic(GetSizePixel())));

    // Create button
    SwFrameButtonPainter::PaintButton(aSeq, aRect, true);
@@ -191,12 +208,12 @@ void UnfloatTableButton::Paint(vcl::RenderContext& rRenderContext, const tools::
    basegfx::BColor aLineColor = SwViewOption::GetHeaderFooterMarkColor().getBColor();
    basegfx::B2DVector aFontSize;
    drawinglayer::attribute::FontAttribute aFontAttr
        = drawinglayer::primitive2d::getFontAttributeFromVclFont(
            aFontSize, rRenderContext.GetFont(), false, false);
        = drawinglayer::primitive2d::getFontAttributeFromVclFont(aFontSize, m_xVirDev->GetFont(),
                                                                 false, false);

    FontMetric aFontMetric = rRenderContext.GetFontMetric(rRenderContext.GetFont());
    FontMetric aFontMetric = m_xVirDev->GetFontMetric(m_xVirDev->GetFont());
    double nTextOffsetY = aFontMetric.GetAscent() + TEXT_PADDING;
    double nTextOffsetX = std::abs(aRect.GetWidth() - rRenderContext.GetTextWidth(m_sLabel)) / 2.0;
    double nTextOffsetX = std::abs(aRect.GetWidth() - m_xVirDev->GetTextWidth(m_sLabel)) / 2.0;
    Point aTextPos(nTextOffsetX, nTextOffsetY);

    basegfx::B2DHomMatrix aTextMatrix(basegfx::utils::createScaleTranslateB2DHomMatrix(
@@ -211,10 +228,12 @@ void UnfloatTableButton::Paint(vcl::RenderContext& rRenderContext, const tools::
    // Create the processor and process the primitives
    const drawinglayer::geometry::ViewInformation2D aNewViewInfos;
    std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> pProcessor(
        drawinglayer::processor2d::createBaseProcessor2DFromOutputDevice(rRenderContext,
        drawinglayer::processor2d::createBaseProcessor2DFromOutputDevice(*m_xVirDev,
                                                                         aNewViewInfos));

    pProcessor->process(aSeq);

    m_xPushButton->set_custom_button(m_xVirDev.get());
}

void UnfloatTableButton::ShowAll(bool bShow) { Show(bShow); }
diff --git a/sw/source/uibase/inc/FrameControl.hxx b/sw/source/uibase/inc/FrameControl.hxx
index e3c98ca..a2cc7e9 100644
--- a/sw/source/uibase/inc/FrameControl.hxx
+++ b/sw/source/uibase/inc/FrameControl.hxx
@@ -9,7 +9,8 @@
#ifndef INCLUDED_SW_SOURCE_UIBASE_INC_FRAMECONTROL_HXX
#define INCLUDED_SW_SOURCE_UIBASE_INC_FRAMECONTROL_HXX

#include <vcl/menubtn.hxx>
#include <vcl/InterimItemWindow.hxx>
#include <vcl/virdev.hxx>

#include "edtwin.hxx"

@@ -54,8 +55,11 @@ public:

/** Class sharing some MenuButton code
  */
class SwFrameMenuButtonBase : public MenuButton, public ISwFrameControl
class SwFrameMenuButtonBase : public InterimItemWindow, public ISwFrameControl
{
protected:
    VclPtr<VirtualDevice> m_xVirDev;
private:
    VclPtr<SwEditWin>     m_pEditWin;
    const SwFrame*          m_pFrame;

@@ -63,12 +67,15 @@ protected:
    virtual ~SwFrameMenuButtonBase() override { disposeOnce(); }
    virtual void dispose() override;

    void SetVirDevFont();

public:
    SwFrameMenuButtonBase( SwEditWin* pEditWin, const SwFrame* pFrame );
    SwFrameMenuButtonBase(SwEditWin* pEditWin, const SwFrame* pFrame,
                          const OUString& rUIXMLDescription, const OString& rID);

    virtual const SwFrame* GetFrame()   override { return m_pFrame; }
    virtual SwEditWin*   GetEditWin() override { return m_pEditWin; }
    virtual bool IsFocused() const override { return HasFocus(); }
    virtual bool IsFocused() const override { return ControlHasFocus(); }
    const SwPageFrame*     GetPageFrame() const;
};

diff --git a/sw/source/uibase/inc/HeaderFooterWin.hxx b/sw/source/uibase/inc/HeaderFooterWin.hxx
index f92d45f..5b83bbc 100644
--- a/sw/source/uibase/inc/HeaderFooterWin.hxx
+++ b/sw/source/uibase/inc/HeaderFooterWin.hxx
@@ -11,8 +11,8 @@

#include "edtwin.hxx"
#include "FrameControl.hxx"
#include <vcl/builder.hxx>
#include <vcl/timer.hxx>
#include <vcl/virdev.hxx>
#include <drawinglayer/primitive2d/Primitive2DContainer.hxx>

/**
@@ -34,10 +34,10 @@ public:
  */
class SwHeaderFooterWin : public SwFrameMenuButtonBase
{
    VclBuilder            m_aBuilder;
    std::unique_ptr<weld::MenuButton> m_xMenuButton;
    std::unique_ptr<weld::Button> m_xPushButton;
    OUString              m_sLabel;
    bool                  m_bIsHeader;
    VclPtr<PopupMenu>     m_pPopupMenu;
    VclPtr<vcl::Window>   m_pLine;
    bool                  m_bIsAppearing;
    int                   m_nFadeRate;
@@ -50,10 +50,6 @@ public:

    void SetOffset( Point aOffset, tools::Long nXLineStart, tools::Long nXLineEnd );

    virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override;
    virtual void MouseButtonDown( const MouseEvent& rMEvt ) override;
    virtual void Select( ) override;

    virtual void ShowAll( bool bShow ) override;
    virtual bool Contains( const Point &rDocPt ) const override;

@@ -65,7 +61,10 @@ public:
    void SetReadonly( bool bReadonly ) override;

private:
    DECL_LINK( FadeHandler, Timer *, void );
    DECL_LINK(FadeHandler, Timer *, void);
    DECL_LINK(ClickHdl, weld::Button&, void);
    DECL_LINK(SelectHdl, const OString&, void);
    void PaintButton();
};

#endif
diff --git a/sw/source/uibase/inc/PageBreakWin.hxx b/sw/source/uibase/inc/PageBreakWin.hxx
index 982c81e..90f0d9a 100644
--- a/sw/source/uibase/inc/PageBreakWin.hxx
+++ b/sw/source/uibase/inc/PageBreakWin.hxx
@@ -11,7 +11,6 @@

#include "edtwin.hxx"
#include "FrameControl.hxx"
#include <vcl/builder.hxx>
#include <vcl/timer.hxx>
#include <optional>

@@ -25,8 +24,7 @@ class SwPageFrame;
  */
class SwPageBreakWin : public SwFrameMenuButtonBase
{
    VclBuilder            m_aBuilder;
    VclPtr<PopupMenu>     m_pPopupMenu;
    std::unique_ptr<weld::MenuButton> m_xMenuButton;
    VclPtr<vcl::Window>   m_pLine;
    bool                  m_bIsAppearing;
    int                   m_nFadeRate;
@@ -41,11 +39,6 @@ public:
    virtual ~SwPageBreakWin() override;
    virtual void dispose() override;

    virtual void Paint( vcl::RenderContext& /*rRenderContext*/, const tools::Rectangle& rRect ) override;
    virtual void Select( ) override;
    virtual void MouseMove( const MouseEvent& rMEvt ) override;
    virtual void Activate( ) override;

    void UpdatePosition(const std::optional<Point>& xEvtPt = std::optional<Point>());

    virtual void ShowAll( bool bShow ) override;
@@ -56,9 +49,11 @@ public:
    void Fade( bool bFadeIn );

private:
    /// Hide the button (used when the popup menu is closed by clicking outside)
    DECL_LINK( HideHandler, Menu *, bool );
    DECL_LINK( FadeHandler, Timer *, void );
    /// Hide the button when the menu is toggled closed, e.g by clicking outside
    DECL_LINK(ToggleHdl, weld::ToggleButton&, void);
    DECL_LINK(SelectHdl, const OString&, void);
    void PaintButton();
};

#endif
diff --git a/sw/source/uibase/inc/UnfloatTableButton.hxx b/sw/source/uibase/inc/UnfloatTableButton.hxx
index 701c824..99598bc 100644
--- a/sw/source/uibase/inc/UnfloatTableButton.hxx
+++ b/sw/source/uibase/inc/UnfloatTableButton.hxx
@@ -24,21 +24,25 @@
 */
class UnfloatTableButton : public SwFrameMenuButtonBase
{
    std::unique_ptr<weld::Button> m_xPushButton;
    OUString m_sLabel;

public:
    UnfloatTableButton(SwEditWin* pEditWin, const SwFrame* pFrame);
    virtual void dispose() override;
    virtual ~UnfloatTableButton() override;

    void SetOffset(Point aTopRightPixel);

    virtual void MouseButtonDown(const MouseEvent& rMEvt) override;
    virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override;

    virtual void ShowAll(bool bShow) override;
    virtual bool Contains(const Point& rDocPt) const override;

    virtual void SetReadonly(bool bReadonly) override;

private:
    void PaintButton();
};

#endif
diff --git a/sw/uiconfig/swriter/ui/headerfootermenu.ui b/sw/uiconfig/swriter/ui/headerfootermenu.ui
deleted file mode 100644
index 6f15488..0000000
--- a/sw/uiconfig/swriter/ui/headerfootermenu.ui
+++ /dev/null
@@ -1,47 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.0 -->
<interface domain="sw">
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkMenu" id="menu">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <child>
      <object class="GtkMenuItem" id="edit">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="use_underline">True</property>
      </object>
    </child>
    <child>
      <object class="GtkMenuItem" id="borderback">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="label" translatable="yes" context="headerfootermenu|borderback">Border and Background...</property>
        <property name="use_underline">True</property>
      </object>
    </child>
    <child>
      <object class="GtkMenuItem" id="delete">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="use_underline">True</property>
      </object>
    </child>
    <child>
      <object class="GtkMenuItem" id="insert_pagenumber">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="label" translatable="yes" context="headerfootermenu|insert_pagenumber">Insert Page Number</property>
        <property name="use_underline">True</property>
      </object>
    </child>
    <child>
      <object class="GtkMenuItem" id="insert_pagecount">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="label" translatable="yes" context="headerfootermenu|insert_pagecount">Insert Page Count</property>
        <property name="use_underline">True</property>
      </object>
    </child>
  </object>
</interface>
diff --git a/sw/uiconfig/swriter/ui/hfmenubutton.ui b/sw/uiconfig/swriter/ui/hfmenubutton.ui
new file mode 100644
index 0000000..a41efba
--- /dev/null
+++ b/sw/uiconfig/swriter/ui/hfmenubutton.ui
@@ -0,0 +1,97 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.1 -->
<interface domain="sw">
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkImage" id="image7">
    <property name="visible">True</property>
    <property name="can-focus">False</property>
    <property name="icon_size">2</property>
  </object>
  <object class="GtkMenu" id="menu">
    <property name="visible">True</property>
    <property name="can-focus">False</property>
    <child>
      <object class="GtkMenuItem" id="edit">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="use-underline">True</property>
      </object>
    </child>
    <child>
      <object class="GtkMenuItem" id="borderback">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="label" translatable="yes" context="headerfootermenu|borderback">Border and Background...</property>
        <property name="use-underline">True</property>
      </object>
    </child>
    <child>
      <object class="GtkMenuItem" id="delete">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="use-underline">True</property>
      </object>
    </child>
    <child>
      <object class="GtkMenuItem" id="insert_pagenumber">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="label" translatable="yes" context="headerfootermenu|insert_pagenumber">Insert Page Number</property>
        <property name="use-underline">True</property>
      </object>
    </child>
    <child>
      <object class="GtkMenuItem" id="insert_pagecount">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="label" translatable="yes" context="headerfootermenu|insert_pagecount">Insert Page Count</property>
        <property name="use-underline">True</property>
      </object>
    </child>
  </object>
  <object class="GtkBox" id="HFMenuButton">
    <property name="visible">True</property>
    <property name="can-focus">False</property>
    <property name="hexpand">True</property>
    <property name="vexpand">True</property>
    <property name="orientation">vertical</property>
    <child>
      <object class="GtkMenuButton" id="menubutton">
        <property name="visible">True</property>
        <property name="can-focus">True</property>
        <property name="focus-on-click">False</property>
        <property name="receives-default">True</property>
        <property name="hexpand">True</property>
        <property name="vexpand">True</property>
        <property name="image">image7</property>
        <property name="relief">none</property>
        <property name="always-show-image">True</property>
        <property name="popup">menu</property>
        <style>
          <class name="small-button"/>
        </style>
      </object>
      <packing>
        <property name="expand">True</property>
        <property name="fill">True</property>
        <property name="position">0</property>
      </packing>
    </child>
    <child>
      <object class="GtkButton" id="button">
        <property name="can-focus">True</property>
        <property name="receives-default">True</property>
        <property name="no-show-all">True</property>
        <property name="hexpand">True</property>
        <property name="vexpand">True</property>
        <property name="relief">none</property>
        <property name="always-show-image">True</property>
      </object>
      <packing>
        <property name="expand">False</property>
        <property name="fill">True</property>
        <property name="position">1</property>
      </packing>
    </child>
  </object>
</interface>
diff --git a/sw/uiconfig/swriter/ui/pagebreakmenu.ui b/sw/uiconfig/swriter/ui/pagebreakmenu.ui
deleted file mode 100644
index 022dadc..0000000
--- a/sw/uiconfig/swriter/ui/pagebreakmenu.ui
+++ /dev/null
@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.0 -->
<interface domain="sw">
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkMenu" id="menu">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <child>
      <object class="GtkMenuItem" id="edit">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="label" translatable="yes" context="pagebreakmenu|edit">Edit Page Break...</property>
        <property name="use_underline">True</property>
      </object>
    </child>
    <child>
      <object class="GtkMenuItem" id="delete">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="label" translatable="yes" context="pagebreakmenu|delete">Delete Page Break</property>
        <property name="use_underline">True</property>
      </object>
    </child>
  </object>
</interface>
diff --git a/sw/uiconfig/swriter/ui/pbmenubutton.ui b/sw/uiconfig/swriter/ui/pbmenubutton.ui
new file mode 100644
index 0000000..463d325
--- /dev/null
+++ b/sw/uiconfig/swriter/ui/pbmenubutton.ui
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.1 -->
<interface domain="sw">
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkImage" id="image7">
    <property name="visible">True</property>
    <property name="can-focus">False</property>
    <property name="icon_size">2</property>
  </object>
  <object class="GtkMenu" id="menu">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <child>
      <object class="GtkMenuItem" id="edit">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="label" translatable="yes" context="pagebreakmenu|edit">Edit Page Break...</property>
        <property name="use_underline">True</property>
      </object>
    </child>
    <child>
      <object class="GtkMenuItem" id="delete">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="label" translatable="yes" context="pagebreakmenu|delete">Delete Page Break</property>
        <property name="use_underline">True</property>
      </object>
    </child>
  </object>
  <object class="GtkBox" id="PBMenuButton">
    <property name="visible">True</property>
    <property name="can-focus">False</property>
    <property name="hexpand">True</property>
    <property name="vexpand">True</property>
    <property name="orientation">vertical</property>
    <child>
      <object class="GtkMenuButton" id="menubutton">
        <property name="visible">True</property>
        <property name="can-focus">True</property>
        <property name="focus-on-click">False</property>
        <property name="receives-default">True</property>
        <property name="hexpand">True</property>
        <property name="vexpand">True</property>
        <property name="image">image7</property>
        <property name="relief">none</property>
        <property name="always-show-image">True</property>
        <property name="popup">menu</property>
        <style>
          <class name="small-button"/>
        </style>
      </object>
      <packing>
        <property name="expand">True</property>
        <property name="fill">True</property>
        <property name="position">0</property>
      </packing>
    </child>
  </object>
</interface>
diff --git a/sw/uiconfig/swriter/ui/unfloatbutton.ui b/sw/uiconfig/swriter/ui/unfloatbutton.ui
new file mode 100644
index 0000000..6933076
--- /dev/null
+++ b/sw/uiconfig/swriter/ui/unfloatbutton.ui
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.1 -->
<interface domain="sw">
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkBox" id="UnfloatButton">
    <property name="visible">True</property>
    <property name="can-focus">False</property>
    <property name="hexpand">True</property>
    <property name="vexpand">True</property>
    <property name="orientation">vertical</property>
    <child>
      <object class="GtkButton" id="button">
        <property name="visible">True</property>
        <property name="can-focus">True</property>
        <property name="receives-default">True</property>
        <property name="hexpand">True</property>
        <property name="vexpand">True</property>
        <property name="relief">none</property>
        <property name="always-show-image">True</property>
      </object>
      <packing>
        <property name="expand">False</property>
        <property name="fill">True</property>
        <property name="position">1</property>
      </packing>
    </child>
  </object>
</interface>