// Modified by:
// Created: 20.08.00
// RCS-ID: $Id$
-// Copyright: (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// Licence: wxWindows license
+// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
+// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_UNIV_SCROLBAR_H_
#define _WX_UNIV_SCROLBAR_H_
-#ifdef __GNUG__
- #pragma interface "univscrolbar.h"
-#endif
-
-class WXDLLEXPORT wxScrollTimer;
+class WXDLLIMPEXP_FWD_CORE wxScrollTimer;
#include "wx/univ/scrarrow.h"
+#include "wx/renderer.h"
// ----------------------------------------------------------------------------
// the actions supported by this control
// wxScrollBar
// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxScrollBar : public wxScrollBarBase,
+class WXDLLIMPEXP_CORE wxScrollBar : public wxScrollBarBase,
public wxControlWithArrows
{
public:
virtual void SetThumbPosition(int thumbPos);
virtual void SetScrollbar(int position, int thumbSize,
int range, int pageSize,
- bool refresh = TRUE);
+ bool refresh = true);
// wxScrollBar actions
void ScrollToStart();
void ScrollToEnd();
- void ScrollLines(int nLines);
- void ScrollPages(int nPages);
+ bool ScrollLines(int nLines);
+ bool ScrollPages(int nPages);
virtual bool PerformAction(const wxControlAction& action,
long numArg = 0,
const wxString& strArg = wxEmptyString);
+ static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef);
+ virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef)
+ {
+ return GetStdInputHandler(handlerDef);
+ }
+
+ // scrollbars around a normal window should not receive the focus
+ virtual bool AcceptsFocus() const;
+
// wxScrollBar sub elements state (combination of wxCONTROL_XXX)
void SetState(Element which, int flags);
int GetState(Element which) const;
virtual int GetArrowState(wxScrollArrows::Arrow arrow) const;
virtual void SetArrowFlag(wxScrollArrows::Arrow arrow, int flag, bool set);
virtual bool OnArrow(wxScrollArrows::Arrow arrow);
- virtual wxScrollArrows::Arrow HitTest(const wxPoint& pt) const;
+ virtual wxScrollArrows::Arrow HitTestArrow(const wxPoint& pt) const;
// for wxControlRenderer::DrawScrollbar() only
const wxScrollArrows& GetArrows() const { return m_arrows; }
+ // returns one of wxHT_SCROLLBAR_XXX constants
+ wxHitTest HitTestBar(const wxPoint& pt) const;
+
+ // idle processing
+ virtual void OnInternalIdle();
+
protected:
virtual wxSize DoGetBestClientSize() const;
virtual void DoDraw(wxControlRenderer *renderer);
virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; }
- // event handlers
- void OnIdle(wxIdleEvent& event);
+ // forces update of thumb's visual appearence (does nothing if m_dirty=false)
+ void UpdateThumb();
// SetThumbPosition() helper
void DoSetThumb(int thumbPos);
// common part of all ctors
void Init();
+ // is this scrollbar attached to a window or a standalone control?
+ bool IsStandalone() const;
+
+ // scrollbar geometry methods:
+
+ // gets the bounding box for a scrollbar element for the given (by default
+ // - current) thumb position
+ wxRect GetScrollbarRect(wxScrollBar::Element elem, int thumbPos = -1) const;
+
+ // returns the size of the scrollbar shaft excluding the arrows
+ wxCoord GetScrollbarSize() const;
+
+ // translate the scrollbar position (in logical units) into physical
+ // coordinate (in pixels) and the other way round
+ wxCoord ScrollbarToPixel(int thumbPos = -1);
+ int PixelToScrollbar(wxCoord coord);
+
+ // return the starting and ending positions, in pixels, of the thumb of a
+ // scrollbar with the given logical position, thumb size and range and the
+ // given physical length
+ static void GetScrollBarThumbSize(wxCoord length,
+ int thumbPos,
+ int thumbSize,
+ int range,
+ wxCoord *thumbStart,
+ wxCoord *thumbEnd);
+
private:
// total range of the scrollbar in logical units
int m_range;
// the object handling the arrows
wxScrollArrows m_arrows;
+ friend WXDLLIMPEXP_CORE class wxControlRenderer; // for geometry methods
+ friend class wxStdScrollBarInputHandler; // for geometry methods
+
DECLARE_EVENT_TABLE()
DECLARE_DYNAMIC_CLASS(wxScrollBar)
};
// ----------------------------------------------------------------------------
-// common scrollbar input handler: it manages clicks on the standard scrollbar
-// elements (line arrows, bar, thumb)
+// Standard scrollbar input handler which can be used as a base class
// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxStdScrollBarInputHandler : public wxStdInputHandler
+class WXDLLIMPEXP_CORE wxStdScrollBarInputHandler : public wxStdInputHandler
{
public:
// constructor takes a renderer (used for scrollbar hit testing) and the
wxStdScrollBarInputHandler(wxRenderer *renderer,
wxInputHandler *inphand);
- virtual bool HandleKey(wxControl *control,
+ virtual bool HandleKey(wxInputConsumer *consumer,
const wxKeyEvent& event,
bool pressed);
- virtual bool HandleMouse(wxControl *control,
+ virtual bool HandleMouse(wxInputConsumer *consumer,
const wxMouseEvent& event);
- virtual bool HandleMouseMove(wxControl *control, const wxMouseEvent& event);
+ virtual bool HandleMouseMove(wxInputConsumer *consumer, const wxMouseEvent& event);
virtual ~wxStdScrollBarInputHandler();
// this method is called by wxScrollBarTimer only and may be overridden
//
- // return TRUE to continue scrolling, FALSE to stop the timer
+ // return true to continue scrolling, false to stop the timer
virtual bool OnScrollTimer(wxScrollBar *scrollbar,
const wxControlAction& action);
protected:
- // the methods which must be overridden in the derived class
-
- // return TRUE if the mouse button can be used to activate scrollbar, FALSE
- // if not (only left mouse button can do it under Windows, any button under
- // GTK+)
- virtual bool IsAllowedButton(int button) = 0;
+ // return true if the mouse button can be used to activate scrollbar, false
+ // if not (any button under GTK+ unlike left button only which is default)
+ virtual bool IsAllowedButton(int button) const
+ { return button == wxMOUSE_BTN_LEFT; }
// set or clear the specified flag on the scrollbar element corresponding
// to m_htLast
// generate a "thumb move" action for this mouse event
void HandleThumbMove(wxScrollBar *scrollbar, const wxMouseEvent& event);
+
// the window (scrollbar) which has capture or NULL and the flag telling if
// the mouse is inside the element which captured it or not
wxWindow *m_winCapture;