X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a3870b2ff595ba4bb4f0397ace77ceeb9628e94d..7344108e8a129a3f9b4df5ab0f98a1713db03b89:/include/wx/univ/scrolbar.h diff --git a/include/wx/univ/scrolbar.h b/include/wx/univ/scrolbar.h index f43002deb5..5963989dcf 100644 --- a/include/wx/univ/scrolbar.h +++ b/include/wx/univ/scrolbar.h @@ -6,42 +6,39 @@ // 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_ -#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 // ---------------------------------------------------------------------------- // 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 -#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 // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxScrollBar : public wxScrollBarBase, +class WXDLLIMPEXP_CORE wxScrollBar : public wxScrollBarBase, public wxControlWithArrows { public: @@ -87,18 +84,27 @@ 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; @@ -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 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); @@ -129,6 +141,33 @@ protected: // 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; @@ -153,16 +192,18 @@ private: // 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 @@ -170,28 +211,26 @@ public: 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 @@ -215,6 +254,7 @@ protected: // 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;