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>
62 #include "wx/mac/private.h"
64 #if defined(__MWERKS__) && wxUSE_UNICODE
65 #if __MWERKS__ < 0x4100 || !defined(__DARWIN__)
72 // our OS version is the same in non GUI and GUI cases
73 wxOperatingSystemId
wxGetOsVersion(int *majorVsn
, int *minorVsn
)
76 Gestalt(gestaltSystemVersion
, &theSystem
);
78 if ( majorVsn
!= NULL
)
79 *majorVsn
= (theSystem
>> 8);
81 if ( minorVsn
!= NULL
)
82 *minorVsn
= (theSystem
& 0xFF);
84 #if defined( __DARWIN__ )
85 return wxOS_MAC_OSX_DARWIN
;
91 // ----------------------------------------------------------------------------
93 // ----------------------------------------------------------------------------
95 #if defined(__WXDEBUG__) && defined(__WXMAC__) && !defined(__DARWIN__) && defined(__MWERKS__) && (__MWERKS__ >= 0x2400)
97 // MetroNub stuff doesn't seem to work in CodeWarrior 5.3 Carbon builds...
99 #ifndef __MetroNubUtils__
100 #include "MetroNubUtils.h"
107 #if TARGET_API_MAC_CARBON
109 #include <CodeFragments.h>
111 extern "C" long CallUniversalProc(UniversalProcPtr theProcPtr
, ProcInfoType procInfo
, ...);
113 ProcPtr gCallUniversalProc_Proc
= NULL
;
117 static MetroNubUserEntryBlock
* gMetroNubEntry
= NULL
;
119 static long fRunOnce
= false;
122 Boolean
IsMetroNubInstalled()
129 gMetroNubEntry
= NULL
;
131 if (Gestalt(gestaltSystemVersion
, &value
) == noErr
&& value
< 0x1000)
133 // look for MetroNub's Gestalt selector
134 if (Gestalt(kMetroNubUserSignature
, &result
) == noErr
)
136 #if TARGET_API_MAC_CARBON
137 if (gCallUniversalProc_Proc
== NULL
)
139 CFragConnectionID connectionID
;
142 ProcPtr symbolAddress
;
144 CFragSymbolClass symbolClass
;
146 symbolAddress
= NULL
;
147 err
= GetSharedLibrary("\pInterfaceLib", kPowerPCCFragArch
, kFindCFrag
,
148 &connectionID
, &mainAddress
, errorString
);
152 gCallUniversalProc_Proc
= NULL
;
156 err
= FindSymbol(connectionID
, "\pCallUniversalProc",
157 (Ptr
*) &gCallUniversalProc_Proc
, &symbolClass
);
161 gCallUniversalProc_Proc
= NULL
;
168 MetroNubUserEntryBlock
* block
= (MetroNubUserEntryBlock
*)result
;
170 // make sure the version of the API is compatible
171 if (block
->apiLowVersion
<= kMetroNubUserAPIVersion
&&
172 kMetroNubUserAPIVersion
<= block
->apiHiVersion
)
175 gMetroNubEntry
= block
;
184 #if TARGET_API_MAC_CARBON
185 return (gMetroNubEntry
!= NULL
&& gCallUniversalProc_Proc
!= NULL
);
187 return (gMetroNubEntry
!= NULL
);
191 Boolean
IsMWDebuggerRunning()
193 if (IsMetroNubInstalled())
194 return CallIsDebuggerRunningProc(gMetroNubEntry
->isDebuggerRunning
);
199 Boolean
AmIBeingMWDebugged()
201 if (IsMetroNubInstalled())
202 return CallAmIBeingDebuggedProc(gMetroNubEntry
->amIBeingDebugged
);
207 extern bool WXDLLEXPORT
wxIsDebuggerRunning()
209 return IsMWDebuggerRunning() && AmIBeingMWDebugged();
214 extern bool WXDLLEXPORT
wxIsDebuggerRunning()
219 #endif // defined(__WXMAC__) && !defined(__DARWIN__) && (__MWERKS__ >= 0x2400)
223 // defined in unix/utilsunx.cpp for Mac OS X
225 // get full hostname (with domain name if possible)
226 bool wxGetFullHostName(wxChar
*buf
, int maxSize
)
228 return wxGetHostName(buf
, maxSize
);
231 // Get user ID e.g. jacs
232 bool wxGetUserId(wxChar
*buf
, int maxSize
)
234 return wxGetUserName( buf
, maxSize
);
237 const wxChar
* wxGetHomeDir(wxString
*pstr
)
239 *pstr
= wxMacFindFolder( (short) kOnSystemDisk
, kPreferencesFolderType
, kDontCreateFolder
);
240 return pstr
->c_str();
243 // Get hostname only (without domain name)
244 bool wxGetHostName(wxChar
*buf
, int maxSize
)
246 // Gets Chooser name of user by examining a System resource.
249 const short kComputerNameID
= -16413;
251 short oldResFile
= CurResFile();
253 StringHandle chooserName
= (StringHandle
)::GetString(kComputerNameID
);
254 UseResFile(oldResFile
);
256 if (chooserName
&& *chooserName
)
258 HLock( (Handle
) chooserName
);
259 wxString name
= wxMacMakeStringFromPascal( *chooserName
);
260 HUnlock( (Handle
) chooserName
);
261 ReleaseResource( (Handle
) chooserName
);
262 wxStrncpy( buf
, name
, maxSize
- 1 );
268 // Get user name e.g. Stefan Csomor
269 bool wxGetUserName(wxChar
*buf
, int maxSize
)
271 // Gets Chooser name of user by examining a System resource.
274 const short kChooserNameID
= -16096;
276 short oldResFile
= CurResFile();
278 StringHandle chooserName
= (StringHandle
)::GetString(kChooserNameID
);
279 UseResFile(oldResFile
);
281 if (chooserName
&& *chooserName
)
283 HLock( (Handle
) chooserName
);
284 wxString name
= wxMacMakeStringFromPascal( *chooserName
);
285 HUnlock( (Handle
) chooserName
);
286 ReleaseResource( (Handle
) chooserName
);
287 wxStrncpy( buf
, name
, maxSize
- 1 );
293 int wxKill(long pid
, wxSignal sig
, wxKillError
*rc
, int flags
)
299 WXDLLEXPORT
bool wxGetEnv(const wxString
& var
, wxString
*value
)
301 // TODO : under classic there is no environement support, under X yes
305 // set the env var name to the given value, return true on success
306 WXDLLEXPORT
bool wxSetEnv(const wxString
& var
, const wxChar
*value
)
308 // TODO : under classic there is no environement support, under X yes
312 // Execute a program in an Interactive Shell
313 bool wxShell(const wxString
& command
)
319 // Shutdown or reboot the PC
320 bool wxShutdown(wxShutdownFlags wFlags
)
326 // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX)
327 wxMemorySize
wxGetFreeMemory()
329 return (wxMemorySize
)FreeMem();
334 void wxMicroSleep(unsigned long microseconds
)
336 AbsoluteTime wakeup
= AddDurationToAbsolute( microseconds
* durationMicrosecond
, UpTime());
337 MPDelayUntil( & wakeup
);
340 void wxMilliSleep(unsigned long milliseconds
)
342 AbsoluteTime wakeup
= AddDurationToAbsolute( milliseconds
, UpTime());
343 MPDelayUntil( & wakeup
);
346 void wxSleep(int nSecs
)
348 wxMilliSleep(1000*nSecs
);
353 // Consume all events until no more left
358 #endif // !__DARWIN__
371 wxPortId
wxGUIAppTraits::GetToolkitVersion(int *verMaj
, int *verMin
) const
373 // We suppose that toolkit version is the same as OS version under Mac
374 wxGetOsVersion(verMaj
, verMin
);
379 // Reading and writing resources (eg WIN.INI, .Xdefaults)
381 bool wxWriteResource(const wxString
& section
, const wxString
& entry
, const wxString
& value
, const wxString
& file
)
387 bool wxWriteResource(const wxString
& section
, const wxString
& entry
, float value
, const wxString
& file
)
390 buf
.Printf(wxT("%.4f"), value
);
392 return wxWriteResource(section
, entry
, buf
, file
);
395 bool wxWriteResource(const wxString
& section
, const wxString
& entry
, long value
, const wxString
& file
)
398 buf
.Printf(wxT("%ld"), value
);
400 return wxWriteResource(section
, entry
, buf
, file
);
403 bool wxWriteResource(const wxString
& section
, const wxString
& entry
, int value
, const wxString
& file
)
406 buf
.Printf(wxT("%d"), value
);
408 return wxWriteResource(section
, entry
, buf
, file
);
411 bool wxGetResource(const wxString
& section
, const wxString
& entry
, char **value
, const wxString
& file
)
417 bool wxGetResource(const wxString
& section
, const wxString
& entry
, float *value
, const wxString
& file
)
420 bool succ
= wxGetResource(section
, entry
, (char **)&s
, file
);
423 *value
= (float)strtod(s
, NULL
);
430 bool wxGetResource(const wxString
& section
, const wxString
& entry
, long *value
, const wxString
& file
)
433 bool succ
= wxGetResource(section
, entry
, (char **)&s
, file
);
436 *value
= strtol(s
, NULL
, 10);
443 bool wxGetResource(const wxString
& section
, const wxString
& entry
, int *value
, const wxString
& file
)
446 bool succ
= wxGetResource(section
, entry
, (char **)&s
, file
);
449 *value
= (int)strtol(s
, NULL
, 10);
455 #endif // wxUSE_RESOURCES
457 int gs_wxBusyCursorCount
= 0;
458 extern wxCursor gMacCurrentCursor
;
459 wxCursor gMacStoredActiveCursor
;
461 // Set the cursor to the busy cursor for all windows
462 void wxBeginBusyCursor(const wxCursor
*cursor
)
464 if (gs_wxBusyCursorCount
++ == 0)
466 gMacStoredActiveCursor
= gMacCurrentCursor
;
467 cursor
->MacInstall();
469 //else: nothing to do, already set
472 // Restore cursor to normal
473 void wxEndBusyCursor()
475 wxCHECK_RET( gs_wxBusyCursorCount
> 0,
476 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
478 if (--gs_wxBusyCursorCount
== 0)
480 gMacStoredActiveCursor
.MacInstall();
481 gMacStoredActiveCursor
= wxNullCursor
;
485 // true if we're between the above two calls
488 return (gs_wxBusyCursorCount
> 0);
495 wxString
wxMacFindFolderNoSeparator( short vol
,
497 Boolean createFolder
)
502 if ( FSFindFolder( vol
, folderType
, createFolder
, &fsRef
) == noErr
)
504 strDir
= wxMacFSRefToPath( &fsRef
);
510 wxString
wxMacFindFolder( short vol
,
512 Boolean createFolder
)
514 return wxMacFindFolderNoSeparator(vol
, folderType
, createFolder
) + wxFILE_SEP_PATH
;
521 // Check whether this window wants to process messages, e.g. Stop button
522 // in long calculations.
523 bool wxCheckForInterrupt(wxWindow
*wnd
)
529 void wxGetMousePosition( int* x
, int* y
)
534 LocalToGlobal( &pt
);
539 // Return true if we have a colour display
540 bool wxColourDisplay()
545 // Returns depth of screen
549 SetRect(&globRect
, -32760, -32760, 32760, 32760);
550 GDHandle theMaxDevice
;
553 theMaxDevice
= GetMaxDevice(&globRect
);
554 if (theMaxDevice
!= NULL
)
555 theDepth
= (**(**theMaxDevice
).gdPMap
).pixelSize
;
560 // Get size of display
561 void wxDisplaySize(int *width
, int *height
)
564 GetQDGlobalsScreenBits( &screenBits
);
567 *width
= screenBits
.bounds
.right
- screenBits
.bounds
.left
;
570 *height
= screenBits
.bounds
.bottom
- screenBits
.bounds
.top
;
573 void wxDisplaySizeMM(int *width
, int *height
)
575 wxDisplaySize(width
, height
);
576 // on mac 72 is fixed (at least now;-)
577 float cvPt2Mm
= 25.4 / 72;
580 *width
= int( *width
* cvPt2Mm
);
583 *height
= int( *height
* cvPt2Mm
);
586 void wxClientDisplayRect(int *x
, int *y
, int *width
, int *height
)
590 GetAvailableWindowPositioningBounds( GetMainDevice() , &r
);
596 *width
= r
.right
- r
.left
;
598 *height
= r
.bottom
- r
.top
;
601 wxWindow
* wxFindWindowAtPoint(const wxPoint
& pt
)
603 return wxGenericFindWindowAtPoint(pt
);
610 wxString
wxGetOsDescription()
612 #ifdef WXWIN_OS_DESCRIPTION
613 // use configure generated description if available
614 return wxString(wxT("MacOS (")) + wxT(WXWIN_OS_DESCRIPTION
) + wxString(wxT(")"));
616 return wxT("MacOS"); //TODO:define further
621 wxChar
*wxGetUserHome (const wxString
& user
)
627 bool wxGetDiskSpace(const wxString
& path
, wxDiskspaceSize_t
*pTotal
, wxDiskspaceSize_t
*pFree
)
636 int pos
= p
.Find(':');
637 if ( pos
!= wxNOT_FOUND
)
645 err
= wxMacPathToFSRef( p
, &fsRef
);
648 FSVolumeRefNum vRefNum
;
649 err
= FSGetVRefNum( &fsRef
, &vRefNum
);
652 UInt64 freeBytes
, totalBytes
;
653 err
= FSGetVInfo( vRefNum
, NULL
, &freeBytes
, &totalBytes
);
657 *pTotal
= wxDiskspaceSize_t( totalBytes
);
659 *pFree
= wxDiskspaceSize_t( freeBytes
);
666 #endif // !__DARWIN__
668 //---------------------------------------------------------------------------
669 // wxMac Specific utility functions
670 //---------------------------------------------------------------------------
672 void wxMacStringToPascal( const wxString
&from
, StringPtr to
)
674 wxCharBuffer buf
= from
.mb_str( wxConvLocal
);
675 int len
= strlen(buf
);
680 memcpy( (char*) &to
[1] , buf
, len
);
683 wxString
wxMacMakeStringFromPascal( ConstStringPtr from
)
685 return wxString( (char*) &from
[1] , wxConvLocal
, from
[0] );
688 // ----------------------------------------------------------------------------
689 // Common Event Support
690 // ----------------------------------------------------------------------------
692 extern ProcessSerialNumber gAppProcess
;
696 ProcessSerialNumber psn
;
698 psn
.highLongOfPSN
= 0;
699 psn
.lowLongOfPSN
= kCurrentProcess
;
700 SameProcess( &gAppProcess
, &psn
, &isSame
);
704 OSStatus err
= noErr
;
707 // lead sometimes to race conditions, although all calls used should be thread safe ...
708 static wxMacCarbonEvent s_wakeupEvent
;
709 if ( !s_wakeupEvent
.IsValid() )
711 err
= s_wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
712 kEventAttributeNone
);
717 if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent
) )
719 s_wakeupEvent
.SetCurrentTime();
720 err
= PostEventToQueue(GetMainEventQueue(), s_wakeupEvent
,
721 kEventPriorityHigh
);
724 wxMacCarbonEvent wakeupEvent
;
725 wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
726 kEventAttributeNone
);
727 err
= PostEventToQueue(GetMainEventQueue(), wakeupEvent
,
728 kEventPriorityHigh
);
731 PostEvent( nullEvent
, 0 );
736 WakeUpProcess( &gAppProcess
);
744 // ----------------------------------------------------------------------------
745 // Native Struct Conversions
746 // ----------------------------------------------------------------------------
748 void wxMacRectToNative( const wxRect
*wx
, Rect
*n
)
752 n
->right
= wx
->x
+ wx
->width
;
753 n
->bottom
= wx
->y
+ wx
->height
;
756 void wxMacNativeToRect( const Rect
*n
, wxRect
* wx
)
760 wx
->width
= n
->right
- n
->left
;
761 wx
->height
= n
->bottom
- n
->top
;
764 void wxMacPointToNative( const wxPoint
* wx
, Point
*n
)
770 void wxMacNativeToPoint( const Point
*n
, wxPoint
* wx
)
776 // ----------------------------------------------------------------------------
777 // Carbon Event Support
778 // ----------------------------------------------------------------------------
780 OSStatus
wxMacCarbonEvent::GetParameter(EventParamName inName
, EventParamType inDesiredType
, UInt32 inBufferSize
, void * outData
)
782 return ::GetEventParameter( m_eventRef
, inName
, inDesiredType
, NULL
, inBufferSize
, NULL
, outData
);
785 OSStatus
wxMacCarbonEvent::SetParameter(EventParamName inName
, EventParamType inType
, UInt32 inBufferSize
, const void * inData
)
787 return ::SetEventParameter( m_eventRef
, inName
, inType
, inBufferSize
, inData
);
790 // ----------------------------------------------------------------------------
791 // Control Access Support
792 // ----------------------------------------------------------------------------
794 wxMacControl::wxMacControl(wxWindow
* peer
, bool isRootControl
)
798 m_isRootControl
= isRootControl
;
801 wxMacControl::wxMacControl( wxWindow
* peer
, ControlRef control
)
805 m_controlRef
= control
;
808 wxMacControl::wxMacControl( wxWindow
* peer
, WXWidget control
)
812 m_controlRef
= (ControlRef
) control
;
815 wxMacControl::~wxMacControl()
819 void wxMacControl::Init()
823 m_needsFocusRect
= false;
824 m_isRootControl
= false;
827 void wxMacControl::Dispose()
829 ::DisposeControl( m_controlRef
);
833 void wxMacControl::SetReference( SInt32 data
)
835 SetControlReference( m_controlRef
, data
);
838 OSStatus
wxMacControl::GetData(ControlPartCode inPartCode
, ResType inTag
, Size inBufferSize
, void * inOutBuffer
, Size
* outActualSize
) const
840 return ::GetControlData( m_controlRef
, inPartCode
, inTag
, inBufferSize
, inOutBuffer
, outActualSize
);
843 OSStatus
wxMacControl::GetDataSize(ControlPartCode inPartCode
, ResType inTag
, Size
* outActualSize
) const
845 return ::GetControlDataSize( m_controlRef
, inPartCode
, inTag
, outActualSize
);
848 OSStatus
wxMacControl::SetData(ControlPartCode inPartCode
, ResType inTag
, Size inSize
, const void * inData
)
850 return ::SetControlData( m_controlRef
, inPartCode
, inTag
, inSize
, inData
);
853 OSStatus
wxMacControl::SendEvent( EventRef event
, OptionBits inOptions
)
855 #if TARGET_API_MAC_OSX
856 return SendEventToEventTargetWithOptions( event
,
857 HIObjectGetEventTarget( (HIObjectRef
) m_controlRef
), inOptions
);
859 #pragma unused(inOptions)
860 return SendEventToEventTarget(event
,GetControlEventTarget( m_controlRef
) );
864 OSStatus
wxMacControl::SendHICommand( HICommand
&command
, OptionBits inOptions
)
866 wxMacCarbonEvent
event( kEventClassCommand
, kEventCommandProcess
);
868 event
.SetParameter
<HICommand
>(kEventParamDirectObject
,command
);
870 return SendEvent( event
, inOptions
);
873 OSStatus
wxMacControl::SendHICommand( UInt32 commandID
, OptionBits inOptions
)
877 memset( &command
, 0 , sizeof(command
) );
878 command
.commandID
= commandID
;
879 return SendHICommand( command
, inOptions
);
882 void wxMacControl::Flash( ControlPartCode part
, UInt32 ticks
)
884 unsigned long finalTicks
;
886 HiliteControl( m_controlRef
, part
);
887 Delay( ticks
, &finalTicks
);
888 HiliteControl( m_controlRef
, kControlNoPart
);
891 SInt32
wxMacControl::GetValue() const
893 return ::GetControl32BitValue( m_controlRef
);
896 SInt32
wxMacControl::GetMaximum() const
898 return ::GetControl32BitMaximum( m_controlRef
);
901 SInt32
wxMacControl::GetMinimum() const
903 return ::GetControl32BitMinimum( m_controlRef
);
906 void wxMacControl::SetValue( SInt32 v
)
908 ::SetControl32BitValue( m_controlRef
, v
);
911 void wxMacControl::SetMinimum( SInt32 v
)
913 ::SetControl32BitMinimum( m_controlRef
, v
);
916 void wxMacControl::SetMaximum( SInt32 v
)
918 ::SetControl32BitMaximum( m_controlRef
, v
);
921 void wxMacControl::SetValueAndRange( SInt32 value
, SInt32 minimum
, SInt32 maximum
)
923 ::SetControl32BitMinimum( m_controlRef
, minimum
);
924 ::SetControl32BitMaximum( m_controlRef
, maximum
);
925 ::SetControl32BitValue( m_controlRef
, value
);
928 OSStatus
wxMacControl::SetFocus( ControlFocusPart focusPart
)
930 return SetKeyboardFocus( GetControlOwner( m_controlRef
), m_controlRef
, focusPart
);
933 bool wxMacControl::HasFocus() const
936 GetKeyboardFocus( GetUserFocusWindow() , &control
);
937 return control
== m_controlRef
;
940 void wxMacControl::SetNeedsFocusRect( bool needs
)
942 m_needsFocusRect
= needs
;
945 bool wxMacControl::NeedsFocusRect() const
947 return m_needsFocusRect
;
950 void wxMacControl::VisibilityChanged(bool shown
)
954 void wxMacControl::SuperChangedPosition()
958 void wxMacControl::SetFont( const wxFont
& font
, const wxColour
& foreground
, long windowStyle
)
961 ControlFontStyleRec fontStyle
;
962 if ( font
.MacGetThemeFontID() != kThemeCurrentPortFont
)
964 switch ( font
.MacGetThemeFontID() )
966 case kThemeSmallSystemFont
:
967 fontStyle
.font
= kControlFontSmallSystemFont
;
970 case 109 : // mini font
974 case kThemeSystemFont
:
975 fontStyle
.font
= kControlFontBigSystemFont
;
979 fontStyle
.font
= kControlFontBigSystemFont
;
983 fontStyle
.flags
= kControlUseFontMask
;
987 fontStyle
.font
= font
.MacGetFontNum();
988 fontStyle
.style
= font
.MacGetFontStyle();
989 fontStyle
.size
= font
.MacGetFontSize();
990 fontStyle
.flags
= kControlUseFontMask
| kControlUseFaceMask
| kControlUseSizeMask
;
993 fontStyle
.just
= teJustLeft
;
994 fontStyle
.flags
|= kControlUseJustMask
;
995 if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_CENTER_HORIZONTAL
)
996 fontStyle
.just
= teJustCenter
;
997 else if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_RIGHT
)
998 fontStyle
.just
= teJustRight
;
1001 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
1002 // won't get grayed out by the system anymore
1004 if ( foreground
!= *wxBLACK
)
1006 fontStyle
.foreColor
= MAC_WXCOLORREF( foreground
.GetPixel() );
1007 fontStyle
.flags
|= kControlUseForeColorMask
;
1010 ::SetControlFontStyle( m_controlRef
, &fontStyle
);
1013 void wxMacControl::SetBackground( const wxBrush
&WXUNUSED(brush
) )
1016 // setting up a color proc is not recommended anymore
1019 void wxMacControl::SetRange( SInt32 minimum
, SInt32 maximum
)
1021 ::SetControl32BitMinimum( m_controlRef
, minimum
);
1022 ::SetControl32BitMaximum( m_controlRef
, maximum
);
1025 short wxMacControl::HandleKey( SInt16 keyCode
, SInt16 charCode
, EventModifiers modifiers
)
1027 return HandleControlKey( m_controlRef
, keyCode
, charCode
, modifiers
);
1030 void wxMacControl::SetActionProc( ControlActionUPP actionProc
)
1032 SetControlAction( m_controlRef
, actionProc
);
1035 void wxMacControl::SetViewSize( SInt32 viewSize
)
1037 SetControlViewSize(m_controlRef
, viewSize
);
1040 SInt32
wxMacControl::GetViewSize() const
1042 return GetControlViewSize( m_controlRef
);
1045 bool wxMacControl::IsVisible() const
1047 return IsControlVisible( m_controlRef
);
1050 void wxMacControl::SetVisibility( bool visible
, bool redraw
)
1052 SetControlVisibility( m_controlRef
, visible
, redraw
);
1055 bool wxMacControl::IsEnabled() const
1057 #if TARGET_API_MAC_OSX
1058 return IsControlEnabled( m_controlRef
);
1060 return IsControlActive( m_controlRef
);
1064 bool wxMacControl::IsActive() const
1066 return IsControlActive( m_controlRef
);
1069 void wxMacControl::Enable( bool enable
)
1072 EnableControl( m_controlRef
);
1074 DisableControl( m_controlRef
);
1077 void wxMacControl::SetDrawingEnabled( bool enable
)
1079 HIViewSetDrawingEnabled( m_controlRef
, enable
);
1082 bool wxMacControl::GetNeedsDisplay() const
1084 return HIViewGetNeedsDisplay( m_controlRef
);
1087 void wxMacControl::SetNeedsDisplay( RgnHandle where
)
1092 HIViewSetNeedsDisplayInRegion( m_controlRef
, where
, true );
1095 void wxMacControl::SetNeedsDisplay( Rect
* where
)
1100 if ( where
!= NULL
)
1102 RgnHandle update
= NewRgn();
1103 RectRgn( update
, where
);
1104 HIViewSetNeedsDisplayInRegion( m_controlRef
, update
, true );
1105 DisposeRgn( update
);
1108 HIViewSetNeedsDisplay( m_controlRef
, true );
1111 void wxMacControl::Convert( wxPoint
*pt
, wxMacControl
*from
, wxMacControl
*to
)
1117 HIViewConvertPoint( &hiPoint
, from
->m_controlRef
, to
->m_controlRef
);
1118 pt
->x
= (int)hiPoint
.x
;
1119 pt
->y
= (int)hiPoint
.y
;
1122 void wxMacControl::SetRect( Rect
*r
)
1124 //A HIRect is actually a CGRect on OSX - which consists of two structures -
1125 //CGPoint and CGSize, which have two floats each
1126 HIRect hir
= { { r
->left
, r
->top
}, { r
->right
- r
->left
, r
->bottom
- r
->top
} };
1127 HIViewSetFrame ( m_controlRef
, &hir
);
1128 // eventuall we might have to do a SetVisibility( false , true );
1129 // before and a SetVisibility( true , true ); after
1132 void wxMacControl::GetRect( Rect
*r
)
1134 GetControlBounds( m_controlRef
, r
);
1137 void wxMacControl::GetRectInWindowCoords( Rect
*r
)
1139 UMAGetControlBoundsInWindowCoords( m_controlRef
, r
);
1142 void wxMacControl::GetBestRect( Rect
*r
)
1144 short baselineoffset
;
1146 GetBestControlRect( m_controlRef
, r
, &baselineoffset
);
1149 void wxMacControl::SetLabel( const wxString
&title
)
1151 wxFontEncoding encoding
;
1154 encoding
= m_font
.GetEncoding();
1156 encoding
= wxFont::GetDefaultEncoding();
1158 UMASetControlTitle( m_controlRef
, title
, encoding
);
1161 void wxMacControl::GetFeatures( UInt32
* features
)
1163 GetControlFeatures( m_controlRef
, features
);
1166 OSStatus
wxMacControl::GetRegion( ControlPartCode partCode
, RgnHandle region
)
1168 OSStatus err
= GetControlRegion( m_controlRef
, partCode
, region
);
1172 OSStatus
wxMacControl::SetZOrder( bool above
, wxMacControl
* other
)
1174 #if TARGET_API_MAC_OSX
1175 return HIViewSetZOrder( m_controlRef
,above
? kHIViewZOrderAbove
: kHIViewZOrderBelow
,
1176 (other
!= NULL
) ? other
->m_controlRef
: NULL
);
1182 #if TARGET_API_MAC_OSX
1183 // SetNeedsDisplay would not invalidate the children
1184 static void InvalidateControlAndChildren( HIViewRef control
)
1186 HIViewSetNeedsDisplay( control
, true );
1187 UInt16 childrenCount
= 0;
1188 OSStatus err
= CountSubControls( control
, &childrenCount
);
1189 if ( err
== errControlIsNotEmbedder
)
1192 wxASSERT_MSG( err
== noErr
, wxT("Unexpected error when accessing subcontrols") );
1194 for ( UInt16 i
= childrenCount
; i
>=1; --i
)
1198 err
= GetIndexedSubControl( control
, i
, & child
);
1199 if ( err
== errControlIsNotEmbedder
)
1202 InvalidateControlAndChildren( child
);
1207 void wxMacControl::InvalidateWithChildren()
1209 #if TARGET_API_MAC_OSX
1210 InvalidateControlAndChildren( m_controlRef
);
1214 void wxMacControl::ScrollRect( wxRect
*r
, int dx
, int dy
)
1216 wxASSERT( r
!= NULL
);
1218 HIRect scrollarea
= CGRectMake( r
->x
, r
->y
, r
->width
, r
->height
);
1219 HIViewScrollRect ( m_controlRef
, &scrollarea
, dx
,dy
);
1222 OSType wxMacCreator
= 'WXMC';
1223 OSType wxMacControlProperty
= 'MCCT';
1225 void wxMacControl::SetReferenceInNativeControl()
1228 verify_noerr( SetControlProperty ( m_controlRef
,
1229 wxMacCreator
,wxMacControlProperty
, sizeof(data
), &data
) );
1232 wxMacControl
* wxMacControl::GetReferenceFromNativeControl(ControlRef control
)
1234 wxMacControl
* ctl
= NULL
;
1236 if ( GetControlProperty( control
,wxMacCreator
,wxMacControlProperty
, sizeof(ctl
) ,
1237 &actualSize
, &ctl
) == noErr
)
1244 // ============================================================================
1245 // DataBrowser Wrapper
1246 // ============================================================================
1248 // basing on DataBrowserItemIDs
1251 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
1253 DataBrowserItemID itemID
,
1254 DataBrowserItemNotification message
,
1255 DataBrowserItemDataRef itemData
)
1257 wxMacDataBrowserControl
* ctl
= dynamic_cast<wxMacDataBrowserControl
*>( wxMacControl::GetReferenceFromNativeControl( browser
) );
1260 ctl
->ItemNotification(itemID
, message
, itemData
);
1264 pascal OSStatus
wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
1266 DataBrowserItemID itemID
,
1267 DataBrowserPropertyID property
,
1268 DataBrowserItemDataRef itemData
,
1269 Boolean changeValue
)
1271 OSStatus err
= errDataBrowserPropertyNotSupported
;
1273 wxMacDataBrowserControl
* ctl
= dynamic_cast<wxMacDataBrowserControl
*>( wxMacControl::GetReferenceFromNativeControl( browser
) );
1276 err
= ctl
->GetSetItemData(itemID
, property
, itemData
, changeValue
);
1281 pascal Boolean
wxMacDataBrowserControl::DataBrowserCompareProc(
1283 DataBrowserItemID itemOneID
,
1284 DataBrowserItemID itemTwoID
,
1285 DataBrowserPropertyID sortProperty
)
1287 wxMacDataBrowserControl
* ctl
= dynamic_cast<wxMacDataBrowserControl
*>( wxMacControl::GetReferenceFromNativeControl( browser
) );
1290 return ctl
->CompareItems(itemOneID
, itemTwoID
, sortProperty
);
1295 DataBrowserItemDataUPP gDataBrowserItemDataUPP
= NULL
;
1296 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP
= NULL
;
1297 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP
= NULL
;
1299 wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) : wxMacControl( peer
)
1301 Rect bounds
= wxMacGetBoundsForControl( peer
, pos
, size
);
1302 OSStatus err
= ::CreateDataBrowserControl(
1303 MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),
1304 &bounds
, kDataBrowserListView
, &m_controlRef
);
1305 SetReferenceInNativeControl();
1306 verify_noerr( err
);
1307 if ( gDataBrowserItemCompareUPP
== NULL
)
1308 gDataBrowserItemCompareUPP
= NewDataBrowserItemCompareUPP(DataBrowserCompareProc
);
1309 if ( gDataBrowserItemDataUPP
== NULL
)
1310 gDataBrowserItemDataUPP
= NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc
);
1311 if ( gDataBrowserItemNotificationUPP
== NULL
)
1313 gDataBrowserItemNotificationUPP
=
1314 #if TARGET_API_MAC_OSX
1315 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc
);
1317 NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc
);
1321 DataBrowserCallbacks callbacks
;
1322 InitializeDataBrowserCallbacks( &callbacks
, kDataBrowserLatestCallbacks
);
1324 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserItemDataUPP
;
1325 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserItemCompareUPP
;
1326 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserItemNotificationUPP
;
1327 SetCallbacks( &callbacks
);
1331 OSStatus
wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container
,
1333 DataBrowserItemState state
,
1334 UInt32
*numItems
) const
1336 return GetDataBrowserItemCount( m_controlRef
, container
, recurse
, state
, numItems
);
1339 OSStatus
wxMacDataBrowserControl::GetItems( DataBrowserItemID container
,
1341 DataBrowserItemState state
,
1344 return GetDataBrowserItems( m_controlRef
, container
, recurse
, state
, items
);
1347 OSStatus
wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options
)
1349 return SetDataBrowserSelectionFlags( m_controlRef
, options
);
1352 OSStatus
wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc
*columnDesc
,
1353 DataBrowserTableViewColumnIndex position
)
1355 return AddDataBrowserListViewColumn( m_controlRef
, columnDesc
, position
);
1358 OSStatus
wxMacDataBrowserControl::AutoSizeColumns()
1360 return AutoSizeDataBrowserListViewColumns(m_controlRef
);
1363 OSStatus
wxMacDataBrowserControl::SetHasScrollBars( bool horiz
, bool vert
)
1365 return SetDataBrowserHasScrollBars( m_controlRef
, horiz
, vert
);
1368 OSStatus
wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle
)
1370 return SetDataBrowserTableViewHiliteStyle( m_controlRef
, hiliteStyle
);
1373 OSStatus
wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height
)
1375 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1378 OSStatus
wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16
*height
)
1380 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1383 OSStatus
wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks
*callbacks
)
1385 return SetDataBrowserCallbacks( m_controlRef
, callbacks
);
1388 OSStatus
wxMacDataBrowserControl::UpdateItems(
1389 DataBrowserItemID container
,
1391 const DataBrowserItemID
*items
,
1392 DataBrowserPropertyID preSortProperty
,
1393 DataBrowserPropertyID propertyID
) const
1395 return UpdateDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
, propertyID
);
1398 bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item
) const
1400 return IsDataBrowserItemSelected( m_controlRef
, item
);
1403 OSStatus
wxMacDataBrowserControl::AddItems(
1404 DataBrowserItemID container
,
1406 const DataBrowserItemID
*items
,
1407 DataBrowserPropertyID preSortProperty
)
1409 return AddDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1412 OSStatus
wxMacDataBrowserControl::RemoveItems(
1413 DataBrowserItemID container
,
1415 const DataBrowserItemID
*items
,
1416 DataBrowserPropertyID preSortProperty
)
1418 return RemoveDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1421 OSStatus
wxMacDataBrowserControl::RevealItem(
1422 DataBrowserItemID item
,
1423 DataBrowserPropertyID propertyID
,
1424 DataBrowserRevealOptions options
) const
1426 return RevealDataBrowserItem( m_controlRef
, item
, propertyID
, options
);
1429 OSStatus
wxMacDataBrowserControl::SetSelectedItems(
1431 const DataBrowserItemID
*items
,
1432 DataBrowserSetOption operation
)
1434 return SetDataBrowserSelectedItems( m_controlRef
, numItems
, items
, operation
);
1437 OSStatus
wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID
*first
, DataBrowserItemID
*last
) const
1439 return GetDataBrowserSelectionAnchor( m_controlRef
, first
, last
);
1442 OSStatus
wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
1444 return GetDataBrowserTableViewItemID( m_controlRef
, row
, item
);
1447 OSStatus
wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
1449 return GetDataBrowserTableViewItemRow( m_controlRef
, item
, row
);
1452 OSStatus
wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height
)
1454 return SetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1457 OSStatus
wxMacDataBrowserControl::GetDefaultRowHeight( UInt16
* height
) const
1459 return GetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1462 OSStatus
wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item
, UInt16 height
)
1464 return SetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1467 OSStatus
wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item
, UInt16
*height
) const
1469 return GetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1472 OSStatus
wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column
, UInt16
*width
) const
1474 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1477 OSStatus
wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column
, UInt16 width
)
1479 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1482 OSStatus
wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16
*width
) const
1484 return GetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1487 OSStatus
wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width
)
1489 return SetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1492 OSStatus
wxMacDataBrowserControl::GetColumnCount(UInt32
* numColumns
) const
1494 return GetDataBrowserTableViewColumnCount( m_controlRef
, numColumns
);
1497 OSStatus
wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column
,
1498 UInt32
*position
) const
1500 return GetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1503 OSStatus
wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column
, UInt32 position
)
1505 return SetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1508 OSStatus
wxMacDataBrowserControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
1510 return GetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1513 OSStatus
wxMacDataBrowserControl::SetScrollPosition( UInt32 top
, UInt32 left
)
1515 return SetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1518 OSStatus
wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID
*column
) const
1520 return GetDataBrowserSortProperty( m_controlRef
, column
);
1523 OSStatus
wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column
)
1525 return SetDataBrowserSortProperty( m_controlRef
, column
);
1528 OSStatus
wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder
*order
) const
1530 return GetDataBrowserSortOrder( m_controlRef
, order
);
1533 OSStatus
wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order
)
1535 return SetDataBrowserSortOrder( m_controlRef
, order
);
1538 OSStatus
wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property
,
1539 DataBrowserPropertyFlags
*flags
) const
1541 return GetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1544 OSStatus
wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property
,
1545 DataBrowserPropertyFlags flags
)
1547 return SetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1550 OSStatus
wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property
,
1551 DataBrowserListViewHeaderDesc
*desc
) const
1553 return GetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1556 OSStatus
wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property
,
1557 DataBrowserListViewHeaderDesc
*desc
)
1559 return SetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1562 OSStatus
wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property
,
1563 Boolean expandableRows
)
1565 return SetDataBrowserListViewDisclosureColumn( m_controlRef
, property
, expandableRows
);
1568 // ============================================================================
1569 // Higher-level Databrowser
1570 // ============================================================================
1572 // basing on data item objects
1575 wxMacDataItem::wxMacDataItem()
1579 wxMacDataItem::~wxMacDataItem()
1583 bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl
*owner
,
1584 const wxMacDataItem
*,
1585 DataBrowserPropertyID property
) const
1590 OSStatus
wxMacDataItem::GetSetData(wxMacDataItemBrowserControl
*owner
,
1591 DataBrowserPropertyID property
,
1592 DataBrowserItemDataRef itemData
,
1595 return errDataBrowserPropertyNotSupported
;
1598 void wxMacDataItem::Notification(wxMacDataItemBrowserControl
*owner
,
1599 DataBrowserItemNotification message
,
1600 DataBrowserItemDataRef itemData
) const
1605 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) :
1606 wxMacDataBrowserControl( peer
, pos
, size
, style
)
1608 m_suppressSelection
= false;
1611 wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl
*browser
)
1613 m_former
= browser
->SuppressSelection(true);
1614 m_browser
= browser
;
1617 wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1619 m_browser
->SuppressSelection(m_former
);
1622 bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress
)
1624 bool former
= m_suppressSelection
;
1625 m_suppressSelection
= suppress
;
1630 Boolean
wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID
,
1631 DataBrowserItemID itemTwoID
,
1632 DataBrowserPropertyID sortProperty
)
1634 wxMacDataItem
* itemOne
= (wxMacDataItem
*) itemOneID
;
1635 wxMacDataItem
* itemTwo
= (wxMacDataItem
*) itemTwoID
;
1636 return CompareItems( itemOne
, itemTwo
, sortProperty
);
1639 Boolean
wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem
* itemOne
,
1640 const wxMacDataItem
* itemTwo
,
1641 DataBrowserPropertyID sortProperty
)
1643 Boolean retval
= false;
1644 if ( itemOne
!= NULL
)
1645 retval
= itemOne
->IsLessThan( this , itemTwo
, sortProperty
);
1649 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1650 DataBrowserItemID itemID
,
1651 DataBrowserPropertyID property
,
1652 DataBrowserItemDataRef itemData
,
1653 Boolean changeValue
)
1655 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1656 return GetSetItemData(item
, property
, itemData
, changeValue
);
1659 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1660 wxMacDataItem
* item
,
1661 DataBrowserPropertyID property
,
1662 DataBrowserItemDataRef itemData
,
1663 Boolean changeValue
)
1665 OSStatus err
= errDataBrowserPropertyNotSupported
;
1668 case kDataBrowserContainerIsClosableProperty
:
1669 case kDataBrowserContainerIsSortableProperty
:
1670 case kDataBrowserContainerIsOpenableProperty
:
1671 // right now default behaviour on these
1675 err
= item
->GetSetData( this, property
, itemData
, changeValue
);
1682 void wxMacDataItemBrowserControl::ItemNotification(
1683 DataBrowserItemID itemID
,
1684 DataBrowserItemNotification message
,
1685 DataBrowserItemDataRef itemData
)
1687 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1688 ItemNotification( item
, message
, itemData
);
1691 void wxMacDataItemBrowserControl::ItemNotification(
1692 const wxMacDataItem
* item
,
1693 DataBrowserItemNotification message
,
1694 DataBrowserItemDataRef itemData
)
1697 item
->Notification( this, message
, itemData
);
1700 unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem
* container
,
1701 bool recurse
, DataBrowserItemState state
) const
1703 UInt32 numItems
= 0;
1704 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID
)container
,
1705 recurse
, state
, &numItems
) );
1709 void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem
* container
,
1710 bool recurse
, DataBrowserItemState state
, wxArrayMacDataItemPtr
&items
) const
1712 Handle handle
= NewHandle(0);
1713 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID
)container
,
1714 recurse
, state
, handle
) );
1716 int itemCount
= GetHandleSize(handle
)/sizeof(DataBrowserItemID
);
1718 wxMacDataItemPtr
* itemsArray
= (wxMacDataItemPtr
*) *handle
;
1719 for ( int i
= 0; i
< itemCount
; ++i
)
1721 items
.Add(itemsArray
[i
]);
1724 DisposeHandle( handle
);
1727 unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem
* item
) const
1729 DataBrowserTableViewRowIndex row
;
1730 OSStatus err
= GetItemRow( (DataBrowserItemID
) item
, &row
);
1731 wxASSERT( err
== noErr
);
1735 wxMacDataItem
* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n
) const
1737 DataBrowserItemID id
;
1738 OSStatus err
= GetItemID( (DataBrowserTableViewRowIndex
) n
, &id
);
1739 wxASSERT( err
== noErr
);
1740 return (wxMacDataItem
*) id
;
1743 void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem
*container
,
1744 const wxMacDataItem
*item
, DataBrowserPropertyID property
) const
1746 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, 1,
1747 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1750 void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem
*container
,
1751 wxArrayMacDataItemPtr
&itemArray
, DataBrowserPropertyID property
) const
1753 unsigned int noItems
= itemArray
.GetCount();
1754 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1755 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1756 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1758 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, noItems
,
1759 items
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1763 void wxMacDataItemBrowserControl::AddItem(wxMacDataItem
*container
, wxMacDataItem
*item
)
1765 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, 1,
1766 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
) );
1769 void wxMacDataItemBrowserControl::AddItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1771 unsigned int noItems
= itemArray
.GetCount();
1772 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1773 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1774 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1776 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, noItems
,
1777 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
) );
1781 void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem
*container
, wxMacDataItem
* item
)
1783 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 1,
1784 (UInt32
*) &item
, kDataBrowserItemNoProperty
);
1785 verify_noerr( err
);
1788 void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1790 unsigned int noItems
= itemArray
.GetCount();
1791 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1792 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1793 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1795 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, noItems
,
1796 (UInt32
*) items
, kDataBrowserItemNoProperty
);
1797 verify_noerr( err
);
1801 void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem
*container
)
1803 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 0 , NULL
, kDataBrowserItemNoProperty
);
1804 verify_noerr( err
);
1807 void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem
* item
, DataBrowserSetOption option
)
1809 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID
*) &item
, option
));
1812 void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option
)
1814 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL
, option
));
1817 void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr
&itemArray
, DataBrowserSetOption option
)
1819 unsigned int noItems
= itemArray
.GetCount();
1820 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1821 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1822 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1824 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems
, (DataBrowserItemID
*) items
, option
));
1828 Boolean
wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem
* item
) const
1830 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID
) item
);
1833 void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem
* item
, DataBrowserRevealOptions options
)
1835 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID
) item
, kDataBrowserNoItem
, options
) );
1838 void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr
* first
, wxMacDataItemPtr
* last
) const
1840 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID
*) first
, (DataBrowserItemID
*) last
) );
1849 OSStatus
wxMacControl::SetTabEnabled( SInt16 tabNo
, bool enable
)
1851 return ::SetTabEnabled( m_controlRef
, tabNo
, enable
);
1858 #ifdef __WXMAC_OSX__
1859 // snippets from Sketch Sample from Apple :
1861 #define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc"
1864 This function locates, opens, and returns the profile reference for the calibrated
1865 Generic RGB color space. It is up to the caller to call CMCloseProfile when done
1866 with the profile reference this function returns.
1868 CMProfileRef
wxMacOpenGenericProfile()
1870 static CMProfileRef cachedRGBProfileRef
= NULL
;
1872 // we only create the profile reference once
1873 if (cachedRGBProfileRef
== NULL
)
1875 CMProfileLocation loc
;
1877 loc
.locType
= cmPathBasedProfile
;
1878 strcpy(loc
.u
.pathLoc
.path
, kGenericRGBProfilePathStr
);
1880 verify_noerr( CMOpenProfile(&cachedRGBProfileRef
, &loc
) );
1883 // clone the profile reference so that the caller has their own reference, not our cached one
1884 if (cachedRGBProfileRef
)
1885 CMCloneProfileRef(cachedRGBProfileRef
);
1887 return cachedRGBProfileRef
;
1891 Return the generic RGB color space. This is a 'get' function and the caller should
1892 not release the returned value unless the caller retains it first. Usually callers
1893 of this routine will immediately use the returned colorspace with CoreGraphics
1894 so they typically do not need to retain it themselves.
1896 This function creates the generic RGB color space once and hangs onto it so it can
1897 return it whenever this function is called.
1900 CGColorSpaceRef
wxMacGetGenericRGBColorSpace()
1902 static wxMacCFRefHolder
<CGColorSpaceRef
> genericRGBColorSpace
;
1904 if (genericRGBColorSpace
== NULL
)
1906 if ( UMAGetSystemVersion() >= 0x1040 )
1908 genericRGBColorSpace
.Set( CGColorSpaceCreateWithName( CFSTR("kCGColorSpaceGenericRGB") ) );
1912 CMProfileRef genericRGBProfile
= wxMacOpenGenericProfile();
1914 if (genericRGBProfile
)
1916 genericRGBColorSpace
.Set( CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile
) );
1918 wxASSERT_MSG( genericRGBColorSpace
!= NULL
, wxT("couldn't create the generic RGB color space") );
1920 // we opened the profile so it is up to us to close it
1921 CMCloseProfile(genericRGBProfile
);
1926 return genericRGBColorSpace
;
1930 wxMacPortSaver::wxMacPortSaver( GrafPtr port
)
1932 ::GetPort( &m_port
);
1936 wxMacPortSaver::~wxMacPortSaver()
1938 ::SetPort( m_port
);