]> git.saurik.com Git - wxWidgets.git/blobdiff - src/univ/scrolbar.cpp
alpha support for Scale added
[wxWidgets.git] / src / univ / scrolbar.cpp
index 4445239eb97b64e196393ae12358a91cde27a2e8..752ad21584f257a717cc7b07e1cc45b4b659a730 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     20.08.00
 // RCS-ID:      $Id$
 // Copyright:   (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
 // Created:     20.08.00
 // RCS-ID:      $Id$
 // Copyright:   (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
 /////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
@@ -17,7 +17,7 @@
 // headers
 // ----------------------------------------------------------------------------
 
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "univscrolbar.h"
 #endif
 
     #pragma implementation "univscrolbar.h"
 #endif
 
@@ -42,6 +42,7 @@
 #include "wx/univ/renderer.h"
 #include "wx/univ/inphand.h"
 #include "wx/univ/theme.h"
 #include "wx/univ/renderer.h"
 #include "wx/univ/inphand.h"
 #include "wx/univ/theme.h"
+#include "wx/log.h"
 
 #define WXDEBUG_SCROLLBAR
 
 
 #define WXDEBUG_SCROLLBAR
 
@@ -82,7 +83,6 @@ private:
 IMPLEMENT_DYNAMIC_CLASS(wxScrollBar, wxControl)
 
 BEGIN_EVENT_TABLE(wxScrollBar, wxScrollBarBase)
 IMPLEMENT_DYNAMIC_CLASS(wxScrollBar, wxControl)
 
 BEGIN_EVENT_TABLE(wxScrollBar, wxScrollBarBase)
-    EVT_IDLE(wxScrollBar::OnIdle)
 END_EVENT_TABLE()
 
 // ----------------------------------------------------------------------------
 END_EVENT_TABLE()
 
 // ----------------------------------------------------------------------------
@@ -133,7 +133,7 @@ void wxScrollBar::Init()
         m_elementsState[n] = 0;
     }
 
         m_elementsState[n] = 0;
     }
 
-    m_dirty = FALSE;
+    m_dirty = false;
 }
 
 bool wxScrollBar::Create(wxWindow *parent,
 }
 
 bool wxScrollBar::Create(wxWindow *parent,
@@ -147,8 +147,8 @@ bool wxScrollBar::Create(wxWindow *parent,
     // the scrollbars never have the border
     style &= ~wxBORDER_MASK;
 
     // the scrollbars never have the border
     style &= ~wxBORDER_MASK;
 
-    if ( !wxControl::Create(parent, id, pos, size, style, wxDefaultValidator, name) )
-        return FALSE;
+    if ( !wxControl::Create(parent, id, pos, size, style, validator, name) )
+        return false;
 
     SetBestSize(size);
 
 
     SetBestSize(size);
 
@@ -157,13 +157,35 @@ bool wxScrollBar::Create(wxWindow *parent,
 
     CreateInputHandler(wxINP_HANDLER_SCROLLBAR);
 
 
     CreateInputHandler(wxINP_HANDLER_SCROLLBAR);
 
-    return TRUE;
+    return true;
 }
 
 wxScrollBar::~wxScrollBar()
 {
 }
 
 }
 
 wxScrollBar::~wxScrollBar()
 {
 }
 
+// ----------------------------------------------------------------------------
+// misc accessors
+// ----------------------------------------------------------------------------
+
+bool wxScrollBar::IsStandalone() const
+{
+    wxWindow *parent = GetParent();
+    if ( !parent )
+    {
+        return true;
+    }
+
+    return (parent->GetScrollbar(wxHORIZONTAL) != this) &&
+           (parent->GetScrollbar(wxVERTICAL) != this);
+}
+
+bool wxScrollBar::AcceptsFocus() const
+{
+    // the window scrollbars never accept focus
+    return wxScrollBarBase::AcceptsFocus() && IsStandalone();
+}
+
 // ----------------------------------------------------------------------------
 // scrollbar API
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // scrollbar API
 // ----------------------------------------------------------------------------
@@ -200,7 +222,7 @@ void wxScrollBar::DoSetThumb(int pos)
     m_elementsState[Element_Thumb] |= wxCONTROL_DIRTY;
     m_elementsState[m_thumbPos > m_thumbPosOld
                         ? Element_Bar_1 : Element_Bar_2] |= wxCONTROL_DIRTY;
     m_elementsState[Element_Thumb] |= wxCONTROL_DIRTY;
     m_elementsState[m_thumbPos > m_thumbPosOld
                         ? Element_Bar_1 : Element_Bar_2] |= wxCONTROL_DIRTY;
-    m_dirty = TRUE;
+    m_dirty = true;
 }
 
 int wxScrollBar::GetThumbPosition() const
 }
 
 int wxScrollBar::GetThumbPosition() const
