X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/442b35b53bf95f5c6c003ea9ddbefd17adbc2a00..963907fa8fbeea14a9c412d90bf938fbd59583ce:/src/univ/scrolbar.cpp diff --git a/src/univ/scrolbar.cpp b/src/univ/scrolbar.cpp index 5526d7ef42..8626070f0d 100644 --- a/src/univ/scrolbar.cpp +++ b/src/univ/scrolbar.cpp @@ -6,7 +6,7 @@ // 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 // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #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/log.h" #define WXDEBUG_SCROLLBAR @@ -49,6 +50,10 @@ #undef WXDEBUG_SCROLLBAR #endif // !__WXDEBUG__ +#if defined(WXDEBUG_SCROLLBAR) && defined(__WXMSW__) && !defined(__WXMICROWIN__) +#include "wx/msw/private.h" +#endif + // ---------------------------------------------------------------------------- // wxScrollBarTimer: this class is used to repeatedly scroll the scrollbar // when the mouse is help pressed on the arrow or on the bar. It generates the @@ -78,7 +83,6 @@ private: IMPLEMENT_DYNAMIC_CLASS(wxScrollBar, wxControl) BEGIN_EVENT_TABLE(wxScrollBar, wxScrollBarBase) - EVT_IDLE(wxScrollBar::OnIdle) END_EVENT_TABLE() // ---------------------------------------------------------------------------- @@ -143,7 +147,7 @@ bool wxScrollBar::Create(wxWindow *parent, // the scrollbars never have the border style &= ~wxBORDER_MASK; - if ( !wxControl::Create(parent, id, pos, size, style, wxDefaultValidator, name) ) + if ( !wxControl::Create(parent, id, pos, size, style, validator, name) ) return FALSE; SetBestSize(size); @@ -160,6 +164,28 @@ 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 // ---------------------------------------------------------------------------- @@ -295,7 +321,13 @@ wxScrollArrows::Arrow wxScrollBar::HitTest(const wxPoint& pt) const // drawing // ---------------------------------------------------------------------------- -void wxScrollBar::OnIdle(wxIdleEvent& event) +void wxScrollBar::OnInternalIdle() +{ + UpdateThumb(); + wxControl::OnInternalIdle(); +} + +void wxScrollBar::UpdateThumb() { if ( m_dirty ) { @@ -360,7 +392,7 @@ void wxScrollBar::OnIdle(wxIdleEvent& event) } #endif // WXDEBUG_SCROLLBAR - Refresh(TRUE, &rect); + Refresh(FALSE, &rect); } m_elementsState[n] &= ~wxCONTROL_DIRTY; @@ -369,8 +401,6 @@ void wxScrollBar::OnIdle(wxIdleEvent& event) m_dirty = FALSE; } - - event.Skip(); } void wxScrollBar::DoDraw(wxControlRenderer *renderer) @@ -460,6 +490,10 @@ bool wxScrollBar::PerformAction(const wxControlAction& action, { 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 ) @@ -512,6 +546,16 @@ bool wxScrollBar::PerformAction(const wxControlAction& action, 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); @@ -531,14 +575,16 @@ void wxScrollBar::ScrollToEnd() DoSetThumb(m_range - m_thumbSize); } -void wxScrollBar::ScrollLines(int nLines) +bool wxScrollBar::ScrollLines(int nLines) { DoSetThumb(m_thumbPos + nLines); + return TRUE; } -void wxScrollBar::ScrollPages(int nPages) +bool wxScrollBar::ScrollPages(int nPages) { DoSetThumb(m_thumbPos + nPages*m_pageSize); + return TRUE; } // ============================================================================ @@ -653,7 +699,7 @@ void wxStdScrollBarInputHandler::HandleThumbMove(wxScrollBar *scrollbar, scrollbar->PerformAction(wxACTION_SCROLL_THUMB_MOVE, thumbPos); } -bool wxStdScrollBarInputHandler::HandleKey(wxControl *control, +bool wxStdScrollBarInputHandler::HandleKey(wxInputConsumer *consumer, const wxKeyEvent& event, bool pressed) { @@ -669,22 +715,24 @@ bool wxStdScrollBarInputHandler::HandleKey(wxControl *control, case WXK_LEFT: action = wxACTION_SCROLL_LINE_UP; break; case WXK_HOME: action = wxACTION_SCROLL_START; break; case WXK_END: action = wxACTION_SCROLL_END; break; + case WXK_PAGEUP: case WXK_PRIOR: action = wxACTION_SCROLL_PAGE_UP; break; + case WXK_PAGEDOWN: case WXK_NEXT: action = wxACTION_SCROLL_PAGE_DOWN; break; } if ( !!action ) { - control->PerformAction(action); + consumer->PerformAction(action); return TRUE; } } - return wxStdInputHandler::HandleKey(control, event, pressed); + return wxStdInputHandler::HandleKey(consumer, event, pressed); } -bool wxStdScrollBarInputHandler::HandleMouse(wxControl *control, +bool wxStdScrollBarInputHandler::HandleMouse(wxInputConsumer *consumer, const wxMouseEvent& event) { // is this a click event from an acceptable button? @@ -692,7 +740,7 @@ bool wxStdScrollBarInputHandler::HandleMouse(wxControl *control, if ( (btn != -1) && IsAllowedButton(btn) ) { // determine which part of the window mouse is in - wxScrollBar *scrollbar = wxStaticCast(control, wxScrollBar); + wxScrollBar *scrollbar = wxStaticCast(consumer->GetInputWindow(), wxScrollBar); wxHitTest ht = m_renderer->HitTestScrollbar ( scrollbar, @@ -706,7 +754,7 @@ bool wxStdScrollBarInputHandler::HandleMouse(wxControl *control, if ( !m_winCapture ) { m_btnCapture = btn; - m_winCapture = control; + m_winCapture = consumer->GetInputWindow(); m_winCapture->CaptureMouse(); // generate the command @@ -733,7 +781,7 @@ bool wxStdScrollBarInputHandler::HandleMouse(wxControl *control, break; case wxHT_SCROLLBAR_THUMB: - control->PerformAction(wxACTION_SCROLL_THUMB_DRAG); + consumer->PerformAction(wxACTION_SCROLL_THUMB_DRAG); m_ofsMouse = GetMouseCoord(scrollbar, event) - m_renderer->ScrollbarToPixel(scrollbar); @@ -791,13 +839,13 @@ bool wxStdScrollBarInputHandler::HandleMouse(wxControl *control, } } - return wxStdInputHandler::HandleMouse(control, event); + return wxStdInputHandler::HandleMouse(consumer, event); } -bool wxStdScrollBarInputHandler::HandleMouseMove(wxControl *control, +bool wxStdScrollBarInputHandler::HandleMouseMove(wxInputConsumer *consumer, const wxMouseEvent& event) { - wxScrollBar *scrollbar = wxStaticCast(control, wxScrollBar); + wxScrollBar *scrollbar = wxStaticCast(consumer->GetInputWindow(), wxScrollBar); if ( m_winCapture ) {