1///////////////////////////////////////////////////////////////////////////////
2// Name:        wx/univ/spinbutt.h
3// Purpose:     universal version of wxSpinButton
4// Author:      Vadim Zeitlin
5// Modified by:
6// Created:     21.01.01
7// RCS-ID:      $Id: spinbutt.h 61872 2009-09-09 22:37:05Z VZ $
8// Copyright:   (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
9// Licence:     wxWindows licence
10///////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_UNIV_SPINBUTT_H_
13#define _WX_UNIV_SPINBUTT_H_
14
15#include "wx/univ/scrarrow.h"
16
17// ----------------------------------------------------------------------------
18// wxSpinButton
19// ----------------------------------------------------------------------------
20
21// actions supported by this control
22#define wxACTION_SPIN_INC    wxT("inc")
23#define wxACTION_SPIN_DEC    wxT("dec")
24
25class WXDLLEXPORT wxSpinButton : public wxSpinButtonBase,
26                                 public wxControlWithArrows
27{
28public:
29    wxSpinButton();
30    wxSpinButton(wxWindow *parent,
31                 wxWindowID id = wxID_ANY,
32                 const wxPoint& pos = wxDefaultPosition,
33                 const wxSize& size = wxDefaultSize,
34                 long style = wxSP_VERTICAL | wxSP_ARROW_KEYS,
35                 const wxString& name = wxSPIN_BUTTON_NAME);
36
37    bool Create(wxWindow *parent,
38                wxWindowID id = wxID_ANY,
39                const wxPoint& pos = wxDefaultPosition,
40                const wxSize& size = wxDefaultSize,
41                long style = wxSP_VERTICAL | wxSP_ARROW_KEYS,
42                const wxString& name = wxSPIN_BUTTON_NAME);
43
44    // implement wxSpinButtonBase methods
45    virtual int GetValue() const;
46    virtual void SetValue(int val);
47    virtual void SetRange(int minVal, int maxVal);
48
49    // implement wxControlWithArrows methods
50    virtual wxRenderer *GetRenderer() const { return m_renderer; }
51    virtual wxWindow *GetWindow() { return this; }
52    virtual bool IsVertical() const { return wxSpinButtonBase::IsVertical(); }
53    virtual int GetArrowState(wxScrollArrows::Arrow arrow) const;
54    virtual void SetArrowFlag(wxScrollArrows::Arrow arrow, int flag, bool set);
55    virtual bool OnArrow(wxScrollArrows::Arrow arrow);
56    virtual wxScrollArrows::Arrow HitTestArrow(const wxPoint& pt) const;
57
58    // for wxStdSpinButtonInputHandler
59    const wxScrollArrows& GetArrows() { return m_arrows; }
60
61    virtual bool PerformAction(const wxControlAction& action,
62                               long numArg = 0,
63                               const wxString& strArg = wxEmptyString);
64
65    static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef);
66    virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef)
67    {
68        return GetStdInputHandler(handlerDef);
69    }
70
71protected:
72    virtual wxSize DoGetBestClientSize() const;
73    virtual void DoDraw(wxControlRenderer *renderer);
74    virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; }
75
76    // the common part of all ctors
77    void Init();
78
79    // normalize the value to fit into min..max range
80    int NormalizeValue(int value) const;
81
82    // change the value by +1/-1 and send the event, return true if value was
83    // changed
84    bool ChangeValue(int inc);
85
86    // get the rectangles for our 2 arrows
87    void CalcArrowRects(wxRect *rect1, wxRect *rect2) const;
88
89    // the current controls value
90    int m_value;
91
92private:
93    // the object which manages our arrows
94    wxScrollArrows m_arrows;
95
96    // the state (combination of wxCONTROL_XXX flags) of the arrows
97    int m_arrowsState[wxScrollArrows::Arrow_Max];
98
99    DECLARE_DYNAMIC_CLASS(wxSpinButton)
100};
101
102// ----------------------------------------------------------------------------
103// wxStdSpinButtonInputHandler: manages clicks on them (use arrows like
104// wxStdScrollBarInputHandler) and processes keyboard events too
105// ----------------------------------------------------------------------------
106
107class WXDLLEXPORT wxStdSpinButtonInputHandler : public wxStdInputHandler
108{
109public:
110    wxStdSpinButtonInputHandler(wxInputHandler *inphand);
111
112    virtual bool HandleKey(wxInputConsumer *consumer,
113                           const wxKeyEvent& event,
114                           bool pressed);
115    virtual bool HandleMouse(wxInputConsumer *consumer,
116                             const wxMouseEvent& event);
117    virtual bool HandleMouseMove(wxInputConsumer *consumer,
118                                 const wxMouseEvent& event);
119};
120
121#endif // _WX_UNIV_SPINBUTT_H_
122
123