]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/scrlwing.cpp
Applied #8804 ([wxMac] wxSpinCtrl behaviour)
[wxWidgets.git] / src / generic / scrlwing.cpp
index 49b8673eb434270b512ac16dc5155cf752492a48..e8154d1559d9bab4856560b6a1df55cd75ac62c3 100644 (file)
@@ -86,7 +86,7 @@ private:
 
     bool m_hasDrawnWindow;
 
-    DECLARE_NO_COPY_CLASS(wxScrollHelperEvtHandler)
+    wxDECLARE_NO_COPY_CLASS(wxScrollHelperEvtHandler);
 };
 
 #if wxUSE_TIMER
@@ -112,7 +112,7 @@ private:
     int m_pos,
         m_orient;
 
-    DECLARE_NO_COPY_CLASS(wxAutoScrollTimer)
+    wxDECLARE_NO_COPY_CLASS(wxAutoScrollTimer);
 };
 
 // ============================================================================
@@ -152,7 +152,7 @@ void wxAutoScrollTimer::Notify()
         {
             // and then send a pseudo mouse-move event to refresh the selection
             wxMouseEvent event2(wxEVT_MOTION);
-            wxGetMousePosition(&event2.m_x, &event2.m_y);
+            event2.SetPosition(wxGetMousePosition());
 
             // the mouse event coordinates should be client, not screen as
             // returned by wxGetMousePosition
@@ -314,7 +314,7 @@ bool wxScrollHelperEvtHandler::ProcessEvent(wxEvent& event)
 
 wxScrollHelperBase::wxScrollHelperBase(wxWindow *win)
 {
-    wxASSERT_MSG( win, _T("associated window can't be NULL in wxScrollHelper") );
+    wxASSERT_MSG( win, wxT("associated window can't be NULL in wxScrollHelper") );
 
     m_xScrollPixelsPerLine =
     m_yScrollPixelsPerLine =
@@ -829,93 +829,70 @@ void wxScrollHelperBase::HandleOnPaint(wxPaintEvent& WXUNUSED(event))
 // this they always have the priority
 void wxScrollHelperBase::HandleOnChar(wxKeyEvent& event)
 {
-    int stx = 0, sty = 0,       // view origin
-        szx = 0, szy = 0,       // view size (total)
-        clix = 0, cliy = 0;     // view size (on screen)
+    // prepare the event this key press maps to
+    wxScrollWinEvent newEvent;
 
-    GetViewStart(&stx, &sty);
-    GetTargetSize(&clix, &cliy);
-    m_targetWindow->GetVirtualSize(&szx, &szy);
+    newEvent.SetPosition(0);
+    newEvent.SetEventObject(m_win);
 
-    if( m_xScrollPixelsPerLine )
-    {
-        clix /= m_xScrollPixelsPerLine;
-        szx /= m_xScrollPixelsPerLine;
-    }
-    else
-    {
-        clix = 0;
-        szx = -1;
-    }
-    if( m_yScrollPixelsPerLine )
-    {
-        cliy /= m_yScrollPixelsPerLine;
-        szy /= m_yScrollPixelsPerLine;
-    }
-    else
-    {
-        cliy = 0;
-        szy = -1;
-    }
+    // this is the default, it's changed to wxHORIZONTAL below if needed
+    newEvent.SetOrientation(wxVERTICAL);
 
-    int xScrollOld = m_xScrollPosition,
-        yScrollOld = m_yScrollPosition;
+    // some key events result in scrolling in both horizontal and vertical
+    // direction, e.g. Ctrl-{Home,End}, if this flag is true we should generate
+    // a second event in horizontal direction in addition to the primary one
+    bool sendHorizontalToo = false;
 
-    int dsty;
     switch ( event.GetKeyCode() )
     {
         case WXK_PAGEUP:
-            dsty = sty - (5 * cliy / 6);
-            Scroll(-1, (dsty == -1) ? 0 : dsty);
+            newEvent.SetEventType(wxEVT_SCROLLWIN_PAGEUP);
             break;
 
         case WXK_PAGEDOWN:
-            Scroll(-1, sty + (5 * cliy / 6));
+            newEvent.SetEventType(wxEVT_SCROLLWIN_PAGEDOWN);
             break;
 
         case WXK_HOME:
-            Scroll(0, event.ControlDown() ? 0 : -1);
-            break;
+            newEvent.SetEventType(wxEVT_SCROLLWIN_TOP);
 
-        case WXK_END:
-            Scroll(szx - clix, event.ControlDown() ? szy - cliy : -1);
+            sendHorizontalToo = event.ControlDown();
             break;
 
-        case WXK_UP:
-            Scroll(-1, sty - 1);
-            break;
+        case WXK_END:
+            newEvent.SetEventType(wxEVT_SCROLLWIN_BOTTOM);
 
-        case WXK_DOWN:
-            Scroll(-1, sty + 1);
+            sendHorizontalToo = event.ControlDown();
             break;
 
         case WXK_LEFT:
-            Scroll(stx - 1, -1);
+            newEvent.SetOrientation(wxHORIZONTAL);
+            // fall through
+
+        case WXK_UP:
+            newEvent.SetEventType(wxEVT_SCROLLWIN_LINEUP);
             break;
 
         case WXK_RIGHT:
-            Scroll(stx + 1, -1);
+            newEvent.SetOrientation(wxHORIZONTAL);
+            // fall through
+
+        case WXK_DOWN:
+            newEvent.SetEventType(wxEVT_SCROLLWIN_LINEDOWN);
             break;
 
         default:
-            // not for us
+            // not a scrolling key
             event.Skip();
+            return;
     }
 
-    if ( m_xScrollPosition != xScrollOld )
-    {
-        wxScrollWinEvent evt(wxEVT_SCROLLWIN_THUMBTRACK, m_xScrollPosition,
-                               wxHORIZONTAL);
-        evt.SetEventObject(m_win);
-        m_win->GetEventHandler()->ProcessEvent(evt);
-    }
+    m_win->ProcessWindowEvent(newEvent);
 
-    if ( m_yScrollPosition != yScrollOld )
+    if ( sendHorizontalToo )
     {
-        wxScrollWinEvent evt(wxEVT_SCROLLWIN_THUMBTRACK, m_yScrollPosition,
-                               wxVERTICAL);
-        evt.SetEventObject(m_win);
-        m_win->GetEventHandler()->ProcessEvent(evt);
+        newEvent.SetOrientation(wxHORIZONTAL);
+        m_win->ProcessWindowEvent(newEvent);
     }
 }
 
@@ -937,7 +914,7 @@ void wxScrollHelperBase::StopAutoScrolling()
     if ( m_timerAutoScroll )
     {
         delete m_timerAutoScroll;
-        m_timerAutoScroll = (wxTimer *)NULL;
+        m_timerAutoScroll = NULL;
     }
 #endif
 }
@@ -990,7 +967,7 @@ void wxScrollHelperBase::HandleOnMouseLeave(wxMouseEvent& event)
                 // but seems to happen sometimes under wxMSW - maybe it's a bug
                 // there but for now just ignore it
 
-                //wxFAIL_MSG( _T("can't understand where has mouse gone") );
+                //wxFAIL_MSG( wxT("can't understand where has mouse gone") );
 
                 return;
             }
