[Libreoffice-commits] core.git: include/sfx2 sfx2/inc sfx2/Library_sfx.mk sfx2/source sfx2/uiconfig sfx2/UIConfig_sfx.mk solenv/clang-format solenv/sanitizers

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Thu Nov 12 08:49:54 UTC 2020


 include/sfx2/sidebar/Panel.hxx             |    3 
 include/sfx2/sidebar/Theme.hxx             |    5 -
 sfx2/Library_sfx.mk                        |    1 
 sfx2/UIConfig_sfx.mk                       |    2 
 sfx2/inc/sidebar/AccessibleTitleBar.hxx    |   44 --------
 sfx2/inc/sidebar/DeckTitleBar.hxx          |   25 +++--
 sfx2/inc/sidebar/PanelTitleBar.hxx         |   23 ++--
 sfx2/inc/sidebar/TitleBar.hxx              |   48 ++++-----
 sfx2/source/sidebar/AccessibleTitleBar.cxx |   60 ------------
 sfx2/source/sidebar/DeckTitleBar.cxx       |  134 ++++++++++++++-------------
 sfx2/source/sidebar/FocusManager.cxx       |   24 +---
 sfx2/source/sidebar/Panel.cxx              |    3 
 sfx2/source/sidebar/PanelTitleBar.cxx      |  136 +++++++--------------------
 sfx2/source/sidebar/SidebarController.cxx  |   10 --
 sfx2/source/sidebar/Theme.cxx              |   35 -------
 sfx2/source/sidebar/TitleBar.cxx           |  142 ++++-------------------------
 sfx2/uiconfig/ui/decktitlebar.ui           |   82 ++++++++++++++++
 sfx2/uiconfig/ui/paneltitlebar.ui          |   89 ++++++++++++++++++
 solenv/clang-format/excludelist            |    2 
 solenv/sanitizers/ui/sfx.suppr             |    5 +
 20 files changed, 367 insertions(+), 506 deletions(-)

New commits:
commit 64dcfe295762864656bc5876da10bec37b7fb6ec
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Wed Nov 4 15:22:53 2020 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Thu Nov 12 09:49:09 2020 +0100

    weld panel TitleBar
    
    use an expander for the expander-like feature
    
    Change-Id: I3af63dc252479914a0000aab59a30744f8073fd1
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105310
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/include/sfx2/sidebar/Panel.hxx b/include/sfx2/sidebar/Panel.hxx
index ee635220cf55..cdeee5223559 100644
--- a/include/sfx2/sidebar/Panel.hxx
+++ b/include/sfx2/sidebar/Panel.hxx
@@ -73,7 +73,6 @@ public:
 
 private:
     const OUString msPanelId;
-    VclPtr<PanelTitleBar> mpTitleBar;
     const bool mbIsTitleBarOptional;
     css::uno::Reference<css::ui::XUIElement> mxElement;
     css::uno::Reference<css::ui::XSidebarPanel> mxPanelComponent;
@@ -81,8 +80,8 @@ private:
     bool mbLurking;
     const std::function<void()> maDeckLayoutTrigger;
     const std::function<Context()> maContextAccess;
-
     const css::uno::Reference<css::frame::XFrame>& mxFrame;
+    VclPtr<PanelTitleBar> mpTitleBar;
 
 };
 typedef std::vector<VclPtr<Panel> > SharedPanelContainer;
diff --git a/include/sfx2/sidebar/Theme.hxx b/include/sfx2/sidebar/Theme.hxx
index 38ba8d1e7078..7c6b441334e1 100644
--- a/include/sfx2/sidebar/Theme.hxx
+++ b/include/sfx2/sidebar/Theme.hxx
@@ -56,12 +56,7 @@ public:
 
         AnyItem_ = Pre_Image_,
 
-        Image_Grip,
-        Image_Expand,
-        Image_Collapse,
         Image_TabBarMenu,
-        Image_PanelMenu,
-        Image_Closer,
         Image_CloseIndicator,
 
         Image_Color_,
