summaryrefslogtreecommitdiff
path: root/vcl/source
diff options
context:
space:
mode:
authorJan Holesovsky <kendy@collabora.com>2014-09-11 14:10:21 +0200
committerSamuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>2015-10-15 10:56:32 +0200
commit8c1014021dbe9da2e18233d215b970f5359db67b (patch)
treec0661b08ecfc7053ac56a6d378e94423b443c789 /vcl/source
parent74dbe58f1e5b6f4f281e13f348c8952b1086877a (diff)
vcl: Initial NotebookBar implementation.
See https://wiki.documentfoundation.org/Development/NotebookBar Change-Id: I91535c13d68261f7195989ec78bd305cf572c87c
Diffstat (limited to 'vcl/source')
-rw-r--r--vcl/source/window/brdwin.cxx53
-rw-r--r--vcl/source/window/notebookbarwindow.cxx69
-rw-r--r--vcl/source/window/notebookbarwindow.hxx32
-rw-r--r--vcl/source/window/syswin.cxx7
4 files changed, 147 insertions, 14 deletions
diff --git a/vcl/source/window/brdwin.cxx b/vcl/source/window/brdwin.cxx
index 773aaa7bf827..c5fd0be3132c 100644
--- a/vcl/source/window/brdwin.cxx
+++ b/vcl/source/window/brdwin.cxx
@@ -36,6 +36,8 @@
#include <vcl/metric.hxx>
#include <vcl/settings.hxx>
+#include "notebookbarwindow.hxx"
+
using namespace ::com::sun::star::uno;
// useful caption height for title bar buttons
@@ -1832,6 +1834,7 @@ void ImplBorderWindow::dispose()
delete mpBorderView;
mpBorderView = NULL;
mpMenuBarWindow.clear();
+ mpNotebookBarWindow.disposeAndClear();
vcl::Window::dispose();
}
@@ -1912,12 +1915,14 @@ void ImplBorderWindow::Resize()
{
vcl::Window* pClientWindow = ImplGetClientWindow();
- if ( mpMenuBarWindow )
+ sal_Int32 nLeftBorder;
+ sal_Int32 nTopBorder;
+ sal_Int32 nRightBorder;
+ sal_Int32 nBottomBorder;
+ mpBorderView->GetBorder( nLeftBorder, nTopBorder, nRightBorder, nBottomBorder );
+
+ if (mpMenuBarWindow)
{
- sal_Int32 nLeftBorder;
- sal_Int32 nTopBorder;
- sal_Int32 nRightBorder;
- sal_Int32 nBottomBorder;
long nMenuHeight = mpMenuBarWindow->GetSizePixel().Height();
if ( mbMenuHide )
{
@@ -1930,13 +1935,22 @@ void ImplBorderWindow::Resize()
if ( !nMenuHeight )
nMenuHeight = mnOrgMenuHeight;
}
- mpBorderView->GetBorder( nLeftBorder, nTopBorder, nRightBorder, nBottomBorder );
- mpMenuBarWindow->setPosSizePixel( nLeftBorder,
- nTopBorder,
- aSize.Width()-nLeftBorder-nRightBorder,
- nMenuHeight,
- PosSizeFlags::Pos |
- PosSizeFlags::Width | PosSizeFlags::Height );
+ mpMenuBarWindow->setPosSizePixel(
+ nLeftBorder, nTopBorder,
+ aSize.Width()-nLeftBorder-nRightBorder, nMenuHeight,
+ PosSizeFlags::Pos | PosSizeFlags::Width | PosSizeFlags::Height);
+
+ // shift the notebookbar down accordingly
+ nTopBorder += nMenuHeight;
+ }
+
+ if (mpNotebookBarWindow)
+ {
+ long nNotebookBarHeight = mpNotebookBarWindow->GetSizePixel().Height();
+ mpNotebookBarWindow->setPosSizePixel(
+ nLeftBorder, nTopBorder,
+ aSize.Width() - nLeftBorder - nRightBorder, nNotebookBarHeight,
+ PosSizeFlags::Pos | PosSizeFlags::Width | PosSizeFlags::Height);
}
GetBorder( pClientWindow->mpWindowImpl->mnLeftBorder, pClientWindow->mpWindowImpl->mnTopBorder,
@@ -2163,12 +2177,23 @@ void ImplBorderWindow::SetMenuBarMode( bool bHide )
UpdateMenuHeight();
}
+void ImplBorderWindow::SetNotebookBarWindow(const OUString& rUIXMLDescription, const css::uno::Reference<css::frame::XFrame>& rFrame)
+{
+ mpNotebookBarWindow.reset(new NotebookBarWindow(this, "NotebookBar", rUIXMLDescription, rFrame));
+ Resize();
+ mpNotebookBarWindow->Show();
+}
+
void ImplBorderWindow::GetBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder,
sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const
{
- mpBorderView->GetBorder( rLeftBorder, rTopBorder, rRightBorder, rBottomBorder );
- if ( mpMenuBarWindow && !mbMenuHide )
+ mpBorderView->GetBorder(rLeftBorder, rTopBorder, rRightBorder, rBottomBorder);
+
+ if (mpMenuBarWindow && !mbMenuHide)
rTopBorder += mpMenuBarWindow->GetSizePixel().Height();
+
+ if (mpNotebookBarWindow)
+ rTopBorder += mpNotebookBarWindow->GetSizePixel().Height();
}
long ImplBorderWindow::CalcTitleWidth() const
diff --git a/vcl/source/window/notebookbarwindow.cxx b/vcl/source/window/notebookbarwindow.cxx
new file mode 100644
index 000000000000..09fc0677ce38
--- /dev/null
+++ b/vcl/source/window/notebookbarwindow.cxx
@@ -0,0 +1,69 @@
+/* -*- 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 "notebookbarwindow.hxx"
+
+#include <vcl/layout.hxx>
+
+NotebookBarWindow::NotebookBarWindow(Window* pParent, const OString& rID, const OUString& rUIXMLDescription, const css::uno::Reference<css::frame::XFrame> &rFrame)
+ : Control(pParent)
+{
+ SetStyle(GetStyle() | WB_DIALOGCONTROL);
+ m_pUIBuilder = new VclBuilder(this, getUIRootDir(), rUIXMLDescription, rID, rFrame);
+}
+
+NotebookBarWindow::~NotebookBarWindow()
+{
+ disposeOnce();
+}
+
+void NotebookBarWindow::dispose()
+{
+ disposeBuilder();
+ Control::dispose();
+}
+
+Size NotebookBarWindow::GetOptimalSize() const
+{
+ if (isLayoutEnabled(this))
+ return VclContainer::getLayoutRequisition(*GetWindow(GetWindowType::FirstChild));
+
+ return Control::GetOptimalSize();
+}
+
+void NotebookBarWindow::setPosSizePixel(long nX, long nY, long nWidth, long nHeight, PosSizeFlags nFlags)
+{
+ bool bCanHandleSmallerWidth = false;
+ bool bCanHandleSmallerHeight = false;
+
+ bool bIsLayoutEnabled = isLayoutEnabled(this);
+ Window *pChild = GetWindow(GetWindowType::FirstChild);
+
+ if (bIsLayoutEnabled && pChild->GetType() == WINDOW_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 (bIsLayoutEnabled && (nFlags & PosSizeFlags::Size))
+ VclContainer::setLayoutAllocation(*pChild, Point(0, 0), Size(nWidth, nHeight));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/window/notebookbarwindow.hxx b/vcl/source/window/notebookbarwindow.hxx
new file mode 100644
index 000000000000..0fc64a6399ce
--- /dev/null
+++ b/vcl/source/window/notebookbarwindow.hxx
@@ -0,0 +1,32 @@
+/* -*- 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/.
+ */
+
+#ifndef VCL_SOURCE_WINDOW_NOTEBOOKBARWINDOW_HXX
+#define VCL_SOURCE_WINDOW_NOTEBOOKBARWINDOW_HXX
+
+#include "menuwindow.hxx"
+
+#include <vcl/builder.hxx>
+#include <vcl/ctrl.hxx>
+
+/// This implements Widget Layout-based notebook-like menu bar.
+class NotebookBarWindow : public Control, public VclBuilderContainer
+{
+public:
+ NotebookBarWindow(Window* pParent, const OString& rID, const OUString& rUIXMLDescription, const css::uno::Reference<css::frame::XFrame> &rFrame);
+ virtual ~NotebookBarWindow();
+ virtual void dispose() SAL_OVERRIDE;
+
+ virtual Size GetOptimalSize() const SAL_OVERRIDE;
+ virtual void setPosSizePixel(long nX, long nY, long nWidth, long nHeight, PosSizeFlags nFlags = PosSizeFlags::All) SAL_OVERRIDE;
+};
+
+#endif // VCL_SOURCE_WINDOW_NOTEBOOKBARWINDOW_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/window/syswin.cxx b/vcl/source/window/syswin.cxx
index 1403918ef987..a8f753800f0c 100644
--- a/vcl/source/window/syswin.cxx
+++ b/vcl/source/window/syswin.cxx
@@ -39,6 +39,8 @@
#include <brdwin.hxx>
#include <window.h>
+#include "notebookbarwindow.hxx"
+
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;
@@ -967,6 +969,11 @@ void SystemWindow::SetMenuBar(MenuBar* pMenuBar)
}
}
+void SystemWindow::CreateNotebookBar(const OUString& rUIXMLDescription, const css::uno::Reference<css::frame::XFrame>& rFrame)
+{
+ static_cast<ImplBorderWindow*>(mpWindowImpl->mpBorderWindow.get())->SetNotebookBarWindow(rUIXMLDescription, rFrame);
+}
+
void SystemWindow::SetMenuBarMode( MenuBarMode nMode )
{
if ( mnMenuBarMode != nMode )