| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: wx/univ/scrolbar.h
- // Purpose: wxScrollBar for wxUniversal
- // Author: Vadim Zeitlin
- // Modified by:
- // Created: 20.08.00
- // Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
- // Licence: wxWindows licence
- ///////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_UNIV_SCROLBAR_H_
- #define _WX_UNIV_SCROLBAR_H_
- 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 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 wxT("thumbdrag")
- #define wxACTION_SCROLL_THUMB_MOVE wxT("thumbmove")
- #define wxACTION_SCROLL_THUMB_RELEASE wxT("thumbrelease")
- // ----------------------------------------------------------------------------
- // wxScrollBar
- // ----------------------------------------------------------------------------
- class WXDLLIMPEXP_CORE wxScrollBar : public wxScrollBarBase,
- public wxControlWithArrows
- {
- public:
- // scrollbar elements: they correspond to wxHT_SCROLLBAR_XXX constants but
- // start from 0 which allows to use them as array indices
- enum Element
- {
- Element_Arrow_Line_1,
- Element_Arrow_Line_2,
- Element_Arrow_Page_1,
- Element_Arrow_Page_2,
- Element_Thumb,
- Element_Bar_1,
- Element_Bar_2,
- Element_Max
- };
- wxScrollBar();
- wxScrollBar(wxWindow *parent,
- wxWindowID id,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize,
- long style = wxSB_HORIZONTAL,
- const wxValidator& validator = wxDefaultValidator,
- const wxString& name = wxScrollBarNameStr);
- bool Create(wxWindow *parent,
- wxWindowID id,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize,
- long style = wxSB_HORIZONTAL,
- const wxValidator& validator = wxDefaultValidator,
- const wxString& name = wxScrollBarNameStr);
- virtual ~wxScrollBar();
- // implement base class pure virtuals
- virtual int GetThumbPosition() const;
- virtual int GetThumbSize() const;
- virtual int GetPageSize() const;
- virtual int GetRange() const;
- virtual void SetThumbPosition(int thumbPos);
- virtual void SetScrollbar(int position, int thumbSize,
- int range, int pageSize,
- bool refresh = true);
- // wxScrollBar actions
- void ScrollToStart();
- void ScrollToEnd();
- 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;
- // implement wxControlWithArrows methods
- virtual wxRenderer *GetRenderer() const { return m_renderer; }
- virtual wxWindow *GetWindow() { return this; }
- virtual bool IsVertical() const { return wxScrollBarBase::IsVertical(); }
- 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 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; }
- // 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 current and previous (after last refresh - this is used for
- // repainting optimisation) size of the thumb in logical units (from 0 to
- // m_range) and its position (from 0 to m_range - m_thumbSize)
- int m_thumbSize,
- m_thumbPos,
- m_thumbPosOld;
- // the page size, i.e. the number of lines by which to scroll when page
- // up/down action is performed
- int m_pageSize;
- // the state of the sub elements
- int m_elementsState[Element_Max];
- // the dirty flag: if set, scrollbar must be updated
- bool m_dirty;
- // 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)
- };
- // ----------------------------------------------------------------------------
- // Standard scrollbar input handler which can be used as a base class
- // ----------------------------------------------------------------------------
- class WXDLLIMPEXP_CORE wxStdScrollBarInputHandler : public wxStdInputHandler
- {
- public:
- // constructor takes a renderer (used for scrollbar hit testing) and the
- // base handler to which all unhandled events are forwarded
- wxStdScrollBarInputHandler(wxRenderer *renderer,
- wxInputHandler *inphand);
- virtual bool HandleKey(wxInputConsumer *consumer,
- const wxKeyEvent& event,
- bool pressed);
- virtual bool HandleMouse(wxInputConsumer *consumer,
- 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
- virtual bool OnScrollTimer(wxScrollBar *scrollbar,
- const wxControlAction& action);
- protected:
- // 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
- void SetElementState(wxScrollBar *scrollbar, int flag, bool doIt);
- // [un]highlight the scrollbar element corresponding to m_htLast
- virtual void Highlight(wxScrollBar *scrollbar, bool doIt)
- { SetElementState(scrollbar, wxCONTROL_CURRENT, doIt); }
- // [un]press the scrollbar element corresponding to m_htLast
- virtual void Press(wxScrollBar *scrollbar, bool doIt)
- { SetElementState(scrollbar, wxCONTROL_PRESSED, doIt); }
- // stop scrolling because we reached the end point
- void StopScrolling(wxScrollBar *scrollbar);
- // get the mouse coordinates in the scrollbar direction from the event
- wxCoord GetMouseCoord(const wxScrollBar *scrollbar,
- const wxMouseEvent& event) const;
- // 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;
- bool m_winHasMouse;
- int m_btnCapture; // the mouse button which has captured mouse
- // the position where we started scrolling by page
- wxPoint m_ptStartScrolling;
- // one of wxHT_SCROLLBAR_XXX value: where has the mouse been last time?
- wxHitTest m_htLast;
- // the renderer (we use it only for hit testing)
- wxRenderer *m_renderer;
- // the offset of the top/left of the scrollbar relative to the mouse to
- // keep during the thumb drag
- int m_ofsMouse;
- // the timer for generating scroll events when the mouse stays pressed on
- // a scrollbar
- wxScrollTimer *m_timerScroll;
- };
- #endif // _WX_UNIV_SCROLBAR_H_
|