From 4719e58dc1797a219b7e90322e07cc81b5149bdc Mon Sep 17 00:00:00 2001
From: Robin Dunn <robin@alldunn.com>
Date: Thu, 3 Feb 2005 19:18:59 +0000
Subject: [PATCH] Patch [ 1114647 ] Mouse wheel support for wxVScrolledWindow

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31729 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 include/wx/vscroll.h    |  7 +++++++
 src/generic/vscroll.cpp | 29 +++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/include/wx/vscroll.h b/include/wx/vscroll.h
index 6ea2b08393..bdbb29f206 100644
--- a/include/wx/vscroll.h
+++ b/include/wx/vscroll.h
@@ -163,6 +163,9 @@ protected:
     // the event handlers
     void OnSize(wxSizeEvent& event);
     void OnScroll(wxScrollWinEvent& event);
+#if wxUSE_MOUSEWHEEL
+    void OnMouseWheel(wxMouseEvent& event);
+#endif
 
     // find the index of the line we need to show at the top of the window such
     // that the last (fully or partially) visible line is the given one
@@ -193,6 +196,10 @@ private:
     // partly, visible one)
     size_t m_nVisible;
 
+    // accumulated mouse wheel rotation
+#if wxUSE_MOUSEWHEEL
+    int m_sumWheelRotation;
+#endif
 
     DECLARE_EVENT_TABLE()
     DECLARE_NO_COPY_CLASS(wxVScrolledWindow)
diff --git a/src/generic/vscroll.cpp b/src/generic/vscroll.cpp
index 30b888bb2e..d8d57b6e97 100644
--- a/src/generic/vscroll.cpp
+++ b/src/generic/vscroll.cpp
@@ -37,6 +37,9 @@
 BEGIN_EVENT_TABLE(wxVScrolledWindow, wxPanel)
     EVT_SIZE(wxVScrolledWindow::OnSize)
     EVT_SCROLLWIN(wxVScrolledWindow::OnScroll)
+#if wxUSE_MOUSEWHEEL
+    EVT_MOUSEWHEEL(wxVScrolledWindow::OnMouseWheel)
+#endif
 END_EVENT_TABLE()
 
 
@@ -60,6 +63,10 @@ void wxVScrolledWindow::Init()
     m_nVisible = 1;
 
     m_heightTotal = 0;
+
+#if wxUSE_MOUSEWHEEL
+    m_sumWheelRotation = 0;
+#endif
 }
 
 // ----------------------------------------------------------------------------
@@ -421,3 +428,25 @@ void wxVScrolledWindow::OnScroll(wxScrollWinEvent& event)
 #endif // __WXMAC__
 }
 
+#if wxUSE_MOUSEWHEEL
+
+void wxVScrolledWindow::OnMouseWheel(wxMouseEvent& event)
+{
+    m_sumWheelRotation += event.GetWheelRotation();
+    int delta = event.GetWheelDelta();
+
+    // how much to scroll this time
+    int units_to_scroll = -(m_sumWheelRotation/delta);
+    if ( !units_to_scroll )
+        return;
+
+    m_sumWheelRotation += units_to_scroll*delta;
+
+    if ( !event.IsPageScroll() )
+        ScrollLines( units_to_scroll*event.GetLinesPerAction() );
+    else
+        // scroll pages instead of lines
+        ScrollPages( units_to_scroll );
+}
+
+#endif
-- 
2.47.2