/************************************************************** * * 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 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef SDEXT_PRESENTER_PRESENTER_SCROLL_BAR_HXX #define SDEXT_PRESENTER_PRESENTER_SCROLL_BAR_HXX #include "PresenterBitmapContainer.hxx" #include #include #include #include #include #include #include #include #include #include namespace css = ::com::sun::star; namespace sdext { namespace presenter { class PresenterCanvasHelper; class PresenterPaintManager; namespace { typedef ::cppu::WeakComponentImplHelper4 < css::awt::XWindowListener, css::awt::XPaintListener, css::awt::XMouseListener, css::awt::XMouseMotionListener > PresenterScrollBarInterfaceBase; } /** Base class of horizontal and vertical scroll bars. */ class PresenterScrollBar : private ::boost::noncopyable, private ::cppu::BaseMutex, public PresenterScrollBarInterfaceBase { public: typedef ::boost::function ThumbMotionListener; virtual ~PresenterScrollBar (void); virtual void SAL_CALL disposing (void); void SetVisible (const bool bIsVisible); /** Set the bounding box of the scroll bar. */ void SetPosSize (const css::geometry::RealRectangle2D& rBox); /** Set the position of the movable thumb. @param nPosition A value between 0 and the last value given to SetTotalSize() minus the last value given to SetThumbSize(). */ void SetThumbPosition ( double nPosition, const bool bAsynchronousRepaint); double GetThumbPosition (void) const; /** Set the upper border of the slider range. */ void SetTotalSize (const double nTotalSize); double GetTotalSize (void) const; /** Set the size of the movable thumb. @param nThumbSize A value not larger than the last value given to SetTotalSize(). */ void SetThumbSize (const double nThumbSize); double GetThumbSize (void) const; void SetLineHeight (const double nLineHeight); double GetLineHeight (void) const; /** Set the canvas that is used for painting the scroll bar. */ void SetCanvas (const css::uno::Reference& rxCanvas); void SetBackground (const SharedBitmapDescriptor& rpBackgroundBitmap); /** Call this after changing total size or thumb position or size to move the thumb to a valid position. */ void CheckValues (void); /** On some occasions it is necessary to trigger the painting of a scrollbar from the outside. */ virtual void Paint ( const css::awt::Rectangle& rUpdateBox, bool bNoClip = false); virtual sal_Int32 GetSize (void) const = 0; // 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); // lang::XEventListener virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) throw (css::uno::RuntimeException); enum Area { Total, Pager, Thumb, PagerUp, PagerDown, PrevButton, NextButton, None, __AreaCount__ = None }; protected: css::uno::Reference mxComponentContext; css::uno::Reference mxParentWindow; css::uno::Reference mxWindow; css::uno::Reference mxCanvas; css::uno::Reference mxPresenterHelper; ::boost::shared_ptr mpPaintManager; double mnThumbPosition; double mnTotalSize; double mnThumbSize; double mnLineHeight; css::geometry::RealPoint2D maDragAnchor; ::boost::function maThumbMotionListener; Area meButtonDownArea; Area meMouseMoveArea; css::geometry::RealRectangle2D maBox[__AreaCount__]; bool mbIsNotificationActive; static boost::weak_ptr mpSharedBitmaps; boost::shared_ptr mpBitmaps; SharedBitmapDescriptor mpPrevButtonDescriptor; SharedBitmapDescriptor mpNextButtonDescriptor; SharedBitmapDescriptor mpPagerStartDescriptor; SharedBitmapDescriptor mpPagerCenterDescriptor; SharedBitmapDescriptor mpPagerEndDescriptor; SharedBitmapDescriptor mpThumbStartDescriptor; SharedBitmapDescriptor mpThumbCenterDescriptor; SharedBitmapDescriptor mpThumbEndDescriptor; bool maEnabledState[__AreaCount__]; virtual css::geometry::RealRectangle2D GetRectangle (const Area eArea) const; virtual double GetDragDistance (const sal_Int32 nX, const sal_Int32 nY) const = 0; virtual void UpdateDragAnchor (const double nDragDistance) = 0; virtual css::geometry::RealPoint2D GetPoint (const double nMajor, const double nMinor) const = 0; virtual double GetMajor (const double nX, const double nY) const = 0; virtual double GetMinor (const double nX, const double nY) const = 0; virtual void UpdateBorders (void) = 0; virtual void UpdateBitmaps (void) = 0; virtual void PaintComposite( const css::awt::Rectangle& rRepaintBox, const Area eArea, const SharedBitmapDescriptor& rpStartBitmaps, const SharedBitmapDescriptor& rpCenterBitmaps, const SharedBitmapDescriptor& rpEndBitmaps) = 0; PresenterScrollBar ( const css::uno::Reference& rxComponentContext, const css::uno::Reference& rxParentWindow, const ::boost::shared_ptr& rpPaintManager, const ::boost::function& rThumbMotionListener); void Repaint ( const css::geometry::RealRectangle2D aBox, const bool bAsynchronous); void PaintBackground ( const css::awt::Rectangle& rRepaintBox); void PaintBitmap( const css::awt::Rectangle& rRepaintBox, const Area eArea, const SharedBitmapDescriptor& rpBitmaps); void NotifyThumbPositionChange (void); void UpdateWidthOrHeight (sal_Int32& rSize, const SharedBitmapDescriptor& rpDescriptor); css::uno::Reference GetBitmap ( const Area eArea, const SharedBitmapDescriptor& rpBitmaps) const; PresenterBitmapContainer::BitmapDescriptor::Mode GetBitmapMode ( const Area eArea) const; bool IsDisabled (const Area eArea) const; double ValidateThumbPosition (double nPosition); void SetThumbPosition ( double nPosition, const bool bAsynchronousRepaint, const bool bValidate, const bool bNotify); private: class MousePressRepeater; ::boost::shared_ptr mpMousePressRepeater; SharedBitmapDescriptor mpBackgroundBitmap; ::boost::scoped_ptr mpCanvasHelper; Area GetArea (const double nX, const double nY) const; }; /** A vertical scroll bar. */ class PresenterVerticalScrollBar : public PresenterScrollBar { public: PresenterVerticalScrollBar ( const css::uno::Reference& rxComponentContext, const css::uno::Reference& rxParentWindow, const ::boost::shared_ptr& rpPaintManager, const ::boost::function& rThumbMotionListener); virtual ~PresenterVerticalScrollBar (void); virtual sal_Int32 GetSize (void) const; protected: virtual double GetDragDistance (const sal_Int32 nX, const sal_Int32 nY) const; virtual void UpdateDragAnchor (const double nDragDistance); virtual css::geometry::RealPoint2D GetPoint (const double nMajor, const double nMinor) const; virtual double GetMinor (const double nX, const double nY) const; virtual double GetMajor (const double nX, const double nY) const; virtual void UpdateBorders (void); virtual void UpdateBitmaps (void); virtual void PaintComposite( const css::awt::Rectangle& rRepaintBox, const Area eArea, const SharedBitmapDescriptor& rpStartBitmaps, const SharedBitmapDescriptor& rpCenterBitmaps, const SharedBitmapDescriptor& rpEndBitmaps); private: sal_Int32 mnScrollBarWidth; }; /** A horizontal scroll bar. */ class PresenterHorizontalScrollBar : public PresenterScrollBar { public: PresenterHorizontalScrollBar ( const css::uno::Reference& rxComponentContext, const css::uno::Reference& rxParentWindow, const ::boost::shared_ptr& rpPaintManager, const ::boost::function& rThumbMotionListener); virtual ~PresenterHorizontalScrollBar (void); virtual sal_Int32 GetSize (void) const; protected: virtual double GetDragDistance (const sal_Int32 nX, const sal_Int32 nY) const; virtual void UpdateDragAnchor (const double nDragDistance); virtual css::geometry::RealPoint2D GetPoint (const double nMajor, const double nMinor) const; virtual double GetMinor (const double nX, const double nY) const; virtual double GetMajor (const double nX, const double nY) const; virtual void UpdateBorders (void); virtual void UpdateBitmaps (void); virtual void PaintComposite( const css::awt::Rectangle& rRepaintBox, const Area eArea, const SharedBitmapDescriptor& rpStartBitmaps, const SharedBitmapDescriptor& rpCenterBitmaps, const SharedBitmapDescriptor& rpEndBitmaps); private: sal_Int32 mnScrollBarHeight; }; } } // end of namespace ::sdext::presenter #endif