From 8c1014021dbe9da2e18233d215b970f5359db67b Mon Sep 17 00:00:00 2001 From: Jan Holesovsky Date: Thu, 11 Sep 2014 14:10:21 +0200 Subject: vcl: Initial NotebookBar implementation. See https://wiki.documentfoundation.org/Development/NotebookBar Change-Id: I91535c13d68261f7195989ec78bd305cf572c87c --- vcl/source/window/brdwin.cxx | 53 ++++++++++++++++++------- vcl/source/window/notebookbarwindow.cxx | 69 +++++++++++++++++++++++++++++++++ vcl/source/window/notebookbarwindow.hxx | 32 +++++++++++++++ vcl/source/window/syswin.cxx | 7 ++++ 4 files changed, 147 insertions(+), 14 deletions(-) create mode 100644 vcl/source/window/notebookbarwindow.cxx create mode 100644 vcl/source/window/notebookbarwindow.hxx (limited to 'vcl/source') 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 #include +#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& 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 + +NotebookBarWindow::NotebookBarWindow(Window* pParent, const OString& rID, const OUString& rUIXMLDescription, const css::uno::Reference &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 +#include + +/// 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 &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 #include +#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& rFrame) +{ + static_cast(mpWindowImpl->mpBorderWindow.get())->SetNotebookBarWindow(rUIXMLDescription, rFrame); +} + void SystemWindow::SetMenuBarMode( MenuBarMode nMode ) { if ( mnMenuBarMode != nMode ) -- cgit