]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/univ/scrolbar.h
synchronize GTK2 minimum version in docs
[wxWidgets.git] / include / wx / univ / scrolbar.h
index f43002deb5fd73f6b25cf39ab22354c55a6799bb..5963989dcff21a6601e14eb17b29f436f6e75225 100644 (file)
@@ -6,42 +6,39 @@
 // 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
 ///////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_UNIV_SCROLBAR_H_
 #define _WX_UNIV_SCROLBAR_H_
 
 ///////////////////////////////////////////////////////////////////////////////
 
 #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/univ/scrarrow.h"
+#include "wx/renderer.h"
 
 // ----------------------------------------------------------------------------
 // the actions supported by this control
 // ----------------------------------------------------------------------------
 
 // scroll the bar
 
 // ----------------------------------------------------------------------------
 // the actions supported by this control
 // ----------------------------------------------------------------------------
 
 // scroll the bar
-#define wxACTION_SCROLL_START       _T("start")     // to the beginning
-#define wxACTION_SCROLL_END         _T("end")       // to the end
-#define wxACTION_SCROLL_LINE_UP     _T("lineup")    // one line up/left
-#define wxACTION_SCROLL_PAGE_UP     _T("pageup")    // one page up/left
-#define wxACTION_SCROLL_LINE_DOWN   _T("linedown")  // one line down/right
-#define wxACTION_SCROLL_PAGE_DOWN   _T("pagedown")  // one page down/right
+#define wxACTION_SCROLL_START       wxT("start")     // to the beginning
+#define wxACTION_SCROLL_END         wxT("end")       // to the end
+#define wxACTION_SCROLL_LINE_UP     wxT("lineup")    // one line up/left
+#define wxACTION_SCROLL_PAGE_UP     wxT("pageup")    // one page up/left
+#define wxACTION_SCROLL_LINE_DOWN   wxT("linedown")  // one line down/right
+#define wxACTION_SCROLL_PAGE_DOWN   wxT("pagedown")  // one page down/right
 
 // the scrollbar thumb may be dragged
 
 // the scrollbar thumb may be dragged
-#define wxACTION_SCROLL_THUMB_DRAG      _T("thumbdrag")
-#define wxACTION_SCROLL_THUMB_MOVE      _T("thumbmove")
-#define wxACTION_SCROLL_THUMB_RELEASE   _T("thumbrelease")
+#define wxACTION_SCROLL_THUMB_DRAG      wxT("thumbdrag")
+#define wxACTION_SCROLL_THUMB_MOVE      wxT("thumbmove")
+#define wxACTION_SCROLL_THUMB_RELEASE   wxT("thumbrelease")
 
 // ----------------------------------------------------------------------------
 // wxScrollBar
 // ----------------------------------------------------------------------------
 
 
 // ----------------------------------------------------------------------------
 // wxScrollBar
 // ----------------------------------------------------------------------------
 
-class WXDLLEXPORT wxScrollBar : public wxScrollBarBase,
+class WXDLLIMPEXP_CORE wxScrollBar : public wxScrollBarBase,
                                 public wxControlWithArrows
 {
 public:
                                 public wxControlWithArrows
 {
 public:
@@ -87,18 +84,27 @@ public:
     virtual void SetThumbPosition(int thumbPos);
     virtual void SetScrollbar(int position, int thumbSize,
                               int range, int pageSize,
     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();
 
     // 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);
 
 
     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;
     // wxScrollBar sub elements state (combination of wxCONTROL_XXX)
     void SetState(Element which, int flags);
     int GetState(Element which) const;
@@ -110,18 +116,24 @@ public:
     virtual int GetArrowState(wxScrollArrows::Arrow arrow) const;
     virtual void SetArrowFlag(wxScrollArrows::Arrow arrow, int flag, bool set);
     virtual bool OnArrow(wxScrollArrows::Arrow arrow);
     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; }
 
 
     // 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; }
 
 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);
 
     // SetThumbPosition() helper
     void DoSetThumb(int thumbPos);
@@ -129,6 +141,33 @@ protected:
     // common part of all ctors
     void Init();
 
     // 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;
 private:
     // total range of the scrollbar in logical units
     int m_range;
@@ -153,16 +192,18 @@ private:
     // the object handling the arrows
     wxScrollArrows m_arrows;
 
     // 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)
 };
 
 // ----------------------------------------------------------------------------
     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
 {
 public:
     // constructor takes a renderer (used for scrollbar hit testing) and the
@@ -170,28 +211,26 @@ public:
     wxStdScrollBarInputHandler(wxRenderer *renderer,
                                wxInputHandler *inphand);
 
     wxStdScrollBarInputHandler(wxRenderer *renderer,
                                wxInputHandler *inphand);
 
-    virtual bool HandleKey(wxControl *control,
+    virtual bool HandleKey(wxInputConsumer *consumer,
                            const wxKeyEvent& event,
                            bool pressed);
                            const wxKeyEvent& event,
                            bool pressed);
-    virtual bool HandleMouse(wxControl *control,
+    virtual bool HandleMouse(wxInputConsumer *consumer,
                              const wxMouseEvent& event);
                              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
     //
 
     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:
     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
 
     // set or clear the specified flag on the scrollbar element corresponding
     // to m_htLast
@@ -215,6 +254,7 @@ protected:
     // generate a "thumb move" action for this mouse event
     void HandleThumbMove(wxScrollBar *scrollbar, const wxMouseEvent& event);
 
     // 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;
     // 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;