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
200 // Return true if we have a colour display
201 bool wxColourDisplay()
206 // Returns depth of screen
209 #if wxMAC_USE_QUICKDRAW
210 int theDepth
= (int) CGDisplayBitsPerPixel(CGMainDisplayID());
212 SetRect(&globRect
, -32760, -32760, 32760, 32760);
213 GDHandle theMaxDevice
;
215 theMaxDevice
= GetMaxDevice(&globRect
);
216 if (theMaxDevice
!= NULL
)
217 theDepth
= (**(**theMaxDevice
).gdPMap
).pixelSize
;
225 // Get size of display
226 void wxDisplaySize(int *width
, int *height
)
228 // TODO adapt for multi-displays
229 CGRect bounds
= CGDisplayBounds(CGMainDisplayID());
231 *width
= (int)bounds
.size
.width
;
233 *height
= (int)bounds
.size
.height
;
236 void wxDisplaySizeMM(int *width
, int *height
)
238 wxDisplaySize(width
, height
);
239 // on mac 72 is fixed (at least now;-)
240 float cvPt2Mm
= 25.4 / 72;
243 *width
= int( *width
* cvPt2Mm
);
246 *height
= int( *height
* cvPt2Mm
);
249 void wxClientDisplayRect(int *x
, int *y
, int *width
, int *height
)
251 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
252 #if wxMAC_USE_QUICKDRAW
255 HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay
,kHICoordSpace72DPIGlobal
,
258 *x
= bounds
.origin
.x
;
260 *y
= bounds
.origin
.y
;
262 *width
= bounds
.size
.width
;
264 *height
= bounds
.size
.height
;
267 wxDisplaySize(&w
,&h
);
279 GetAvailableWindowPositioningBounds( GetMainDevice() , &r
);
285 *width
= r
.right
- r
.left
;
287 *height
= r
.bottom
- r
.top
;
291 wxWindow
* wxFindWindowAtPoint(const wxPoint
& pt
)
293 return wxGenericFindWindowAtPoint(pt
);
300 wxString
wxGetOsDescription()
302 #ifdef WXWIN_OS_DESCRIPTION
303 // use configure generated description if available
304 return wxString(wxT("MacOS (")) + wxT(WXWIN_OS_DESCRIPTION
) + wxString(wxT(")"));
306 return wxT("MacOS"); //TODO:define further
311 wxString
wxGetUserHome (const wxString
& user
)
317 bool wxGetDiskSpace(const wxString
& path
, wxDiskspaceSize_t
*pTotal
, wxDiskspaceSize_t
*pFree
)
326 int pos
= p
.Find(':');
327 if ( pos
!= wxNOT_FOUND
)
335 err
= wxMacPathToFSRef( p
, &fsRef
);
338 FSVolumeRefNum vRefNum
;
339 err
= FSGetVRefNum( &fsRef
, &vRefNum
);
342 UInt64 freeBytes
, totalBytes
;
343 err
= FSGetVInfo( vRefNum
, NULL
, &freeBytes
, &totalBytes
);
347 *pTotal
= wxDiskspaceSize_t( totalBytes
);
349 *pFree
= wxDiskspaceSize_t( freeBytes
);
356 #endif // !__DARWIN__
358 //---------------------------------------------------------------------------
359 // wxMac Specific utility functions
360 //---------------------------------------------------------------------------
362 void wxMacStringToPascal( const wxString
&from
, StringPtr to
)
364 wxCharBuffer buf
= from
.mb_str( wxConvLocal
);
365 int len
= strlen(buf
);
370 memcpy( (char*) &to
[1] , buf
, len
);
373 wxString
wxMacMakeStringFromPascal( ConstStringPtr from
)
375 return wxString( (char*) &from
[1] , wxConvLocal
, from
[0] );
378 // ----------------------------------------------------------------------------
379 // Common Event Support
380 // ----------------------------------------------------------------------------
382 extern ProcessSerialNumber gAppProcess
;
386 ProcessSerialNumber psn
;
388 psn
.highLongOfPSN
= 0;
389 psn
.lowLongOfPSN
= kCurrentProcess
;
390 SameProcess( &gAppProcess
, &psn
, &isSame
);
393 OSStatus err
= noErr
;
396 // lead sometimes to race conditions, although all calls used should be thread safe ...
397 static wxMacCarbonEvent s_wakeupEvent
;
398 if ( !s_wakeupEvent
.IsValid() )
400 err
= s_wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
401 kEventAttributeNone
);
406 if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent
) )
408 s_wakeupEvent
.SetCurrentTime();
409 err
= PostEventToQueue(GetMainEventQueue(), s_wakeupEvent
,
410 kEventPriorityHigh
);
413 wxMacCarbonEvent wakeupEvent
;
414 wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
415 kEventAttributeNone
);
416 err
= PostEventToQueue(GetMainEventQueue(), wakeupEvent
,
417 kEventPriorityHigh
);
422 WakeUpProcess( &gAppProcess
);
430 // ----------------------------------------------------------------------------
431 // Native Struct Conversions
432 // ----------------------------------------------------------------------------
434 void wxMacRectToNative( const wxRect
*wx
, Rect
*n
)
438 n
->right
= wx
->x
+ wx
->width
;
439 n
->bottom
= wx
->y
+ wx
->height
;
442 void wxMacNativeToRect( const Rect
*n
, wxRect
* wx
)
446 wx
->width
= n
->right
- n
->left
;
447 wx
->height
= n
->bottom
- n
->top
;
450 void wxMacPointToNative( const wxPoint
* wx
, Point
*n
)
456 void wxMacNativeToPoint( const Point
*n
, wxPoint
* wx
)
462 // ----------------------------------------------------------------------------
463 // Carbon Event Support
464 // ----------------------------------------------------------------------------
466 OSStatus
wxMacCarbonEvent::GetParameter(EventParamName inName
, EventParamType inDesiredType
, UInt32 inBufferSize
, void * outData
)
468 return ::GetEventParameter( m_eventRef
, inName
, inDesiredType
, NULL
, inBufferSize
, NULL
, outData
);
471 OSStatus
wxMacCarbonEvent::SetParameter(EventParamName inName
, EventParamType inType
, UInt32 inBufferSize
, const void * inData
)
473 return ::SetEventParameter( m_eventRef
, inName
, inType
, inBufferSize
, inData
);
476 // ----------------------------------------------------------------------------
477 // Control Access Support
478 // ----------------------------------------------------------------------------
480 #if wxMAC_USE_QUICKDRAW
482 IMPLEMENT_DYNAMIC_CLASS( wxMacControl
, wxObject
)
484 wxMacControl::wxMacControl()
489 wxMacControl::wxMacControl(wxWindow
* peer
, bool isRootControl
)
493 m_isRootControl
= isRootControl
;
496 wxMacControl::wxMacControl( wxWindow
* peer
, ControlRef control
)
500 m_controlRef
= control
;
503 wxMacControl::wxMacControl( wxWindow
* peer
, WXWidget control
)
507 m_controlRef
= (ControlRef
) control
;
510 wxMacControl::~wxMacControl()
514 void wxMacControl::Init()
518 m_needsFocusRect
= false;
519 m_isRootControl
= false;
522 void wxMacControl::Dispose()
524 wxASSERT_MSG( m_controlRef
!= NULL
, wxT("Control Handle already NULL, Dispose called twice ?") );
525 wxASSERT_MSG( IsValidControlHandle(m_controlRef
) , wxT("Invalid Control Handle (maybe already released) in Dispose") );
527 // we cannot check the ref count here anymore, as autorelease objects might delete their refs later
528 // we can have situations when being embedded, where the control gets deleted behind our back, so only
529 // CFRelease if we are safe
530 if ( IsValidControlHandle(m_controlRef
) )
531 CFRelease(m_controlRef
);
535 void wxMacControl::SetReference( URefCon data
)
537 SetControlReference( m_controlRef
, data
);
540 OSStatus
wxMacControl::GetData(ControlPartCode inPartCode
, ResType inTag
, Size inBufferSize
, void * inOutBuffer
, Size
* outActualSize
) const
542 return ::GetControlData( m_controlRef
, inPartCode
, inTag
, inBufferSize
, inOutBuffer
, outActualSize
);
545 OSStatus
wxMacControl::GetDataSize(ControlPartCode inPartCode
, ResType inTag
, Size
* outActualSize
) const
547 return ::GetControlDataSize( m_controlRef
, inPartCode
, inTag
, outActualSize
);
550 OSStatus
wxMacControl::SetData(ControlPartCode inPartCode
, ResType inTag
, Size inSize
, const void * inData
)
552 return ::SetControlData( m_controlRef
, inPartCode
, inTag
, inSize
, inData
);
555 OSStatus
wxMacControl::SendEvent( EventRef event
, OptionBits inOptions
)
557 return SendEventToEventTargetWithOptions( event
,
558 HIObjectGetEventTarget( (HIObjectRef
) m_controlRef
), inOptions
);
561 OSStatus
wxMacControl::SendHICommand( HICommand
&command
, OptionBits inOptions
)
563 wxMacCarbonEvent
event( kEventClassCommand
, kEventCommandProcess
);
565 event
.SetParameter
<HICommand
>(kEventParamDirectObject
,command
);
567 return SendEvent( event
, inOptions
);
570 OSStatus
wxMacControl::SendHICommand( UInt32 commandID
, OptionBits inOptions
)
574 memset( &command
, 0 , sizeof(command
) );
575 command
.commandID
= commandID
;
576 return SendHICommand( command
, inOptions
);
579 void wxMacControl::Flash( ControlPartCode part
, UInt32 ticks
)
581 unsigned long finalTicks
;
583 HiliteControl( m_controlRef
, part
);
584 Delay( ticks
, &finalTicks
);
585 HiliteControl( m_controlRef
, kControlNoPart
);
588 SInt32
wxMacControl::GetValue() const
590 return ::GetControl32BitValue( m_controlRef
);
593 SInt32
wxMacControl::GetMaximum() const
595 return ::GetControl32BitMaximum( m_controlRef
);
598 SInt32
wxMacControl::GetMinimum() const
600 return ::GetControl32BitMinimum( m_controlRef
);
603 void wxMacControl::SetValue( SInt32 v
)
605 ::SetControl32BitValue( m_controlRef
, v
);
608 void wxMacControl::SetMinimum( SInt32 v
)
610 ::SetControl32BitMinimum( m_controlRef
, v
);
613 void wxMacControl::SetMaximum( SInt32 v
)
615 ::SetControl32BitMaximum( m_controlRef
, v
);
618 void wxMacControl::SetValueAndRange( SInt32 value
, SInt32 minimum
, SInt32 maximum
)
620 ::SetControl32BitMinimum( m_controlRef
, minimum
);
621 ::SetControl32BitMaximum( m_controlRef
, maximum
);
622 ::SetControl32BitValue( m_controlRef
, value
);
625 OSStatus
wxMacControl::SetFocus( ControlFocusPart focusPart
)
627 return SetKeyboardFocus( GetControlOwner( m_controlRef
), m_controlRef
, focusPart
);
630 bool wxMacControl::HasFocus() const
633 GetKeyboardFocus( GetUserFocusWindow() , &control
);
634 return control
== m_controlRef
;
637 void wxMacControl::SetNeedsFocusRect( bool needs
)
639 m_needsFocusRect
= needs
;
642 bool wxMacControl::NeedsFocusRect() const
644 return m_needsFocusRect
;
647 void wxMacControl::VisibilityChanged(bool WXUNUSED(shown
))
651 void wxMacControl::SuperChangedPosition()
655 void wxMacControl::SetFont( const wxFont
& font
, const wxColour
& foreground
, long windowStyle
)
659 ControlFontStyleRec fontStyle
;
660 if ( font
.MacGetThemeFontID() != kThemeCurrentPortFont
)
662 switch ( font
.MacGetThemeFontID() )
664 case kThemeSmallSystemFont
:
665 fontStyle
.font
= kControlFontSmallSystemFont
;
668 case 109 : // mini font
672 case kThemeSystemFont
:
673 fontStyle
.font
= kControlFontBigSystemFont
;
677 fontStyle
.font
= kControlFontBigSystemFont
;
681 fontStyle
.flags
= kControlUseFontMask
;
685 fontStyle
.font
= font
.MacGetFontNum();
686 fontStyle
.style
= font
.MacGetFontStyle();
687 fontStyle
.size
= font
.MacGetFontSize();
688 fontStyle
.flags
= kControlUseFontMask
| kControlUseFaceMask
| kControlUseSizeMask
;
691 fontStyle
.just
= teJustLeft
;
692 fontStyle
.flags
|= kControlUseJustMask
;
693 if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_CENTER_HORIZONTAL
)
694 fontStyle
.just
= teJustCenter
;
695 else if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_RIGHT
)
696 fontStyle
.just
= teJustRight
;
699 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
700 // won't get grayed out by the system anymore
702 if ( foreground
!= *wxBLACK
)
704 foreground
.GetRGBColor( &fontStyle
.foreColor
);
705 fontStyle
.flags
|= kControlUseForeColorMask
;
708 ::SetControlFontStyle( m_controlRef
, &fontStyle
);
712 void wxMacControl::SetBackgroundColour( const wxColour
&WXUNUSED(col
) )
715 // setting up a color proc is not recommended anymore
718 void wxMacControl::SetRange( SInt32 minimum
, SInt32 maximum
)
720 ::SetControl32BitMinimum( m_controlRef
, minimum
);
721 ::SetControl32BitMaximum( m_controlRef
, maximum
);
724 short wxMacControl::HandleKey( SInt16 keyCode
, SInt16 charCode
, EventModifiers modifiers
)
727 return HandleControlKey( m_controlRef
, keyCode
, charCode
, modifiers
);
733 void wxMacControl::SetActionProc( ControlActionUPP actionProc
)
735 SetControlAction( m_controlRef
, actionProc
);
738 void wxMacControl::SetViewSize( SInt32 viewSize
)
740 SetControlViewSize(m_controlRef
, viewSize
);
743 SInt32
wxMacControl::GetViewSize() const
745 return GetControlViewSize( m_controlRef
);
748 bool wxMacControl::IsVisible() const
750 return IsControlVisible( m_controlRef
);
753 void wxMacControl::SetVisibility( bool visible
, bool redraw
)
755 SetControlVisibility( m_controlRef
, visible
, redraw
);
758 bool wxMacControl::IsEnabled() const
760 return IsControlEnabled( m_controlRef
);
763 bool wxMacControl::IsActive() const
765 return IsControlActive( m_controlRef
);
768 void wxMacControl::Enable( bool enable
)
771 EnableControl( m_controlRef
);
773 DisableControl( m_controlRef
);
776 void wxMacControl::SetDrawingEnabled( bool enable
)
778 HIViewSetDrawingEnabled( m_controlRef
, enable
);
781 bool wxMacControl::GetNeedsDisplay() const
783 return HIViewGetNeedsDisplay( m_controlRef
);
786 void wxMacControl::SetNeedsDisplay( RgnHandle where
)
791 HIViewSetNeedsDisplayInRegion( m_controlRef
, where
, true );
794 void wxMacControl::SetNeedsDisplay( Rect
* where
)
801 RgnHandle update
= NewRgn();
802 RectRgn( update
, where
);
803 HIViewSetNeedsDisplayInRegion( m_controlRef
, update
, true );
804 DisposeRgn( update
);
807 HIViewSetNeedsDisplay( m_controlRef
, true );
810 void wxMacControl::Convert( wxPoint
*pt
, wxMacControl
*from
, wxMacControl
*to
)
816 HIViewConvertPoint( &hiPoint
, from
->m_controlRef
, to
->m_controlRef
);
817 pt
->x
= (int)hiPoint
.x
;
818 pt
->y
= (int)hiPoint
.y
;
821 void wxMacControl::SetRect( Rect
*r
)
823 //A HIRect is actually a CGRect on OSX - which consists of two structures -
824 //CGPoint and CGSize, which have two floats each
825 HIRect hir
= { { r
->left
, r
->top
}, { r
->right
- r
->left
, r
->bottom
- r
->top
} };
826 HIViewSetFrame ( m_controlRef
, &hir
);
827 // eventuall we might have to do a SetVisibility( false , true );
828 // before and a SetVisibility( true , true ); after
831 void wxMacControl::GetRect( Rect
*r
)
833 GetControlBounds( m_controlRef
, r
);
836 void wxMacControl::GetRectInWindowCoords( Rect
*r
)
838 UMAGetControlBoundsInWindowCoords( m_controlRef
, r
);
841 void wxMacControl::GetBestRect( Rect
*r
)
843 short baselineoffset
;
845 GetBestControlRect( m_controlRef
, r
, &baselineoffset
);
848 void wxMacControl::SetLabel( const wxString
&title
)
850 wxFontEncoding encoding
;
853 encoding
= m_font
.GetEncoding();
855 encoding
= wxFont::GetDefaultEncoding();
857 UMASetControlTitle( m_controlRef
, title
, encoding
);
860 void wxMacControl::GetFeatures( UInt32
* features
)
862 GetControlFeatures( m_controlRef
, features
);
865 OSStatus
wxMacControl::GetRegion( ControlPartCode partCode
, RgnHandle region
)
867 OSStatus err
= GetControlRegion( m_controlRef
, partCode
, region
);
871 OSStatus
wxMacControl::SetZOrder( bool above
, wxMacControl
* other
)
873 return HIViewSetZOrder( m_controlRef
,above
? kHIViewZOrderAbove
: kHIViewZOrderBelow
,
874 (other
!= NULL
) ? other
->m_controlRef
: NULL
);
877 // SetNeedsDisplay would not invalidate the children
878 static void InvalidateControlAndChildren( HIViewRef control
)
880 HIViewSetNeedsDisplay( control
, true );
881 UInt16 childrenCount
= 0;
882 OSStatus err
= CountSubControls( control
, &childrenCount
);
883 if ( err
== errControlIsNotEmbedder
)
886 wxASSERT_MSG( err
== noErr
, wxT("Unexpected error when accessing subcontrols") );
888 for ( UInt16 i
= childrenCount
; i
>=1; --i
)
892 err
= GetIndexedSubControl( control
, i
, & child
);
893 if ( err
== errControlIsNotEmbedder
)
896 InvalidateControlAndChildren( child
);
900 void wxMacControl::InvalidateWithChildren()
902 InvalidateControlAndChildren( m_controlRef
);
905 void wxMacControl::ScrollRect( wxRect
*r
, int dx
, int dy
)
907 wxASSERT( r
!= NULL
);
909 HIRect scrollarea
= CGRectMake( r
->x
, r
->y
, r
->width
, r
->height
);
910 HIViewScrollRect ( m_controlRef
, &scrollarea
, dx
,dy
);
913 OSType wxMacCreator
= 'WXMC';
914 OSType wxMacControlProperty
= 'MCCT';
916 void wxMacControl::SetReferenceInNativeControl()
919 verify_noerr( SetControlProperty ( m_controlRef
,
920 wxMacCreator
,wxMacControlProperty
, sizeof(data
), &data
) );
923 wxMacControl
* wxMacControl::GetReferenceFromNativeControl(ControlRef control
)
925 wxMacControl
* ctl
= NULL
;
926 ByteCount actualSize
;
927 if ( GetControlProperty( control
,wxMacCreator
,wxMacControlProperty
, sizeof(ctl
) ,
928 &actualSize
, &ctl
) == noErr
)
935 // ============================================================================
936 // DataBrowser Wrapper
937 // ============================================================================
939 // basing on DataBrowserItemIDs
942 IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl
, wxMacControl
)
944 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
946 DataBrowserItemID itemID
,
947 DataBrowserItemNotification message
,
948 DataBrowserItemDataRef itemData
)
950 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
953 ctl
->ItemNotification(itemID
, message
, itemData
);
957 pascal OSStatus
wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
959 DataBrowserItemID itemID
,
960 DataBrowserPropertyID property
,
961 DataBrowserItemDataRef itemData
,
962 Boolean changeValue
)
964 OSStatus err
= errDataBrowserPropertyNotSupported
;
965 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
968 err
= ctl
->GetSetItemData(itemID
, property
, itemData
, changeValue
);
973 pascal Boolean
wxMacDataBrowserControl::DataBrowserCompareProc(
975 DataBrowserItemID itemOneID
,
976 DataBrowserItemID itemTwoID
,
977 DataBrowserPropertyID sortProperty
)
979 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
982 return ctl
->CompareItems(itemOneID
, itemTwoID
, sortProperty
);
987 DataBrowserItemDataUPP gDataBrowserItemDataUPP
= NULL
;
988 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP
= NULL
;
989 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP
= NULL
;
991 wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow
* peer
,
994 long WXUNUSED(style
))
995 : wxMacControl( peer
)
997 Rect bounds
= wxMacGetBoundsForControl( peer
, pos
, size
);
998 OSStatus err
= ::CreateDataBrowserControl(
999 MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),
1000 &bounds
, kDataBrowserListView
, &m_controlRef
);
1001 SetReferenceInNativeControl();
1002 verify_noerr( err
);
1003 if ( gDataBrowserItemCompareUPP
== NULL
)
1004 gDataBrowserItemCompareUPP
= NewDataBrowserItemCompareUPP(DataBrowserCompareProc
);
1005 if ( gDataBrowserItemDataUPP
== NULL
)
1006 gDataBrowserItemDataUPP
= NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc
);
1007 if ( gDataBrowserItemNotificationUPP
== NULL
)
1009 gDataBrowserItemNotificationUPP
=
1010 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc
);
1013 DataBrowserCallbacks callbacks
;
1014 InitializeDataBrowserCallbacks( &callbacks
, kDataBrowserLatestCallbacks
);
1016 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserItemDataUPP
;
1017 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserItemCompareUPP
;
1018 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserItemNotificationUPP
;
1019 SetCallbacks( &callbacks
);
1023 OSStatus
wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container
,
1025 DataBrowserItemState state
,
1026 ItemCount
*numItems
) const
1028 return GetDataBrowserItemCount( m_controlRef
, container
, recurse
, state
, numItems
);
1031 OSStatus
wxMacDataBrowserControl::GetItems( DataBrowserItemID container
,
1033 DataBrowserItemState state
,
1036 return GetDataBrowserItems( m_controlRef
, container
, recurse
, state
, items
);
1039 OSStatus
wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options
)
1041 return SetDataBrowserSelectionFlags( m_controlRef
, options
);
1044 OSStatus
wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc
*columnDesc
,
1045 DataBrowserTableViewColumnIndex position
)
1047 return AddDataBrowserListViewColumn( m_controlRef
, columnDesc
, position
);
1050 OSStatus
wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position
, DataBrowserTableViewColumnID
* id
){
1051 return GetDataBrowserTableViewColumnProperty( m_controlRef
, position
, id
);
1054 OSStatus
wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position
)
1056 DataBrowserTableViewColumnID id
;
1057 GetColumnIDFromIndex( position
, &id
);
1058 return RemoveDataBrowserTableViewColumn( m_controlRef
, id
);
1061 OSStatus
wxMacDataBrowserControl::AutoSizeColumns()
1063 return AutoSizeDataBrowserListViewColumns(m_controlRef
);
1066 OSStatus
wxMacDataBrowserControl::SetHasScrollBars( bool horiz
, bool vert
)
1068 return SetDataBrowserHasScrollBars( m_controlRef
, horiz
, vert
);
1071 OSStatus
wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle
)
1073 return SetDataBrowserTableViewHiliteStyle( m_controlRef
, hiliteStyle
);
1076 OSStatus
wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height
)
1078 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1081 OSStatus
wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16
*height
)
1083 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1086 OSStatus
wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks
*callbacks
)
1088 return SetDataBrowserCallbacks( m_controlRef
, callbacks
);
1091 OSStatus
wxMacDataBrowserControl::UpdateItems(
1092 DataBrowserItemID container
,
1094 const DataBrowserItemID
*items
,
1095 DataBrowserPropertyID preSortProperty
,
1096 DataBrowserPropertyID propertyID
) const
1098 return UpdateDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
, propertyID
);
1101 bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item
) const
1103 return IsDataBrowserItemSelected( m_controlRef
, item
);
1106 OSStatus
wxMacDataBrowserControl::AddItems(
1107 DataBrowserItemID container
,
1109 const DataBrowserItemID
*items
,
1110 DataBrowserPropertyID preSortProperty
)
1112 return AddDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1115 OSStatus
wxMacDataBrowserControl::RemoveItems(
1116 DataBrowserItemID container
,
1118 const DataBrowserItemID
*items
,
1119 DataBrowserPropertyID preSortProperty
)
1121 return RemoveDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1124 OSStatus
wxMacDataBrowserControl::RevealItem(
1125 DataBrowserItemID item
,
1126 DataBrowserPropertyID propertyID
,
1127 DataBrowserRevealOptions options
) const
1129 return RevealDataBrowserItem( m_controlRef
, item
, propertyID
, options
);
1132 OSStatus
wxMacDataBrowserControl::SetSelectedItems(
1134 const DataBrowserItemID
*items
,
1135 DataBrowserSetOption operation
)
1137 return SetDataBrowserSelectedItems( m_controlRef
, numItems
, items
, operation
);
1140 OSStatus
wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID
*first
, DataBrowserItemID
*last
) const
1142 return GetDataBrowserSelectionAnchor( m_controlRef
, first
, last
);
1145 OSStatus
wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
1147 return GetDataBrowserTableViewItemID( m_controlRef
, row
, item
);
1150 OSStatus
wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
1152 return GetDataBrowserTableViewItemRow( m_controlRef
, item
, row
);
1155 OSStatus
wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height
)
1157 return SetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1160 OSStatus
wxMacDataBrowserControl::GetDefaultRowHeight( UInt16
* height
) const
1162 return GetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1165 OSStatus
wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item
, UInt16 height
)
1167 return SetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1170 OSStatus
wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item
, UInt16
*height
) const
1172 return GetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1175 OSStatus
wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column
, UInt16
*width
) const
1177 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1180 OSStatus
wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column
, UInt16 width
)
1182 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1185 OSStatus
wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16
*width
) const
1187 return GetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1190 OSStatus
wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width
)
1192 return SetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1195 OSStatus
wxMacDataBrowserControl::GetColumnCount(UInt32
* numColumns
) const
1197 return GetDataBrowserTableViewColumnCount( m_controlRef
, numColumns
);
1200 OSStatus
wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column
,
1201 DataBrowserTableViewColumnIndex
*position
) const
1203 return GetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1206 OSStatus
wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column
, DataBrowserTableViewColumnIndex position
)
1208 return SetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1211 OSStatus
wxMacDataBrowserControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
1213 return GetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1216 OSStatus
wxMacDataBrowserControl::SetScrollPosition( UInt32 top
, UInt32 left
)
1218 return SetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1221 OSStatus
wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID
*column
) const
1223 return GetDataBrowserSortProperty( m_controlRef
, column
);
1226 OSStatus
wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column
)
1228 return SetDataBrowserSortProperty( m_controlRef
, column
);
1231 OSStatus
wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder
*order
) const
1233 return GetDataBrowserSortOrder( m_controlRef
, order
);
1236 OSStatus
wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order
)
1238 return SetDataBrowserSortOrder( m_controlRef
, order
);
1241 OSStatus
wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property
,
1242 DataBrowserPropertyFlags
*flags
) const
1244 return GetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1247 OSStatus
wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property
,
1248 DataBrowserPropertyFlags flags
)
1250 return SetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1253 OSStatus
wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property
,
1254 DataBrowserListViewHeaderDesc
*desc
) const
1256 return GetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1259 OSStatus
wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property
,
1260 DataBrowserListViewHeaderDesc
*desc
)
1262 return SetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1265 OSStatus
wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property
,
1266 Boolean expandableRows
)
1268 return SetDataBrowserListViewDisclosureColumn( m_controlRef
, property
, expandableRows
);
1271 // ============================================================================
1272 // Higher-level Databrowser
1273 // ============================================================================
1275 // basing on data item objects
1278 wxMacDataItem::wxMacDataItem()
1283 m_colId
= kTextColumnId
; // for compat with existing wx*ListBox impls.
1286 wxMacDataItem::~wxMacDataItem()
1290 void wxMacDataItem::SetOrder( SInt32 order
)
1295 SInt32
wxMacDataItem::GetOrder() const
1300 void wxMacDataItem::SetData( void* data
)
1305 void* wxMacDataItem::GetData() const
1310 short wxMacDataItem::GetColumn()
1315 void wxMacDataItem::SetColumn( short col
)
1320 void wxMacDataItem::SetLabel( const wxString
& str
)
1323 m_cfLabel
.Assign( str
, wxLocale::GetSystemEncoding());
1326 const wxString
& wxMacDataItem::GetLabel() const
1331 bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1332 const wxMacDataItem
* rhs
,
1333 DataBrowserPropertyID sortProperty
) const
1335 const wxMacDataItem
* otherItem
= wx_const_cast(wxMacDataItem
*,rhs
);
1336 bool retval
= false;
1338 if ( sortProperty
== m_colId
){
1339 retval
= m_label
.CmpNoCase( otherItem
->m_label
) < 0;
1342 else if ( sortProperty
== kNumericOrderColumnId
)
1343 retval
= m_order
< otherItem
->m_order
;
1348 OSStatus
wxMacDataItem::GetSetData( wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1349 DataBrowserPropertyID property
,
1350 DataBrowserItemDataRef itemData
,
1353 OSStatus err
= errDataBrowserPropertyNotSupported
;
1356 if ( property
== m_colId
){
1357 err
= ::SetDataBrowserItemDataText( itemData
, m_cfLabel
);
1360 else if ( property
== kNumericOrderColumnId
){
1361 err
= ::SetDataBrowserItemDataValue( itemData
, m_order
);
1371 // no editable props here
1380 void wxMacDataItem::Notification(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1381 DataBrowserItemNotification
WXUNUSED(message
),
1382 DataBrowserItemDataRef
WXUNUSED(itemData
) ) const
1386 IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl
, wxMacDataBrowserControl
)
1388 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) :
1389 wxMacDataBrowserControl( peer
, pos
, size
, style
)
1391 m_suppressSelection
= false;
1392 m_sortOrder
= SortOrder_None
;
1393 m_clientDataItemsType
= wxClientData_None
;
1396 wxMacDataItem
* wxMacDataItemBrowserControl::CreateItem()
1398 return new wxMacDataItem();
1401 wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl
*browser
)
1403 m_former
= browser
->SuppressSelection(true);
1404 m_browser
= browser
;
1407 wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1409 m_browser
->SuppressSelection(m_former
);
1412 bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress
)
1414 bool former
= m_suppressSelection
;
1415 m_suppressSelection
= suppress
;
1420 Boolean
wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID
,
1421 DataBrowserItemID itemTwoID
,
1422 DataBrowserPropertyID sortProperty
)
1424 wxMacDataItem
* itemOne
= (wxMacDataItem
*) itemOneID
;
1425 wxMacDataItem
* itemTwo
= (wxMacDataItem
*) itemTwoID
;
1426 return CompareItems( itemOne
, itemTwo
, sortProperty
);
1429 Boolean
wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem
* itemOne
,
1430 const wxMacDataItem
* itemTwo
,
1431 DataBrowserPropertyID sortProperty
)
1433 Boolean retval
= false;
1434 if ( itemOne
!= NULL
)
1435 retval
= itemOne
->IsLessThan( this , itemTwo
, sortProperty
);
1439 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1440 DataBrowserItemID itemID
,
1441 DataBrowserPropertyID property
,
1442 DataBrowserItemDataRef itemData
,
1443 Boolean changeValue
)
1445 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1446 return GetSetItemData(item
, property
, itemData
, changeValue
);
1449 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1450 wxMacDataItem
* item
,
1451 DataBrowserPropertyID property
,
1452 DataBrowserItemDataRef itemData
,
1453 Boolean changeValue
)
1455 OSStatus err
= errDataBrowserPropertyNotSupported
;
1458 case kDataBrowserContainerIsClosableProperty
:
1459 case kDataBrowserContainerIsSortableProperty
:
1460 case kDataBrowserContainerIsOpenableProperty
:
1461 // right now default behaviour on these
1465 if ( item
!= NULL
){
1466 err
= item
->GetSetData( this, property
, itemData
, changeValue
);
1474 void wxMacDataItemBrowserControl::ItemNotification(
1475 DataBrowserItemID itemID
,
1476 DataBrowserItemNotification message
,
1477 DataBrowserItemDataRef itemData
)
1479 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1480 ItemNotification( item
, message
, itemData
);
1483 void wxMacDataItemBrowserControl::ItemNotification(
1484 const wxMacDataItem
* item
,
1485 DataBrowserItemNotification message
,
1486 DataBrowserItemDataRef itemData
)
1489 item
->Notification( this, message
, itemData
);
1492 unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem
* container
,
1493 bool recurse
, DataBrowserItemState state
) const
1495 ItemCount numItems
= 0;
1496 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID
)container
,
1497 recurse
, state
, &numItems
) );
1501 unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem
* container
,
1502 bool recurse
) const
1504 return GetItemCount( container
, recurse
, kDataBrowserItemIsSelected
);
1508 void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem
* container
,
1509 bool recurse
, DataBrowserItemState state
, wxArrayMacDataItemPtr
&items
) const
1511 Handle handle
= NewHandle(0);
1512 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID
)container
,
1513 recurse
, state
, handle
) );
1515 int itemCount
= GetHandleSize(handle
)/sizeof(DataBrowserItemID
);
1517 wxMacDataItemPtr
* itemsArray
= (wxMacDataItemPtr
*) *handle
;
1518 for ( int i
= 0; i
< itemCount
; ++i
)
1520 items
.Add(itemsArray
[i
]);
1523 DisposeHandle( handle
);
1526 unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem
* item
) const
1528 DataBrowserTableViewRowIndex row
;
1529 OSStatus err
= GetItemRow( (DataBrowserItemID
) item
, &row
);
1530 wxASSERT( err
== noErr
);
1534 wxMacDataItem
* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n
) const
1536 DataBrowserItemID id
;
1537 OSStatus err
= GetItemID( (DataBrowserTableViewRowIndex
) n
, &id
);
1538 wxASSERT( err
== noErr
);
1539 return (wxMacDataItem
*) id
;
1542 void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem
*container
,
1543 const wxMacDataItem
*item
, DataBrowserPropertyID property
) const
1545 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, 1,
1546 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1549 void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem
*container
,
1550 wxArrayMacDataItemPtr
&itemArray
, DataBrowserPropertyID property
) const
1552 unsigned int noItems
= itemArray
.GetCount();
1553 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1554 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1555 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1557 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, noItems
,
1558 items
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1562 void wxMacDataItemBrowserControl::InsertColumn(int colId
, DataBrowserPropertyType colType
,
1563 const wxString
& title
, SInt16 just
, int defaultWidth
)
1565 DataBrowserListViewColumnDesc columnDesc
;
1566 columnDesc
.headerBtnDesc
.titleOffset
= 0;
1567 columnDesc
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
1569 columnDesc
.headerBtnDesc
.btnFontStyle
.flags
=
1570 kControlUseFontMask
| kControlUseJustMask
;
1572 columnDesc
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentTextOnly
;
1573 columnDesc
.headerBtnDesc
.btnFontStyle
.just
= just
;
1574 columnDesc
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
1575 columnDesc
.headerBtnDesc
.btnFontStyle
.style
= normal
;
1577 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1578 // defined for other modes?
1581 enc
= m_font
.GetEncoding();
1583 enc
= wxLocale::GetSystemEncoding();
1584 wxMacCFStringHolder cfTitle
;
1585 cfTitle
.Assign( title
, enc
);
1586 columnDesc
.headerBtnDesc
.titleString
= cfTitle
;
1588 columnDesc
.headerBtnDesc
.minimumWidth
= 0;
1589 columnDesc
.headerBtnDesc
.maximumWidth
= 30000;
1591 columnDesc
.propertyDesc
.propertyID
= (kMinColumnId
+ colId
);
1592 columnDesc
.propertyDesc
.propertyType
= colType
;
1593 columnDesc
.propertyDesc
.propertyFlags
= kDataBrowserListViewSortableColumn
;
1594 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
;
1595 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
1597 verify_noerr( AddColumn( &columnDesc
, kDataBrowserListViewAppendColumn
) );
1599 if (defaultWidth
> 0){
1600 SetColumnWidth(colId
, defaultWidth
);
1605 void wxMacDataItemBrowserControl::SetColumnWidth(int colId
, int width
)
1607 DataBrowserPropertyID id
;
1608 GetColumnIDFromIndex(colId
, &id
);
1609 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id
, width
));
1612 int wxMacDataItemBrowserControl::GetColumnWidth(int colId
)
1614 DataBrowserPropertyID id
;
1615 GetColumnIDFromIndex(colId
, &id
);
1617 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id
, &result
));
1621 void wxMacDataItemBrowserControl::AddItem(wxMacDataItem
*container
, wxMacDataItem
*item
)
1623 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, 1,
1624 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
) );
1627 void wxMacDataItemBrowserControl::AddItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1629 unsigned int noItems
= itemArray
.GetCount();
1630 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1631 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1632 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1634 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, noItems
,
1635 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
) );
1639 void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem
*container
, wxMacDataItem
* item
)
1641 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 1,
1642 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
);
1643 verify_noerr( err
);
1646 void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1648 unsigned int noItems
= itemArray
.GetCount();
1649 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1650 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1651 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1653 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, noItems
,
1654 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
);
1655 verify_noerr( err
);
1659 void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem
*container
)
1661 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 0 , NULL
, kDataBrowserItemNoProperty
);
1662 verify_noerr( err
);
1665 void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem
* item
, DataBrowserSetOption option
)
1667 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID
*) &item
, option
));
1670 void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option
)
1672 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL
, option
));
1675 void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr
&itemArray
, DataBrowserSetOption option
)
1677 unsigned int noItems
= itemArray
.GetCount();
1678 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1679 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1680 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1682 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems
, (DataBrowserItemID
*) items
, option
));
1686 Boolean
wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem
* item
) const
1688 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID
) item
);
1691 void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem
* item
, DataBrowserRevealOptions options
)
1693 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID
) item
, kDataBrowserNoItem
, options
) );
1696 void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr
* first
, wxMacDataItemPtr
* last
) const
1698 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID
*) first
, (DataBrowserItemID
*) last
) );
1701 wxClientDataType
wxMacDataItemBrowserControl::GetClientDataType() const
1703 return m_clientDataItemsType
;
1705 void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType
)
1707 m_clientDataItemsType
= clientDataItemsType
;
1710 unsigned int wxMacDataItemBrowserControl::MacGetCount() const
1712 return GetItemCount(wxMacDataBrowserRootContainer
,false,kDataBrowserItemAnyState
);
1715 void wxMacDataItemBrowserControl::MacDelete( unsigned int n
)
1717 wxMacDataItem
* item
= (wxMacDataItem
*)GetItemFromLine( n
);
1718 RemoveItem( wxMacDataBrowserRootContainer
, item
);
1721 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
,
1722 const wxArrayStringsAdapter
& items
,
1725 size_t itemsCount
= items
.GetCount();
1726 if ( itemsCount
== 0 )
1729 SInt32 frontLineOrder
= 0;
1731 if ( m_sortOrder
== SortOrder_None
)
1733 // increase the order of the lines to be shifted
1734 unsigned int lines
= MacGetCount();
1735 for ( unsigned int i
= n
; i
< lines
; ++i
)
1737 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
1738 iter
->SetOrder( iter
->GetOrder() + itemsCount
);
1742 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
1743 frontLineOrder
= iter
->GetOrder();
1747 wxArrayMacDataItemPtr ids
;
1748 ids
.SetCount( itemsCount
);
1750 for ( unsigned int i
= 0; i
< itemsCount
; ++i
)
1752 wxMacDataItem
* item
= CreateItem();
1753 item
->SetLabel( items
[i
]);
1755 item
->SetColumn( kMinColumnId
+ column
);
1757 if ( m_sortOrder
== SortOrder_None
)
1758 item
->SetOrder( frontLineOrder
+ 1 + i
);
1763 AddItems( wxMacDataBrowserRootContainer
, ids
);
1766 int wxMacDataItemBrowserControl::MacAppend( const wxString
& text
)
1768 wxMacDataItem
* item
= CreateItem();
1769 item
->SetLabel( text
);
1770 if ( m_sortOrder
== SortOrder_None
)
1772 unsigned int lines
= MacGetCount();
1774 item
->SetOrder( 1 );
1777 wxMacDataItem
* frontItem
= (wxMacDataItem
*) GetItemFromLine(lines
-1);
1778 item
->SetOrder( frontItem
->GetOrder() + 1 );
1781 AddItem( wxMacDataBrowserRootContainer
, item
);
1783 return GetLineFromItem(item
);
1786 void wxMacDataItemBrowserControl::MacClear()
1788 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
1789 RemoveAllItems(wxMacDataBrowserRootContainer
);
1792 void wxMacDataItemBrowserControl::MacDeselectAll()
1794 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
1795 SetSelectedAllItems( kDataBrowserItemsRemove
);
1798 void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n
, bool select
, bool multi
)
1800 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
1801 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
1803 if ( IsItemSelected( item
) != select
)
1806 SetSelectedItem( item
, multi
? kDataBrowserItemsAdd
: kDataBrowserItemsAssign
);
1808 SetSelectedItem( item
, kDataBrowserItemsRemove
);
1814 bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n
) const
1816 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
1817 return IsItemSelected( item
);
1820 int wxMacDataItemBrowserControl::MacGetSelection() const
1822 wxMacDataItemPtr first
, last
;
1823 GetSelectionAnchor( &first
, &last
);
1825 if ( first
!= NULL
)
1827 return GetLineFromItem( first
);
1833 int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt
& aSelections
) const
1835 aSelections
.Empty();
1836 wxArrayMacDataItemPtr selectedItems
;
1837 GetItems( wxMacDataBrowserRootContainer
, false , kDataBrowserItemIsSelected
, selectedItems
);
1839 int count
= selectedItems
.GetCount();
1841 for ( int i
= 0; i
< count
; ++i
)
1843 aSelections
.Add(GetLineFromItem(selectedItems
[i
]));
1849 void wxMacDataItemBrowserControl::MacSetString( unsigned int n
, const wxString
& text
)
1851 // as we don't store the strings we only have to issue a redraw
1852 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1853 item
->SetLabel( text
);
1854 UpdateItem( wxMacDataBrowserRootContainer
, item
, kTextColumnId
);
1857 wxString
wxMacDataItemBrowserControl::MacGetString( unsigned int n
) const
1859 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1860 return item
->GetLabel();
1863 void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n
, void * data
)
1865 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1866 item
->SetData( data
);
1867 // not displayed, therefore no Update infos to DataBrowser
1870 void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n
) const
1872 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1873 return item
->GetData();
1876 void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n
)
1879 GetScrollPosition( &top
, &left
) ;
1880 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1883 GetRowHeight( (DataBrowserItemID
) item
, &height
) ;
1884 SetScrollPosition( n
* ((UInt32
)height
) , left
) ;
1886 RevealItem( item
, kDataBrowserRevealWithoutSelecting
);
1895 OSStatus
wxMacControl::SetTabEnabled( SInt16 tabNo
, bool enable
)
1897 return ::SetTabEnabled( m_controlRef
, tabNo
, enable
);
1907 Return the generic RGB color space. This is a 'get' function and the caller should
1908 not release the returned value unless the caller retains it first. Usually callers
1909 of this routine will immediately use the returned colorspace with CoreGraphics
1910 so they typically do not need to retain it themselves.
1912 This function creates the generic RGB color space once and hangs onto it so it can
1913 return it whenever this function is called.
1916 CGColorSpaceRef
wxMacGetGenericRGBColorSpace()
1918 static wxMacCFRefHolder
<CGColorSpaceRef
> genericRGBColorSpace
;
1920 if (genericRGBColorSpace
== NULL
)
1922 genericRGBColorSpace
.Set( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB
) );
1925 return genericRGBColorSpace
;
1928 CGColorRef
wxMacCreateCGColorFromHITheme( ThemeBrush brush
)
1931 HIThemeBrushCreateCGColor( brush
, &color
);
1937 wxMacPortSaver::wxMacPortSaver( GrafPtr port
)
1939 ::GetPort( &m_port
);
1943 wxMacPortSaver::~wxMacPortSaver()
1945 ::SetPort( m_port
);
1949 #if wxMAC_USE_QUICKDRAW
1951 void wxMacGlobalToLocal( WindowRef window
, Point
*pt
)
1953 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
1954 HIViewRef contentView
;
1955 // TODO check toolbar offset
1956 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
1957 HIPointConvert( &p
, kHICoordSpace72DPIGlobal
, NULL
, kHICoordSpaceView
, contentView
);
1962 void wxMacLocalToGlobal( WindowRef window
, Point
*pt
)
1964 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
1965 HIViewRef contentView
;
1966 // TODO check toolbar offset
1967 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
1968 HIPointConvert( &p
, kHICoordSpaceView
, contentView
, kHICoordSpace72DPIGlobal
, NULL
);