1 ///////////////////////////////////////////////////////////////////////////// 
   4 // Author:      Vaclav Slavik 
   6 // Copyright:   (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com) 
   7 // Licence:     wxWindows licence 
   8 ///////////////////////////////////////////////////////////////////////////// 
  11 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) 
  12 #pragma implementation "cursor.h" 
  15 // For compilers that support precompilation, includes "wx.h". 
  16 #include "wx/wxprec.h" 
  22 #include "wx/cursor.h" 
  23 #include "wx/module.h" 
  27 #include "wx/hashmap.h" 
  29 #include "wx/mgl/private.h" 
  32 //----------------------------------------------------------------------------- 
  34 //----------------------------------------------------------------------------- 
  36 class wxCursorRefData
: public wxObjectRefData
 
  46 wxCursorRefData::wxCursorRefData() 
  48     m_cursor 
= (MGLCursor
*) NULL
; 
  51 wxCursorRefData::~wxCursorRefData() 
  56 #define M_CURSORDATA ((wxCursorRefData *)m_refData) 
  58 //----------------------------------------------------------------------------- 
  60 WX_DECLARE_HASH_MAP(int, wxCursor
, wxIntegerHash
, wxIntegerEqual
, wxCursorsHash
); 
  62 static wxCursorsHash 
*gs_cursorsHash 
= NULL
; 
  64 IMPLEMENT_DYNAMIC_CLASS(wxCursor
,wxObject
) 
  70 wxCursor::wxCursor(int cursorId
) 
  72     if ( !gs_cursorsHash 
) 
  73         gs_cursorsHash 
= new wxCursorsHash
; 
  75     if ( gs_cursorsHash
->find(cursorId
) != gs_cursorsHash
->end() ) 
  77         wxLogTrace(_T("mglcursor"), _T("cursor id %i fetched from cache"), cursorId
); 
  78         *this = (*gs_cursorsHash
)[cursorId
]; 
  82     const char *cursorname 
= NULL
; 
  83     m_refData 
= new wxCursorRefData(); 
  87         case wxCURSOR_ARROW
:           cursorname 
= "arrow.cur"; break; 
  88         case wxCURSOR_RIGHT_ARROW
:     cursorname 
= "rightarr.cur"; break; 
  89         case wxCURSOR_BULLSEYE
:        cursorname 
= "bullseye.cur"; break; 
  90         case wxCURSOR_CHAR
:            cursorname 
= "char.cur"; break; 
  91         case wxCURSOR_CROSS
:           cursorname 
= "cross.cur"; break; 
  92         case wxCURSOR_HAND
:            cursorname 
= "hand.cur"; break; 
  93         case wxCURSOR_IBEAM
:           cursorname 
= "ibeam.cur"; break; 
  94         case wxCURSOR_LEFT_BUTTON
:     cursorname 
= "leftbtn.cur"; break; 
  95         case wxCURSOR_MAGNIFIER
:       cursorname 
= "magnif1.cur"; break; 
  96         case wxCURSOR_MIDDLE_BUTTON
:   cursorname 
= "midbtn.cur"; break; 
  97         case wxCURSOR_NO_ENTRY
:        cursorname 
= "noentry.cur"; break; 
  98         case wxCURSOR_PAINT_BRUSH
:     cursorname 
= "pbrush.cur"; break; 
  99         case wxCURSOR_PENCIL
:          cursorname 
= "pencil.cur"; break; 
 100         case wxCURSOR_POINT_LEFT
:      cursorname 
= "pntleft.cur"; break; 
 101         case wxCURSOR_POINT_RIGHT
:     cursorname 
= "pntright.cur"; break; 
 102         case wxCURSOR_QUESTION_ARROW
:  cursorname 
= "query.cur"; break; 
 103         case wxCURSOR_RIGHT_BUTTON
:    cursorname 
= "rightbtn.cur"; break; 
 104         case wxCURSOR_SIZENESW
:        cursorname 
= "sizenesw.cur"; break; 
 105         case wxCURSOR_SIZENS
:          cursorname 
= "sizens.cur"; break; 
 106         case wxCURSOR_SIZENWSE
:        cursorname 
= "sizenwse.cur"; break; 
 107         case wxCURSOR_SIZEWE
:          cursorname 
= "sizewe.cur"; break; 
 108         case wxCURSOR_SIZING
:          cursorname 
= "size.cur"; break; 
 109         case wxCURSOR_SPRAYCAN
:        cursorname 
= "spraycan.cur"; break; 
 110         case wxCURSOR_WAIT
:            cursorname 
= "wait.cur"; break; 
 111         case wxCURSOR_WATCH
:           cursorname 
= "clock.cur"; break; 
 112         case wxCURSOR_BLANK
:           cursorname 
= "blank.cur"; break; 
 115             *this = wxNullCursor
; 
 120             wxFAIL_MSG(wxT("unsupported cursor type")); 
 124     M_CURSORDATA