@@ -299,7 +321,13 @@ wxScrollArrows::Arrow wxScrollBar::HitTest(const wxPoint& pt) const
 // drawing
 // ----------------------------------------------------------------------------
 
 // drawing
 // ----------------------------------------------------------------------------
 
-void wxScrollBar::OnIdle(wxIdleEvent& event)
+void wxScrollBar::OnInternalIdle()
+{
+    UpdateThumb();
+    wxControl::OnInternalIdle();
+}
+
+void wxScrollBar::UpdateThumb()
 {
     if ( m_dirty )
     {
 {
     if ( m_dirty )
     {
@@ -348,7 +376,7 @@ void wxScrollBar::OnIdle(wxIdleEvent& event)
                     }
 
 #ifdef WXDEBUG_SCROLLBAR
                     }
 
 #ifdef WXDEBUG_SCROLLBAR
-        static bool s_refreshDebug = FALSE;
+        static bool s_refreshDebug = false;
         if ( s_refreshDebug )
         {
             wxClientDC dc(this);
         if ( s_refreshDebug )
         {
             wxClientDC dc(this);
@@ -364,17 +392,15 @@ void wxScrollBar::OnIdle(wxIdleEvent& event)
         }
 #endif // WXDEBUG_SCROLLBAR
 
         }
 #endif // WXDEBUG_SCROLLBAR
 
-                    Refresh(TRUE, &rect);
+                    Refresh(false, &rect);
                 }
 
                 m_elementsState[n] &= ~wxCONTROL_DIRTY;
             }
         }
 
                 }
 
                 m_elementsState[n] &= ~wxCONTROL_DIRTY;
             }
         }
 
-        m_dirty = FALSE;
+        m_dirty = false;
     }
     }
-
-    event.Skip();
 }
 
 void wxScrollBar::DoDraw(wxControlRenderer *renderer)
 }
 
 void wxScrollBar::DoDraw(wxControlRenderer *renderer)
@@ -382,7 +408,7 @@ void wxScrollBar::DoDraw(wxControlRenderer *renderer)
     renderer->DrawScrollbar(this, m_thumbPosOld);
 
     // clear all dirty flags
     renderer->DrawScrollbar(this, m_thumbPosOld);
 
     // clear all dirty flags
-    m_dirty = FALSE;
+    m_dirty = false;
     m_thumbPosOld = -1;
 }
 
     m_thumbPosOld = -1;
 }
 
@@ -430,7 +456,7 @@ void wxScrollBar::SetState(Element which, int flags)
     {
         m_elementsState[which] = flags | wxCONTROL_DIRTY;
 
     {
         m_elementsState[which] = flags | wxCONTROL_DIRTY;
 
-        m_dirty = TRUE;
+        m_dirty = true;
     }
 }
 
     }
 }
 
