/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ #ifndef SDEXT_PRESENTER_TOOL_BAR_HXX #define SDEXT_PRESENTER_TOOL_BAR_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 #include #include namespace css = ::com::sun::star; 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 ::rtl::OUString& rsConfigurationPath); virtual void SAL_CALL disposing (void); void InvalidateArea ( const css::awt::Rectangle& rRepaintBox, const bool bSynchronous); sal_Int32 GetSlideCount (void); sal_Int32 GetCurrentSlideIndex (void); void RequestLayout (void); css::geometry::RealSize2D GetSize (void); css::geometry::RealSize2D GetMinimalSize (void); ::rtl::Reference GetPresenterController (void) const; css::uno::Reference GetWindow (void) const; css::uno::Reference GetComponentContext (void) const; // lang::XEventListener virtual void SAL_CALL disposing (const css::lang::EventObject& rEventObject) throw (css::uno::RuntimeException); // XWindowListener virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) throw (css::uno::RuntimeException); virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) throw (css::uno::RuntimeException); virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) throw (css::uno::RuntimeException); virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) throw (css::uno::RuntimeException); // XPaintListener virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) throw (css::uno::RuntimeException); // XMouseListener virtual void SAL_CALL mousePressed (const css::awt::MouseEvent& rEvent) throw (css::uno::RuntimeException); virtual void SAL_CALL mouseReleased (const css::awt::MouseEvent& rEvent) throw (css::uno::RuntimeException); virtual void SAL_CALL mouseEntered (const css::awt::MouseEvent& rEvent) throw (css::uno::RuntimeException); virtual void SAL_CALL mouseExited (const css::awt::MouseEvent& rEvent) throw (css::uno::RuntimeException); // XMouseMotionListener virtual void SAL_CALL mouseMoved (const css::awt::MouseEvent& rEvent) throw (css::uno::RuntimeException); virtual void SAL_CALL mouseDragged (const css::awt::MouseEvent& rEvent) throw (css::uno::RuntimeException); // XDrawView virtual void SAL_CALL setCurrentPage ( const css::uno::Reference& rxSlide) throw (css::uno::RuntimeException); virtual css::uno::Reference SAL_CALL getCurrentPage (void) throw (css::uno::RuntimeException); 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 ::rtl::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); ::rtl::Reference GetPresenterToolBar (void) const; // XPaintListener virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) throw (css::uno::RuntimeException); // lang::XEventListener virtual void SAL_CALL disposing (const css::lang::EventObject& rEventObject) throw (css::uno::RuntimeException); // XResourceId virtual css::uno::Reference SAL_CALL getResourceId (void) throw (css::uno::RuntimeException); virtual sal_Bool SAL_CALL isAnchorOnly (void) throw (com::sun::star::uno::RuntimeException); // XDrawView virtual void SAL_CALL setCurrentPage ( const css::uno::Reference& rxSlide) throw (css::uno::RuntimeException); virtual css::uno::Reference SAL_CALL getCurrentPage (void) throw (css::uno::RuntimeException); 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; /** This method throws a DisposedException when the object has already been disposed. */ void ThrowIfDisposed (void) const throw (css::lang::DisposedException); }; } } // end of namespace ::sdext::presenter #endif