diff options
author | Rüdiger Timm <rt@openoffice.org> | 2008-07-11 12:41:01 +0000 |
---|---|---|
committer | Rüdiger Timm <rt@openoffice.org> | 2008-07-11 12:41:01 +0000 |
commit | 5882ae02cd9bb0b498f3723e5da73ba8a35ce00e (patch) | |
tree | 9f5c7017d6780b22fd9330e9d7b48afc66537528 /sdext/source/presenter | |
parent | e812dfabf64fb8217d1754d194fe6eb431c9448d (diff) |
INTEGRATION: CWS presenterfixes (1.4.2); FILE MERGED
2008/06/23 12:49:32 af 1.4.2.2: Fixed build problem.
2008/06/11 07:46:49 af 1.4.2.1: #i88837# Added support for repeating scroll events.
Diffstat (limited to 'sdext/source/presenter')
-rw-r--r-- | sdext/source/presenter/PresenterScrollBar.cxx | 258 |
1 files changed, 230 insertions, 28 deletions
diff --git a/sdext/source/presenter/PresenterScrollBar.cxx b/sdext/source/presenter/PresenterScrollBar.cxx index 53d87e1feb0c..1b1d4accc0a2 100644 --- a/sdext/source/presenter/PresenterScrollBar.cxx +++ b/sdext/source/presenter/PresenterScrollBar.cxx @@ -8,7 +8,7 @@ * * $RCSfile: PresenterScrollBar.cxx,v $ * - * $Revision: 1.4 $ + * $Revision: 1.5 $ * * This file is part of OpenOffice.org. * @@ -31,9 +31,11 @@ #include "PresenterScrollBar.hxx" #include "PresenterBitmapContainer.hxx" +#include "PresenterCanvasHelper.hxx" #include "PresenterComponent.hxx" #include "PresenterGeometryHelper.hxx" #include "PresenterPaintManager.hxx" +#include "PresenterTimer.hxx" #include "PresenterUIPainter.hxx" #include <com/sun/star/awt/PosSize.hpp> #include <com/sun/star/awt/WindowAttribute.hpp> @@ -42,6 +44,8 @@ #include <com/sun/star/rendering/CompositeOperation.hpp> #include <com/sun/star/rendering/TexturingMode.hpp> #include <com/sun/star/rendering/XPolyPolygon2D.hpp> +#include <boost/bind.hpp> +#include <boost/enable_shared_from_this.hpp> #include <boost/weak_ptr.hpp> #include <cmath> @@ -55,6 +59,29 @@ const static double gnScrollBarGap (10); namespace sdext { namespace presenter { +//===== PresenterScrollBar::MousePressRepeater ================================ + +class PresenterScrollBar::MousePressRepeater + : public ::boost::enable_shared_from_this<MousePressRepeater> +{ +public: + MousePressRepeater (const ::rtl::Reference<PresenterScrollBar>& rpScrollBar); + void Dispose (void); + void Start (const PresenterScrollBar::Area& reArea); + void Stop (void); + void SetMouseArea (const PresenterScrollBar::Area& reArea); + +private: + void Callback (const TimeValue& rCurrentTime); + void Execute (void); + + sal_Int32 mnMousePressRepeaterTaskId; + ::rtl::Reference<PresenterScrollBar> mpScrollBar; + PresenterScrollBar::Area meMouseArea; +}; + + + //===== PresenterScrollBar ==================================================== @@ -75,6 +102,7 @@ PresenterScrollBar::PresenterScrollBar ( mnThumbPosition(0), mnTotalSize(0), mnThumbSize(0), + mnLineHeight(10), maDragAnchor(-1,-1), maThumbMotionListener(rThumbMotionListener), meButtonDownArea(None), @@ -88,7 +116,10 @@ PresenterScrollBar::PresenterScrollBar ( mpPagerEndDescriptor(), mpThumbStartDescriptor(), mpThumbCenterDescriptor(), - mpThumbEndDescriptor() + mpThumbEndDescriptor(), + mpMousePressRepeater(new MousePressRepeater(this)), + mpBackgroundBitmap(), + mpCanvasHelper(new PresenterCanvasHelper()) { try { @@ -139,6 +170,8 @@ PresenterScrollBar::~PresenterScrollBar (void) void SAL_CALL PresenterScrollBar::disposing (void) { + mpMousePressRepeater->Dispose(); + if (mxWindow.is()) { mxWindow->removeWindowListener(this); @@ -217,6 +250,14 @@ void PresenterScrollBar::SetThumbPosition ( +double PresenterScrollBar::GetThumbPosition (void) const +{ + return mnThumbPosition; +} + + + + void PresenterScrollBar::SetTotalSize (const double nTotalSize) { if (mnTotalSize != nTotalSize) @@ -230,6 +271,14 @@ void PresenterScrollBar::SetTotalSize (const double nTotalSize) +double PresenterScrollBar::GetTotalSize (void) const +{ + return mnTotalSize; +} + + + + void PresenterScrollBar::SetThumbSize (const double nThumbSize) { OSL_ASSERT(nThumbSize>=0); @@ -244,6 +293,30 @@ void PresenterScrollBar::SetThumbSize (const double nThumbSize) +double PresenterScrollBar::GetThumbSize (void) const +{ + return mnThumbSize; +} + + + + +void PresenterScrollBar::SetLineHeight (const double nLineHeight) +{ + mnLineHeight = nLineHeight; +} + + + + +double PresenterScrollBar::GetLineHeight (void) const +{ + return mnLineHeight; +} + + + + void PresenterScrollBar::SetCanvas (const Reference<css::rendering::XCanvas>& rxCanvas) { if (mxCanvas != rxCanvas) @@ -284,6 +357,13 @@ void PresenterScrollBar::SetCanvas (const Reference<css::rendering::XCanvas>& rx +void PresenterScrollBar::SetBackground (const SharedBitmapDescriptor& rpBackgroundBitmap) +{ + mpBackgroundBitmap = rpBackgroundBitmap; +} + + + void PresenterScrollBar::CheckValues (void) { mnThumbPosition = ValidateThumbPosition(mnThumbPosition); @@ -321,6 +401,7 @@ void PresenterScrollBar::Paint ( return; } + PaintBackground(rUpdateBox); PaintComposite(rUpdateBox, PagerUp, mpPagerStartDescriptor, mpPagerCenterDescriptor, SharedBitmapDescriptor()); PaintComposite(rUpdateBox, PagerDown, @@ -409,6 +490,8 @@ void SAL_CALL PresenterScrollBar::mousePressed (const css::awt::MouseEvent& rEve maDragAnchor.X = rEvent.X; maDragAnchor.Y = rEvent.Y; meButtonDownArea = GetArea(rEvent.X, rEvent.Y); + + mpMousePressRepeater->Start(meButtonDownArea); } @@ -418,33 +501,11 @@ void SAL_CALL PresenterScrollBar::mouseReleased (const css::awt::MouseEvent& rEv throw(css::uno::RuntimeException) { (void)rEvent; - if (mxPresenterHelper.is()) - mxPresenterHelper->releaseMouse(mxWindow); - - if (meButtonDownArea != None && meButtonDownArea == GetArea(rEvent.X, rEvent.Y)) - { - switch (meButtonDownArea) - { - case PrevButton: - SetThumbPosition(mnThumbPosition - mnTotalSize / 100.0, true, true, true); - break; - - case NextButton: - SetThumbPosition(mnThumbPosition + mnTotalSize / 100.0, true, true, true); - break; - - case PagerUp: - SetThumbPosition(mnThumbPosition - mnTotalSize / 20.0, true, true, true); - break; - case PagerDown: - SetThumbPosition(mnThumbPosition + mnTotalSize / 20.0, true, true, true); - break; + mpMousePressRepeater->Stop(); - default: - break; - } - } + if (mxPresenterHelper.is()) + mxPresenterHelper->releaseMouse(mxWindow); } @@ -471,6 +532,8 @@ void SAL_CALL PresenterScrollBar::mouseExited (const css::awt::MouseEvent& rEven } meButtonDownArea = None; meMouseMoveArea = None; + + mpMousePressRepeater->Stop(); } @@ -492,6 +555,7 @@ void SAL_CALL PresenterScrollBar::mouseMoved (const css::awt::MouseEvent& rEvent if (meMouseMoveArea != None) Repaint(GetRectangle(meMouseMoveArea), true); } + mpMousePressRepeater->SetMouseArea(eArea); } @@ -502,6 +566,9 @@ void SAL_CALL PresenterScrollBar::mouseDragged (const css::awt::MouseEvent& rEve { if (meButtonDownArea != Thumb) return; + + mpMousePressRepeater->Stop(); + if (mxPresenterHelper.is()) mxPresenterHelper->captureMouse(mxWindow); @@ -509,7 +576,7 @@ void SAL_CALL PresenterScrollBar::mouseDragged (const css::awt::MouseEvent& rEve UpdateDragAnchor(nDragDistance); if (nDragDistance != 0) { - SetThumbPosition(mnThumbPosition + nDragDistance, true, true, true); + SetThumbPosition(mnThumbPosition + nDragDistance, false, true, true); } } @@ -554,6 +621,24 @@ void PresenterScrollBar::Repaint ( +void PresenterScrollBar::PaintBackground( + const css::awt::Rectangle& rUpdateBox) +{ + if (mpBackgroundBitmap.get() == NULL) + return; + + const awt::Rectangle aWindowBox (mxWindow->getPosSize()); + mpCanvasHelper->Paint( + mpBackgroundBitmap, + mxCanvas, + rUpdateBox, + aWindowBox, + awt::Rectangle()); +} + + + + void PresenterScrollBar::PaintBitmap( const css::awt::Rectangle& rUpdateBox, const Area eArea, @@ -1141,4 +1226,121 @@ void PresenterHorizontalScrollBar::PaintComposite( +//===== PresenterScrollBar::MousePressRepeater ================================ + +PresenterScrollBar::MousePressRepeater::MousePressRepeater ( + const ::rtl::Reference<PresenterScrollBar>& rpScrollBar) + : mnMousePressRepeaterTaskId(PresenterTimer::NotAValidTaskId), + mpScrollBar(rpScrollBar), + meMouseArea(PresenterScrollBar::None) +{ +} + + + + +void PresenterScrollBar::MousePressRepeater::Dispose (void) +{ + Stop(); + mpScrollBar = NULL; +} + + + + +void PresenterScrollBar::MousePressRepeater::Start (const PresenterScrollBar::Area& reArea) +{ + meMouseArea = reArea; + + if (mnMousePressRepeaterTaskId == PresenterTimer::NotAValidTaskId) + { + // Execute key press operation at least this one time. + Execute(); + + // Schedule repeated executions. + mnMousePressRepeaterTaskId = PresenterTimer::ScheduleRepeatedTask ( + ::boost::bind(&PresenterScrollBar::MousePressRepeater::Callback, shared_from_this(), _1), + 500000000, + 250000000); + } + else + { + // There is already an active repeating task. + } +} + + + + +void PresenterScrollBar::MousePressRepeater::Stop (void) +{ + if (mnMousePressRepeaterTaskId != PresenterTimer::NotAValidTaskId) + { + const sal_Int32 nTaskId (mnMousePressRepeaterTaskId); + mnMousePressRepeaterTaskId = PresenterTimer::NotAValidTaskId; + PresenterTimer::CancelTask(nTaskId); + } +} + + + + +void PresenterScrollBar::MousePressRepeater::SetMouseArea(const PresenterScrollBar::Area& reArea) +{ + if (meMouseArea != reArea) + { + if (mnMousePressRepeaterTaskId != PresenterTimer::NotAValidTaskId) + { + Stop(); + } + } +} + + + + +void PresenterScrollBar::MousePressRepeater::Callback (const TimeValue& rCurrentTime) +{ + (void)rCurrentTime; + + if (mpScrollBar.get() == NULL) + { + Stop(); + return; + } + + Execute(); +} + + + + +void PresenterScrollBar::MousePressRepeater::Execute (void) +{ + const double nThumbPosition (mpScrollBar->GetThumbPosition()); + switch (meMouseArea) + { + case PrevButton: + mpScrollBar->SetThumbPosition(nThumbPosition - mpScrollBar->GetLineHeight(), true); + break; + + case NextButton: + mpScrollBar->SetThumbPosition(nThumbPosition + mpScrollBar->GetLineHeight(), true); + break; + + case PagerUp: + mpScrollBar->SetThumbPosition(nThumbPosition - mpScrollBar->GetThumbSize()*0.8, true); + break; + + case PagerDown: + mpScrollBar->SetThumbPosition(nThumbPosition + mpScrollBar->GetThumbSize()*0.8, true); + break; + + default: + break; + } +} + + + } } // end of namespace ::sdext::presenter |