]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/cursor.cpp
pen.h depends from brush.h in compat mode
[wxWidgets.git] / src / mac / carbon / cursor.cpp
index cee91f767cb4cbf12e969b0e637aa48597fcb1f9..c48663d7fd1a2b51dfea0eb88259ccb3d10a67d5 100644 (file)
 #include "wx/mac/private.h"
 
 
-IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxBitmap)
+IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxGDIObject)
 
 
-class WXDLLEXPORT wxCursorRefData: public wxBitmapRefData
+class WXDLLEXPORT wxCursorRefData: public wxGDIRefData
 {
-    DECLARE_NO_COPY_CLASS(wxCursorRefData)
-
-    friend class WXDLLEXPORT wxBitmap;
-    friend class WXDLLEXPORT wxCursor;
-
 public:
     wxCursorRefData();
+    wxCursorRefData(const wxCursorRefData& cursor);
     virtual ~wxCursorRefData();
 
+    virtual bool IsOk() const
+    {
+        if ( m_hCursor != NULL )
+            return true;
+#if !wxMAC_USE_COCOA
+        if ( m_themeCursor != -1 )
+            return true;
+#endif
+
+        return false;
+    }
+
 protected:
+#if wxMAC_USE_COCOA
+    WX_NSCursor m_hCursor;
+#else
     WXHCURSOR     m_hCursor;
     bool        m_disposeHandle;
     bool        m_releaseHandle;
     bool        m_isColorCursor;
     long        m_themeCursor;
+#endif
+
+    friend class wxCursor;
+
+    DECLARE_NO_ASSIGN_CLASS(wxCursorRefData)
 };
 
 #define M_CURSORDATA wx_static_cast(wxCursorRefData*, m_refData)
 
-const short kwxCursorBullseye = 0;
-const short kwxCursorBlank = 1;
-const short kwxCursorPencil = 2;
-const short kwxCursorMagnifier = 3;
-const short kwxCursorNoEntry = 4;
-const short kwxCursorPaintBrush = 5;
-const short kwxCursorPointRight = 6;
-const short kwxCursorPointLeft = 7;
-const short kwxCursorQuestionArrow = 8;
-const short kwxCursorRightArrow = 9;
-const short kwxCursorSizeNS = 10;
-const short kwxCursorSize = 11;
-const short kwxCursorSizeNESW = 12;
-const short kwxCursorSizeNWSE = 13;
-const short kwxCursorRoller = 14;
-const short kwxCursorLast = kwxCursorRoller;
-
-Cursor gMacCursors[kwxCursorLast+1] =
+ClassicCursor gMacCursors[kwxCursorLast+1] =
 {
 
 {
@@ -192,6 +191,7 @@ Cursor gMacCursors[kwxCursorLast+1] =
 
 wxCursor    gMacCurrentCursor ;
 
+#if !wxMAC_USE_COCOA
 CursHandle wxGetStockCursor( int number )
 {
     wxASSERT_MSG( number >= 0 && number <=kwxCursorLast , wxT("invalid stock cursor id") ) ;
@@ -207,20 +207,41 @@ CursHandle wxGetStockCursor( int number )
 #endif
     return c ;
 }
+#endif
 
 wxCursorRefData::wxCursorRefData()
 {
-    SetWidth( 16 );
-    SetHeight( 16 );
     m_hCursor = NULL;
+#if wxMAC_USE_COCOA
+#else
     m_disposeHandle = false;
     m_releaseHandle = false;
     m_isColorCursor = false;
     m_themeCursor = -1;
+#endif
+}
+
+wxCursorRefData::wxCursorRefData(const wxCursorRefData& cursor)
+{
+    // FIXME: need to copy the cursor
+    m_hCursor = NULL;
+
+#if wxMAC_USE_COCOA
+    wxUnusedVar(cursor);
+#else
+    m_disposeHandle = false;
+    m_releaseHandle = false;
+    m_isColorCursor = cursor.m_isColorCursor;
+    m_themeCursor = cursor.m_themeCursor;
+#endif
 }
 
 wxCursorRefData::~wxCursorRefData()
 {
+#if wxMAC_USE_COCOA
+    if ( m_hCursor )
+        wxMacCocoaRelease(m_hCursor);
+#else
     if ( m_isColorCursor )
     {
 #ifndef __LP64__
@@ -236,6 +257,7 @@ wxCursorRefData::~wxCursorRefData()
         // we don't release the resource since it may already
         // be in use again
     }
+#endif
 }
 
 wxCursor::wxCursor()
@@ -254,17 +276,22 @@ wxCursor::wxCursor( const wxImage &image )
 #endif
 }
 
-wxCursor::wxCursor(const char **bits)
+wxCursor::wxCursor(const char* const* bits)
 {
     (void) CreateFromXpm(bits);
 }
 
-wxCursor::wxCursor(char **bits)
+wxGDIRefData *wxCursor::CreateGDIRefData() const
+{
+    return new wxCursorRefData;
+}
+
+wxGDIRefData *wxCursor::CloneGDIRefData(const wxGDIRefData *data) const
 {
-    (void) CreateFromXpm((const char **)bits);
+    return new wxCursorRefData(*wx_static_cast(const wxCursorRefData *, data));
 }
 
-bool wxCursor::CreateFromXpm(const char **bits)
+bool wxCursor::CreateFromXpm(const char* const* bits)
 {
 #if wxUSE_IMAGE
     wxCHECK_MSG( bits != NULL, false, wxT("invalid cursor data") );
@@ -283,11 +310,7 @@ WXHCURSOR wxCursor::GetHCURSOR() const
     return (M_CURSORDATA ? M_CURSORDATA->m_hCursor : 0);
 }
 
-bool wxCursor::IsOk() const
-{
-    return (m_refData != NULL && ( M_CURSORDATA->m_hCursor != NULL || M_CURSORDATA->m_themeCursor != -1 ) ) ;
-}
-
+#if !wxMAC_USE_COCOA
 short GetCTabIndex( CTabHandle colors , RGBColor *col )
 {
     short retval = 0 ;
@@ -308,19 +331,28 @@ short GetCTabIndex( CTabHandle colors , RGBColor *col )
 
     return retval ;
 }
+#endif
 
 #if wxUSE_IMAGE
 
 void wxCursor::CreateFromImage(const wxImage & image)
 {
     m_refData = new wxCursorRefData;
-
+    int hotSpotX = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X);
+    int hotSpotY = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y);
+#if wxMAC_USE_COCOA
+    wxBitmap bmp( image );
+    CGImageRef cgimage = wxMacCreateCGImageFromBitmap(bmp);
+    if ( cgimage )
+    {
+        M_CURSORDATA->m_hCursor = wxMacCocoaCreateCursorFromCGImage( cgimage, hotSpotX, hotSpotY ); 
+        CFRelease( cgimage );
+    }
+#else
 #ifndef __LP64__
     int w = 16;
     int h = 16;
 