->m_cursor 
= new MGLCursor(cursorname
); 
 126     // if we cannot load arrow cursor, use MGL's default arrow cursor: 
 127     if ( !M_CURSORDATA
->m_cursor
->valid() && cursorId 
== wxCURSOR_ARROW 
) 
 129         delete M_CURSORDATA
->m_cursor
; 
 130         M_CURSORDATA
->m_cursor 
= new MGLCursor(MGL_DEF_CURSOR
); 
 133     if ( !M_CURSORDATA
->m_cursor
->valid() ) 
 135         wxLogError(_("Couldn't create cursor.")); 
 140         (*gs_cursorsHash
)[cursorId
] = *this; 
 141         wxLogTrace(_T("mglcursor"), _T("cursor id %i added to cache (%s)"),  
 142                    cursorId
, cursorname
); 
 146 wxCursor::wxCursor(const char WXUNUSED(bits
)[], 
 148                    int WXUNUSED(height
), 
 149                    int WXUNUSED(hotSpotX
), int WXUNUSED(hotSpotY
), 
 150                    const char WXUNUSED(maskBits
)[], 
 151                    wxColour 
* WXUNUSED(fg
), wxColour 
* WXUNUSED(bg
) ) 
 156 wxCursor::wxCursor(const wxString
& cursor_file
, 
 158                    int hotSpotX
, int hotSpotY
) 
 160     if ( flags 
== wxBITMAP_TYPE_CUR 
|| flags 
== wxBITMAP_TYPE_CUR_RESOURCE 
) 
 162         m_refData 
= new wxCursorRefData(); 
 163         M_CURSORDATA
->m_cursor 
= new MGLCursor(cursor_file
.mb_str()); 
 164         if ( !M_CURSORDATA
->m_cursor
->valid() ) 
 166             wxLogError(_("Couldn't create cursor.")); 
 172         wxLogError(wxT("Cannot load cursor resource of this type.")); 
 176 wxCursor::wxCursor(const wxCursor 
&cursor
) 
 181 wxCursor::~wxCursor() 
 183     // wxObject unrefs data 
 186 wxCursor
& wxCursor::operator = (const wxCursor
& cursor
) 
 188     if ( *this == cursor 
) 
 194 bool wxCursor::operator == (const wxCursor
& cursor
) const 
 196     return (m_refData 
== cursor
.m_refData
); 
 199 bool wxCursor::operator != (const wxCursor
& cursor
) const 
 201     return (m_refData 
!= cursor
.m_refData
); 
 204 bool wxCursor::Ok() const 
 206     return (m_refData 
!= NULL
); 
 209 MGLCursor 
*wxCursor::GetMGLCursor() const 
 211     return M_CURSORDATA
->m_cursor
; 
 216 // ---------------------------------------------------------------------------- 
 217 // Global cursor setting 
 218 // ---------------------------------------------------------------------------- 
 220 static wxCursor  gs_globalCursor 
= wxNullCursor
; 
 222 void wxSetCursor(const wxCursor
& cursor
) 
 227             MGL_wmSetGlobalCursor(g_winMng
, *cursor
.GetMGLCursor()); 
 228         gs_globalCursor 
= cursor
; 
 233             MGL_wmSetGlobalCursor(g_winMng
, NULL
); 
 234         gs_globalCursor 
= wxNullCursor
;         
 240 //----------------------------------------------------------------------------- 
 241 // busy cursor routines 
 242 //----------------------------------------------------------------------------- 
 244 static wxCursor  gs_savedCursor 
= wxNullCursor
; 
 245 static int       gs_busyCount 
= 0; 
 247 const wxCursor 
&wxBusyCursor::GetStoredCursor() 
 249     return gs_savedCursor
; 
 252 const wxCursor 
wxBusyCursor::GetBusyCursor() 
 254     return gs_globalCursor
; 
 257 void wxEndBusyCursor() 
 259     if ( --gs_busyCount 
> 0 ) return; 
 261     wxSetCursor(gs_savedCursor
); 
 262     gs_savedCursor 
= wxNullCursor
; 
 265 void wxBeginBusyCursor(wxCursor 
*cursor
) 
 267     if ( gs_busyCount
++ > 0 ) return; 
 269     wxASSERT_MSG( !gs_savedCursor
.Ok(), 
 270                   wxT("forgot to call wxEndBusyCursor, will leak memory") ); 
 272     gs_savedCursor 
= gs_globalCursor
; 
 274         wxSetCursor(*cursor
); 
 276         wxSetCursor(wxCursor(wxCURSOR_WAIT
)); 
 281     return (gs_busyCount 
> 0); 
 286 //----------------------------------------------------------------------------- 
 287 // module - clean up code 
 288 //----------------------------------------------------------------------------- 
 290 class wxCursorModule 
: public wxModule
 
 293     virtual bool OnInit() { return TRUE
; } 
 295     virtual void OnExit() 
 297         wxDELETE(gs_cursorsHash
); 
 301     DECLARE_DYNAMIC_CLASS(wxCursorModule
) 
 304 IMPLEMENT_DYNAMIC_CLASS(wxCursorModule
, wxModule
)