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
)
198 // Return true if we have a colour display
199 bool wxColourDisplay()
204 // Returns depth of screen
207 int theDepth
= (int) CGDisplayBitsPerPixel(CGMainDisplayID());
209 SetRect(&globRect
, -32760, -32760, 32760, 32760);
210 GDHandle theMaxDevice
;
212 theMaxDevice
= GetMaxDevice(&globRect
);
213 if (theMaxDevice
!= NULL
)
214 theDepth
= (**(**theMaxDevice
).gdPMap
).pixelSize
;
219 // Get size of display
220 void wxDisplaySize(int *width
, int *height
)
222 // TODO adapt for multi-displays
223 CGRect bounds
= CGDisplayBounds(CGMainDisplayID());
225 *width
= (int)bounds
.size
.width
;
227 *height
= (int)bounds
.size
.height
;
230 void wxDisplaySizeMM(int *width
, int *height
)
232 wxDisplaySize(width
, height
);
233 // on mac 72 is fixed (at least now;-)
234 float cvPt2Mm
= 25.4 / 72;
237 *width
= int( *width
* cvPt2Mm
);
240 *height
= int( *height
* cvPt2Mm
);
243 void wxClientDisplayRect(int *x
, int *y
, int *width
, int *height
)
245 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
247 HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay
,kHICoordSpace72DPIGlobal
,
250 *x
= bounds
.origin
.x
;
252 *y
= bounds
.origin
.y
;
254 *width
= bounds
.size
.width
;
256 *height
= bounds
.size
.height
;
259 GetAvailableWindowPositioningBounds( GetMainDevice() , &r
);
265 *width
= r
.right
- r
.left
;
267 *height
= r
.bottom
- r
.top
;
271 wxWindow
* wxFindWindowAtPoint(const wxPoint
& pt
)
273 return wxGenericFindWindowAtPoint(pt
);
280 wxString
wxGetOsDescription()
282 #ifdef WXWIN_OS_DESCRIPTION
283 // use configure generated description if available
284 return wxString(wxT("MacOS (")) + wxT(WXWIN_OS_DESCRIPTION
) + wxString(wxT(")"));
286 return wxT("MacOS"); //TODO:define further
291 wxString
wxGetUserHome (const wxString
& user
)
297 bool wxGetDiskSpace(const wxString
& path
, wxDiskspaceSize_t
*pTotal
, wxDiskspaceSize_t
*pFree
)
306 int pos
= p
.Find(':');
307 if ( pos
!= wxNOT_FOUND
)
315 err
= wxMacPathToFSRef( p
, &fsRef
);
318 FSVolumeRefNum vRefNum
;
319 err
= FSGetVRefNum( &fsRef
, &vRefNum
);
322 UInt64 freeBytes
, totalBytes
;
323 err
= FSGetVInfo( vRefNum
, NULL
, &freeBytes
, &totalBytes
);
327 *pTotal
= wxDiskspaceSize_t( totalBytes
);
329 *pFree
= wxDiskspaceSize_t( freeBytes
);
336 #endif // !__DARWIN__
338 //---------------------------------------------------------------------------
339 // wxMac Specific utility functions
340 //---------------------------------------------------------------------------
342 void wxMacStringToPascal( const wxString
&from
, StringPtr to
)
344 wxCharBuffer buf
= from
.mb_str( wxConvLocal
);
345 int len
= strlen(buf
);
350 memcpy( (char*) &to
[1] , buf
, len
);
353 wxString
wxMacMakeStringFromPascal( ConstStringPtr from
)
355 return wxString( (char*) &from
[1] , wxConvLocal
, from
[0] );
358 // ----------------------------------------------------------------------------
359 // Common Event Support
360 // ----------------------------------------------------------------------------
362 extern ProcessSerialNumber gAppProcess
;
366 ProcessSerialNumber psn
;
368 psn
.highLongOfPSN
= 0;
369 psn
.lowLongOfPSN
= kCurrentProcess
;
370 SameProcess( &gAppProcess
, &psn
, &isSame
);
373 OSStatus err
= noErr
;
376 // lead sometimes to race conditions, although all calls used should be thread safe ...
377 static wxMacCarbonEvent s_wakeupEvent
;
378 if ( !s_wakeupEvent
.IsValid() )
380 err
= s_wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
381 kEventAttributeNone
);
386 if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent
) )
388 s_wakeupEvent
.SetCurrentTime();
389 err
= PostEventToQueue(GetMainEventQueue(), s_wakeupEvent
,
390 kEventPriorityHigh
);
393 wxMacCarbonEvent wakeupEvent
;
394 wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
395 kEventAttributeNone
);
396 err
= PostEventToQueue(GetMainEventQueue(), wakeupEvent
,
397 kEventPriorityHigh
);
402 WakeUpProcess( &gAppProcess
);
410 // ----------------------------------------------------------------------------
411 // Native Struct Conversions
412 // ----------------------------------------------------------------------------
414 void wxMacRectToNative( const wxRect
*wx
, Rect
*n
)
418 n
->right
= wx
->x
+ wx
->width
;
419 n
->bottom
= wx
->y
+ wx
->height
;
422 void wxMacNativeToRect( const Rect
*n
, wxRect
* wx
)
426 wx
->width
= n
->right
- n
->left
;
427 wx
->height
= n
->bottom
- n
->top
;
430 void wxMacPointToNative( const wxPoint
* wx
, Point
*n
)
436 void wxMacNativeToPoint( const Point
*n
, wxPoint
* wx
)
442 // ----------------------------------------------------------------------------
443 // Carbon Event Support
444 // ----------------------------------------------------------------------------
446 OSStatus
wxMacCarbonEvent::GetParameter(EventParamName inName
, EventParamType inDesiredType
, UInt32 inBufferSize
, void * outData
)
448 return ::GetEventParameter( m_eventRef
, inName
, inDesiredType
, NULL
, inBufferSize
, NULL
, outData
);
451 OSStatus
wxMacCarbonEvent::SetParameter(EventParamName inName
, EventParamType inType
, UInt32 inBufferSize
, const void * inData
)
453 return ::SetEventParameter( m_eventRef
, inName
, inType
, inBufferSize
, inData
);
456 // ----------------------------------------------------------------------------
457 // Control Access Support
458 // ----------------------------------------------------------------------------
460 IMPLEMENT_DYNAMIC_CLASS( wxMacControl
, wxObject
)
462 wxMacControl::wxMacControl()
467 wxMacControl::wxMacControl(wxWindow
* peer
, bool isRootControl
)
471 m_isRootControl
= isRootControl
;
474 wxMacControl::wxMacControl( wxWindow
* peer
, ControlRef control
)
478 m_controlRef
= control
;
481 wxMacControl::wxMacControl( wxWindow
* peer
, WXWidget control
)
485 m_controlRef
= (ControlRef
) control
;
488 wxMacControl::~wxMacControl()
492 void wxMacControl::Init()
496 m_needsFocusRect
= false;
497 m_isRootControl
= false;
500 void wxMacControl::Dispose()
502 wxASSERT_MSG( m_controlRef
!= NULL
, wxT("Control Handle already NULL, Dispose called twice ?") );
503 wxASSERT_MSG( IsValidControlHandle(m_controlRef
) , wxT("Invalid Control Handle (maybe already released) in Dispose") );
505 // we cannot check the ref count here anymore, as autorelease objects might delete their refs later
506 // we can have situations when being embedded, where the control gets deleted behind our back, so only
507 // CFRelease if we are safe
508 if ( IsValidControlHandle(m_controlRef
) )
509 CFRelease(m_controlRef
);
513 void wxMacControl::SetReference( URefCon data
)
515 SetControlReference( m_controlRef
, data
);
518 OSStatus
wxMacControl::GetData(ControlPartCode inPartCode
, ResType inTag
, Size inBufferSize
, void * inOutBuffer
, Size
* outActualSize
) const
520 return ::GetControlData( m_controlRef
, inPartCode
, inTag
, inBufferSize
, inOutBuffer
, outActualSize
);
523 OSStatus
wxMacControl::GetDataSize(ControlPartCode inPartCode
, ResType inTag
, Size
* outActualSize
) const
525 return ::GetControlDataSize( m_controlRef
, inPartCode
, inTag
, outActualSize
);
528 OSStatus
wxMacControl::SetData(ControlPartCode inPartCode
, ResType inTag
, Size inSize
, const void * inData
)
530 return ::SetControlData( m_controlRef
, inPartCode
, inTag
, inSize
, inData
);
533 OSStatus
wxMacControl::SendEvent( EventRef event
, OptionBits inOptions
)
535 return SendEventToEventTargetWithOptions( event
,
536 HIObjectGetEventTarget( (HIObjectRef
) m_controlRef
), inOptions
);
539 OSStatus
wxMacControl::SendHICommand( HICommand
&command
, OptionBits inOptions
)
541 wxMacCarbonEvent
event( kEventClassCommand
, kEventCommandProcess
);
543 event
.SetParameter
<HICommand
>(kEventParamDirectObject
,command
);
545 return SendEvent( event
, inOptions
);
548 OSStatus
wxMacControl::SendHICommand( UInt32 commandID
, OptionBits inOptions
)
552 memset( &command
, 0 , sizeof(command
) );
553 command
.commandID
= commandID
;
554 return SendHICommand( command
, inOptions
);
557 void wxMacControl::Flash( ControlPartCode part
, UInt32 ticks
)
559 unsigned long finalTicks
;
561 HiliteControl( m_controlRef
, part
);
562 Delay( ticks
, &finalTicks
);
563 HiliteControl( m_controlRef
, kControlNoPart
);
566 SInt32
wxMacControl::GetValue() const
568 return ::GetControl32BitValue( m_controlRef
);
571 SInt32
wxMacControl::GetMaximum() const
573 return ::GetControl32BitMaximum( m_controlRef
);
576 SInt32
wxMacControl::GetMinimum() const
578 return ::GetControl32BitMinimum( m_controlRef
);
581 void wxMacControl::SetValue( SInt32 v
)
583 ::SetControl32BitValue( m_controlRef
, v
);
586 void wxMacControl::SetMinimum( SInt32 v
)
588 ::SetControl32BitMinimum( m_controlRef
, v
);
591 void wxMacControl::SetMaximum( SInt32 v
)
593 ::SetControl32BitMaximum( m_controlRef
, v
);
596 void wxMacControl::SetValueAndRange( SInt32 value
, SInt32 minimum
, SInt32 maximum
)
598 ::SetControl32BitMinimum( m_controlRef
, minimum
);
599 ::SetControl32BitMaximum( m_controlRef
, maximum
);
600 ::SetControl32BitValue( m_controlRef
, value
);
603 OSStatus
wxMacControl::SetFocus( ControlFocusPart focusPart
)
605 return SetKeyboardFocus( GetControlOwner( m_controlRef
), m_controlRef
, focusPart
);
608 bool wxMacControl::HasFocus() const
611 GetKeyboardFocus( GetUserFocusWindow() , &control
);
612 return control
== m_controlRef
;
615 void wxMacControl::SetNeedsFocusRect( bool needs
)
617 m_needsFocusRect
= needs
;
620 bool wxMacControl::NeedsFocusRect() const
622 return m_needsFocusRect
;
625 void wxMacControl::VisibilityChanged(bool WXUNUSED(shown
))
629 void wxMacControl::SuperChangedPosition()
633 void wxMacControl::SetFont( const wxFont
& font
, const wxColour
& foreground
, long windowStyle
)
637 ControlFontStyleRec fontStyle
;
638 if ( font
.MacGetThemeFontID() != kThemeCurrentPortFont
)
640 switch ( font
.MacGetThemeFontID() )
642 case kThemeSmallSystemFont
:
643 fontStyle
.font
= kControlFontSmallSystemFont
;
646 case 109 : // mini font
650 case kThemeSystemFont
:
651 fontStyle
.font
= kControlFontBigSystemFont
;
655 fontStyle
.font
= kControlFontBigSystemFont
;
659 fontStyle
.flags
= kControlUseFontMask
;
663 fontStyle
.font
= font
.MacGetFontNum();
664 fontStyle
.style
= font
.MacGetFontStyle();
665 fontStyle
.size
= font
.MacGetFontSize();
666 fontStyle
.flags
= kControlUseFontMask
| kControlUseFaceMask
| kControlUseSizeMask
;
669 fontStyle
.just
= teJustLeft
;
670 fontStyle
.flags
|= kControlUseJustMask
;
671 if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_CENTER_HORIZONTAL
)
672 fontStyle
.just
= teJustCenter
;
673 else if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_RIGHT
)
674 fontStyle
.just
= teJustRight
;
677 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
678 // won't get grayed out by the system anymore
680 if ( foreground
!= *wxBLACK
)
682 foreground
.GetRGBColor( &fontStyle
.foreColor
);
683 fontStyle
.flags
|= kControlUseForeColorMask
;
686 ::SetControlFontStyle( m_controlRef
, &fontStyle
);
690 void wxMacControl::SetBackgroundColour( const wxColour
&WXUNUSED(col
) )
693 // setting up a color proc is not recommended anymore
696 void wxMacControl::SetRange( SInt32 minimum
, SInt32 maximum
)
698 ::SetControl32BitMinimum( m_controlRef
, minimum
);
699 ::SetControl32BitMaximum( m_controlRef
, maximum
);
702 short wxMacControl::HandleKey( SInt16 keyCode
, SInt16 charCode
, EventModifiers modifiers
)
705 return HandleControlKey( m_controlRef
, keyCode
, charCode
, modifiers
);
711 void wxMacControl::SetActionProc( ControlActionUPP actionProc
)
713 SetControlAction( m_controlRef
, actionProc
);
716 void wxMacControl::SetViewSize( SInt32 viewSize
)
718 SetControlViewSize(m_controlRef
, viewSize
);
721 SInt32
wxMacControl::GetViewSize() const
723 return GetControlViewSize( m_controlRef
);
726 bool wxMacControl::IsVisible() const
728 return IsControlVisible( m_controlRef
);
731 void wxMacControl::SetVisibility( bool visible
, bool redraw
)
733 SetControlVisibility( m_controlRef
, visible
, redraw
);
736 bool wxMacControl::IsEnabled() const
738 return IsControlEnabled( m_controlRef
);
741 bool wxMacControl::IsActive() const
743 return IsControlActive( m_controlRef
);
746 void wxMacControl::Enable( bool enable
)
749 EnableControl( m_controlRef
);
751 DisableControl( m_controlRef
);
754 void wxMacControl::SetDrawingEnabled( bool enable
)
756 HIViewSetDrawingEnabled( m_controlRef
, enable
);
759 bool wxMacControl::GetNeedsDisplay() const
761 return HIViewGetNeedsDisplay( m_controlRef
);
764 void wxMacControl::SetNeedsDisplay( RgnHandle where
)
769 HIViewSetNeedsDisplayInRegion( m_controlRef
, where
, true );
772 void wxMacControl::SetNeedsDisplay( Rect
* where
)
779 RgnHandle update
= NewRgn();
780 RectRgn( update
, where
);
781 HIViewSetNeedsDisplayInRegion( m_controlRef
, update
, true );
782 DisposeRgn( update
);
785 HIViewSetNeedsDisplay( m_controlRef
, true );
788 void wxMacControl::Convert( wxPoint
*pt
, wxMacControl
*from
, wxMacControl
*to
)
794 HIViewConvertPoint( &hiPoint
, from
->m_controlRef
, to
->m_controlRef
);
795 pt
->x
= (int)hiPoint
.x
;
796 pt
->y
= (int)hiPoint
.y
;
799 void wxMacControl::SetRect( Rect
*r
)
801 //A HIRect is actually a CGRect on OSX - which consists of two structures -
802 //CGPoint and CGSize, which have two floats each
803 HIRect hir
= { { r
->left
, r
->top
}, { r
->right
- r
->left
, r
->bottom
- r
->top
} };
804 HIViewSetFrame ( m_controlRef
, &hir
);
805 // eventuall we might have to do a SetVisibility( false , true );
806 // before and a SetVisibility( true , true ); after
809 void wxMacControl::GetRect( Rect
*r
)
811 GetControlBounds( m_controlRef
, r
);
814 void wxMacControl::GetRectInWindowCoords( Rect
*r
)
816 UMAGetControlBoundsInWindowCoords( m_controlRef
, r
);
819 void wxMacControl::GetBestRect( Rect
*r
)
821 short baselineoffset
;
823 GetBestControlRect( m_controlRef
, r
, &baselineoffset
);
826 void wxMacControl::SetLabel( const wxString
&title
)
828 wxFontEncoding encoding
;
831 encoding
= m_font
.GetEncoding();
833 encoding
= wxFont::GetDefaultEncoding();
835 UMASetControlTitle( m_controlRef
, title
, encoding
);
838 void wxMacControl::GetFeatures( UInt32
* features
)
840 GetControlFeatures( m_controlRef
, features
);
843 OSStatus
wxMacControl::GetRegion( ControlPartCode partCode
, RgnHandle region
)
845 OSStatus err
= GetControlRegion( m_controlRef
, partCode
, region
);
849 OSStatus
wxMacControl::SetZOrder( bool above
, wxMacControl
* other
)
851 return HIViewSetZOrder( m_controlRef
,above
? kHIViewZOrderAbove
: kHIViewZOrderBelow
,
852 (other
!= NULL
) ? other
->m_controlRef
: NULL
);
855 // SetNeedsDisplay would not invalidate the children
856 static void InvalidateControlAndChildren( HIViewRef control
)
858 HIViewSetNeedsDisplay( control
, true );
859 UInt16 childrenCount
= 0;
860 OSStatus err
= CountSubControls( control
, &childrenCount
);
861 if ( err
== errControlIsNotEmbedder
)
864 wxASSERT_MSG( err
== noErr
, wxT("Unexpected error when accessing subcontrols") );
866 for ( UInt16 i
= childrenCount
; i
>=1; --i
)
870 err
= GetIndexedSubControl( control
, i
, & child
);
871 if ( err
== errControlIsNotEmbedder
)
874 InvalidateControlAndChildren( child
);
878 void wxMacControl::InvalidateWithChildren()
880 InvalidateControlAndChildren( m_controlRef
);
883 void wxMacControl::ScrollRect( wxRect
*r
, int dx
, int dy
)
885 wxASSERT( r
!= NULL
);
887 HIRect scrollarea
= CGRectMake( r
->x
, r
->y
, r
->width
, r
->height
);
888 HIViewScrollRect ( m_controlRef
, &scrollarea
, dx
,dy
);
891 OSType wxMacCreator
= 'WXMC';
892 OSType wxMacControlProperty
= 'MCCT';
894 void wxMacControl::SetReferenceInNativeControl()
897 verify_noerr( SetControlProperty ( m_controlRef
,
898 wxMacCreator
,wxMacControlProperty
, sizeof(data
), &data
) );
901 wxMacControl
* wxMacControl::GetReferenceFromNativeControl(ControlRef control
)
903 wxMacControl
* ctl
= NULL
;
904 ByteCount actualSize
;
905 if ( GetControlProperty( control
,wxMacCreator
,wxMacControlProperty
, sizeof(ctl
) ,
906 &actualSize
, &ctl
) == noErr
)
913 // ============================================================================
914 // DataBrowser Wrapper
915 // ============================================================================
917 // basing on DataBrowserItemIDs
920 IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl
, wxMacControl
)
922 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
924 DataBrowserItemID itemID
,
925 DataBrowserItemNotification message
,
926 DataBrowserItemDataRef itemData
)
928 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
931 ctl
->ItemNotification(itemID
, message
, itemData
);
935 pascal OSStatus
wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
937 DataBrowserItemID itemID
,
938 DataBrowserPropertyID property
,
939 DataBrowserItemDataRef itemData
,
940 Boolean changeValue
)
942 OSStatus err
= errDataBrowserPropertyNotSupported
;
943 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
946 err
= ctl
->GetSetItemData(itemID
, property
, itemData
, changeValue
);
951 pascal Boolean
wxMacDataBrowserControl::DataBrowserCompareProc(
953 DataBrowserItemID itemOneID
,
954 DataBrowserItemID itemTwoID
,
955 DataBrowserPropertyID sortProperty
)
957 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
960 return ctl
->CompareItems(itemOneID
, itemTwoID
, sortProperty
);
965 DataBrowserItemDataUPP gDataBrowserItemDataUPP
= NULL
;
966 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP
= NULL
;
967 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP
= NULL
;
969 wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow
* peer
,
972 long WXUNUSED(style
))
973 : wxMacControl( peer
)
975 Rect bounds
= wxMacGetBoundsForControl( peer
, pos
, size
);
976 OSStatus err
= ::CreateDataBrowserControl(
977 MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),
978 &bounds
, kDataBrowserListView
, &m_controlRef
);
979 SetReferenceInNativeControl();
981 if ( gDataBrowserItemCompareUPP
== NULL
)
982 gDataBrowserItemCompareUPP
= NewDataBrowserItemCompareUPP(DataBrowserCompareProc
);
983 if ( gDataBrowserItemDataUPP
== NULL
)
984 gDataBrowserItemDataUPP
= NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc
);
985 if ( gDataBrowserItemNotificationUPP
== NULL
)
987 gDataBrowserItemNotificationUPP
=
988 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc
);
991 DataBrowserCallbacks callbacks
;
992 InitializeDataBrowserCallbacks( &callbacks
, kDataBrowserLatestCallbacks
);
994 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserItemDataUPP
;
995 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserItemCompareUPP
;
996 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserItemNotificationUPP
;
997 SetCallbacks( &callbacks
);
1001 OSStatus
wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container
,
1003 DataBrowserItemState state
,
1004 ItemCount
*numItems
) const
1006 return GetDataBrowserItemCount( m_controlRef
, container
, recurse
, state
, numItems
);
1009 OSStatus
wxMacDataBrowserControl::GetItems( DataBrowserItemID container
,
1011 DataBrowserItemState state
,
1014 return GetDataBrowserItems( m_controlRef
, container
, recurse
, state
, items
);
1017 OSStatus
wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options
)
1019 return SetDataBrowserSelectionFlags( m_controlRef
, options
);
1022 OSStatus
wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc
*columnDesc
,
1023 DataBrowserTableViewColumnIndex position
)
1025 return AddDataBrowserListViewColumn( m_controlRef
, columnDesc
, position
);
1028 OSStatus
wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position
, DataBrowserTableViewColumnID
* id
){
1029 return GetDataBrowserTableViewColumnProperty( m_controlRef
, position
, id
);
1032 OSStatus
wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position
)
1034 DataBrowserTableViewColumnID id
;
1035 GetColumnIDFromIndex( position
, &id
);
1036 return RemoveDataBrowserTableViewColumn( m_controlRef
, id
);
1039 OSStatus
wxMacDataBrowserControl::AutoSizeColumns()
1041 return AutoSizeDataBrowserListViewColumns(m_controlRef
);
1044 OSStatus
wxMacDataBrowserControl::SetHasScrollBars( bool horiz
, bool vert
)
1046 return SetDataBrowserHasScrollBars( m_controlRef
, horiz
, vert
);
1049 OSStatus
wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle
)
1051 return SetDataBrowserTableViewHiliteStyle( m_controlRef
, hiliteStyle
);
1054 OSStatus
wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height
)
1056 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1059 OSStatus
wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16
*height
)
1061 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1064 OSStatus
wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks
*callbacks
)
1066 return SetDataBrowserCallbacks( m_controlRef
, callbacks
);
1069 OSStatus
wxMacDataBrowserControl::UpdateItems(
1070 DataBrowserItemID container
,
1072 const DataBrowserItemID
*items
,
1073 DataBrowserPropertyID preSortProperty
,
1074 DataBrowserPropertyID propertyID
) const
1076 return UpdateDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
, propertyID
);
1079 bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item
) const
1081 return IsDataBrowserItemSelected( m_controlRef
, item
);
1084 OSStatus
wxMacDataBrowserControl::AddItems(
1085 DataBrowserItemID container
,
1087 const DataBrowserItemID
*items
,
1088 DataBrowserPropertyID preSortProperty
)
1090 return AddDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1093 OSStatus
wxMacDataBrowserControl::RemoveItems(
1094 DataBrowserItemID container
,
1096 const DataBrowserItemID
*items
,
1097 DataBrowserPropertyID preSortProperty
)
1099 return RemoveDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1102 OSStatus
wxMacDataBrowserControl::RevealItem(
1103 DataBrowserItemID item
,
1104 DataBrowserPropertyID propertyID
,
1105 DataBrowserRevealOptions options
) const
1107 return RevealDataBrowserItem( m_controlRef
, item
, propertyID
, options
);
1110 OSStatus
wxMacDataBrowserControl::SetSelectedItems(
1112 const DataBrowserItemID
*items
,
1113 DataBrowserSetOption operation
)
1115 return SetDataBrowserSelectedItems( m_controlRef
, numItems
, items
, operation
);
1118 OSStatus
wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID
*first
, DataBrowserItemID
*last
) const
1120 return GetDataBrowserSelectionAnchor( m_controlRef
, first
, last
);
1123 OSStatus
wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
1125 return GetDataBrowserTableViewItemID( m_controlRef
, row
, item
);
1128 OSStatus
wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
1130 return GetDataBrowserTableViewItemRow( m_controlRef
, item
, row
);
1133 OSStatus
wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height
)
1135 return SetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1138 OSStatus
wxMacDataBrowserControl::GetDefaultRowHeight( UInt16
* height
) const
1140 return GetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1143 OSStatus
wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item
, UInt16 height
)
1145 return SetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1148 OSStatus
wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item
, UInt16
*height
) const
1150 return GetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1153 OSStatus
wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column
, UInt16
*width
) const
1155 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1158 OSStatus
wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column
, UInt16 width
)
1160 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1163 OSStatus
wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16
*width
) const
1165 return GetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1168 OSStatus
wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width
)
1170 return SetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1173 OSStatus
wxMacDataBrowserControl::GetColumnCount(UInt32
* numColumns
) const
1175 return GetDataBrowserTableViewColumnCount( m_controlRef
, numColumns
);
1178 OSStatus
wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column
,
1179 DataBrowserTableViewColumnIndex
*position
) const
1181 return GetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1184 OSStatus
wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column
, DataBrowserTableViewColumnIndex position
)
1186 return SetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1189 OSStatus
wxMacDataBrowserControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
1191 return GetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1194 OSStatus
wxMacDataBrowserControl::SetScrollPosition( UInt32 top
, UInt32 left
)
1196 return SetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1199 OSStatus
wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID
*column
) const
1201 return GetDataBrowserSortProperty( m_controlRef
, column
);
1204 OSStatus
wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column
)
1206 return SetDataBrowserSortProperty( m_controlRef
, column
);
1209 OSStatus
wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder
*order
) const
1211 return GetDataBrowserSortOrder( m_controlRef
, order
);
1214 OSStatus
wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order
)
1216 return SetDataBrowserSortOrder( m_controlRef
, order
);
1219 OSStatus
wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property
,
1220 DataBrowserPropertyFlags
*flags
) const
1222 return GetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1225 OSStatus
wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property
,
1226 DataBrowserPropertyFlags flags
)
1228 return SetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1231 OSStatus
wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property
,
1232 DataBrowserListViewHeaderDesc
*desc
) const
1234 return GetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1237 OSStatus
wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property
,
1238 DataBrowserListViewHeaderDesc
*desc
)
1240 return SetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1243 OSStatus
wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property
,
1244 Boolean expandableRows
)
1246 return SetDataBrowserListViewDisclosureColumn( m_controlRef
, property
, expandableRows
);
1249 // ============================================================================
1250 // Higher-level Databrowser
1251 // ============================================================================
1253 // basing on data item objects
1256 wxMacDataItem::wxMacDataItem()
1261 m_colId
= kTextColumnId
; // for compat with existing wx*ListBox impls.
1264 wxMacDataItem::~wxMacDataItem()
1268 void wxMacDataItem::SetOrder( SInt32 order
)
1273 SInt32
wxMacDataItem::GetOrder() const
1278 void wxMacDataItem::SetData( void* data
)
1283 void* wxMacDataItem::GetData() const
1288 short wxMacDataItem::GetColumn()
1293 void wxMacDataItem::SetColumn( short col
)
1298 void wxMacDataItem::SetLabel( const wxString
& str
)
1301 m_cfLabel
.Assign( str
, wxLocale::GetSystemEncoding());
1304 const wxString
& wxMacDataItem::GetLabel() const
1309 bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1310 const wxMacDataItem
* rhs
,
1311 DataBrowserPropertyID sortProperty
) const
1313 const wxMacDataItem
* otherItem
= wx_const_cast(wxMacDataItem
*,rhs
);
1314 bool retval
= false;
1316 if ( sortProperty
== m_colId
){
1317 retval
= m_label
.CmpNoCase( otherItem
->m_label
) < 0;
1320 else if ( sortProperty
== kNumericOrderColumnId
)
1321 retval
= m_order
< otherItem
->m_order
;
1326 OSStatus
wxMacDataItem::GetSetData( wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1327 DataBrowserPropertyID property
,
1328 DataBrowserItemDataRef itemData
,
1331 OSStatus err
= errDataBrowserPropertyNotSupported
;
1334 if ( property
== m_colId
){
1335 err
= ::SetDataBrowserItemDataText( itemData
, m_cfLabel
);
1338 else if ( property
== kNumericOrderColumnId
){
1339 err
= ::SetDataBrowserItemDataValue( itemData
, m_order
);
1349 // no editable props here
1358 void wxMacDataItem::Notification(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1359 DataBrowserItemNotification
WXUNUSED(message
),
1360 DataBrowserItemDataRef
WXUNUSED(itemData
) ) const
1364 IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl
, wxMacDataBrowserControl
)
1366 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) :
1367 wxMacDataBrowserControl( peer
, pos
, size
, style
)
1369 m_suppressSelection
= false;
1370 m_sortOrder
= SortOrder_None
;
1371 m_clientDataItemsType
= wxClientData_None
;
1374 wxMacDataItem
* wxMacDataItemBrowserControl::CreateItem()
1376 return new wxMacDataItem();
1379 wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl
*browser
)
1381 m_former
= browser
->SuppressSelection(true);
1382 m_browser
= browser
;
1385 wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1387 m_browser
->SuppressSelection(m_former
);
1390 bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress
)
1392 bool former
= m_suppressSelection
;
1393 m_suppressSelection
= suppress
;
1398 Boolean
wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID
,
1399 DataBrowserItemID itemTwoID
,
1400 DataBrowserPropertyID sortProperty
)
1402 wxMacDataItem
* itemOne
= (wxMacDataItem
*) itemOneID
;
1403 wxMacDataItem
* itemTwo
= (wxMacDataItem
*) itemTwoID
;
1404 return CompareItems( itemOne
, itemTwo
, sortProperty
);
1407 Boolean
wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem
* itemOne
,
1408 const wxMacDataItem
* itemTwo
,
1409 DataBrowserPropertyID sortProperty
)
1411 Boolean retval
= false;
1412 if ( itemOne
!= NULL
)
1413 retval
= itemOne
->IsLessThan( this , itemTwo
, sortProperty
);
1417 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1418 DataBrowserItemID itemID
,
1419 DataBrowserPropertyID property
,
1420 DataBrowserItemDataRef itemData
,
1421 Boolean changeValue
)
1423 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1424 return GetSetItemData(item
, property
, itemData
, changeValue
);
1427 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1428 wxMacDataItem
* item
,
1429 DataBrowserPropertyID property
,
1430 DataBrowserItemDataRef itemData
,
1431 Boolean changeValue
)
1433 OSStatus err
= errDataBrowserPropertyNotSupported
;
1436 case kDataBrowserContainerIsClosableProperty
:
1437 case kDataBrowserContainerIsSortableProperty
:
1438 case kDataBrowserContainerIsOpenableProperty
:
1439 // right now default behaviour on these
1443 if ( item
!= NULL
){
1444 err
= item
->GetSetData( this, property
, itemData
, changeValue
);
1452 void wxMacDataItemBrowserControl::ItemNotification(
1453 DataBrowserItemID itemID
,
1454 DataBrowserItemNotification message
,
1455 DataBrowserItemDataRef itemData
)
1457 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1458 ItemNotification( item
, message
, itemData
);
1461 void wxMacDataItemBrowserControl::ItemNotification(
1462 const wxMacDataItem
* item
,
1463 DataBrowserItemNotification message
,
1464 DataBrowserItemDataRef itemData
)
1467 item
->Notification( this, message
, itemData
);
1470 unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem
* container
,
1471 bool recurse
, DataBrowserItemState state
) const
1473 ItemCount numItems
= 0;
1474 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID
)container
,
1475 recurse
, state
, &numItems
) );
1479 unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem
* container
,
1480 bool recurse
) const
1482 return GetItemCount( container
, recurse
, kDataBrowserItemIsSelected
);
1486 void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem
* container
,
1487 bool recurse
, DataBrowserItemState state
, wxArrayMacDataItemPtr
&items
) const
1489 Handle handle
= NewHandle(0);
1490 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID
)container
,
1491 recurse
, state
, handle
) );
1493 int itemCount
= GetHandleSize(handle
)/sizeof(DataBrowserItemID
);
1495 wxMacDataItemPtr
* itemsArray
= (wxMacDataItemPtr
*) *handle
;
1496 for ( int i
= 0; i
< itemCount
; ++i
)
1498 items
.Add(itemsArray
[i
]);
1501 DisposeHandle( handle
);
1504 unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem
* item
) const
1506 DataBrowserTableViewRowIndex row
;
1507 OSStatus err
= GetItemRow( (DataBrowserItemID
) item
, &row
);
1508 wxASSERT( err
== noErr
);
1512 wxMacDataItem
* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n
) const
1514 DataBrowserItemID id
;
1515 OSStatus err
= GetItemID( (DataBrowserTableViewRowIndex
) n
, &id
);
1516 wxASSERT( err
== noErr
);
1517 return (wxMacDataItem
*) id
;
1520 void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem
*container
,
1521 const wxMacDataItem
*item
, DataBrowserPropertyID property
) const
1523 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, 1,
1524 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1527 void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem
*container
,
1528 wxArrayMacDataItemPtr
&itemArray
, DataBrowserPropertyID property
) const
1530 unsigned int noItems
= itemArray
.GetCount();
1531 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1532 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1533 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1535 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, noItems
,
1536 items
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1540 void wxMacDataItemBrowserControl::InsertColumn(int colId
, DataBrowserPropertyType colType
,
1541 const wxString
& title
, SInt16 just
, int defaultWidth
)
1543 DataBrowserListViewColumnDesc columnDesc
;
1544 columnDesc
.headerBtnDesc
.titleOffset
= 0;
1545 columnDesc
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
1547 columnDesc
.headerBtnDesc
.btnFontStyle
.flags
=
1548 kControlUseFontMask
| kControlUseJustMask
;
1550 columnDesc
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentTextOnly
;
1551 columnDesc
.headerBtnDesc
.btnFontStyle
.just
= just
;
1552 columnDesc
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
1553 columnDesc
.headerBtnDesc
.btnFontStyle
.style
= normal
;
1555 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1556 // defined for other modes?
1559 enc
= m_font
.GetEncoding();
1561 enc
= wxLocale::GetSystemEncoding();
1562 wxMacCFStringHolder cfTitle
;
1563 cfTitle
.Assign( title
, enc
);
1564 columnDesc
.headerBtnDesc
.titleString
= cfTitle
;
1566 columnDesc
.headerBtnDesc
.minimumWidth
= 0;
1567 columnDesc
.headerBtnDesc
.maximumWidth
= 30000;
1569 columnDesc
.propertyDesc
.propertyID
= (kMinColumnId
+ colId
);
1570 columnDesc
.propertyDesc
.propertyType
= colType
;
1571 columnDesc
.propertyDesc
.propertyFlags
= kDataBrowserListViewSortableColumn
;
1572 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
;
1573 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
1575 verify_noerr( AddColumn( &columnDesc
, kDataBrowserListViewAppendColumn
) );
1577 if (defaultWidth
> 0){
1578 SetColumnWidth(colId
, defaultWidth
);
1583 void wxMacDataItemBrowserControl::SetColumnWidth(int colId
, int width
)
1585 DataBrowserPropertyID id
;
1586 GetColumnIDFromIndex(colId
, &id
);
1587 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id
, width
));
1590 int wxMacDataItemBrowserControl::GetColumnWidth(int colId
)
1592 DataBrowserPropertyID id
;
1593 GetColumnIDFromIndex(colId
, &id
);
1595 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id
, &result
));
1599 void wxMacDataItemBrowserControl::AddItem(wxMacDataItem
*container
, wxMacDataItem
*item
)
1601 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, 1,
1602 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
) );
1605 void wxMacDataItemBrowserControl::AddItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1607 unsigned int noItems
= itemArray
.GetCount();
1608 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1609 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1610 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1612 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, noItems
,
1613 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
) );
1617 void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem
*container
, wxMacDataItem
* item
)
1619 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 1,
1620 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
);
1621 verify_noerr( err
);
1624 void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1626 unsigned int noItems
= itemArray
.GetCount();
1627 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1628 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1629 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1631 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, noItems
,
1632 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
);
1633 verify_noerr( err
);
1637 void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem
*container
)
1639 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 0 , NULL
, kDataBrowserItemNoProperty
);
1640 verify_noerr( err
);
1643 void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem
* item
, DataBrowserSetOption option
)
1645 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID
*) &item
, option
));
1648 void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option
)
1650 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL
, option
));
1653 void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr
&itemArray
, DataBrowserSetOption option
)
1655 unsigned int noItems
= itemArray
.GetCount();
1656 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1657 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1658 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1660 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems
, (DataBrowserItemID
*) items
, option
));
1664 Boolean
wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem
* item
) const
1666 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID
) item
);
1669 void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem
* item
, DataBrowserRevealOptions options
)
1671 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID
) item
, kDataBrowserNoItem
, options
) );
1674 void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr
* first
, wxMacDataItemPtr
* last
) const
1676 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID
*) first
, (DataBrowserItemID
*) last
) );
1679 wxClientDataType
wxMacDataItemBrowserControl::GetClientDataType() const
1681 return m_clientDataItemsType
;
1683 void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType
)
1685 m_clientDataItemsType
= clientDataItemsType
;
1688 unsigned int wxMacDataItemBrowserControl::MacGetCount() const
1690 return GetItemCount(wxMacDataBrowserRootContainer
,false,kDataBrowserItemAnyState
);
1693 void wxMacDataItemBrowserControl::MacDelete( unsigned int n
)
1695 wxMacDataItem
* item
= (wxMacDataItem
*)GetItemFromLine( n
);
1696 RemoveItem( wxMacDataBrowserRootContainer
, item
);
1699 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
,
1700 const wxArrayStringsAdapter
& items
,
1703 size_t itemsCount
= items
.GetCount();
1704 if ( itemsCount
== 0 )
1707 SInt32 frontLineOrder
= 0;
1709 if ( m_sortOrder
== SortOrder_None
)
1711 // increase the order of the lines to be shifted
1712 unsigned int lines
= MacGetCount();
1713 for ( unsigned int i
= n
; i
< lines
; ++i
)
1715 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
1716 iter
->SetOrder( iter
->GetOrder() + itemsCount
);
1720 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
1721 frontLineOrder
= iter
->GetOrder();
1725 wxArrayMacDataItemPtr ids
;
1726 ids
.SetCount( itemsCount
);
1728 for ( unsigned int i
= 0; i
< itemsCount
; ++i
)
1730 wxMacDataItem
* item
= CreateItem();
1731 item
->SetLabel( items
[i
]);
1733 item
->SetColumn( kMinColumnId
+ column
);
1735 if ( m_sortOrder
== SortOrder_None
)
1736 item
->SetOrder( frontLineOrder
+ 1 + i
);
1741 AddItems( wxMacDataBrowserRootContainer
, ids
);
1744 int wxMacDataItemBrowserControl::MacAppend( const wxString
& text
)
1746 wxMacDataItem
* item
= CreateItem();
1747 item
->SetLabel( text
);
1748 if ( m_sortOrder
== SortOrder_None
)
1750 unsigned int lines
= MacGetCount();
1752 item
->SetOrder( 1 );
1755 wxMacDataItem
* frontItem
= (wxMacDataItem
*) GetItemFromLine(lines
-1);
1756 item
->SetOrder( frontItem
->GetOrder() + 1 );
1759 AddItem( wxMacDataBrowserRootContainer
, item
);
1761 return GetLineFromItem(item
);
1764 void wxMacDataItemBrowserControl::MacClear()
1766 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
1767 RemoveAllItems(wxMacDataBrowserRootContainer
);
1770 void wxMacDataItemBrowserControl::MacDeselectAll()
1772 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
1773 SetSelectedAllItems( kDataBrowserItemsRemove
);
1776 void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n
, bool select
, bool multi
)
1778 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
1779 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
1781 if ( IsItemSelected( item
) != select
)
1784 SetSelectedItem( item
, multi
? kDataBrowserItemsAdd
: kDataBrowserItemsAssign
);
1786 SetSelectedItem( item
, kDataBrowserItemsRemove
);
1792 bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n
) const
1794 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
1795 return IsItemSelected( item
);
1798 int wxMacDataItemBrowserControl::MacGetSelection() const
1800 wxMacDataItemPtr first
, last
;
1801 GetSelectionAnchor( &first
, &last
);
1803 if ( first
!= NULL
)
1805 return GetLineFromItem( first
);
1811 int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt
& aSelections
) const
1813 aSelections
.Empty();
1814 wxArrayMacDataItemPtr selectedItems
;
1815 GetItems( wxMacDataBrowserRootContainer
, false , kDataBrowserItemIsSelected
, selectedItems
);
1817 int count
= selectedItems
.GetCount();
1819 for ( int i
= 0; i
< count
; ++i
)
1821 aSelections
.Add(GetLineFromItem(selectedItems
[i
]));
1827 void wxMacDataItemBrowserControl::MacSetString( unsigned int n
, const wxString
& text
)
1829 // as we don't store the strings we only have to issue a redraw
1830 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1831 item
->SetLabel( text
);
1832 UpdateItem( wxMacDataBrowserRootContainer
, item
, kTextColumnId
);
1835 wxString
wxMacDataItemBrowserControl::MacGetString( unsigned int n
) const
1837 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1838 return item
->GetLabel();
1841 void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n
, void * data
)
1843 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1844 item
->SetData( data
);
1845 // not displayed, therefore no Update infos to DataBrowser
1848 void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n
) const
1850 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1851 return item
->GetData();
1854 void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n
)
1857 GetScrollPosition( &top
, &left
) ;
1858 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1861 GetRowHeight( (DataBrowserItemID
) item
, &height
) ;
1862 SetScrollPosition( n
* ((UInt32
)height
) , left
) ;
1864 RevealItem( item
, kDataBrowserRevealWithoutSelecting
);
1873 OSStatus
wxMacControl::SetTabEnabled( SInt16 tabNo
, bool enable
)
1875 return ::SetTabEnabled( m_controlRef
, tabNo
, enable
);
1883 Return the generic RGB color space. This is a 'get' function and the caller should
1884 not release the returned value unless the caller retains it first. Usually callers
1885 of this routine will immediately use the returned colorspace with CoreGraphics
1886 so they typically do not need to retain it themselves.
1888 This function creates the generic RGB color space once and hangs onto it so it can
1889 return it whenever this function is called.
1892 CGColorSpaceRef
wxMacGetGenericRGBColorSpace()
1894 static wxMacCFRefHolder
<CGColorSpaceRef
> genericRGBColorSpace
;
1896 if (genericRGBColorSpace
== NULL
)
1898 genericRGBColorSpace
.Set( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB
) );
1901 return genericRGBColorSpace
;
1904 CGColorRef
wxMacCreateCGColorFromHITheme( ThemeBrush brush
)
1907 HIThemeBrushCreateCGColor( brush
, &color
);
1913 wxMacPortSaver::wxMacPortSaver( GrafPtr port
)
1915 ::GetPort( &m_port
);
1919 wxMacPortSaver::~wxMacPortSaver()
1921 ::SetPort( m_port
);
1925 void wxMacGlobalToLocal( WindowRef window
, Point
*pt
)
1927 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
1928 HIViewRef contentView
;
1929 // TODO check toolbar offset
1930 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
1931 HIPointConvert( &p
, kHICoordSpace72DPIGlobal
, NULL
, kHICoordSpaceView
, contentView
);
1936 void wxMacLocalToGlobal( WindowRef window
, Point
*pt
)
1938 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
1939 HIViewRef contentView
;
1940 // TODO check toolbar offset
1941 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
1942 HIPointConvert( &p
, kHICoordSpaceView
, contentView
, kHICoordSpace72DPIGlobal
, NULL
);