summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2021-03-12 14:25:34 +0000
committerSzymon Kłos <szymon.klos@collabora.com>2021-05-20 13:22:22 +0200
commit3c6bf1ba72e62b01b7e7ec9343ff216f8cd2130d (patch)
treefe9459f2c088f7760ecef9ce804984518000bd37
parent61848afb84b0ceef36ce3a2f031c490c2fa3644c (diff)
weld the sidebar deckfeature/jsdialogs
Change-Id: Idc6710df7e59bcb5f61fca783e0cc0666cb13a1f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112404 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r--include/sfx2/sidebar/Deck.hxx47
-rw-r--r--include/sfx2/sidebar/FocusManager.hxx16
-rw-r--r--include/sfx2/sidebar/Panel.hxx47
-rw-r--r--include/sfx2/sidebar/PanelLayout.hxx2
-rw-r--r--include/sfx2/sidebar/SidebarController.hxx6
-rw-r--r--include/sfx2/sidebar/Theme.hxx7
-rw-r--r--sd/source/ui/sidebar/SlideBackground.cxx4
-rw-r--r--sfx2/UIConfig_sfx.mk2
-rw-r--r--sfx2/inc/sidebar/DeckLayouter.hxx13
-rw-r--r--sfx2/inc/sidebar/DeckTitleBar.hxx6
-rw-r--r--sfx2/inc/sidebar/PanelTitleBar.hxx12
-rw-r--r--sfx2/inc/sidebar/TitleBar.hxx32
-rw-r--r--sfx2/inc/sidebar/UnoPanel.hxx2
-rw-r--r--sfx2/source/sidebar/Deck.cxx264
-rw-r--r--sfx2/source/sidebar/DeckLayouter.cxx214
-rw-r--r--sfx2/source/sidebar/DeckTitleBar.cxx30
-rw-r--r--sfx2/source/sidebar/FocusManager.cxx153
-rw-r--r--sfx2/source/sidebar/Panel.cxx88
-rw-r--r--sfx2/source/sidebar/PanelLayout.cxx7
-rw-r--r--sfx2/source/sidebar/PanelTitleBar.cxx16
-rw-r--r--sfx2/source/sidebar/SidebarController.cxx77
-rw-r--r--sfx2/source/sidebar/TabBar.cxx2
-rw-r--r--sfx2/source/sidebar/Theme.cxx72
-rw-r--r--sfx2/source/sidebar/TitleBar.cxx47
-rw-r--r--sfx2/source/sidebar/UnoDeck.cxx4
-rw-r--r--sfx2/source/sidebar/UnoPanel.cxx25
-rw-r--r--sfx2/uiconfig/ui/deck.ui132
-rw-r--r--sfx2/uiconfig/ui/decktitlebar.ui82
-rw-r--r--sfx2/uiconfig/ui/panel.ui6
-rw-r--r--solenv/sanitizers/ui/sfx.suppr5
-rw-r--r--svx/source/sidebar/area/AreaPropertyPanelBase.cxx32
31 files changed, 555 insertions, 897 deletions
diff --git a/include/sfx2/sidebar/Deck.hxx b/include/sfx2/sidebar/Deck.hxx
index 5122e915da14..489f6137b3a7 100644
--- a/include/sfx2/sidebar/Deck.hxx
+++ b/include/sfx2/sidebar/Deck.hxx
@@ -19,15 +19,14 @@
#pragma once
#include <sfx2/sidebar/Panel.hxx>
-
-#include <vcl/window.hxx>
-
-class ScrollBar;
+#include <vcl/InterimItemWindow.hxx>
+#include <vcl/weld.hxx>
namespace sfx2::sidebar
{
class DeckDescriptor;
class DeckTitleBar;
+class SidebarDockingWindow;
/** This is the parent window of the panels.
It displays the deck title.
@@ -35,25 +34,25 @@ class DeckTitleBar;
A deck consists of multiple panels.
E.g. Properties, Styles, Navigator.
*/
-class Deck final : public vcl::Window
+class Deck final : public InterimItemWindow
{
public:
- Deck(const DeckDescriptor& rDeckDescriptor, vcl::Window* pParentWindow,
+ Deck(const DeckDescriptor& rDeckDescriptor, SidebarDockingWindow* pParentWindow,
const std::function<void()>& rCloserAction);
virtual ~Deck() override;
virtual void dispose() override;
const OUString& GetId() const { return msId; }
- VclPtr<DeckTitleBar> const& GetTitleBar() const;
+ DeckTitleBar* GetTitleBar() const;
tools::Rectangle GetContentArea() const;
void ResetPanels(const SharedPanelContainer& rPanels);
const SharedPanelContainer& GetPanels() const { return maPanels; }
- Panel* GetPanel(OUString const& panelId);
+ std::shared_ptr<Panel> GetPanel(std::u16string_view panelId);
void RequestLayout();
- vcl::Window* GetPanelParentWindow();
+ weld::Widget* GetPanelParentWindow();
/** Try to make the panel completely visible.
When the whole panel does not fit then make its top visible
@@ -61,11 +60,8 @@ public:
*/
void ShowPanel(const Panel& rPanel);
- 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 bool EventNotify(NotifyEvent& rEvent) override;
+
virtual void Resize() override;
virtual void DumpAsPropertyTree(tools::JsonWriter&) override;
@@ -74,17 +70,7 @@ public:
sal_Int32 GetMinimalWidth() const { return mnMinimalWidth; }
- class ScrollContainerWindow final : public vcl::Window
- {
- public:
- ScrollContainerWindow(vcl::Window* pParentWindow);
- virtual void Paint(vcl::RenderContext& rRenderContext,
- const tools::Rectangle& rUpdateArea) override;
- void SetSeparators(const ::std::vector<sal_Int32>& rSeparators);
-
- private:
- std::vector<sal_Int32> maSeparators;
- };
+ SidebarDockingWindow* GetDockingWindow() const { return mxParentWindow; }
private:
void RequestLayoutInternal();
@@ -94,14 +80,11 @@ private:
sal_Int32 mnMinimalWidth;
sal_Int32 mnMinimalHeight;
SharedPanelContainer maPanels;
- VclPtr<DeckTitleBar> mpTitleBar;
- VclPtr<vcl::Window> mpScrollClipWindow;
- VclPtr<ScrollContainerWindow> mpScrollContainer;
- VclPtr<vcl::Window> mpFiller;
- VclPtr<ScrollBar> mpVerticalScrollBar;
-
- DECL_LINK(HandleVerticalScrollBarChange, ScrollBar*, void);
- bool ProcessWheelEvent(CommandEvent const* pCommandEvent);
+
+ VclPtr<SidebarDockingWindow> mxParentWindow;
+ std::unique_ptr<DeckTitleBar> mxTitleBar;
+ std::unique_ptr<weld::ScrolledWindow> mxVerticalScrollBar;
+ std::unique_ptr<weld::Container> mxContents;
};
} // end of namespace sfx2::sidebar
diff --git a/include/sfx2/sidebar/FocusManager.hxx b/include/sfx2/sidebar/FocusManager.hxx
index 0bebe247e634..2370ff3f801c 100644
--- a/include/sfx2/sidebar/FocusManager.hxx
+++ b/include/sfx2/sidebar/FocusManager.hxx
@@ -20,6 +20,7 @@
#include <sfx2/sidebar/Panel.hxx>
#include <tools/link.hxx>
+#include <vcl/vclevent.hxx>
#include <vcl/keycod.hxx>
namespace weld {
@@ -64,13 +65,14 @@ public:
void GrabFocus();
void GrabFocusPanel();
- void SetDeckTitle(DeckTitleBar* pDeckTitleBar);
+ void SetDeck(Deck* pDeck);
void SetPanels(const SharedPanelContainer& rPanels);
void SetButtons(const std::vector<weld::Widget*>& rButtons);
private:
- VclPtr<DeckTitleBar> mpDeckTitleBar;
- std::vector<VclPtr<Panel> > maPanels;
+ VclPtr<Deck> mxDeck;
+ DeckTitleBar* mpDeckTitleBar;
+ SharedPanelContainer maPanels;
std::vector<weld::Widget*> maButtons;
const std::function<void(const Panel&)> maShowPanelFunctor;
@@ -94,7 +96,6 @@ private:
/** Listen for key events for panels and buttons.
*/
DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
- DECL_LINK(ChildEventListener, VclWindowEvent&, void);
void ClearPanels();
void ClearButtons();
@@ -105,10 +106,6 @@ private:
void RegisterWindow(weld::Widget& rWidget);
static void UnregisterWindow(weld::Widget& rWidget);
- /** Remove the window from the panel or the button container.
- */
- void RemoveWindow(vcl::Window& rWindow);
-
void FocusDeckTitle();
bool IsDeckTitleVisible() const;
bool IsPanelTitleVisible(const sal_Int32 nPanelIndex) const;
@@ -130,13 +127,12 @@ private:
void ClickButton(const sal_Int32 nButtonIndex);
void MoveFocusInsidePanel(const FocusLocation& rLocation,
const sal_Int32 nDirection);
- void MoveFocusInsideDeckTitle(const FocusLocation& rLocation,
+ bool MoveFocusInsideDeckTitle(const FocusLocation& rLocation,
const sal_Int32 nDirection);
bool HandleKeyEvent(const vcl::KeyCode& rKeyCode,
const FocusLocation& rLocation);
- FocusLocation GetFocusLocation(const vcl::Window& rWindow) const;
FocusLocation GetFocusLocation() const;
};
diff --git a/include/sfx2/sidebar/Panel.hxx b/include/sfx2/sidebar/Panel.hxx
index 9835ccd8207a..dd5926c6a984 100644
--- a/include/sfx2/sidebar/Panel.hxx
+++ b/include/sfx2/sidebar/Panel.hxx
@@ -19,9 +19,7 @@
#pragma once
#include <sfx2/dllapi.h>
-
-#include <vcl/InterimItemWindow.hxx>
-
+#include <vcl/weld.hxx>
#include <vector>
namespace com::sun::star::frame
@@ -43,27 +41,28 @@ class XWindow;
namespace sfx2::sidebar
{
+class Context;
+class Deck;
class PanelDescriptor;
class PanelTitleBar;
-class Context;
/**
* Multiple panels form a single deck.
* E.g. the Properties deck has panels like Styles, Character, paragraph.
*/
-class SFX2_DLLPUBLIC Panel final : public InterimItemWindow
+class SFX2_DLLPUBLIC Panel final
{
public:
- Panel(const PanelDescriptor& rPanelDescriptor, vcl::Window* pParentWindow,
- const bool bIsInitiallyExpanded, const std::function<void()>& rDeckLayoutTrigger,
+ Panel(const PanelDescriptor& rPanelDescriptor, weld::Widget* pParentWindow,
+ const bool bIsInitiallyExpanded, Deck* pDeck,
const std::function<Context()>& rContextAccess,
const css::uno::Reference<css::frame::XFrame>& rxFrame);
- virtual ~Panel() override;
- virtual void dispose() override;
+ ~Panel();
PanelTitleBar* GetTitleBar() const;
- void ShowTitlebar(bool bShowTitlebar);
+ weld::Container* GetContents() const;
+ void Show(bool bShow);
bool IsTitleBarOptional() const { return mbIsTitleBarOptional; }
void SetUIElement(const css::uno::Reference<css::ui::XUIElement>& rxElement);
const css::uno::Reference<css::ui::XSidebarPanel>& GetPanelComponent() const
@@ -76,32 +75,48 @@ public:
bool IsExpanded() const { return mbIsExpanded; }
bool HasIdPredicate(const OUString& rsId) const;
const OUString& GetId() const { return msPanelId; }
- void TriggerDeckLayouting() { maDeckLayoutTrigger(); }
+ const OUString& GetTitle() const { return msTitle; }
+ void TriggerDeckLayouting();
+
+ void SetHeightPixel(int nHeight);
+
+ bool get_extents(tools::Rectangle& rExtents) const;
/// Set whether a panel should be present but invisible / inactive
void SetLurkMode(bool bLurk);
bool IsLurking() const { return mbLurking; }
- virtual void DataChanged(const DataChangedEvent& rEvent) override;
- virtual void ApplySettings(vcl::RenderContext& rRenderContext) override;
- virtual void DumpAsPropertyTree(tools::JsonWriter&) override;
+ void set_margin_top(int nMargin);
+ void set_margin_bottom(int nMargin);
+ void set_vexpand(bool bExpand);
+
+ weld::Window* GetFrameWeld();
+
+ void DataChanged();
private:
+ std::unique_ptr<weld::Builder> mxBuilder;
const OUString msPanelId;
+ const OUString msTitle;
const bool mbIsTitleBarOptional;
const bool mbWantsAWT;
css::uno::Reference<css::ui::XUIElement> mxElement;
css::uno::Reference<css::ui::XSidebarPanel> mxPanelComponent;
bool mbIsExpanded;
bool mbLurking;
- const std::function<void()> maDeckLayoutTrigger;
const std::function<Context()> maContextAccess;
const css::uno::Reference<css::frame::XFrame>& mxFrame;
+ weld::Widget* mpParentWindow;
+ VclPtr<Deck> mxDeck;
+ std::unique_ptr<weld::Container> mxContainer;
std::unique_ptr<PanelTitleBar> mxTitleBar;
std::unique_ptr<weld::Container> mxContents;
css::uno::Reference<css::awt::XWindow> mxXWindow;
+
+ DECL_LINK(DumpAsPropertyTreeHdl, tools::JsonWriter&, void);
};
-typedef std::vector<VclPtr<Panel>> SharedPanelContainer;
+
+typedef std::vector<std::shared_ptr<Panel>> SharedPanelContainer;
} // end of namespace sfx2::sidebar
diff --git a/include/sfx2/sidebar/PanelLayout.hxx b/include/sfx2/sidebar/PanelLayout.hxx
index b03ebf97bb22..e5630180f99e 100644
--- a/include/sfx2/sidebar/PanelLayout.hxx
+++ b/include/sfx2/sidebar/PanelLayout.hxx
@@ -21,9 +21,9 @@ namespace tools { class JsonWriter; }
class SFX2_DLLPUBLIC PanelLayout
{
protected:
- VclPtr<sfx2::sidebar::Panel> m_xPanel;
std::unique_ptr<weld::Builder> m_xBuilder;
std::unique_ptr<weld::Container> m_xContainer;
+ sfx2::sidebar::Panel* m_pPanel;
virtual void DataChanged(const DataChangedEvent& rEvent);
virtual void DumpAsPropertyTree(tools::JsonWriter&);
diff --git a/include/sfx2/sidebar/SidebarController.hxx b/include/sfx2/sidebar/SidebarController.hxx
index 78e9221000f9..629abf405c5c 100644
--- a/include/sfx2/sidebar/SidebarController.hxx
+++ b/include/sfx2/sidebar/SidebarController.hxx
@@ -239,9 +239,9 @@ private:
void CreatePanels(
const OUString& rDeckId,
const Context& rContext);
- VclPtr<Panel> CreatePanel (
- const OUString& rsPanelId,
- vcl::Window* pParentWindow,
+ std::shared_ptr<Panel> CreatePanel (
+ std::u16string_view rsPanelId,
+ weld::Widget* pParentWindow,
const bool bIsInitiallyExpanded,
const Context& rContext,
const VclPtr<Deck>& pDeck);
diff --git a/include/sfx2/sidebar/Theme.hxx b/include/sfx2/sidebar/Theme.hxx
index c59d71233b00..26e185396594 100644
--- a/include/sfx2/sidebar/Theme.hxx
+++ b/include/sfx2/sidebar/Theme.hxx
@@ -59,8 +59,6 @@ public:
Image_Color_,
- Color_DeckTitleFont,
- Color_PanelTitleFont,
Color_Highlight,
Color_HighlightText,
Color_DeckBackground,
@@ -68,16 +66,11 @@ public:
Color_PanelBackground,
Color_PanelTitleBarBackground,
Color_TabBarBackground,
- Color_HorizontalBorder,
- Color_VerticalBorder,
- Color_DropDownBackground,
Color_Int_,
- Int_DeckTitleBarHeight,
Int_DeckBorderSize,
Int_DeckSeparatorHeight,
- Int_PanelTitleBarHeight,
Int_DeckLeftPadding,
Int_DeckTopPadding,
Int_DeckRightPadding,
diff --git a/sd/source/ui/sidebar/SlideBackground.cxx b/sd/source/ui/sidebar/SlideBackground.cxx
index 43c566fb761c..035875e5bc20 100644
--- a/sd/source/ui/sidebar/SlideBackground.cxx
+++ b/sd/source/ui/sidebar/SlideBackground.cxx
@@ -343,8 +343,8 @@ void SlideBackground::HandleContextChange(
mxInsertImage->hide();
// Need to do a relayouting, otherwise the panel size is not updated after show / hide controls
- if (m_xPanel)
- m_xPanel->TriggerDeckLayouting();
+ if (m_pPanel)
+ m_pPanel->TriggerDeckLayouting();
}
else if ( IsDraw() )
diff --git a/sfx2/UIConfig_sfx.mk b/sfx2/UIConfig_sfx.mk
index 88127c9f78b1..865b5c1c3362 100644
--- a/sfx2/UIConfig_sfx.mk
+++ b/sfx2/UIConfig_sfx.mk
@@ -22,7 +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/deck \
sfx2/uiconfig/ui/descriptioninfopage \
sfx2/uiconfig/ui/documentfontspage \
sfx2/uiconfig/ui/documentinfopage \
diff --git a/sfx2/inc/sidebar/DeckLayouter.hxx b/sfx2/inc/sidebar/DeckLayouter.hxx
index b84496cd6646..c814abd98921 100644
--- a/sfx2/inc/sidebar/DeckLayouter.hxx
+++ b/sfx2/inc/sidebar/DeckLayouter.hxx
@@ -20,27 +20,26 @@
#include <sfx2/sidebar/Panel.hxx>
-class ScrollBar;
-namespace vcl { class Window; }
namespace tools { class Rectangle; }
namespace sfx2::sidebar {
+class DeckTitleBar;
+class SidebarDockingWindow;
+
/** Helper for layouting the direct and indirect children of a
deck like title bars, panels, and scroll bars.
*/
namespace DeckLayouter
{
void LayoutDeck (
+ SidebarDockingWindow* pDockingWindow,
const tools::Rectangle& rContentArea,
sal_Int32& rMinimalWidth,
sal_Int32& rMinimalHeight,
SharedPanelContainer& rPanels,
- vcl::Window& pDeckTitleBar,
- vcl::Window& pScrollClipWindow,
- vcl::Window& pScrollContainer,
- vcl::Window& pFiller,
- ScrollBar& pVerticalScrollBar);
+ DeckTitleBar& pDeckTitleBar,
+ weld::ScrolledWindow& pVerticalScrollBar);
}
} // end of namespace sfx2::sidebar
diff --git a/sfx2/inc/sidebar/DeckTitleBar.hxx b/sfx2/inc/sidebar/DeckTitleBar.hxx
index 5fcc7403f134..c471039fe9af 100644
--- a/sfx2/inc/sidebar/DeckTitleBar.hxx
+++ b/sfx2/inc/sidebar/DeckTitleBar.hxx
@@ -23,14 +23,14 @@
namespace sfx2::sidebar
{
+class Deck;
class GripWidget;
class DeckTitleBar final : public TitleBar
{
public:
- DeckTitleBar(const OUString& rsTitle, vcl::Window* pParentWindow,
+ DeckTitleBar(const OUString& rsTitle, weld::Builder& rBuilder,
const std::function<void()>& rCloserAction);
- virtual void dispose() override;
virtual ~DeckTitleBar() override;
virtual void SetTitle(const OUString& rsTitle) override;
@@ -39,7 +39,7 @@ public:
void SetCloserVisible(const bool bIsCloserVisible);
tools::Rectangle GetDragArea();
- virtual void DataChanged(const DataChangedEvent& rEvent) override;
+ virtual void DataChanged() override;
private:
virtual void HandleToolBoxItemClick() override;
diff --git a/sfx2/inc/sidebar/PanelTitleBar.hxx b/sfx2/inc/sidebar/PanelTitleBar.hxx
index 08133be6cf10..8a90f8a79101 100644
--- a/sfx2/inc/sidebar/PanelTitleBar.hxx
+++ b/sfx2/inc/sidebar/PanelTitleBar.hxx
@@ -28,8 +28,7 @@ namespace sfx2::sidebar {
class Panel;
-class PanelTitleBar final
- : public TitleBarBase
+class PanelTitleBar final : public TitleBar
{
public:
PanelTitleBar(const OUString& rsTitle, weld::Builder& rBuilder, Panel* pPanel);
@@ -37,17 +36,12 @@ public:
virtual void SetTitle (const OUString& rsTitle) override;
virtual OUString GetTitle() const override;
- virtual bool GetVisible() const override;
void SetMoreOptionsCommand(const OUString& rsCommandName,
const css::uno::Reference<css::frame::XFrame>& rxFrame,
const css::uno::Reference<css::frame::XController>& rxController);
void UpdateExpandedState();
- void Show(bool bShow)
- {
- mxTitlebar->set_visible(bShow);
- }
weld::Expander& GetExpander()
{
@@ -59,13 +53,11 @@ private:
DECL_LINK(ExpandHdl, weld::Expander&, void);
- std::unique_ptr<weld::Container> mxTitlebar;
std::unique_ptr<weld::Expander> mxExpander;
css::uno::Reference<css::frame::XToolbarController> mxController;
- VclPtr<Panel> mpPanel;
- css::uno::Reference<css::frame::XFrame> mxFrame;
+ Panel* mpPanel;
OString msIdent;
OUString msMoreOptionsCommand;
};
diff --git a/sfx2/inc/sidebar/TitleBar.hxx b/sfx2/inc/sidebar/TitleBar.hxx
index 425e859cc690..4672342ffec5 100644
--- a/sfx2/inc/sidebar/TitleBar.hxx
+++ b/sfx2/inc/sidebar/TitleBar.hxx
@@ -21,20 +21,24 @@
#include <sidebar/SidebarToolBox.hxx>
#include <sfx2/sidebar/Theme.hxx>
#include <sfx2/weldutils.hxx>
-#include <vcl/InterimItemWindow.hxx>
namespace sfx2::sidebar {
-class TitleBarBase
+class TitleBar
{
public:
- TitleBarBase(weld::Builder& rBuilder, Theme::ThemeItem eThemeItem);
- void reset();
- virtual ~TitleBarBase();
+ TitleBar(weld::Builder& rBuilder, Theme::ThemeItem eThemeItem);
+ virtual ~TitleBar();
virtual void SetTitle (const OUString& rsTitle) = 0;
virtual OUString GetTitle() const = 0;
- virtual bool GetVisible() const = 0;
+
+ virtual void DataChanged();
+
+ void Show(bool bShow);
+ bool GetVisible() const;
+
+ Size get_preferred_size() const;
void SetIcon(const css::uno::Reference<css::graphic::XGraphic>& rIcon);
@@ -49,6 +53,7 @@ public:
protected:
weld::Builder& mrBuilder;
+ std::unique_ptr<weld::Container> mxTitlebar;
std::unique_ptr<weld::Image> mxAddonImage;
std::unique_ptr<weld::Toolbar> mxToolBox;
std::unique_ptr<ToolbarUnoDispatcher> mxToolBoxController;
@@ -57,20 +62,9 @@ protected:
virtual void HandleToolBoxItemClick() = 0;
DECL_LINK(SelectionHandler, const OString&, void);
-};
-
-class TitleBar : public InterimItemWindow
- , public TitleBarBase
-{
-public:
- TitleBar(vcl::Window* pParentWindow,
- const OUString& rUIXMLDescription, const OString& rID,
- Theme::ThemeItem eThemeItem);
- virtual void dispose() override;
- virtual bool GetVisible() const override { return IsVisible(); }
- virtual ~TitleBar() override;
- virtual void DataChanged (const DataChangedEvent& rEvent) override;
+private:
+ void SetBackground();
};
} // end of namespace sfx2::sidebar
diff --git a/sfx2/inc/sidebar/UnoPanel.hxx b/sfx2/inc/sidebar/UnoPanel.hxx
index 50d9aba2c0fa..2b1197eb95f7 100644
--- a/sfx2/inc/sidebar/UnoPanel.hxx
+++ b/sfx2/inc/sidebar/UnoPanel.hxx
@@ -60,7 +60,7 @@ private:
const OUString mDeckId;
VclPtr<sfx2::sidebar::Deck> mpDeck;
- VclPtr<sfx2::sidebar::Panel> mpPanel;
+ std::weak_ptr<sfx2::sidebar::Panel> mxPanel;
sal_Int32 GetMaxOrderIndex(sfx2::sidebar::ResourceManager::PanelContextDescriptorContainer aPanels);
sal_Int32 GetMinOrderIndex(sfx2::sidebar::ResourceManager::PanelContextDescriptorContainer aPanels);
diff --git a/sfx2/source/sidebar/Deck.cxx b/sfx2/source/sidebar/Deck.cxx
index ca988521d184..5070d500038d 100644
--- a/sfx2/source/sidebar/Deck.cxx
+++ b/sfx2/source/sidebar/Deck.cxx
@@ -24,6 +24,7 @@
#include <sidebar/DeckTitleBar.hxx>
#include <sidebar/PanelTitleBar.hxx>
#include <sfx2/sidebar/Panel.hxx>
+#include <sfx2/sidebar/SidebarDockingWindow.hxx>
#include <sfx2/sidebar/Theme.hxx>
#include <sfx2/lokhelper.hxx>
@@ -42,36 +43,24 @@ using namespace css::uno;
namespace sfx2::sidebar {
-Deck::Deck(const DeckDescriptor& rDeckDescriptor, vcl::Window* pParentWindow,
+Deck::Deck(const DeckDescriptor& rDeckDescriptor, SidebarDockingWindow* pParentWindow,
const std::function<void()>& rCloserAction)
- : Window(pParentWindow, 0)
+ : InterimItemWindow(pParentWindow, "sfx/ui/deck.ui", "Deck")
, msId(rDeckDescriptor.msId)
, mnMinimalWidth(0)
, mnMinimalHeight(0)
, maPanels()
- , mpTitleBar(VclPtr<DeckTitleBar>::Create(rDeckDescriptor.msTitle, this, rCloserAction))
- , mpScrollClipWindow(VclPtr<vcl::Window>::Create(this))
- , mpScrollContainer(VclPtr<ScrollContainerWindow>::Create(mpScrollClipWindow.get()))
- , mpFiller(VclPtr<vcl::Window>::Create(this))
- , mpVerticalScrollBar(VclPtr<ScrollBar>::Create(this))
+ , mxParentWindow(pParentWindow)
+ , mxTitleBar(new DeckTitleBar(rDeckDescriptor.msTitle, *m_xBuilder, rCloserAction))
+ , mxVerticalScrollBar(m_xBuilder->weld_scrolled_window("scrolledwindow"))
+ , mxContents(m_xBuilder->weld_container("contents"))
{
- mpScrollClipWindow->SetBackground(Wallpaper());
- mpScrollClipWindow->Show();
-
- mpScrollContainer->SetStyle(mpScrollContainer->GetStyle() | WB_DIALOGCONTROL);
- mpScrollContainer->SetBackground(Wallpaper());
- mpScrollContainer->Show();
-
- mpVerticalScrollBar->SetScrollHdl(LINK(this, Deck, HandleVerticalScrollBarChange));
- mpVerticalScrollBar->SetLineSize(10);
- mpVerticalScrollBar->SetPageSize(100);
-
-#ifdef DEBUG
- SetText(OUString("Deck"));
- mpScrollClipWindow->SetText(OUString("ScrollClipWindow"));
- mpFiller->SetText(OUString("Filler"));
- mpVerticalScrollBar->SetText(OUString("VerticalScrollBar"));
-#endif
+ SetStyle(GetStyle() | WB_DIALOGCONTROL);
+
+ m_xContainer->set_background(Theme::GetColor(Theme::Color_DeckBackground));
+
+ mxVerticalScrollBar->vadjustment_set_step_increment(10);
+ mxVerticalScrollBar->vadjustment_set_page_increment(100);
}
Deck::~Deck()
@@ -87,22 +76,22 @@ void Deck::dispose()
// We have to explicitly trigger the destruction of panels.
// Otherwise that is done by one of our base class destructors
// without updating maPanels.
- for (VclPtr<Panel> & rpPanel : aPanels)
- rpPanel.disposeAndClear();
+ for (auto& rpPanel : aPanels)
+ rpPanel.reset();
- maPanels.clear(); // just to keep the loplugin:vclwidgets happy
- mpTitleBar.disposeAndClear();
- mpFiller.disposeAndClear();
- mpVerticalScrollBar.disposeAndClear();
- mpScrollContainer.disposeAndClear();
- mpScrollClipWindow.disposeAndClear();
+ maPanels.clear();
+ mxTitleBar.reset();
+ mxContents.reset();
+ mxVerticalScrollBar.reset();
- vcl::Window::dispose();
+ mxParentWindow.clear();
+
+ InterimItemWindow::dispose();
}
-VclPtr<DeckTitleBar> const & Deck::GetTitleBar() const
+DeckTitleBar* Deck::GetTitleBar() const
{
- return mpTitleBar;
+ return mxTitleBar.get();
}
tools::Rectangle Deck::GetContentArea() const
@@ -119,65 +108,17 @@ tools::Rectangle Deck::GetContentArea() const
aWindowSize.Height() - 1 - Theme::GetInteger(Theme::Int_DeckBottomPadding) - nBorderSize);
}
-void Deck::ApplySettings(vcl::RenderContext& rRenderContext)
+void Deck::DataChanged(const DataChangedEvent&)
{
- rRenderContext.SetBackground(Wallpaper());
-}
+ for (auto& rpPanel : maPanels)
+ rpPanel->DataChanged();
-void Deck::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& /*rUpdateArea*/)
-{
- const Size aWindowSize (GetSizePixel());
- const SvBorder aPadding(Theme::GetInteger(Theme::Int_DeckLeftPadding),
- Theme::GetInteger(Theme::Int_DeckTopPadding),
- Theme::GetInteger(Theme::Int_DeckRightPadding),
- Theme::GetInteger(Theme::Int_DeckBottomPadding));
-
- // Paint deck background outside the border.
- tools::Rectangle aBox(0, 0, aWindowSize.Width() - 1, aWindowSize.Height() - 1);
- DrawHelper::DrawBorder(rRenderContext, aBox, aPadding,
- Theme::GetColor(Theme::Color_DeckBackground),
- Theme::GetColor(Theme::Color_DeckBackground));
-
- // Paint the border.
- const int nBorderSize(Theme::GetInteger(Theme::Int_DeckBorderSize));
- aBox.AdjustLeft(aPadding.Left() );
- aBox.AdjustTop(aPadding.Top() );
- aBox.AdjustRight( -(aPadding.Right()) );
- aBox.AdjustBottom( -(aPadding.Bottom()) );
- const Color nHorizontalBorderPaint(Theme::GetColor(Theme::Color_HorizontalBorder));
- DrawHelper::DrawBorder(rRenderContext, aBox,
- SvBorder(nBorderSize, nBorderSize, nBorderSize, nBorderSize),
- nHorizontalBorderPaint,
- Theme::GetColor(Theme::Color_VerticalBorder));
-}
-
-void Deck::DataChanged (const DataChangedEvent&)
-{
RequestLayoutInternal();
}
-bool Deck::EventNotify(NotifyEvent& rEvent)
-{
- if (rEvent.GetType() == MouseNotifyEvent::COMMAND)
- {
- CommandEvent* pCommandEvent = static_cast<CommandEvent*>(rEvent.GetData());
- if (pCommandEvent != nullptr)
- switch (pCommandEvent->GetCommand())
- {
- case CommandEventId::Wheel:
- return ProcessWheelEvent(pCommandEvent);
-
- default:
- break;
- }
- }
-
- return Window::EventNotify(rEvent);
-}
-
void Deck::Resize()
{
- Window::Resize();
+ InterimItemWindow::Resize();
if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
{
@@ -207,52 +148,26 @@ void Deck::DumpAsPropertyTree(tools::JsonWriter& rJsonWriter)
continue;
// collapse the panel itself out
- auto xContent = it->GetElementWindow();
- if (!xContent.is())
- continue;
- VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow(xContent);
- if (!pWindow)
+ auto xContent = it->GetContents();
+ if (!xContent)
continue;
auto childNode = rJsonWriter.startStruct();
rJsonWriter.put("id", it->GetId());
rJsonWriter.put("type", "panel");
- rJsonWriter.put("text", it->GetText());
- rJsonWriter.put("enabled", it->IsEnabled());
+ rJsonWriter.put("text", it->GetTitle());
+ rJsonWriter.put("enabled", true);
{
auto children2Node = rJsonWriter.startArray("children");
{
auto child2Node = rJsonWriter.startStruct();
- pWindow->DumpAsPropertyTree(rJsonWriter);
+ xContent->get_property_tree(rJsonWriter);
}
}
}
}
-bool Deck::ProcessWheelEvent(CommandEvent const * pCommandEvent)
-{
- if ( ! mpVerticalScrollBar)
- return false;
- if ( ! mpVerticalScrollBar->IsVisible())
- return false;
-
- // Get the wheel data and check that it describes a valid vertical
- // scroll.
- const CommandWheelData* pData = pCommandEvent->GetWheelData();
- if (pData==nullptr
- || pData->GetModifier()
- || pData->GetMode() != CommandWheelMode::SCROLL
- || pData->IsHorz())
- return false;
-
- // Execute the actual scroll action.
- tools::Long nDelta = pData->GetDelta();
- mpVerticalScrollBar->DoScroll(
- mpVerticalScrollBar->GetThumbPos() - nDelta);
- return true;
-}
-
/**
* This container may contain existing panels that are
* being re-used, and new ones too.
@@ -262,7 +177,7 @@ void Deck::ResetPanels(const SharedPanelContainer& rPanelContainer)
SharedPanelContainer aHiddens;
// First hide old panels we don't need just now.
- for (VclPtr<Panel> & rpPanel : maPanels)
+ for (auto& rpPanel : maPanels)
{
bool bFound = false;
for (const auto & i : rPanelContainer)
@@ -286,9 +201,9 @@ void Deck::RequestLayoutInternal()
mnMinimalWidth = 0;
mnMinimalHeight = 0;
- DeckLayouter::LayoutDeck(GetContentArea(), mnMinimalWidth, mnMinimalHeight, maPanels,
- *GetTitleBar(), *mpScrollClipWindow, *mpScrollContainer,
- *mpFiller, *mpVerticalScrollBar);
+ DeckLayouter::LayoutDeck(mxParentWindow.get(), GetContentArea(),
+ mnMinimalWidth, mnMinimalHeight, maPanels,
+ *GetTitleBar(), *mxVerticalScrollBar);
}
void Deck::RequestLayout()
@@ -323,18 +238,18 @@ void Deck::RequestLayout()
setPosSizePixel(0, 0, aParentSize.Width(), aParentSize.Height());
}
-vcl::Window* Deck::GetPanelParentWindow()
+weld::Widget* Deck::GetPanelParentWindow()
{
- return mpScrollContainer.get();
+ return mxContents.get();
}
-Panel* Deck::GetPanel(const OUString & panelId)
+std::shared_ptr<Panel> Deck::GetPanel(std::u16string_view panelId)
{
- for (const VclPtr<Panel> & pPanel : maPanels)
+ for (const auto& pPanel : maPanels)
{
if(pPanel->GetId() == panelId)
{
- return pPanel.get();
+ return pPanel;
}
}
return nullptr;
@@ -343,100 +258,27 @@ Panel* Deck::GetPanel(const OUString & panelId)
void Deck::ShowPanel(const Panel& rPanel)
{
- if (!mpVerticalScrollBar || !mpVerticalScrollBar->IsVisible())
+ if (!mxVerticalScrollBar || mxVerticalScrollBar->get_vpolicy() == VclPolicyType::NEVER)
return;
// Get vertical extent of the panel.
- sal_Int32 nPanelTop (rPanel.GetPosPixel().Y());
- const sal_Int32 nPanelBottom (nPanelTop + rPanel.GetSizePixel().Height() - 1);
+ tools::Rectangle aExtents;
+ if (!rPanel.get_extents(aExtents))
+ return;
+
+ auto nPanelTop = aExtents.Top();
+ auto nPanelBottom = aExtents.Bottom() - 1;
// Determine what the new thumb position should be like.
// When the whole panel does not fit then make its top visible
// and it off at the bottom.
- sal_Int32 nNewThumbPos (mpVerticalScrollBar->GetThumbPos());
- if (nPanelBottom >= nNewThumbPos+mpVerticalScrollBar->GetVisibleSize())
- nNewThumbPos = nPanelBottom - mpVerticalScrollBar->GetVisibleSize();
+ sal_Int32 nNewThumbPos(mxVerticalScrollBar->vadjustment_get_value());
+ if (nPanelBottom >= nNewThumbPos + mxVerticalScrollBar->vadjustment_get_page_size())
+ nNewThumbPos = nPanelBottom - mxVerticalScrollBar->vadjustment_get_page_size();
if (nPanelTop < nNewThumbPos)
nNewThumbPos = nPanelTop;
- mpVerticalScrollBar->SetThumbPos(nNewThumbPos);
- mpScrollContainer->SetPosPixel(
- Point(
- mpScrollContainer->GetPosPixel().X(),
- -nNewThumbPos));
-}
-
-static OUString GetWindowClassification(const vcl::Window* pWindow)
-{
- const OUString& rsName (pWindow->GetText());
- if (!rsName.isEmpty())
- {
- return rsName;
- }
- else
- {
- return "window";
- }
-}
-
-void Deck::PrintWindowSubTree(vcl::Window* pRoot, int nIndentation)
-{
- static const char* const sIndentation = " ";
- const Point aLocation (pRoot->GetPosPixel());
- const Size aSize (pRoot->GetSizePixel());
- SAL_INFO(
- "sfx.sidebar",
- sIndentation + strlen(sIndentation) - nIndentation * 4 << pRoot << " "
- << GetWindowClassification(pRoot) << " "
- << (pRoot->IsVisible() ? "visible" : "hidden") << " +"
- << aLocation.X() << "+" << aLocation.Y() << " x" << aSize.Width()
- << "x" << aSize.Height());
-
- const sal_uInt16 nChildCount(pRoot->GetChildCount());
- for (sal_uInt16 nIndex = 0; nIndex < nChildCount; ++nIndex)
- PrintWindowSubTree(pRoot->GetChild(nIndex), nIndentation + 1);
-}
-
-IMPL_LINK_NOARG(Deck, HandleVerticalScrollBarChange, ScrollBar*, void)
-{
- const sal_Int32 nYOffset (-mpVerticalScrollBar->GetThumbPos());
- mpScrollContainer->SetPosPixel(Point(mpScrollContainer->GetPosPixel().X(),
- nYOffset));
- mpScrollContainer->Invalidate();
-}
-
-//----- Deck::ScrollContainerWindow -------------------------------------------
-
-Deck::ScrollContainerWindow::ScrollContainerWindow (vcl::Window* pParentWindow)
- : Window(pParentWindow),
- maSeparators()
-{
-#ifdef DEBUG
- SetText(OUString("ScrollContainerWindow"));
-#endif
-}
-
-void Deck::ScrollContainerWindow::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& /*rUpdateArea*/)
-{
- // Paint the separators.
- const sal_Int32 nSeparatorHeight(Theme::GetInteger(Theme::Int_DeckSeparatorHeight));
- const sal_Int32 nLeft(0);
- const sal_Int32 nRight(GetSizePixel().Width() - 1);
- const Color nHorizontalBorderPaint(Theme::GetColor(Theme::Color_HorizontalBorder));
- for (auto const& separator : maSeparators)
- {
- DrawHelper::DrawHorizontalLine(rRenderContext, nLeft, nRight, separator,
- nSeparatorHeight, nHorizontalBorderPaint);
- }
-}
-
-void Deck::ScrollContainerWindow::SetSeparators (const ::std::vector<sal_Int32>& rSeparators)
-{
- if (rSeparators != maSeparators)
- {
- maSeparators = rSeparators;
- Invalidate();
- }
+ mxVerticalScrollBar->vadjustment_set_value(nNewThumbPos);
}
} // end of namespace sfx2::sidebar
diff --git a/sfx2/source/sidebar/DeckLayouter.cxx b/sfx2/source/sidebar/DeckLayouter.cxx
index 05098986b826..36d6357ef305 100644
--- a/sfx2/source/sidebar/DeckLayouter.cxx
+++ b/sfx2/source/sidebar/DeckLayouter.cxx
@@ -18,10 +18,12 @@
*/
#include <sidebar/DeckLayouter.hxx>
-#include <sfx2/sidebar/Theme.hxx>
-#include <sfx2/sidebar/Panel.hxx>
+#include <sidebar/DeckTitleBar.hxx>
#include <sidebar/PanelTitleBar.hxx>
#include <sfx2/sidebar/Deck.hxx>
+#include <sfx2/sidebar/Panel.hxx>
+#include <sfx2/sidebar/Theme.hxx>
+#include <sfx2/sidebar/SidebarDockingWindow.hxx>
#include <sfx2/sidebar/SidebarController.hxx>
#include <comphelper/lok.hxx>
@@ -52,14 +54,14 @@ namespace {
class LayoutItem
{
public:
- VclPtr<Panel> mpPanel;
+ std::shared_ptr<Panel> mpPanel;
css::ui::LayoutSize maLayoutSize;
sal_Int32 mnDistributedHeight;
sal_Int32 mnWeight;
bool mbShowTitleBar;
- LayoutItem(const VclPtr<Panel>& rPanel)
- : mpPanel(rPanel)
+ LayoutItem(std::shared_ptr<Panel>& pPanel)
+ : mpPanel(pPanel)
, maLayoutSize(0, 0, 0)
, mnDistributedHeight(0)
, mnWeight(0)
@@ -67,14 +69,12 @@ namespace {
{
}
};
- tools::Rectangle LayoutPanels (
+ void LayoutPanels (
const tools::Rectangle& rContentArea,
sal_Int32& rMinimalWidth,
sal_Int32& rMinimalHeight,
::std::vector<LayoutItem>& rLayoutItems,
- vcl::Window& rScrollClipWindow,
- vcl::Window& rScrollContainer,
- ScrollBar& pVerticalScrollBar,
+ weld::ScrolledWindow& pVerticalScrollBar,
const bool bShowVerticalScrollBar);
void GetRequestedSizes (
::std::vector<LayoutItem>& rLayoutItem,
@@ -86,81 +86,66 @@ namespace {
const sal_Int32 nHeightToDistribute,
const sal_Int32 nContainerHeight,
const bool bMinimumHeightIsBase);
- bool MoveResizePixel(const VclPtr<vcl::Window> &pWindow,
- const Point &rNewPos, const Size &rNewSize);
sal_Int32 PlacePanels (
::std::vector<LayoutItem>& rLayoutItems,
- const sal_Int32 nWidth,
- const LayoutMode eMode,
- vcl::Window& rScrollContainer);
+ const LayoutMode eMode_);
tools::Rectangle PlaceDeckTitle (
- vcl::Window& rTitleBar,
+ SidebarDockingWindow* pDockingWindow,
+ DeckTitleBar& rTitleBar,
const tools::Rectangle& rAvailableSpace);
tools::Rectangle PlaceVerticalScrollBar (
- ScrollBar& rVerticalScrollBar,
+ weld::ScrolledWindow& rVerticalScrollBar,
const tools::Rectangle& rAvailableSpace,
const bool bShowVerticalScrollBar);
void SetupVerticalScrollBar(
- ScrollBar& rVerticalScrollBar,
+ weld::ScrolledWindow& rVerticalScrollBar,
const sal_Int32 nContentHeight,
const sal_Int32 nVisibleHeight);
- void UpdateFiller (
- vcl::Window& rFiller,
- const tools::Rectangle& rBox);
}
void DeckLayouter::LayoutDeck (
+ SidebarDockingWindow* pDockingWindow,
const tools::Rectangle& rContentArea,
sal_Int32& rMinimalWidth,
sal_Int32& rMinimalHeight,
SharedPanelContainer& rPanels,
- vcl::Window& rDeckTitleBar,
- vcl::Window& rScrollClipWindow,
- vcl::Window& rScrollContainer,
- vcl::Window& rFiller,
- ScrollBar& rVerticalScrollBar)
+ DeckTitleBar& rDeckTitleBar,
+ weld::ScrolledWindow& rVerticalScrollBar)
{
if (rContentArea.GetWidth()<=0 || rContentArea.GetHeight()<=0)
return;
- tools::Rectangle aBox (PlaceDeckTitle(rDeckTitleBar, rContentArea));
+ tools::Rectangle aBox(PlaceDeckTitle(pDockingWindow, rDeckTitleBar, rContentArea));
if ( ! rPanels.empty())
{
// Prepare the layout item container.
::std::vector<LayoutItem> aLayoutItems;
aLayoutItems.reserve(rPanels.size());
- for (const auto& rPanel : rPanels)
+ for (auto& rPanel : rPanels)
aLayoutItems.emplace_back(rPanel);
- aBox = LayoutPanels(
+ LayoutPanels(
aBox,
rMinimalWidth,
rMinimalHeight,
aLayoutItems,
- rScrollClipWindow,
- rScrollContainer,
rVerticalScrollBar,
false);
}
- UpdateFiller(rFiller, aBox);
}
namespace {
-tools::Rectangle LayoutPanels (
+void LayoutPanels (
const tools::Rectangle& rContentArea,
sal_Int32& rMinimalWidth,
sal_Int32& rMinimalHeight,
::std::vector<LayoutItem>& rLayoutItems,
- vcl::Window& rScrollClipWindow,
- vcl::Window& rScrollContainer,
- ScrollBar& rVerticalScrollBar,
+ weld::ScrolledWindow& rVerticalScrollBar,
const bool bShowVerticalScrollBar)
{
tools::Rectangle aBox (PlaceVerticalScrollBar(rVerticalScrollBar, rContentArea, bShowVerticalScrollBar));
- const sal_Int32 nWidth (aBox.GetWidth());
-
// Get the requested heights of the panels and the available
// height that is left when all panel titles and separators are
// taken into account.
@@ -186,15 +171,14 @@ tools::Rectangle LayoutPanels (
// Not enough space, even when all panels are shrunk to their
// minimum height.
// Show a vertical scrollbar.
- return LayoutPanels(
+ LayoutPanels(
rContentArea,
rMinimalWidth,
rMinimalHeight,
rLayoutItems,
- rScrollClipWindow,
- rScrollContainer,
rVerticalScrollBar,
true);
+ return;
}
// We are now in one of three modes.
@@ -227,58 +211,26 @@ tools::Rectangle LayoutPanels (
eMode==MinimumOrLarger);
}
- // Set position and size of the mpScrollClipWindow to the available
- // size. Its child, the mpScrollContainer, may have a bigger
- // height.
- rScrollClipWindow.setPosSizePixel(aBox.Left(), aBox.Top(), aBox.GetWidth(), aBox.GetHeight());
-
- const sal_Int32 nContentHeight (
- eMode==Preferred
- ? nTotalPreferredHeight + nTotalDecorationHeight
- : aBox.GetHeight());
- sal_Int32 nY = rVerticalScrollBar.GetThumbPos();
- if (nContentHeight-nY < aBox.GetHeight())
- nY = nContentHeight-aBox.GetHeight();
- if (nY < 0)
- nY = 0;
- rScrollContainer.setPosSizePixel(
- 0,
- -nY,
- nWidth,
- nContentHeight);
-
if (bShowVerticalScrollBar)
+ {
+ const sal_Int32 nContentHeight(
+ eMode==Preferred
+ ? nTotalPreferredHeight + nTotalDecorationHeight
+ : aBox.GetHeight());
SetupVerticalScrollBar(rVerticalScrollBar, nContentHeight, aBox.GetHeight());
+ }
- const sal_Int32 nUsedHeight (PlacePanels(rLayoutItems, nWidth, eMode, rScrollContainer));
- aBox.AdjustTop(nUsedHeight );
+ const sal_Int32 nUsedHeight(PlacePanels(rLayoutItems, eMode));
rMinimalHeight = nUsedHeight;
- return aBox;
-}
-
-bool MoveResizePixel(const VclPtr<vcl::Window> &pWindow,
- const Point &rNewPos, const Size &rNewSize)
-{
- Point aCurPos = pWindow->GetPosPixel();
- Size aCurSize = pWindow->GetSizePixel();
- if (rNewPos == aCurPos && aCurSize == rNewSize)
- return false;
- pWindow->setPosSizePixel(rNewPos.X(), rNewPos.Y(), rNewSize.Width(), rNewSize.Height());
- return true;
}
sal_Int32 PlacePanels (
::std::vector<LayoutItem>& rLayoutItems,
- const sal_Int32 nWidth,
- const LayoutMode eMode,
- vcl::Window& rScrollContainer)
+ const LayoutMode eMode)
{
- ::std::vector<sal_Int32> aSeparators;
const sal_Int32 nDeckSeparatorHeight (Theme::GetInteger(Theme::Int_DeckSeparatorHeight));
sal_Int32 nY (0);
- vcl::Region aInvalidRegions;
-
// Assign heights and places.
for(::std::vector<LayoutItem>::const_iterator iItem(rLayoutItems.begin()),
iEnd(rLayoutItems.end());
@@ -290,22 +242,26 @@ sal_Int32 PlacePanels (
Panel& rPanel (*iItem->mpPanel);
+ rPanel.set_margin_top(nDeckSeparatorHeight);
+ rPanel.set_margin_bottom(0);
+
// Separator above the panel title bar.
if (!rPanel.IsLurking())
{
- aSeparators.push_back(nY);
nY += nDeckSeparatorHeight;
}
- const sal_Int32 nPanelTitleBarHeight(Theme::GetInteger(Theme::Int_PanelTitleBarHeight) * rPanel.GetDPIScaleFactor());
-
bool bShowTitlebar = iItem->mbShowTitleBar;
- rPanel.ShowTitlebar(bShowTitlebar);
+ PanelTitleBar* pTitleBar = rPanel.GetTitleBar();
+ pTitleBar->Show(bShowTitlebar);
+ rPanel.set_vexpand(!bShowTitlebar);
+ weld::Container* pContents = rPanel.GetContents();
+ pContents->set_vexpand(true);
bool bExpanded = rPanel.IsExpanded() && !rPanel.IsLurking();
if (bShowTitlebar || bExpanded)
{
- rPanel.Show();
+ rPanel.Show(true);
sal_Int32 nPanelHeight(0);
if (bExpanded)
@@ -329,24 +285,15 @@ sal_Int32 PlacePanels (
}
}
if (bShowTitlebar)
- nPanelHeight += nPanelTitleBarHeight;
+ nPanelHeight += pTitleBar->get_preferred_size().Height();
- // Place the panel.
- Point aNewPos(0, nY);
- Size aNewSize(nWidth, nPanelHeight);
-
- // Only invalidate if we moved
- if (MoveResizePixel(&rPanel, aNewPos, aNewSize))
- {
- tools::Rectangle aRect(aNewPos, aNewSize);
- aInvalidRegions.Union(rPanel.PixelToLogic(aRect));
- }
+ rPanel.SetHeightPixel(nPanelHeight);
nY += nPanelHeight;
}
else
{
- rPanel.Hide();
+ rPanel.Show(false);
}
if (!bExpanded)
@@ -356,19 +303,12 @@ sal_Int32 PlacePanels (
if (iItem == rLayoutItems.end()-1)
{
// Separator below the panel title bar.
- aSeparators.push_back(nY);
+ rPanel.set_margin_bottom(nDeckSeparatorHeight);
nY += nDeckSeparatorHeight;
}
}
}
- Deck::ScrollContainerWindow* pScrollContainerWindow
- = dynamic_cast<Deck::ScrollContainerWindow*>(&rScrollContainer);
- if (pScrollContainerWindow != nullptr)
- pScrollContainerWindow->SetSeparators(aSeparators);
-
- rScrollContainer.Invalidate(aInvalidRegions);
-
return nY;
}
@@ -407,7 +347,8 @@ void GetRequestedSizes (
{
// Show the title bar and a separator above and below
// the title bar.
- const sal_Int32 nPanelTitleBarHeight (Theme::GetInteger(Theme::Int_PanelTitleBarHeight) * rItem.mpPanel->GetDPIScaleFactor());
+ PanelTitleBar* pTitleBar = rItem.mpPanel->GetTitleBar();
+ const sal_Int32 nPanelTitleBarHeight = pTitleBar->get_preferred_size().Height();
rAvailableHeight -= nPanelTitleBarHeight;
rAvailableHeight -= nDeckSeparatorHeight;
@@ -548,25 +489,21 @@ void DistributeHeights (
OSL_ASSERT(nRemainingHeightToDistribute==0);
}
-tools::Rectangle PlaceDeckTitle (
- vcl::Window& rDeckTitleBar,
+tools::Rectangle PlaceDeckTitle(
+ SidebarDockingWindow* pDockingWindow,
+ DeckTitleBar& rDeckTitleBar,
const tools::Rectangle& rAvailableSpace)
{
- if (static_cast<DockingWindow*>(rDeckTitleBar.GetParent()->GetParent())->IsFloatingMode())
+ if (pDockingWindow->IsFloatingMode())
{
// When the side bar is undocked then the outer system window displays the deck title.
- rDeckTitleBar.Hide();
+ rDeckTitleBar.Show(false);
return rAvailableSpace;
}
else
{
- const sal_Int32 nDeckTitleBarHeight (Theme::GetInteger(Theme::Int_DeckTitleBarHeight) * rDeckTitleBar.GetDPIScaleFactor());
- rDeckTitleBar.setPosSizePixel(
- rAvailableSpace.Left(),
- rAvailableSpace.Top(),
- rAvailableSpace.GetWidth(),
- nDeckTitleBarHeight);
- rDeckTitleBar.Show();
+ rDeckTitleBar.Show(true);
+ const sal_Int32 nDeckTitleBarHeight(rDeckTitleBar.get_preferred_size().Height());
return tools::Rectangle(
rAvailableSpace.Left(),
rAvailableSpace.Top() + nDeckTitleBarHeight,
@@ -576,19 +513,14 @@ tools::Rectangle PlaceDeckTitle (
}
tools::Rectangle PlaceVerticalScrollBar (
- ScrollBar& rVerticalScrollBar,
+ weld::ScrolledWindow& rVerticalScrollBar,
const tools::Rectangle& rAvailableSpace,
const bool bShowVerticalScrollBar)
{
if (bShowVerticalScrollBar)
{
- const sal_Int32 nScrollBarWidth (rVerticalScrollBar.GetSizePixel().Width());
- rVerticalScrollBar.setPosSizePixel(
- rAvailableSpace.Right() - nScrollBarWidth + 1,
- rAvailableSpace.Top(),
- nScrollBarWidth,
- rAvailableSpace.GetHeight());
- rVerticalScrollBar.Show();
+ const sal_Int32 nScrollBarWidth(rVerticalScrollBar.get_scroll_thickness());
+ rVerticalScrollBar.set_vpolicy(VclPolicyType::ALWAYS);
return tools::Rectangle(
rAvailableSpace.Left(),
rAvailableSpace.Top(),
@@ -597,44 +529,20 @@ tools::Rectangle PlaceVerticalScrollBar (
}
else
{
- rVerticalScrollBar.Hide();
+ rVerticalScrollBar.set_vpolicy(VclPolicyType::NEVER);
return rAvailableSpace;
}
}
void SetupVerticalScrollBar(
- ScrollBar& rVerticalScrollBar,
+ weld::ScrolledWindow& rVerticalScrollBar,
const sal_Int32 nContentHeight,
const sal_Int32 nVisibleHeight)
{
OSL_ASSERT(nContentHeight > nVisibleHeight);
- rVerticalScrollBar.SetRangeMin(0);
- rVerticalScrollBar.SetRangeMax(nContentHeight-1);
- rVerticalScrollBar.SetVisibleSize(nVisibleHeight);
-}
-
-void UpdateFiller (
- vcl::Window& rFiller,
- const tools::Rectangle& rBox)
-{
- if (comphelper::LibreOfficeKit::isActive())
- {
- // Not shown on LOK, and causes invalidation thrash
- rFiller.Hide();
- }
- else if (rBox.GetHeight() > 0)
- {
- // Show the filler.
- rFiller.SetBackground(Theme::GetColor(Theme::Color_PanelBackground));
- rFiller.SetPosSizePixel(rBox.TopLeft(), rBox.GetSize());
- rFiller.Show();
- }
- else
- {
- // Hide the filler.
- rFiller.Hide();
- }
+ rVerticalScrollBar.vadjustment_set_upper(nContentHeight-1);
+ rVerticalScrollBar.vadjustment_set_page_size(nVisibleHeight);
}
}
diff --git a/sfx2/source/sidebar/DeckTitleBar.cxx b/sfx2/source/sidebar/DeckTitleBar.cxx
index c797fc274f78..0124a651ab70 100644
--- a/sfx2/source/sidebar/DeckTitleBar.cxx
+++ b/sfx2/source/sidebar/DeckTitleBar.cxx
@@ -58,46 +58,30 @@ public:
};
DeckTitleBar::DeckTitleBar (const OUString& rsTitle,
- vcl::Window* pParentWindow,
+ weld::Builder& rBuilder,
const std::function<void()>& rCloserAction)
- : TitleBar(pParentWindow, "sfx/ui/decktitlebar.ui", "DeckTitleBar",
- Theme::Color_DeckTitleBarBackground)
+ : TitleBar(rBuilder, Theme::Color_DeckTitleBarBackground)
, mxGripWidget(new GripWidget)
- , mxGripWeld(new weld::CustomWeld(*m_xBuilder, "grip", *mxGripWidget))
- , mxLabel(m_xBuilder->weld_label("label"))
+ , mxGripWeld(new weld::CustomWeld(rBuilder, "grip", *mxGripWidget))
+ , mxLabel(rBuilder.weld_label("label"))
, maCloserAction(rCloserAction)
, mbIsCloserVisible(false)
{
mxLabel->set_label(rsTitle);
mxGripWidget->SetPointer(PointerStyle::Move);
- OSL_ASSERT(pParentWindow != nullptr);
-
if (maCloserAction)
SetCloserVisible(true);
-
-#ifdef DEBUG
- SetText(OUString("DeckTitleBar"));
-#endif
}
DeckTitleBar::~DeckTitleBar()
{
- disposeOnce();
-}
-
-void DeckTitleBar::dispose()
-{
- mxLabel.reset();
- mxGripWeld.reset();
- mxGripWidget.reset();
- TitleBar::dispose();
}
tools::Rectangle DeckTitleBar::GetDragArea()
{
int x, y, width, height;
- if (mxGripWidget->GetDrawingArea()->get_extents_relative_to(*m_xContainer, x, y, width, height))
+ if (mxGripWidget->GetDrawingArea()->get_extents_relative_to(*mxTitlebar, x, y, width, height))
return tools::Rectangle(Point(x, y), Size(width, height));
return tools::Rectangle();
}
@@ -138,10 +122,10 @@ void DeckTitleBar::HandleToolBoxItemClick()
maCloserAction();
}
-void DeckTitleBar::DataChanged (const DataChangedEvent& rEvent)
+void DeckTitleBar::DataChanged()
{
mxToolBox->set_item_icon_name("button", "sfx2/res/closedoc.png");
- TitleBar::DataChanged(rEvent);
+ TitleBar::DataChanged();
}
} // end of namespace sfx2::sidebar
diff --git a/sfx2/source/sidebar/FocusManager.cxx b/sfx2/source/sidebar/FocusManager.cxx
index 2f05308e5ce5..ebdc03939d66 100644
--- a/sfx2/source/sidebar/FocusManager.cxx
+++ b/sfx2/source/sidebar/FocusManager.cxx
@@ -18,13 +18,13 @@
*/
#include <sfx2/sidebar/FocusManager.hxx>
+#include <sfx2/sidebar/Deck.hxx>
#include <sfx2/sidebar/Panel.hxx>
#include <sidebar/DeckTitleBar.hxx>
#include <sidebar/PanelTitleBar.hxx>
#include <sidebar/TitleBar.hxx>
#include <vcl/event.hxx>
-#include <vcl/svapp.hxx>
-#include <toolkit/helper/vclunohelper.hxx>
+#include <vcl/weld.hxx>
namespace sfx2::sidebar {
@@ -35,7 +35,7 @@ FocusManager::FocusLocation::FocusLocation (const PanelComponent eComponent, con
}
FocusManager::FocusManager(const std::function<void(const Panel&)>& rShowPanelFunctor)
- : mpDeckTitleBar(),
+ : mpDeckTitleBar(nullptr),
maPanels(),
maButtons(),
maShowPanelFunctor(rShowPanelFunctor)
@@ -59,14 +59,14 @@ void FocusManager::GrabFocusPanel()
void FocusManager::Clear()
{
- SetDeckTitle(nullptr);
+ SetDeck(nullptr);
ClearPanels();
ClearButtons();
}
void FocusManager::ClearPanels()
{
- std::vector<VclPtr<Panel> > aPanels;
+ SharedPanelContainer aPanels;
aPanels.swap(maPanels);
for (auto const& panel : aPanels)
{
@@ -76,7 +76,8 @@ void FocusManager::ClearPanels()
UnregisterWindow(panel->GetTitleBar()->GetExpander());
}
- panel->RemoveChildEventListener(LINK(this, FocusManager, ChildEventListener));
+ weld::Container* pContents = panel->GetContents();
+ UnregisterWindow(*pContents);
}
}
@@ -90,12 +91,13 @@ void FocusManager::ClearButtons()
}
}
-void FocusManager::SetDeckTitle (DeckTitleBar* pDeckTitleBar)
+void FocusManager::SetDeck(Deck* pDeck)
{
+ DeckTitleBar* pDeckTitleBar = pDeck ? pDeck->GetTitleBar() : nullptr;
if (mpDeckTitleBar != nullptr)
UnregisterWindow(mpDeckTitleBar->GetToolBox());
+ mxDeck = pDeck;
mpDeckTitleBar = pDeckTitleBar;
-
if (mpDeckTitleBar != nullptr)
RegisterWindow(mpDeckTitleBar->GetToolBox());
}
@@ -111,10 +113,11 @@ void FocusManager::SetPanels (const SharedPanelContainer& rPanels)
RegisterWindow(panel->GetTitleBar()->GetExpander());
}
- // Register also as child event listener at the panel.
- panel->AddChildEventListener(LINK(this, FocusManager, ChildEventListener));
+ // Register also as key event listener at the panel.
+ weld::Container* pContents = panel->GetContents();
+ RegisterWindow(*pContents);
- maPanels.emplace_back(panel.get());
+ maPanels.emplace_back(panel);
}
}
@@ -139,18 +142,6 @@ void FocusManager::UnregisterWindow(weld::Widget& rWidget)
rWidget.connect_key_press(Link<const KeyEvent&, bool>());
}
-FocusManager::FocusLocation FocusManager::GetFocusLocation (const vcl::Window& rWindow) const
-{
- // Search the panels.
- for (size_t nIndex = 0; nIndex < maPanels.size(); ++nIndex)
- {
- if (maPanels[nIndex] == &rWindow)
- return FocusLocation(PC_PanelContent, nIndex);
- }
-
- return FocusLocation(PC_None, -1);
-}
-
FocusManager::FocusLocation FocusManager::GetFocusLocation() const
{
// Check the deck title.
@@ -167,6 +158,9 @@ FocusManager::FocusLocation FocusManager::GetFocusLocation() const
return FocusLocation(PC_PanelTitle, nIndex);
if (pTitleBar->GetToolBox().has_focus())
return FocusLocation(PC_PanelToolBox, nIndex);
+ weld::Container* pContents = maPanels[nIndex]->GetContents();
+ if (pContents->has_child_focus())
+ return FocusLocation(PC_PanelContent, nIndex);
}
// Search the buttons.
@@ -204,7 +198,7 @@ bool FocusManager::IsPanelTitleVisible (const sal_Int32 nPanelIndex) const
if (nPanelIndex<0 || nPanelIndex>=static_cast<sal_Int32>(maPanels.size()))
return false;
- TitleBarBase* pTitleBar = maPanels[nPanelIndex]->GetTitleBar();
+ TitleBar* pTitleBar = maPanels[nPanelIndex]->GetTitleBar();
if (!pTitleBar)
return false;
return pTitleBar->GetVisible();
@@ -247,14 +241,13 @@ void FocusManager::FocusPanel (
maShowPanelFunctor(rPanel);
}
-void FocusManager::FocusPanelContent (const sal_Int32 nPanelIndex)
+void FocusManager::FocusPanelContent(const sal_Int32 nPanelIndex)
{
if (!maPanels[nPanelIndex]->IsExpanded())
maPanels[nPanelIndex]->SetExpanded(true);
- VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow(maPanels[nPanelIndex]->GetElementWindow());
- if (pWindow)
- pWindow->GrabFocus();
+ weld::Container* pContents = maPanels[nPanelIndex]->GetContents();
+ pContents->child_grab_focus();
}
void FocusManager::FocusButton (const sal_Int32 nButtonIndex)
@@ -262,21 +255,6 @@ void FocusManager::FocusButton (const sal_Int32 nButtonIndex)
maButtons[nButtonIndex]->grab_focus();
}
-void FocusManager::RemoveWindow (vcl::Window& rWindow)
-{
- auto iPanel (::std::find(maPanels.begin(), maPanels.end(), &rWindow));
- if (iPanel != maPanels.end())
- {
- if ((*iPanel)->GetTitleBar() != nullptr)
- {
- UnregisterWindow((*iPanel)->GetTitleBar()->GetToolBox());
- UnregisterWindow((*iPanel)->GetTitleBar()->GetExpander());
- }
- maPanels.erase(iPanel);
- return;
- }
-}
-
void FocusManager::MoveFocusInsidePanel (
const FocusLocation& rFocusLocation,
const sal_Int32 nDirection)
@@ -303,10 +281,11 @@ void FocusManager::MoveFocusInsidePanel (
}
}
-void FocusManager::MoveFocusInsideDeckTitle (
+bool FocusManager::MoveFocusInsideDeckTitle (
const FocusLocation& rFocusLocation,
const sal_Int32 nDirection)
{
+ bool bConsumed = false;
// Note that when the title bar of the first (and only) panel is
// not visible then the deck title takes its place and the focus
// is moved between a) deck closer and b) content of panel 0.
@@ -314,11 +293,15 @@ void FocusManager::MoveFocusInsideDeckTitle (
{
case PC_DeckToolBox:
if (nDirection>0 && ! IsPanelTitleVisible(0))
+ {
FocusPanelContent(0);
+ bConsumed = true;
+ }
break;
default: break;
}
+ return bConsumed;
}
bool FocusManager::HandleKeyEvent(
@@ -337,15 +320,21 @@ bool FocusManager::HandleKeyEvent(
case PC_PanelTitle:
case PC_PanelToolBox:
{
- vcl::Window* pFocusWin = Application::GetFocusWindow();
- if (pFocusWin)
+ if (mxDeck)
{
- pFocusWin->GrabFocusToDocument();
+ mxDeck->GrabFocusToDocument();
bConsumed = true;
}
break;
}
-
+ case PC_PanelContent:
+ // Return focus to tab bar sidebar settings button or panel title.
+ if (!IsDeckTitleVisible() && maPanels.size() == 1)
+ FocusButton(0);
+ else
+ FocusPanel(aLocation.mnIndex, true);
+ bConsumed = true;
+ break;
default:
break;
}
@@ -380,19 +369,31 @@ bool FocusManager::HandleKeyEvent(
{
case PC_PanelTitle:
case PC_PanelToolBox:
- case PC_PanelContent:
MoveFocusInsidePanel(aLocation, nDirection);
bConsumed = true;
break;
case PC_DeckToolBox:
- MoveFocusInsideDeckTitle(aLocation, nDirection);
+ bConsumed = MoveFocusInsideDeckTitle(aLocation, nDirection);
+ break;
+
+ case PC_TabBar:
+ if (rKeyCode.IsShift())
+ FocusPanel(maPanels.size()-1, true);
+ else
+ {
+ if (IsDeckTitleVisible())
+ FocusDeckTitle();
+ else
+ FocusPanel(0, true);
+ }
bConsumed = true;
break;
default:
break;
}
+ fprintf(stderr, "seen here, consumed %d\n", bConsumed);
break;
}
@@ -402,7 +403,6 @@ bool FocusManager::HandleKeyEvent(
{
case PC_PanelTitle:
case PC_PanelToolBox:
- case PC_PanelContent:
// Go to previous panel or the deck title.
if (aLocation.mnIndex > 0)
FocusPanel(aLocation.mnIndex-1, true);
@@ -452,7 +452,6 @@ bool FocusManager::HandleKeyEvent(
{
case PC_PanelTitle:
case PC_PanelToolBox:
- case PC_PanelContent:
// Go to next panel.
if (aLocation.mnIndex < static_cast<sal_Int32>(maPanels.size())-1)
FocusPanel(aLocation.mnIndex+1, false);
@@ -503,56 +502,6 @@ IMPL_LINK(FocusManager, KeyInputHdl, const KeyEvent&, rKeyEvent, bool)
return HandleKeyEvent(rKeyEvent.GetKeyCode(), GetFocusLocation());
}
-IMPL_LINK(FocusManager, ChildEventListener, VclWindowEvent&, rEvent, void)
-{
- vcl::Window* pSource = rEvent.GetWindow();
- if (pSource == nullptr)
- return;
-
- switch (rEvent.GetId())
- {
- case VclEventId::WindowKeyInput:
- {
- KeyEvent* pKeyEvent = static_cast<KeyEvent*>(rEvent.GetData());
-
- // Go up the window hierarchy to find out whether the
- // parent of the event source is known to us.
- vcl::Window* pWindow = pSource;
- FocusLocation aLocation (PC_None, -1);
- while (true)
- {
- if (pWindow == nullptr)
- break;
- aLocation = GetFocusLocation(*pWindow);
- if (aLocation.meComponent != PC_None)
- break;
- pWindow = pWindow->GetParent();
- }
-
- if (aLocation.meComponent != PC_None)
- {
- switch (pKeyEvent->GetKeyCode().GetCode())
- {
- case KEY_ESCAPE:
- // Return focus to tab bar sidebar settings button or panel title.
- if (!IsDeckTitleVisible() && maPanels.size() == 1)
- FocusButton(0);
- else
- FocusPanel(aLocation.mnIndex, true);
- break;
-
- default:
- break;
- }
- }
- return;
- }
-
- default:
- break;
- }
-}
-
} // end of namespace sfx2::sidebar
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/sidebar/Panel.cxx b/sfx2/source/sidebar/Panel.cxx
index 3d03beb2e9a0..471a5f2b9507 100644
--- a/sfx2/source/sidebar/Panel.cxx
+++ b/sfx2/source/sidebar/Panel.cxx
@@ -45,56 +45,77 @@ using namespace css::uno;
namespace sfx2::sidebar {
Panel::Panel(const PanelDescriptor& rPanelDescriptor,
- vcl::Window* pParentWindow,
+ weld::Widget* pParentWindow,
const bool bIsInitiallyExpanded,
- const std::function<void()>& rDeckLayoutTrigger,
+ Deck* pDeck,
const std::function<Context()>& rContextAccess,
const css::uno::Reference<css::frame::XFrame>& rxFrame)
- : InterimItemWindow(pParentWindow, "sfx/ui/panel.ui", "Panel")
+ : mxBuilder(Application::CreateBuilder(pParentWindow, "sfx/ui/panel.ui"))
, msPanelId(rPanelDescriptor.msId)
+ , msTitle(rPanelDescriptor.msTitle)
, mbIsTitleBarOptional(rPanelDescriptor.mbIsTitleBarOptional)
, mbWantsAWT(rPanelDescriptor.mbWantsAWT)
, mxElement()
, mxPanelComponent()
, mbIsExpanded(bIsInitiallyExpanded)
, mbLurking(false)
- , maDeckLayoutTrigger(rDeckLayoutTrigger)
, maContextAccess(rContextAccess)
, mxFrame(rxFrame)
- , mxTitleBar(new PanelTitleBar(rPanelDescriptor.msTitle, *m_xBuilder, this))
- , mxContents(m_xBuilder->weld_container("contents"))
+ , mpParentWindow(pParentWindow)
+ , mxDeck(pDeck)
+ , mxContainer(mxBuilder->weld_container("Panel"))
+ , mxTitleBar(new PanelTitleBar(rPanelDescriptor.msTitle, *mxBuilder, this))
+ , mxContents(mxBuilder->weld_container("contents"))
{
- SetText(rPanelDescriptor.msTitle);
mxContents->set_visible(mbIsExpanded);
+ mxContainer->connect_get_property_tree(LINK(this, Panel, DumpAsPropertyTreeHdl));
}
-Panel::~Panel()
+bool Panel::get_extents(tools::Rectangle &rExtents) const
{
- disposeOnce();
- assert(!mxTitleBar);
+ // Get vertical extent of the panel.
+ int x, y, width, height;
+ if (mxContainer->get_extents_relative_to(*mpParentWindow, x, y, width, height))
+ {
+ rExtents = tools::Rectangle(Point(x, y), Size(width, height));
+ return true;
+ }
+ return false;
}
-void Panel::SetLurkMode(bool bLurk)
+void Panel::SetHeightPixel(int nHeight)
{
- // cf. DeckLayouter
- mbLurking = bLurk;
+ mxContainer->set_size_request(-1, nHeight);
+}
+
+void Panel::set_margin_top(int nMargin)
+{
+ mxContainer->set_margin_top(nMargin);
+}
+
+void Panel::set_margin_bottom(int nMargin)
+{
+ mxContainer->set_margin_bottom(nMargin);
+}
+
+void Panel::set_vexpand(bool bExpand)
+{
+ mxContainer->set_vexpand(bExpand);
}
-void Panel::ApplySettings(vcl::RenderContext& rRenderContext)
+void Panel::SetLurkMode(bool bLurk)
{
- rRenderContext.SetBackground(Theme::GetColor(Theme::Color_PanelBackground));
+ // cf. DeckLayouter
+ mbLurking = bLurk;
}
-void Panel::DumpAsPropertyTree(tools::JsonWriter& rJsonWriter)
+IMPL_LINK(Panel, DumpAsPropertyTreeHdl, tools::JsonWriter&, rJsonWriter, void)
{
if (!IsLurking())
- {
- InterimItemWindow::DumpAsPropertyTree(rJsonWriter);
rJsonWriter.put("type", "panel");
- }
}
-void Panel::dispose()
+Panel::~Panel()
{
mxPanelComponent = nullptr;
@@ -120,7 +141,7 @@ void Panel::dispose()
}
mxContents.reset();
- InterimItemWindow::dispose();
+ assert(!mxTitleBar);
}
PanelTitleBar* Panel::GetTitleBar() const
@@ -128,9 +149,14 @@ PanelTitleBar* Panel::GetTitleBar() const
return mxTitleBar.get();
}
-void Panel::ShowTitlebar(bool bShowTitlebar)
+weld::Container* Panel::GetContents() const
+{
+ return mxContents.get();
+}
+
+void Panel::Show(bool bShow)
{
- mxTitleBar->Show(bShowTitlebar);
+ mxContainer->set_visible(bShow);
}
void Panel::SetUIElement (const Reference<ui::XUIElement>& rxElement)
@@ -146,6 +172,16 @@ void Panel::SetUIElement (const Reference<ui::XUIElement>& rxElement)
pPanelBase->SetParentPanel(this);
}
+void Panel::TriggerDeckLayouting()
+{
+ mxDeck->RequestLayout();
+}
+
+weld::Window* Panel::GetFrameWeld()
+{
+ return mxDeck->GetFrameWeld();
+}
+
void Panel::SetExpanded (const bool bIsExpanded)
{
SidebarController* pSidebarController = SidebarController::GetSidebarControllerForFrame(mxFrame);
@@ -155,7 +191,7 @@ void Panel::SetExpanded (const bool bIsExpanded)
mbIsExpanded = bIsExpanded;
mxTitleBar->UpdateExpandedState();
- maDeckLayoutTrigger();
+ TriggerDeckLayouting();
if (maContextAccess && pSidebarController)
{
@@ -173,9 +209,9 @@ bool Panel::HasIdPredicate (const OUString& rsId) const
return msPanelId == rsId;
}
-void Panel::DataChanged (const DataChangedEvent&)
+void Panel::DataChanged()
{
- Invalidate();
+ mxTitleBar->DataChanged();
}
Reference<awt::XWindow> Panel::GetElementWindow()
diff --git a/sfx2/source/sidebar/PanelLayout.cxx b/sfx2/source/sidebar/PanelLayout.cxx
index 3a47773175ce..271f4d8a6c36 100644
--- a/sfx2/source/sidebar/PanelLayout.cxx
+++ b/sfx2/source/sidebar/PanelLayout.cxx
@@ -19,6 +19,7 @@ using namespace sfx2::sidebar;
PanelLayout::PanelLayout(weld::Widget* pParent, const OString& rID, const OUString& rUIXMLDescription)
: m_xBuilder(Application::CreateBuilder(pParent, rUIXMLDescription))
, m_xContainer(m_xBuilder->weld_container(rID))
+ , m_pPanel(nullptr)
{
m_xContainer->set_background(Theme::GetColor(Theme::Color_PanelBackground));
m_xContainer->connect_get_property_tree(LINK(this, PanelLayout, DumpAsPropertyTreeHdl));
@@ -53,17 +54,17 @@ void PanelLayout::DataChanged(const DataChangedEvent& rEvent)
void PanelLayout::SetPanel(sfx2::sidebar::Panel* pPanel)
{
- m_xPanel = pPanel;
+ m_pPanel = pPanel;
}
weld::Window* PanelLayout::GetFrameWeld() const
{
- if (!m_xPanel)
+ if (!m_pPanel)
{
SAL_WARN("sfx.sidebar", "Expected a toplevel Panel to exist");
return nullptr;
}
- return m_xPanel->GetFrameWeld();
+ return m_pPanel->GetFrameWeld();
}
PanelLayout::~PanelLayout()
diff --git a/sfx2/source/sidebar/PanelTitleBar.cxx b/sfx2/source/sidebar/PanelTitleBar.cxx
index 54adda78aa29..112602cfef4b 100644
--- a/sfx2/source/sidebar/PanelTitleBar.cxx
+++ b/sfx2/source/sidebar/PanelTitleBar.cxx
@@ -39,16 +39,12 @@ namespace sfx2::sidebar {
PanelTitleBar::PanelTitleBar(const OUString& rsTitle,
weld::Builder& rBuilder,
Panel* pPanel)
- : TitleBarBase(rBuilder, Theme::Color_PanelTitleBarBackground),
- mxTitlebar(rBuilder.weld_container("titlebar")),
+ : TitleBar(rBuilder, Theme::Color_PanelTitleBarBackground),
mxExpander(rBuilder.weld_expander("expander")),
mpPanel(pPanel),
- mxFrame(),
msIdent("button"),
msMoreOptionsCommand()
{
- mxTitlebar->set_background(Theme::GetColor(meThemeItem));
-
mxExpander->set_label(rsTitle);
mxExpander->connect_expanded(LINK(this, PanelTitleBar, ExpandHdl));
@@ -61,11 +57,6 @@ PanelTitleBar::PanelTitleBar(const OUString& rsTitle,
#endif
}
-bool PanelTitleBar::GetVisible() const
-{
- return mxTitlebar->get_visible();
-}
-
void PanelTitleBar::SetTitle(const OUString& rsTitle)
{
mxExpander->set_label(rsTitle);
@@ -87,10 +78,8 @@ PanelTitleBar::~PanelTitleBar()
if (xComponent.is())
xComponent->dispose();
mxController.clear();
- mpPanel.clear();
+ mpPanel = nullptr;
mxExpander.reset();
- mxTitlebar.reset();
- reset();
}
void PanelTitleBar::SetMoreOptionsCommand(const OUString& rsCommandName,
@@ -104,7 +93,6 @@ void PanelTitleBar::SetMoreOptionsCommand(const OUString& rsCommandName,
mxToolBox->hide();
msMoreOptionsCommand = rsCommandName;
- mxFrame = rxFrame;
if (msMoreOptionsCommand.isEmpty())
return;
diff --git a/sfx2/source/sidebar/SidebarController.cxx b/sfx2/source/sidebar/SidebarController.cxx
index 5294525f1d4b..51304f07bc9d 100644
--- a/sfx2/source/sidebar/SidebarController.cxx
+++ b/sfx2/source/sidebar/SidebarController.cxx
@@ -471,8 +471,8 @@ void SidebarController::NotifyResize()
sal_Int32 nMinimalWidth = 0;
if (mpCurrentDeck && !mpCurrentDeck->isDisposed())
{
- VclPtr<DeckTitleBar> pTitleBar = mpCurrentDeck->GetTitleBar();
- if (pTitleBar && pTitleBar->IsVisible())
+ DeckTitleBar* pTitleBar = mpCurrentDeck->GetTitleBar();
+ if (pTitleBar && pTitleBar->GetVisible())
pTitleBar->SetCloserVisible(CanModifyChildWindowWidth());
nMinimalWidth = mpCurrentDeck->GetMinimalWidth();
}
@@ -732,37 +732,36 @@ void SidebarController::CreatePanels(const OUString& rDeckId, const Context& rCo
if ( ! bIsPanelVisible)
continue;
- Panel *const pPanel(pDeck->GetPanel(rPanelContexDescriptor.msId));
- if (pPanel != nullptr)
+ auto xOldPanel(pDeck->GetPanel(rPanelContexDescriptor.msId));
+ if (xOldPanel)
{
- pPanel->SetLurkMode(false);
- aNewPanels[nWriteIndex] = pPanel;
- pPanel->SetExpanded( rPanelContexDescriptor.mbIsInitiallyVisible );
+ xOldPanel->SetLurkMode(false);
+ aNewPanels[nWriteIndex] = xOldPanel;
+ xOldPanel->SetExpanded(rPanelContexDescriptor.mbIsInitiallyVisible);
++nWriteIndex;
}
else
{
- VclPtr<Panel> aPanel = CreatePanel(
- rPanelContexDescriptor.msId,
- pDeck->GetPanelParentWindow(),
- rPanelContexDescriptor.mbIsInitiallyVisible,
- rContext,
- pDeck);
- if (aPanel )
+ auto aPanel = CreatePanel(rPanelContexDescriptor.msId,
+ pDeck->GetPanelParentWindow(),
+ rPanelContexDescriptor.mbIsInitiallyVisible,
+ rContext,
+ pDeck);
+ if (aPanel)
+ {
+ aNewPanels[nWriteIndex] = std::move(aPanel);
+
+ // Depending on the context we have to change the command
+ // for the "more options" dialog.
+ PanelTitleBar* pTitleBar = aNewPanels[nWriteIndex]->GetTitleBar();
+ if (pTitleBar)
{
- aNewPanels[nWriteIndex] = aPanel;
-
- // Depending on the context we have to change the command
- // for the "more options" dialog.
- PanelTitleBar* pTitleBar = aNewPanels[nWriteIndex]->GetTitleBar();
- if (pTitleBar)
- {
- pTitleBar->SetMoreOptionsCommand(
- rPanelContexDescriptor.msMenuCommand,
- mxFrame, xController);
- }
- ++nWriteIndex;
+ pTitleBar->SetMoreOptionsCommand(
+ rPanelContexDescriptor.msMenuCommand,
+ mxFrame, xController);
}
+ ++nWriteIndex;
+ }
}
}
@@ -895,7 +894,7 @@ void SidebarController::SwitchToDeck (
// Tell the focus manager about the new panels and tab bar
// buttons.
- maFocusManager.SetDeckTitle(mpCurrentDeck->GetTitleBar());
+ maFocusManager.SetDeck(mpCurrentDeck);
maFocusManager.SetPanels(mpCurrentDeck->GetPanels());
mpTabBar->UpdateFocusManager(maFocusManager);
@@ -906,15 +905,15 @@ void SidebarController::notifyDeckTitle(const OUString& targetDeckId)
{
if (msCurrentDeckId == targetDeckId)
{
- maFocusManager.SetDeckTitle(mpCurrentDeck->GetTitleBar());
+ maFocusManager.SetDeck(mpCurrentDeck);
mpTabBar->UpdateFocusManager(maFocusManager);
UpdateTitleBarIcons();
}
}
-VclPtr<Panel> SidebarController::CreatePanel (
- const OUString& rsPanelId,
- vcl::Window* pParentWindow,
+std::shared_ptr<Panel> SidebarController::CreatePanel (
+ std::u16string_view rsPanelId,
+ weld::Widget* pParentWindow,
const bool bIsInitiallyExpanded,
const Context& rContext,
const VclPtr<Deck>& pDeck)
@@ -925,31 +924,31 @@ VclPtr<Panel> SidebarController::CreatePanel (
return nullptr;
// Create the panel which is the parent window of the UIElement.
- VclPtr<Panel> pPanel = VclPtr<Panel>::Create(
+ auto xPanel = std::make_shared<Panel>(
*xPanelDescriptor,
pParentWindow,
bIsInitiallyExpanded,
- [pDeck]() { return pDeck->RequestLayout(); },
+ pDeck,
[this]() { return this->GetCurrentContext(); },
mxFrame);
// Create the XUIElement.
Reference<ui::XUIElement> xUIElement (CreateUIElement(
- pPanel->GetElementParentWindow(),
+ xPanel->GetElementParentWindow(),
xPanelDescriptor->msImplementationURL,
xPanelDescriptor->mbWantsCanvas,
rContext));
if (xUIElement.is())
{
// Initialize the panel and add it to the active deck.
- pPanel->SetUIElement(xUIElement);
+ xPanel->SetUIElement(xUIElement);
}
else
{
- pPanel.disposeAndClear();
+ xPanel.reset();
}
- return pPanel;
+ return xPanel;
}
Reference<ui::XUIElement> SidebarController::CreateUIElement (
@@ -1570,9 +1569,7 @@ tools::Rectangle SidebarController::GetDeckDragArea() const
tools::Rectangle aRect;
if (mpCurrentDeck)
{
- VclPtr<DeckTitleBar> pTitleBar(mpCurrentDeck->GetTitleBar());
-
- if (pTitleBar)
+ if (DeckTitleBar* pTitleBar = mpCurrentDeck->GetTitleBar())
{
aRect = pTitleBar->GetDragArea();
}
diff --git a/sfx2/source/sidebar/TabBar.cxx b/sfx2/source/sidebar/TabBar.cxx
index d7f52741fd6e..48698bb00937 100644
--- a/sfx2/source/sidebar/TabBar.cxx
+++ b/sfx2/source/sidebar/TabBar.cxx
@@ -63,6 +63,8 @@ TabBar::TabBar(vcl::Window* pParentWindow,
, maPopupMenuProvider(rPopupMenuProvider)
, pParentSidebarController(rParentSidebarController)
{
+ InitControlBase(mxMenuButton.get());
+
mxTempToplevel->move(mxContents.get(), m_xContainer.get());
gDefaultWidth = m_xContainer->get_preferred_size().Width();
diff --git a/sfx2/source/sidebar/Theme.cxx b/sfx2/source/sidebar/Theme.cxx
index bd64a87b7907..dbbcabeadd55 100644
--- a/sfx2/source/sidebar/Theme.cxx
+++ b/sfx2/source/sidebar/Theme.cxx
@@ -130,14 +130,10 @@ void Theme::UpdateTheme()
try
{
const StyleSettings& rStyle (Application::GetSettings().GetStyleSettings());
- const bool bUseSystemColors (GetBoolean(Bool_UseSystemColors));
-
-#define Alternatives(n,hc,sys) (mbIsHighContrastMode ? hc : (bUseSystemColors ? sys : n))
Color aBaseBackgroundColor (rStyle.GetDialogColor());
// UX says this should be a little brighter, but that looks off when compared to the other windows.
//aBaseBackgroundColor.IncreaseLuminance(7);
- Color aBorderColor (aBaseBackgroundColor);
Color aSecondColor (aBaseBackgroundColor);
aSecondColor.DecreaseLuminance(15);
@@ -152,15 +148,6 @@ void Theme::UpdateTheme()
maPropertyIdToNameMap[Int_DeckSeparatorHeight],
Any(sal_Int32(1)));
setPropertyValue(
- maPropertyIdToNameMap[Color_DeckTitleFont],
- Any(sal_Int32(rStyle.GetFontColor().GetRGBColor())));
- setPropertyValue(
- maPropertyIdToNameMap[Int_DeckTitleBarHeight],
- Any(sal_Int32(Alternatives(
- 26,
- 26,
- rStyle.GetFloatTitleHeight()))));
- setPropertyValue(
maPropertyIdToNameMap[Color_PanelBackground],
Any(sal_Int32(aBaseBackgroundColor.GetRGBColor())));
@@ -168,39 +155,15 @@ void Theme::UpdateTheme()
maPropertyIdToNameMap[Color_PanelTitleBarBackground],
Any(sal_Int32(aSecondColor.GetRGBColor())));
setPropertyValue(
- maPropertyIdToNameMap[Color_PanelTitleFont],
- Any(sal_Int32(mbIsHighContrastMode ? 0x00ff00 : 0x262626)));
- setPropertyValue(
- maPropertyIdToNameMap[Int_PanelTitleBarHeight],
- Any(sal_Int32(Alternatives(
- 26,
- 26,
- rStyle.GetTitleHeight()))));
- setPropertyValue(
maPropertyIdToNameMap[Color_TabBarBackground],
Any(sal_Int32(aBaseBackgroundColor.GetRGBColor())));
setPropertyValue(
- maPropertyIdToNameMap[Color_DropDownBackground],
- Any(sal_Int32(aBaseBackgroundColor.GetRGBColor())));
-
- setPropertyValue(
maPropertyIdToNameMap[Color_Highlight],
Any(sal_Int32(rStyle.GetHighlightColor().GetRGBColor())));
setPropertyValue(
maPropertyIdToNameMap[Color_HighlightText],
Any(sal_Int32(rStyle.GetHighlightTextColor().GetRGBColor())));
-
- setPropertyValue(
- maPropertyIdToNameMap[Color_HorizontalBorder],
- Any(sal_Int32(aBorderColor.GetRGBColor())));
-
- setPropertyValue(
- maPropertyIdToNameMap[Color_VerticalBorder],
- Any(sal_Int32(aBorderColor.GetRGBColor())));
- setPropertyValue(
- maPropertyIdToNameMap[Image_CloseIndicator],
- Any(OUString("private:graphicrepository/cmd/lc_decrementlevel.png")));
}
catch(beans::UnknownPropertyException const &)
{
@@ -492,16 +455,6 @@ void Theme::SetupPropertyMaps()
maIntegers.resize(Int_Bool_ - Color_Int_ - 1);
maBooleans.resize(Post_Bool_ - Int_Bool_ - 1);
- maPropertyNameToIdMap["Image_CloseIndicator"]=Image_CloseIndicator;
- maPropertyIdToNameMap[Image_CloseIndicator]="Image_CloseIndicator";
-
-
- maPropertyNameToIdMap["Color_DeckTitleFont"]=Color_DeckTitleFont;
- maPropertyIdToNameMap[Color_DeckTitleFont]="Color_DeckTitleFont";
-
- maPropertyNameToIdMap["Color_PanelTitleFont"]=Color_PanelTitleFont;
- maPropertyIdToNameMap[Color_PanelTitleFont]="Color_PanelTitleFont";
-
maPropertyNameToIdMap["Color_Highlight"]=Color_Highlight;
maPropertyIdToNameMap[Color_Highlight]="Color_Highlight";
@@ -524,18 +477,6 @@ void Theme::SetupPropertyMaps()
maPropertyNameToIdMap["Color_TabBarBackground"]=Color_TabBarBackground;
maPropertyIdToNameMap[Color_TabBarBackground]="Color_TabBarBackground";
- maPropertyNameToIdMap["Color_HorizontalBorder"]=Color_HorizontalBorder;
- maPropertyIdToNameMap[Color_HorizontalBorder]="Color_HorizontalBorder";
-
- maPropertyNameToIdMap["Color_VerticalBorder"]=Color_VerticalBorder;
- maPropertyIdToNameMap[Color_VerticalBorder]="Color_VerticalBorder";
-
- maPropertyNameToIdMap["Color_DropDownBackground"]=Color_DropDownBackground;
- maPropertyIdToNameMap[Color_DropDownBackground]="Color_DropDownBackground";
-
-
- maPropertyNameToIdMap["Int_DeckTitleBarHeight"]=Int_DeckTitleBarHeight;
- maPropertyIdToNameMap[Int_DeckTitleBarHeight]="Int_DeckTitleBarHeight";
maPropertyNameToIdMap["Int_DeckBorderSize"]=Int_DeckBorderSize;
maPropertyIdToNameMap[Int_DeckBorderSize]="Int_DeckBorderSize";
@@ -543,9 +484,6 @@ void Theme::SetupPropertyMaps()
maPropertyNameToIdMap["Int_DeckSeparatorHeight"]=Int_DeckSeparatorHeight;
maPropertyIdToNameMap[Int_DeckSeparatorHeight]="Int_DeckSeparatorHeight";
- maPropertyNameToIdMap["Int_PanelTitleBarHeight"]=Int_PanelTitleBarHeight;
- maPropertyIdToNameMap[Int_PanelTitleBarHeight]="Int_PanelTitleBarHeight";
-
maPropertyNameToIdMap["Int_DeckLeftPadding"]=Int_DeckLeftPadding;
maPropertyIdToNameMap[Int_DeckLeftPadding]="Int_DeckLeftPadding";
@@ -572,11 +510,6 @@ Theme::PropertyType Theme::GetPropertyType (const ThemeItem eItem)
{
switch(eItem)
{
- case Image_CloseIndicator:
- return PT_Image;
-
- case Color_DeckTitleFont:
- case Color_PanelTitleFont:
case Color_Highlight:
case Color_HighlightText:
case Color_DeckBackground:
@@ -584,15 +517,10 @@ Theme::PropertyType Theme::GetPropertyType (const ThemeItem eItem)
case Color_PanelBackground:
case Color_PanelTitleBarBackground:
case Color_TabBarBackground:
- case Color_HorizontalBorder:
- case Color_VerticalBorder:
- case Color_DropDownBackground:
return PT_Color;
- case Int_DeckTitleBarHeight:
case Int_DeckBorderSize:
case Int_DeckSeparatorHeight:
- case Int_PanelTitleBarHeight:
case Int_DeckLeftPadding:
case Int_DeckTopPadding:
case Int_DeckRightPadding:
diff --git a/sfx2/source/sidebar/TitleBar.cxx b/sfx2/source/sidebar/TitleBar.cxx
index b88b4e92e1db..9dc13d3aa274 100644
--- a/sfx2/source/sidebar/TitleBar.cxx
+++ b/sfx2/source/sidebar/TitleBar.cxx
@@ -21,61 +21,58 @@
namespace sfx2::sidebar {
-TitleBarBase::TitleBarBase(weld::Builder& rBuilder, Theme::ThemeItem eThemeItem)
+TitleBar::TitleBar(weld::Builder& rBuilder, Theme::ThemeItem eThemeItem)
: mrBuilder(rBuilder)
+ , mxTitlebar(rBuilder.weld_container("titlebar"))
, mxAddonImage(rBuilder.weld_image("addonimage"))
, mxToolBox(rBuilder.weld_toolbar("toolbar"))
, meThemeItem(eThemeItem)
{
- mxToolBox->set_background(Theme::GetColor(meThemeItem));
+ SetBackground();
- mxToolBox->connect_clicked(LINK(this, TitleBarBase, SelectionHandler));
+ mxToolBox->connect_clicked(LINK(this, TitleBar, SelectionHandler));
}
-TitleBarBase::~TitleBarBase()
+void TitleBar::SetBackground()
{
+ Color aColor(Theme::GetColor(meThemeItem));
+ mxTitlebar->set_background(aColor);
+ mxToolBox->set_background(aColor);
}
-void TitleBarBase::reset()
+void TitleBar::DataChanged()
{
- mxToolBox.reset();
- mxAddonImage.reset();
+ SetBackground();
}
-void TitleBarBase::SetIcon(const css::uno::Reference<css::graphic::XGraphic>& rIcon)
+TitleBar::~TitleBar()
{
- mxAddonImage->set_image(rIcon);
- mxAddonImage->set_visible(rIcon.is());
}
-IMPL_LINK_NOARG(TitleBarBase, SelectionHandler, const OString&, void)
+Size TitleBar::get_preferred_size() const
{
- HandleToolBoxItemClick();
+ return mxTitlebar->get_preferred_size();
}
-TitleBar::TitleBar(vcl::Window* pParentWindow,
- const OUString& rUIXMLDescription, const OString& rID,
- Theme::ThemeItem eThemeItem)
- : InterimItemWindow(pParentWindow, rUIXMLDescription, rID)
- , TitleBarBase(*m_xBuilder, eThemeItem)
+void TitleBar::Show(bool bShow)
{
- m_xContainer->set_background(Theme::GetColor(meThemeItem));
+ mxTitlebar->set_visible(bShow);
}
-TitleBar::~TitleBar()
+bool TitleBar::GetVisible() const
{
- disposeOnce();
+ return mxTitlebar->get_visible();
}
-void TitleBar::dispose()
+void TitleBar::SetIcon(const css::uno::Reference<css::graphic::XGraphic>& rIcon)
{
- reset();
- InterimItemWindow::dispose();
+ mxAddonImage->set_image(rIcon);
+ mxAddonImage->set_visible(rIcon.is());
}
-void TitleBar::DataChanged (const DataChangedEvent& /*rEvent*/)
+IMPL_LINK_NOARG(TitleBar, SelectionHandler, const OString&, void)
{
- m_xContainer->set_background(Theme::GetColor(meThemeItem));
+ HandleToolBoxItemClick();
}
} // end of namespace sfx2::sidebar
diff --git a/sfx2/source/sidebar/UnoDeck.cxx b/sfx2/source/sidebar/UnoDeck.cxx
index 122afbe018a2..3af5c1c62b73 100644
--- a/sfx2/source/sidebar/UnoDeck.cxx
+++ b/sfx2/source/sidebar/UnoDeck.cxx
@@ -54,7 +54,7 @@ OUString SAL_CALL SfxUnoDeck::getTitle()
pDeck = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId)->mpDeck;
}
- VclPtr<DeckTitleBar> pTitleBar = pDeck->GetTitleBar();
+ DeckTitleBar* pTitleBar = pDeck->GetTitleBar();
return pTitleBar->GetTitle();
}
@@ -70,7 +70,7 @@ void SAL_CALL SfxUnoDeck::setTitle( const OUString& newTitle )
if (xDeckDescriptor)
{
Deck* pDeck = xDeckDescriptor->mpDeck;
- const VclPtr<DeckTitleBar>& pTitleBar = pDeck->GetTitleBar();
+ DeckTitleBar* pTitleBar = pDeck->GetTitleBar();
pTitleBar->SetTitle(newTitle);
xDeckDescriptor->msTitle = newTitle;
diff --git a/sfx2/source/sidebar/UnoPanel.cxx b/sfx2/source/sidebar/UnoPanel.cxx
index 1170cbce1674..802126873a7a 100644
--- a/sfx2/source/sidebar/UnoPanel.cxx
+++ b/sfx2/source/sidebar/UnoPanel.cxx
@@ -29,13 +29,13 @@ xFrame(rFrame),
mPanelId(panelId),
mDeckId(deckId),
mpDeck(),
-mpPanel()
+mxPanel()
{
SidebarController* pSidebarController = getSidebarController();
pSidebarController->CreateDeck(mDeckId); // creates deck object is not already
mpDeck = pSidebarController->GetResourceManager()->GetDeckDescriptor(mDeckId)->mpDeck;
- mpPanel = mpDeck->GetPanel(mPanelId);
+ mxPanel = mpDeck->GetPanel(mPanelId);
}
SidebarController* SfxUnoPanel::getSidebarController()
@@ -54,7 +54,8 @@ OUString SAL_CALL SfxUnoPanel::getTitle()
{
SolarMutexGuard aGuard;
- PanelTitleBar* pTitleBar = mpPanel->GetTitleBar();
+ auto xPanel = mxPanel.lock();
+ PanelTitleBar* pTitleBar = xPanel ? xPanel->GetTitleBar() : nullptr;
if (pTitleBar)
return pTitleBar->GetTitle();
else
@@ -71,7 +72,8 @@ void SAL_CALL SfxUnoPanel::setTitle( const OUString& newTitle )
if (xPanelDescriptor)
{
xPanelDescriptor->msTitle = newTitle;
- PanelTitleBar* pTitleBar = mpPanel->GetTitleBar();
+ auto xPanel = mxPanel.lock();
+ PanelTitleBar* pTitleBar = xPanel ? xPanel->GetTitleBar() : nullptr;
if (pTitleBar)
pTitleBar->SetTitle(newTitle);
}
@@ -81,7 +83,8 @@ sal_Bool SAL_CALL SfxUnoPanel::isExpanded()
{
SolarMutexGuard aGuard;
- return mpPanel->IsExpanded();
+ auto xPanel = mxPanel.lock();
+ return xPanel && xPanel->IsExpanded();
}
@@ -90,7 +93,9 @@ void SAL_CALL SfxUnoPanel::expand( const sal_Bool bCollapseOther )
SolarMutexGuard aGuard;
- mpPanel->SetExpanded(true);
+ auto xPanel = mxPanel.lock();
+ if (xPanel)
+ xPanel->SetExpanded(true);
if (bCollapseOther)
{
@@ -111,7 +116,9 @@ void SAL_CALL SfxUnoPanel::collapse()
{
SolarMutexGuard aGuard;
- mpPanel->SetExpanded(false);
+ auto xPanel = mxPanel.lock();
+ if (xPanel)
+ xPanel->SetExpanded(false);
SidebarController* pSidebarController = getSidebarController();
pSidebarController->NotifyResize();
}
@@ -120,10 +127,10 @@ uno::Reference<awt::XWindow> SAL_CALL SfxUnoPanel::getDialog()
{
SolarMutexGuard aGuard;
- return mpPanel->GetElementWindow();
+ auto xPanel = mxPanel.lock();
+ return xPanel ? xPanel->GetElementWindow() : nullptr;
}
-
sal_Int32 SAL_CALL SfxUnoPanel::getOrderIndex()
{
SolarMutexGuard aGuard;
diff --git a/sfx2/uiconfig/ui/deck.ui b/sfx2/uiconfig/ui/deck.ui
new file mode 100644
index 000000000000..61ad555c1cb3
--- /dev/null
+++ b/sfx2/uiconfig/ui/deck.ui
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sfx">
+ <requires lib="gtk+" version="3.20"/>
+ <!-- n-columns=1 n-rows=2 -->
+ <object class="GtkGrid" id="Deck">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="contents">
+ <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>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="titlebar">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">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="icon-name">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="can-focus">False</property>
+ <property name="no-show-all">True</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="tooltip-text" translatable="yes" context="deck|SFX_STR_SIDEBAR_CLOSE_DECK">Close Sidebar Deck</property>
+ <property name="use-underline">True</property>
+ <property name="icon-name">sfx2/res/closedoc.png</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="button-atkobject">
+ <property name="AtkObject::accessible-name" translatable="yes" context="deck|SFX_STR_SIDEBAR_CLOSE_DECK">Close Sidebar Deck</property>
+ </object>
+ </child>
+ </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>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sfx2/uiconfig/ui/decktitlebar.ui b/sfx2/uiconfig/ui/decktitlebar.ui
deleted file mode 100644
index f7a706aae306..000000000000
--- a/sfx2/uiconfig/ui/decktitlebar.ui
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2 -->
-<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="icon-name">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="can-focus">False</property>
- <property name="no-show-all">True</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/panel.ui b/sfx2/uiconfig/ui/panel.ui
index 689236e2eb28..b2c5f9258fec 100644
--- a/sfx2/uiconfig/ui/panel.ui
+++ b/sfx2/uiconfig/ui/panel.ui
@@ -6,7 +6,6 @@
<object class="GtkGrid" id="Panel">
<property name="visible">True</property>
<property name="can-focus">False</property>
- <property name="vexpand">True</property>
<child>
<object class="GtkBox" id="titlebar">
<property name="visible">True</property>
@@ -72,12 +71,12 @@
<object class="GtkToolButton" id="button">
<property name="visible">True</property>
<property name="can-focus">False</property>
- <property name="tooltip-text" translatable="yes" context="paneltitlebar|SFX_STR_SIDEBAR_MORE_OPTIONS">More Options</property>
+ <property name="tooltip-text" translatable="yes" context="panel|SFX_STR_SIDEBAR_MORE_OPTIONS">More Options</property>
<property name="use-underline">True</property>
<property name="icon-name">sfx2/res/symphony/morebutton.png</property>
<child internal-child="accessible">
<object class="AtkObject" id="button-atkobject">
- <property name="AtkObject::accessible-name" translatable="yes" context="paneltitlebar|SFX_STR_SIDEBAR_MORE_OPTIONS">More Options</property>
+ <property name="AtkObject::accessible-name" translatable="yes" context="panel|SFX_STR_SIDEBAR_MORE_OPTIONS">More Options</property>
</object>
</child>
</object>
@@ -107,7 +106,6 @@
<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>
<placeholder/>
diff --git a/solenv/sanitizers/ui/sfx.suppr b/solenv/sanitizers/ui/sfx.suppr
index 2e36d5228275..e9358dabf17b 100644
--- a/solenv/sanitizers/ui/sfx.suppr
+++ b/solenv/sanitizers/ui/sfx.suppr
@@ -10,9 +10,8 @@ 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/deck.ui://GtkImage[@id='addonimage'] no-labelled-by
+sfx2/uiconfig/ui/deck.ui://GtkLabel[@id='label'] orphan-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
diff --git a/svx/source/sidebar/area/AreaPropertyPanelBase.cxx b/svx/source/sidebar/area/AreaPropertyPanelBase.cxx
index 6ba32783b426..ffcaf142d012 100644
--- a/svx/source/sidebar/area/AreaPropertyPanelBase.cxx
+++ b/svx/source/sidebar/area/AreaPropertyPanelBase.cxx
@@ -437,8 +437,8 @@ IMPL_LINK_NOARG(AreaPropertyPanelBase, SelectFillTypeHdl, weld::ComboBox&, void)
meLastXFS = static_cast<sal_uInt16>(nPos);
- if (m_xPanel)
- m_xPanel->TriggerDeckLayouting();
+ if (m_pPanel)
+ m_pPanel->TriggerDeckLayouting();
}
IMPL_LINK_NOARG(AreaPropertyPanelBase, SelectFillColorHdl, ColorListBox&, void)
@@ -596,8 +596,8 @@ void AreaPropertyPanelBase::SelectFillAttrHdl_Impl()
break;
}
}
- if (m_xPanel)
- m_xPanel->TriggerDeckLayouting();
+ if (m_pPanel)
+ m_pPanel->TriggerDeckLayouting();
}
void AreaPropertyPanelBase::ImpUpdateTransparencies()
@@ -852,8 +852,8 @@ void AreaPropertyPanelBase::updateFillStyle(bool bDisabled, bool bDefaultOrSet,
mxToolBoxColor->hide();
meLastXFS = static_cast<sal_uInt16>(-1);
mpStyleItem.reset();
- if (m_xPanel)
- m_xPanel->TriggerDeckLayouting();
+ if (m_pPanel)
+ m_pPanel->TriggerDeckLayouting();
}
void AreaPropertyPanelBase::updateFillGradient(bool bDisabled, bool bDefaultOrSet, const SfxPoolItem* pState)
@@ -893,8 +893,8 @@ void AreaPropertyPanelBase::updateFillGradient(bool bDisabled, bool bDefaultOrSe
mxLbFillGradTo->SetNoSelection();
}
}
- if (m_xPanel)
- m_xPanel->TriggerDeckLayouting();
+ if (m_pPanel)
+ m_pPanel->TriggerDeckLayouting();
}
void AreaPropertyPanelBase::updateFillHatch(bool bDisabled, bool bDefaultOrSet, const SfxPoolItem* pState)
@@ -926,8 +926,8 @@ void AreaPropertyPanelBase::updateFillHatch(bool bDisabled, bool bDefaultOrSet,
mxLbFillAttr->set_active(-1);
}
}
- if (m_xPanel)
- m_xPanel->TriggerDeckLayouting();
+ if (m_pPanel)
+ m_pPanel->TriggerDeckLayouting();
}
void AreaPropertyPanelBase::updateFillColor(bool bDefaultOrSet, const SfxPoolItem* pState)
@@ -945,8 +945,8 @@ void AreaPropertyPanelBase::updateFillColor(bool bDefaultOrSet, const SfxPoolIte
mxLbFillType->set_active(SOLID);
Update();
}
- if (m_xPanel)
- m_xPanel->TriggerDeckLayouting();
+ if (m_pPanel)
+ m_pPanel->TriggerDeckLayouting();
}
void AreaPropertyPanelBase::updateFillBitmap(bool bDisabled, bool bDefaultOrSet, const SfxPoolItem* pState)
@@ -980,8 +980,8 @@ void AreaPropertyPanelBase::updateFillBitmap(bool bDisabled, bool bDefaultOrSet,
mxLbFillAttr->set_active(-1);
}
}
- if (m_xPanel)
- m_xPanel->TriggerDeckLayouting();
+ if (m_pPanel)
+ m_pPanel->TriggerDeckLayouting();
}
void AreaPropertyPanelBase::NotifyItemUpdate(
@@ -1248,8 +1248,8 @@ void AreaPropertyPanelBase::Update()
OSL_ENSURE(false, "Non supported FillType (!)");
break;
}
- if (m_xPanel)
- m_xPanel->TriggerDeckLayouting();
+ if (m_pPanel)
+ m_pPanel->TriggerDeckLayouting();
}
IMPL_LINK_NOARG(AreaPropertyPanelBase, ModifyTransSliderHdl, weld::Scale&, void)