-    int hotSpotX = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X);
-    int hotSpotY = image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y);
     int image_w = image.GetWidth();
     int image_h = image.GetHeight();
 
@@ -447,7 +479,7 @@ void wxCursor::CreateFromImage(const wxImage & image)
     M_CURSORDATA->m_hCursor = ch ;
     M_CURSORDATA->m_isColorCursor = true ;
 #endif
-
+#endif
 }
 
 #endif //wxUSE_IMAGE
@@ -457,6 +489,9 @@ wxCursor::wxCursor(const wxString& cursor_file, long flags, int hotSpotX, int ho
     m_refData = new wxCursorRefData;
     if ( flags == wxBITMAP_TYPE_MACCURSOR_RESOURCE )
     {
+#if wxMAC_USE_COCOA
+        wxFAIL_MSG( wxT("Not implemented") );
+#else
 #ifndef __LP64__
         Str255 theName ;
         wxMacStringToPascal( cursor_file , theName ) ;
@@ -490,6 +525,7 @@ wxCursor::wxCursor(const wxString& cursor_file, long flags, int hotSpotX, int ho
                     M_CURSORDATA->m_releaseHandle = true ;
             }
         }
+#endif
 #endif
     }
     else
@@ -513,7 +549,9 @@ wxCursor::wxCursor(const wxString& cursor_file, long flags, int hotSpotX, int ho
 wxCursor::wxCursor(int cursor_type)
 {
     m_refData = new wxCursorRefData;
-
+#if wxMAC_USE_COCOA
+    M_CURSORDATA->m_hCursor = wxMacCocoaCreateStockCursor( cursor_type );
+#else
     switch (cursor_type)
     {
     case wxCURSOR_COPY_ARROW:
@@ -616,11 +654,16 @@ wxCursor::wxCursor(int cursor_type)
 
     if ( M_CURSORDATA->m_themeCursor == -1 )
         M_CURSORDATA->m_releaseHandle = true;
+#endif
 }
 
 void wxCursor::MacInstall() const
 {
     gMacCurrentCursor = *this ;
+#if wxMAC_USE_COCOA
+    if ( IsOk() )
+        wxMacCocoaSetCursor( M_CURSORDATA->m_hCursor );
+#else
     if ( m_refData && M_CURSORDATA->m_themeCursor != -1 )
     {
         SetThemeCursor( M_CURSORDATA->m_themeCursor ) ;
@@ -638,6 +681,7 @@ void wxCursor::MacInstall() const
     {
         SetThemeCursor( kThemeArrowCursor ) ;
     }
+#endif
 }
 
 wxCursor::~wxCursor()
@@ -645,7 +689,9 @@ wxCursor::~wxCursor()
 }
 
 // Global cursor setting
+wxCursor gGlobalCursor;
 void wxSetCursor(const wxCursor& cursor)
 {
     cursor.MacInstall() ;
+    gGlobalCursor = cursor;
 }