/* -*- 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 #include #include #include #include #include #include #include #include #include #include namespace { typedef cppu::WeakComponentImplHelper5< css::awt::XWindowListener, css::awt::XPaintListener, css::awt::XMouseListener, css::awt::XMouseMotionListener, css::drawing::XDrawView > PresenterToolBarInterfaceBase; typedef cppu::WeakComponentImplHelper3< css::awt::XPaintListener, css::drawing::framework::XView, css::drawing::XDrawView > PresenterToolBarViewInterfaceBase; } namespace sdext { namespace presenter { /** 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 displayes the index of the current slide and the total number of slides. */ class PresenterToolBar : private ::cppu::BaseMutex, private ::boost::noncopyable, public PresenterToolBarInterfaceBase, public CachablePresenterView { public: typedef ::boost::function Action; enum Anchor { Left, Center, Right }; 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 (void); void Initialize ( const OUString& rsConfigurationPath); virtual void SAL_CALL disposing (void) SAL_OVERRIDE; void InvalidateArea ( const css::awt::Rectangle& rRepaintBox, const bool bSynchronous); void RequestLayout (void); css::geometry::RealSize2D GetMinimalSize (void); ::rtl::Reference GetPresenterController (void) const; css::uno::Reference GetComponentContext (void) const; // lang::XEventListener virtual void SAL_CALL disposing (const css::lang::EventObject& rEventObject) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; // XWindowListener virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; // XPaintListener virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; // XMouseListener virtual void SAL_CALL mousePressed (const css::awt::MouseEvent& rEvent) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; virtual void SAL_CALL mouseReleased (const css::awt::MouseEvent& rEvent) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; virtual void SAL_CALL mouseEntered (const css::awt::MouseEvent& rEvent) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; virtual void SAL_CALL mouseExited (const css::awt::MouseEvent& rEvent) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; // XMouseMotionListener virtual void SAL_CALL mouseMoved (const css::awt::MouseEvent& rEvent) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; virtual void SAL_CALL mouseDragged (const css::awt::MouseEvent& rEvent) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; // XDrawView virtual void SAL_CALL setCurrentPage ( const css::uno::Reference& rxSlide) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; virtual css::uno::Reference SAL_CALL getCurrentPage (void) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; class Context; private: css::uno::Reference mxComponentContext; class ElementContainerPart; typedef ::boost::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; css::geometry::RealRectangle2D maBoundingBox; /** 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); void LayoutPart ( const css::uno::Reference& rxCanvas, const SharedElementContainerPart& rpPart, const css::geometry::RealRectangle2D& rBoundingBox, const css::geometry::RealSize2D& rPartSize, const bool bIsHorizontal); void Clear ( const css::awt::Rectangle& rUpdateBox, const css::rendering::ViewState& rViewState); void Paint ( const css::awt::Rectangle& rUpdateBox, const css::rendering::ViewState& rViewState); void UpdateSlideNumber (void); void CheckMouseOver ( const css::awt::MouseEvent& rEvent, const bool bOverWindow, const bool bMouseDown=false); void ProcessEntry ( const css::uno::Reference& rProperties, Context& rContext); /** This method throws a DisposedException when the object has already been disposed. */ void ThrowIfDisposed (void) const throw (css::lang::DisposedException); }; /** View for the PresenterToolBar. */ class PresenterToolBarView : private ::cppu::BaseMutex, private ::boost::noncopyable, 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 (void); virtual void SAL_CALL disposing (void) SAL_OVERRIDE; ::rtl::Reference GetPresenterToolBar (void) const; // XPaintListener virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; // lang::XEventListener virtual void SAL_CALL disposing (const css::lang::EventObject& rEventObject) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; // XResourceId virtual css::uno::Reference SAL_CALL getResourceId (void) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; virtual sal_Bool SAL_CALL isAnchorOnly (void) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; // XDrawView virtual void SAL_CALL setCurrentPage ( const css::uno::Reference& rxSlide) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; virtual css::uno::Reference SAL_CALL getCurrentPage (void) throw (css::uno::RuntimeException, std::exception) SAL_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; css::uno::Reference mxSlideShowController; ::rtl::Reference mpToolBar; }; } } // end of namespace ::sdext::presenter #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */