/* -*- 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 #include #include #include #include /** * split from the main class since it needs different ref-counting mana */ class NotebookBarContextChangeEventListener : public ::cppu::WeakImplHelper { VclPtr mpParent; public: explicit NotebookBarContextChangeEventListener(NotebookBar *p) : mpParent(p) {} virtual ~NotebookBarContextChangeEventListener() {} // XContextChangeEventListener virtual void SAL_CALL notifyContextChangeEvent(const css::ui::ContextChangeEventObject& rEvent) throw (css::uno::RuntimeException, std::exception) override; virtual void SAL_CALL disposing(const ::css::lang::EventObject&) throw (::css::uno::RuntimeException, ::std::exception) override; }; NotebookBar::NotebookBar(Window* pParent, const OString& rID, const OUString& rUIXMLDescription, const css::uno::Reference &rFrame) : Control(pParent), m_pEventListener(new NotebookBarContextChangeEventListener(this)) { SetStyle(GetStyle() | WB_DIALOGCONTROL); m_pUIBuilder = new VclBuilder(this, getUIRootDir(), rUIXMLDescription, rID, rFrame); // In the Notebookbar's .ui file must exist control handling context // - implementing NotebookbarContextControl interface with id "ContextContainer" m_pContextContainer = dynamic_cast(m_pUIBuilder->get("ContextContainer")); } NotebookBar::~NotebookBar() { disposeOnce(); } void NotebookBar::dispose() { disposeBuilder(); m_pEventListener.clear(); Control::dispose(); } Size NotebookBar::GetOptimalSize() const { if (isLayoutEnabled(this)) return VclContainer::getLayoutRequisition(*GetWindow(GetWindowType::FirstChild)); return Control::GetOptimalSize(); } void NotebookBar::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)); } void NotebookBar::SetIconClickHdl(Link aHdl) { if (m_pContextContainer) m_pContextContainer->SetIconClickHdl(aHdl); } void NotebookBar::StateChanged(StateChangedType nType) { if (nType == StateChangedType::Visible) { // visibility changed, update the container GetParent()->Resize(); } Control::StateChanged(nType); } void SAL_CALL NotebookBarContextChangeEventListener::notifyContextChangeEvent(const css::ui::ContextChangeEventObject& rEvent) throw (css::uno::RuntimeException, std::exception) { if (mpParent && mpParent->m_pContextContainer) mpParent->m_pContextContainer->SetContext(vcl::EnumContext::GetContextEnum(rEvent.ContextName)); } void SAL_CALL NotebookBarContextChangeEventListener::disposing(const ::css::lang::EventObject&) throw (::css::uno::RuntimeException, ::std::exception) { mpParent.clear(); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */