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 #if TARGET_API_MAC_OSX
47 #include <CoreServices/CoreServices.h>
49 #include <DriverServices.h>
50 #include <Multiprocessing.h>
54 #include <Carbon/Carbon.h>
56 #include <ATSUnicode.h>
57 #include <TextCommon.h>
58 #include <TextEncodingConverter.h>
61 #include "wx/mac/private/timer.h"
64 #include "wx/evtloop.h"
65 #include "wx/mac/private.h"
67 #if defined(__MWERKS__) && wxUSE_UNICODE
68 #if __MWERKS__ < 0x4100
75 // our OS version is the same in non GUI and GUI cases
76 wxOperatingSystemId
wxGetOsVersion(int *majorVsn
, int *minorVsn
)
79 Gestalt(gestaltSystemVersion
, &theSystem
);
81 if ( majorVsn
!= NULL
)
82 *majorVsn
= (theSystem
>> 8);
84 if ( minorVsn
!= NULL
)
85 *minorVsn
= (theSystem
& 0xFF);
87 #if defined( __DARWIN__ )
88 return wxOS_MAC_OSX_DARWIN
;
94 extern bool WXDLLEXPORT
wxIsDebuggerRunning()
96 // TODO : try to find out ...
113 wxPortId
wxGUIAppTraits::GetToolkitVersion(int *verMaj
, int *verMin
) const
115 // We suppose that toolkit version is the same as OS version under Mac
116 wxGetOsVersion(verMaj
, verMin
);
121 wxEventLoopBase
* wxGUIAppTraits::CreateEventLoop()
123 return new wxEventLoop
;
126 wxTimerImpl
* wxGUIAppTraits::CreateTimerImpl(wxTimer
*timer
)
128 return new wxCarbonTimerImpl(timer
);
131 int gs_wxBusyCursorCount
= 0;
132 extern wxCursor gMacCurrentCursor
;
133 wxCursor gMacStoredActiveCursor
;
135 // Set the cursor to the busy cursor for all windows
136 void wxBeginBusyCursor(const wxCursor
*cursor
)
138 if (gs_wxBusyCursorCount
++ == 0)
140 gMacStoredActiveCursor
= gMacCurrentCursor
;
141 cursor
->MacInstall();
143 //else: nothing to do, already set
146 // Restore cursor to normal
147 void wxEndBusyCursor()
149 wxCHECK_RET( gs_wxBusyCursorCount
> 0,
150 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
152 if (--gs_wxBusyCursorCount
== 0)
154 gMacStoredActiveCursor
.MacInstall();
155 gMacStoredActiveCursor
= wxNullCursor
;
159 // true if we're between the above two calls
162 return (gs_wxBusyCursorCount
> 0);
169 wxString
wxMacFindFolderNoSeparator( short vol
,
171 Boolean createFolder
)
176 if ( FSFindFolder( vol
, folderType
, createFolder
, &fsRef
) == noErr
)
178 strDir
= wxMacFSRefToPath( &fsRef
);
184 wxString
wxMacFindFolder( short vol
,
186 Boolean createFolder
)
188 return wxMacFindFolderNoSeparator(vol
, folderType
, createFolder
) + wxFILE_SEP_PATH
;
195 // Check whether this window wants to process messages, e.g. Stop button
196 // in long calculations.
197 bool wxCheckForInterrupt(wxWindow
*WXUNUSED(wnd
))
203 void wxGetMousePosition( int* x
, int* y
)
206 #if wxMAC_USE_CORE_GRAPHICS
210 LocalToGlobal( &pt
);
216 // Return true if we have a colour display
217 bool wxColourDisplay()
222 // Returns depth of screen
226 #if wxMAC_USE_CORE_GRAPHICS
227 theDepth
= (int) CGDisplayBitsPerPixel(CGMainDisplayID());
230 SetRect(&globRect
, -32760, -32760, 32760, 32760);
231 GDHandle theMaxDevice
;
233 theMaxDevice
= GetMaxDevice(&globRect
);
234 if (theMaxDevice
!= NULL
)
235 theDepth
= (**(**theMaxDevice
).gdPMap
).pixelSize
;
240 // Get size of display
241 void wxDisplaySize(int *width
, int *height
)
243 #if wxMAC_USE_CORE_GRAPHICS
244 // TODO adapt for multi-displays
245 CGRect bounds
= CGDisplayBounds(CGMainDisplayID());
247 *width
= (int)bounds
.size
.width
;
249 *height
= (int)bounds
.size
.height
;
252 GetQDGlobalsScreenBits( &screenBits
);
255 *width
= screenBits
.bounds
.right
- screenBits
.bounds
.left
;
258 *height
= screenBits
.bounds
.bottom
- screenBits
.bounds
.top
;
262 void wxDisplaySizeMM(int *width
, int *height
)
264 wxDisplaySize(width
, height
);
265 // on mac 72 is fixed (at least now;-)
266 float cvPt2Mm
= 25.4 / 72;
269 *width
= int( *width
* cvPt2Mm
);
272 *height
= int( *height
* cvPt2Mm
);
275 void wxClientDisplayRect(int *x
, int *y
, int *width
, int *height
)
277 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
279 HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay
,kHICoordSpace72DPIGlobal
,
282 *x
= bounds
.origin
.x
;
284 *y
= bounds
.origin
.y
;
286 *width
= bounds
.size
.width
;
288 *height
= bounds
.size
.height
;
291 GetAvailableWindowPositioningBounds( GetMainDevice() , &r
);
297 *width
= r
.right
- r
.left
;
299 *height
= r
.bottom
- r
.top
;
303 wxWindow
* wxFindWindowAtPoint(const wxPoint
& pt
)
305 return wxGenericFindWindowAtPoint(pt
);
312 wxString
wxGetOsDescription()
314 #ifdef WXWIN_OS_DESCRIPTION
315 // use configure generated description if available
316 return wxString(wxT("MacOS (")) + wxT(WXWIN_OS_DESCRIPTION
) + wxString(wxT(")"));
318 return wxT("MacOS"); //TODO:define further
323 wxString
wxGetUserHome (const wxString
& user
)
329 bool wxGetDiskSpace(const wxString
& path
, wxDiskspaceSize_t
*pTotal
, wxDiskspaceSize_t
*pFree
)
338 int pos
= p
.Find(':');
339 if ( pos
!= wxNOT_FOUND
)
347 err
= wxMacPathToFSRef( p
, &fsRef
);
350 FSVolumeRefNum vRefNum
;
351 err
= FSGetVRefNum( &fsRef
, &vRefNum
);
354 UInt64 freeBytes
, totalBytes
;
355 err
= FSGetVInfo( vRefNum
, NULL
, &freeBytes
, &totalBytes
);
359 *pTotal
= wxDiskspaceSize_t( totalBytes
);
361 *pFree
= wxDiskspaceSize_t( freeBytes
);
368 #endif // !__DARWIN__
370 //---------------------------------------------------------------------------
371 // wxMac Specific utility functions
372 //---------------------------------------------------------------------------
374 void wxMacStringToPascal( const wxString
&from
, StringPtr to
)
376 wxCharBuffer buf
= from
.mb_str( wxConvLocal
);
377 int len
= strlen(buf
);
382 memcpy( (char*) &to
[1] , buf
, len
);
385 wxString
wxMacMakeStringFromPascal( ConstStringPtr from
)
387 return wxString( (char*) &from
[1] , wxConvLocal
, from
[0] );
390 // ----------------------------------------------------------------------------
391 // Common Event Support
392 // ----------------------------------------------------------------------------
394 extern ProcessSerialNumber gAppProcess
;
398 ProcessSerialNumber psn
;
400 psn
.highLongOfPSN
= 0;
401 psn
.lowLongOfPSN
= kCurrentProcess
;
402 SameProcess( &gAppProcess
, &psn
, &isSame
);
405 OSStatus err
= noErr
;
408 // lead sometimes to race conditions, although all calls used should be thread safe ...
409 static wxMacCarbonEvent s_wakeupEvent
;
410 if ( !s_wakeupEvent
.IsValid() )
412 err
= s_wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
413 kEventAttributeNone
);
418 if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent
) )
420 s_wakeupEvent
.SetCurrentTime();
421 err
= PostEventToQueue(GetMainEventQueue(), s_wakeupEvent
,
422 kEventPriorityHigh
);
425 wxMacCarbonEvent wakeupEvent
;
426 wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
427 kEventAttributeNone
);
428 err
= PostEventToQueue(GetMainEventQueue(), wakeupEvent
,
429 kEventPriorityHigh
);
434 WakeUpProcess( &gAppProcess
);
442 // ----------------------------------------------------------------------------
443 // Native Struct Conversions
444 // ----------------------------------------------------------------------------
446 void wxMacRectToNative( const wxRect
*wx
, Rect
*n
)
450 n
->right
= wx
->x
+ wx
->width
;
451 n
->bottom
= wx
->y
+ wx
->height
;
454 void wxMacNativeToRect( const Rect
*n
, wxRect
* wx
)
458 wx
->width
= n
->right
- n
->left
;
459 wx
->height
= n
->bottom
- n
->top
;
462 void wxMacPointToNative( const wxPoint
* wx
, Point
*n
)
468 void wxMacNativeToPoint( const Point
*n
, wxPoint
* wx
)
474 // ----------------------------------------------------------------------------
475 // Carbon Event Support
476 // ----------------------------------------------------------------------------
478 OSStatus
wxMacCarbonEvent::GetParameter(EventParamName inName
, EventParamType inDesiredType
, UInt32 inBufferSize
, void * outData
)
480 return ::GetEventParameter( m_eventRef
, inName
, inDesiredType
, NULL
, inBufferSize
, NULL
, outData
);
483 OSStatus
wxMacCarbonEvent::SetParameter(EventParamName inName
, EventParamType inType
, UInt32 inBufferSize
, const void * inData
)
485 return ::SetEventParameter( m_eventRef
, inName
, inType
, inBufferSize
, inData
);
488 // ----------------------------------------------------------------------------
489 // Control Access Support
490 // ----------------------------------------------------------------------------
492 IMPLEMENT_DYNAMIC_CLASS( wxMacControl
, wxObject
)
494 wxMacControl::wxMacControl()
499 wxMacControl::wxMacControl(wxWindow
* peer
, bool isRootControl
)
503 m_isRootControl
= isRootControl
;
506 wxMacControl::wxMacControl( wxWindow
* peer
, ControlRef control
)
510 m_controlRef
= control
;
513 wxMacControl::wxMacControl( wxWindow
* peer
, WXWidget control
)
517 m_controlRef
= (ControlRef
) control
;
520 wxMacControl::~wxMacControl()
524 void wxMacControl::Init()
528 m_needsFocusRect
= false;
529 m_isRootControl
= false;
532 void wxMacControl::Dispose()
534 wxASSERT_MSG( m_controlRef
!= NULL
, wxT("Control Handle already NULL, Dispose called twice ?") );
535 wxASSERT_MSG( IsValidControlHandle(m_controlRef
) , wxT("Invalid Control Handle (maybe already released) in Dispose") );
537 // we cannot check the ref count here anymore, as autorelease objects might delete their refs later
538 // we can have situations when being embedded, where the control gets deleted behind our back, so only
539 // CFRelease if we are safe
540 if ( IsValidControlHandle(m_controlRef
) )
541 CFRelease(m_controlRef
);
545 void wxMacControl::SetReference( URefCon data
)
547 SetControlReference( m_controlRef
, data
);
550 OSStatus
wxMacControl::GetData(ControlPartCode inPartCode
, ResType inTag
, Size inBufferSize
, void * inOutBuffer
, Size
* outActualSize
) const
552 return ::GetControlData( m_controlRef
, inPartCode
, inTag
, inBufferSize
, inOutBuffer
, outActualSize
);
555 OSStatus
wxMacControl::GetDataSize(ControlPartCode inPartCode
, ResType inTag
, Size
* outActualSize
) const
557 return ::GetControlDataSize( m_controlRef
, inPartCode
, inTag
, outActualSize
);
560 OSStatus
wxMacControl::SetData(ControlPartCode inPartCode
, ResType inTag
, Size inSize
, const void * inData
)
562 return ::SetControlData( m_controlRef
, inPartCode
, inTag
, inSize
, inData
);
565 OSStatus
wxMacControl::SendEvent( EventRef event
, OptionBits inOptions
)
567 #if TARGET_API_MAC_OSX
568 return SendEventToEventTargetWithOptions( event
,
569 HIObjectGetEventTarget( (HIObjectRef
) m_controlRef
), inOptions
);
571 #pragma unused(inOptions)
572 return SendEventToEventTarget(event
,GetControlEventTarget( m_controlRef
) );
576 OSStatus
wxMacControl::SendHICommand( HICommand
&command
, OptionBits inOptions
)
578 wxMacCarbonEvent
event( kEventClassCommand
, kEventCommandProcess
);
580 event
.SetParameter
<HICommand
>(kEventParamDirectObject
,command
);
582 return SendEvent( event
, inOptions
);
585 OSStatus
wxMacControl::SendHICommand( UInt32 commandID
, OptionBits inOptions
)
589 memset( &command
, 0 , sizeof(command
) );
590 command
.commandID
= commandID
;
591 return SendHICommand( command
, inOptions
);
594 void wxMacControl::Flash( ControlPartCode part
, UInt32 ticks
)
596 unsigned long finalTicks
;
598 HiliteControl( m_controlRef
, part
);
599 Delay( ticks
, &finalTicks
);
600 HiliteControl( m_controlRef
, kControlNoPart
);
603 SInt32
wxMacControl::GetValue() const
605 return ::GetControl32BitValue( m_controlRef
);
608 SInt32
wxMacControl::GetMaximum() const
610 return ::GetControl32BitMaximum( m_controlRef
);
613 SInt32
wxMacControl::GetMinimum() const
615 return ::GetControl32BitMinimum( m_controlRef
);
618 void wxMacControl::SetValue( SInt32 v
)
620 ::SetControl32BitValue( m_controlRef
, v
);
623 void wxMacControl::SetMinimum( SInt32 v
)
625 ::SetControl32BitMinimum( m_controlRef
, v
);
628 void wxMacControl::SetMaximum( SInt32 v
)
630 ::SetControl32BitMaximum( m_controlRef
, v
);
633 void wxMacControl::SetValueAndRange( SInt32 value
, SInt32 minimum
, SInt32 maximum
)
635 ::SetControl32BitMinimum( m_controlRef
, minimum
);
636 ::SetControl32BitMaximum( m_controlRef
, maximum
);
637 ::SetControl32BitValue( m_controlRef
, value
);
640 OSStatus
wxMacControl::SetFocus( ControlFocusPart focusPart
)
642 return SetKeyboardFocus( GetControlOwner( m_controlRef
), m_controlRef
, focusPart
);
645 bool wxMacControl::HasFocus() const
648 GetKeyboardFocus( GetUserFocusWindow() , &control
);
649 return control
== m_controlRef
;
652 void wxMacControl::SetNeedsFocusRect( bool needs
)
654 m_needsFocusRect
= needs
;
657 bool wxMacControl::NeedsFocusRect() const
659 return m_needsFocusRect
;
662 void wxMacControl::VisibilityChanged(bool WXUNUSED(shown
))
666 void wxMacControl::SuperChangedPosition()
670 void wxMacControl::SetFont( const wxFont
& font
, const wxColour
& foreground
, long windowStyle
)
674 ControlFontStyleRec fontStyle
;
675 if ( font
.MacGetThemeFontID() != kThemeCurrentPortFont
)
677 switch ( font
.MacGetThemeFontID() )
679 case kThemeSmallSystemFont
:
680 fontStyle
.font
= kControlFontSmallSystemFont
;
683 case 109 : // mini font
687 case kThemeSystemFont
:
688 fontStyle
.font
= kControlFontBigSystemFont
;
692 fontStyle
.font
= kControlFontBigSystemFont
;
696 fontStyle
.flags
= kControlUseFontMask
;
700 fontStyle
.font
= font
.MacGetFontNum();
701 fontStyle
.style
= font
.MacGetFontStyle();
702 fontStyle
.size
= font
.MacGetFontSize();
703 fontStyle
.flags
= kControlUseFontMask
| kControlUseFaceMask
| kControlUseSizeMask
;
706 fontStyle
.just
= teJustLeft
;
707 fontStyle
.flags
|= kControlUseJustMask
;
708 if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_CENTER_HORIZONTAL
)
709 fontStyle
.just
= teJustCenter
;
710 else if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_RIGHT
)
711 fontStyle
.just
= teJustRight
;
714 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
715 // won't get grayed out by the system anymore
717 if ( foreground
!= *wxBLACK
)
719 fontStyle
.foreColor
= MAC_WXCOLORREF( foreground
.GetPixel() );
720 fontStyle
.flags
|= kControlUseForeColorMask
;
723 ::SetControlFontStyle( m_controlRef
, &fontStyle
);
727 void wxMacControl::SetBackground( const wxBrush
&WXUNUSED(brush
) )
730 // setting up a color proc is not recommended anymore
733 void wxMacControl::SetRange( SInt32 minimum
, SInt32 maximum
)
735 ::SetControl32BitMinimum( m_controlRef
, minimum
);
736 ::SetControl32BitMaximum( m_controlRef
, maximum
);
739 short wxMacControl::HandleKey( SInt16 keyCode
, SInt16 charCode
, EventModifiers modifiers
)
742 return HandleControlKey( m_controlRef
, keyCode
, charCode
, modifiers
);
748 void wxMacControl::SetActionProc( ControlActionUPP actionProc
)
750 SetControlAction( m_controlRef
, actionProc
);
753 void wxMacControl::SetViewSize( SInt32 viewSize
)
755 SetControlViewSize(m_controlRef
, viewSize
);
758 SInt32
wxMacControl::GetViewSize() const
760 return GetControlViewSize( m_controlRef
);
763 bool wxMacControl::IsVisible() const
765 return IsControlVisible( m_controlRef
);
768 void wxMacControl::SetVisibility( bool visible
, bool redraw
)
770 SetControlVisibility( m_controlRef
, visible
, redraw
);
773 bool wxMacControl::IsEnabled() const
775 #if TARGET_API_MAC_OSX
776 return IsControlEnabled( m_controlRef
);
778 return IsControlActive( m_controlRef
);
782 bool wxMacControl::IsActive() const
784 return IsControlActive( m_controlRef
);
787 void wxMacControl::Enable( bool enable
)
790 EnableControl( m_controlRef
);
792 DisableControl( m_controlRef
);
795 void wxMacControl::SetDrawingEnabled( bool enable
)
797 HIViewSetDrawingEnabled( m_controlRef
, enable
);
800 bool wxMacControl::GetNeedsDisplay() const
802 return HIViewGetNeedsDisplay( m_controlRef
);
805 void wxMacControl::SetNeedsDisplay( RgnHandle where
)
810 HIViewSetNeedsDisplayInRegion( m_controlRef
, where
, true );
813 void wxMacControl::SetNeedsDisplay( Rect
* where
)
820 RgnHandle update
= NewRgn();
821 RectRgn( update
, where
);
822 HIViewSetNeedsDisplayInRegion( m_controlRef
, update
, true );
823 DisposeRgn( update
);
826 HIViewSetNeedsDisplay( m_controlRef
, true );
829 void wxMacControl::Convert( wxPoint
*pt
, wxMacControl
*from
, wxMacControl
*to
)
835 HIViewConvertPoint( &hiPoint
, from
->m_controlRef
, to
->m_controlRef
);
836 pt
->x
= (int)hiPoint
.x
;
837 pt
->y
= (int)hiPoint
.y
;
840 void wxMacControl::SetRect( Rect
*r
)
842 //A HIRect is actually a CGRect on OSX - which consists of two structures -
843 //CGPoint and CGSize, which have two floats each
844 HIRect hir
= { { r
->left
, r
->top
}, { r
->right
- r
->left
, r
->bottom
- r
->top
} };
845 HIViewSetFrame ( m_controlRef
, &hir
);
846 // eventuall we might have to do a SetVisibility( false , true );
847 // before and a SetVisibility( true , true ); after
850 void wxMacControl::GetRect( Rect
*r
)
852 GetControlBounds( m_controlRef
, r
);
855 void wxMacControl::GetRectInWindowCoords( Rect
*r
)
857 UMAGetControlBoundsInWindowCoords( m_controlRef
, r
);
860 void wxMacControl::GetBestRect( Rect
*r
)
862 short baselineoffset
;
864 GetBestControlRect( m_controlRef
, r
, &baselineoffset
);
867 void wxMacControl::SetLabel( const wxString
&title
)
869 wxFontEncoding encoding
;
872 encoding
= m_font
.GetEncoding();
874 encoding
= wxFont::GetDefaultEncoding();
876 UMASetControlTitle( m_controlRef
, title
, encoding
);
879 void wxMacControl::GetFeatures( UInt32
* features
)
881 GetControlFeatures( m_controlRef
, features
);
884 OSStatus
wxMacControl::GetRegion( ControlPartCode partCode
, RgnHandle region
)
886 OSStatus err
= GetControlRegion( m_controlRef
, partCode
, region
);
890 OSStatus
wxMacControl::SetZOrder( bool above
, wxMacControl
* other
)
892 #if TARGET_API_MAC_OSX
893 return HIViewSetZOrder( m_controlRef
,above
? kHIViewZOrderAbove
: kHIViewZOrderBelow
,
894 (other
!= NULL
) ? other
->m_controlRef
: NULL
);
900 #if TARGET_API_MAC_OSX
901 // SetNeedsDisplay would not invalidate the children
902 static void InvalidateControlAndChildren( HIViewRef control
)
904 HIViewSetNeedsDisplay( control
, true );
905 UInt16 childrenCount
= 0;
906 OSStatus err
= CountSubControls( control
, &childrenCount
);
907 if ( err
== errControlIsNotEmbedder
)
910 wxASSERT_MSG( err
== noErr
, wxT("Unexpected error when accessing subcontrols") );
912 for ( UInt16 i
= childrenCount
; i
>=1; --i
)
916 err
= GetIndexedSubControl( control
, i
, & child
);
917 if ( err
== errControlIsNotEmbedder
)
920 InvalidateControlAndChildren( child
);
925 void wxMacControl::InvalidateWithChildren()
927 #if TARGET_API_MAC_OSX
928 InvalidateControlAndChildren( m_controlRef
);
932 void wxMacControl::ScrollRect( wxRect
*r
, int dx
, int dy
)
934 wxASSERT( r
!= NULL
);
936 HIRect scrollarea
= CGRectMake( r
->x
, r
->y
, r
->width
, r
->height
);
937 HIViewScrollRect ( m_controlRef
, &scrollarea
, dx
,dy
);
940 OSType wxMacCreator
= 'WXMC';
941 OSType wxMacControlProperty
= 'MCCT';
943 void wxMacControl::SetReferenceInNativeControl()
946 verify_noerr( SetControlProperty ( m_controlRef
,
947 wxMacCreator
,wxMacControlProperty
, sizeof(data
), &data
) );
950 wxMacControl
* wxMacControl::GetReferenceFromNativeControl(ControlRef control
)
952 wxMacControl
* ctl
= NULL
;
953 ByteCount actualSize
;
954 if ( GetControlProperty( control
,wxMacCreator
,wxMacControlProperty
, sizeof(ctl
) ,
955 &actualSize
, &ctl
) == noErr
)
962 // ============================================================================
963 // DataBrowser Wrapper
964 // ============================================================================
966 // basing on DataBrowserItemIDs
969 IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl
, wxMacControl
)
971 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
973 DataBrowserItemID itemID
,
974 DataBrowserItemNotification message
,
975 DataBrowserItemDataRef itemData
)
977 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
980 ctl
->ItemNotification(itemID
, message
, itemData
);
984 pascal OSStatus
wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
986 DataBrowserItemID itemID
,
987 DataBrowserPropertyID property
,
988 DataBrowserItemDataRef itemData
,
989 Boolean changeValue
)
991 OSStatus err
= errDataBrowserPropertyNotSupported
;
992 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
995 err
= ctl
->GetSetItemData(itemID
, property
, itemData
, changeValue
);
1000 pascal Boolean
wxMacDataBrowserControl::DataBrowserCompareProc(
1002 DataBrowserItemID itemOneID
,
1003 DataBrowserItemID itemTwoID
,
1004 DataBrowserPropertyID sortProperty
)
1006 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1009 return ctl
->CompareItems(itemOneID
, itemTwoID
, sortProperty
);
1014 DataBrowserItemDataUPP gDataBrowserItemDataUPP
= NULL
;
1015 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP
= NULL
;
1016 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP
= NULL
;
1018 wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow
* peer
,
1021 long WXUNUSED(style
))
1022 : wxMacControl( peer
)
1024 Rect bounds
= wxMacGetBoundsForControl( peer
, pos
, size
);
1025 OSStatus err
= ::CreateDataBrowserControl(
1026 MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),
1027 &bounds
, kDataBrowserListView
, &m_controlRef
);
1028 SetReferenceInNativeControl();
1029 verify_noerr( err
);
1030 if ( gDataBrowserItemCompareUPP
== NULL
)
1031 gDataBrowserItemCompareUPP
= NewDataBrowserItemCompareUPP(DataBrowserCompareProc
);
1032 if ( gDataBrowserItemDataUPP
== NULL
)
1033 gDataBrowserItemDataUPP
= NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc
);
1034 if ( gDataBrowserItemNotificationUPP
== NULL
)
1036 gDataBrowserItemNotificationUPP
=
1037 #if TARGET_API_MAC_OSX
1038 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc
);
1040 NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc
);
1044 DataBrowserCallbacks callbacks
;
1045 InitializeDataBrowserCallbacks( &callbacks
, kDataBrowserLatestCallbacks
);
1047 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserItemDataUPP
;
1048 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserItemCompareUPP
;
1049 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserItemNotificationUPP
;
1050 SetCallbacks( &callbacks
);
1054 OSStatus
wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container
,
1056 DataBrowserItemState state
,
1057 ItemCount
*numItems
) const
1059 return GetDataBrowserItemCount( m_controlRef
, container
, recurse
, state
, numItems
);
1062 OSStatus
wxMacDataBrowserControl::GetItems( DataBrowserItemID container
,
1064 DataBrowserItemState state
,
1067 return GetDataBrowserItems( m_controlRef
, container
, recurse
, state
, items
);
1070 OSStatus
wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options
)
1072 return SetDataBrowserSelectionFlags( m_controlRef
, options
);
1075 OSStatus
wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc
*columnDesc
,
1076 DataBrowserTableViewColumnIndex position
)
1078 return AddDataBrowserListViewColumn( m_controlRef
, columnDesc
, position
);
1081 OSStatus
wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position
, DataBrowserTableViewColumnID
* id
){
1082 return GetDataBrowserTableViewColumnProperty( m_controlRef
, position
, id
);
1085 OSStatus
wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position
)
1087 DataBrowserTableViewColumnID id
;
1088 GetColumnIDFromIndex( position
, &id
);
1089 return RemoveDataBrowserTableViewColumn( m_controlRef
, id
);
1092 OSStatus
wxMacDataBrowserControl::AutoSizeColumns()
1094 return AutoSizeDataBrowserListViewColumns(m_controlRef
);
1097 OSStatus
wxMacDataBrowserControl::SetHasScrollBars( bool horiz
, bool vert
)
1099 return SetDataBrowserHasScrollBars( m_controlRef
, horiz
, vert
);
1102 OSStatus
wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle
)
1104 return SetDataBrowserTableViewHiliteStyle( m_controlRef
, hiliteStyle
);
1107 OSStatus
wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height
)
1109 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1112 OSStatus
wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16
*height
)
1114 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1117 OSStatus
wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks
*callbacks
)
1119 return SetDataBrowserCallbacks( m_controlRef
, callbacks
);
1122 OSStatus
wxMacDataBrowserControl::UpdateItems(
1123 DataBrowserItemID container
,
1125 const DataBrowserItemID
*items
,
1126 DataBrowserPropertyID preSortProperty
,
1127 DataBrowserPropertyID propertyID
) const
1129 return UpdateDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
, propertyID
);
1132 bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item
) const
1134 return IsDataBrowserItemSelected( m_controlRef
, item
);
1137 OSStatus
wxMacDataBrowserControl::AddItems(
1138 DataBrowserItemID container
,
1140 const DataBrowserItemID
*items
,
1141 DataBrowserPropertyID preSortProperty
)
1143 return AddDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1146 OSStatus
wxMacDataBrowserControl::RemoveItems(
1147 DataBrowserItemID container
,
1149 const DataBrowserItemID
*items
,
1150 DataBrowserPropertyID preSortProperty
)
1152 return RemoveDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1155 OSStatus
wxMacDataBrowserControl::RevealItem(
1156 DataBrowserItemID item
,
1157 DataBrowserPropertyID propertyID
,
1158 DataBrowserRevealOptions options
) const
1160 return RevealDataBrowserItem( m_controlRef
, item
, propertyID
, options
);
1163 OSStatus
wxMacDataBrowserControl::SetSelectedItems(
1165 const DataBrowserItemID
*items
,
1166 DataBrowserSetOption operation
)
1168 return SetDataBrowserSelectedItems( m_controlRef
, numItems
, items
, operation
);
1171 OSStatus
wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID
*first
, DataBrowserItemID
*last
) const
1173 return GetDataBrowserSelectionAnchor( m_controlRef
, first
, last
);
1176 OSStatus
wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
1178 return GetDataBrowserTableViewItemID( m_controlRef
, row
, item
);
1181 OSStatus
wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
1183 return GetDataBrowserTableViewItemRow( m_controlRef
, item
, row
);
1186 OSStatus
wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height
)
1188 return SetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1191 OSStatus
wxMacDataBrowserControl::GetDefaultRowHeight( UInt16
* height
) const
1193 return GetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1196 OSStatus
wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item
, UInt16 height
)
1198 return SetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1201 OSStatus
wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item
, UInt16
*height
) const
1203 return GetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1206 OSStatus
wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column
, UInt16
*width
) const
1208 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1211 OSStatus
wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column
, UInt16 width
)
1213 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1216 OSStatus
wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16
*width
) const
1218 return GetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1221 OSStatus
wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width
)
1223 return SetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1226 OSStatus
wxMacDataBrowserControl::GetColumnCount(UInt32
* numColumns
) const
1228 return GetDataBrowserTableViewColumnCount( m_controlRef
, numColumns
);
1231 OSStatus
wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column
,
1232 DataBrowserTableViewColumnIndex
*position
) const
1234 return GetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1237 OSStatus
wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column
, DataBrowserTableViewColumnIndex position
)
1239 return SetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1242 OSStatus
wxMacDataBrowserControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
1244 return GetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1247 OSStatus
wxMacDataBrowserControl::SetScrollPosition( UInt32 top
, UInt32 left
)
1249 return SetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1252 OSStatus
wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID
*column
) const
1254 return GetDataBrowserSortProperty( m_controlRef
, column
);
1257 OSStatus
wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column
)
1259 return SetDataBrowserSortProperty( m_controlRef
, column
);
1262 OSStatus
wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder
*order
) const
1264 return GetDataBrowserSortOrder( m_controlRef
, order
);
1267 OSStatus
wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order
)
1269 return SetDataBrowserSortOrder( m_controlRef
, order
);
1272 OSStatus
wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property
,
1273 DataBrowserPropertyFlags
*flags
) const
1275 return GetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1278 OSStatus
wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property
,
1279 DataBrowserPropertyFlags flags
)
1281 return SetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1284 OSStatus
wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property
,
1285 DataBrowserListViewHeaderDesc
*desc
) const
1287 return GetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1290 OSStatus
wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property
,
1291 DataBrowserListViewHeaderDesc
*desc
)
1293 return SetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1296 OSStatus
wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property
,
1297 Boolean expandableRows
)
1299 return SetDataBrowserListViewDisclosureColumn( m_controlRef
, property
, expandableRows
);
1302 // ============================================================================
1303 // Higher-level Databrowser
1304 // ============================================================================
1306 // basing on data item objects
1309 wxMacDataItem::wxMacDataItem()
1314 m_colId
= kTextColumnId
; // for compat with existing wx*ListBox impls.
1317 wxMacDataItem::~wxMacDataItem()
1321 void wxMacDataItem::SetOrder( SInt32 order
)
1326 SInt32
wxMacDataItem::GetOrder() const
1331 void wxMacDataItem::SetData( void* data
)
1336 void* wxMacDataItem::GetData() const
1341 short wxMacDataItem::GetColumn()
1346 void wxMacDataItem::SetColumn( short col
)
1351 void wxMacDataItem::SetLabel( const wxString
& str
)
1354 m_cfLabel
.Assign( str
, wxLocale::GetSystemEncoding());
1357 const wxString
& wxMacDataItem::GetLabel() const
1362 bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1363 const wxMacDataItem
* rhs
,
1364 DataBrowserPropertyID sortProperty
) const
1366 const wxMacDataItem
* otherItem
= wx_const_cast(wxMacDataItem
*,rhs
);
1367 bool retval
= false;
1369 if ( sortProperty
== m_colId
){
1370 retval
= m_label
.CmpNoCase( otherItem
->m_label
) < 0;
1373 else if ( sortProperty
== kNumericOrderColumnId
)
1374 retval
= m_order
< otherItem
->m_order
;
1379 OSStatus
wxMacDataItem::GetSetData( wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1380 DataBrowserPropertyID property
,
1381 DataBrowserItemDataRef itemData
,
1384 OSStatus err
= errDataBrowserPropertyNotSupported
;
1387 if ( property
== m_colId
){
1388 err
= ::SetDataBrowserItemDataText( itemData
, m_cfLabel
);
1391 else if ( property
== kNumericOrderColumnId
){
1392 err
= ::SetDataBrowserItemDataValue( itemData
, m_order
);
1402 // no editable props here
1411 void wxMacDataItem::Notification(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1412 DataBrowserItemNotification
WXUNUSED(message
),
1413 DataBrowserItemDataRef
WXUNUSED(itemData
) ) const
1417 IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl
, wxMacDataBrowserControl
)
1419 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) :
1420 wxMacDataBrowserControl( peer
, pos
, size
, style
)
1422 m_suppressSelection
= false;
1423 m_sortOrder
= SortOrder_None
;
1424 m_clientDataItemsType
= wxClientData_None
;
1427 wxMacDataItem
* wxMacDataItemBrowserControl::CreateItem()
1429 return new wxMacDataItem();
1432 wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl
*browser
)
1434 m_former
= browser
->SuppressSelection(true);
1435 m_browser
= browser
;
1438 wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1440 m_browser
->SuppressSelection(m_former
);
1443 bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress
)
1445 bool former
= m_suppressSelection
;
1446 m_suppressSelection
= suppress
;
1451 Boolean
wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID
,
1452 DataBrowserItemID itemTwoID
,
1453 DataBrowserPropertyID sortProperty
)
1455 wxMacDataItem
* itemOne
= (wxMacDataItem
*) itemOneID
;
1456 wxMacDataItem
* itemTwo
= (wxMacDataItem
*) itemTwoID
;
1457 return CompareItems( itemOne
, itemTwo
, sortProperty
);
1460 Boolean
wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem
* itemOne
,
1461 const wxMacDataItem
* itemTwo
,
1462 DataBrowserPropertyID sortProperty
)
1464 Boolean retval
= false;
1465 if ( itemOne
!= NULL
)
1466 retval
= itemOne
->IsLessThan( this , itemTwo
, sortProperty
);
1470 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1471 DataBrowserItemID itemID
,
1472 DataBrowserPropertyID property
,
1473 DataBrowserItemDataRef itemData
,
1474 Boolean changeValue
)
1476 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1477 return GetSetItemData(item
, property
, itemData
, changeValue
);
1480 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1481 wxMacDataItem
* item
,
1482 DataBrowserPropertyID property
,
1483 DataBrowserItemDataRef itemData
,
1484 Boolean changeValue
)
1486 OSStatus err
= errDataBrowserPropertyNotSupported
;
1489 case kDataBrowserContainerIsClosableProperty
:
1490 case kDataBrowserContainerIsSortableProperty
:
1491 case kDataBrowserContainerIsOpenableProperty
:
1492 // right now default behaviour on these
1496 if ( item
!= NULL
){
1497 err
= item
->GetSetData( this, property
, itemData
, changeValue
);
1505 void wxMacDataItemBrowserControl::ItemNotification(
1506 DataBrowserItemID itemID
,
1507 DataBrowserItemNotification message
,
1508 DataBrowserItemDataRef itemData
)
1510 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1511 ItemNotification( item
, message
, itemData
);
1514 void wxMacDataItemBrowserControl::ItemNotification(
1515 const wxMacDataItem
* item
,
1516 DataBrowserItemNotification message
,
1517 DataBrowserItemDataRef itemData
)
1520 item
->Notification( this, message
, itemData
);
1523 unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem
* container
,
1524 bool recurse
, DataBrowserItemState state
) const
1526 ItemCount numItems
= 0;
1527 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID
)container
,
1528 recurse
, state
, &numItems
) );
1532 unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem
* container
,
1533 bool recurse
) const
1535 return GetItemCount( container
, recurse
, kDataBrowserItemIsSelected
);
1539 void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem
* container
,
1540 bool recurse
, DataBrowserItemState state
, wxArrayMacDataItemPtr
&items
) const
1542 Handle handle
= NewHandle(0);
1543 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID
)container
,
1544 recurse
, state
, handle
) );
1546 int itemCount
= GetHandleSize(handle
)/sizeof(DataBrowserItemID
);
1548 wxMacDataItemPtr
* itemsArray
= (wxMacDataItemPtr
*) *handle
;
1549 for ( int i
= 0; i
< itemCount
; ++i
)
1551 items
.Add(itemsArray
[i
]);
1554 DisposeHandle( handle
);
1557 unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem
* item
) const
1559 DataBrowserTableViewRowIndex row
;
1560 OSStatus err
= GetItemRow( (DataBrowserItemID
) item
, &row
);
1561 wxASSERT( err
== noErr
);
1565 wxMacDataItem
* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n
) const
1567 DataBrowserItemID id
;
1568 OSStatus err
= GetItemID( (DataBrowserTableViewRowIndex
) n
, &id
);
1569 wxASSERT( err
== noErr
);
1570 return (wxMacDataItem
*) id
;
1573 void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem
*container
,
1574 const wxMacDataItem
*item
, DataBrowserPropertyID property
) const
1576 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, 1,
1577 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1580 void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem
*container
,
1581 wxArrayMacDataItemPtr
&itemArray
, DataBrowserPropertyID property
) const
1583 unsigned int noItems
= itemArray
.GetCount();
1584 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1585 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1586 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1588 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, noItems
,
1589 items
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1593 void wxMacDataItemBrowserControl::InsertColumn(int colId
, DataBrowserPropertyType colType
,
1594 const wxString
& title
, SInt16 just
, int defaultWidth
)
1596 DataBrowserListViewColumnDesc columnDesc
;
1597 columnDesc
.headerBtnDesc
.titleOffset
= 0;
1598 columnDesc
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
1600 columnDesc
.headerBtnDesc
.btnFontStyle
.flags
=
1601 kControlUseFontMask
| kControlUseJustMask
;
1603 columnDesc
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentTextOnly
;
1604 columnDesc
.headerBtnDesc
.btnFontStyle
.just
= just
;
1605 columnDesc
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
1606 columnDesc
.headerBtnDesc
.btnFontStyle
.style
= normal
;
1608 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1609 // defined for other modes?
1612 enc
= m_font
.GetEncoding();
1614 enc
= wxLocale::GetSystemEncoding();
1615 wxMacCFStringHolder cfTitle
;
1616 cfTitle
.Assign( title
, enc
);
1617 columnDesc
.headerBtnDesc
.titleString
= cfTitle
;
1619 columnDesc
.headerBtnDesc
.minimumWidth
= 0;
1620 columnDesc
.headerBtnDesc
.maximumWidth
= 30000;
1622 columnDesc
.propertyDesc
.propertyID
= (kMinColumnId
+ colId
);
1623 columnDesc
.propertyDesc
.propertyType
= colType
;
1624 columnDesc
.propertyDesc
.propertyFlags
= kDataBrowserListViewSortableColumn
;
1625 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
;
1626 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
1627 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
1630 verify_noerr( AddColumn( &columnDesc
, kDataBrowserListViewAppendColumn
) );
1632 if (defaultWidth
> 0){
1633 SetColumnWidth(colId
, defaultWidth
);
1638 void wxMacDataItemBrowserControl::SetColumnWidth(int colId
, int width
)
1640 DataBrowserPropertyID id
;
1641 GetColumnIDFromIndex(colId
, &id
);
1642 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id
, width
));
1645 int wxMacDataItemBrowserControl::GetColumnWidth(int colId
)
1647 DataBrowserPropertyID id
;
1648 GetColumnIDFromIndex(colId
, &id
);
1650 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id
, &result
));
1654 void wxMacDataItemBrowserControl::AddItem(wxMacDataItem
*container
, wxMacDataItem
*item
)
1656 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, 1,
1657 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
) );
1660 void wxMacDataItemBrowserControl::AddItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1662 unsigned int noItems
= itemArray
.GetCount();
1663 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1664 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1665 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1667 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, noItems
,
1668 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
) );
1672 void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem
*container
, wxMacDataItem
* item
)
1674 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 1,
1675 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
);
1676 verify_noerr( err
);
1679 void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1681 unsigned int noItems
= itemArray
.GetCount();
1682 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1683 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1684 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1686 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, noItems
,
1687 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
);
1688 verify_noerr( err
);
1692 void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem
*container
)
1694 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 0 , NULL
, kDataBrowserItemNoProperty
);
1695 verify_noerr( err
);
1698 void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem
* item
, DataBrowserSetOption option
)
1700 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID
*) &item
, option
));
1703 void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option
)
1705 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL
, option
));
1708 void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr
&itemArray
, DataBrowserSetOption option
)
1710 unsigned int noItems
= itemArray
.GetCount();
1711 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1712 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1713 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1715 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems
, (DataBrowserItemID
*) items
, option
));
1719 Boolean
wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem
* item
) const
1721 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID
) item
);
1724 void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem
* item
, DataBrowserRevealOptions options
)
1726 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID
) item
, kDataBrowserNoItem
, options
) );
1729 void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr
* first
, wxMacDataItemPtr
* last
) const
1731 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID
*) first
, (DataBrowserItemID
*) last
) );
1734 wxClientDataType
wxMacDataItemBrowserControl::GetClientDataType() const
1736 return m_clientDataItemsType
;
1738 void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType
)
1740 m_clientDataItemsType
= clientDataItemsType
;
1743 unsigned int wxMacDataItemBrowserControl::MacGetCount() const
1745 return GetItemCount(wxMacDataBrowserRootContainer
,false,kDataBrowserItemAnyState
);
1748 void wxMacDataItemBrowserControl::MacDelete( unsigned int n
)
1750 wxMacDataItem
* item
= (wxMacDataItem
*)GetItemFromLine( n
);
1751 RemoveItem( wxMacDataBrowserRootContainer
, item
);
1754 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
,
1755 const wxArrayStringsAdapter
& items
,
1758 size_t itemsCount
= items
.GetCount();
1759 if ( itemsCount
== 0 )
1762 SInt32 frontLineOrder
= 0;
1764 if ( m_sortOrder
== SortOrder_None
)
1766 // increase the order of the lines to be shifted
1767 unsigned int lines
= MacGetCount();
1768 for ( unsigned int i
= n
; i
< lines
; ++i
)
1770 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
1771 iter
->SetOrder( iter
->GetOrder() + itemsCount
);
1775 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
1776 frontLineOrder
= iter
->GetOrder();
1780 wxArrayMacDataItemPtr ids
;
1781 ids
.SetCount( itemsCount
);
1783 for ( unsigned int i
= 0; i
< itemsCount
; ++i
)
1785 wxMacDataItem
* item
= CreateItem();
1786 item
->SetLabel( items
[i
]);
1788 item
->SetColumn( kMinColumnId
+ column
);
1790 if ( m_sortOrder
== SortOrder_None
)
1791 item
->SetOrder( frontLineOrder
+ 1 + i
);
1796 AddItems( wxMacDataBrowserRootContainer
, ids
);
1799 int wxMacDataItemBrowserControl::MacAppend( const wxString
& text
)
1801 wxMacDataItem
* item
= CreateItem();
1802 item
->SetLabel( text
);
1803 if ( m_sortOrder
== SortOrder_None
)
1805 unsigned int lines
= MacGetCount();
1807 item
->SetOrder( 1 );
1810 wxMacDataItem
* frontItem
= (wxMacDataItem
*) GetItemFromLine(lines
-1);
1811 item
->SetOrder( frontItem
->GetOrder() + 1 );
1814 AddItem( wxMacDataBrowserRootContainer
, item
);
1816 return GetLineFromItem(item
);
1819 void wxMacDataItemBrowserControl::MacClear()
1821 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
1822 RemoveAllItems(wxMacDataBrowserRootContainer
);
1825 void wxMacDataItemBrowserControl::MacDeselectAll()
1827 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
1828 SetSelectedAllItems( kDataBrowserItemsRemove
);
1831 void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n
, bool select
, bool multi
)
1833 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
1834 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
1836 if ( IsItemSelected( item
) != select
)
1839 SetSelectedItem( item
, multi
? kDataBrowserItemsAdd
: kDataBrowserItemsAssign
);
1841 SetSelectedItem( item
, kDataBrowserItemsRemove
);
1847 bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n
) const
1849 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
1850 return IsItemSelected( item
);
1853 int wxMacDataItemBrowserControl::MacGetSelection() const
1855 wxMacDataItemPtr first
, last
;
1856 GetSelectionAnchor( &first
, &last
);
1858 if ( first
!= NULL
)
1860 return GetLineFromItem( first
);
1866 int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt
& aSelections
) const
1868 aSelections
.Empty();
1869 wxArrayMacDataItemPtr selectedItems
;
1870 GetItems( wxMacDataBrowserRootContainer
, false , kDataBrowserItemIsSelected
, selectedItems
);
1872 int count
= selectedItems
.GetCount();
1874 for ( int i
= 0; i
< count
; ++i
)
1876 aSelections
.Add(GetLineFromItem(selectedItems
[i
]));
1882 void wxMacDataItemBrowserControl::MacSetString( unsigned int n
, const wxString
& text
)
1884 // as we don't store the strings we only have to issue a redraw
1885 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1886 item
->SetLabel( text
);
1887 UpdateItem( wxMacDataBrowserRootContainer
, item
, kTextColumnId
);
1890 wxString
wxMacDataItemBrowserControl::MacGetString( unsigned int n
) const
1892 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1893 return item
->GetLabel();
1896 void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n
, void * data
)
1898 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1899 item
->SetData( data
);
1900 // not displayed, therefore no Update infos to DataBrowser
1903 void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n
) const
1905 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1906 return item
->GetData();
1909 void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n
)
1912 GetScrollPosition( &top
, &left
) ;
1913 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1916 GetRowHeight( (DataBrowserItemID
) item
, &height
) ;
1917 SetScrollPosition( n
* ((UInt32
)height
) , left
) ;
1919 RevealItem( item
, kDataBrowserRevealWithoutSelecting
);
1928 OSStatus
wxMacControl::SetTabEnabled( SInt16 tabNo
, bool enable
)
1930 return ::SetTabEnabled( m_controlRef
, tabNo
, enable
);
1937 // snippets from Sketch Sample from Apple :
1939 #define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc"
1942 This function locates, opens, and returns the profile reference for the calibrated
1943 Generic RGB color space. It is up to the caller to call CMCloseProfile when done
1944 with the profile reference this function returns.
1946 CMProfileRef
wxMacOpenGenericProfile()
1948 static CMProfileRef cachedRGBProfileRef
= NULL
;
1950 // we only create the profile reference once
1951 if (cachedRGBProfileRef
== NULL
)
1953 CMProfileLocation loc
;
1955 loc
.locType
= cmPathBasedProfile
;
1956 strcpy(loc
.u
.pathLoc
.path
, kGenericRGBProfilePathStr
);
1958 verify_noerr( CMOpenProfile(&cachedRGBProfileRef
, &loc
) );
1961 // clone the profile reference so that the caller has their own reference, not our cached one
1962 if (cachedRGBProfileRef
)
1963 CMCloneProfileRef(cachedRGBProfileRef
);
1965 return cachedRGBProfileRef
;
1969 Return the generic RGB color space. This is a 'get' function and the caller should
1970 not release the returned value unless the caller retains it first. Usually callers
1971 of this routine will immediately use the returned colorspace with CoreGraphics
1972 so they typically do not need to retain it themselves.
1974 This function creates the generic RGB color space once and hangs onto it so it can
1975 return it whenever this function is called.
1978 CGColorSpaceRef
wxMacGetGenericRGBColorSpace()
1980 static wxMacCFRefHolder
<CGColorSpaceRef
> genericRGBColorSpace
;
1982 if (genericRGBColorSpace
== NULL
)
1984 if ( UMAGetSystemVersion() >= 0x1040 )
1986 genericRGBColorSpace
.Set( CGColorSpaceCreateWithName( CFSTR("kCGColorSpaceGenericRGB") ) );
1990 CMProfileRef genericRGBProfile
= wxMacOpenGenericProfile();
1992 if (genericRGBProfile
)
1994 genericRGBColorSpace
.Set( CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile
) );
1996 wxASSERT_MSG( genericRGBColorSpace
!= NULL
, wxT("couldn't create the generic RGB color space") );
1998 // we opened the profile so it is up to us to close it
1999 CMCloseProfile(genericRGBProfile
);
2004 return genericRGBColorSpace
;
2009 wxMacPortSaver::wxMacPortSaver( GrafPtr port
)
2011 ::GetPort( &m_port
);
2015 wxMacPortSaver::~wxMacPortSaver()
2017 ::SetPort( m_port
);
2021 void wxMacGlobalToLocal( WindowRef window
, Point
*pt
)
2023 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
2024 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
2025 HIViewRef contentView
;
2026 // TODO check toolbar offset
2027 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
2028 HIPointConvert( &p
, kHICoordSpace72DPIGlobal
, NULL
, kHICoordSpaceView
, contentView
);
2032 QDGlobalToLocalPoint( GetWindowPort(window
), pt
) ;
2036 void wxMacLocalToGlobal( WindowRef window
, Point
*pt
)
2038 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
2039 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
2040 HIViewRef contentView
;
2041 // TODO check toolbar offset
2042 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
2043 HIPointConvert( &p
, kHICoordSpaceView
, contentView
, kHICoordSpace72DPIGlobal
, NULL
);
2047 QDLocalToGlobalPoint( GetWindowPort(window
), pt
) ;