Trying out addition of SetSize to wxCaret...
[wxWidgets.git] / include / wx / caret.h
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: caret.h
3 // Purpose: wxCaretBase class - the interface of wxCaret
4 // Author: Vadim Zeitlin
5 // Modified by:
6 // Created: 23.05.99
7 // RCS-ID: $Id$
8 // Copyright: (c) wxWindows team
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
11
12 #ifndef _WX_CARET_H_BASE_
13 #define _WX_CARET_H_BASE_
14
15 #ifdef __GNUG__
16 #pragma interface "caret.h"
17 #endif
18
19 // ---------------------------------------------------------------------------
20 // forward declarations
21 // ---------------------------------------------------------------------------
22
23 class WXDLLEXPORT wxWindow;
24 class WXDLLEXPORT wxWindowBase;
25
26 // ----------------------------------------------------------------------------
27 // headers we have to include
28 // ----------------------------------------------------------------------------
29
30 #include "wx/gdicmn.h" // for wxPoint, wxSize
31
32 // ----------------------------------------------------------------------------
33 // A caret is a blinking cursor showing the position where the typed text will
34 // appear. It can be either a solid block or a custom bitmap (TODO)
35 // ----------------------------------------------------------------------------
36
37 class WXDLLEXPORT wxCaretBase
38 {
39 public:
40 // ctors
41 // -----
42 // default - use Create
43 wxCaretBase() { Init(); }
44 // create the caret of given (in pixels) width and height and associate
45 // with the given window
46 wxCaretBase(wxWindowBase *window, int width, int height)
47 {
48 Init();
49
50 (void)Create(window, width, height);
51 }
52 // same as above
53 wxCaretBase(wxWindowBase *window, const wxSize& size)
54 {
55 Init();
56
57 (void)Create(window, size);
58 }
59
60 // Create() functions - same as ctor but returns the success code
61 // --------------------------------------------------------------
62
63 // same as ctor
64 bool Create(wxWindowBase *window, int width, int height)
65 { return DoCreate(window, width, height); }
66 // same as ctor
67 bool Create(wxWindowBase *window, const wxSize& size)
68 { return DoCreate(window, size.x, size.y); }
69
70 // accessors
71 // ---------
72
73 // is the caret valid?
74 bool IsOk() const { return m_width != 0 && m_height != 0; }
75
76 // is the caret currently shown?
77 bool IsVisible() const { return m_countVisible > 0; }
78
79 // get the caret position
80 void GetPosition(int *x, int *y) const
81 {
82 if ( x ) *x = m_x;
83 if ( y ) *y = m_y;
84 }
85 wxPoint GetPosition() const { return wxPoint(m_x, m_y); }
86
87 // get the caret size
88 void GetSize(int *width, int *height) const
89 {
90 if ( width ) *width = m_width;
91 if ( height ) *height = m_height;
92 }
93 wxSize GetSize() const { return wxSize(m_width, m_height); }
94
95 // get the window we're associated with
96 wxWindow *GetWindow() const { return (wxWindow *)m_window; }
97
98 // change the size of the caret
99 void SetSize(int width, int height) { m_width = width; m_height = height; }
100 void SetSize(const wxSize& size) { SetSize(size.x, size.y); }
101
102
103 // operations
104 // ----------
105
106 // move the caret to given position (in logical coords)
107 void Move(int x, int y) { m_x = x; m_y = y; DoMove(); }
108 void Move(const wxPoint& pt) { m_x = pt.x; m_y = pt.y; DoMove(); }
109
110 // show/hide the caret (should be called by wxWindow when needed):
111 // Show() must be called as many times as Hide() + 1 to make the caret
112 // visible
113 virtual void Show(bool show = TRUE)
114 {
115 if ( show )
116 {
117 if ( m_countVisible++ == 0 )
118 DoShow();
119 }
120 else
121 {
122 if ( --m_countVisible == 0 )
123 DoHide();
124 }
125 }
126 virtual void Hide() { Show(FALSE); }
127
128 // blink time is measured in milliseconds and is the time elapsed
129 // between 2 inversions of the caret (blink time of the caret is common
130 // to all carets in the Universe, so these functions are static)
131 static int GetBlinkTime();
132 static void SetBlinkTime(int milliseconds);
133
134 // implementation from now on
135 // --------------------------
136
137 // these functions should be called by wxWindow when the window gets/loses
138 // the focus - we create/show and hide/destroy the caret here
139 virtual void OnSetFocus() { }
140 virtual void OnKillFocus() { }
141
142 protected:
143 // these functions may be overriden in the derived classes, but they
144 // should call the base class version first
145 virtual bool DoCreate(wxWindowBase *window, int width, int height)
146 {
147 m_window = window;
148 m_width = width;
149 m_height = height;
150
151 return TRUE;
152 }
153
154 // pure virtuals to implement in the derived class
155 virtual void DoShow() = 0;
156 virtual void DoHide() = 0;
157 virtual void DoMove() = 0;
158
159 // the common initialization
160 void Init()
161 {
162 m_window = (wxWindowBase *)NULL;
163 m_x = m_y = 0;
164 m_width = m_height = 0;
165 m_countVisible = 0;
166 }
167
168 // the size of the caret
169 int m_width, m_height;
170
171 // the position of the caret
172 int m_x, m_y;
173
174 // the window we're associated with
175 wxWindowBase *m_window;
176
177 // visibility count: the caret is visible only if it's positive
178 int m_countVisible;
179
180 private:
181 DECLARE_NO_COPY_CLASS(wxCaretBase);
182 };
183
184 // ---------------------------------------------------------------------------
185 // now include the real thing
186 // ---------------------------------------------------------------------------
187
188 #if defined(__WXMSW__)
189 #include "wx/msw/caret.h"
190 #else
191 #include "wx/generic/caret.h"
192 #endif // platform
193
194 #endif // _WX_CARET_H_BASE_
195