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 wxASSERT_MSG( IsValidControlHandle(m_controlRef
) , wxT("Invalid Control Handle (maybe already released) in Dispose") );
831 CFIndex count
= CFGetRetainCount( m_controlRef
) ;
832 wxASSERT_MSG( count
== 1 , wxT("Reference Count of native control was not 1 in Dispose") );
834 ::DisposeControl( m_controlRef
);
838 void wxMacControl::SetReference( SInt32 data
)
840 SetControlReference( m_controlRef
, data
);
843 OSStatus
wxMacControl::GetData(ControlPartCode inPartCode
, ResType inTag
, Size inBufferSize
, void * inOutBuffer
, Size
* outActualSize
) const
845 return ::GetControlData( m_controlRef
, inPartCode
, inTag
, inBufferSize
, inOutBuffer
, outActualSize
);
848 OSStatus
wxMacControl::GetDataSize(ControlPartCode inPartCode
, ResType inTag
, Size
* outActualSize
) const
850 return ::GetControlDataSize( m_controlRef
, inPartCode
, inTag
, outActualSize
);
853 OSStatus
wxMacControl::SetData(ControlPartCode inPartCode
, ResType inTag
, Size inSize
, const void * inData
)
855 return ::SetControlData( m_controlRef
, inPartCode
, inTag
, inSize
, inData
);
858 OSStatus
wxMacControl::SendEvent( EventRef event
, OptionBits inOptions
)
860 #if TARGET_API_MAC_OSX
861 return SendEventToEventTargetWithOptions( event
,
862 HIObjectGetEventTarget( (HIObjectRef
) m_controlRef
), inOptions
);
864 #pragma unused(inOptions)
865 return SendEventToEventTarget(event
,GetControlEventTarget( m_controlRef
) );
869 OSStatus
wxMacControl::SendHICommand( HICommand
&command
, OptionBits inOptions
)
871 wxMacCarbonEvent
event( kEventClassCommand
, kEventCommandProcess
);
873 event
.SetParameter
<HICommand
>(kEventParamDirectObject
,command
);
875 return SendEvent( event
, inOptions
);
878 OSStatus
wxMacControl::SendHICommand( UInt32 commandID
, OptionBits inOptions
)
882 memset( &command
, 0 , sizeof(command
) );
883 command
.commandID
= commandID
;
884 return SendHICommand( command
, inOptions
);
887 void wxMacControl::Flash( ControlPartCode part
, UInt32 ticks
)
889 unsigned long finalTicks
;
891 HiliteControl( m_controlRef
, part
);
892 Delay( ticks
, &finalTicks
);
893 HiliteControl( m_controlRef
, kControlNoPart
);
896 SInt32
wxMacControl::GetValue() const
898 return ::GetControl32BitValue( m_controlRef
);
901 SInt32
wxMacControl::GetMaximum() const
903 return ::GetControl32BitMaximum( m_controlRef
);
906 SInt32
wxMacControl::GetMinimum() const
908 return ::GetControl32BitMinimum( m_controlRef
);
911 void wxMacControl::SetValue( SInt32 v
)
913 ::SetControl32BitValue( m_controlRef
, v
);
916 void wxMacControl::SetMinimum( SInt32 v
)
918 ::SetControl32BitMinimum( m_controlRef
, v
);
921 void wxMacControl::SetMaximum( SInt32 v
)
923 ::SetControl32BitMaximum( m_controlRef
, v
);
926 void wxMacControl::SetValueAndRange( SInt32 value
, SInt32 minimum
, SInt32 maximum
)
928 ::SetControl32BitMinimum( m_controlRef
, minimum
);
929 ::SetControl32BitMaximum( m_controlRef
, maximum
);
930 ::SetControl32BitValue( m_controlRef
, value
);
933 OSStatus
wxMacControl::SetFocus( ControlFocusPart focusPart
)
935 return SetKeyboardFocus( GetControlOwner( m_controlRef
), m_controlRef
, focusPart
);
938 bool wxMacControl::HasFocus() const
941 GetKeyboardFocus( GetUserFocusWindow() , &control
);
942 return control
== m_controlRef
;
945 void wxMacControl::SetNeedsFocusRect( bool needs
)
947 m_needsFocusRect
= needs
;
950 bool wxMacControl::NeedsFocusRect() const
952 return m_needsFocusRect
;
955 void wxMacControl::VisibilityChanged(bool shown
)
959 void wxMacControl::SuperChangedPosition()
963 void wxMacControl::SetFont( const wxFont
& font
, const wxColour
& foreground
, long windowStyle
)
966 ControlFontStyleRec fontStyle
;
967 if ( font
.MacGetThemeFontID() != kThemeCurrentPortFont
)
969 switch ( font
.MacGetThemeFontID() )
971 case kThemeSmallSystemFont
:
972 fontStyle
.font
= kControlFontSmallSystemFont
;
975 case 109 : // mini font
979 case kThemeSystemFont
:
980 fontStyle
.font
= kControlFontBigSystemFont
;
984 fontStyle
.font
= kControlFontBigSystemFont
;
988 fontStyle
.flags
= kControlUseFontMask
;
992 fontStyle
.font
= font
.MacGetFontNum();
993 fontStyle
.style
= font
.MacGetFontStyle();
994 fontStyle
.size
= font
.MacGetFontSize();
995 fontStyle
.flags
= kControlUseFontMask
| kControlUseFaceMask
| kControlUseSizeMask
;
998 fontStyle
.just
= teJustLeft
;
999 fontStyle
.flags
|= kControlUseJustMask
;
1000 if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_CENTER_HORIZONTAL
)
1001 fontStyle
.just
= teJustCenter
;
1002 else if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_RIGHT
)
1003 fontStyle
.just
= teJustRight
;
1006 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
1007 // won't get grayed out by the system anymore
1009 if ( foreground
!= *wxBLACK
)
1011 fontStyle
.foreColor
= MAC_WXCOLORREF( foreground
.GetPixel() );
1012 fontStyle
.flags
|= kControlUseForeColorMask
;
1015 ::SetControlFontStyle( m_controlRef
, &fontStyle
);
1018 void wxMacControl::SetBackground( const wxBrush
&WXUNUSED(brush
) )
1021 // setting up a color proc is not recommended anymore
1024 void wxMacControl::SetRange( SInt32 minimum
, SInt32 maximum
)
1026 ::SetControl32BitMinimum( m_controlRef
, minimum
);
1027 ::SetControl32BitMaximum( m_controlRef
, maximum
);
1030 short wxMacControl::HandleKey( SInt16 keyCode
, SInt16 charCode
, EventModifiers modifiers
)
1032 return HandleControlKey( m_controlRef
, keyCode
, charCode
, modifiers
);
1035 void wxMacControl::SetActionProc( ControlActionUPP actionProc
)
1037 SetControlAction( m_controlRef
, actionProc
);
1040 void wxMacControl::SetViewSize( SInt32 viewSize
)
1042 SetControlViewSize(m_controlRef
, viewSize
);
1045 SInt32
wxMacControl::GetViewSize() const
1047 return GetControlViewSize( m_controlRef
);
1050 bool wxMacControl::IsVisible() const
1052 return IsControlVisible( m_controlRef
);
1055 void wxMacControl::SetVisibility( bool visible
, bool redraw
)
1057 SetControlVisibility( m_controlRef
, visible
, redraw
);
1060 bool wxMacControl::IsEnabled() const
1062 #if TARGET_API_MAC_OSX
1063 return IsControlEnabled( m_controlRef
);
1065 return IsControlActive( m_controlRef
);
1069 bool wxMacControl::IsActive() const
1071 return IsControlActive( m_controlRef
);
1074 void wxMacControl::Enable( bool enable
)
1077 EnableControl( m_controlRef
);
1079 DisableControl( m_controlRef
);
1082 void wxMacControl::SetDrawingEnabled( bool enable
)
1084 HIViewSetDrawingEnabled( m_controlRef
, enable
);
1087 bool wxMacControl::GetNeedsDisplay() const
1089 return HIViewGetNeedsDisplay( m_controlRef
);
1092 void wxMacControl::SetNeedsDisplay( RgnHandle where
)
1097 HIViewSetNeedsDisplayInRegion( m_controlRef
, where
, true );
1100 void wxMacControl::SetNeedsDisplay( Rect
* where
)
1105 if ( where
!= NULL
)
1107 RgnHandle update
= NewRgn();
1108 RectRgn( update
, where
);
1109 HIViewSetNeedsDisplayInRegion( m_controlRef
, update
, true );
1110 DisposeRgn( update
);
1113 HIViewSetNeedsDisplay( m_controlRef
, true );
1116 void wxMacControl::Convert( wxPoint
*pt
, wxMacControl
*from
, wxMacControl
*to
)
1122 HIViewConvertPoint( &hiPoint
, from
->m_controlRef
, to
->m_controlRef
);
1123 pt
->x
= (int)hiPoint
.x
;
1124 pt
->y
= (int)hiPoint
.y
;
1127 void wxMacControl::SetRect( Rect
*r
)
1129 //A HIRect is actually a CGRect on OSX - which consists of two structures -
1130 //CGPoint and CGSize, which have two floats each
1131 HIRect hir
= { { r
->left
, r
->top
}, { r
->right
- r
->left
, r
->bottom
- r
->top
} };
1132 HIViewSetFrame ( m_controlRef
, &hir
);
1133 // eventuall we might have to do a SetVisibility( false , true );
1134 // before and a SetVisibility( true , true ); after
1137 void wxMacControl::GetRect( Rect
*r
)
1139 GetControlBounds( m_controlRef
, r
);
1142 void wxMacControl::GetRectInWindowCoords( Rect
*r
)
1144 UMAGetControlBoundsInWindowCoords( m_controlRef
, r
);
1147 void wxMacControl::GetBestRect( Rect
*r
)
1149 short baselineoffset
;
1151 GetBestControlRect( m_controlRef
, r
, &baselineoffset
);
1154 void wxMacControl::SetLabel( const wxString
&title
)
1156 wxFontEncoding encoding
;
1159 encoding
= m_font
.GetEncoding();
1161 encoding
= wxFont::GetDefaultEncoding();
1163 UMASetControlTitle( m_controlRef
, title
, encoding
);
1166 void wxMacControl::GetFeatures( UInt32
* features
)
1168 GetControlFeatures( m_controlRef
, features
);
1171 OSStatus
wxMacControl::GetRegion( ControlPartCode partCode
, RgnHandle region
)
1173 OSStatus err
= GetControlRegion( m_controlRef
, partCode
, region
);
1177 OSStatus
wxMacControl::SetZOrder( bool above
, wxMacControl
* other
)
1179 #if TARGET_API_MAC_OSX
1180 return HIViewSetZOrder( m_controlRef
,above
? kHIViewZOrderAbove
: kHIViewZOrderBelow
,
1181 (other
!= NULL
) ? other
->m_controlRef
: NULL
);
1187 #if TARGET_API_MAC_OSX
1188 // SetNeedsDisplay would not invalidate the children
1189 static void InvalidateControlAndChildren( HIViewRef control
)
1191 HIViewSetNeedsDisplay( control
, true );
1192 UInt16 childrenCount
= 0;
1193 OSStatus err
= CountSubControls( control
, &childrenCount
);
1194 if ( err
== errControlIsNotEmbedder
)
1197 wxASSERT_MSG( err
== noErr
, wxT("Unexpected error when accessing subcontrols") );
1199 for ( UInt16 i
= childrenCount
; i
>=1; --i
)
1203 err
= GetIndexedSubControl( control
, i
, & child
);
1204 if ( err
== errControlIsNotEmbedder
)
1207 InvalidateControlAndChildren( child
);
1212 void wxMacControl::InvalidateWithChildren()
1214 #if TARGET_API_MAC_OSX
1215 InvalidateControlAndChildren( m_controlRef
);
1219 void wxMacControl::ScrollRect( wxRect
*r
, int dx
, int dy
)
1221 wxASSERT( r
!= NULL
);
1223 HIRect scrollarea
= CGRectMake( r
->x
, r
->y
, r
->width
, r
->height
);
1224 HIViewScrollRect ( m_controlRef
, &scrollarea
, dx
,dy
);
1227 OSType wxMacCreator
= 'WXMC';
1228 OSType wxMacControlProperty
= 'MCCT';
1230 void wxMacControl::SetReferenceInNativeControl()
1233 verify_noerr( SetControlProperty ( m_controlRef
,
1234 wxMacCreator
,wxMacControlProperty
, sizeof(data
), &data
) );
1237 wxMacControl
* wxMacControl::GetReferenceFromNativeControl(ControlRef control
)
1239 wxMacControl
* ctl
= NULL
;
1241 if ( GetControlProperty( control
,wxMacCreator
,wxMacControlProperty
, sizeof(ctl
) ,
1242 &actualSize
, &ctl
) == noErr
)
1249 // ============================================================================
1250 // DataBrowser Wrapper
1251 // ============================================================================
1253 // basing on DataBrowserItemIDs
1256 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
1258 DataBrowserItemID itemID
,
1259 DataBrowserItemNotification message
,
1260 DataBrowserItemDataRef itemData
)
1262 wxMacDataBrowserControl
* ctl
= dynamic_cast<wxMacDataBrowserControl
*>( wxMacControl::GetReferenceFromNativeControl( browser
) );
1265 ctl
->ItemNotification(itemID
, message
, itemData
);
1269 pascal OSStatus
wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
1271 DataBrowserItemID itemID
,
1272 DataBrowserPropertyID property
,
1273 DataBrowserItemDataRef itemData
,
1274 Boolean changeValue
)
1276 OSStatus err
= errDataBrowserPropertyNotSupported
;
1278 wxMacDataBrowserControl
* ctl
= dynamic_cast<wxMacDataBrowserControl
*>( wxMacControl::GetReferenceFromNativeControl( browser
) );
1281 err
= ctl
->GetSetItemData(itemID
, property
, itemData
, changeValue
);
1286 pascal Boolean
wxMacDataBrowserControl::DataBrowserCompareProc(
1288 DataBrowserItemID itemOneID
,
1289 DataBrowserItemID itemTwoID
,
1290 DataBrowserPropertyID sortProperty
)
1292 wxMacDataBrowserControl
* ctl
= dynamic_cast<wxMacDataBrowserControl
*>( wxMacControl::GetReferenceFromNativeControl( browser
) );
1295 return ctl
->CompareItems(itemOneID
, itemTwoID
, sortProperty
);
1300 DataBrowserItemDataUPP gDataBrowserItemDataUPP
= NULL
;
1301 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP
= NULL
;
1302 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP
= NULL
;
1304 wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) : wxMacControl( peer
)
1306 Rect bounds
= wxMacGetBoundsForControl( peer
, pos
, size
);
1307 OSStatus err
= ::CreateDataBrowserControl(
1308 MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),
1309 &bounds
, kDataBrowserListView
, &m_controlRef
);
1310 SetReferenceInNativeControl();
1311 verify_noerr( err
);
1312 if ( gDataBrowserItemCompareUPP
== NULL
)
1313 gDataBrowserItemCompareUPP
= NewDataBrowserItemCompareUPP(DataBrowserCompareProc
);
1314 if ( gDataBrowserItemDataUPP
== NULL
)
1315 gDataBrowserItemDataUPP
= NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc
);
1316 if ( gDataBrowserItemNotificationUPP
== NULL
)
1318 gDataBrowserItemNotificationUPP
=
1319 #if TARGET_API_MAC_OSX
1320 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc
);
1322 NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc
);
1326 DataBrowserCallbacks callbacks
;
1327 InitializeDataBrowserCallbacks( &callbacks
, kDataBrowserLatestCallbacks
);
1329 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserItemDataUPP
;
1330 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserItemCompareUPP
;
1331 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserItemNotificationUPP
;
1332 SetCallbacks( &callbacks
);
1336 OSStatus
wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container
,
1338 DataBrowserItemState state
,
1339 UInt32
*numItems
) const
1341 return GetDataBrowserItemCount( m_controlRef
, container
, recurse
, state
, numItems
);
1344 OSStatus
wxMacDataBrowserControl::GetItems( DataBrowserItemID container
,
1346 DataBrowserItemState state
,
1349 return GetDataBrowserItems( m_controlRef
, container
, recurse
, state
, items
);
1352 OSStatus
wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options
)
1354 return SetDataBrowserSelectionFlags( m_controlRef
, options
);
1357 OSStatus
wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc
*columnDesc
,
1358 DataBrowserTableViewColumnIndex position
)
1360 return AddDataBrowserListViewColumn( m_controlRef
, columnDesc
, position
);
1363 OSStatus
wxMacDataBrowserControl::AutoSizeColumns()
1365 return AutoSizeDataBrowserListViewColumns(m_controlRef
);
1368 OSStatus
wxMacDataBrowserControl::SetHasScrollBars( bool horiz
, bool vert
)
1370 return SetDataBrowserHasScrollBars( m_controlRef
, horiz
, vert
);
1373 OSStatus
wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle
)
1375 return SetDataBrowserTableViewHiliteStyle( m_controlRef
, hiliteStyle
);
1378 OSStatus
wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height
)
1380 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1383 OSStatus
wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16
*height
)
1385 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1388 OSStatus
wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks
*callbacks
)
1390 return SetDataBrowserCallbacks( m_controlRef
, callbacks
);
1393 OSStatus
wxMacDataBrowserControl::UpdateItems(
1394 DataBrowserItemID container
,
1396 const DataBrowserItemID
*items
,
1397 DataBrowserPropertyID preSortProperty
,
1398 DataBrowserPropertyID propertyID
) const
1400 return UpdateDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
, propertyID
);
1403 bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item
) const
1405 return IsDataBrowserItemSelected( m_controlRef
, item
);
1408 OSStatus
wxMacDataBrowserControl::AddItems(
1409 DataBrowserItemID container
,
1411 const DataBrowserItemID
*items
,
1412 DataBrowserPropertyID preSortProperty
)
1414 return AddDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1417 OSStatus
wxMacDataBrowserControl::RemoveItems(
1418 DataBrowserItemID container
,
1420 const DataBrowserItemID
*items
,
1421 DataBrowserPropertyID preSortProperty
)
1423 return RemoveDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1426 OSStatus
wxMacDataBrowserControl::RevealItem(
1427 DataBrowserItemID item
,
1428 DataBrowserPropertyID propertyID
,
1429 DataBrowserRevealOptions options
) const
1431 return RevealDataBrowserItem( m_controlRef
, item
, propertyID
, options
);
1434 OSStatus
wxMacDataBrowserControl::SetSelectedItems(
1436 const DataBrowserItemID
*items
,
1437 DataBrowserSetOption operation
)
1439 return SetDataBrowserSelectedItems( m_controlRef
, numItems
, items
, operation
);
1442 OSStatus
wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID
*first
, DataBrowserItemID
*last
) const
1444 return GetDataBrowserSelectionAnchor( m_controlRef
, first
, last
);
1447 OSStatus
wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
1449 return GetDataBrowserTableViewItemID( m_controlRef
, row
, item
);
1452 OSStatus
wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
1454 return GetDataBrowserTableViewItemRow( m_controlRef
, item
, row
);
1457 OSStatus
wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height
)
1459 return SetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1462 OSStatus
wxMacDataBrowserControl::GetDefaultRowHeight( UInt16
* height
) const
1464 return GetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1467 OSStatus
wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item
, UInt16 height
)
1469 return SetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1472 OSStatus
wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item
, UInt16
*height
) const
1474 return GetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1477 OSStatus
wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column
, UInt16
*width
) const
1479 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1482 OSStatus
wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column
, UInt16 width
)
1484 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1487 OSStatus
wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16
*width
) const
1489 return GetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1492 OSStatus
wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width
)
1494 return SetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1497 OSStatus
wxMacDataBrowserControl::GetColumnCount(UInt32
* numColumns
) const
1499 return GetDataBrowserTableViewColumnCount( m_controlRef
, numColumns
);
1502 OSStatus
wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column
,
1503 UInt32
*position
) const
1505 return GetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1508 OSStatus
wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column
, UInt32 position
)
1510 return SetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1513 OSStatus
wxMacDataBrowserControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
1515 return GetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1518 OSStatus
wxMacDataBrowserControl::SetScrollPosition( UInt32 top
, UInt32 left
)
1520 return SetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1523 OSStatus
wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID
*column
) const
1525 return GetDataBrowserSortProperty( m_controlRef
, column
);
1528 OSStatus
wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column
)
1530 return SetDataBrowserSortProperty( m_controlRef
, column
);
1533 OSStatus
wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder
*order
) const
1535 return GetDataBrowserSortOrder( m_controlRef
, order
);
1538 OSStatus
wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order
)
1540 return SetDataBrowserSortOrder( m_controlRef
, order
);
1543 OSStatus
wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property
,
1544 DataBrowserPropertyFlags
*flags
) const
1546 return GetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1549 OSStatus
wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property
,
1550 DataBrowserPropertyFlags flags
)
1552 return SetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1555 OSStatus
wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property
,
1556 DataBrowserListViewHeaderDesc
*desc
) const
1558 return GetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1561 OSStatus
wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property
,
1562 DataBrowserListViewHeaderDesc
*desc
)
1564 return SetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1567 OSStatus
wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property
,
1568 Boolean expandableRows
)
1570 return SetDataBrowserListViewDisclosureColumn( m_controlRef
, property
, expandableRows
);
1573 // ============================================================================
1574 // Higher-level Databrowser
1575 // ============================================================================
1577 // basing on data item objects
1580 wxMacDataItem::wxMacDataItem()
1584 wxMacDataItem::~wxMacDataItem()
1588 bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl
*owner
,
1589 const wxMacDataItem
*,
1590 DataBrowserPropertyID property
) const
1595 OSStatus
wxMacDataItem::GetSetData(wxMacDataItemBrowserControl
*owner
,
1596 DataBrowserPropertyID property
,
1597 DataBrowserItemDataRef itemData
,
1600 return errDataBrowserPropertyNotSupported
;
1603 void wxMacDataItem::Notification(wxMacDataItemBrowserControl
*owner
,
1604 DataBrowserItemNotification message
,
1605 DataBrowserItemDataRef itemData
) const
1610 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) :
1611 wxMacDataBrowserControl( peer
, pos
, size
, style
)
1613 m_suppressSelection
= false;
1616 wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl
*browser
)
1618 m_former
= browser
->SuppressSelection(true);
1619 m_browser
= browser
;
1622 wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1624 m_browser
->SuppressSelection(m_former
);
1627 bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress
)
1629 bool former
= m_suppressSelection
;
1630 m_suppressSelection
= suppress
;
1635 Boolean
wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID
,
1636 DataBrowserItemID itemTwoID
,
1637 DataBrowserPropertyID sortProperty
)
1639 wxMacDataItem
* itemOne
= (wxMacDataItem
*) itemOneID
;
1640 wxMacDataItem
* itemTwo
= (wxMacDataItem
*) itemTwoID
;
1641 return CompareItems( itemOne
, itemTwo
, sortProperty
);
1644 Boolean
wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem
* itemOne
,
1645 const wxMacDataItem
* itemTwo
,
1646 DataBrowserPropertyID sortProperty
)
1648 Boolean retval
= false;
1649 if ( itemOne
!= NULL
)
1650 retval
= itemOne
->IsLessThan( this , itemTwo
, sortProperty
);
1654 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1655 DataBrowserItemID itemID
,
1656 DataBrowserPropertyID property
,
1657 DataBrowserItemDataRef itemData
,
1658 Boolean changeValue
)
1660 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1661 return GetSetItemData(item
, property
, itemData
, changeValue
);
1664 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1665 wxMacDataItem
* item
,
1666 DataBrowserPropertyID property
,
1667 DataBrowserItemDataRef itemData
,
1668 Boolean changeValue
)
1670 OSStatus err
= errDataBrowserPropertyNotSupported
;
1673 case kDataBrowserContainerIsClosableProperty
:
1674 case kDataBrowserContainerIsSortableProperty
:
1675 case kDataBrowserContainerIsOpenableProperty
:
1676 // right now default behaviour on these
1680 err
= item
->GetSetData( this, property
, itemData
, changeValue
);
1687 void wxMacDataItemBrowserControl::ItemNotification(
1688 DataBrowserItemID itemID
,
1689 DataBrowserItemNotification message
,
1690 DataBrowserItemDataRef itemData
)
1692 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1693 ItemNotification( item
, message
, itemData
);
1696 void wxMacDataItemBrowserControl::ItemNotification(
1697 const wxMacDataItem
* item
,
1698 DataBrowserItemNotification message
,
1699 DataBrowserItemDataRef itemData
)
1702 item
->Notification( this, message
, itemData
);
1705 unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem
* container
,
1706 bool recurse
, DataBrowserItemState state
) const
1708 UInt32 numItems
= 0;
1709 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID
)container
,
1710 recurse
, state
, &numItems
) );
1714 void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem
* container
,
1715 bool recurse
, DataBrowserItemState state
, wxArrayMacDataItemPtr
&items
) const
1717 Handle handle
= NewHandle(0);
1718 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID
)container
,
1719 recurse
, state
, handle
) );
1721 int itemCount
= GetHandleSize(handle
)/sizeof(DataBrowserItemID
);
1723 wxMacDataItemPtr
* itemsArray
= (wxMacDataItemPtr
*) *handle
;
1724 for ( int i
= 0; i
< itemCount
; ++i
)
1726 items
.Add(itemsArray
[i
]);
1729 DisposeHandle( handle
);
1732 unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem
* item
) const
1734 DataBrowserTableViewRowIndex row
;
1735 OSStatus err
= GetItemRow( (DataBrowserItemID
) item
, &row
);
1736 wxASSERT( err
== noErr
);
1740 wxMacDataItem
* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n
) const
1742 DataBrowserItemID id
;
1743 OSStatus err
= GetItemID( (DataBrowserTableViewRowIndex
) n
, &id
);
1744 wxASSERT( err
== noErr
);
1745 return (wxMacDataItem
*) id
;
1748 void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem
*container
,
1749 const wxMacDataItem
*item
, DataBrowserPropertyID property
) const
1751 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, 1,
1752 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1755 void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem
*container
,
1756 wxArrayMacDataItemPtr
&itemArray
, DataBrowserPropertyID property
) const
1758 unsigned int noItems
= itemArray
.GetCount();
1759 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1760 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1761 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1763 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, noItems
,
1764 items
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1768 void wxMacDataItemBrowserControl::AddItem(wxMacDataItem
*container
, wxMacDataItem
*item
)
1770 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, 1,
1771 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
) );
1774 void wxMacDataItemBrowserControl::AddItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1776 unsigned int noItems
= itemArray
.GetCount();
1777 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1778 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1779 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1781 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, noItems
,
1782 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
) );
1786 void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem
*container
, wxMacDataItem
* item
)
1788 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 1,
1789 (UInt32
*) &item
, kDataBrowserItemNoProperty
);
1790 verify_noerr( err
);
1793 void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1795 unsigned int noItems
= itemArray
.GetCount();
1796 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1797 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1798 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1800 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, noItems
,
1801 (UInt32
*) items
, kDataBrowserItemNoProperty
);
1802 verify_noerr( err
);
1806 void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem
*container
)
1808 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 0 , NULL
, kDataBrowserItemNoProperty
);
1809 verify_noerr( err
);
1812 void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem
* item
, DataBrowserSetOption option
)
1814 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID
*) &item
, option
));
1817 void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option
)
1819 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL
, option
));
1822 void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr
&itemArray
, DataBrowserSetOption option
)
1824 unsigned int noItems
= itemArray
.GetCount();
1825 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1826 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1827 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1829 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems
, (DataBrowserItemID
*) items
, option
));
1833 Boolean
wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem
* item
) const
1835 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID
) item
);
1838 void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem
* item
, DataBrowserRevealOptions options
)
1840 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID
) item
, kDataBrowserNoItem
, options
) );
1843 void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr
* first
, wxMacDataItemPtr
* last
) const
1845 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID
*) first
, (DataBrowserItemID
*) last
) );
1854 OSStatus
wxMacControl::SetTabEnabled( SInt16 tabNo
, bool enable
)
1856 return ::SetTabEnabled( m_controlRef
, tabNo
, enable
);
1863 #ifdef __WXMAC_OSX__
1864 // snippets from Sketch Sample from Apple :
1866 #define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc"
1869 This function locates, opens, and returns the profile reference for the calibrated
1870 Generic RGB color space. It is up to the caller to call CMCloseProfile when done
1871 with the profile reference this function returns.
1873 CMProfileRef
wxMacOpenGenericProfile()
1875 static CMProfileRef cachedRGBProfileRef
= NULL
;
1877 // we only create the profile reference once
1878 if (cachedRGBProfileRef
== NULL
)
1880 CMProfileLocation loc
;
1882 loc
.locType
= cmPathBasedProfile
;
1883 strcpy(loc
.u
.pathLoc
.path
, kGenericRGBProfilePathStr
);
1885 verify_noerr( CMOpenProfile(&cachedRGBProfileRef
, &loc
) );
1888 // clone the profile reference so that the caller has their own reference, not our cached one
1889 if (cachedRGBProfileRef
)
1890 CMCloneProfileRef(cachedRGBProfileRef
);
1892 return cachedRGBProfileRef
;
1896 Return the generic RGB color space. This is a 'get' function and the caller should
1897 not release the returned value unless the caller retains it first. Usually callers
1898 of this routine will immediately use the returned colorspace with CoreGraphics
1899 so they typically do not need to retain it themselves.
1901 This function creates the generic RGB color space once and hangs onto it so it can
1902 return it whenever this function is called.
1905 CGColorSpaceRef
wxMacGetGenericRGBColorSpace()
1907 static wxMacCFRefHolder
<CGColorSpaceRef
> genericRGBColorSpace
;
1909 if (genericRGBColorSpace
== NULL
)
1911 if ( UMAGetSystemVersion() >= 0x1040 )
1913 genericRGBColorSpace
.Set( CGColorSpaceCreateWithName( CFSTR("kCGColorSpaceGenericRGB") ) );
1917 CMProfileRef genericRGBProfile
= wxMacOpenGenericProfile();
1919 if (genericRGBProfile
)
1921 genericRGBColorSpace
.Set( CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile
) );
1923 wxASSERT_MSG( genericRGBColorSpace
!= NULL
, wxT("couldn't create the generic RGB color space") );
1925 // we opened the profile so it is up to us to close it
1926 CMCloseProfile(genericRGBProfile
);
1931 return genericRGBColorSpace
;
1935 wxMacPortSaver::wxMacPortSaver( GrafPtr port
)
1937 ::GetPort( &m_port
);
1941 wxMacPortSaver::~wxMacPortSaver()
1943 ::SetPort( m_port
);