@@ -455,7 +481,7 @@ bool wxScrollBar::PerformAction(const wxControlAction& action,
 {
     int thumbOld = m_thumbPos;
 
 {
     int thumbOld = m_thumbPos;
 
-    bool notify = FALSE; // send an event about the change?
+    bool notify = false; // send an event about the change?
 
     wxEventType scrollType;
 
 
     wxEventType scrollType;
 
@@ -464,6 +490,10 @@ bool wxScrollBar::PerformAction(const wxControlAction& action,
     {
         DoSetThumb(numArg);
 
     {
         DoSetThumb(numArg);
 
+        // VS: we have to force redraw here, otherwise the thumb will lack
+        //     behind mouse cursor
+        UpdateThumb();
+
         scrollType = wxEVT_SCROLLWIN_THUMBTRACK;
     }
     else if ( action == wxACTION_SCROLL_LINE_UP )
         scrollType = wxEVT_SCROLLWIN_THUMBTRACK;
     }
     else if ( action == wxACTION_SCROLL_LINE_UP )
@@ -506,7 +536,7 @@ bool wxScrollBar::PerformAction(const wxControlAction& action,
     else if ( action == wxACTION_SCROLL_THUMB_RELEASE )
     {
         // always notify about this
     else if ( action == wxACTION_SCROLL_THUMB_RELEASE )
     {
         // always notify about this
-        notify = TRUE;
+        notify = true;
         scrollType = wxEVT_SCROLLWIN_THUMBRELEASE;
     }
     else
         scrollType = wxEVT_SCROLLWIN_THUMBRELEASE;
     }
     else
@@ -516,13 +546,23 @@ bool wxScrollBar::PerformAction(const wxControlAction& action,
     bool changed = m_thumbPos != thumbOld;
     if ( notify || changed )
     {
     bool changed = m_thumbPos != thumbOld;
     if ( notify || changed )
     {
+        if ( IsStandalone() )
+        {
+            // we should generate EVT_SCROLL events for the standalone
+            // scrollbars and not the EVT_SCROLLWIN ones
+            //
+            // NB: we assume that scrollbar events are sequentially numbered
+            //     but this should be ok as other code relies on this as well
+            scrollType += wxEVT_SCROLL_TOP - wxEVT_SCROLLWIN_TOP;
+        }
+
         wxScrollWinEvent event(scrollType, m_thumbPos,
                                IsVertical() ? wxVERTICAL : wxHORIZONTAL);
         event.SetEventObject(this);
         GetParent()->GetEventHandler()->ProcessEvent(event);
     }
 
         wxScrollWinEvent event(scrollType, m_thumbPos,
                                IsVertical() ? wxVERTICAL : wxHORIZONTAL);
         event.SetEventObject(this);
         GetParent()->GetEventHandler()->ProcessEvent(event);
     }
 
-    return TRUE;
+    return true;
 }
 
 void wxScrollBar::ScrollToStart()
 }
 
 void wxScrollBar::ScrollToStart()
@@ -538,13 +578,13 @@ void wxScrollBar::ScrollToEnd()
 bool wxScrollBar::ScrollLines(int nLines)
 {
     DoSetThumb(m_thumbPos + nLines);
 bool wxScrollBar::ScrollLines(int nLines)
 {
     DoSetThumb(m_thumbPos + nLines);
-    return TRUE;
+    return true;
 }
 
 bool wxScrollBar::ScrollPages(int nPages)
 {
     DoSetThumb(m_thumbPos + nPages*m_pageSize);
 }
 
 bool wxScrollBar::ScrollPages(int nPages)
 {
     DoSetThumb(m_thumbPos + nPages*m_pageSize);
-    return TRUE;
+    return true;
 }
 
 // ============================================================================
 }
 
 // ============================================================================
@@ -614,12 +654,12 @@ bool wxStdScrollBarInputHandler::OnScrollTimer(wxScrollBar *scrollbar,
     int oldThumbPos = scrollbar->GetThumbPosition();
     scrollbar->PerformAction(action);
     if ( scrollbar->GetThumbPosition() != oldThumbPos )
     int oldThumbPos = scrollbar->GetThumbPosition();
     scrollbar->PerformAction(action);
     if ( scrollbar->GetThumbPosition() != oldThumbPos )
-        return TRUE;
+        return true;
 
     // we scrolled till the end
     m_timerScroll->Stop();
 
 
     // we scrolled till the end
     m_timerScroll->Stop();
 
-    return FALSE;
+    return false;
 }
 
 void wxStdScrollBarInputHandler::StopScrolling(wxScrollBar *control)
 }
 
 void wxStdScrollBarInputHandler::StopScrolling(wxScrollBar *control)
@@ -640,7 +680,7 @@ void wxStdScrollBarInputHandler::StopScrolling(wxScrollBar *control)
     }
 
     // unpress the arrow and highlight the current element
     }
 
     // unpress the arrow and highlight the current element
-    Press(control, FALSE);
+    Press(control, false);
 }
 
 wxCoord
 }
 
 wxCoord
