1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxCursor class for wxCocoa
8 // Copyright: (c) Ryan Norton
9 // Licence: wxWidgets licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "cursor.h"
16 #include "wx/wxprec.h"
19 #include "wx/cursor.h"
22 #import <AppKit/NSCursor.h>
23 #import <AppKit/NSImage.h>
24 #include <wx/cocoa/string.h>
26 #if !USE_SHARED_LIBRARIES
27 IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxBitmap)
30 wxCursorRefData::wxCursorRefData() :
31 m_width(32), m_height(32), m_hCursor(nil)
35 wxCursorRefData::~wxCursorRefData()
46 wxCursor::wxCursor(const char WXUNUSED(bits)[], int WXUNUSED(width), int WXUNUSED(height),
47 int WXUNUSED(hotSpotX), int WXUNUSED(hotSpotY), const char WXUNUSED(maskBits)[])
52 wxCursor::wxCursor(const wxString& cursor_file, long flags, int hotSpotX, int hotSpotY)
54 m_refData = new wxCursorRefData;
56 //TODO: Not sure if this works or not
59 if (flags & wxBITMAP_TYPE_MACCURSOR_RESOURCE)
61 //[NSBundle bundleForClass:[self class]]?
62 theImage = [[NSImage alloc]
63 initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:wxNSStringWithWxString(cursor_file) ofType:nil]
68 theImage = [[NSImage alloc] initByReferencingFile:wxNSStringWithWxString(cursor_file)
73 M_CURSORDATA->m_hCursor = [[NSCursor alloc] initWithImage:theImage
74 hotSpot:NSMakePoint(hotSpotX, hotSpotY)
80 // Cursors by stock number
81 wxCursor::wxCursor(int cursor_type)
83 m_refData = new wxCursorRefData;
88 M_CURSORDATA->m_hCursor = [[NSCursor IBeamCursor] retain];
91 M_CURSORDATA->m_hCursor = [[NSCursor arrowCursor] retain];
95 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_WAIT);
98 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_CROSS);
100 case wxCURSOR_SIZENWSE:
101 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_SIZENWSE);
103 case wxCURSOR_SIZENESW:
104 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_SIZENESW);
106 case wxCURSOR_SIZEWE:
107 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_SIZEWE);
109 case wxCURSOR_SIZENS:
110 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_SIZENS);
114 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW);
119 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_HAND");
122 case wxCURSOR_BULLSEYE:
124 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_BULLSEYE");
127 case wxCURSOR_PENCIL:
129 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_PENCIL");
132 case wxCURSOR_MAGNIFIER:
134 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_MAGNIFIER");
137 case wxCURSOR_NO_ENTRY:
139 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_NO_ENTRY");
142 case wxCURSOR_LEFT_BUTTON:
144 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW);
147 case wxCURSOR_RIGHT_BUTTON:
149 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW);
152 case wxCURSOR_MIDDLE_BUTTON:
154 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW);
157 case wxCURSOR_SIZING:
159 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_SIZING");
164 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_WATCH");
167 case wxCURSOR_SPRAYCAN:
169 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_ROLLER");
172 case wxCURSOR_PAINT_BRUSH:
174 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_PBRUSH");
177 case wxCURSOR_POINT_LEFT:
179 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_PLEFT");
182 case wxCURSOR_POINT_RIGHT:
184 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_PRIGHT");
187 case wxCURSOR_QUESTION_ARROW:
189 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_QARROW");
194 M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_BLANK");
204 wxCursor::~wxCursor()
208 // Global cursor setting
209 void wxSetCursor(const wxCursor& cursor)
211 if (cursor.GetNSCursor())
212 [cursor.GetNSCursor() push];
215 static int wxBusyCursorCount = 0;
217 // Set the cursor to the busy cursor for all windows
218 void wxBeginBusyCursor(wxCursor *cursor)
220 wxBusyCursorCount ++;
221 if (wxBusyCursorCount == 1)
231 // Restore cursor to normal
232 void wxEndBusyCursor()
234 if (wxBusyCursorCount == 0)
237 wxBusyCursorCount --;
238 if (wxBusyCursorCount == 0)
244 // TRUE if we're between the above two calls
247 return (wxBusyCursorCount > 0);