1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/mac/carbon/utils.cpp
3 // Purpose: Various utilities
4 // Author: Stefan Csomor
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
20 #include "wx/toplevel.h"
25 #include "wx/apptrait.h"
28 #include "wx/mac/uma.h"
38 // #include "MoreFilesX.h"
46 #include <CoreServices/CoreServices.h>
47 #include <Carbon/Carbon.h>
48 #include "wx/mac/private/timer.h"
51 #include "wx/evtloop.h"
52 #include "wx/mac/private.h"
54 #if defined(__MWERKS__) && wxUSE_UNICODE
55 #if __MWERKS__ < 0x4100
62 // our OS version is the same in non GUI and GUI cases
63 wxOperatingSystemId
wxGetOsVersion(int *majorVsn
, int *minorVsn
)
66 Gestalt(gestaltSystemVersion
, &theSystem
);
68 if ( majorVsn
!= NULL
)
69 *majorVsn
= (theSystem
>> 8);
71 if ( minorVsn
!= NULL
)
72 *minorVsn
= (theSystem
& 0xFF);
74 #if defined( __DARWIN__ )
75 return wxOS_MAC_OSX_DARWIN
;
81 extern bool WXDLLEXPORT
wxIsDebuggerRunning()
83 // TODO : try to find out ...
100 wxPortId
wxGUIAppTraits::GetToolkitVersion(int *verMaj
, int *verMin
) const
102 // We suppose that toolkit version is the same as OS version under Mac
103 wxGetOsVersion(verMaj
, verMin
);
108 wxEventLoopBase
* wxGUIAppTraits::CreateEventLoop()
110 return new wxEventLoop
;
113 wxTimerImpl
* wxGUIAppTraits::CreateTimerImpl(wxTimer
*timer
)
115 return new wxCarbonTimerImpl(timer
);
118 int gs_wxBusyCursorCount
= 0;
119 extern wxCursor gMacCurrentCursor
;
120 wxCursor gMacStoredActiveCursor
;
122 // Set the cursor to the busy cursor for all windows
123 void wxBeginBusyCursor(const wxCursor
*cursor
)
125 if (gs_wxBusyCursorCount
++ == 0)
127 gMacStoredActiveCursor
= gMacCurrentCursor
;
128 cursor
->MacInstall();
130 //else: nothing to do, already set
133 // Restore cursor to normal
134 void wxEndBusyCursor()
136 wxCHECK_RET( gs_wxBusyCursorCount
> 0,
137 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
139 if (--gs_wxBusyCursorCount
== 0)
141 gMacStoredActiveCursor
.MacInstall();
142 gMacStoredActiveCursor
= wxNullCursor
;
146 // true if we're between the above two calls
149 return (gs_wxBusyCursorCount
> 0);
156 wxString
wxMacFindFolderNoSeparator( short vol
,
158 Boolean createFolder
)
163 if ( FSFindFolder( vol
, folderType
, createFolder
, &fsRef
) == noErr
)
165 strDir
= wxMacFSRefToPath( &fsRef
);
171 wxString
wxMacFindFolder( short vol
,
173 Boolean createFolder
)
175 return wxMacFindFolderNoSeparator(vol
, folderType
, createFolder
) + wxFILE_SEP_PATH
;
182 // Check whether this window wants to process messages, e.g. Stop button
183 // in long calculations.
184 bool wxCheckForInterrupt(wxWindow
*WXUNUSED(wnd
))
190 void wxGetMousePosition( int* x
, int* y
)
192 #if wxMAC_USE_QUICKDRAW
202 // Return true if we have a colour display
203 bool wxColourDisplay()
208 // Returns depth of screen
211 #if wxMAC_USE_QUICKDRAW
212 int theDepth
= (int) CGDisplayBitsPerPixel(CGMainDisplayID());
214 SetRect(&globRect
, -32760, -32760, 32760, 32760);
215 GDHandle theMaxDevice
;
217 theMaxDevice
= GetMaxDevice(&globRect
);
218 if (theMaxDevice
!= NULL
)
219 theDepth
= (**(**theMaxDevice
).gdPMap
).pixelSize
;
227 // Get size of display
228 void wxDisplaySize(int *width
, int *height
)
230 // TODO adapt for multi-displays
231 CGRect bounds
= CGDisplayBounds(CGMainDisplayID());
233 *width
= (int)bounds
.size
.width
;
235 *height
= (int)bounds
.size
.height
;
238 void wxDisplaySizeMM(int *width
, int *height
)
240 wxDisplaySize(width
, height
);
241 // on mac 72 is fixed (at least now;-)
242 float cvPt2Mm
= 25.4 / 72;
245 *width
= int( *width
* cvPt2Mm
);
248 *height
= int( *height
* cvPt2Mm
);
251 void wxClientDisplayRect(int *x
, int *y
, int *width
, int *height
)
253 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
254 #if wxMAC_USE_QUICKDRAW
257 HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay
,kHICoordSpace72DPIGlobal
,
260 *x
= bounds
.origin
.x
;
262 *y
= bounds
.origin
.y
;
264 *width
= bounds
.size
.width
;
266 *height
= bounds
.size
.height
;
269 wxDisplaySize(&w
,&h
);
281 GetAvailableWindowPositioningBounds( GetMainDevice() , &r
);
287 *width
= r
.right
- r
.left
;
289 *height
= r
.bottom
- r
.top
;
293 wxWindow
* wxFindWindowAtPoint(const wxPoint
& pt
)
295 return wxGenericFindWindowAtPoint(pt
);
302 wxString
wxGetOsDescription()
304 #ifdef WXWIN_OS_DESCRIPTION
305 // use configure generated description if available
306 return wxString(wxT("MacOS (")) + wxT(WXWIN_OS_DESCRIPTION
) + wxString(wxT(")"));
308 return wxT("MacOS"); //TODO:define further
313 wxString
wxGetUserHome (const wxString
& user
)
319 bool wxGetDiskSpace(const wxString
& path
, wxDiskspaceSize_t
*pTotal
, wxDiskspaceSize_t
*pFree
)
328 int pos
= p
.Find(':');
329 if ( pos
!= wxNOT_FOUND
)
337 err
= wxMacPathToFSRef( p
, &fsRef
);
340 FSVolumeRefNum vRefNum
;
341 err
= FSGetVRefNum( &fsRef
, &vRefNum
);
344 UInt64 freeBytes
, totalBytes
;
345 err
= FSGetVInfo( vRefNum
, NULL
, &freeBytes
, &totalBytes
);
349 *pTotal
= wxDiskspaceSize_t( totalBytes
);
351 *pFree
= wxDiskspaceSize_t( freeBytes
);
358 #endif // !__DARWIN__
360 //---------------------------------------------------------------------------
361 // wxMac Specific utility functions
362 //---------------------------------------------------------------------------
364 void wxMacStringToPascal( const wxString
&from
, StringPtr to
)
366 wxCharBuffer buf
= from
.mb_str( wxConvLocal
);
367 int len
= strlen(buf
);
372 memcpy( (char*) &to
[1] , buf
, len
);
375 wxString
wxMacMakeStringFromPascal( ConstStringPtr from
)
377 return wxString( (char*) &from
[1] , wxConvLocal
, from
[0] );
380 // ----------------------------------------------------------------------------
381 // Common Event Support
382 // ----------------------------------------------------------------------------
386 OSStatus err
= noErr
;
389 // lead sometimes to race conditions, although all calls used should be thread safe ...
390 static wxMacCarbonEvent s_wakeupEvent
;
391 if ( !s_wakeupEvent
.IsValid() )
393 err
= s_wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
394 kEventAttributeNone
);
399 if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent
) )
401 s_wakeupEvent
.SetCurrentTime();
402 err
= PostEventToQueue(GetMainEventQueue(), s_wakeupEvent
,
403 kEventPriorityHigh
);
406 wxMacCarbonEvent wakeupEvent
;
407 wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
408 kEventAttributeNone
);
409 err
= PostEventToQueue(GetMainEventQueue(), wakeupEvent
,
410 kEventPriorityHigh
);
418 // ----------------------------------------------------------------------------
419 // Native Struct Conversions
420 // ----------------------------------------------------------------------------
422 void wxMacRectToNative( const wxRect
*wx
, Rect
*n
)
426 n
->right
= wx
->x
+ wx
->width
;
427 n
->bottom
= wx
->y
+ wx
->height
;
430 void wxMacNativeToRect( const Rect
*n
, wxRect
* wx
)
434 wx
->width
= n
->right
- n
->left
;
435 wx
->height
= n
->bottom
- n
->top
;
438 void wxMacPointToNative( const wxPoint
* wx
, Point
*n
)
444 void wxMacNativeToPoint( const Point
*n
, wxPoint
* wx
)
450 // ----------------------------------------------------------------------------
451 // Carbon Event Support
452 // ----------------------------------------------------------------------------
454 OSStatus
wxMacCarbonEvent::GetParameter(EventParamName inName
, EventParamType inDesiredType
, UInt32 inBufferSize
, void * outData
)
456 return ::GetEventParameter( m_eventRef
, inName
, inDesiredType
, NULL
, inBufferSize
, NULL
, outData
);
459 OSStatus
wxMacCarbonEvent::SetParameter(EventParamName inName
, EventParamType inType
, UInt32 inBufferSize
, const void * inData
)
461 return ::SetEventParameter( m_eventRef
, inName
, inType
, inBufferSize
, inData
);
464 // ----------------------------------------------------------------------------
465 // Control Access Support
466 // ----------------------------------------------------------------------------
468 #if wxMAC_USE_QUICKDRAW
470 IMPLEMENT_DYNAMIC_CLASS( wxMacControl
, wxObject
)
472 wxMacControl::wxMacControl()
477 wxMacControl::wxMacControl(wxWindow
* peer
, bool isRootControl
)
481 m_isRootControl
= isRootControl
;
484 wxMacControl::wxMacControl( wxWindow
* peer
, ControlRef control
)
488 m_controlRef
= control
;
491 wxMacControl::wxMacControl( wxWindow
* peer
, WXWidget control
)
495 m_controlRef
= (ControlRef
) control
;
498 wxMacControl::~wxMacControl()
502 void wxMacControl::Init()
506 m_needsFocusRect
= false;
507 m_isRootControl
= false;
510 void wxMacControl::Dispose()
512 wxASSERT_MSG( m_controlRef
!= NULL
, wxT("Control Handle already NULL, Dispose called twice ?") );
513 wxASSERT_MSG( IsValidControlHandle(m_controlRef
) , wxT("Invalid Control Handle (maybe already released) in Dispose") );
515 // we cannot check the ref count here anymore, as autorelease objects might delete their refs later
516 // we can have situations when being embedded, where the control gets deleted behind our back, so only
517 // CFRelease if we are safe
518 if ( IsValidControlHandle(m_controlRef
) )
519 CFRelease(m_controlRef
);
523 void wxMacControl::SetReference( URefCon data
)
525 SetControlReference( m_controlRef
, data
);
528 OSStatus
wxMacControl::GetData(ControlPartCode inPartCode
, ResType inTag
, Size inBufferSize
, void * inOutBuffer
, Size
* outActualSize
) const
530 return ::GetControlData( m_controlRef
, inPartCode
, inTag
, inBufferSize
, inOutBuffer
, outActualSize
);
533 OSStatus
wxMacControl::GetDataSize(ControlPartCode inPartCode
, ResType inTag
, Size
* outActualSize
) const
535 return ::GetControlDataSize( m_controlRef
, inPartCode
, inTag
, outActualSize
);
538 OSStatus
wxMacControl::SetData(ControlPartCode inPartCode
, ResType inTag
, Size inSize
, const void * inData
)
540 return ::SetControlData( m_controlRef
, inPartCode
, inTag
, inSize
, inData
);
543 OSStatus
wxMacControl::SendEvent( EventRef event
, OptionBits inOptions
)
545 return SendEventToEventTargetWithOptions( event
,
546 HIObjectGetEventTarget( (HIObjectRef
) m_controlRef
), inOptions
);
549 OSStatus
wxMacControl::SendHICommand( HICommand
&command
, OptionBits inOptions
)
551 wxMacCarbonEvent
event( kEventClassCommand
, kEventCommandProcess
);
553 event
.SetParameter
<HICommand
>(kEventParamDirectObject
,command
);
555 return SendEvent( event
, inOptions
);
558 OSStatus
wxMacControl::SendHICommand( UInt32 commandID
, OptionBits inOptions
)
562 memset( &command
, 0 , sizeof(command
) );
563 command
.commandID
= commandID
;
564 return SendHICommand( command
, inOptions
);
567 void wxMacControl::Flash( ControlPartCode part
, UInt32 ticks
)
569 unsigned long finalTicks
;
571 HiliteControl( m_controlRef
, part
);
572 Delay( ticks
, &finalTicks
);
573 HiliteControl( m_controlRef
, kControlNoPart
);
576 SInt32
wxMacControl::GetValue() const
578 return ::GetControl32BitValue( m_controlRef
);
581 SInt32
wxMacControl::GetMaximum() const
583 return ::GetControl32BitMaximum( m_controlRef
);
586 SInt32
wxMacControl::GetMinimum() const
588 return ::GetControl32BitMinimum( m_controlRef
);
591 void wxMacControl::SetValue( SInt32 v
)
593 ::SetControl32BitValue( m_controlRef
, v
);
596 void wxMacControl::SetMinimum( SInt32 v
)
598 ::SetControl32BitMinimum( m_controlRef
, v
);
601 void wxMacControl::SetMaximum( SInt32 v
)
603 ::SetControl32BitMaximum( m_controlRef
, v
);
606 void wxMacControl::SetValueAndRange( SInt32 value
, SInt32 minimum
, SInt32 maximum
)
608 ::SetControl32BitMinimum( m_controlRef
, minimum
);
609 ::SetControl32BitMaximum( m_controlRef
, maximum
);
610 ::SetControl32BitValue( m_controlRef
, value
);
613 OSStatus
wxMacControl::SetFocus( ControlFocusPart focusPart
)
615 return SetKeyboardFocus( GetControlOwner( m_controlRef
), m_controlRef
, focusPart
);
618 bool wxMacControl::HasFocus() const
621 GetKeyboardFocus( GetUserFocusWindow() , &control
);
622 return control
== m_controlRef
;
625 void wxMacControl::SetNeedsFocusRect( bool needs
)
627 m_needsFocusRect
= needs
;
630 bool wxMacControl::NeedsFocusRect() const
632 return m_needsFocusRect
;
635 void wxMacControl::VisibilityChanged(bool WXUNUSED(shown
))
639 void wxMacControl::SuperChangedPosition()
643 void wxMacControl::SetFont( const wxFont
& font
, const wxColour
& foreground
, long windowStyle
)
647 ControlFontStyleRec fontStyle
;
648 if ( font
.MacGetThemeFontID() != kThemeCurrentPortFont
)
650 switch ( font
.MacGetThemeFontID() )
652 case kThemeSmallSystemFont
:
653 fontStyle
.font
= kControlFontSmallSystemFont
;
656 case 109 : // mini font
660 case kThemeSystemFont
:
661 fontStyle
.font
= kControlFontBigSystemFont
;
665 fontStyle
.font
= kControlFontBigSystemFont
;
669 fontStyle
.flags
= kControlUseFontMask
;
673 fontStyle
.font
= font
.MacGetFontNum();
674 fontStyle
.style
= font
.MacGetFontStyle();
675 fontStyle
.size
= font
.MacGetFontSize();
676 fontStyle
.flags
= kControlUseFontMask
| kControlUseFaceMask
| kControlUseSizeMask
;
679 fontStyle
.just
= teJustLeft
;
680 fontStyle
.flags
|= kControlUseJustMask
;
681 if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_CENTER_HORIZONTAL
)
682 fontStyle
.just
= teJustCenter
;
683 else if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_RIGHT
)
684 fontStyle
.just
= teJustRight
;
687 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
688 // won't get grayed out by the system anymore
690 if ( foreground
!= *wxBLACK
)
692 foreground
.GetRGBColor( &fontStyle
.foreColor
);
693 fontStyle
.flags
|= kControlUseForeColorMask
;
696 ::SetControlFontStyle( m_controlRef
, &fontStyle
);
700 void wxMacControl::SetBackgroundColour( const wxColour
&WXUNUSED(col
) )
703 // setting up a color proc is not recommended anymore
706 void wxMacControl::SetRange( SInt32 minimum
, SInt32 maximum
)
708 ::SetControl32BitMinimum( m_controlRef
, minimum
);
709 ::SetControl32BitMaximum( m_controlRef
, maximum
);
712 short wxMacControl::HandleKey( SInt16 keyCode
, SInt16 charCode
, EventModifiers modifiers
)
715 return HandleControlKey( m_controlRef
, keyCode
, charCode
, modifiers
);
721 void wxMacControl::SetActionProc( ControlActionUPP actionProc
)
723 SetControlAction( m_controlRef
, actionProc
);
726 void wxMacControl::SetViewSize( SInt32 viewSize
)
728 SetControlViewSize(m_controlRef
, viewSize
);
731 SInt32
wxMacControl::GetViewSize() const
733 return GetControlViewSize( m_controlRef
);
736 bool wxMacControl::IsVisible() const
738 return IsControlVisible( m_controlRef
);
741 void wxMacControl::SetVisibility( bool visible
, bool redraw
)
743 SetControlVisibility( m_controlRef
, visible
, redraw
);
746 bool wxMacControl::IsEnabled() const
748 return IsControlEnabled( m_controlRef
);
751 bool wxMacControl::IsActive() const
753 return IsControlActive( m_controlRef
);
756 void wxMacControl::Enable( bool enable
)
759 EnableControl( m_controlRef
);
761 DisableControl( m_controlRef
);
764 void wxMacControl::SetDrawingEnabled( bool enable
)
766 HIViewSetDrawingEnabled( m_controlRef
, enable
);
769 bool wxMacControl::GetNeedsDisplay() const
771 return HIViewGetNeedsDisplay( m_controlRef
);
774 void wxMacControl::SetNeedsDisplay( RgnHandle where
)
779 HIViewSetNeedsDisplayInRegion( m_controlRef
, where
, true );
782 void wxMacControl::SetNeedsDisplay( Rect
* where
)
789 RgnHandle update
= NewRgn();
790 RectRgn( update
, where
);
791 HIViewSetNeedsDisplayInRegion( m_controlRef
, update
, true );
792 DisposeRgn( update
);
795 HIViewSetNeedsDisplay( m_controlRef
, true );
798 void wxMacControl::Convert( wxPoint
*pt
, wxMacControl
*from
, wxMacControl
*to
)
804 HIViewConvertPoint( &hiPoint
, from
->m_controlRef
, to
->m_controlRef
);
805 pt
->x
= (int)hiPoint
.x
;
806 pt
->y
= (int)hiPoint
.y
;
809 void wxMacControl::SetRect( Rect
*r
)
811 //A HIRect is actually a CGRect on OSX - which consists of two structures -
812 //CGPoint and CGSize, which have two floats each
813 HIRect hir
= { { r
->left
, r
->top
}, { r
->right
- r
->left
, r
->bottom
- r
->top
} };
814 HIViewSetFrame ( m_controlRef
, &hir
);
815 // eventuall we might have to do a SetVisibility( false , true );
816 // before and a SetVisibility( true , true ); after
819 void wxMacControl::GetRect( Rect
*r
)
821 GetControlBounds( m_controlRef
, r
);
824 void wxMacControl::GetRectInWindowCoords( Rect
*r
)
826 UMAGetControlBoundsInWindowCoords( m_controlRef
, r
);
829 void wxMacControl::GetBestRect( Rect
*r
)
831 short baselineoffset
;
833 GetBestControlRect( m_controlRef
, r
, &baselineoffset
);
836 void wxMacControl::SetLabel( const wxString
&title
)
838 wxFontEncoding encoding
;
841 encoding
= m_font
.GetEncoding();
843 encoding
= wxFont::GetDefaultEncoding();
845 SetControlTitleWithCFString( m_controlRef
, wxMacCFStringHolder( title
, encoding
) );
848 void wxMacControl::GetFeatures( UInt32
* features
)
850 GetControlFeatures( m_controlRef
, features
);
853 OSStatus
wxMacControl::GetRegion( ControlPartCode partCode
, RgnHandle region
)
855 OSStatus err
= GetControlRegion( m_controlRef
, partCode
, region
);
859 OSStatus
wxMacControl::SetZOrder( bool above
, wxMacControl
* other
)
861 return HIViewSetZOrder( m_controlRef
,above
? kHIViewZOrderAbove
: kHIViewZOrderBelow
,
862 (other
!= NULL
) ? other
->m_controlRef
: NULL
);
865 // SetNeedsDisplay would not invalidate the children
866 static void InvalidateControlAndChildren( HIViewRef control
)
868 HIViewSetNeedsDisplay( control
, true );
869 UInt16 childrenCount
= 0;
870 OSStatus err
= CountSubControls( control
, &childrenCount
);
871 if ( err
== errControlIsNotEmbedder
)
874 wxASSERT_MSG( err
== noErr
, wxT("Unexpected error when accessing subcontrols") );
876 for ( UInt16 i
= childrenCount
; i
>=1; --i
)
880 err
= GetIndexedSubControl( control
, i
, & child
);
881 if ( err
== errControlIsNotEmbedder
)
884 InvalidateControlAndChildren( child
);
888 void wxMacControl::InvalidateWithChildren()
890 InvalidateControlAndChildren( m_controlRef
);
893 void wxMacControl::ScrollRect( wxRect
*r
, int dx
, int dy
)
895 wxASSERT( r
!= NULL
);
897 HIRect scrollarea
= CGRectMake( r
->x
, r
->y
, r
->width
, r
->height
);
898 HIViewScrollRect ( m_controlRef
, &scrollarea
, dx
,dy
);
901 OSType wxMacCreator
= 'WXMC';
902 OSType wxMacControlProperty
= 'MCCT';
904 void wxMacControl::SetReferenceInNativeControl()
907 verify_noerr( SetControlProperty ( m_controlRef
,
908 wxMacCreator
,wxMacControlProperty
, sizeof(data
), &data
) );
911 wxMacControl
* wxMacControl::GetReferenceFromNativeControl(ControlRef control
)
913 wxMacControl
* ctl
= NULL
;
914 ByteCount actualSize
;
915 if ( GetControlProperty( control
,wxMacCreator
,wxMacControlProperty
, sizeof(ctl
) ,
916 &actualSize
, &ctl
) == noErr
)
923 // ============================================================================
924 // DataBrowser Wrapper
925 // ============================================================================
927 // basing on DataBrowserItemIDs
930 IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl
, wxMacControl
)
932 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
934 DataBrowserItemID itemID
,
935 DataBrowserItemNotification message
,
936 DataBrowserItemDataRef itemData
)
938 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
941 ctl
->ItemNotification(itemID
, message
, itemData
);
945 pascal OSStatus
wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
947 DataBrowserItemID itemID
,
948 DataBrowserPropertyID property
,
949 DataBrowserItemDataRef itemData
,
950 Boolean changeValue
)
952 OSStatus err
= errDataBrowserPropertyNotSupported
;
953 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
956 err
= ctl
->GetSetItemData(itemID
, property
, itemData
, changeValue
);
961 pascal Boolean
wxMacDataBrowserControl::DataBrowserCompareProc(
963 DataBrowserItemID itemOneID
,
964 DataBrowserItemID itemTwoID
,
965 DataBrowserPropertyID sortProperty
)
967 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
970 return ctl
->CompareItems(itemOneID
, itemTwoID
, sortProperty
);
975 DataBrowserItemDataUPP gDataBrowserItemDataUPP
= NULL
;
976 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP
= NULL
;
977 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP
= NULL
;
979 wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow
* peer
,
982 long WXUNUSED(style
))
983 : wxMacControl( peer
)
985 Rect bounds
= wxMacGetBoundsForControl( peer
, pos
, size
);
986 OSStatus err
= ::CreateDataBrowserControl(
987 MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),
988 &bounds
, kDataBrowserListView
, &m_controlRef
);
989 SetReferenceInNativeControl();
991 if ( gDataBrowserItemCompareUPP
== NULL
)
992 gDataBrowserItemCompareUPP
= NewDataBrowserItemCompareUPP(DataBrowserCompareProc
);
993 if ( gDataBrowserItemDataUPP
== NULL
)
994 gDataBrowserItemDataUPP
= NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc
);
995 if ( gDataBrowserItemNotificationUPP
== NULL
)
997 gDataBrowserItemNotificationUPP
=
998 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc
);
1001 DataBrowserCallbacks callbacks
;
1002 InitializeDataBrowserCallbacks( &callbacks
, kDataBrowserLatestCallbacks
);
1004 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserItemDataUPP
;
1005 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserItemCompareUPP
;
1006 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserItemNotificationUPP
;
1007 SetCallbacks( &callbacks
);
1011 OSStatus
wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container
,
1013 DataBrowserItemState state
,
1014 ItemCount
*numItems
) const
1016 return GetDataBrowserItemCount( m_controlRef
, container
, recurse
, state
, numItems
);
1019 OSStatus
wxMacDataBrowserControl::GetItems( DataBrowserItemID container
,
1021 DataBrowserItemState state
,
1024 return GetDataBrowserItems( m_controlRef
, container
, recurse
, state
, items
);
1027 OSStatus
wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options
)
1029 return SetDataBrowserSelectionFlags( m_controlRef
, options
);
1032 OSStatus
wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc
*columnDesc
,
1033 DataBrowserTableViewColumnIndex position
)
1035 return AddDataBrowserListViewColumn( m_controlRef
, columnDesc
, position
);
1038 OSStatus
wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position
, DataBrowserTableViewColumnID
* id
){
1039 return GetDataBrowserTableViewColumnProperty( m_controlRef
, position
, id
);
1042 OSStatus
wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position
)
1044 DataBrowserTableViewColumnID id
;
1045 GetColumnIDFromIndex( position
, &id
);
1046 return RemoveDataBrowserTableViewColumn( m_controlRef
, id
);
1049 OSStatus
wxMacDataBrowserControl::AutoSizeColumns()
1051 return AutoSizeDataBrowserListViewColumns(m_controlRef
);
1054 OSStatus
wxMacDataBrowserControl::SetHasScrollBars( bool horiz
, bool vert
)
1056 return SetDataBrowserHasScrollBars( m_controlRef
, horiz
, vert
);
1059 OSStatus
wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle
)
1061 return SetDataBrowserTableViewHiliteStyle( m_controlRef
, hiliteStyle
);
1064 OSStatus
wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height
)
1066 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1069 OSStatus
wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16
*height
)
1071 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1074 OSStatus
wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks
*callbacks
)
1076 return SetDataBrowserCallbacks( m_controlRef
, callbacks
);
1079 OSStatus
wxMacDataBrowserControl::UpdateItems(
1080 DataBrowserItemID container
,
1082 const DataBrowserItemID
*items
,
1083 DataBrowserPropertyID preSortProperty
,
1084 DataBrowserPropertyID propertyID
) const
1086 return UpdateDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
, propertyID
);
1089 bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item
) const
1091 return IsDataBrowserItemSelected( m_controlRef
, item
);
1094 OSStatus
wxMacDataBrowserControl::AddItems(
1095 DataBrowserItemID container
,
1097 const DataBrowserItemID
*items
,
1098 DataBrowserPropertyID preSortProperty
)
1100 return AddDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1103 OSStatus
wxMacDataBrowserControl::RemoveItems(
1104 DataBrowserItemID container
,
1106 const DataBrowserItemID
*items
,
1107 DataBrowserPropertyID preSortProperty
)
1109 return RemoveDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1112 OSStatus
wxMacDataBrowserControl::RevealItem(
1113 DataBrowserItemID item
,
1114 DataBrowserPropertyID propertyID
,
1115 DataBrowserRevealOptions options
) const
1117 return RevealDataBrowserItem( m_controlRef
, item
, propertyID
, options
);
1120 OSStatus
wxMacDataBrowserControl::SetSelectedItems(
1122 const DataBrowserItemID
*items
,
1123 DataBrowserSetOption operation
)
1125 return SetDataBrowserSelectedItems( m_controlRef
, numItems
, items
, operation
);
1128 OSStatus
wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID
*first
, DataBrowserItemID
*last
) const
1130 return GetDataBrowserSelectionAnchor( m_controlRef
, first
, last
);
1133 OSStatus
wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
1135 return GetDataBrowserTableViewItemID( m_controlRef
, row
, item
);
1138 OSStatus
wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
1140 return GetDataBrowserTableViewItemRow( m_controlRef
, item
, row
);
1143 OSStatus
wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height
)
1145 return SetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1148 OSStatus
wxMacDataBrowserControl::GetDefaultRowHeight( UInt16
* height
) const
1150 return GetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1153 OSStatus
wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item
, UInt16 height
)
1155 return SetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1158 OSStatus
wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item
, UInt16
*height
) const
1160 return GetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1163 OSStatus
wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column
, UInt16
*width
) const
1165 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1168 OSStatus
wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column
, UInt16 width
)
1170 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1173 OSStatus
wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16
*width
) const
1175 return GetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1178 OSStatus
wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width
)
1180 return SetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1183 OSStatus
wxMacDataBrowserControl::GetColumnCount(UInt32
* numColumns
) const
1185 return GetDataBrowserTableViewColumnCount( m_controlRef
, numColumns
);
1188 OSStatus
wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column
,
1189 DataBrowserTableViewColumnIndex
*position
) const
1191 return GetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1194 OSStatus
wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column
, DataBrowserTableViewColumnIndex position
)
1196 return SetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1199 OSStatus
wxMacDataBrowserControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
1201 return GetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1204 OSStatus
wxMacDataBrowserControl::SetScrollPosition( UInt32 top
, UInt32 left
)
1206 return SetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1209 OSStatus
wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID
*column
) const
1211 return GetDataBrowserSortProperty( m_controlRef
, column
);
1214 OSStatus
wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column
)
1216 return SetDataBrowserSortProperty( m_controlRef
, column
);
1219 OSStatus
wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder
*order
) const
1221 return GetDataBrowserSortOrder( m_controlRef
, order
);
1224 OSStatus
wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order
)
1226 return SetDataBrowserSortOrder( m_controlRef
, order
);
1229 OSStatus
wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property
,
1230 DataBrowserPropertyFlags
*flags
) const
1232 return GetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1235 OSStatus
wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property
,
1236 DataBrowserPropertyFlags flags
)
1238 return SetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1241 OSStatus
wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property
,
1242 DataBrowserListViewHeaderDesc
*desc
) const
1244 return GetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1247 OSStatus
wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property
,
1248 DataBrowserListViewHeaderDesc
*desc
)
1250 return SetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1253 OSStatus
wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property
,
1254 Boolean expandableRows
)
1256 return SetDataBrowserListViewDisclosureColumn( m_controlRef
, property
, expandableRows
);
1259 // ============================================================================
1260 // Higher-level Databrowser
1261 // ============================================================================
1263 // basing on data item objects
1266 wxMacDataItem::wxMacDataItem()
1271 m_colId
= kTextColumnId
; // for compat with existing wx*ListBox impls.
1274 wxMacDataItem::~wxMacDataItem()
1278 void wxMacDataItem::SetOrder( SInt32 order
)
1283 SInt32
wxMacDataItem::GetOrder() const
1288 void wxMacDataItem::SetData( void* data
)
1293 void* wxMacDataItem::GetData() const
1298 short wxMacDataItem::GetColumn()
1303 void wxMacDataItem::SetColumn( short col
)
1308 void wxMacDataItem::SetLabel( const wxString
& str
)
1311 m_cfLabel
.Assign( str
, wxLocale::GetSystemEncoding());
1314 const wxString
& wxMacDataItem::GetLabel() const
1319 bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1320 const wxMacDataItem
* rhs
,
1321 DataBrowserPropertyID sortProperty
) const
1323 const wxMacDataItem
* otherItem
= wx_const_cast(wxMacDataItem
*,rhs
);
1324 bool retval
= false;
1326 if ( sortProperty
== m_colId
){
1327 retval
= m_label
.CmpNoCase( otherItem
->m_label
) < 0;
1330 else if ( sortProperty
== kNumericOrderColumnId
)
1331 retval
= m_order
< otherItem
->m_order
;
1336 OSStatus
wxMacDataItem::GetSetData( wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1337 DataBrowserPropertyID property
,
1338 DataBrowserItemDataRef itemData
,
1341 OSStatus err
= errDataBrowserPropertyNotSupported
;
1344 if ( property
== m_colId
){
1345 err
= ::SetDataBrowserItemDataText( itemData
, m_cfLabel
);
1348 else if ( property
== kNumericOrderColumnId
){
1349 err
= ::SetDataBrowserItemDataValue( itemData
, m_order
);
1359 // no editable props here
1368 void wxMacDataItem::Notification(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1369 DataBrowserItemNotification
WXUNUSED(message
),
1370 DataBrowserItemDataRef
WXUNUSED(itemData
) ) const
1374 IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl
, wxMacDataBrowserControl
)
1376 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) :
1377 wxMacDataBrowserControl( peer
, pos
, size
, style
)
1379 m_suppressSelection
= false;
1380 m_sortOrder
= SortOrder_None
;
1381 m_clientDataItemsType
= wxClientData_None
;
1384 wxMacDataItem
* wxMacDataItemBrowserControl::CreateItem()
1386 return new wxMacDataItem();
1389 wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl
*browser
)
1391 m_former
= browser
->SuppressSelection(true);
1392 m_browser
= browser
;
1395 wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1397 m_browser
->SuppressSelection(m_former
);
1400 bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress
)
1402 bool former
= m_suppressSelection
;
1403 m_suppressSelection
= suppress
;
1408 Boolean
wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID
,
1409 DataBrowserItemID itemTwoID
,
1410 DataBrowserPropertyID sortProperty
)
1412 wxMacDataItem
* itemOne
= (wxMacDataItem
*) itemOneID
;
1413 wxMacDataItem
* itemTwo
= (wxMacDataItem
*) itemTwoID
;
1414 return CompareItems( itemOne
, itemTwo
, sortProperty
);
1417 Boolean
wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem
* itemOne
,
1418 const wxMacDataItem
* itemTwo
,
1419 DataBrowserPropertyID sortProperty
)
1421 Boolean retval
= false;
1422 if ( itemOne
!= NULL
)
1423 retval
= itemOne
->IsLessThan( this , itemTwo
, sortProperty
);
1427 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1428 DataBrowserItemID itemID
,
1429 DataBrowserPropertyID property
,
1430 DataBrowserItemDataRef itemData
,
1431 Boolean changeValue
)
1433 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1434 return GetSetItemData(item
, property
, itemData
, changeValue
);
1437 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1438 wxMacDataItem
* item
,
1439 DataBrowserPropertyID property
,
1440 DataBrowserItemDataRef itemData
,
1441 Boolean changeValue
)
1443 OSStatus err
= errDataBrowserPropertyNotSupported
;
1446 case kDataBrowserContainerIsClosableProperty
:
1447 case kDataBrowserContainerIsSortableProperty
:
1448 case kDataBrowserContainerIsOpenableProperty
:
1449 // right now default behaviour on these
1453 if ( item
!= NULL
){
1454 err
= item
->GetSetData( this, property
, itemData
, changeValue
);
1462 void wxMacDataItemBrowserControl::ItemNotification(
1463 DataBrowserItemID itemID
,
1464 DataBrowserItemNotification message
,
1465 DataBrowserItemDataRef itemData
)
1467 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1468 ItemNotification( item
, message
, itemData
);
1471 void wxMacDataItemBrowserControl::ItemNotification(
1472 const wxMacDataItem
* item
,
1473 DataBrowserItemNotification message
,
1474 DataBrowserItemDataRef itemData
)
1477 item
->Notification( this, message
, itemData
);
1480 unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem
* container
,
1481 bool recurse
, DataBrowserItemState state
) const
1483 ItemCount numItems
= 0;
1484 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID
)container
,
1485 recurse
, state
, &numItems
) );
1489 unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem
* container
,
1490 bool recurse
) const
1492 return GetItemCount( container
, recurse
, kDataBrowserItemIsSelected
);
1496 void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem
* container
,
1497 bool recurse
, DataBrowserItemState state
, wxArrayMacDataItemPtr
&items
) const
1499 Handle handle
= NewHandle(0);
1500 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID
)container
,
1501 recurse
, state
, handle
) );
1503 int itemCount
= GetHandleSize(handle
)/sizeof(DataBrowserItemID
);
1505 wxMacDataItemPtr
* itemsArray
= (wxMacDataItemPtr
*) *handle
;
1506 for ( int i
= 0; i
< itemCount
; ++i
)
1508 items
.Add(itemsArray
[i
]);
1511 DisposeHandle( handle
);
1514 unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem
* item
) const
1516 DataBrowserTableViewRowIndex row
;
1517 OSStatus err
= GetItemRow( (DataBrowserItemID
) item
, &row
);
1518 wxASSERT( err
== noErr
);
1522 wxMacDataItem
* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n
) const
1524 DataBrowserItemID id
;
1525 OSStatus err
= GetItemID( (DataBrowserTableViewRowIndex
) n
, &id
);
1526 wxASSERT( err
== noErr
);
1527 return (wxMacDataItem
*) id
;
1530 void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem
*container
,
1531 const wxMacDataItem
*item
, DataBrowserPropertyID property
) const
1533 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, 1,
1534 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1537 void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem
*container
,
1538 wxArrayMacDataItemPtr
&itemArray
, DataBrowserPropertyID property
) const
1540 unsigned int noItems
= itemArray
.GetCount();
1541 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1542 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1543 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1545 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, noItems
,
1546 items
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1550 void wxMacDataItemBrowserControl::InsertColumn(int colId
, DataBrowserPropertyType colType
,
1551 const wxString
& title
, SInt16 just
, int defaultWidth
)
1553 DataBrowserListViewColumnDesc columnDesc
;
1554 columnDesc
.headerBtnDesc
.titleOffset
= 0;
1555 columnDesc
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
1557 columnDesc
.headerBtnDesc
.btnFontStyle
.flags
=
1558 kControlUseFontMask
| kControlUseJustMask
;
1560 columnDesc
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentTextOnly
;
1561 columnDesc
.headerBtnDesc
.btnFontStyle
.just
= just
;
1562 columnDesc
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
1563 columnDesc
.headerBtnDesc
.btnFontStyle
.style
= normal
;
1565 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1566 // defined for other modes?
1569 enc
= m_font
.GetEncoding();
1571 enc
= wxLocale::GetSystemEncoding();
1572 wxMacCFStringHolder cfTitle
;
1573 cfTitle
.Assign( title
, enc
);
1574 columnDesc
.headerBtnDesc
.titleString
= cfTitle
;
1576 columnDesc
.headerBtnDesc
.minimumWidth
= 0;
1577 columnDesc
.headerBtnDesc
.maximumWidth
= 30000;
1579 columnDesc
.propertyDesc
.propertyID
= (kMinColumnId
+ colId
);
1580 columnDesc
.propertyDesc
.propertyType
= colType
;
1581 columnDesc
.propertyDesc
.propertyFlags
= kDataBrowserListViewSortableColumn
;
1582 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
;
1583 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
1585 verify_noerr( AddColumn( &columnDesc
, kDataBrowserListViewAppendColumn
) );
1587 if (defaultWidth
> 0){
1588 SetColumnWidth(colId
, defaultWidth
);
1593 void wxMacDataItemBrowserControl::SetColumnWidth(int colId
, int width
)
1595 DataBrowserPropertyID id
;
1596 GetColumnIDFromIndex(colId
, &id
);
1597 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id
, width
));
1600 int wxMacDataItemBrowserControl::GetColumnWidth(int colId
)
1602 DataBrowserPropertyID id
;
1603 GetColumnIDFromIndex(colId
, &id
);
1605 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id
, &result
));
1609 void wxMacDataItemBrowserControl::AddItem(wxMacDataItem
*container
, wxMacDataItem
*item
)
1611 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, 1,
1612 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
) );
1615 void wxMacDataItemBrowserControl::AddItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1617 unsigned int noItems
= itemArray
.GetCount();
1618 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1619 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1620 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1622 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, noItems
,
1623 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
) );
1627 void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem
*container
, wxMacDataItem
* item
)
1629 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 1,
1630 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
);
1631 verify_noerr( err
);
1634 void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1636 unsigned int noItems
= itemArray
.GetCount();
1637 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1638 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1639 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1641 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, noItems
,
1642 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
);
1643 verify_noerr( err
);
1647 void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem
*container
)
1649 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 0 , NULL
, kDataBrowserItemNoProperty
);
1650 verify_noerr( err
);
1653 void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem
* item
, DataBrowserSetOption option
)
1655 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID
*) &item
, option
));
1658 void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option
)
1660 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL
, option
));
1663 void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr
&itemArray
, DataBrowserSetOption option
)
1665 unsigned int noItems
= itemArray
.GetCount();
1666 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1667 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1668 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1670 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems
, (DataBrowserItemID
*) items
, option
));
1674 Boolean
wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem
* item
) const
1676 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID
) item
);
1679 void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem
* item
, DataBrowserRevealOptions options
)
1681 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID
) item
, kDataBrowserNoItem
, options
) );
1684 void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr
* first
, wxMacDataItemPtr
* last
) const
1686 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID
*) first
, (DataBrowserItemID
*) last
) );
1689 wxClientDataType
wxMacDataItemBrowserControl::GetClientDataType() const
1691 return m_clientDataItemsType
;
1693 void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType
)
1695 m_clientDataItemsType
= clientDataItemsType
;
1698 unsigned int wxMacDataItemBrowserControl::MacGetCount() const
1700 return GetItemCount(wxMacDataBrowserRootContainer
,false,kDataBrowserItemAnyState
);
1703 void wxMacDataItemBrowserControl::MacDelete( unsigned int n
)
1705 wxMacDataItem
* item
= (wxMacDataItem
*)GetItemFromLine( n
);
1706 RemoveItem( wxMacDataBrowserRootContainer
, item
);
1709 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
,
1710 const wxArrayStringsAdapter
& items
,
1713 size_t itemsCount
= items
.GetCount();
1714 if ( itemsCount
== 0 )
1717 SInt32 frontLineOrder
= 0;
1719 if ( m_sortOrder
== SortOrder_None
)
1721 // increase the order of the lines to be shifted
1722 unsigned int lines
= MacGetCount();
1723 for ( unsigned int i
= n
; i
< lines
; ++i
)
1725 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
1726 iter
->SetOrder( iter
->GetOrder() + itemsCount
);
1730 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
1731 frontLineOrder
= iter
->GetOrder();
1735 wxArrayMacDataItemPtr ids
;
1736 ids
.SetCount( itemsCount
);
1738 for ( unsigned int i
= 0; i
< itemsCount
; ++i
)
1740 wxMacDataItem
* item
= CreateItem();
1741 item
->SetLabel( items
[i
]);
1743 item
->SetColumn( kMinColumnId
+ column
);
1745 if ( m_sortOrder
== SortOrder_None
)
1746 item
->SetOrder( frontLineOrder
+ 1 + i
);
1751 AddItems( wxMacDataBrowserRootContainer
, ids
);
1754 int wxMacDataItemBrowserControl::MacAppend( const wxString
& text
)
1756 wxMacDataItem
* item
= CreateItem();
1757 item
->SetLabel( text
);
1758 if ( m_sortOrder
== SortOrder_None
)
1760 unsigned int lines
= MacGetCount();
1762 item
->SetOrder( 1 );
1765 wxMacDataItem
* frontItem
= (wxMacDataItem
*) GetItemFromLine(lines
-1);
1766 item
->SetOrder( frontItem
->GetOrder() + 1 );
1769 AddItem( wxMacDataBrowserRootContainer
, item
);
1771 return GetLineFromItem(item
);
1774 void wxMacDataItemBrowserControl::MacClear()
1776 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
1777 RemoveAllItems(wxMacDataBrowserRootContainer
);
1780 void wxMacDataItemBrowserControl::MacDeselectAll()
1782 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
1783 SetSelectedAllItems( kDataBrowserItemsRemove
);
1786 void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n
, bool select
, bool multi
)
1788 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
1789 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
1791 if ( IsItemSelected( item
) != select
)
1794 SetSelectedItem( item
, multi
? kDataBrowserItemsAdd
: kDataBrowserItemsAssign
);
1796 SetSelectedItem( item
, kDataBrowserItemsRemove
);
1802 bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n
) const
1804 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
1805 return IsItemSelected( item
);
1808 int wxMacDataItemBrowserControl::MacGetSelection() const
1810 wxMacDataItemPtr first
, last
;
1811 GetSelectionAnchor( &first
, &last
);
1813 if ( first
!= NULL
)
1815 return GetLineFromItem( first
);
1821 int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt
& aSelections
) const
1823 aSelections
.Empty();
1824 wxArrayMacDataItemPtr selectedItems
;
1825 GetItems( wxMacDataBrowserRootContainer
, false , kDataBrowserItemIsSelected
, selectedItems
);
1827 int count
= selectedItems
.GetCount();
1829 for ( int i
= 0; i
< count
; ++i
)
1831 aSelections
.Add(GetLineFromItem(selectedItems
[i
]));
1837 void wxMacDataItemBrowserControl::MacSetString( unsigned int n
, const wxString
& text
)
1839 // as we don't store the strings we only have to issue a redraw
1840 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1841 item
->SetLabel( text
);
1842 UpdateItem( wxMacDataBrowserRootContainer
, item
, kTextColumnId
);
1845 wxString
wxMacDataItemBrowserControl::MacGetString( unsigned int n
) const
1847 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1848 return item
->GetLabel();
1851 void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n
, void * data
)
1853 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1854 item
->SetData( data
);
1855 // not displayed, therefore no Update infos to DataBrowser
1858 void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n
) const
1860 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1861 return item
->GetData();
1864 void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n
)
1867 GetScrollPosition( &top
, &left
) ;
1868 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1871 GetRowHeight( (DataBrowserItemID
) item
, &height
) ;
1872 SetScrollPosition( n
* ((UInt32
)height
) , left
) ;
1874 RevealItem( item
, kDataBrowserRevealWithoutSelecting
);
1883 OSStatus
wxMacControl::SetTabEnabled( SInt16 tabNo
, bool enable
)
1885 return ::SetTabEnabled( m_controlRef
, tabNo
, enable
);
1895 Return the generic RGB color space. This is a 'get' function and the caller should
1896 not release the returned value unless the caller retains it first. Usually callers
1897 of this routine will immediately use the returned colorspace with CoreGraphics
1898 so they typically do not need to retain it themselves.
1900 This function creates the generic RGB color space once and hangs onto it so it can
1901 return it whenever this function is called.
1904 CGColorSpaceRef
wxMacGetGenericRGBColorSpace()
1906 static wxMacCFRefHolder
<CGColorSpaceRef
> genericRGBColorSpace
;
1908 if (genericRGBColorSpace
== NULL
)
1910 genericRGBColorSpace
.Set( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB
) );
1913 return genericRGBColorSpace
;
1916 CGColorRef
wxMacCreateCGColorFromHITheme( ThemeBrush brush
)
1919 HIThemeBrushCreateCGColor( brush
, &color
);
1925 wxMacPortSaver::wxMacPortSaver( GrafPtr port
)
1927 ::GetPort( &m_port
);
1931 wxMacPortSaver::~wxMacPortSaver()
1933 ::SetPort( m_port
);
1937 #if wxMAC_USE_QUICKDRAW
1939 void wxMacGlobalToLocal( WindowRef window
, Point
*pt
)
1941 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
1942 HIViewRef contentView
;
1943 // TODO check toolbar offset
1944 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
1945 HIPointConvert( &p
, kHICoordSpace72DPIGlobal
, NULL
, kHICoordSpaceView
, contentView
);
1950 void wxMacLocalToGlobal( WindowRef window
, Point
*pt
)
1952 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
1953 HIViewRef contentView
;
1954 // TODO check toolbar offset
1955 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
1956 HIPointConvert( &p
, kHICoordSpaceView
, contentView
, kHICoordSpace72DPIGlobal
, NULL
);