X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fe3dc50545b43c324617ed2a0cdfde0f9298d05a..dc484d491b15355285a89da275c58c2ef247d1f4:/include/wx/mac/carbon/private.h diff --git a/include/wx/mac/carbon/private.h b/include/wx/mac/carbon/private.h index d8775399ab..1990703794 100644 --- a/include/wx/mac/carbon/private.h +++ b/include/wx/mac/carbon/private.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: private.h +// Name: wx/mac/carbon/private.h // Purpose: Private declarations: as this header is only included by // wxWidgets itself, it may contain identifiers which don't start // with "wx". @@ -15,7 +15,6 @@ #define _WX_PRIVATE_H_ #include "wx/defs.h" -#include "wx/app.h" #ifdef __DARWIN__ # include @@ -28,471 +27,1304 @@ # include # include # include +# include +# include #endif -#if UNIVERSAL_INTERFACES_VERSION < 0x0340 - #error "please update to Apple's lastest universal headers from http://developer.apple.com/sdk/" +#if UNIVERSAL_INTERFACES_VERSION < 0x0342 + #error "please update to Apple's latest universal headers from http://developer.apple.com/sdk/" #endif #ifndef MAC_OS_X_VERSION_10_3 #define MAC_OS_X_VERSION_10_3 1030 #endif +#ifndef MAC_OS_X_VERSION_10_4 + #define MAC_OS_X_VERSION_10_4 1040 +#endif + +#ifndef MAC_OS_X_VERSION_10_5 + #define MAC_OS_X_VERSION_10_5 1050 +#endif + #ifdef __WXMAC_CARBON__ #include "wx/mac/corefoundation/cfstring.h" #endif +#ifndef FixedToInt +// as macro in FixMath.h for 10.3 +inline Fixed IntToFixed( int inInt ) +{ + return (((SInt32) inInt) << 16); +} + +inline int FixedToInt( Fixed inFixed ) +{ + return (((SInt32) inFixed) >> 16); +} +#endif + +#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 +typedef UInt32 URefCon; +typedef SInt32 SRefCon; +#endif + #if wxUSE_GUI -#include "wx/window.h" +#include "wx/listbox.h" + +#ifndef __LP64__ -class wxMacPortStateHelper +class wxMacPortStateHelper { DECLARE_NO_COPY_CLASS(wxMacPortStateHelper) - + public: - wxMacPortStateHelper( GrafPtr newport) ; - wxMacPortStateHelper() ; - ~wxMacPortStateHelper() ; + wxMacPortStateHelper( GrafPtr newport); + wxMacPortStateHelper(); + ~wxMacPortStateHelper(); - void Setup( GrafPtr newport ) ; - void Clear() ; - bool IsCleared() { return m_clip == NULL ; } - GrafPtr GetCurrentPort() { return m_currentPort ; } + void Setup( GrafPtr newport ); + void Clear(); + bool IsCleared() { return m_clip == NULL; } + GrafPtr GetCurrentPort() { return m_currentPort; } private: - GrafPtr m_currentPort ; - GrafPtr m_oldPort ; - RgnHandle m_clip ; - ThemeDrawingState m_drawingState ; - short m_textFont ; - short m_textSize ; - short m_textStyle ; - short m_textMode ; -} ; + GrafPtr m_currentPort; + GrafPtr m_oldPort; + RgnHandle m_clip; + ThemeDrawingState m_drawingState; + short m_textFont; + short m_textSize; + short m_textStyle; + short m_textMode; +}; class WXDLLEXPORT wxMacPortSaver { DECLARE_NO_COPY_CLASS(wxMacPortSaver) - + public: - wxMacPortSaver( GrafPtr port ) - { - ::GetPort( &m_port ) ; - ::SetPort( port ) ; - } - ~wxMacPortSaver() - { - ::SetPort( m_port ) ; - } + wxMacPortSaver( GrafPtr port ); + ~wxMacPortSaver(); private : - GrafPtr m_port ; -} ; + GrafPtr m_port; +}; class WXDLLEXPORT wxMacPortSetter { DECLARE_NO_COPY_CLASS(wxMacPortSetter) - + public: - wxMacPortSetter( const wxDC* dc ) ; - ~wxMacPortSetter() ; + wxMacPortSetter( const wxDC* dc ); + ~wxMacPortSetter(); private: - wxMacPortStateHelper m_ph ; - const wxDC* m_dc ; -} ; + wxMacPortStateHelper m_ph; + const wxDC* m_dc; +}; /* Clips to the visible region of a control within the current port */ - + class WXDLLEXPORT wxMacWindowClipper : public wxMacPortSaver { DECLARE_NO_COPY_CLASS(wxMacWindowClipper) - + public: - wxMacWindowClipper( const wxWindow* win ) ; - ~wxMacWindowClipper() ; + wxMacWindowClipper( const wxWindow* win ); + ~wxMacWindowClipper(); private: - GrafPtr m_newPort ; - RgnHandle m_formerClip ; - RgnHandle m_newClip ; -} ; + GrafPtr m_newPort; + RgnHandle m_formerClip; + RgnHandle m_newClip; +}; class WXDLLEXPORT wxMacWindowStateSaver : public wxMacWindowClipper { DECLARE_NO_COPY_CLASS(wxMacWindowStateSaver) - + +public: + wxMacWindowStateSaver( const wxWindow* win ); + ~wxMacWindowStateSaver(); +private: + GrafPtr m_newPort; + ThemeDrawingState m_themeDrawingState; +}; +#endif + +#if wxMAC_USE_CORE_GRAPHICS +class WXDLLEXPORT wxMacCGContextStateSaver +{ + DECLARE_NO_COPY_CLASS(wxMacCGContextStateSaver) + public: - wxMacWindowStateSaver( const wxWindow* win ) ; - ~wxMacWindowStateSaver() ; + wxMacCGContextStateSaver( CGContextRef cg ) + { + m_cg = cg; + CGContextSaveGState( cg ); + } + ~wxMacCGContextStateSaver() + { + CGContextRestoreGState( m_cg ); + } private: - GrafPtr m_newPort ; - ThemeDrawingState m_themeDrawingState ; -} ; + CGContextRef m_cg; +}; +#endif /* class wxMacDrawingHelper { DECLARE_NO_COPY_CLASS(wxMacDrawingHelper) - + public: - wxMacDrawingHelper( wxWindowMac * theWindow , bool clientArea = false ) ; - ~wxMacDrawingHelper() ; - bool Ok() { return m_ok ; } - void LocalToWindow( Rect *rect) { OffsetRect( rect , m_origin.h , m_origin.v ) ; } - void LocalToWindow( Point *pt ) { AddPt( m_origin , pt ) ; } - void LocalToWindow( RgnHandle rgn ) { OffsetRgn( rgn , m_origin.h , m_origin.v ) ; } - const Point& GetOrigin() { return m_origin ; } + wxMacDrawingHelper( wxWindowMac * theWindow , bool clientArea = false ); + ~wxMacDrawingHelper(); + bool Ok() const { return IsOk(); } + bool IsOk() { return m_ok; } + void LocalToWindow( Rect *rect) { OffsetRect( rect , m_origin.h , m_origin.v ); } + void LocalToWindow( Point *pt ) { AddPt( m_origin , pt ); } + void LocalToWindow( RgnHandle rgn ) { OffsetRgn( rgn , m_origin.h , m_origin.v ); } + const Point& GetOrigin() { return m_origin; } private: - Point m_origin ; - GrafPtr m_formerPort ; - GrafPtr m_currentPort ; - PenState m_savedPenState ; - bool m_ok ; -} ; + Point m_origin; + GrafPtr m_formerPort; + GrafPtr m_currentPort; + PenState m_savedPenState; + bool m_ok; +}; */ // app.h -bool wxMacConvertEventToRecord( EventRef event , EventRecord *rec) ; +bool wxMacConvertEventToRecord( EventRef event , EventRecord *rec); #endif // wxUSE_GUI // filefn.h -WXDLLEXPORT wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) ; -WXDLLEXPORT void wxMacFilename2FSSpec( const wxString &path , FSSpec *spec ) ; +WXDLLEXPORT wxString wxMacFSSpec2MacFilename( const FSSpec *spec ); +WXDLLEXPORT void wxMacFilename2FSSpec( const wxString &path , FSSpec *spec ); // utils.h +WXDLLEXPORT wxString wxMacFindFolderNoSeparator(short vRefNum, + OSType folderType, + Boolean createFolder); WXDLLEXPORT wxString wxMacFindFolder(short vRefNum, OSType folderType, Boolean createFolder); -#if wxUSE_GUI - -GWorldPtr wxMacCreateGWorld( int width , int height , int depth ) ; -void wxMacDestroyGWorld( GWorldPtr gw ) ; -PicHandle wxMacCreatePict( GWorldPtr gw , GWorldPtr mask = NULL ) ; -CIconHandle wxMacCreateCIcon(GWorldPtr image , GWorldPtr mask , short dstDepth , short iconSize ) ; -void wxMacSetColorTableEntry( CTabHandle newColors , int index , int red , int green , int blue ) ; -CTabHandle wxMacCreateColorTable( int numColors ) ; -void wxMacCreateBitmapButton( ControlButtonContentInfo*info , const wxBitmap& bitmap , int forceType = 0 ) ; - -#define MAC_WXCOLORREF(a) (*((RGBColor*)&(a))) -#define MAC_WXHBITMAP(a) (GWorldPtr(a)) -#define MAC_WXHMETAFILE(a) (PicHandle(a)) -#define MAC_WXHICON(a) (CIconHandle(a)) -#define MAC_WXHCURSOR(a) (CursHandle(a)) -#define MAC_WXHRGN(a) (RgnHandle(a)) -#define MAC_WXHWND(a) (WindowPtr(a)) -#define MAC_WXRECPTR(a) ((Rect*)a) -#define MAC_WXPOINTPTR(a) ((Point*)a) -#define MAC_WXHMENU(a) ((MenuHandle)a) - -struct wxOpaqueWindowRef -{ - wxOpaqueWindowRef( WindowRef ref ) { m_data = ref ; } - operator WindowRef() { return m_data ; } -private : - WindowRef m_data ; -} ; - -wxWindow * wxFindControlFromMacControl(ControlRef inControl ) ; -wxTopLevelWindowMac* wxFindWinFromMacWindow( WindowRef inWindow ) ; -wxMenu* wxFindMenuFromMacMenu(MenuRef inMenuRef) ; - -extern wxWindow* g_MacLastWindow ; -pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) ; -Rect wxMacGetBoundsForControl( wxWindow* window , const wxPoint& pos , const wxSize &size , bool adjustForOrigin = true ) ; - -template EventParamType wxMacGetEventParamType() { wxFAIL_MSG( wxT("Unknown Param Type") ) ; return 0 ; } -template<> inline EventParamType wxMacGetEventParamType() { return typeQDRgnHandle ; } -template<> inline EventParamType wxMacGetEventParamType() { return typeControlRef ; } -template<> inline EventParamType wxMacGetEventParamType() { return typeWindowRef ; } -template<> inline EventParamType wxMacGetEventParamType() { return typeMenuRef ; } -template<> inline EventParamType wxMacGetEventParamType() { return typeEventRef ; } -template<> inline EventParamType wxMacGetEventParamType() { return typeQDPoint ; } -template<> inline EventParamType wxMacGetEventParamType() { return typeQDRectangle ; } -template<> inline EventParamType wxMacGetEventParamType() { return typeBoolean ; } +template EventParamType wxMacGetEventParamType() { wxFAIL_MSG( wxT("Unknown Param Type") ); return 0; } +template<> inline EventParamType wxMacGetEventParamType() { return typeQDRgnHandle; } +template<> inline EventParamType wxMacGetEventParamType() { return typeControlRef; } +template<> inline EventParamType wxMacGetEventParamType() { return typeWindowRef; } +template<> inline EventParamType wxMacGetEventParamType() { return typeMenuRef; } +template<> inline EventParamType wxMacGetEventParamType() { return typeEventRef; } +template<> inline EventParamType wxMacGetEventParamType() { return typeQDPoint; } +template<> inline EventParamType wxMacGetEventParamType() { return typeQDRectangle; } +template<> inline EventParamType wxMacGetEventParamType() { return typeBoolean; } +template<> inline EventParamType wxMacGetEventParamType() { return typeSInt16; } +template<> inline EventParamType wxMacGetEventParamType() { return typeSInt32; } +template<> inline EventParamType wxMacGetEventParamType() { return typeUInt32; } +template<> inline EventParamType wxMacGetEventParamType() { return typeRGBColor; } #if TARGET_API_MAC_OSX -template<> inline EventParamType wxMacGetEventParamType() { return typeHICommand ; } -template<> inline EventParamType wxMacGetEventParamType() { return typeHIPoint ; } -template<> inline EventParamType wxMacGetEventParamType() { return typeHISize ; } -template<> inline EventParamType wxMacGetEventParamType() { return typeHIRect ; } -template<> inline EventParamType wxMacGetEventParamType() { return typeVoidPtr ; } +template<> inline EventParamType wxMacGetEventParamType() { return typeHICommand; } +template<> inline EventParamType wxMacGetEventParamType() { return typeHIPoint; } +template<> inline EventParamType wxMacGetEventParamType() { return typeHISize; } +template<> inline EventParamType wxMacGetEventParamType() { return typeHIRect; } +template<> inline EventParamType wxMacGetEventParamType() { return typeVoidPtr; } +#endif +#if TARGET_API_MAC_OSX && ( MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 ) +template<> inline EventParamType wxMacGetEventParamType() { return typeCFDictionaryRef; } #endif -template<> inline EventParamType wxMacGetEventParamType() { return typeCollection ; } -template<> inline EventParamType wxMacGetEventParamType() { return typeCGContextRef ; } +template<> inline EventParamType wxMacGetEventParamType() { return typeCollection; } +template<> inline EventParamType wxMacGetEventParamType() { return typeCGContextRef; } /* -These are ambiguous -template<> EventParamType wxMacGetEventParamType() { return typeGrafPtr ; } -template<> EventParamType wxMacGetEventParamType() { return typeOSStatus ; } -template<> EventParamType wxMacGetEventParamType() { return typeCFIndex ; } -template<> EventParamType wxMacGetEventParamType() { return typeGWorldPtr ; } -*/ + These are ambiguous + template<> EventParamType wxMacGetEventParamType() { return typeGrafPtr; } + template<> EventParamType wxMacGetEventParamType() { return typeOSStatus; } + template<> EventParamType wxMacGetEventParamType() { return typeCFIndex; } + template<> EventParamType wxMacGetEventParamType() { return typeGWorldPtr; } + */ class wxMacCarbonEvent { - + public : - wxMacCarbonEvent( EventRef event , bool release = false ) + wxMacCarbonEvent() + { + m_eventRef = 0; + m_release = false; + } + + wxMacCarbonEvent( EventRef event , bool release = false ) { - m_eventRef = event ; - m_release = release ; + m_eventRef = event; + m_release = release; } - wxMacCarbonEvent(UInt32 inClassID,UInt32 inKind,EventTime inWhen = 0 /*now*/,EventAttributes inAttributes=kEventAttributeNone) + + wxMacCarbonEvent(UInt32 inClassID,UInt32 inKind,EventTime inWhen = 0 /*now*/,EventAttributes inAttributes=kEventAttributeNone) { - m_eventRef = NULL ; - verify_noerr( MacCreateEvent( NULL , inClassID, inKind,inWhen,inAttributes,&m_eventRef) ) ; - m_release = true ; + m_eventRef = NULL; + verify_noerr( MacCreateEvent( NULL , inClassID, inKind,inWhen,inAttributes,&m_eventRef) ); + m_release = true; } + ~wxMacCarbonEvent() { if ( m_release ) - ReleaseEvent( m_eventRef ) ; + ReleaseEvent( m_eventRef ); + } + + OSStatus Create(UInt32 inClassID,UInt32 inKind,EventTime inWhen = 0 /*now*/,EventAttributes inAttributes=kEventAttributeNone) + { + verify( (m_eventRef == NULL) || m_release ); + if ( m_eventRef && m_release ) + { + ReleaseEvent( m_eventRef ); + m_release = false; + m_eventRef = NULL; + } + OSStatus err = MacCreateEvent( NULL , inClassID, inKind,inWhen,inAttributes,&m_eventRef); + if ( err == noErr ) + m_release = true; + return err; } - - OSStatus GetParameter( EventParamName inName, EventParamType inDesiredType, UInt32 inBufferSize, void * outData) ; - + + OSStatus GetParameter( EventParamName inName, EventParamType inDesiredType, UInt32 inBufferSize, void * outData); + template OSStatus GetParameter( EventParamName inName, EventParamType type , T *data ) { - return GetParameter( inName, type , sizeof( T ) , data ) ; + return GetParameter( inName, type , sizeof( T ) , data ); } template OSStatus GetParameter( EventParamName inName, T *data ) { - return GetParameter( inName, wxMacGetEventParamType() , data ) ; + return GetParameter( inName, wxMacGetEventParamType() , data ); } - + template T GetParameter( EventParamName inName ) { - T value ; - verify_noerr( GetParameter( inName, &value ) ) ; - return value ; + T value; + verify_noerr( GetParameter( inName, &value ) ); + return value; } template T GetParameter( EventParamName inName, EventParamType inDesiredType ) { - T value ; - verify_noerr( GetParameter( inName, inDesiredType , &value ) ) ; - return value ; + T value; + verify_noerr( GetParameter( inName, inDesiredType , &value ) ); + return value; } - OSStatus SetParameter( EventParamName inName, EventParamType inType, UInt32 inSize, const void * inData) ; + OSStatus SetParameter( EventParamName inName, EventParamType inType, UInt32 inSize, const void * inData); template OSStatus SetParameter( EventParamName inName, EventParamType inDesiredType , const T *data ) { - return SetParameter( inName, inDesiredType , sizeof( T ) , data ) ; + return SetParameter( inName, inDesiredType , sizeof( T ) , data ); } template OSStatus SetParameter( EventParamName inName, EventParamType inDesiredType , const T& data ) { - return SetParameter( inName, inDesiredType , &data ) ; + return SetParameter( inName, inDesiredType , &data ); } template OSStatus SetParameter( EventParamName inName, const T *data ) { - return SetParameter( inName, wxMacGetEventParamType() , data ) ; + return SetParameter( inName, wxMacGetEventParamType() , data ); } template OSStatus SetParameter( EventParamName inName, const T& data ) { - return SetParameter( inName, wxMacGetEventParamType() , &data ) ; + return SetParameter( inName, wxMacGetEventParamType() , &data ); } UInt32 GetClass() { - return ::GetEventClass( m_eventRef ) ; + return ::GetEventClass( m_eventRef ); } UInt32 GetKind() { - return ::GetEventKind( m_eventRef ) ; + return ::GetEventKind( m_eventRef ); } EventTime GetTime() { - return ::GetEventTime( m_eventRef ) ; + return ::GetEventTime( m_eventRef ); } UInt32 GetTicks() { - return EventTimeToTicks( GetTime() ) ; + return EventTimeToTicks( GetTime() ); + } + OSStatus SetCurrentTime( ) + { + return ::SetEventTime( m_eventRef , GetCurrentEventTime() ); + } + OSStatus SetTime( EventTime when ) + { + return ::SetEventTime( m_eventRef , when ); } - operator EventRef () { return m_eventRef; } + operator EventRef () { return m_eventRef; } + + bool IsValid() { return m_eventRef != 0; } protected : - EventRef m_eventRef ; - bool m_release ; -} ; + EventRef m_eventRef; + bool m_release; +}; -class wxMacControl +// +// helper class for allocating and deallocating Universal Proc Ptrs +// + +template class wxMacUPP { public : - wxMacControl() + wxMacUPP( procType proc ) { - m_controlRef = NULL ; + m_upp = NULL; + m_upp = (*newUPP)( NULL ); } - - wxMacControl( ControlRef control ) + ~wxMacUPP() + { + if ( m_upp ) + disposeUPP( m_upp ); + } + operator uppType() { return m_upp; } +private : + uppType m_upp; +}; + +typedef wxMacUPP wxMacNMUPP; + +template class wxMacCFRefHolder +{ +public : + wxMacCFRefHolder() + : m_ref(NULL) , m_release(false) { - m_controlRef = control ; } - wxMacControl( WXWidget control ) + + wxMacCFRefHolder( refType ref , bool release = true ) + : m_ref(ref) , m_release(release) { - m_controlRef = (ControlRef) control ; } - virtual ~wxMacControl() + + ~wxMacCFRefHolder() { + Release(); } - - virtual void Dispose() ; - bool Ok() const { return GetControlRef() != NULL ; } - - virtual ControlRef * GetControlRefAddr() { return &m_controlRef; } - virtual ControlRef GetControlRef() const { return m_controlRef ; } + void Release() + { + if ( m_release && m_ref != NULL ) + CFRelease( m_ref ); + m_ref = NULL; + } + + refType Detach() + { + refType val = m_ref; + m_release = false; + m_ref = NULL; + return val; + } + + void Set( refType ref , bool release = true ) + { + Release(); + m_release = release; + m_ref = ref; + } + + operator refType () const { return m_ref; } + +private : + refType m_ref; + bool m_release; + + DECLARE_NO_COPY_CLASS( wxMacCFRefHolder ) +}; + +#if wxUSE_GUI + +/* +GWorldPtr wxMacCreateGWorld( int width , int height , int depth ); +void wxMacDestroyGWorld( GWorldPtr gw ); +PicHandle wxMacCreatePict( GWorldPtr gw , GWorldPtr mask = NULL ); +CIconHandle wxMacCreateCIcon(GWorldPtr image , GWorldPtr mask , short dstDepth , short iconSize ); +void wxMacSetColorTableEntry( CTabHandle newColors , int index , int red , int green , int blue ); +CTabHandle wxMacCreateColorTable( int numColors ); +*/ +void wxMacCreateBitmapButton( ControlButtonContentInfo*info , const wxBitmap& bitmap , int forceType = 0 ); +void wxMacReleaseBitmapButton( ControlButtonContentInfo*info ); + +#define MAC_WXCOLORREF(a) (*((RGBColor*)&(a))) +#define MAC_WXHBITMAP(a) (GWorldPtr(a)) +#define MAC_WXHMETAFILE(a) (PicHandle(a)) +#define MAC_WXHICON(a) (IconRef(a)) +#define MAC_WXHCURSOR(a) (CursHandle(a)) +#define MAC_WXHRGN(a) (RgnHandle(a)) +#define MAC_WXHWND(a) (WindowPtr(a)) +#define MAC_WXRECPTR(a) ((Rect*)a) +#define MAC_WXPOINTPTR(a) ((Point*)a) +#define MAC_WXHMENU(a) ((MenuHandle)a) + +struct wxOpaqueWindowRef +{ + wxOpaqueWindowRef( WindowRef ref ) { m_data = ref; } + operator WindowRef() { return m_data; } +private : + WindowRef m_data; +}; + +void wxMacRectToNative( const wxRect *wx , Rect *n ); +void wxMacNativeToRect( const Rect *n , wxRect* wx ); +void wxMacPointToNative( const wxPoint* wx , Point *n ); +void wxMacNativeToPoint( const Point *n , wxPoint* wx ); + +wxWindow * wxFindControlFromMacControl(ControlRef inControl ); +wxTopLevelWindowMac* wxFindWinFromMacWindow( WindowRef inWindow ); +wxMenu* wxFindMenuFromMacMenu(MenuRef inMenuRef); + +int wxMacCommandToId( UInt32 macCommandId ); +UInt32 wxIdToMacCommand( int wxId ); +wxMenu* wxFindMenuFromMacCommand( const HICommand &macCommandId , wxMenuItem* &item ); - virtual void SetReference( SInt32 data ) ; +extern wxWindow* g_MacLastWindow; +pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , EventRef event , void *data ); +Rect wxMacGetBoundsForControl( wxWindow* window , const wxPoint& pos , const wxSize &size , bool adjustForOrigin = true ); + +ControlActionUPP GetwxMacLiveScrollbarActionProc(); + +class wxMacControl +{ +public : + wxMacControl( wxWindow* peer , bool isRootControl = false ); + wxMacControl( wxWindow* peer , ControlRef control ); + wxMacControl( wxWindow* peer , WXWidget control ); + virtual ~wxMacControl(); + + void Init(); + + virtual void Dispose(); + + bool Ok() const { return IsOk(); } + bool IsOk() const { return GetControlRef() != NULL; } + + void SetReferenceInNativeControl(); + static wxMacControl* GetReferenceFromNativeControl(ControlRef control); + + virtual ControlRef * GetControlRefAddr() { return &m_controlRef; } + virtual ControlRef GetControlRef() const { return m_controlRef; } + + virtual void SetReference( URefCon data ); /* - void operator= (ControlRef c) { m_controlRef = c ; } - operator ControlRef () { return m_controlRef; } - operator ControlRef * () { return &m_controlRef; } + void operator= (ControlRef c) { m_controlRef = c; } + operator ControlRef () { return m_controlRef; } + operator ControlRef * () { return &m_controlRef; } */ // accessing data and values - virtual OSStatus SetData( ControlPartCode inPartCode , ResType inTag , Size inSize , const void * inData ) ; - virtual OSStatus GetData( ControlPartCode inPartCode , ResType inTag , Size inBufferSize , void * inOutBuffer , Size * outActualSize ) const ; - virtual OSStatus GetDataSize( ControlPartCode inPartCode , ResType inTag , Size * outActualSize ) const ; - virtual OSStatus SendEvent( EventRef ref , OptionBits inOptions = 0 ) ; - virtual OSStatus SendHICommand( HICommand &command , OptionBits inOptions = 0 ) ; - - virtual OSStatus SendHICommand( UInt32 commandID , OptionBits inOptions = 0 ) ; - - virtual SInt32 GetValue() const ; - virtual SInt32 GetMaximum() const ; - virtual SInt32 GetMinimum() const ; - - virtual void SetValue( SInt32 v ) ; - virtual void SetMinimum( SInt32 v ) ; - virtual void SetMaximum( SInt32 v ) ; - - virtual void SetValueAndRange( SInt32 value , SInt32 minimum , SInt32 maximum ) ; - virtual void SetRange( SInt32 minimum , SInt32 maximum ) ; - - virtual OSStatus SetFocus( ControlFocusPart focusPart ) ; - virtual bool HasFocus() const ; - virtual bool NeedsFocusRect() const ; - + virtual OSStatus SetData( ControlPartCode inPartCode , ResType inTag , Size inSize , const void * inData ); + virtual OSStatus GetData( ControlPartCode inPartCode , ResType inTag , Size inBufferSize , void * inOutBuffer , Size * outActualSize ) const; + virtual OSStatus GetDataSize( ControlPartCode inPartCode , ResType inTag , Size * outActualSize ) const; + virtual OSStatus SendEvent( EventRef ref , OptionBits inOptions = 0 ); + virtual OSStatus SendHICommand( HICommand &command , OptionBits inOptions = 0 ); + + virtual OSStatus SendHICommand( UInt32 commandID , OptionBits inOptions = 0 ); + + virtual SInt32 GetValue() const; + virtual SInt32 GetMaximum() const; + virtual SInt32 GetMinimum() const; + + virtual void SetValue( SInt32 v ); + virtual void SetMinimum( SInt32 v ); + virtual void SetMaximum( SInt32 v ); + + virtual void SetValueAndRange( SInt32 value , SInt32 minimum , SInt32 maximum ); + virtual void SetRange( SInt32 minimum , SInt32 maximum ); + + virtual OSStatus SetFocus( ControlFocusPart focusPart ); + virtual bool HasFocus() const; + virtual bool NeedsFocusRect() const; + virtual void SetNeedsFocusRect( bool needs ); + // templated helpers Size GetDataSize( ControlPartCode inPartCode , ResType inTag ) const { - Size sz ; - verify_noerr( GetDataSize( inPartCode , inTag , &sz ) ) ; - return sz ; + Size sz; + verify_noerr( GetDataSize( inPartCode , inTag , &sz ) ); + return sz; } template OSStatus SetData( ControlPartCode inPartCode , ResType inTag , const T *data ) { - return SetData( inPartCode , inTag , sizeof( T ) , data ) ; + return SetData( inPartCode , inTag , sizeof( T ) , data ); } template OSStatus SetData( ControlPartCode inPartCode , ResType inTag , const T& data ) { - return SetData( inPartCode , inTag , sizeof( T ) , &data ) ; + return SetData( inPartCode , inTag , sizeof( T ) , &data ); + } + template OSStatus SetData( ResType inTag , const T *data ) + { + return SetData( kControlEntireControl , inTag , sizeof( T ) , data ); + } + template OSStatus SetData( ResType inTag , const T& data ) + { + return SetData( kControlEntireControl , inTag , sizeof( T ) , &data ); } template OSStatus GetData( ControlPartCode inPartCode , ResType inTag , T *data ) const { - Size dummy ; - return GetData( inPartCode , inTag , sizeof( T ) , data , &dummy ) ; + Size dummy; + return GetData( inPartCode , inTag , sizeof( T ) , data , &dummy ); } template T GetData( ControlPartCode inPartCode , ResType inTag ) const { - T value ; - verify_noerr( GetData( inPartCode , inTag , &value ) ) ; - return value ; + T value; + OSStatus err = GetData( inPartCode , inTag , &value ); + + wxASSERT_MSG( err == noErr, + wxString::Format(wxT("GetData Failed for Part [%i] and Tag [%i]"), + inPartCode, (int)inTag) ); + return value; + } + template OSStatus GetData( ResType inTag , T *data ) const + { + Size dummy; + return GetData( kControlEntireControl , inTag , sizeof( T ) , data , &dummy ); + } + template T GetData( ResType inTag ) const + { + return GetData( kControlEntireControl , inTag ); } - + // Flash the control for the specified amount of time - virtual void Flash( ControlPartCode part , UInt32 ticks = 8 ) ; - virtual void VisibilityChanged( bool shown ) ; - virtual void SetFont( const wxFont & font , const wxColour& foreground , long windowStyle ) ; - virtual void SetBackground( const wxBrush &brush ) ; - virtual ControlPartCode HandleKey( SInt16 keyCode, SInt16 charCode, EventModifiers modifiers ) ; - void SetActionProc( ControlActionUPP actionProc ) ; - void SetViewSize( SInt32 viewSize ) ; - SInt32 GetViewSize() const ; - - virtual bool IsVisible() const ; - virtual void SetVisibility( bool visible , bool redraw ) ; - virtual bool IsEnabled() const ; - virtual bool IsActive() const ; - virtual void Enable( bool enable ) ; - + virtual void Flash( ControlPartCode part , UInt32 ticks = 8 ); + + virtual void VisibilityChanged( bool shown ); + virtual void SuperChangedPosition(); + + + virtual void SetFont( const wxFont & font , const wxColour& foreground , long windowStyle ); + virtual void SetBackground( const wxBrush &brush ); + virtual ControlPartCode HandleKey( SInt16 keyCode, SInt16 charCode, EventModifiers modifiers ); + void SetActionProc( ControlActionUPP actionProc ); + void SetViewSize( SInt32 viewSize ); + SInt32 GetViewSize() const; + + virtual bool IsVisible() const; + virtual void SetVisibility( bool visible , bool redraw ); + virtual bool IsEnabled() const; + virtual bool IsActive() const; + virtual void Enable( bool enable ); + // invalidates this control and all children - virtual void InvalidateWithChildren() ; - virtual void SetDrawingEnabled( bool enable ) ; - virtual bool GetNeedsDisplay() const ; - virtual void SetNeedsDisplay( bool needsDisplay , RgnHandle where = NULL ) ; - - virtual void ScrollRect( const wxRect &rect , int dx , int dy ) ; - - virtual void GetRect( Rect *r ) ; - virtual void SetRect( Rect *r ) ; - virtual void GetRectInWindowCoords( Rect *r ) ; - virtual void GetBestRect( Rect *r ) ; - virtual void SetTitle( const wxString &title ) ; + virtual void InvalidateWithChildren(); + virtual void SetDrawingEnabled( bool enable ); +#ifdef __WXMAC_OSX__ + virtual bool GetNeedsDisplay() const; +#endif + // where is in native window relative coordinates + virtual void SetNeedsDisplay( RgnHandle where ); + // where is in native window relative coordinates + virtual void SetNeedsDisplay( Rect* where = NULL ); + + // if rect = NULL, entire view + virtual void ScrollRect( wxRect *rect , int dx , int dy ); + + // in native parent window relative coordinates + virtual void GetRect( Rect *r ); + + // in native parent window relative coordinates + virtual void SetRect( Rect *r ); + + virtual void GetRectInWindowCoords( Rect *r ); + virtual void GetBestRect( Rect *r ); + virtual void SetLabel( const wxString &title ); // converts from Toplevel-Content relative to local - static void Convert( wxPoint *pt , wxMacControl *convert , wxMacControl *to ) ; - - virtual void GetFeatures( UInt32 *features ) ; - virtual OSStatus GetRegion( ControlPartCode partCode , RgnHandle region ) ; - virtual OSStatus SetZOrder( bool above , wxMacControl* other ) ; - // to be moved into a databrowser subclass - - virtual OSStatus SetSelectionFlags( DataBrowserSelectionFlags ) ; - virtual OSStatus AddListViewColumn( DataBrowserListViewColumnDesc *columnDesc, - DataBrowserTableViewColumnIndex position ) ; - virtual OSStatus AutoSizeListViewColumns() ; - virtual OSStatus SetHasScrollBars( bool horiz , bool vert ) ; - virtual OSStatus SetTableViewHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle ) ; - virtual OSStatus SetListViewHeaderBtnHeight(UInt16 height) ; - virtual OSStatus SetCallbacks(const DataBrowserCallbacks * callbacks) ; - virtual OSStatus UpdateItems( DataBrowserItemID container, UInt32 numItems, - const DataBrowserItemID* items, + static void Convert( wxPoint *pt , wxMacControl *convert , wxMacControl *to ); + + virtual void GetFeatures( UInt32 *features ); + virtual OSStatus GetRegion( ControlPartCode partCode , RgnHandle region ); + virtual OSStatus SetZOrder( bool above , wxMacControl* other ); + + bool IsRootControl() { return m_isRootControl; } + + wxWindow* GetPeer() const + { + return m_peer; + } + + // to be moved into a tab control class + + virtual OSStatus SetTabEnabled( SInt16 tabNo , bool enable ); +protected : + ControlRef m_controlRef; + wxFont m_font; + long m_windowStyle; + wxWindow* m_peer; + bool m_needsFocusRect; + bool m_isRootControl; +}; + +// ============================================================================ +// DataBrowser Wrapper +// ============================================================================ +// +// basing on DataBrowserItemIDs +// + +class wxMacDataBrowserControl : public wxMacControl +{ +public : + wxMacDataBrowserControl( wxWindow* peer, const wxPoint& pos, const wxSize& size, long style); + + OSStatus SetCallbacks( const DataBrowserCallbacks *callbacks ); + + OSStatus GetItemCount( DataBrowserItemID container, + Boolean recurse, + DataBrowserItemState state, + ItemCount *numItems) const; + + OSStatus GetItems( DataBrowserItemID container, + Boolean recurse, + DataBrowserItemState state, + Handle items) const; + + + OSStatus AddColumn( DataBrowserListViewColumnDesc *columnDesc, + DataBrowserTableViewColumnIndex position ); + + OSStatus RemoveColumn( DataBrowserTableViewColumnIndex position ); + + OSStatus AutoSizeColumns(); + + OSStatus SetHasScrollBars( bool horiz, bool vert ); + OSStatus SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle ); + + OSStatus SetHeaderButtonHeight( UInt16 height ); + OSStatus GetHeaderButtonHeight( UInt16 *height ); + + OSStatus UpdateItems( DataBrowserItemID container, UInt32 numItems, + const DataBrowserItemID *items, DataBrowserPropertyID preSortProperty, - DataBrowserPropertyID propertyID ) ; - virtual OSStatus AddItems( DataBrowserItemID container, UInt32 numItems, - const DataBrowserItemID* items, - DataBrowserPropertyID preSortProperty ) ; - virtual OSStatus RemoveItems( DataBrowserItemID container, UInt32 numItems, - const DataBrowserItemID* items, - DataBrowserPropertyID preSortProperty ) ; - virtual OSStatus RevealItem( DataBrowserItemID item, + DataBrowserPropertyID propertyID ) const; + + OSStatus AddItems( DataBrowserItemID container, UInt32 numItems, + const DataBrowserItemID *items, + DataBrowserPropertyID preSortProperty ); + OSStatus RemoveItems( DataBrowserItemID container, UInt32 numItems, + const DataBrowserItemID *items, + DataBrowserPropertyID preSortProperty ); + OSStatus RevealItem( DataBrowserItemID item, DataBrowserPropertyID propertyID, - DataBrowserRevealOptions options ) ; - virtual OSStatus GetSelectionAnchor( DataBrowserItemID * first, DataBrowserItemID * last ) ; - virtual bool IsItemSelected( DataBrowserItemID item ) ; - virtual OSStatus SetSelectedItems(UInt32 numItems, - const DataBrowserItemID * items, - DataBrowserSetOption operation ) ; - - // to be moved into a tab control class - - virtual OSStatus SetTabEnabled( SInt16 tabNo , bool enable ) ; + DataBrowserRevealOptions options ) const; + + OSStatus SetSelectionFlags( DataBrowserSelectionFlags ); + OSStatus GetSelectionAnchor( DataBrowserItemID *first, DataBrowserItemID *last ) const; + bool IsItemSelected( DataBrowserItemID item ) const; + OSStatus SetSelectedItems( UInt32 numItems, + const DataBrowserItemID *items, + DataBrowserSetOption operation ); + + OSStatus GetItemID( DataBrowserTableViewRowIndex row, + DataBrowserItemID * item ) const; + OSStatus GetItemRow( DataBrowserItemID item, + DataBrowserTableViewRowIndex * row ) const; + + OSStatus SetDefaultRowHeight( UInt16 height ); + OSStatus GetDefaultRowHeight( UInt16 * height ) const; + + OSStatus SetRowHeight( DataBrowserItemID item , UInt16 height); + OSStatus GetRowHeight( DataBrowserItemID item , UInt16 *height) const; + + OSStatus GetColumnWidth( DataBrowserPropertyID column , UInt16 *width ) const; + OSStatus SetColumnWidth( DataBrowserPropertyID column , UInt16 width ); + + OSStatus GetDefaultColumnWidth( UInt16 *width ) const; + OSStatus SetDefaultColumnWidth( UInt16 width ); + + OSStatus GetColumnCount( UInt32* numColumns) const; + + OSStatus GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position, DataBrowserTableViewColumnID* id ); + + OSStatus GetColumnPosition( DataBrowserPropertyID column, DataBrowserTableViewColumnIndex *position) const; + OSStatus SetColumnPosition( DataBrowserPropertyID column, DataBrowserTableViewColumnIndex position); + + OSStatus GetScrollPosition( UInt32 *top , UInt32 *left ) const; + OSStatus SetScrollPosition( UInt32 top , UInt32 left ); + + OSStatus GetSortProperty( DataBrowserPropertyID *column ) const; + OSStatus SetSortProperty( DataBrowserPropertyID column ); + + OSStatus GetSortOrder( DataBrowserSortOrder *order ) const; + OSStatus SetSortOrder( DataBrowserSortOrder order ); + + OSStatus GetPropertyFlags( DataBrowserPropertyID property, DataBrowserPropertyFlags *flags ) const; + OSStatus SetPropertyFlags( DataBrowserPropertyID property, DataBrowserPropertyFlags flags ); + + OSStatus GetHeaderDesc( DataBrowserPropertyID property, DataBrowserListViewHeaderDesc *desc ) const; + OSStatus SetHeaderDesc( DataBrowserPropertyID property, DataBrowserListViewHeaderDesc *desc ); + + OSStatus SetDisclosureColumn( DataBrowserPropertyID property , Boolean expandableRows ); +protected : + + static pascal void DataBrowserItemNotificationProc( + ControlRef browser, + DataBrowserItemID itemID, + DataBrowserItemNotification message, + DataBrowserItemDataRef itemData ); + + virtual void ItemNotification( + DataBrowserItemID itemID, + DataBrowserItemNotification message, + DataBrowserItemDataRef itemData) = 0; + + static pascal OSStatus DataBrowserGetSetItemDataProc( + ControlRef browser, + DataBrowserItemID itemID, + DataBrowserPropertyID property, + DataBrowserItemDataRef itemData, + Boolean changeValue ); + + virtual OSStatus GetSetItemData( + DataBrowserItemID itemID, + DataBrowserPropertyID property, + DataBrowserItemDataRef itemData, + Boolean changeValue ) = 0; + + static pascal Boolean DataBrowserCompareProc( + ControlRef browser, + DataBrowserItemID itemOneID, + DataBrowserItemID itemTwoID, + DataBrowserPropertyID sortProperty); + + virtual Boolean CompareItems(DataBrowserItemID itemOneID, + DataBrowserItemID itemTwoID, + DataBrowserPropertyID sortProperty) = 0; +}; + +// ============================================================================ +// Higher-level Databrowser +// ============================================================================ +// +// basing on data item objects +// + +// forward decl + +class wxMacDataItemBrowserControl; +class wxMacListBoxItem; + +const DataBrowserPropertyID kTextColumnId = 1024; +const DataBrowserPropertyID kNumericOrderColumnId = 1025; + +// for multi-column controls, we will use this + the column ID to identify the +// column. We don't use kTextColumnId there, and ideally the two should merge. +const DataBrowserPropertyID kMinColumnId = 1050; + +// base API for high-level databrowser operations + +class wxMacListControl +{ +public: + virtual void MacDelete( unsigned int n ) = 0; + virtual void MacInsert( unsigned int n, const wxString& item, int column = -1 ) = 0; + virtual void MacInsert( unsigned int n, const wxArrayString& items, int column = -1 ) = 0; + // returns index of newly created line + virtual int MacAppend( const wxString& item ) = 0; + virtual void MacSetString( unsigned int n, const wxString& item ) = 0; + virtual void MacClear() = 0; + virtual void MacDeselectAll() = 0; + virtual void MacSetSelection( unsigned int n, bool select, bool multi ) = 0; + virtual int MacGetSelection() const = 0; + virtual int MacGetSelections( wxArrayInt& aSelections ) const = 0; + virtual bool MacIsSelected( unsigned int n ) const = 0; + virtual void MacScrollTo( unsigned int n ) = 0; + virtual wxString MacGetString( unsigned int n) const = 0; + virtual unsigned int MacGetCount() const = 0; + + virtual void MacSetClientData( unsigned int n, void * data) = 0; + virtual void * MacGetClientData( unsigned int) const = 0; + + virtual ~wxMacListControl() { } +}; + +// base class for databrowser items + +enum DataItemType { + DataItem_Text +}; + +class wxMacDataItem +{ +public : + wxMacDataItem(); + virtual ~wxMacDataItem(); + + virtual bool IsLessThan(wxMacDataItemBrowserControl *owner , + const wxMacDataItem*, + DataBrowserPropertyID property) const; + + // returns true if access was successful, otherwise false + virtual OSStatus GetSetData(wxMacDataItemBrowserControl *owner , + DataBrowserPropertyID property, + DataBrowserItemDataRef itemData, + bool changeValue ); + + virtual void Notification(wxMacDataItemBrowserControl *owner , + DataBrowserItemNotification message, + DataBrowserItemDataRef itemData ) const; + + void SetLabel( const wxString& str); + const wxString& GetLabel() const; + + void SetOrder( SInt32 order ); + SInt32 GetOrder() const; + + void SetData( void* data); + void* GetData() const; + + void SetColumn( short col ); + short GetColumn(); + protected : - ControlRef m_controlRef ; - wxFont m_font ; - long m_windowStyle ; -} ; + wxString m_label; + wxMacCFStringHolder m_cfLabel; + void * m_data; + SInt32 m_order; + DataBrowserPropertyID m_colId; + +}; + +enum ListSortOrder { + SortOrder_None, + SortOrder_Text_Ascending, + SortOrder_Text_Descending +}; + +typedef wxMacDataItem* wxMacDataItemPtr; +const wxMacDataItemPtr wxMacDataBrowserRootContainer = NULL; + +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxMacDataItemPtr, wxArrayMacDataItemPtr, class WXDLLIMPEXP_CORE); + +class wxMacDataItemBrowserControl : public wxMacDataBrowserControl, public wxMacListControl +{ +public : + wxMacDataItemBrowserControl( wxWindow* peer , const wxPoint& pos, const wxSize& size, long style); + + // create a list item (can be a subclass of wxMacListBoxItem) + + virtual wxMacDataItem* CreateItem(); + + unsigned int GetItemCount(const wxMacDataItem* container, bool recurse , DataBrowserItemState state) const; + void GetItems(const wxMacDataItem* container, bool recurse , + DataBrowserItemState state, wxArrayMacDataItemPtr &items ) const; + + unsigned int GetSelectedItemCount( const wxMacDataItem* container, bool recurse ) const; + + unsigned int GetLineFromItem(const wxMacDataItem *item) const; + wxMacDataItem * GetItemFromLine(unsigned int n) const; + + void UpdateItem(const wxMacDataItem *container, const wxMacDataItem *item, + DataBrowserPropertyID property) const; + void UpdateItems(const wxMacDataItem *container, wxArrayMacDataItemPtr &items, + DataBrowserPropertyID property) const; + + void InsertColumn(int colId, DataBrowserPropertyType colType, + const wxString& title, SInt16 just = teFlushDefault, int defaultWidth = -1); + + int GetColumnWidth(int colId); + void SetColumnWidth(int colId, int width); + + void AddItem(wxMacDataItem *container, wxMacDataItem *item); + void AddItems(wxMacDataItem *container, wxArrayMacDataItemPtr &items ); + + void RemoveAllItems(wxMacDataItem *container); + void RemoveItem(wxMacDataItem *container, wxMacDataItem* item); + void RemoveItems(wxMacDataItem *container, wxArrayMacDataItemPtr &items); + + void SetSelectedItem( wxMacDataItem* item , DataBrowserSetOption option); + void SetSelectedItems( wxArrayMacDataItemPtr &items , DataBrowserSetOption option); + void SetSelectedAllItems( DataBrowserSetOption option); + Boolean IsItemSelected( const wxMacDataItem* item) const; + + void RevealItem( wxMacDataItem* item, DataBrowserRevealOptions options); + + void GetSelectionAnchor( wxMacDataItemPtr* first , wxMacDataItemPtr* last) const; + + // item aware methods, to be used in subclasses + + virtual Boolean CompareItems(const wxMacDataItem* itemOneID, + const wxMacDataItem* itemTwoID, + DataBrowserPropertyID sortProperty); + + virtual OSStatus GetSetItemData(wxMacDataItem* itemID, + DataBrowserPropertyID property, + DataBrowserItemDataRef itemData, + Boolean changeValue ); + + virtual void ItemNotification( + const wxMacDataItem* itemID, + DataBrowserItemNotification message, + DataBrowserItemDataRef itemData); + + // as we are getting the same events for human and API selection we have to suppress + // events in the latter case, since this will be used from many subclasses we keep it here + + bool IsSelectionSuppressed() const { return m_suppressSelection; } + bool SuppressSelection( bool suppress ); + + + // wxMacListControl Methods + // add and remove + + virtual void MacDelete( unsigned int n ); + virtual void MacInsert( unsigned int n, const wxString& item, int column = -1 ); + virtual void MacInsert( unsigned int n, const wxArrayString& items, int column = -1 ); + virtual int MacAppend( const wxString& item ); + virtual void MacClear(); + + // selecting + + virtual void MacDeselectAll(); + virtual void MacSetSelection( unsigned int n, bool select, bool multi = false ); + virtual int MacGetSelection() const; + virtual int MacGetSelections( wxArrayInt& aSelections ) const; + virtual bool MacIsSelected( unsigned int n ) const; + + // display + + virtual void MacScrollTo( unsigned int n ); + + // accessing content + + virtual void MacSetString( unsigned int n, const wxString& item ); + virtual void MacSetClientData( unsigned int n, void * data); + virtual wxString MacGetString( unsigned int n) const; + virtual void * MacGetClientData( unsigned int) const; + virtual unsigned int MacGetCount() const; + + // client data + + virtual wxClientDataType GetClientDataType() const; + virtual void SetClientDataType(wxClientDataType clientDataItemsType); + //virtual ListSortOrder GetSortOrder() const; + //virtual void SetSortOrder(const ListSortOrder sort); + + + +protected: + + ListSortOrder m_sortOrder; + wxClientDataType m_clientDataItemsType; + + // ID aware base methods, should be 'final' ie not changed in subclasses + + virtual Boolean CompareItems(DataBrowserItemID itemOneID, + DataBrowserItemID itemTwoID, + DataBrowserPropertyID sortProperty); + + virtual OSStatus GetSetItemData(DataBrowserItemID itemID, + DataBrowserPropertyID property, + DataBrowserItemDataRef itemData, + Boolean changeValue ); + + virtual void ItemNotification( + DataBrowserItemID itemID, + DataBrowserItemNotification message, + DataBrowserItemDataRef itemData); + + +private : + + bool m_suppressSelection; +}; + +class wxMacDataItemBrowserSelectionSuppressor +{ +public : + wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl *browser); + ~wxMacDataItemBrowserSelectionSuppressor(); + +private : + + bool m_former; + wxMacDataItemBrowserControl* m_browser; +}; + +// ============================================================================ +// platform listbox implementation +// ============================================================================ + +// exposed for reuse in wxCheckListBox + +class wxMacListBoxItem : public wxMacDataItem +{ +public : + wxMacListBoxItem(); + + virtual ~wxMacListBoxItem(); + + virtual void Notification(wxMacDataItemBrowserControl *owner , + DataBrowserItemNotification message, + DataBrowserItemDataRef itemData ) const; +}; + +class wxMacDataBrowserListControl : public wxMacDataItemBrowserControl +{ +public: + wxMacDataBrowserListControl( wxWindow *peer, const wxPoint& pos, const wxSize& size, long style ); + virtual ~wxMacDataBrowserListControl(); + + virtual wxMacDataItem* CreateItem(); + + // pointing back + + wxWindow * GetPeer() const; + +}; + +// ============================================================================ +// graphics implementation +// ============================================================================ + +#if wxMAC_USE_CORE_GRAPHICS && !wxUSE_GRAPHICS_CONTEXT + +class WXDLLEXPORT wxMacCGPath : public wxGraphicPath +{ + DECLARE_NO_COPY_CLASS(wxMacCGPath) +public : + wxMacCGPath(); + ~wxMacCGPath(); + + // Starts a new subpath at + void MoveToPoint( wxCoord x1 , wxCoord y1 ); + void AddLineToPoint( wxCoord x1 , wxCoord y1 ); + void AddQuadCurveToPoint( wxCoord cx1, wxCoord cy1, wxCoord x1, wxCoord y1 ); + void AddRectangle( wxCoord x, wxCoord y, wxCoord w, wxCoord h ); + void AddCircle( wxCoord x, wxCoord y , wxCoord r ); + + // draws a an arc to two tangents connecting (current) to (x1,y1) and (x1,y1) to (x2,y2) + virtual void AddArcToPoint( wxCoord x1, wxCoord y1 , wxCoord x2, wxCoord y2, wxCoord r ) ; + virtual void AddArc( wxCoord x, wxCoord y, wxCoord r, double startAngle, double endAngle, bool clockwise ) ; + + // closes the current subpath + void CloseSubpath(); + + CGPathRef GetPath() const; +private : + CGMutablePathRef m_path; +}; + +class WXDLLEXPORT wxMacCGContext : public wxGraphicContext +{ + DECLARE_NO_COPY_CLASS(wxMacCGContext) + +public: + wxMacCGContext( CGrafPtr port ); + wxMacCGContext( CGContextRef cgcontext ); + wxMacCGContext(); + virtual ~wxMacCGContext(); + + virtual void Clip( const wxRegion ®ion ); + virtual void StrokePath( const wxGraphicPath *p ); + virtual void DrawPath( const wxGraphicPath *p , int fillStyle = wxWINDING_RULE ); + virtual void FillPath( const wxGraphicPath *p , const wxColor &fillColor , int fillStyle = wxWINDING_RULE ); + + virtual wxGraphicPath* CreatePath(); + virtual void SetPen( const wxPen &pen ) ; + virtual void SetBrush( const wxBrush &brush ); + CGContextRef GetNativeContext(); + void SetNativeContext( CGContextRef cg ); + CGPathDrawingMode GetDrawingMode() const { return m_mode; } + + virtual void Translate( wxCoord dx , wxCoord dy ); + virtual void Scale( wxCoord xScale , wxCoord yScale ); + virtual void DrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, wxCoord w, wxCoord h ); + virtual void DrawIcon( const wxIcon &icon, wxCoord x, wxCoord y, wxCoord w, wxCoord h ); + virtual void PushState(); + virtual void PopState(); + + virtual void DrawText( const wxString &str, wxCoord x, wxCoord y, double angle ) ; + + virtual void GetTextExtent( const wxString &str, wxCoord *width, wxCoord *height, + wxCoord *descent, wxCoord *externalLeading ) const ; + + virtual void GetPartialTextExtents(const wxString& text, wxArrayInt& widths) const ; + + virtual void SetFont( const wxFont &font ) ; + + virtual void SetTextColor( const wxColour &col ) ; +private: + CGContextRef m_cgContext; + CGrafPtr m_qdPort; + CGPathDrawingMode m_mode; + ATSUStyle m_macATSUIStyle ; + wxPen m_pen; + wxBrush m_brush; + wxColor m_textForegroundColor ; +}; + +#endif // wxMAC_USE_CORE_GRAPHICS + +#ifdef __WXMAC_OSX__ + +CGColorSpaceRef wxMacGetGenericRGBColorSpace(void); +void wxMacMemoryBufferReleaseProc(void *info, const void *data, size_t size); + +#endif + +class WXDLLEXPORT wxBitmapRefData: public wxGDIRefData +{ + friend class WXDLLEXPORT wxIcon; + friend class WXDLLEXPORT wxCursor; +public: + wxBitmapRefData(int width , int height , int depth); + wxBitmapRefData(); + wxBitmapRefData(const wxBitmapRefData &tocopy); + + virtual ~wxBitmapRefData(); + + void Free(); + bool Ok() const { return IsOk(); } + bool IsOk() const { return m_ok; } + void SetOk( bool isOk) { m_ok = isOk; } + + void SetWidth( int width ) { m_width = width; } + void SetHeight( int height ) { m_height = height; } + void SetDepth( int depth ) { m_depth = depth; } + + int GetWidth() const { return m_width; } + int GetHeight() const { return m_height; } + int GetDepth() const { return m_depth; } + + void *GetRawAccess() const; + void *BeginRawAccess(); + void EndRawAccess(); + + bool HasAlpha() const { return m_hasAlpha; } + void UseAlpha( bool useAlpha ); + +public: +#if wxUSE_PALETTE + wxPalette m_bitmapPalette; +#endif // wxUSE_PALETTE + + wxMask * m_bitmapMask; // Optional mask +#ifdef __WXMAC_OSX__ + CGImageRef CGImageCreate() const; +#endif + + // returns true if the bitmap has a size that + // can be natively transferred into a true icon + // if no is returned GetIconRef will still produce + // an icon but it will be generated via a PICT and + // rescaled to 16 x 16 + bool HasNativeSize(); + + // caller should increase ref count if needed longer + // than the bitmap exists + IconRef GetIconRef(); + + // returns a Pict from the bitmap content + PicHandle GetPictHandle(); + GWorldPtr GetHBITMAP(GWorldPtr * mask = NULL ) const; + void UpdateAlphaMask() const; + +private : + bool Create(int width , int height , int depth); + void Init(); + + int m_width; + int m_height; + int m_bytesPerRow; + int m_depth; + bool m_hasAlpha; + wxMemoryBuffer m_memBuf; + int m_rawAccessCount; + bool m_ok; +#ifdef __WXMAC_OSX__ + mutable CGImageRef m_cgImageRef; +#endif + IconRef m_iconRef; + PicHandle m_pictHandle; + GWorldPtr m_hBitmap; + GWorldPtr m_hMaskBitmap; + wxMemoryBuffer m_maskMemBuf; + int m_maskBytesPerRow; +}; + +class WXDLLEXPORT wxIconRefData : public wxGDIRefData +{ +public: + wxIconRefData(); + wxIconRefData( WXHICON ); + virtual ~wxIconRefData() { Free(); } + + void Init(); + virtual void Free(); + + void SetWidth( int width ) { m_width = width; } + void SetHeight( int height ) { m_height = height; } + + int GetWidth() const { return m_width; } + int GetHeight() const { return m_height; } + + WXHICON GetHICON() const { return (WXHICON) m_iconRef; } +private : + IconRef m_iconRef; + int m_width; + int m_height; +}; + +// toplevel.cpp + +ControlRef wxMacFindControlUnderMouse( wxTopLevelWindowMac* toplevelWindow, const Point& location , WindowRef window , ControlPartCode *outPart ); + +#ifndef __LP64__ + +#ifdef WORDS_BIGENDIAN + inline Rect* wxMacGetPictureBounds( PicHandle pict , Rect* rect ) + { + *rect = (**pict).picFrame; + return rect; + } +#else + inline Rect* wxMacGetPictureBounds( PicHandle pict , Rect* rect ) + { + return QDGetPictureBounds( pict , rect ); + } +#endif + +#endif #endif // wxUSE_GUI +#define wxMAC_DEFINE_PROC_GETTER( UPP , x ) \ +UPP Get##x() \ +{ \ + static UPP sHandler = NULL; \ + if ( sHandler == NULL ) \ + sHandler = New##UPP( x ); \ + return sHandler; \ +} + //--------------------------------------------------------------------------- // wxMac string conversions //--------------------------------------------------------------------------- -void wxMacSetupConverters() ; -void wxMacCleanupConverters() ; +void wxMacSetupConverters(); +void wxMacCleanupConverters(); -void wxMacStringToPascal( const wxString&from , StringPtr to ) ; -wxString wxMacMakeStringFromPascal( ConstStringPtr from ) ; +void wxMacStringToPascal( const wxString&from , StringPtr to ); +wxString wxMacMakeStringFromPascal( ConstStringPtr from ); -// toplevel.cpp +// filefn.cpp -ControlRef wxMacFindControlUnderMouse( Point location , WindowRef window , ControlPartCode *outPart ) ; +wxString wxMacFSRefToPath( const FSRef *fsRef , CFStringRef additionalPathComponent = NULL ); +OSStatus wxMacPathToFSRef( const wxString&path , FSRef *fsRef ); +wxString wxMacHFSUniStrToString( ConstHFSUniStr255Param uniname ); -// filefn.cpp +#if wxUSE_GUI + +// deprecating QD -wxString wxMacFSRefToPath( const FSRef *fsRef , CFStringRef additionalPathComponent = NULL ) ; -OSStatus wxMacPathToFSRef( const wxString&path , FSRef *fsRef ) ; -wxString wxMacHFSUniStrToString( ConstHFSUniStr255Param uniname ) ; +void wxMacLocalToGlobal( WindowRef window , Point*pt ); +void wxMacGlobalToLocal( WindowRef window , Point*pt ); + +#endif #endif // _WX_PRIVATE_H_