@@ -1073,7 +1050,7 @@ void wxScrollHelperBase::HandleOnChildFocus(wxChildFocusEvent& event)
     if ( win == m_targetWindow )
         return; // nothing to do
 
-#ifdef __WXMAC__
+#if defined( __WXOSX__ ) && wxUSE_SCROLLBAR
     if (wxDynamicCast(win, wxScrollBar))
         return;
 #endif
@@ -1280,20 +1257,25 @@ wxScrollHelper::DoAdjustScrollbar(int orient,
     // in wxSHOW_SB_NEVER case don't show the scrollbar even if it's needed, in
     // wxSHOW_SB_ALWAYS case show the scrollbar even if it's not needed by
     // passing a special range value to SetScrollbar()
-    int range wxDUMMY_INITIALIZE(0);
+    int range;
     switch ( visibility )
     {
         case wxSHOW_SB_NEVER:
             range = 0;
             break;
 
+        case wxSHOW_SB_ALWAYS:
+            range = scrollUnits ? scrollUnits : -1;
+            break;
+
+        default:
+            wxFAIL_MSG( wxS("unknown scrollbar visibility") );
+            // fall through
+
         case wxSHOW_SB_DEFAULT:
             range = scrollUnits;
             break;
 
-        case wxSHOW_SB_ALWAYS:
-            range = scrollUnits ? scrollUnits : -1;
-            break;
     }
 
     m_win->SetScrollbar(orient, scrollPosition, scrollLinesPerPage, range);