/* -*- 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_PRESENTERTOOLBAR_HXX #define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERTOOLBAR_HXX #include "PresenterController.hxx" #include "PresenterViewFactory.hxx" #include #include #include #include #include #include #include #include #include #include #include #include namespace sdext::presenter { typedef cppu::WeakComponentImplHelper< css::awt::XWindowListener, css::awt::XPaintListener, css::awt::XMouseListener, css::awt::XMouseMotionListener, css::drawing::XDrawView > PresenterToolBarInterfaceBase; typedef cppu::WeakComponentImplHelper< css::awt::XPaintListener, css::drawing::framework::XView, css::drawing::XDrawView > PresenterToolBarViewInterfaceBase; /** A simple tool bar that can display bitmapped buttons and labels. At the moment there are buttons for moving to the next and previous slide and to the next effect. A label displays the index of the current slide and the total number of slides. */ class PresenterToolBar : private ::cppu::BaseMutex, public PresenterToolBarInterfaceBase, public CachablePresenterView { public: typedef ::std::function Action; enum Anchor { Left, Center }; PresenterToolBar ( const css::uno::Reference& rxContext, const css::uno::Reference& rxWindow, const css::uno::Reference& rxCanvas, const ::rtl::Reference& rpPresenterController, const Anchor eAnchor); virtual ~PresenterToolBar() override; PresenterToolBar(const PresenterToolBar&) = delete; PresenterToolBar& operator=(const PresenterToolBar&) = delete; void Initialize ( const OUString& rsConfigurationPath); virtual void SAL_CALL disposing() override; void InvalidateArea ( const css::awt::Rectangle& rRepaintBox, const bool bSynchronous); void RequestLayout(); css::geometry::RealSize2D const & GetMinimalSize(); const ::rtl::Reference& GetPresenterController() const; const css::uno::Reference& GetComponentContext() const; // lang::XEventListener virtual void SAL_CALL disposing (const css::lang::EventObject& rEventObject) override; // 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; // XMouseMotionListener virtual void SAL_CALL mouseMoved (const css::awt::MouseEvent& rEvent) override; virtual void SAL_CALL mouseDragged (const css::awt::MouseEvent& rEvent) override; // XDrawView virtual void SAL_CALL setCurrentPage ( const css::uno::Reference& rxSlide) override; virtual css::uno::Reference SAL_CALL getCurrentPage() override; class Context; private: css::uno::Reference mxComponentContext; class ElementContainerPart; typedef std::shared_ptr SharedElementContainerPart; typedef ::std::vector ElementContainer; ElementContainer maElementContainer; SharedElementContainerPart mpCurrentContainerPart; css::uno::Reference mxWindow; css::uno::Reference mxCanvas; css::uno::Reference mxSlideShowController; css::uno::Reference mxCurrentSlide; ::rtl::Reference mpPresenterController; bool mbIsLayoutPending; const Anchor meAnchor; /** The minimal size that is necessary to display all elements without overlap and with minimal gaps between them. */ css::geometry::RealSize2D maMinimalSize; void CreateControls ( const OUString& rsConfigurationPath); void Layout (const css::uno::Reference& rxCanvas); css::geometry::RealSize2D CalculatePartSize ( const css::uno::Reference& rxCanvas, const SharedElementContainerPart& rpPart, const bool bIsHorizontal); static void LayoutPart ( const css::uno::Reference& rxCanvas, const SharedElementContainerPart& rpPart, const css::geometry::RealRectangle2D& rBoundingBox, const css::geometry::RealSize2D& rPartSize, const bool bIsHorizontal); void Paint ( const css::awt::Rectangle& rUpdateBox, const css::rendering::ViewState& rViewState); void UpdateSlideNumber(); void CheckMouseOver ( const css::awt::MouseEvent& rEvent, const bool bOverWindow, const bool bMouseDown=false); void ProcessEntry ( const css::uno::Reference& rProperties, Context const & rContext); /** @throws css::lang::DisposedException when the object has already been disposed. */ void ThrowIfDisposed() const; }; /** View for the PresenterToolBar. */ class PresenterToolBarView : private ::cppu::BaseMutex, public PresenterToolBarViewInterfaceBase { public: explicit PresenterToolBarView ( const css::uno::Reference& rxContext, const css::uno::Reference& rxViewId, const css::uno::Reference& rxController, const ::rtl::Reference& rpPresenterController); virtual ~PresenterToolBarView() override; PresenterToolBarView(const PresenterToolBarView&) = delete; PresenterToolBarView& operator=(const PresenterToolBarView&) = delete; virtual void SAL_CALL disposing() override; const ::rtl::Reference& GetPresenterToolBar() const; // XPaintListener virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override; // lang::XEventListener virtual void SAL_CALL disposing (const css::lang::EventObject& rEventObject) override; // XResourceId virtual css::uno::Reference SAL_CALL getResourceId() override; virtual sal_Bool SAL_CALL isAnchorOnly() override; // XDrawView virtual void SAL_CALL setCurrentPage ( const css::uno::Reference& rxSlide) override; virtual css::uno::Reference SAL_CALL getCurrentPage() override; private: // css::uno::Reference mxComponentContext; css::uno::Reference mxPane; css::uno::Reference mxViewId; css::uno::Reference mxWindow; css::uno::Reference mxCanvas; ::rtl::Reference mpPresenterController; ::rtl::Reference mpToolBar; }; } // end of namespace ::sdext::presenter #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */