From ed5640d8b587fbcfed7dd7967f3de04b37a76f26 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 11:06:44 +0200 Subject: Adding upstream version 4:7.4.7. Signed-off-by: Daniel Baumann --- sdext/source/presenter/PresenterWindowManager.hxx | 208 ++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 sdext/source/presenter/PresenterWindowManager.hxx (limited to 'sdext/source/presenter/PresenterWindowManager.hxx') diff --git a/sdext/source/presenter/PresenterWindowManager.hxx b/sdext/source/presenter/PresenterWindowManager.hxx new file mode 100644 index 000000000..9c032e6df --- /dev/null +++ b/sdext/source/presenter/PresenterWindowManager.hxx @@ -0,0 +1,208 @@ +/* -*- 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/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERWINDOWMANAGER_HXX +#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERWINDOWMANAGER_HXX + +#include "PresenterPaneContainer.hxx" +#include "PresenterTheme.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sdext::presenter { + +class PresenterController; +class PresenterPaneBorderPainter; +class PresenterTheme; + +typedef ::cppu::WeakComponentImplHelper< + css::awt::XWindowListener, + css::awt::XPaintListener, + css::awt::XMouseListener, + css::awt::XFocusListener +> PresenterWindowManagerInterfaceBase; + +/** A simple manager of the positions of the panes of the presenter screen. + Uses relative coordinates of the four sides of each pane. Allows panes + to be moved or resized with the mouse. +*/ +class PresenterWindowManager + : protected ::cppu::BaseMutex, + public PresenterWindowManagerInterfaceBase +{ +public: + PresenterWindowManager ( + const css::uno::Reference& rxContext, + const ::rtl::Reference& rpPaneContainer, + const ::rtl::Reference& rpPresenterController); + virtual ~PresenterWindowManager() override; + PresenterWindowManager(const PresenterWindowManager&) = delete; + PresenterWindowManager& operator=(const PresenterWindowManager&) = delete; + + void SAL_CALL disposing() override; + + void SetParentPane (const css::uno::Reference& rxPane); + void SetTheme (const std::shared_ptr& rpTheme); + void NotifyViewCreation (const css::uno::Reference& rxView); + void SetPanePosSizeAbsolute ( + const OUString& rsPaneURL, + const double nX, + const double nY, + const double nWidth, + const double nHeight); + void SetPaneBorderPainter (const ::rtl::Reference& rPainter); + void Update(); + void Layout(); + + void SetSlideSorterState (bool bIsActive); + void SetHelpViewState (bool bIsActive); + void SetPauseState (bool bIsPaused); + + enum LayoutMode { LM_Standard, LM_Notes, LM_Generic }; +private: + void SetLayoutMode (const LayoutMode eMode); + +public: + enum ViewMode { VM_Standard, VM_Notes, VM_SlideOverview, VM_Help }; + /** The high-level method to switch the view mode. Use this instead of + SetLayoutMode and Set(Help|SlideSorter)State when possible. + */ + void SetViewMode (const ViewMode eMode); + + ViewMode GetViewMode() const; + + /** Restore the layout mode (or slide sorter state) from the + configuration. + */ + void RestoreViewMode(); + + void AddLayoutListener ( + const css::uno::Reference& rxListener); + void RemoveLayoutListener ( + const css::uno::Reference& rxListener); + + // XWindowListener + + virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override; + + virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override; + + virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override; + + // XPaintListener + + virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override; + + // XMouseListener + + virtual void SAL_CALL mousePressed (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseReleased (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseEntered (const css::awt::MouseEvent& rEvent) override; + + virtual void SAL_CALL mouseExited (const css::awt::MouseEvent& rEvent) override; + + // XFocusListener + + virtual void SAL_CALL focusGained (const css::awt::FocusEvent& rEvent) override; + + virtual void SAL_CALL focusLost (const css::awt::FocusEvent& rEvent) override; + + // XEventListener + + virtual void SAL_CALL disposing ( + const css::lang::EventObject& rEvent) override; + +private: + css::uno::Reference mxComponentContext; + ::rtl::Reference mpPresenterController; + css::uno::Reference mxParentWindow; + css::uno::Reference mxParentCanvas; + css::uno::Reference mxPaneBorderManager; + ::rtl::Reference mpPaneBorderPainter; + ::rtl::Reference mpPaneContainer; + bool mbIsLayoutPending; + /** This flag is set to while the Layout() method is being + executed. Prevents windowMoved() and windowResized() from changing + the window sizes. + */ + bool mbIsLayouting; + std::shared_ptr mpTheme; + SharedBitmapDescriptor mpBackgroundBitmap; + css::uno::Reference mxScaledBackgroundBitmap; + css::uno::Reference mxClipPolygon; + LayoutMode meLayoutMode; + bool mbIsSlideSorterActive; + bool mbIsHelpViewActive; + bool mbisPaused; + typedef ::std::vector > + LayoutListenerContainer; + LayoutListenerContainer maLayoutListeners; + bool mbIsMouseClickPending; + + void PaintChildren (const css::awt::PaintEvent& rEvent) const; + void UpdateWindowSize (const css::uno::Reference& rxBorderWindow); + void PaintBackground (const css::awt::Rectangle& rUpdateBox); + void ProvideBackgroundBitmap(); + css::uno::Reference CreateClipPolyPolygon() const; + + void StoreViewMode (const ViewMode eViewMode); + + void LayoutStandardMode(); + void LayoutNotesMode(); + void LayoutSlideSorterMode(); + void LayoutHelpMode(); + + /** Layout the tool bar and return its outer bounding box. + */ + css::geometry::RealRectangle2D LayoutToolBar(); + + css::awt::Size CalculatePaneSize ( + const double nOuterWidth, + const OUString& rsPaneURL); + + /** Notify changes of the layout mode and of the slide sorter state. + */ + void NotifyLayoutModeChange(); + + void NotifyDisposing(); + + /// @throws css::lang::DisposedException + void ThrowIfDisposed() const; +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3