diff --git a/sfx2/Library_sfx.mk b/sfx2/Library_sfx.mk
index 05c31e58034d..aa722d248f48 100644
--- a/sfx2/Library_sfx.mk
+++ b/sfx2/Library_sfx.mk
@@ -259,7 +259,6 @@ $(eval $(call gb_Library_add_exception_objects,sfx,\
     sfx2/source/sidebar/SidebarPanelBase \
     sfx2/source/sidebar/SidebarToolBox \
     sfx2/source/sidebar/Accessible \
-    sfx2/source/sidebar/AccessibleTitleBar \
     sfx2/source/sidebar/AsynchronousCall \
     sfx2/source/sidebar/Context \
     sfx2/source/sidebar/ContextChangeBroadcaster \
diff --git a/sfx2/UIConfig_sfx.mk b/sfx2/UIConfig_sfx.mk
index 5bb91d7ac6f6..b2851a75e205 100644
--- a/sfx2/UIConfig_sfx.mk
+++ b/sfx2/UIConfig_sfx.mk
@@ -22,6 +22,7 @@ $(eval $(call gb_UIConfig_add_uifiles,sfx,\
 	sfx2/uiconfig/ui/cmisinfopage \
 	sfx2/uiconfig/ui/cmisline \
 	sfx2/uiconfig/ui/custominfopage \
+	sfx2/uiconfig/ui/decktitlebar \
 	sfx2/uiconfig/ui/descriptioninfopage \
 	sfx2/uiconfig/ui/dockingwindow \
 	sfx2/uiconfig/ui/documentfontspage \
@@ -50,6 +51,7 @@ $(eval $(call gb_UIConfig_add_uifiles,sfx,\
 	sfx2/uiconfig/ui/newstyle \
 	sfx2/uiconfig/ui/notebookbar \
 	sfx2/uiconfig/ui/optprintpage \
+	sfx2/uiconfig/ui/paneltitlebar \
 	sfx2/uiconfig/ui/password \
 	sfx2/uiconfig/ui/notebookbarpopup \
 	sfx2/uiconfig/ui/printeroptionsdialog \
diff --git a/sfx2/inc/sidebar/AccessibleTitleBar.hxx b/sfx2/inc/sidebar/AccessibleTitleBar.hxx
deleted file mode 100644
index f2105dabbd1d..000000000000
--- a/sfx2/inc/sidebar/AccessibleTitleBar.hxx
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   Licensed to the Apache Software Foundation (ASF) under one or more
- *   contributor license agreements. See the NOTICE file distributed
- *   with this work for additional information regarding copyright
- *   ownership. The ASF licenses this file to you under the Apache
- *   License, Version 2.0 (the "License"); you may not use this file
- *   except in compliance with the License. You may obtain a copy of
- *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-#pragma once
-
-#include <toolkit/awt/vclxaccessiblecomponent.hxx>
-
-namespace com::sun::star::accessibility { class XAccessible; }
-
-namespace sfx2::sidebar {
-
-class TitleBar;
-
-class AccessibleTitleBar final
-    : public VCLXAccessibleComponent
-{
-public:
-    static css::uno::Reference<css::accessibility::XAccessible> Create (TitleBar& rTitleBar);
-
-private:
-    virtual void FillAccessibleStateSet (utl::AccessibleStateSetHelper& rStateSet) override;
-
-    explicit AccessibleTitleBar (VCLXWindow* pWindow);
-    virtual ~AccessibleTitleBar() override;
-};
-
-} // end of namespace sfx2::sidebar
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/inc/sidebar/DeckTitleBar.hxx b/sfx2/inc/sidebar/DeckTitleBar.hxx
index eee139556020..3b1451ab449c 100644
--- a/sfx2/inc/sidebar/DeckTitleBar.hxx
+++ b/sfx2/inc/sidebar/DeckTitleBar.hxx
@@ -19,31 +19,40 @@
 #pragma once
 
 #include <sidebar/TitleBar.hxx>
+#include <vcl/customweld.hxx>
 
 namespace sfx2::sidebar {
 
+class GripWidget;
+
 class DeckTitleBar final : public TitleBar
 {
 public:
     DeckTitleBar(const OUString& rsTitle,
                  vcl::Window* pParentWindow,
                  const std::function<void()>& rCloserAction);
+    virtual void dispose() override;
+    virtual ~DeckTitleBar() override;
+
+    virtual void SetTitle (const OUString& rsTitle) override;
+    virtual OUString GetTitle() const override;
 
     void SetCloserVisible(const bool bIsCloserVisible);
-    static tools::Rectangle GetDragArea();
+    tools::Rectangle GetDragArea();
 
     virtual void DataChanged(const DataChangedEvent& rEvent) override;
-    virtual void MouseMove(const MouseEvent& rMouseEvent) override;
 
 private:
-    virtual tools::Rectangle GetTitleArea(const tools::Rectangle& rTitleBarBox) override;
-    virtual void PaintDecoration(vcl::RenderContext& rRenderContext) override;
-    virtual Color GetBackgroundPaintColor() override;
-    virtual void HandleToolBoxItemClick(const sal_uInt16 nItemIndex) override;
-    virtual css::uno::Reference<css::accessibility::XAccessible> CreateAccessible() override;
+    virtual void HandleToolBoxItemClick() override;
+
+    DECL_LINK(DrawGripHdl, weld::DrawingArea::draw_args, void);
+
+    std::unique_ptr<GripWidget> mxGripWidget;
+    std::unique_ptr<weld::CustomWeld> mxGripWeld;
+    std::unique_ptr<weld::Label> mxLabel;
 
-    static const sal_uInt16 mnCloserItemIndex = 1;
     const std::function<void()> maCloserAction;
+    BitmapEx maGrip;
     bool mbIsCloserVisible;
 };
 
diff --git a/sfx2/inc/sidebar/PanelTitleBar.hxx b/sfx2/inc/sidebar/PanelTitleBar.hxx
index e84febf1e125..7be18d71f1fd 100644
--- a/sfx2/inc/sidebar/PanelTitleBar.hxx
+++ b/sfx2/inc/sidebar/PanelTitleBar.hxx
@@ -32,25 +32,26 @@ class PanelTitleBar final
 {
 public:
     PanelTitleBar(const OUString& rsTitle, vcl::Window* pParentWindow, Panel* pPanel);
-    virtual ~PanelTitleBar() override;
     virtual void dispose() override;
+    virtual ~PanelTitleBar() override;
+
+    virtual void SetTitle (const OUString& rsTitle) override;
+    virtual OUString GetTitle() const override;
 
     void SetMoreOptionsCommand(const OUString& rsCommandName,
-                               const css::uno::Reference<css::frame::XFrame>& rxFrame,
-                               const css::uno::Reference<css::frame::XController>& rxController);
+                               const css::uno::Reference<css::frame::XFrame>& rxFrame);
+
+    void UpdateExpandedState();
 
     virtual void DataChanged(const DataChangedEvent& rEvent) override;
-    virtual void MouseButtonDown(const MouseEvent& rMouseEvent) override;
-    virtual void MouseButtonUp(const MouseEvent& rMouseEvent) override;
 
 private:
-    virtual tools::Rectangle GetTitleArea(const tools::Rectangle& rTitleBarBox) override;
-    virtual void PaintDecoration(vcl::RenderContext& rRenderContext) override;
-    virtual Color GetBackgroundPaintColor() override;
-    virtual void HandleToolBoxItemClick (const sal_uInt16 nItemIndex) override;
-    virtual css::uno::Reference<css::accessibility::XAccessible> CreateAccessible() override;
+    virtual void HandleToolBoxItemClick() override;
+
+    DECL_LINK(ExpandHdl, weld::Expander&, void);
+
+    std::unique_ptr<weld::Expander> mxExpander;
 
-    bool mbIsLeftButtonDown;
     VclPtr<Panel> mpPanel;
     static const sal_uInt16 mnMenuItemIndex = 1;
     css::uno::Reference<css::frame::XFrame> mxFrame;
diff --git a/sfx2/inc/sidebar/TitleBar.hxx b/sfx2/inc/sidebar/TitleBar.hxx
index f86a39324d70..772b349b6a2c 100644
--- a/sfx2/inc/sidebar/TitleBar.hxx
+++ b/sfx2/inc/sidebar/TitleBar.hxx
@@ -19,54 +19,46 @@
 #pragma once
 
 #include <sidebar/SidebarToolBox.hxx>
+#include <sfx2/sidebar/Theme.hxx>
+#include <sfx2/weldutils.hxx>
+#include <vcl/InterimItemWindow.hxx>
 
 namespace sfx2::sidebar {
 
-class TitleBar : public vcl::Window
+class TitleBar : public InterimItemWindow
 {
 public:
-    TitleBar (const OUString& rsTitle,
-              vcl::Window* pParentWindow,
-              const Color& rInitialBackgroundColor);
-    virtual ~TitleBar() override;
+    TitleBar(vcl::Window* pParentWindow,
+             const OUString& rUIXMLDescription, const OString& rID,
+             Theme::ThemeItem eThemeItem);
     virtual void dispose() override;
+    virtual ~TitleBar() override;
 
-    void SetTitle (const OUString& rsTitle);
-    const OUString& GetTitle() const {return msTitle; }
+    virtual void SetTitle (const OUString& rsTitle) = 0;
+    virtual OUString GetTitle() const = 0;
 
     void SetIcon(const css::uno::Reference<css::graphic::XGraphic>& rIcon);
 
-    virtual void ApplySettings(vcl::RenderContext& rRenderContext) override;
-    virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rUpdateArea) override;
     virtual void DataChanged (const DataChangedEvent& rEvent) override;
-    virtual void setPosSizePixel (tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight, PosSizeFlags nFlags = PosSizeFlags::All) override;
 
-    ToolBox& GetToolBox()
+    weld::Toolbar& GetToolBox()
     {
-        return *maToolBox;
+        return *mxToolBox;
     }
-    const ToolBox& GetToolBox() const
+    const weld::Toolbar& GetToolBox() const
     {
-        return *maToolBox;
+        return *mxToolBox;
     }
 
 protected:
-    VclPtr<SidebarToolBox> maToolBox;
-    OUString msTitle;
-
-    virtual tools::Rectangle GetTitleArea (const tools::Rectangle& rTitleBarBox) = 0;
-    virtual void PaintDecoration (vcl::RenderContext& rRenderContext) = 0;
-    void PaintFocus(vcl::RenderContext& rRenderContext, const tools::Rectangle& rFocusBox);
-    virtual Color GetBackgroundPaintColor() = 0;
-    virtual void HandleToolBoxItemClick (const sal_uInt16 nItemIndex);
-    virtual css::uno::Reference<css::accessibility::XAccessible> CreateAccessible() override;
+    std::unique_ptr<weld::Image> mxAddonImage;
+    std::unique_ptr<weld::Toolbar> mxToolBox;
+    std::unique_ptr<ToolbarUnoDispatcher> mxToolBoxController;
+    Theme::ThemeItem meThemeItem;
 
-private:
-    Image maIcon;
-    Color maBackgroundColor;
+    virtual void HandleToolBoxItemClick() = 0;
 
-    void PaintTitle(vcl::RenderContext& rRenderContext, const tools::Rectangle& rTitleBox);
-    DECL_LINK(SelectionHandler, ToolBox*, void);
+    DECL_LINK(SelectionHandler, const OString&, void);
 };
 
 } // end of namespace sfx2::sidebar
diff --git a/sfx2/source/sidebar/AccessibleTitleBar.cxx b/sfx2/source/sidebar/AccessibleTitleBar.cxx
deleted file mode 100644
index c92fbf59e812..000000000000
--- a/sfx2/source/sidebar/AccessibleTitleBar.cxx
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   Licensed to the Apache Software Foundation (ASF) under one or more
- *   contributor license agreements. See the NOTICE file distributed
- *   with this work for additional information regarding copyright
- *   ownership. The ASF licenses this file to you under the Apache
- *   License, Version 2.0 (the "License"); you may not use this file
- *   except in compliance with the License. You may obtain a copy of
- *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include <sidebar/AccessibleTitleBar.hxx>
-#include <sidebar/Accessible.hxx>
-#include <sidebar/TitleBar.hxx>
-
-#include <com/sun/star/accessibility/AccessibleStateType.hpp>
-
-#include <unotools/accessiblestatesethelper.hxx>
-
-using namespace css;
-using namespace css::uno;
-
-namespace sfx2::sidebar {
-
-Reference<accessibility::XAccessible> AccessibleTitleBar::Create (TitleBar& rTitleBar)
-{
-    rTitleBar.GetComponentInterface();
-    VCLXWindow* pWindow = rTitleBar.GetWindowPeer();
-    if (pWindow != nullptr)
-        return new Accessible(new AccessibleTitleBar(pWindow));
-    else
-        return nullptr;
-}
-
-AccessibleTitleBar::AccessibleTitleBar (VCLXWindow* pWindow)
-    : VCLXAccessibleComponent(pWindow)
-{
-}
-
-AccessibleTitleBar::~AccessibleTitleBar()
-{
-}
-
-void AccessibleTitleBar::FillAccessibleStateSet (utl::AccessibleStateSetHelper& rStateSet)
-{
-    VCLXAccessibleComponent::FillAccessibleStateSet(rStateSet);
-    rStateSet.AddState(accessibility::AccessibleStateType::FOCUSABLE);
-}
-
-} // end of namespace sfx2::sidebar
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/sidebar/DeckTitleBar.cxx b/sfx2/source/sidebar/DeckTitleBar.cxx
index 2d8fcd92b1c2..f7e0a8df7b7e 100644
--- a/sfx2/source/sidebar/DeckTitleBar.cxx
+++ b/sfx2/source/sidebar/DeckTitleBar.cxx
@@ -22,8 +22,7 @@
 #include <sfx2/sfxresid.hxx>
 #include <sfx2/strings.hrc>
 
-#include <vcl/event.hxx>
-#include <vcl/image.hxx>
+#include <vcl/customweld.hxx>
 #include <vcl/ptrstyle.hxx>
 
 #ifdef DEBUG
@@ -32,19 +31,46 @@
 
 namespace sfx2::sidebar {
 
-namespace
+class GripWidget : public weld::CustomWidgetController
 {
-const sal_Int32 gaLeftGripPadding (3);
-const sal_Int32 gaRightGripPadding (6);
-}
+private:
+    BitmapEx maGrip;
+public:
+    virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override
+    {
+        weld::CustomWidgetController::SetDrawingArea(pDrawingArea);
+        StyleUpdated();
+    }
+
+    virtual void StyleUpdated() override
+    {
+        maGrip = BitmapEx("sfx2/res/grip.png");
+        Size aGripSize(maGrip.GetSizePixel());
+        set_size_request(aGripSize.Width(), aGripSize.Height());
+        weld::CustomWidgetController::StyleUpdated();
+    }
+
+    virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& /*rRect*/) override
+    {
+        rRenderContext.SetBackground(Theme::GetColor(Theme::Color_DeckTitleBarBackground));
+        rRenderContext.DrawBitmapEx(Point(0, 0), maGrip);
+    }
+};
 
 DeckTitleBar::DeckTitleBar (const OUString& rsTitle,
                             vcl::Window* pParentWindow,
                             const std::function<void()>& rCloserAction)
-    : TitleBar(rsTitle, pParentWindow, GetBackgroundPaintColor())
+    : TitleBar(pParentWindow, "sfx/ui/decktitlebar.ui", "DeckTitleBar",
+               Theme::Color_DeckTitleBarBackground)
+    , mxGripWidget(new GripWidget)
+    , mxGripWeld(new weld::CustomWeld(*m_xBuilder, "grip", *mxGripWidget))
+    , mxLabel(m_xBuilder->weld_label("label"))
     , maCloserAction(rCloserAction)
     , mbIsCloserVisible(false)
 {
+    mxLabel->set_label(rsTitle);
+    mxGripWidget->SetPointer(PointerStyle::Move);
+
     OSL_ASSERT(pParentWindow != nullptr);
 
     if (maCloserAction)
@@ -55,91 +81,69 @@ DeckTitleBar::DeckTitleBar (const OUString& rsTitle,
 #endif
 }
 
-void DeckTitleBar::SetCloserVisible (const bool bIsCloserVisible)
+DeckTitleBar::~DeckTitleBar()
 {
-    if (mbIsCloserVisible == bIsCloserVisible)
-        return;
-
-    mbIsCloserVisible = bIsCloserVisible;
-
-    if (mbIsCloserVisible)
-    {
-        maToolBox->InsertItem(mnCloserItemIndex,
-                              Theme::GetImage(Theme::Image_Closer));
-        maToolBox->SetQuickHelpText(mnCloserItemIndex,
-                                    SfxResId(SFX_STR_SIDEBAR_CLOSE_DECK));
-    }
-    else
-        maToolBox->RemoveItem(maToolBox->GetItemPos(mnCloserItemIndex));
+    disposeOnce();
 }
 
-tools::Rectangle DeckTitleBar::GetTitleArea (const tools::Rectangle& rTitleBarBox)
+void DeckTitleBar::dispose()
 {
-    Image aGripImage (Theme::GetImage(Theme::Image_Grip));
-    return tools::Rectangle(
-        aGripImage.GetSizePixel().Width() + gaLeftGripPadding + gaRightGripPadding,
-        rTitleBarBox.Top(),
-        rTitleBarBox.Right(),
-        rTitleBarBox.Bottom());
+    mxLabel.reset();
+    mxGripWeld.reset();
+    mxGripWidget.reset();
+    TitleBar::dispose();
 }
 
 tools::Rectangle DeckTitleBar::GetDragArea()
 {
-    Image aGripImage (Theme::GetImage(Theme::Image_Grip));
-    return tools::Rectangle(0,0,
-               aGripImage.GetSizePixel().Width() + gaLeftGripPadding + gaRightGripPadding,
-               aGripImage.GetSizePixel().Height()
-    );
+    int x, y, width, height;
+    if (mxGripWidget->GetDrawingArea()->get_extents_relative_to(*m_xContainer, x, y, width, height))
+        return tools::Rectangle(Point(x, y), Size(width, height));
+    return tools::Rectangle();
 }
 
-void DeckTitleBar::PaintDecoration(vcl::RenderContext& rRenderContext)
+void DeckTitleBar::SetTitle(const OUString& rsTitle)
 {
-   Image aImage (Theme::GetImage(Theme::Image_Grip));
-   const Point aTopLeft(gaLeftGripPadding,
-                        (GetSizePixel().Height() - aImage.GetSizePixel().Height()) / 2);
-   rRenderContext.DrawImage(aTopLeft, aImage);
+    mxLabel->set_label(rsTitle);
 }
 
-Color DeckTitleBar::GetBackgroundPaintColor()
+OUString DeckTitleBar::GetTitle() const
 {
-    return Theme::GetColor(Theme::Color_DeckTitleBarBackground);
+    return mxLabel->get_label();
 }
 
-void DeckTitleBar::HandleToolBoxItemClick (const sal_uInt16 nItemIndex)
+void DeckTitleBar::SetCloserVisible (const bool bIsCloserVisible)
 {
-    if (nItemIndex == mnCloserItemIndex && maCloserAction)
-        maCloserAction();
+    if (mbIsCloserVisible == bIsCloserVisible)
+        return;
+
+    mbIsCloserVisible = bIsCloserVisible;
+
+    if (mbIsCloserVisible)
+    {
+        mxToolBox->set_item_visible("button", true);
+        mxToolBox->set_item_icon_name("button", "sfx2/res/closedoc.png");
+        mxToolBox->set_item_tooltip_text("button",
+                                    SfxResId(SFX_STR_SIDEBAR_CLOSE_DECK));
+    }
+    else
+    {
+        mxToolBox->set_item_visible("button", false);
+    }
 }
 
-css::uno::Reference<css::accessibility::XAccessible> DeckTitleBar::CreateAccessible()
+void DeckTitleBar::HandleToolBoxItemClick()
 {
-    SetAccessibleName(msTitle);
-    SetAccessibleDescription(msTitle);
-    return TitleBar::CreateAccessible();
+    if (maCloserAction)
+        maCloserAction();
 }
 
 void DeckTitleBar::DataChanged (const DataChangedEvent& rEvent)
 {
-    maToolBox->SetItemImage(
-        mnCloserItemIndex,
-        Theme::GetImage(Theme::Image_Closer));
+    mxToolBox->set_item_icon_name("button", "sfx2/res/closedoc.png");
     TitleBar::DataChanged(rEvent);
 }
 
-
-void DeckTitleBar::MouseMove (const MouseEvent& rMouseEvent)
-{
-    tools::Rectangle aGrip = GetDragArea();
-    PointerStyle eStyle = PointerStyle::Arrow;
-
-    if ( aGrip.IsInside( rMouseEvent.GetPosPixel() ) )
-        eStyle = PointerStyle::Move;
-
-    SetPointer( eStyle );
-
-    Window::MouseMove( rMouseEvent );
-}
-
 } // end of namespace sfx2::sidebar
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/sidebar/FocusManager.cxx b/sfx2/source/sidebar/FocusManager.cxx
index 4a5140c1ae17..7c6ab781ff83 100644
--- a/sfx2/source/sidebar/FocusManager.cxx
+++ b/sfx2/source/sidebar/FocusManager.cxx
@@ -78,7 +78,6 @@ void FocusManager::ClearPanels()
         if (panel->GetTitleBar())
         {
             UnregisterWindow(*panel->GetTitleBar());
-            UnregisterWindow(panel->GetTitleBar()->GetToolBox());
         }
 
         panel->RemoveChildEventListener(LINK(this, FocusManager, ChildEventListener));
@@ -100,14 +99,12 @@ void FocusManager::SetDeckTitle (DeckTitleBar* pDeckTitleBar)
     if (mpDeckTitleBar != nullptr)
     {
         UnregisterWindow(*mpDeckTitleBar);
-        UnregisterWindow(mpDeckTitleBar->GetToolBox());
     }
     mpDeckTitleBar = pDeckTitleBar;
 
     if (mpDeckTitleBar != nullptr)
     {
         RegisterWindow(*mpDeckTitleBar);
-        RegisterWindow(mpDeckTitleBar->GetToolBox());
     }
 }
 
@@ -120,7 +117,6 @@ void FocusManager::SetPanels (const SharedPanelContainer& rPanels)
         if (panel->GetTitleBar())
         {
             RegisterWindow(*panel->GetTitleBar());
-            RegisterWindow(panel->GetTitleBar()->GetToolBox());
         }
 
         // Register also as child event listener at the panel.
@@ -157,8 +153,6 @@ FocusManager::FocusLocation FocusManager::GetFocusLocation (const vcl::Window& r
     {
         if (mpDeckTitleBar == &rWindow)
             return FocusLocation(PC_DeckTitle, -1);
-        else if (&mpDeckTitleBar->GetToolBox() == &rWindow)
-            return FocusLocation(PC_DeckToolBox, -1);
     }
 
     // Search the panels.
@@ -169,8 +163,6 @@ FocusManager::FocusLocation FocusManager::GetFocusLocation (const vcl::Window& r
         VclPtr<TitleBar> pTitleBar = maPanels[nIndex]->GetTitleBar();
         if (pTitleBar == &rWindow)
             return FocusLocation(PC_PanelTitle, nIndex);
-        if (pTitleBar!=nullptr && &pTitleBar->GetToolBox()==&rWindow)
-            return FocusLocation(PC_PanelToolBox, nIndex);
     }
 
     // Search the buttons.
@@ -190,11 +182,10 @@ void FocusManager::FocusDeckTitle()
         {
             mpDeckTitleBar->GrabFocus();
         }
-        else if (mpDeckTitleBar->GetToolBox().GetItemCount() > 0)
+        else if (mpDeckTitleBar->GetToolBox().get_n_items() > 0)
         {
-            ToolBox& rToolBox = mpDeckTitleBar->GetToolBox();
-            rToolBox.GrabFocus();
-            rToolBox.Invalidate();
+            weld::Toolbar& rToolBox = mpDeckTitleBar->GetToolBox();
+            rToolBox.grab_focus();
         }
         else
             FocusPanel(0, false);
@@ -293,7 +284,6 @@ void FocusManager::RemoveWindow (vcl::Window& rWindow)
         if ((*iPanel)->GetTitleBar() != nullptr)
         {
             UnregisterWindow(*(*iPanel)->GetTitleBar());
-            UnregisterWindow((*iPanel)->GetTitleBar()->GetToolBox());
         }
         maPanels.erase(iPanel);
         return;
@@ -313,12 +303,12 @@ void FocusManager::MoveFocusInsidePanel (
     const sal_Int32 nDirection)
 {
     const bool bHasToolBoxItem (
-        maPanels[rFocusLocation.mnIndex]->GetTitleBar()->GetToolBox().GetItemCount() > 0);
+        maPanels[rFocusLocation.mnIndex]->GetTitleBar()->GetToolBox().get_n_items() > 0);
     switch (rFocusLocation.meComponent)
     {
         case  PC_PanelTitle:
             if (nDirection > 0 && bHasToolBoxItem)
-                maPanels[rFocusLocation.mnIndex]->GetTitleBar()->GetToolBox().GrabFocus();
+                maPanels[rFocusLocation.mnIndex]->GetTitleBar()->GetToolBox().grab_focus();
             else
                 FocusPanelContent(rFocusLocation.mnIndex);
             break;
@@ -343,14 +333,14 @@ void FocusManager::MoveFocusInsideDeckTitle (
     // is moved between a) deck title, b) deck closer and c) content
     // of panel 0.
     const bool bHasToolBoxItem (
-        mpDeckTitleBar->GetToolBox().GetItemCount() > 0);
+        mpDeckTitleBar->GetToolBox().get_n_items() > 0);
     switch (rFocusLocation.meComponent)
     {
         case  PC_DeckTitle:
             if (nDirection<0 && ! IsPanelTitleVisible(0))
                 FocusPanelContent(0);
             else if (bHasToolBoxItem)
-                mpDeckTitleBar->GetToolBox().GrabFocus();
+                mpDeckTitleBar->GetToolBox().grab_focus();
             break;
 
         case PC_DeckToolBox:
diff --git a/sfx2/source/sidebar/Panel.cxx b/sfx2/source/sidebar/Panel.cxx
index c4de2280f891..c45a1e5efd42 100644
--- a/sfx2/source/sidebar/Panel.cxx
+++ b/sfx2/source/sidebar/Panel.cxx
@@ -51,7 +51,6 @@ Panel::Panel(const PanelDescriptor& rPanelDescriptor,
             )
     : Window(pParentWindow)
     , msPanelId(rPanelDescriptor.msId)
-    , mpTitleBar(VclPtr<PanelTitleBar>::Create(rPanelDescriptor.msTitle, pParentWindow, this))
     , mbIsTitleBarOptional(rPanelDescriptor.mbIsTitleBarOptional)
     , mxElement()
     , mxPanelComponent()
@@ -60,6 +59,7 @@ Panel::Panel(const PanelDescriptor& rPanelDescriptor,
     , maDeckLayoutTrigger(rDeckLayoutTrigger)
     , maContextAccess(rContextAccess)
     , mxFrame(rxFrame)
+    , mpTitleBar(VclPtr<PanelTitleBar>::Create(rPanelDescriptor.msTitle, pParentWindow, this))
 {
     SetText(rPanelDescriptor.msTitle);
 }
@@ -134,6 +134,7 @@ void Panel::SetExpanded (const bool bIsExpanded)
         return;
 
     mbIsExpanded = bIsExpanded;
+    mpTitleBar->UpdateExpandedState();
     maDeckLayoutTrigger();
 
     if (maContextAccess && pSidebarController)
diff --git a/sfx2/source/sidebar/PanelTitleBar.cxx b/sfx2/source/sidebar/PanelTitleBar.cxx
index 4dbb787cd3bd..3cf1cff8fbb1 100644
--- a/sfx2/source/sidebar/PanelTitleBar.cxx
+++ b/sfx2/source/sidebar/PanelTitleBar.cxx
@@ -36,25 +36,43 @@ using namespace css::uno;
 
 namespace sfx2::sidebar {
 
-const sal_Int32 gaLeftIconPadding (5);
-const sal_Int32 gaRightIconPadding (5);
-
 PanelTitleBar::PanelTitleBar(const OUString& rsTitle,
                              vcl::Window* pParentWindow,
                              Panel* pPanel)
-    : TitleBar(rsTitle, pParentWindow, GetBackgroundPaintColor()),
-      mbIsLeftButtonDown(false),
+    : TitleBar(pParentWindow, "sfx/ui/paneltitlebar.ui", "PanelTitleBar",
+               Theme::Color_PanelTitleBarBackground),
+      mxExpander(m_xBuilder->weld_expander("expander")),
       mpPanel(pPanel),
       mxFrame(),
       msMoreOptionsCommand()
 {
-    OSL_ASSERT(mpPanel != nullptr);
+    mxExpander->set_label(rsTitle);
+    mxExpander->connect_expanded(LINK(this, PanelTitleBar, ExpandHdl));
+
+    assert(mpPanel);
+
+    UpdateExpandedState();
 
 #ifdef DEBUG
     SetText(OUString("PanelTitleBar"));
 #endif
 }
 
+void PanelTitleBar::SetTitle(const OUString& rsTitle)
+{
+    mxExpander->set_label(rsTitle);
+}
+
+OUString PanelTitleBar::GetTitle() const
+{
+    return mxExpander->get_label();
+}
+
+void PanelTitleBar::UpdateExpandedState()
+{
+    mxExpander->set_expanded(mpPanel->IsExpanded());
+}
+
 PanelTitleBar::~PanelTitleBar()
 {
     disposeOnce();
@@ -63,18 +81,18 @@ PanelTitleBar::~PanelTitleBar()
 void PanelTitleBar::dispose()
 {
     mpPanel.clear();
+    mxExpander.reset();
     TitleBar::dispose();
 }
 
 void PanelTitleBar::SetMoreOptionsCommand(const OUString& rsCommandName,
-                                          const css::uno::Reference<css::frame::XFrame>& rxFrame,
-                                          const css::uno::Reference<css::frame::XController>& rxController)
+                                          const css::uno::Reference<css::frame::XFrame>& rxFrame)
 {
     if (rsCommandName == msMoreOptionsCommand)
         return;
 
     if (msMoreOptionsCommand.getLength() > 0)
-        maToolBox->RemoveItem(maToolBox->GetItemPos(mnMenuItemIndex));
+        mxToolBox->set_item_visible("button", false);
 
     msMoreOptionsCommand = rsCommandName;
     mxFrame = rxFrame;
@@ -82,63 +100,15 @@ void PanelTitleBar::SetMoreOptionsCommand(const OUString& rsCommandName,
     if (msMoreOptionsCommand.getLength() <= 0)
         return;
 
-    maToolBox->InsertItem(
-        mnMenuItemIndex,
-        Theme::GetImage(Theme::Image_PanelMenu));
-    Reference<frame::XToolbarController> xController (
-        ControllerFactory::CreateToolBoxController(
-            maToolBox.get(),
-            mnMenuItemIndex,
-            msMoreOptionsCommand,
-            rxFrame, rxController,
-            VCLUnoHelper::GetInterface(maToolBox.get()),
-            0, true));
-    maToolBox->SetController(mnMenuItemIndex, xController);
-    maToolBox->SetQuickHelpText(
-        mnMenuItemIndex,
+    mxToolBox->set_item_visible("button", true);
+    mxToolBox->set_item_icon_name("button", "sfx2/res/symphony/morebutton.png");
+    mxToolBox->set_item_tooltip_text(
+        "button",
         SfxResId(SFX_STR_SIDEBAR_MORE_OPTIONS));
 }
 
-tools::Rectangle PanelTitleBar::GetTitleArea (const tools::Rectangle& rTitleBarBox)
-{
-    if (mpPanel != nullptr)
-    {
-        Image aImage (mpPanel->IsExpanded()
-            ? Theme::GetImage(Theme::Image_Expand)
-            : Theme::GetImage(Theme::Image_Collapse));
-        return tools::Rectangle(
-            aImage.GetSizePixel().Width() + gaLeftIconPadding + gaRightIconPadding,
-            rTitleBarBox.Top(),
-            rTitleBarBox.Right(),
-            rTitleBarBox.Bottom());
-    }
-    else
-        return rTitleBarBox;
-}
-
-void PanelTitleBar::PaintDecoration (vcl::RenderContext& rRenderContext)
+void PanelTitleBar::HandleToolBoxItemClick()
 {
-    if (mpPanel != nullptr)
-    {
-        Image aImage (mpPanel->IsExpanded()
-            ? Theme::GetImage(Theme::Image_Collapse)
-            : Theme::GetImage(Theme::Image_Expand));
-        const Point aTopLeft(gaLeftIconPadding,
-                             (GetSizePixel().Height() - aImage.GetSizePixel().Height()) / 2);
-        rRenderContext.DrawImage(aTopLeft, aImage);
-    }
-}
-
-Color PanelTitleBar::GetBackgroundPaintColor()
-{
-    return Theme::GetColor(Theme::Color_PanelTitleBarBackground);
-}
-
-void PanelTitleBar::HandleToolBoxItemClick (const sal_uInt16 nItemIndex)
-{
-    if (nItemIndex != mnMenuItemIndex)
-        return;
-
     if (msMoreOptionsCommand.getLength() <= 0)
         return;
 
@@ -155,48 +125,16 @@ void PanelTitleBar::HandleToolBoxItemClick (const sal_uInt16 nItemIndex)
     }
 }
 
-Reference<accessibility::XAccessible> PanelTitleBar::CreateAccessible()
-{
-    SetAccessibleName(msTitle);
-    SetAccessibleDescription(msTitle);
-    return TitleBar::CreateAccessible();
-}
-
-void PanelTitleBar::MouseButtonDown (const MouseEvent& rMouseEvent)
+IMPL_LINK(PanelTitleBar, ExpandHdl, weld::Expander&, rExpander, void)
 {
-    if (rMouseEvent.IsLeft())
-    {
-        mbIsLeftButtonDown = true;
-        CaptureMouse();
-    }
-}
-
-void PanelTitleBar::MouseButtonUp (const MouseEvent& rMouseEvent)
-{
-    if (IsMouseCaptured())
-        ReleaseMouse();
-
-    if (rMouseEvent.IsLeft())
-    {
-        if (mbIsLeftButtonDown)
-        {
-            if (mpPanel != nullptr)
-            {
-                mpPanel->SetExpanded( ! mpPanel->IsExpanded());
-                Invalidate();
-                GrabFocus();
-            }
-        }
-    }
-    if (mbIsLeftButtonDown)
-        mbIsLeftButtonDown = false;
+    if (!mpPanel)
+        return;
+    mpPanel->SetExpanded(rExpander.get_expanded());
 }
 
 void PanelTitleBar::DataChanged (const DataChangedEvent& rEvent)
 {
-    maToolBox->SetItemImage(
-        mnMenuItemIndex,
-        Theme::GetImage(Theme::Image_PanelMenu));
+    mxToolBox->set_item_icon_name("button", "sfx2/res/symphony/morebutton.png");
     TitleBar::DataChanged(rEvent);
 }
 
diff --git a/sfx2/source/sidebar/SidebarController.cxx b/sfx2/source/sidebar/SidebarController.cxx
index 435ea63150d3..8a0e851cff66 100644
--- a/sfx2/source/sidebar/SidebarController.cxx
+++ b/sfx2/source/sidebar/SidebarController.cxx
@@ -734,7 +734,7 @@ void SidebarController::CreatePanels(const OUString& rDeckId, const Context& rCo
                     {
                         pTitleBar->SetMoreOptionsCommand(
                             rPanelContexDescriptor.msMenuCommand,
-                            mxFrame, xController);
+                            mxFrame);
                     }
                     ++nWriteIndex;
                 }
@@ -1575,17 +1575,15 @@ void SidebarController::FadeIn()
 tools::Rectangle SidebarController::GetDeckDragArea() const
 {
     tools::Rectangle aRect;
-
-    if(mpCurrentDeck)
+    if (mpCurrentDeck)
     {
         VclPtr<DeckTitleBar> pTitleBar(mpCurrentDeck->GetTitleBar());
 
-        if(pTitleBar)
+        if (pTitleBar)
         {
-            aRect = DeckTitleBar::GetDragArea();
+            aRect = pTitleBar->GetDragArea();
         }
     }
-
     return aRect;
 }
 
diff --git a/sfx2/source/sidebar/Theme.cxx b/sfx2/source/sidebar/Theme.cxx
index da66a71c292d..361a77414a8e 100644
--- a/sfx2/source/sidebar/Theme.cxx
+++ b/sfx2/source/sidebar/Theme.cxx
@@ -240,24 +240,9 @@ void Theme::UpdateTheme()
         setPropertyValue(
             maPropertyIdToNameMap[Color_VerticalBorder],
             Any(sal_Int32(aBorderColor.GetRGBColor())));
-        setPropertyValue(
-            maPropertyIdToNameMap[Image_Grip],
-            Any(OUString("private:graphicrepository/sfx2/res/grip.png")));
-        setPropertyValue(
-            maPropertyIdToNameMap[Image_Expand],
-            Any(OUString("private:graphicrepository/res/plus.png")));
-        setPropertyValue(
-            maPropertyIdToNameMap[Image_Collapse],
-            Any(OUString("private:graphicrepository/res/minus.png")));
         setPropertyValue(
             maPropertyIdToNameMap[Image_TabBarMenu],
             Any(OUString("private:graphicrepository/sfx2/res/symphony/open_more.png")));
-        setPropertyValue(
-            maPropertyIdToNameMap[Image_PanelMenu],
-            Any(OUString("private:graphicrepository/sfx2/res/symphony/morebutton.png")));
-        setPropertyValue(
-            maPropertyIdToNameMap[Image_Closer],
-            Any(OUString("private:graphicrepository/sfx2/res/closedoc.png")));
         setPropertyValue(
             maPropertyIdToNameMap[Image_CloseIndicator],
             Any(OUString("private:graphicrepository/cmd/lc_decrementlevel.png")));
@@ -532,24 +517,9 @@ void Theme::SetupPropertyMaps()
     maIntegers.resize(Int_Bool_ - Color_Int_ - 1);
     maBooleans.resize(Post_Bool_ - Int_Bool_ - 1);
 
-    maPropertyNameToIdMap["Image_Grip"]=Image_Grip;
-    maPropertyIdToNameMap[Image_Grip]="Image_Grip";
-
-    maPropertyNameToIdMap["Image_Expand"]=Image_Expand;
-    maPropertyIdToNameMap[Image_Expand]="Image_Expand";
-
-    maPropertyNameToIdMap["Image_Collapse"]=Image_Collapse;
-    maPropertyIdToNameMap[Image_Collapse]="Image_Collapse";
-
     maPropertyNameToIdMap["Image_TabBarMenu"]=Image_TabBarMenu;
     maPropertyIdToNameMap[Image_TabBarMenu]="Image_TabBarMenu";
 
-    maPropertyNameToIdMap["Image_PanelMenu"]=Image_PanelMenu;
-    maPropertyIdToNameMap[Image_PanelMenu]="Image_PanelMenu";
-
-    maPropertyNameToIdMap["Image_Closer"]=Image_Closer;
-    maPropertyIdToNameMap[Image_Closer]="Image_Closer";
-
     maPropertyNameToIdMap["Image_CloseIndicator"]=Image_CloseIndicator;
     maPropertyIdToNameMap[Image_CloseIndicator]="Image_CloseIndicator";
 
@@ -672,12 +642,7 @@ Theme::PropertyType Theme::GetPropertyType (const ThemeItem eItem)
 {
     switch(eItem)
     {
-        case Image_Grip:
-        case Image_Expand:
-        case Image_Collapse:
         case Image_TabBarMenu:
-        case Image_PanelMenu:
-        case Image_Closer:
         case Image_CloseIndicator:
             return PT_Image;
 
diff --git a/sfx2/source/sidebar/TitleBar.cxx b/sfx2/source/sidebar/TitleBar.cxx
index 5324857c56cc..615cb6de3b7b 100644
--- a/sfx2/source/sidebar/TitleBar.cxx
+++ b/sfx2/source/sidebar/TitleBar.cxx
@@ -18,28 +18,22 @@
  */
 
 #include <sidebar/TitleBar.hxx>
-#include <sidebar/AccessibleTitleBar.hxx>
-
-#include <com/sun/star/accessibility/AccessibleRole.hpp>
-
-namespace
-{
-    const sal_Int32 gnLeftIconSpace (3);
-    const sal_Int32 gnRightIconSpace (3);
-}
 
 namespace sfx2::sidebar {
 
-TitleBar::TitleBar(const OUString& rsTitle,
-                   vcl::Window* pParentWindow,
-                   const Color& rInitialBackgroundColor)
-    : Window(pParentWindow)
-    , maToolBox(VclPtr<SidebarToolBox>::Create(this))
-    , msTitle(rsTitle)
-    , maIcon()
-    , maBackgroundColor(rInitialBackgroundColor)
+TitleBar::TitleBar(vcl::Window* pParentWindow,
+                   const OUString& rUIXMLDescription, const OString& rID,
+                   Theme::ThemeItem eThemeItem)
+    : InterimItemWindow(pParentWindow, rUIXMLDescription, rID)
+    , mxAddonImage(m_xBuilder->weld_image("addonimage"))
+    , mxToolBox(m_xBuilder->weld_toolbar("toolbar"))
+    , meThemeItem(eThemeItem)
 {
-    maToolBox->SetSelectHdl(LINK(this, TitleBar, SelectionHandler));
+    Color aBgColor = Theme::GetColor(meThemeItem);
+    m_xContainer->set_background(aBgColor);
+    mxToolBox->set_background(aBgColor);
+
+    mxToolBox->connect_clicked(LINK(this, TitleBar, SelectionHandler));
 }
 
 TitleBar::~TitleBar()
@@ -49,121 +43,25 @@ TitleBar::~TitleBar()
 
 void TitleBar::dispose()
 {
-    maToolBox.disposeAndClear();
-    vcl::Window::dispose();
-}
-
-void TitleBar::SetTitle(const OUString& rsTitle)
-{
-    msTitle = rsTitle;
-    Invalidate();
+    mxToolBox.reset();
+    mxAddonImage.reset();
+    InterimItemWindow::dispose();
 }
 
 void TitleBar::SetIcon(const css::uno::Reference<css::graphic::XGraphic>& rIcon)
 {
-    maIcon = Image(rIcon);
-    Invalidate();
-}
-
-void TitleBar::ApplySettings(vcl::RenderContext& rRenderContext)
-{
-    rRenderContext.SetBackground(maBackgroundColor);
-}
-
-void TitleBar::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& /*rUpdateArea*/)
-{
-    // Paint title bar background.
-    Size aWindowSize (GetSizePixel());
-    tools::Rectangle aTitleBarBox(0,0, aWindowSize.Width(), aWindowSize.Height());
-
-    PaintDecoration(rRenderContext);
-    const tools::Rectangle aTitleBox(GetTitleArea(aTitleBarBox));
-    PaintTitle(rRenderContext, aTitleBox);
-    PaintFocus(rRenderContext, aTitleBox);
+    mxAddonImage->set_image(rIcon);
+    mxAddonImage->set_visible(rIcon.is());
 }
 
 void TitleBar::DataChanged (const DataChangedEvent& /*rEvent*/)
 {
-    maBackgroundColor = GetBackgroundPaintColor();
-    Invalidate();
-}
-
-void TitleBar::setPosSizePixel (tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight, PosSizeFlags nFlags)
-{
-    Window::setPosSizePixel(nX, nY, nWidth, nHeight, nFlags);
-
-    // Place the toolbox.
-    const sal_Int32 nToolBoxWidth (maToolBox->GetItemPosRect(0).GetWidth());
-    maToolBox->setPosSizePixel(nWidth - nToolBoxWidth,0, nToolBoxWidth, nHeight);
-    maToolBox->Show();
+    m_xContainer->set_background(Theme::GetColor(meThemeItem));
 }
 
-void TitleBar::HandleToolBoxItemClick(const sal_uInt16 /*nItemIndex*/)
+IMPL_LINK_NOARG(TitleBar, SelectionHandler, const OString&, void)
 {
-    // Any real processing has to be done in derived class.
-}
-
-css::uno::Reference<css::accessibility::XAccessible> TitleBar::CreateAccessible()
-{
-    SetAccessibleRole(css::accessibility::AccessibleRole::PANEL);
-    return AccessibleTitleBar::Create(*this);
-}
-
-void TitleBar::PaintTitle(vcl::RenderContext& rRenderContext, const tools::Rectangle& rTitleBox)
-{
-    rRenderContext.Push(PushFlags::FONT | PushFlags::TEXTCOLOR);
-
-    tools::Rectangle aTitleBox(rTitleBox);
-
-    // When there is an icon then paint it at the left of the given
-    // box.
-    if (!!maIcon)
-    {
-        rRenderContext.DrawImage(Point(aTitleBox.Left() + gnLeftIconSpace,
-                                       aTitleBox.Top() + (aTitleBox.GetHeight() - maIcon.GetSizePixel().Height()) / 2),
-                                 maIcon);
-        aTitleBox.AdjustLeft(gnLeftIconSpace + maIcon.GetSizePixel().Width() + gnRightIconSpace );
-    }
-
-    vcl::Font aFont(rRenderContext.GetFont());
-    aFont.SetWeight(WEIGHT_BOLD);
-    rRenderContext.SetFont(aFont);
-
-    // Paint title bar text.
-    rRenderContext.SetTextColor(rRenderContext.GetTextColor());
-    rRenderContext.DrawText(aTitleBox, msTitle, DrawTextFlags::Left | DrawTextFlags::VCenter);
-    rRenderContext.Pop();
-}
-
-void TitleBar::PaintFocus(vcl::RenderContext& rRenderContext, const tools::Rectangle& rFocusBox)
-{
-    rRenderContext.Push(PushFlags::FONT | PushFlags::TEXTCOLOR);
-
-    vcl::Font aFont(rRenderContext.GetFont());
-    aFont.SetWeight(WEIGHT_BOLD);
-    rRenderContext.SetFont(aFont);
-
-    const tools::Rectangle aTextBox(rRenderContext.GetTextRect(rFocusBox, msTitle, DrawTextFlags::Left | DrawTextFlags::VCenter));
-
-    const tools::Rectangle aLargerTextBox(aTextBox.Left() - 2,
-                                   aTextBox.Top() - 2,
-                                   aTextBox.Right() + 2,
-                                   aTextBox.Bottom() + 2);
-
-    if (HasFocus())
-        Window::ShowFocus(aLargerTextBox);
-    else
-        Window::HideFocus();
-
-    rRenderContext.Pop();
-}
-
-IMPL_LINK(TitleBar, SelectionHandler, ToolBox*, pToolBox, void)
-{
-    OSL_ASSERT(maToolBox.get()==pToolBox);
-    const sal_uInt16 nItemId (maToolBox->GetHighlightItemId());
-
-    HandleToolBoxItemClick(nItemId);
+    HandleToolBoxItemClick();
 }
 
 } // end of namespace sfx2::sidebar
diff --git a/sfx2/uiconfig/ui/decktitlebar.ui b/sfx2/uiconfig/ui/decktitlebar.ui
new file mode 100644
index 000000000000..0e48eddd815f
--- /dev/null
+++ b/sfx2/uiconfig/ui/decktitlebar.ui
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.1 -->
+<interface domain="sfx">
+  <requires lib="gtk+" version="3.20"/>
+  <object class="GtkBox" id="DeckTitleBar">
+    <property name="visible">True</property>
+    <property name="can-focus">False</property>
+    <property name="hexpand">True</property>
+    <property name="vexpand">True</property>
+    <property name="spacing">6</property>
+    <child>
+      <object class="GtkDrawingArea" id="grip">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="valign">center</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkImage" id="addonimage">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="valign">center</property>
+        <property name="stock">gtk-missing-image</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkLabel" id="label">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="valign">center</property>
+        <property name="hexpand">True</property>
+        <property name="xalign">0</property>
+        <attributes>
+          <attribute name="weight" value="bold"/>
+        </attributes>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="position">2</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkToolbar" id="toolbar">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="toolbar-style">icons</property>
+        <property name="show-arrow">False</property>
+        <property name="icon_size">2</property>
+        <child>
+          <object class="GtkToolButton" id="button">
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <property name="use-underline">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="homogeneous">False</property>
+          </packing>
+        </child>
+        <style>
+          <class name="small-button"/>
+        </style>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="position">3</property>
+      </packing>
+    </child>
+  </object>
+</interface>
diff --git a/sfx2/uiconfig/ui/paneltitlebar.ui b/sfx2/uiconfig/ui/paneltitlebar.ui
new file mode 100644
index 000000000000..721abab47dfd
--- /dev/null
+++ b/sfx2/uiconfig/ui/paneltitlebar.ui
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.1 -->
+<interface domain="sfx">
+  <requires lib="gtk+" version="3.20"/>
+  <object class="GtkBox" id="PanelTitleBar">
+    <property name="visible">True</property>
+    <property name="can-focus">False</property>
+    <property name="hexpand">True</property>
+    <property name="vexpand">True</property>
+    <property name="spacing">6</property>
+    <child>
+      <object class="GtkImage" id="addonimage">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="valign">center</property>
+        <property name="stock">gtk-missing-image</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkExpander" id="expander">
+        <property name="visible">True</property>
+        <property name="can-focus">True</property>
+        <property name="valign">center</property>
+        <property name="hexpand">True</property>
+        <property name="label-fill">True</property>
+        <child>
+          <object class="GtkBox">
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <property name="vexpand">True</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <placeholder/>
+            </child>
+          </object>
+        </child>
+        <child type="label">
+          <object class="GtkLabel">
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <property name="hexpand">True</property>
+            <property name="use-underline">True</property>
+            <attributes>
+              <attribute name="weight" value="bold"/>
+            </attributes>
+          </object>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="position">2</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkToolbar" id="toolbar">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="toolbar-style">icons</property>
+        <property name="show-arrow">False</property>
+        <property name="icon_size">2</property>
+        <child>
+          <object class="GtkToolButton" id="button">
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <property name="use-underline">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="homogeneous">False</property>
+          </packing>
+        </child>
+        <style>
+          <class name="small-button"/>
+        </style>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="position">3</property>
+      </packing>
+    </child>
+  </object>
+</interface>
diff --git a/solenv/clang-format/excludelist b/solenv/clang-format/excludelist
index c14029e5e69f..e0379086f6ea 100644
--- a/solenv/clang-format/excludelist
+++ b/solenv/clang-format/excludelist
@@ -11697,7 +11697,6 @@ sfx2/inc/notebookbar/NotebookbarTabControl.hxx
 sfx2/inc/preventduplicateinteraction.hxx
 sfx2/inc/recentdocsview.hxx
 sfx2/inc/sidebar/Accessible.hxx
-sfx2/inc/sidebar/AccessibleTitleBar.hxx
 sfx2/inc/sidebar/ContextChangeBroadcaster.hxx
 sfx2/inc/sidebar/ContextList.hxx
 sfx2/inc/sidebar/ControlFactory.hxx
@@ -11947,7 +11946,6 @@ sfx2/source/notify/hintpost.cxx
 sfx2/source/notify/openurlhint.cxx
 sfx2/source/safemode/safemode.cxx
 sfx2/source/sidebar/Accessible.cxx
-sfx2/source/sidebar/AccessibleTitleBar.cxx
 sfx2/source/sidebar/AsynchronousCall.cxx
 sfx2/source/sidebar/Context.cxx
 sfx2/source/sidebar/ContextChangeBroadcaster.cxx
diff --git a/solenv/sanitizers/ui/sfx.suppr b/solenv/sanitizers/ui/sfx.suppr
index c201fb3dd810..72aeef4dfec8 100644
--- a/solenv/sanitizers/ui/sfx.suppr
+++ b/solenv/sanitizers/ui/sfx.suppr
@@ -10,6 +10,9 @@ sfx2/uiconfig/ui/cmisline.ui://GtkSpinButton[@id='time'] no-labelled-by
 sfx2/uiconfig/ui/custominfopage.ui://GtkLabel[@id='name'] orphan-label
 sfx2/uiconfig/ui/custominfopage.ui://GtkLabel[@id='type'] orphan-label
 sfx2/uiconfig/ui/custominfopage.ui://GtkLabel[@id='value'] orphan-label
+sfx2/uiconfig/ui/decktitlebar.ui://GtkImage[@id='addonimage'] no-labelled-by
+sfx2/uiconfig/ui/decktitlebar.ui://GtkLabel[@id='label'] orphan-label
+sfx2/uiconfig/ui/decktitlebar.ui://GtkToolButton[@id='button'] button-no-label
 sfx2/uiconfig/ui/documentinfopage.ui://GtkLabel[@id='showcreate'] orphan-label
 sfx2/uiconfig/ui/documentinfopage.ui://GtkLabel[@id='showmodify'] orphan-label
 sfx2/uiconfig/ui/documentinfopage.ui://GtkLabel[@id='showsigned'] orphan-label
@@ -41,6 +44,8 @@ sfx2/uiconfig/ui/templatepanel.ui://GtkToggleToolButton[@id='5'] button-no-label
 sfx2/uiconfig/ui/templatepanel.ui://GtkToggleToolButton[@id='6'] button-no-label
 sfx2/uiconfig/ui/templatepanel.ui://GtkToggleToolButton[@id='65535'] button-no-label
 sfx2/uiconfig/ui/templatedlg.ui://GtkLabel[@id='label1'] orphan-label
+sfx2/uiconfig/ui/paneltitlebar.ui://GtkImage[@id='addonimage'] no-labelled-by
+sfx2/uiconfig/ui/paneltitlebar.ui://GtkToolButton[@id='button'] button-no-label
 sfx2/uiconfig/ui/versioncommentdialog.ui://GtkLabel[@id='timestamp'] orphan-label
 sfx2/uiconfig/ui/versioncommentdialog.ui://GtkLabel[@id='author'] orphan-label
 sfx2/uiconfig/ui/versioncommentdialog.ui://GtkTextView[@id='textview'] no-labelled-by


More information about the Libreoffice-commits mailing list