@@ -681,11 +721,11 @@ bool wxStdScrollBarInputHandler::HandleKey(wxInputConsumer *consumer,
             case WXK_NEXT:      action = wxACTION_SCROLL_PAGE_DOWN; break;
         }
 
             case WXK_NEXT:      action = wxACTION_SCROLL_PAGE_DOWN; break;
         }
 
-        if ( !!action )
+        if ( !action.IsEmpty() )
         {
             consumer->PerformAction(action);
 
         {
             consumer->PerformAction(action);
 
-            return TRUE;
+            return true;
         }
     }
 
         }
     }
 
@@ -718,7 +758,7 @@ bool wxStdScrollBarInputHandler::HandleMouse(wxInputConsumer *consumer,
                 m_winCapture->CaptureMouse();
 
                 // generate the command
                 m_winCapture->CaptureMouse();
 
                 // generate the command
-                bool hasAction = TRUE;
+                bool hasAction = true;
                 wxControlAction action;
                 switch ( ht )
                 {
                 wxControlAction action;
                 switch ( ht )
                 {
@@ -748,18 +788,18 @@ bool wxStdScrollBarInputHandler::HandleMouse(wxInputConsumer *consumer,
                         // fall through: there is no immediate action
 
                     default:
                         // fall through: there is no immediate action
 
                     default:
-                        hasAction = FALSE;
+                        hasAction = false;
                 }
 
                 // remove highlighting
                 }
 
                 // remove highlighting
-                Highlight(scrollbar, FALSE);
+                Highlight(scrollbar, false);
                 m_htLast = ht;
 
                 // and press the arrow or highlight thumb now instead
                 if ( m_htLast == wxHT_SCROLLBAR_THUMB )
                 m_htLast = ht;
 
                 // and press the arrow or highlight thumb now instead
                 if ( m_htLast == wxHT_SCROLLBAR_THUMB )
-                    Highlight(scrollbar, TRUE);
+                    Highlight(scrollbar, true);
                 else
                 else
-                    Press(scrollbar, TRUE);
+                    Press(scrollbar, true);
 
                 // start dragging
                 if ( hasAction )
 
                 // start dragging
                 if ( hasAction )
@@ -787,7 +827,7 @@ bool wxStdScrollBarInputHandler::HandleMouse(wxInputConsumer *consumer,
                 }
 
                 m_htLast = ht;
                 }
 
                 m_htLast = ht;
-                Highlight(scrollbar, TRUE);
+                Highlight(scrollbar, true);
             }
             else
             {
             }
             else
             {
@@ -809,22 +849,22 @@ bool wxStdScrollBarInputHandler::HandleMouseMove(wxInputConsumer *consumer,
 
     if ( m_winCapture )
     {
 
     if ( m_winCapture )
     {
-        if ( (m_htLast == wxHT_SCROLLBAR_THUMB) && event.Moving() )
+        if ( (m_htLast == wxHT_SCROLLBAR_THUMB) && event.Dragging() )
         {
             // make the thumb follow the mouse by keeping the same offset
             // between the mouse position and the top/left of the thumb
             HandleThumbMove(scrollbar, event);
 
         {
             // make the thumb follow the mouse by keeping the same offset
             // between the mouse position and the top/left of the thumb
             HandleThumbMove(scrollbar, event);
 
-            return TRUE;
+            return true;
         }
 
         // no other changes are possible while the mouse is captured
         }
 
         // no other changes are possible while the mouse is captured
-        return FALSE;
+        return false;
     }
 
     bool isArrow = scrollbar->GetArrows().HandleMouseMove(event);
 
     }
 
     bool isArrow = scrollbar->GetArrows().HandleMouseMove(event);
 
-    if ( event.Moving() )
+    if ( event.Dragging() )
     {
         wxHitTest ht = m_renderer->HitTestScrollbar
                                    (
     {
         wxHitTest ht = m_renderer->HitTestScrollbar
                                    (
@@ -834,35 +874,35 @@ bool wxStdScrollBarInputHandler::HandleMouseMove(wxInputConsumer *consumer,
         if ( ht == m_htLast )
         {
             // nothing changed
         if ( ht == m_htLast )
         {
             // nothing changed
-            return FALSE;
+            return false;
         }
 
 #ifdef DEBUG_MOUSE
         wxLogDebug("Scrollbar::OnMouseMove: ht = %d", ht);
 #endif // DEBUG_MOUSE
 
         }
 
 #ifdef DEBUG_MOUSE
         wxLogDebug("Scrollbar::OnMouseMove: ht = %d", ht);
 #endif // DEBUG_MOUSE
 
-        Highlight(scrollbar, FALSE);
+        Highlight(scrollbar, false);
         m_htLast = ht;
 
         if ( !isArrow )
         m_htLast = ht;
 
         if ( !isArrow )
-            Highlight(scrollbar, TRUE);
+            Highlight(scrollbar, true);
         //else: already done by wxScrollArrows::HandleMouseMove
     }
     else if ( event.Leaving() )
     {
         if ( !isArrow )
         //else: already done by wxScrollArrows::HandleMouseMove
     }
     else if ( event.Leaving() )
     {
         if ( !isArrow )
-            Highlight(scrollbar, FALSE);
+            Highlight(scrollbar, false);
 
         m_htLast = wxHT_NOWHERE;
     }
     else // event.Entering()
     {
         // we don't process this event
 
         m_htLast = wxHT_NOWHERE;
     }
     else // event.Entering()
     {
         // we don't process this event
-        return FALSE;
+        return false;
     }
 
     // we did something
     }
 
     // we did something
-    return TRUE;
+    return true;
 }
 
 #endif // wxUSE_SCROLLBAR
 }
 
 #endif // wxUSE_SCROLLBAR
@@ -873,7 +913,7 @@ bool wxStdScrollBarInputHandler::HandleMouseMove(wxInputConsumer *consumer,
 
 wxScrollTimer::wxScrollTimer()
 {
 
 wxScrollTimer::wxScrollTimer()
 {
-    m_skipNext = FALSE;
+    m_skipNext = false;
 }
 
 void wxScrollTimer::StartAutoScroll()
 }
 
 void wxScrollTimer::StartAutoScroll()
@@ -888,7 +928,7 @@ void wxScrollTimer::StartAutoScroll()
     // there is an initial delay before the scrollbar starts scrolling -
     // implement it by ignoring the first timer expiration and only start
     // scrolling from the second one
     // there is an initial delay before the scrollbar starts scrolling -
     // implement it by ignoring the first timer expiration and only start
     // scrolling from the second one
-    m_skipNext = TRUE;
+    m_skipNext = true;
     Start(200); // FIXME: hardcoded delay
 }
 
     Start(200); // FIXME: hardcoded delay
 }
 
@@ -900,7 +940,7 @@ void wxScrollTimer::Notify()
         Stop();
         Start(50); // FIXME: hardcoded delay
 
         Stop();
         Start(50); // FIXME: hardcoded delay
 
-        m_skipNext = FALSE;
+        m_skipNext = false;
     }
     else
     {
     }
     else
     {