use wxStockCursor (as documented and as already implemented in wxMotif) instead of...
[wxWidgets.git] / src / os2 / cursor.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/os2/cursor.cpp
3 // Purpose: wxCursor class
4 // Author: David Webster
5 // Modified by:
6 // Created: 10/13/99
7 // RCS-ID: $Id$
8 // Copyright: (c) David Webster
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // For compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
14
15 #include "wx/cursor.h"
16
17 #ifndef WX_PRECOMP
18 #include <stdio.h>
19 #include "wx/list.h"
20 #include "wx/utils.h"
21 #include "wx/app.h"
22 #include "wx/icon.h"
23 #include "wx/image.h"
24 #endif
25
26 #include "wx/os2/private.h"
27 #include "wx/os2/wxrsc.h"
28
29 #include "assert.h"
30
31 IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxBitmap)
32
33 wxCursorRefData::wxCursorRefData(void)
34 {
35 m_nWidth = 32;
36 m_nHeight = 32;
37 m_hCursor = 0 ;
38 m_bDestroyCursor = false;
39 }
40
41 void wxCursorRefData::Free()
42 {
43 if (m_hCursor)
44 {
45 if (m_bDestroyCursor)
46 ::WinDestroyPointer((HPOINTER)m_hCursor);
47 m_hCursor = 0;
48 }
49 } // end of wxCursorRefData::Free
50
51 // Cursors
52 wxCursor::wxCursor(void)
53 {
54 }
55
56 wxCursor::wxCursor(const char WXUNUSED(bits)[],
57 int WXUNUSED(width),
58 int WXUNUSED(height),
59 int WXUNUSED(hotSpotX),
60 int WXUNUSED(hotSpotY),
61 const char WXUNUSED(maskBits)[])
62 {
63 }
64
65 wxCursor::wxCursor(const wxImage& rImage)
66 {
67 wxImage vImage32 = rImage.Scale(32,32);
68 int nWidth = vImage32.GetWidth();
69 int nHeight = vImage32.GetHeight();
70
71 //
72 // Need a bitmap handle somehow
73 //
74 HBITMAP hBitmap = wxBitmap(vImage32).GetHBITMAP();
75 int nHotSpotX = vImage32.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X);
76 int nHotSpotY = vImage32.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y);
77
78 if (nHotSpotX < 0 || nHotSpotX >= nWidth)
79 nHotSpotX = 0;
80 if (nHotSpotY < 0 || nHotSpotY >= nHeight)
81 nHotSpotY = 0;
82
83
84 wxCursorRefData* pRefData = new wxCursorRefData;
85
86 m_refData = pRefData;
87 pRefData->m_hCursor = (WXHCURSOR) ::WinCreatePointer( HWND_DESKTOP
88 ,hBitmap
89 ,TRUE
90 ,nHotSpotY
91 ,nHotSpotX
92 );
93
94 } // end of wxCursor::wxCursor
95
96 wxCursor::wxCursor( const wxString& WXUNUSED(rsCursorFile),
97 long lFlags,
98 int WXUNUSED(nHotSpotX),
99 int WXUNUSED(nHotSpotY) )
100 {
101 wxCursorRefData* pRefData = new wxCursorRefData;
102
103 pRefData = new wxCursorRefData;
104 m_refData = pRefData;
105 pRefData->m_bDestroyCursor = false;
106 if (lFlags == wxBITMAP_TYPE_CUR_RESOURCE)
107 {
108 pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
109 ,0
110 ,(ULONG)lFlags // if OS/2 this should be the resource Id
111 );
112 }
113 } // end of wxCursor::wxCursor
114
115 // Cursors by stock number
116 wxCursor::wxCursor(wxStockCursor nCursorType)
117 {
118 wxCursorRefData* pRefData = new wxCursorRefData;
119
120 m_refData = pRefData;
121 switch (nCursorType)
122 {
123 case wxCURSOR_ARROWWAIT:
124 pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
125 ,(ULONG)SPTR_WAIT
126 ,FALSE
127 );
128 break;
129
130 case wxCURSOR_WATCH:
131 case wxCURSOR_WAIT:
132 pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
133 ,(ULONG)SPTR_WAIT
134 ,FALSE
135 );
136 break;
137
138 case wxCURSOR_IBEAM:
139 pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
140 ,(ULONG)SPTR_TEXT
141 ,FALSE
142 );
143 break;
144
145 case wxCURSOR_CROSS:
146 pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
147 ,(ULONG)SPTR_MOVE
148 ,FALSE
149 );
150 break;
151
152 case wxCURSOR_SIZENWSE:
153 pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
154 ,(ULONG)SPTR_SIZENWSE
155 ,FALSE
156 );
157 break;
158
159 case wxCURSOR_SIZENESW:
160 pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
161 ,(ULONG)SPTR_SIZENESW
162 ,FALSE
163 );
164 break;
165
166 case wxCURSOR_SIZEWE:
167 pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
168 ,(ULONG)SPTR_SIZEWE
169 ,FALSE
170 );
171 break;
172
173 case wxCURSOR_SIZENS:
174 pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
175 ,(ULONG)SPTR_SIZENS
176 ,FALSE
177 );
178 break;
179
180 case wxCURSOR_CHAR:
181 pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
182 ,(ULONG)SPTR_ARROW
183 ,FALSE
184 );
185 break;
186
187 case wxCURSOR_HAND:
188 pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
189 ,0
190 ,(ULONG)wxCURSOR_HAND
191 );
192 break;
193
194 case wxCURSOR_BULLSEYE:
195 pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
196 ,0
197 ,(ULONG)wxCURSOR_BULLSEYE
198 );
199 break;
200
201 case wxCURSOR_PENCIL:
202 pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
203 ,0
204 ,(ULONG)wxCURSOR_PENCIL
205 );
206 break;
207
208 case wxCURSOR_MAGNIFIER:
209 pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
210 ,0
211 ,(ULONG)wxCURSOR_MAGNIFIER
212 );
213 break;
214
215 case wxCURSOR_NO_ENTRY:
216 pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
217 ,(ULONG)SPTR_ILLEGAL
218 ,FALSE
219 );
220 break;
221
222 case wxCURSOR_LEFT_BUTTON:
223 pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
224 ,(ULONG)SPTR_ARROW
225 ,FALSE
226 );
227 break;
228
229 case wxCURSOR_RIGHT_BUTTON:
230 pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
231 ,(ULONG)SPTR_ARROW
232 ,FALSE
233 );
234 break;
235
236 case wxCURSOR_MIDDLE_BUTTON:
237 pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
238 ,(ULONG)SPTR_ARROW
239 ,FALSE
240 );
241 break;
242
243 case wxCURSOR_SIZING:
244 pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
245 ,(ULONG)SPTR_SIZE
246 ,FALSE
247 );
248 break;
249
250 case wxCURSOR_SPRAYCAN:
251 pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
252 ,0
253 ,(ULONG)WXCURSOR_ROLLER
254 );
255 break;
256
257 case wxCURSOR_PAINT_BRUSH:
258 pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
259 ,0
260 ,(ULONG)WXCURSOR_PBRUSH
261 );
262 break;
263
264 case wxCURSOR_POINT_LEFT:
265 pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
266 ,0
267 ,(ULONG)WXCURSOR_PLEFT
268 );
269 break;
270
271 case wxCURSOR_POINT_RIGHT:
272 pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
273 ,0
274 ,(ULONG)WXCURSOR_PRIGHT
275 );
276 break;
277
278 case wxCURSOR_QUESTION_ARROW:
279 pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
280 ,0
281 ,(ULONG)WXCURSOR_QARROW
282 );
283 break;
284
285 case wxCURSOR_BLANK:
286 pRefData->m_hCursor = (WXHCURSOR) ::WinLoadPointer( HWND_DESKTOP
287 ,0
288 ,(ULONG)WXCURSOR_BLANK
289 );
290 break;
291
292 default:
293 case wxCURSOR_ARROW:
294 pRefData->m_hCursor = (WXHCURSOR) ::WinQuerySysPointer( HWND_DESKTOP
295 ,(ULONG)SPTR_ARROW
296 ,FALSE
297 );
298 break;
299 }
300 //
301 // No need to destroy the stock cursors
302 //
303 ((wxCursorRefData *)m_refData)->m_bDestroyCursor = false;
304 } // end of wxCursor::wxCursor
305
306 // Global cursor setting
307 void wxSetCursor(const wxCursor& cursor)
308 {
309 extern wxCursor *g_globalCursor;
310
311 if ( cursor.Ok() && cursor.GetHCURSOR() )
312 {
313 // ::SetCursor((HCURSOR) cursor.GetHCURSOR());
314
315 if ( g_globalCursor )
316 (*g_globalCursor) = cursor;
317 }
318 }