1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/mac/carbon/utils.cpp
3 // Purpose: Various utilities
4 // Author: Stefan Csomor
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
20 #include "wx/toplevel.h"
25 #include "wx/apptrait.h"
28 #include "wx/mac/uma.h"
38 // #include "MoreFilesX.h"
46 #include <CoreServices/CoreServices.h>
47 #include <Carbon/Carbon.h>
48 #include "wx/mac/private/timer.h"
51 #include "wx/evtloop.h"
52 #include "wx/mac/private.h"
54 #if defined(__MWERKS__) && wxUSE_UNICODE
55 #if __MWERKS__ < 0x4100
62 // our OS version is the same in non GUI and GUI cases
63 wxOperatingSystemId
wxGetOsVersion(int *majorVsn
, int *minorVsn
)
66 Gestalt(gestaltSystemVersion
, &theSystem
);
68 if ( majorVsn
!= NULL
)
69 *majorVsn
= (theSystem
>> 8);
71 if ( minorVsn
!= NULL
)
72 *minorVsn
= (theSystem
& 0xFF);
74 #if defined( __DARWIN__ )
75 return wxOS_MAC_OSX_DARWIN
;
81 extern bool WXDLLEXPORT
wxIsDebuggerRunning()
83 // TODO : try to find out ...
100 wxPortId
wxGUIAppTraits::GetToolkitVersion(int *verMaj
, int *verMin
) const
102 // We suppose that toolkit version is the same as OS version under Mac
103 wxGetOsVersion(verMaj
, verMin
);
108 wxEventLoopBase
* wxGUIAppTraits::CreateEventLoop()
110 return new wxEventLoop
;
113 wxTimerImpl
* wxGUIAppTraits::CreateTimerImpl(wxTimer
*timer
)
115 return new wxCarbonTimerImpl(timer
);
118 int gs_wxBusyCursorCount
= 0;
119 extern wxCursor gMacCurrentCursor
;
120 wxCursor gMacStoredActiveCursor
;
122 // Set the cursor to the busy cursor for all windows
123 void wxBeginBusyCursor(const wxCursor
*cursor
)
125 if (gs_wxBusyCursorCount
++ == 0)
127 gMacStoredActiveCursor
= gMacCurrentCursor
;
128 cursor
->MacInstall();
130 //else: nothing to do, already set
133 // Restore cursor to normal
134 void wxEndBusyCursor()
136 wxCHECK_RET( gs_wxBusyCursorCount
> 0,
137 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
139 if (--gs_wxBusyCursorCount
== 0)
141 gMacStoredActiveCursor
.MacInstall();
142 gMacStoredActiveCursor
= wxNullCursor
;
146 // true if we're between the above two calls
149 return (gs_wxBusyCursorCount
> 0);
156 wxString
wxMacFindFolderNoSeparator( short vol
,
158 Boolean createFolder
)
163 if ( FSFindFolder( vol
, folderType
, createFolder
, &fsRef
) == noErr
)
165 strDir
= wxMacFSRefToPath( &fsRef
);
171 wxString
wxMacFindFolder( short vol
,
173 Boolean createFolder
)
175 return wxMacFindFolderNoSeparator(vol
, folderType
, createFolder
) + wxFILE_SEP_PATH
;
182 // Check whether this window wants to process messages, e.g. Stop button
183 // in long calculations.
184 bool wxCheckForInterrupt(wxWindow
*WXUNUSED(wnd
))
190 void wxGetMousePosition( int* x
, int* y
)
192 #if wxMAC_USE_QUICKDRAW
202 // Return true if we have a colour display
203 bool wxColourDisplay()
208 // Returns depth of screen
211 #if wxMAC_USE_QUICKDRAW
212 int theDepth
= (int) CGDisplayBitsPerPixel(CGMainDisplayID());
214 SetRect(&globRect
, -32760, -32760, 32760, 32760);
215 GDHandle theMaxDevice
;
217 theMaxDevice
= GetMaxDevice(&globRect
);
218 if (theMaxDevice
!= NULL
)
219 theDepth
= (**(**theMaxDevice
).gdPMap
).pixelSize
;
227 // Get size of display
228 void wxDisplaySize(int *width
, int *height
)
230 // TODO adapt for multi-displays
231 CGRect bounds
= CGDisplayBounds(CGMainDisplayID());
233 *width
= (int)bounds
.size
.width
;
235 *height
= (int)bounds
.size
.height
;
238 void wxDisplaySizeMM(int *width
, int *height
)
240 wxDisplaySize(width
, height
);
241 // on mac 72 is fixed (at least now;-)
242 float cvPt2Mm
= 25.4 / 72;
245 *width
= int( *width
* cvPt2Mm
);
248 *height
= int( *height
* cvPt2Mm
);
251 void wxClientDisplayRect(int *x
, int *y
, int *width
, int *height
)
253 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
254 #if wxMAC_USE_QUICKDRAW
257 HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay
,kHICoordSpace72DPIGlobal
,
260 *x
= bounds
.origin
.x
;
262 *y
= bounds
.origin
.y
;
264 *width
= bounds
.size
.width
;
266 *height
= bounds
.size
.height
;
269 wxDisplaySize(&w
,&h
);
281 GetAvailableWindowPositioningBounds( GetMainDevice() , &r
);
287 *width
= r
.right
- r
.left
;
289 *height
= r
.bottom
- r
.top
;
293 wxWindow
* wxFindWindowAtPoint(const wxPoint
& pt
)
295 return wxGenericFindWindowAtPoint(pt
);
302 wxString
wxGetOsDescription()
304 #ifdef WXWIN_OS_DESCRIPTION
305 // use configure generated description if available
306 return wxString(wxT("MacOS (")) + wxT(WXWIN_OS_DESCRIPTION
) + wxString(wxT(")"));
308 return wxT("MacOS"); //TODO:define further
313 wxString
wxGetUserHome (const wxString
& user
)
319 bool wxGetDiskSpace(const wxString
& path
, wxDiskspaceSize_t
*pTotal
, wxDiskspaceSize_t
*pFree
)
328 int pos
= p
.Find(':');
329 if ( pos
!= wxNOT_FOUND
)
337 err
= wxMacPathToFSRef( p
, &fsRef
);
340 FSVolumeRefNum vRefNum
;
341 err
= FSGetVRefNum( &fsRef
, &vRefNum
);
344 UInt64 freeBytes
, totalBytes
;
345 err
= FSGetVInfo( vRefNum
, NULL
, &freeBytes
, &totalBytes
);
349 *pTotal
= wxDiskspaceSize_t( totalBytes
);
351 *pFree
= wxDiskspaceSize_t( freeBytes
);
358 #endif // !__DARWIN__
360 //---------------------------------------------------------------------------
361 // wxMac Specific utility functions
362 //---------------------------------------------------------------------------
364 void wxMacStringToPascal( const wxString
&from
, StringPtr to
)
366 wxCharBuffer buf
= from
.mb_str( wxConvLocal
);
367 int len
= strlen(buf
);
372 memcpy( (char*) &to
[1] , buf
, len
);
375 wxString
wxMacMakeStringFromPascal( ConstStringPtr from
)
377 return wxString( (char*) &from
[1] , wxConvLocal
, from
[0] );
380 // ----------------------------------------------------------------------------
381 // Common Event Support
382 // ----------------------------------------------------------------------------
386 OSStatus err
= noErr
;
389 // lead sometimes to race conditions, although all calls used should be thread safe ...
390 static wxMacCarbonEvent s_wakeupEvent
;
391 if ( !s_wakeupEvent
.IsValid() )
393 err
= s_wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
394 kEventAttributeNone
);
399 if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent
) )
401 s_wakeupEvent
.SetCurrentTime();
402 err
= PostEventToQueue(GetMainEventQueue(), s_wakeupEvent
,
403 kEventPriorityHigh
);
406 wxMacCarbonEvent wakeupEvent
;
407 wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
408 kEventAttributeNone
);
409 err
= PostEventToQueue(GetMainEventQueue(), wakeupEvent
,
410 kEventPriorityHigh
);
418 // ----------------------------------------------------------------------------
419 // Native Struct Conversions
420 // ----------------------------------------------------------------------------
422 void wxMacRectToNative( const wxRect
*wx
, Rect
*n
)
426 n
->right
= wx
->x
+ wx
->width
;
427 n
->bottom
= wx
->y
+ wx
->height
;
430 void wxMacNativeToRect( const Rect
*n
, wxRect
* wx
)
434 wx
->width
= n
->right
- n
->left
;
435 wx
->height
= n
->bottom
- n
->top
;
438 void wxMacPointToNative( const wxPoint
* wx
, Point
*n
)
444 void wxMacNativeToPoint( const Point
*n
, wxPoint
* wx
)
450 // ----------------------------------------------------------------------------
451 // Carbon Event Support
452 // ----------------------------------------------------------------------------
454 OSStatus
wxMacCarbonEvent::GetParameter(EventParamName inName
, EventParamType inDesiredType
, UInt32 inBufferSize
, void * outData
)
456 return ::GetEventParameter( m_eventRef
, inName
, inDesiredType
, NULL
, inBufferSize
, NULL
, outData
);
459 OSStatus
wxMacCarbonEvent::SetParameter(EventParamName inName
, EventParamType inType
, UInt32 inBufferSize
, const void * inData
)
461 return ::SetEventParameter( m_eventRef
, inName
, inType
, inBufferSize
, inData
);
464 // ----------------------------------------------------------------------------
465 // Control Access Support
466 // ----------------------------------------------------------------------------
468 #if wxMAC_USE_QUICKDRAW
470 IMPLEMENT_DYNAMIC_CLASS( wxMacControl
, wxObject
)
472 wxMacControl::wxMacControl()
477 wxMacControl::wxMacControl(wxWindow
* peer
, bool isRootControl
)
481 m_isRootControl
= isRootControl
;
484 wxMacControl::wxMacControl( wxWindow
* peer
, ControlRef control
)
488 m_controlRef
= control
;
491 wxMacControl::wxMacControl( wxWindow
* peer
, WXWidget control
)
495 m_controlRef
= (ControlRef
) control
;
498 wxMacControl::~wxMacControl()
502 void wxMacControl::Init()
506 m_needsFocusRect
= false;
507 m_isRootControl
= false;
510 void wxMacControl::Dispose()
512 wxASSERT_MSG( m_controlRef
!= NULL
, wxT("Control Handle already NULL, Dispose called twice ?") );
513 wxASSERT_MSG( IsValidControlHandle(m_controlRef
) , wxT("Invalid Control Handle (maybe already released) in Dispose") );
515 // we cannot check the ref count here anymore, as autorelease objects might delete their refs later
516 // we can have situations when being embedded, where the control gets deleted behind our back, so only
517 // CFRelease if we are safe
518 if ( IsValidControlHandle(m_controlRef
) )
519 CFRelease(m_controlRef
);
523 void wxMacControl::SetReference( URefCon data
)
525 SetControlReference( m_controlRef
, data
);
528 OSStatus
wxMacControl::GetData(ControlPartCode inPartCode
, ResType inTag
, Size inBufferSize
, void * inOutBuffer
, Size
* outActualSize
) const
530 return ::GetControlData( m_controlRef
, inPartCode
, inTag
, inBufferSize
, inOutBuffer
, outActualSize
);
533 OSStatus
wxMacControl::GetDataSize(ControlPartCode inPartCode
, ResType inTag
, Size
* outActualSize
) const
535 return ::GetControlDataSize( m_controlRef
, inPartCode
, inTag
, outActualSize
);
538 OSStatus
wxMacControl::SetData(ControlPartCode inPartCode
, ResType inTag
, Size inSize
, const void * inData
)
540 return ::SetControlData( m_controlRef
, inPartCode
, inTag
, inSize
, inData
);
543 OSStatus
wxMacControl::SendEvent( EventRef event
, OptionBits inOptions
)
545 return SendEventToEventTargetWithOptions( event
,
546 HIObjectGetEventTarget( (HIObjectRef
) m_controlRef
), inOptions
);
549 OSStatus
wxMacControl::SendHICommand( HICommand
&command
, OptionBits inOptions
)
551 wxMacCarbonEvent
event( kEventClassCommand
, kEventCommandProcess
);
553 event
.SetParameter
<HICommand
>(kEventParamDirectObject
,command
);
555 return SendEvent( event
, inOptions
);
558 OSStatus
wxMacControl::SendHICommand( UInt32 commandID
, OptionBits inOptions
)
562 memset( &command
, 0 , sizeof(command
) );
563 command
.commandID
= commandID
;
564 return SendHICommand( command
, inOptions
);
567 void wxMacControl::Flash( ControlPartCode part
, UInt32 ticks
)
569 unsigned long finalTicks
;
571 HiliteControl( m_controlRef
, part
);
572 Delay( ticks
, &finalTicks
);
573 HiliteControl( m_controlRef
, kControlNoPart
);
576 SInt32
wxMacControl::GetValue() const
578 return ::GetControl32BitValue( m_controlRef
);
581 SInt32
wxMacControl::GetMaximum() const
583 return ::GetControl32BitMaximum( m_controlRef
);
586 SInt32
wxMacControl::GetMinimum() const
588 return ::GetControl32BitMinimum( m_controlRef
);
591 void wxMacControl::SetValue( SInt32 v
)
593 ::SetControl32BitValue( m_controlRef
, v
);
596 void wxMacControl::SetMinimum( SInt32 v
)
598 ::SetControl32BitMinimum( m_controlRef
, v
);
601 void wxMacControl::SetMaximum( SInt32 v
)
603 ::SetControl32BitMaximum( m_controlRef
, v
);
606 void wxMacControl::SetValueAndRange( SInt32 value
, SInt32 minimum
, SInt32 maximum
)
608 ::SetControl32BitMinimum( m_controlRef
, minimum
);
609 ::SetControl32BitMaximum( m_controlRef
, maximum
);
610 ::SetControl32BitValue( m_controlRef
, value
);
613 OSStatus
wxMacControl::SetFocus( ControlFocusPart focusPart
)
615 return SetKeyboardFocus( GetControlOwner( m_controlRef
), m_controlRef
, focusPart
);
618 bool wxMacControl::HasFocus() const
621 GetKeyboardFocus( GetUserFocusWindow() , &control
);
622 return control
== m_controlRef
;
625 void wxMacControl::SetNeedsFocusRect( bool needs
)
627 m_needsFocusRect
= needs
;
630 bool wxMacControl::NeedsFocusRect() const
632 return m_needsFocusRect
;
635 void wxMacControl::VisibilityChanged(bool WXUNUSED(shown
))
639 void wxMacControl::SuperChangedPosition()
643 void wxMacControl::SetFont( const wxFont
& font
, const wxColour
& foreground
, long windowStyle
)
647 ControlFontStyleRec fontStyle
;
648 if ( font
.MacGetThemeFontID() != kThemeCurrentPortFont
)
650 switch ( font
.MacGetThemeFontID() )
652 case kThemeSmallSystemFont
:
653 fontStyle
.font
= kControlFontSmallSystemFont
;
656 case 109 : // mini font
660 case kThemeSystemFont
:
661 fontStyle
.font
= kControlFontBigSystemFont
;
665 fontStyle
.font
= kControlFontBigSystemFont
;
669 fontStyle
.flags
= kControlUseFontMask
;
673 fontStyle
.font
= font
.MacGetFontNum();
674 fontStyle
.style
= font
.MacGetFontStyle();
675 fontStyle
.size
= font
.MacGetFontSize();
676 fontStyle
.flags
= kControlUseFontMask
| kControlUseFaceMask
| kControlUseSizeMask
;
679 fontStyle
.just
= teJustLeft
;
680 fontStyle
.flags
|= kControlUseJustMask
;
681 if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_CENTER_HORIZONTAL
)
682 fontStyle
.just
= teJustCenter
;
683 else if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_RIGHT
)
684 fontStyle
.just
= teJustRight
;
687 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
688 // won't get grayed out by the system anymore
690 if ( foreground
!= *wxBLACK
)
692 foreground
.GetRGBColor( &fontStyle
.foreColor
);
693 fontStyle
.flags
|= kControlUseForeColorMask
;
696 ::SetControlFontStyle( m_controlRef
, &fontStyle
);
700 void wxMacControl::SetBackgroundColour( const wxColour
&WXUNUSED(col
) )
702 // HITextViewSetBackgroundColor( m_textView , color );
705 void wxMacControl::SetRange( SInt32 minimum
, SInt32 maximum
)
707 ::SetControl32BitMinimum( m_controlRef
, minimum
);
708 ::SetControl32BitMaximum( m_controlRef
, maximum
);
711 short wxMacControl::HandleKey( SInt16 keyCode
, SInt16 charCode
, EventModifiers modifiers
)
714 return HandleControlKey( m_controlRef
, keyCode
, charCode
, modifiers
);
720 void wxMacControl::SetActionProc( ControlActionUPP actionProc
)
722 SetControlAction( m_controlRef
, actionProc
);
725 void wxMacControl::SetViewSize( SInt32 viewSize
)
727 SetControlViewSize(m_controlRef
, viewSize
);
730 SInt32
wxMacControl::GetViewSize() const
732 return GetControlViewSize( m_controlRef
);
735 bool wxMacControl::IsVisible() const
737 return IsControlVisible( m_controlRef
);
740 void wxMacControl::SetVisibility( bool visible
, bool redraw
)
742 SetControlVisibility( m_controlRef
, visible
, redraw
);
745 bool wxMacControl::IsEnabled() const
747 return IsControlEnabled( m_controlRef
);
750 bool wxMacControl::IsActive() const
752 return IsControlActive( m_controlRef
);
755 void wxMacControl::Enable( bool enable
)
758 EnableControl( m_controlRef
);
760 DisableControl( m_controlRef
);
763 void wxMacControl::SetDrawingEnabled( bool enable
)
765 HIViewSetDrawingEnabled( m_controlRef
, enable
);
768 bool wxMacControl::GetNeedsDisplay() const
770 return HIViewGetNeedsDisplay( m_controlRef
);
773 void wxMacControl::SetNeedsDisplay( RgnHandle where
)
778 HIViewSetNeedsDisplayInRegion( m_controlRef
, where
, true );
781 void wxMacControl::SetNeedsDisplay( Rect
* where
)
788 RgnHandle update
= NewRgn();
789 RectRgn( update
, where
);
790 HIViewSetNeedsDisplayInRegion( m_controlRef
, update
, true );
791 DisposeRgn( update
);
794 HIViewSetNeedsDisplay( m_controlRef
, true );
797 void wxMacControl::Convert( wxPoint
*pt
, wxMacControl
*from
, wxMacControl
*to
)
803 HIViewConvertPoint( &hiPoint
, from
->m_controlRef
, to
->m_controlRef
);
804 pt
->x
= (int)hiPoint
.x
;
805 pt
->y
= (int)hiPoint
.y
;
808 void wxMacControl::SetRect( Rect
*r
)
810 //A HIRect is actually a CGRect on OSX - which consists of two structures -
811 //CGPoint and CGSize, which have two floats each
812 HIRect hir
= { { r
->left
, r
->top
}, { r
->right
- r
->left
, r
->bottom
- r
->top
} };
813 HIViewSetFrame ( m_controlRef
, &hir
);
814 // eventuall we might have to do a SetVisibility( false , true );
815 // before and a SetVisibility( true , true ); after
818 void wxMacControl::GetRect( Rect
*r
)
820 GetControlBounds( m_controlRef
, r
);
823 void wxMacControl::GetRectInWindowCoords( Rect
*r
)
825 GetControlBounds( m_controlRef
, r
) ;
827 WindowRef tlwref
= GetControlOwner( m_controlRef
) ;
829 wxTopLevelWindowMac
* tlwwx
= wxFindWinFromMacWindow( tlwref
) ;
832 ControlRef rootControl
= tlwwx
->GetPeer()->GetControlRef() ;
833 HIPoint hiPoint
= CGPointMake( 0 , 0 ) ;
834 HIViewConvertPoint( &hiPoint
, HIViewGetSuperview(m_controlRef
) , rootControl
) ;
835 OffsetRect( r
, (short) hiPoint
.x
, (short) hiPoint
.y
) ;
839 void wxMacControl::GetBestRect( Rect
*r
)
841 short baselineoffset
;
843 GetBestControlRect( m_controlRef
, r
, &baselineoffset
);
846 void wxMacControl::SetLabel( const wxString
&title
)
848 wxFontEncoding encoding
;
851 encoding
= m_font
.GetEncoding();
853 encoding
= wxFont::GetDefaultEncoding();
855 SetControlTitleWithCFString( m_controlRef
, wxMacCFStringHolder( title
, encoding
) );
858 void wxMacControl::GetFeatures( UInt32
* features
)
860 GetControlFeatures( m_controlRef
, features
);
863 OSStatus
wxMacControl::GetRegion( ControlPartCode partCode
, RgnHandle region
)
865 OSStatus err
= GetControlRegion( m_controlRef
, partCode
, region
);
869 OSStatus
wxMacControl::SetZOrder( bool above
, wxMacControl
* other
)
871 return HIViewSetZOrder( m_controlRef
,above
? kHIViewZOrderAbove
: kHIViewZOrderBelow
,
872 (other
!= NULL
) ? other
->m_controlRef
: NULL
);
875 // SetNeedsDisplay would not invalidate the children
876 static void InvalidateControlAndChildren( HIViewRef control
)
878 HIViewSetNeedsDisplay( control
, true );
879 UInt16 childrenCount
= 0;
880 OSStatus err
= CountSubControls( control
, &childrenCount
);
881 if ( err
== errControlIsNotEmbedder
)
884 wxASSERT_MSG( err
== noErr
, wxT("Unexpected error when accessing subcontrols") );
886 for ( UInt16 i
= childrenCount
; i
>=1; --i
)
890 err
= GetIndexedSubControl( control
, i
, & child
);
891 if ( err
== errControlIsNotEmbedder
)
894 InvalidateControlAndChildren( child
);
898 void wxMacControl::InvalidateWithChildren()
900 InvalidateControlAndChildren( m_controlRef
);
903 void wxMacControl::ScrollRect( wxRect
*r
, int dx
, int dy
)
905 wxASSERT( r
!= NULL
);
907 HIRect scrollarea
= CGRectMake( r
->x
, r
->y
, r
->width
, r
->height
);
908 HIViewScrollRect ( m_controlRef
, &scrollarea
, dx
,dy
);
911 OSType wxMacCreator
= 'WXMC';
912 OSType wxMacControlProperty
= 'MCCT';
914 void wxMacControl::SetReferenceInNativeControl()
917 verify_noerr( SetControlProperty ( m_controlRef
,
918 wxMacCreator
,wxMacControlProperty
, sizeof(data
), &data
) );
921 wxMacControl
* wxMacControl::GetReferenceFromNativeControl(ControlRef control
)
923 wxMacControl
* ctl
= NULL
;
924 ByteCount actualSize
;
925 if ( GetControlProperty( control
,wxMacCreator
,wxMacControlProperty
, sizeof(ctl
) ,
926 &actualSize
, &ctl
) == noErr
)
933 // ============================================================================
934 // DataBrowser Wrapper
935 // ============================================================================
937 // basing on DataBrowserItemIDs
940 IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl
, wxMacControl
)
942 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
944 DataBrowserItemID itemID
,
945 DataBrowserItemNotification message
,
946 DataBrowserItemDataRef itemData
)
948 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
951 ctl
->ItemNotification(itemID
, message
, itemData
);
955 pascal OSStatus
wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
957 DataBrowserItemID itemID
,
958 DataBrowserPropertyID property
,
959 DataBrowserItemDataRef itemData
,
960 Boolean changeValue
)
962 OSStatus err
= errDataBrowserPropertyNotSupported
;
963 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
966 err
= ctl
->GetSetItemData(itemID
, property
, itemData
, changeValue
);
971 pascal Boolean
wxMacDataBrowserControl::DataBrowserCompareProc(
973 DataBrowserItemID itemOneID
,
974 DataBrowserItemID itemTwoID
,
975 DataBrowserPropertyID sortProperty
)
977 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
980 return ctl
->CompareItems(itemOneID
, itemTwoID
, sortProperty
);
985 DataBrowserItemDataUPP gDataBrowserItemDataUPP
= NULL
;
986 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP
= NULL
;
987 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP
= NULL
;
989 wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow
* peer
,
992 long WXUNUSED(style
))
993 : wxMacControl( peer
)
995 Rect bounds
= wxMacGetBoundsForControl( peer
, pos
, size
);
996 OSStatus err
= ::CreateDataBrowserControl(
997 MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),
998 &bounds
, kDataBrowserListView
, &m_controlRef
);
999 SetReferenceInNativeControl();
1000 verify_noerr( err
);
1001 if ( gDataBrowserItemCompareUPP
== NULL
)
1002 gDataBrowserItemCompareUPP
= NewDataBrowserItemCompareUPP(DataBrowserCompareProc
);
1003 if ( gDataBrowserItemDataUPP
== NULL
)
1004 gDataBrowserItemDataUPP
= NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc
);
1005 if ( gDataBrowserItemNotificationUPP
== NULL
)
1007 gDataBrowserItemNotificationUPP
=
1008 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc
);
1011 DataBrowserCallbacks callbacks
;
1012 InitializeDataBrowserCallbacks( &callbacks
, kDataBrowserLatestCallbacks
);
1014 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserItemDataUPP
;
1015 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserItemCompareUPP
;
1016 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserItemNotificationUPP
;
1017 SetCallbacks( &callbacks
);
1021 OSStatus
wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container
,
1023 DataBrowserItemState state
,
1024 ItemCount
*numItems
) const
1026 return GetDataBrowserItemCount( m_controlRef
, container
, recurse
, state
, numItems
);
1029 OSStatus
wxMacDataBrowserControl::GetItems( DataBrowserItemID container
,
1031 DataBrowserItemState state
,
1034 return GetDataBrowserItems( m_controlRef
, container
, recurse
, state
, items
);
1037 OSStatus
wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options
)
1039 return SetDataBrowserSelectionFlags( m_controlRef
, options
);
1042 OSStatus
wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc
*columnDesc
,
1043 DataBrowserTableViewColumnIndex position
)
1045 return AddDataBrowserListViewColumn( m_controlRef
, columnDesc
, position
);
1048 OSStatus
wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position
, DataBrowserTableViewColumnID
* id
){
1049 return GetDataBrowserTableViewColumnProperty( m_controlRef
, position
, id
);
1052 OSStatus
wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position
)
1054 DataBrowserTableViewColumnID id
;
1055 GetColumnIDFromIndex( position
, &id
);
1056 return RemoveDataBrowserTableViewColumn( m_controlRef
, id
);
1059 OSStatus
wxMacDataBrowserControl::AutoSizeColumns()
1061 return AutoSizeDataBrowserListViewColumns(m_controlRef
);
1064 OSStatus
wxMacDataBrowserControl::SetHasScrollBars( bool horiz
, bool vert
)
1066 return SetDataBrowserHasScrollBars( m_controlRef
, horiz
, vert
);
1069 OSStatus
wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle
)
1071 return SetDataBrowserTableViewHiliteStyle( m_controlRef
, hiliteStyle
);
1074 OSStatus
wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height
)
1076 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1079 OSStatus
wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16
*height
)
1081 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1084 OSStatus
wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks
*callbacks
)
1086 return SetDataBrowserCallbacks( m_controlRef
, callbacks
);
1089 OSStatus
wxMacDataBrowserControl::UpdateItems(
1090 DataBrowserItemID container
,
1092 const DataBrowserItemID
*items
,
1093 DataBrowserPropertyID preSortProperty
,
1094 DataBrowserPropertyID propertyID
) const
1096 return UpdateDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
, propertyID
);
1099 bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item
) const
1101 return IsDataBrowserItemSelected( m_controlRef
, item
);
1104 OSStatus
wxMacDataBrowserControl::AddItems(
1105 DataBrowserItemID container
,
1107 const DataBrowserItemID
*items
,
1108 DataBrowserPropertyID preSortProperty
)
1110 return AddDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1113 OSStatus
wxMacDataBrowserControl::RemoveItems(
1114 DataBrowserItemID container
,
1116 const DataBrowserItemID
*items
,
1117 DataBrowserPropertyID preSortProperty
)
1119 return RemoveDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1122 OSStatus
wxMacDataBrowserControl::RevealItem(
1123 DataBrowserItemID item
,
1124 DataBrowserPropertyID propertyID
,
1125 DataBrowserRevealOptions options
) const
1127 return RevealDataBrowserItem( m_controlRef
, item
, propertyID
, options
);
1130 OSStatus
wxMacDataBrowserControl::SetSelectedItems(
1132 const DataBrowserItemID
*items
,
1133 DataBrowserSetOption operation
)
1135 return SetDataBrowserSelectedItems( m_controlRef
, numItems
, items
, operation
);
1138 OSStatus
wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID
*first
, DataBrowserItemID
*last
) const
1140 return GetDataBrowserSelectionAnchor( m_controlRef
, first
, last
);
1143 OSStatus
wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
1145 return GetDataBrowserTableViewItemID( m_controlRef
, row
, item
);
1148 OSStatus
wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
1150 return GetDataBrowserTableViewItemRow( m_controlRef
, item
, row
);
1153 OSStatus
wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height
)
1155 return SetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1158 OSStatus
wxMacDataBrowserControl::GetDefaultRowHeight( UInt16
* height
) const
1160 return GetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1163 OSStatus
wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item
, UInt16 height
)
1165 return SetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1168 OSStatus
wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item
, UInt16
*height
) const
1170 return GetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1173 OSStatus
wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column
, UInt16
*width
) const
1175 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1178 OSStatus
wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column
, UInt16 width
)
1180 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1183 OSStatus
wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16
*width
) const
1185 return GetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1188 OSStatus
wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width
)
1190 return SetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1193 OSStatus
wxMacDataBrowserControl::GetColumnCount(UInt32
* numColumns
) const
1195 return GetDataBrowserTableViewColumnCount( m_controlRef
, numColumns
);
1198 OSStatus
wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column
,
1199 DataBrowserTableViewColumnIndex
*position
) const
1201 return GetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1204 OSStatus
wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column
, DataBrowserTableViewColumnIndex position
)
1206 return SetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1209 OSStatus
wxMacDataBrowserControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
1211 return GetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1214 OSStatus
wxMacDataBrowserControl::SetScrollPosition( UInt32 top
, UInt32 left
)
1216 return SetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1219 OSStatus
wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID
*column
) const
1221 return GetDataBrowserSortProperty( m_controlRef
, column
);
1224 OSStatus
wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column
)
1226 return SetDataBrowserSortProperty( m_controlRef
, column
);
1229 OSStatus
wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder
*order
) const
1231 return GetDataBrowserSortOrder( m_controlRef
, order
);
1234 OSStatus
wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order
)
1236 return SetDataBrowserSortOrder( m_controlRef
, order
);
1239 OSStatus
wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property
,
1240 DataBrowserPropertyFlags
*flags
) const
1242 return GetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1245 OSStatus
wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property
,
1246 DataBrowserPropertyFlags flags
)
1248 return SetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1251 OSStatus
wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property
,
1252 DataBrowserListViewHeaderDesc
*desc
) const
1254 return GetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1257 OSStatus
wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property
,
1258 DataBrowserListViewHeaderDesc
*desc
)
1260 return SetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1263 OSStatus
wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property
,
1264 Boolean expandableRows
)
1266 return SetDataBrowserListViewDisclosureColumn( m_controlRef
, property
, expandableRows
);
1269 // ============================================================================
1270 // Higher-level Databrowser
1271 // ============================================================================
1273 // basing on data item objects
1276 wxMacDataItem::wxMacDataItem()
1281 m_colId
= kTextColumnId
; // for compat with existing wx*ListBox impls.
1284 wxMacDataItem::~wxMacDataItem()
1288 void wxMacDataItem::SetOrder( SInt32 order
)
1293 SInt32
wxMacDataItem::GetOrder() const
1298 void wxMacDataItem::SetData( void* data
)
1303 void* wxMacDataItem::GetData() const
1308 short wxMacDataItem::GetColumn()
1313 void wxMacDataItem::SetColumn( short col
)
1318 void wxMacDataItem::SetLabel( const wxString
& str
)
1321 m_cfLabel
.Assign( str
, wxLocale::GetSystemEncoding());
1324 const wxString
& wxMacDataItem::GetLabel() const
1329 bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1330 const wxMacDataItem
* rhs
,
1331 DataBrowserPropertyID sortProperty
) const
1333 const wxMacDataItem
* otherItem
= wx_const_cast(wxMacDataItem
*,rhs
);
1334 bool retval
= false;
1336 if ( sortProperty
== m_colId
){
1337 retval
= m_label
.CmpNoCase( otherItem
->m_label
) < 0;
1340 else if ( sortProperty
== kNumericOrderColumnId
)
1341 retval
= m_order
< otherItem
->m_order
;
1346 OSStatus
wxMacDataItem::GetSetData( wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1347 DataBrowserPropertyID property
,
1348 DataBrowserItemDataRef itemData
,
1351 OSStatus err
= errDataBrowserPropertyNotSupported
;
1354 if ( property
== m_colId
){
1355 err
= ::SetDataBrowserItemDataText( itemData
, m_cfLabel
);
1358 else if ( property
== kNumericOrderColumnId
){
1359 err
= ::SetDataBrowserItemDataValue( itemData
, m_order
);
1369 // no editable props here
1378 void wxMacDataItem::Notification(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1379 DataBrowserItemNotification
WXUNUSED(message
),
1380 DataBrowserItemDataRef
WXUNUSED(itemData
) ) const
1384 IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl
, wxMacDataBrowserControl
)
1386 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) :
1387 wxMacDataBrowserControl( peer
, pos
, size
, style
)
1389 m_suppressSelection
= false;
1390 m_sortOrder
= SortOrder_None
;
1391 m_clientDataItemsType
= wxClientData_None
;
1394 wxMacDataItem
* wxMacDataItemBrowserControl::CreateItem()
1396 return new wxMacDataItem();
1399 wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl
*browser
)
1401 m_former
= browser
->SuppressSelection(true);
1402 m_browser
= browser
;
1405 wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1407 m_browser
->SuppressSelection(m_former
);
1410 bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress
)
1412 bool former
= m_suppressSelection
;
1413 m_suppressSelection
= suppress
;
1418 Boolean
wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID
,
1419 DataBrowserItemID itemTwoID
,
1420 DataBrowserPropertyID sortProperty
)
1422 wxMacDataItem
* itemOne
= (wxMacDataItem
*) itemOneID
;
1423 wxMacDataItem
* itemTwo
= (wxMacDataItem
*) itemTwoID
;
1424 return CompareItems( itemOne
, itemTwo
, sortProperty
);
1427 Boolean
wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem
* itemOne
,
1428 const wxMacDataItem
* itemTwo
,
1429 DataBrowserPropertyID sortProperty
)
1431 Boolean retval
= false;
1432 if ( itemOne
!= NULL
)
1433 retval
= itemOne
->IsLessThan( this , itemTwo
, sortProperty
);
1437 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1438 DataBrowserItemID itemID
,
1439 DataBrowserPropertyID property
,
1440 DataBrowserItemDataRef itemData
,
1441 Boolean changeValue
)
1443 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1444 return GetSetItemData(item
, property
, itemData
, changeValue
);
1447 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1448 wxMacDataItem
* item
,
1449 DataBrowserPropertyID property
,
1450 DataBrowserItemDataRef itemData
,
1451 Boolean changeValue
)
1453 OSStatus err
= errDataBrowserPropertyNotSupported
;
1456 case kDataBrowserContainerIsClosableProperty
:
1457 case kDataBrowserContainerIsSortableProperty
:
1458 case kDataBrowserContainerIsOpenableProperty
:
1459 // right now default behaviour on these
1463 if ( item
!= NULL
){
1464 err
= item
->GetSetData( this, property
, itemData
, changeValue
);
1472 void wxMacDataItemBrowserControl::ItemNotification(
1473 DataBrowserItemID itemID
,
1474 DataBrowserItemNotification message
,
1475 DataBrowserItemDataRef itemData
)
1477 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1478 ItemNotification( item
, message
, itemData
);
1481 void wxMacDataItemBrowserControl::ItemNotification(
1482 const wxMacDataItem
* item
,
1483 DataBrowserItemNotification message
,
1484 DataBrowserItemDataRef itemData
)
1487 item
->Notification( this, message
, itemData
);
1490 unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem
* container
,
1491 bool recurse
, DataBrowserItemState state
) const
1493 ItemCount numItems
= 0;
1494 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID
)container
,
1495 recurse
, state
, &numItems
) );
1499 unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem
* container
,
1500 bool recurse
) const
1502 return GetItemCount( container
, recurse
, kDataBrowserItemIsSelected
);
1506 void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem
* container
,
1507 bool recurse
, DataBrowserItemState state
, wxArrayMacDataItemPtr
&items
) const
1509 Handle handle
= NewHandle(0);
1510 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID
)container
,
1511 recurse
, state
, handle
) );
1513 int itemCount
= GetHandleSize(handle
)/sizeof(DataBrowserItemID
);
1515 wxMacDataItemPtr
* itemsArray
= (wxMacDataItemPtr
*) *handle
;
1516 for ( int i
= 0; i
< itemCount
; ++i
)
1518 items
.Add(itemsArray
[i
]);
1521 DisposeHandle( handle
);
1524 unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem
* item
) const
1526 DataBrowserTableViewRowIndex row
;
1527 OSStatus err
= GetItemRow( (DataBrowserItemID
) item
, &row
);
1528 wxASSERT( err
== noErr
);
1532 wxMacDataItem
* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n
) const
1534 DataBrowserItemID id
;
1535 OSStatus err
= GetItemID( (DataBrowserTableViewRowIndex
) n
, &id
);
1536 wxASSERT( err
== noErr
);
1537 return (wxMacDataItem
*) id
;
1540 void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem
*container
,
1541 const wxMacDataItem
*item
, DataBrowserPropertyID property
) const
1543 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, 1,
1544 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1547 void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem
*container
,
1548 wxArrayMacDataItemPtr
&itemArray
, DataBrowserPropertyID property
) const
1550 unsigned int noItems
= itemArray
.GetCount();
1551 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1552 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1553 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1555 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, noItems
,
1556 items
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1560 void wxMacDataItemBrowserControl::InsertColumn(int colId
, DataBrowserPropertyType colType
,
1561 const wxString
& title
, SInt16 just
, int defaultWidth
)
1563 DataBrowserListViewColumnDesc columnDesc
;
1564 columnDesc
.headerBtnDesc
.titleOffset
= 0;
1565 columnDesc
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
1567 columnDesc
.headerBtnDesc
.btnFontStyle
.flags
=
1568 kControlUseFontMask
| kControlUseJustMask
;
1570 columnDesc
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentTextOnly
;
1571 columnDesc
.headerBtnDesc
.btnFontStyle
.just
= just
;
1572 columnDesc
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
1573 columnDesc
.headerBtnDesc
.btnFontStyle
.style
= normal
;
1575 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1576 // defined for other modes?
1579 enc
= m_font
.GetEncoding();
1581 enc
= wxLocale::GetSystemEncoding();
1582 wxMacCFStringHolder cfTitle
;
1583 cfTitle
.Assign( title
, enc
);
1584 columnDesc
.headerBtnDesc
.titleString
= cfTitle
;
1586 columnDesc
.headerBtnDesc
.minimumWidth
= 0;
1587 columnDesc
.headerBtnDesc
.maximumWidth
= 30000;
1589 columnDesc
.propertyDesc
.propertyID
= (kMinColumnId
+ colId
);
1590 columnDesc
.propertyDesc
.propertyType
= colType
;
1591 columnDesc
.propertyDesc
.propertyFlags
= kDataBrowserListViewSortableColumn
;
1592 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
;
1593 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
1595 verify_noerr( AddColumn( &columnDesc
, kDataBrowserListViewAppendColumn
) );
1597 if (defaultWidth
> 0){
1598 SetColumnWidth(colId
, defaultWidth
);
1603 void wxMacDataItemBrowserControl::SetColumnWidth(int colId
, int width
)
1605 DataBrowserPropertyID id
;
1606 GetColumnIDFromIndex(colId
, &id
);
1607 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id
, width
));
1610 int wxMacDataItemBrowserControl::GetColumnWidth(int colId
)
1612 DataBrowserPropertyID id
;
1613 GetColumnIDFromIndex(colId
, &id
);
1615 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id
, &result
));
1619 void wxMacDataItemBrowserControl::AddItem(wxMacDataItem
*container
, wxMacDataItem
*item
)
1621 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, 1,
1622 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
) );
1625 void wxMacDataItemBrowserControl::AddItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1627 unsigned int noItems
= itemArray
.GetCount();
1628 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1629 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1630 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1632 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, noItems
,
1633 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
) );
1637 void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem
*container
, wxMacDataItem
* item
)
1639 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 1,
1640 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
);
1641 verify_noerr( err
);
1644 void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1646 unsigned int noItems
= itemArray
.GetCount();
1647 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1648 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1649 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1651 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, noItems
,
1652 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
);
1653 verify_noerr( err
);
1657 void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem
*container
)
1659 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 0 , NULL
, kDataBrowserItemNoProperty
);
1660 verify_noerr( err
);
1663 void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem
* item
, DataBrowserSetOption option
)
1665 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID
*) &item
, option
));
1668 void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option
)
1670 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL
, option
));
1673 void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr
&itemArray
, DataBrowserSetOption option
)
1675 unsigned int noItems
= itemArray
.GetCount();
1676 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1677 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1678 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1680 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems
, (DataBrowserItemID
*) items
, option
));
1684 Boolean
wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem
* item
) const
1686 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID
) item
);
1689 void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem
* item
, DataBrowserRevealOptions options
)
1691 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID
) item
, kDataBrowserNoItem
, options
) );
1694 void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr
* first
, wxMacDataItemPtr
* last
) const
1696 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID
*) first
, (DataBrowserItemID
*) last
) );
1699 wxClientDataType
wxMacDataItemBrowserControl::GetClientDataType() const
1701 return m_clientDataItemsType
;
1703 void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType
)
1705 m_clientDataItemsType
= clientDataItemsType
;
1708 unsigned int wxMacDataItemBrowserControl::MacGetCount() const
1710 return GetItemCount(wxMacDataBrowserRootContainer
,false,kDataBrowserItemAnyState
);
1713 void wxMacDataItemBrowserControl::MacDelete( unsigned int n
)
1715 wxMacDataItem
* item
= (wxMacDataItem
*)GetItemFromLine( n
);
1716 RemoveItem( wxMacDataBrowserRootContainer
, item
);
1719 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
,
1720 const wxArrayStringsAdapter
& items
,
1723 size_t itemsCount
= items
.GetCount();
1724 if ( itemsCount
== 0 )
1727 SInt32 frontLineOrder
= 0;
1729 if ( m_sortOrder
== SortOrder_None
)
1731 // increase the order of the lines to be shifted
1732 unsigned int lines
= MacGetCount();
1733 for ( unsigned int i
= n
; i
< lines
; ++i
)
1735 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
1736 iter
->SetOrder( iter
->GetOrder() + itemsCount
);
1740 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
1741 frontLineOrder
= iter
->GetOrder();
1745 wxArrayMacDataItemPtr ids
;
1746 ids
.SetCount( itemsCount
);
1748 for ( unsigned int i
= 0; i
< itemsCount
; ++i
)
1750 wxMacDataItem
* item
= CreateItem();
1751 item
->SetLabel( items
[i
]);
1753 item
->SetColumn( kMinColumnId
+ column
);
1755 if ( m_sortOrder
== SortOrder_None
)
1756 item
->SetOrder( frontLineOrder
+ 1 + i
);
1761 AddItems( wxMacDataBrowserRootContainer
, ids
);
1764 int wxMacDataItemBrowserControl::MacAppend( const wxString
& text
)
1766 wxMacDataItem
* item
= CreateItem();
1767 item
->SetLabel( text
);
1768 if ( m_sortOrder
== SortOrder_None
)
1770 unsigned int lines
= MacGetCount();
1772 item
->SetOrder( 1 );
1775 wxMacDataItem
* frontItem
= (wxMacDataItem
*) GetItemFromLine(lines
-1);
1776 item
->SetOrder( frontItem
->GetOrder() + 1 );
1779 AddItem( wxMacDataBrowserRootContainer
, item
);
1781 return GetLineFromItem(item
);
1784 void wxMacDataItemBrowserControl::MacClear()
1786 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
1787 RemoveAllItems(wxMacDataBrowserRootContainer
);
1790 void wxMacDataItemBrowserControl::MacDeselectAll()
1792 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
1793 SetSelectedAllItems( kDataBrowserItemsRemove
);
1796 void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n
, bool select
, bool multi
)
1798 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
1799 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
1801 if ( IsItemSelected( item
) != select
)
1804 SetSelectedItem( item
, multi
? kDataBrowserItemsAdd
: kDataBrowserItemsAssign
);
1806 SetSelectedItem( item
, kDataBrowserItemsRemove
);
1812 bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n
) const
1814 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
1815 return IsItemSelected( item
);
1818 int wxMacDataItemBrowserControl::MacGetSelection() const
1820 wxMacDataItemPtr first
, last
;
1821 GetSelectionAnchor( &first
, &last
);
1823 if ( first
!= NULL
)
1825 return GetLineFromItem( first
);
1831 int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt
& aSelections
) const
1833 aSelections
.Empty();
1834 wxArrayMacDataItemPtr selectedItems
;
1835 GetItems( wxMacDataBrowserRootContainer
, false , kDataBrowserItemIsSelected
, selectedItems
);
1837 int count
= selectedItems
.GetCount();
1839 for ( int i
= 0; i
< count
; ++i
)
1841 aSelections
.Add(GetLineFromItem(selectedItems
[i
]));
1847 void wxMacDataItemBrowserControl::MacSetString( unsigned int n
, const wxString
& text
)
1849 // as we don't store the strings we only have to issue a redraw
1850 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1851 item
->SetLabel( text
);
1852 UpdateItem( wxMacDataBrowserRootContainer
, item
, kTextColumnId
);
1855 wxString
wxMacDataItemBrowserControl::MacGetString( unsigned int n
) const
1857 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1858 return item
->GetLabel();
1861 void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n
, void * data
)
1863 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1864 item
->SetData( data
);
1865 // not displayed, therefore no Update infos to DataBrowser
1868 void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n
) const
1870 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1871 return item
->GetData();
1874 void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n
)
1877 GetScrollPosition( &top
, &left
) ;
1878 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
1880 // there is a bug in RevealItem that leads to situations
1881 // in large lists, where the item does not get scrolled
1882 // into sight, so we do a pre-scroll if necessary
1884 GetRowHeight( (DataBrowserItemID
) item
, &height
) ;
1885 UInt32 linetop
= n
* ((UInt32
) height
);
1886 UInt32 linebottom
= linetop
+ height
;
1890 if ( linetop
< top
|| linebottom
> (top
+ rect
.bottom
- rect
.top
) )
1891 SetScrollPosition( wxMax( n
-2, 0 ) * ((UInt32
)height
) , left
) ;
1893 RevealItem( item
, kDataBrowserRevealWithoutSelecting
);
1902 OSStatus
wxMacControl::SetTabEnabled( SInt16 tabNo
, bool enable
)
1904 return ::SetTabEnabled( m_controlRef
, tabNo
, enable
);
1914 Return the generic RGB color space. This is a 'get' function and the caller should
1915 not release the returned value unless the caller retains it first. Usually callers
1916 of this routine will immediately use the returned colorspace with CoreGraphics
1917 so they typically do not need to retain it themselves.
1919 This function creates the generic RGB color space once and hangs onto it so it can
1920 return it whenever this function is called.
1923 CGColorSpaceRef
wxMacGetGenericRGBColorSpace()
1925 static wxMacCFRefHolder
<CGColorSpaceRef
> genericRGBColorSpace
;
1927 if (genericRGBColorSpace
== NULL
)
1929 genericRGBColorSpace
.Set( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB
) );
1932 return genericRGBColorSpace
;
1935 CGColorRef
wxMacCreateCGColorFromHITheme( ThemeBrush brush
)
1938 HIThemeBrushCreateCGColor( brush
, &color
);
1942 #if wxMAC_USE_QUICKDRAW
1944 void wxMacGlobalToLocal( WindowRef window
, Point
*pt
)
1946 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
1947 HIViewRef contentView
;
1948 // TODO check toolbar offset
1949 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
1950 HIPointConvert( &p
, kHICoordSpace72DPIGlobal
, NULL
, kHICoordSpaceView
, contentView
);
1955 void wxMacLocalToGlobal( WindowRef window
, Point
*pt
)
1957 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
1958 HIViewRef contentView
;
1959 // TODO check toolbar offset
1960 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
1961 HIPointConvert( &p
, kHICoordSpaceView
, contentView
, kHICoordSpace72DPIGlobal
, NULL
);