// Created: 1998-01-01
// RCS-ID: $Id$
// Copyright: (c) Stefan Csomor
-// Licence: wxWindows licence
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
-#include "wx/app.h"
#include "wx/cursor.h"
-#include "wx/icon.h"
-#include "wx/image.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/app.h"
+ #include "wx/icon.h"
+ #include "wx/image.h"
+#endif // WX_PRECOMP
+
#include "wx/xpmdecod.h"
#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();
+ 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
-#define M_CURSORDATA ((wxCursorRefData *)m_refData)
-#define M_CURSORHANDLERDATA ((wxCursorRefData *)bitmap->m_refData)
+ friend class wxCursor;
-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;
+ DECLARE_NO_ASSIGN_CLASS(wxCursorRefData)
+};
+
+#define M_CURSORDATA wx_static_cast(wxCursorRefData*, m_refData)
-Cursor gMacCursors[kwxCursorLast+1] =
+ClassicCursor gMacCursors[kwxCursorLast+1] =
{
{
wxCursor gMacCurrentCursor ;
+#if !wxMAC_USE_COCOA
CursHandle wxGetStockCursor( int number )
{
wxASSERT_MSG( number >= 0 && number <=kwxCursorLast , wxT("invalid stock cursor id") ) ;
#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 )
{
- ::DisposeCCursor( (CCrsrHandle) m_hCursor ) ;
+#ifndef __LP64__
+ ::DisposeCCursor( (CCrsrHandle) m_hCursor ) ;
+#endif
}
else if ( m_disposeHandle )
{
// we don't release the resource since it may already
// be in use again
}
+#endif
}
wxCursor::wxCursor()
(void) CreateFromXpm((const char **)bits);
}
+wxGDIRefData *wxCursor::CreateGDIRefData() const
+{
+ return new wxCursorRefData;
+}
+
+wxGDIRefData *wxCursor::CloneGDIRefData(const wxGDIRefData *data) const
+{
+ return new wxCursorRefData(*wx_static_cast(const wxCursorRefData *, data));
+}
+
bool wxCursor::CreateFromXpm(const char **bits)
{
#if wxUSE_IMAGE
- wxCHECK_MSG( bits != NULL, false, wxT("invalid cursor data") )
+ wxCHECK_MSG( bits != NULL, false, wxT("invalid cursor data") );
wxXPMDecoder decoder;
wxImage img = decoder.ReadData(bits);
- wxCHECK_MSG( img.Ok(), false, wxT("invalid cursor data") )
+ wxCHECK_MSG( img.Ok(), false, wxT("invalid cursor data") );
CreateFromImage( img ) ;
return true;
#else
return (M_CURSORDATA ? M_CURSORDATA->m_hCursor : 0);
}
-bool wxCursor::Ok() 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 ;
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();
HUnlock( (Handle)ch ) ;
M_CURSORDATA->m_hCursor = ch ;
M_CURSORDATA->m_isColorCursor = true ;
+#endif
+#endif
}
#endif //wxUSE_IMAGE
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 ) ;
M_CURSORDATA->m_releaseHandle = true ;
}
}
+#endif
+#endif
}
else
{
{
image.SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_X, hotSpotX ) ;
image.SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_Y, hotSpotY ) ;
- delete m_refData ;
+ m_refData->DecRef() ;
+ m_refData = NULL ;
CreateFromImage( image ) ;
}
#endif
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:
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 ) ;
}
else if ( m_refData && M_CURSORDATA->m_hCursor )
{
- if ( M_CURSORDATA->m_isColorCursor )
+#ifndef __LP64__
+ if ( M_CURSORDATA->m_isColorCursor )
::SetCCursor( (CCrsrHandle) M_CURSORDATA->m_hCursor ) ;
else
::SetCursor( * (CursHandle) M_CURSORDATA->m_hCursor ) ;
+#endif
}
else
{
SetThemeCursor( kThemeArrowCursor ) ;
}
+#endif
}
wxCursor::~wxCursor()