summaryrefslogtreecommitdiffstats
path: root/sfx2/source/sidebar/PanelLayout.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sfx2/source/sidebar/PanelLayout.cxx')
-rw-r--r--sfx2/source/sidebar/PanelLayout.cxx121
1 files changed, 121 insertions, 0 deletions
diff --git a/sfx2/source/sidebar/PanelLayout.cxx b/sfx2/source/sidebar/PanelLayout.cxx
new file mode 100644
index 000000000..6a3338192
--- /dev/null
+++ b/sfx2/source/sidebar/PanelLayout.cxx
@@ -0,0 +1,121 @@
+/* -*- 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/.
+ */
+
+#include <sfx2/sidebar/SidebarController.hxx>
+#include <sfx2/sidebar/TabBar.hxx>
+#include <sfx2/sidebar/PanelLayout.hxx>
+#include <vcl/layout.hxx>
+#include <vcl/accel.hxx>
+
+using namespace sfx2::sidebar;
+
+PanelLayout::PanelLayout(vcl::Window* pParent, const OString& rID, const OUString& rUIXMLDescription,
+ const css::uno::Reference<css::frame::XFrame> &rFrame)
+ : Control(pParent)
+ , m_bInClose(false)
+ , mxFrame(rFrame)
+{
+ m_aPanelLayoutIdle.SetPriority(TaskPriority::RESIZE);
+ m_aPanelLayoutIdle.SetInvokeHandler( LINK( this, PanelLayout, ImplHandlePanelLayoutTimerHdl ) );
+ m_aPanelLayoutIdle.SetDebugName("sfx2::PanelLayout m_aPanelLayoutIdle");
+
+ SetStyle(GetStyle() | WB_DIALOGCONTROL);
+
+ // Builder will trigger resize and start Idle
+ m_xVclContentArea = VclPtr<VclVBox>::Create(this);
+ m_xVclContentArea->Show();
+ m_xBuilder.reset(Application::CreateInterimBuilder(m_xVclContentArea, rUIXMLDescription));
+ m_xContainer = m_xBuilder->weld_container(rID);
+}
+
+PanelLayout::~PanelLayout()
+{
+ disposeOnce();
+}
+
+void PanelLayout::dispose()
+{
+ m_bInClose = true;
+ m_aPanelLayoutIdle.Stop();
+ m_xContainer.reset();
+ m_xBuilder.reset();
+ m_xVclContentArea.disposeAndClear();
+ Control::dispose();
+}
+
+Size PanelLayout::GetOptimalSize() const
+{
+ Size aSize = m_xContainer->get_preferred_size();
+
+ if (mxFrame)
+ {
+ SidebarController* pController
+ = SidebarController::GetSidebarControllerForFrame(mxFrame);
+ if (pController)
+ aSize.setWidth(std::min<long>(
+ aSize.Width(), (pController->getMaximumWidth() - TabBar::GetDefaultWidth())
+ * GetDPIScaleFactor()));
+ }
+
+ return aSize;
+}
+
+void PanelLayout::queue_resize(StateChangedType /*eReason*/)
+{
+ if (m_bInClose)
+ return;
+ if (m_aPanelLayoutIdle.IsActive())
+ return;
+ InvalidateSizeCache();
+ m_aPanelLayoutIdle.Start();
+}
+
+IMPL_LINK_NOARG( PanelLayout, ImplHandlePanelLayoutTimerHdl, Timer*, void )
+{
+ vcl::Window *pChild = GetWindow(GetWindowType::FirstChild);
+ assert(pChild);
+ VclContainer::setLayoutAllocation(*pChild, Point(0, 0), GetSizePixel());
+}
+
+void PanelLayout::setPosSizePixel(long nX, long nY, long nWidth, long nHeight, PosSizeFlags nFlags)
+{
+ bool bCanHandleSmallerWidth = false;
+ bool bCanHandleSmallerHeight = false;
+
+ vcl::Window *pChild = GetWindow(GetWindowType::FirstChild);
+
+ if (pChild->GetType() == WindowType::SCROLLWINDOW)
+ {
+ WinBits nStyle = pChild->GetStyle();
+ if (nStyle & (WB_AUTOHSCROLL | WB_HSCROLL))
+ bCanHandleSmallerWidth = true;
+ if (nStyle & (WB_AUTOVSCROLL | WB_VSCROLL))
+ bCanHandleSmallerHeight = true;
+ }
+
+ Size aSize(GetOptimalSize());
+ if (!bCanHandleSmallerWidth)
+ nWidth = std::max(nWidth,aSize.Width());
+ if (!bCanHandleSmallerHeight)
+ nHeight = std::max(nHeight,aSize.Height());
+
+ Control::setPosSizePixel(nX, nY, nWidth, nHeight, nFlags);
+
+ if (nFlags & PosSizeFlags::Size)
+ VclContainer::setLayoutAllocation(*pChild, Point(0, 0), Size(nWidth, nHeight));
+}
+
+bool PanelLayout::EventNotify(NotifyEvent& rNEvt)
+{
+ if (rNEvt.GetType() == MouseNotifyEvent::COMMAND)
+ Accelerator::ToggleMnemonicsOnHierarchy(*rNEvt.GetCommandEvent(), this);
+ return Control::EventNotify( rNEvt );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */