1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/mac/carbon/utils.cpp
3 // Purpose: Various utilities
4 // Author: Stefan Csomor
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
20 #include "wx/toplevel.h"
25 #include "wx/apptrait.h"
28 #include "wx/mac/uma.h"
38 #include "MoreFilesX.h"
46 #if TARGET_API_MAC_OSX
47 #include <CoreServices/CoreServices.h>
49 #include <DriverServices.h>
50 #include <Multiprocessing.h>
54 #include <Carbon/Carbon.h>
56 #include <ATSUnicode.h>
57 #include <TextCommon.h>
58 #include <TextEncodingConverter.h>
61 #include "wx/mac/private/timer.h"
64 #include "wx/evtloop.h"
65 #include "wx/mac/private.h"
67 #if defined(__MWERKS__) && wxUSE_UNICODE
68 #if __MWERKS__ < 0x4100 || !defined(__DARWIN__)
75 // our OS version is the same in non GUI and GUI cases
76 wxOperatingSystemId
wxGetOsVersion(int *majorVsn
, int *minorVsn
)
79 Gestalt(gestaltSystemVersion
, &theSystem
);
81 if ( majorVsn
!= NULL
)
82 *majorVsn
= (theSystem
>> 8);
84 if ( minorVsn
!= NULL
)
85 *minorVsn
= (theSystem
& 0xFF);
87 #if defined( __DARWIN__ )
88 return wxOS_MAC_OSX_DARWIN
;
94 // ----------------------------------------------------------------------------
96 // ----------------------------------------------------------------------------
98 #if defined(__WXDEBUG__) && defined(__WXMAC__) && !defined(__DARWIN__) && defined(__MWERKS__) && (__MWERKS__ >= 0x2400)
100 // MetroNub stuff doesn't seem to work in CodeWarrior 5.3 Carbon builds...
102 #ifndef __MetroNubUtils__
103 #include "MetroNubUtils.h"
110 #if TARGET_API_MAC_CARBON
112 #include <CodeFragments.h>
114 extern "C" long CallUniversalProc(UniversalProcPtr theProcPtr
, ProcInfoType procInfo
, ...);
116 ProcPtr gCallUniversalProc_Proc
= NULL
;
120 static MetroNubUserEntryBlock
* gMetroNubEntry
= NULL
;
122 static long fRunOnce
= false;
125 Boolean
IsMetroNubInstalled()
132 gMetroNubEntry
= NULL
;
134 if (Gestalt(gestaltSystemVersion
, &value
) == noErr
&& value
< 0x1000)
136 // look for MetroNub's Gestalt selector
137 if (Gestalt(kMetroNubUserSignature
, &result
) == noErr
)
139 #if TARGET_API_MAC_CARBON
140 if (gCallUniversalProc_Proc
== NULL
)
142 CFragConnectionID connectionID
;
145 ProcPtr symbolAddress
;
147 CFragSymbolClass symbolClass
;
149 symbolAddress
= NULL
;
150 err
= GetSharedLibrary("\pInterfaceLib", kPowerPCCFragArch
, kFindCFrag
,
151 &connectionID
, &mainAddress
, errorString
);
155 gCallUniversalProc_Proc
= NULL
;
159 err
= FindSymbol(connectionID
, "\pCallUniversalProc",
160 (Ptr
*) &gCallUniversalProc_Proc
, &symbolClass
);
164 gCallUniversalProc_Proc
= NULL
;
171 MetroNubUserEntryBlock
* block
= (MetroNubUserEntryBlock
*)result
;
173 // make sure the version of the API is compatible
174 if (block
->apiLowVersion
<= kMetroNubUserAPIVersion
&&
175 kMetroNubUserAPIVersion
<= block
->apiHiVersion
)
178 gMetroNubEntry
= block
;
187 #if TARGET_API_MAC_CARBON
188 return (gMetroNubEntry
!= NULL
&& gCallUniversalProc_Proc
!= NULL
);
190 return (gMetroNubEntry
!= NULL
);
194 Boolean
IsMWDebuggerRunning()
196 if (IsMetroNubInstalled())
197 return CallIsDebuggerRunningProc(gMetroNubEntry
->isDebuggerRunning
);
202 Boolean
AmIBeingMWDebugged()
204 if (IsMetroNubInstalled())
205 return CallAmIBeingDebuggedProc(gMetroNubEntry
->amIBeingDebugged
);
210 extern bool WXDLLEXPORT
wxIsDebuggerRunning()
212 return IsMWDebuggerRunning() && AmIBeingMWDebugged();
217 extern bool WXDLLEXPORT
wxIsDebuggerRunning()
222 #endif // defined(__WXMAC__) && !defined(__DARWIN__) && (__MWERKS__ >= 0x2400)
226 // defined in unix/utilsunx.cpp for Mac OS X
228 // get full hostname (with domain name if possible)
229 bool wxGetFullHostName(wxChar
*buf
, int maxSize
)
231 return wxGetHostName(buf
, maxSize
);
234 // Get user ID e.g. jacs
235 bool wxGetUserId(wxChar
*buf
, int maxSize
)
237 return wxGetUserName( buf
, maxSize
);
240 const wxChar
* wxGetHomeDir(wxString
*pstr
)
242 *pstr
= wxMacFindFolder( (short) kOnSystemDisk
, kPreferencesFolderType
, kDontCreateFolder
);
243 return pstr
->c_str();
246 // Get hostname only (without domain name)
247 bool wxGetHostName(wxChar
*buf
, int maxSize
)
249 // Gets Chooser name of user by examining a System resource.
252 const short kComputerNameID
= -16413;
254 short oldResFile
= CurResFile();
256 StringHandle chooserName
= (StringHandle
)::GetString(kComputerNameID
);
257 UseResFile(oldResFile
);
259 if (chooserName
&& *chooserName
)
261 HLock( (Handle
) chooserName
);
262 wxString name
= wxMacMakeStringFromPascal( *chooserName
);
263 HUnlock( (Handle
) chooserName
);
264 ReleaseResource( (Handle
) chooserName
);
265 wxStrncpy( buf
, name
, maxSize
- 1 );
271 // Get user name e.g. Stefan Csomor
272 bool wxGetUserName(wxChar
*buf
, int maxSize
)
274 // Gets Chooser name of user by examining a System resource.
277 const short kChooserNameID
= -16096;
279 short oldResFile
= CurResFile();
281 StringHandle chooserName
= (StringHandle
)::GetString(kChooserNameID
);
282 UseResFile(oldResFile
);
284 if (chooserName
&& *chooserName
)
286 HLock( (Handle
) chooserName
);
287 wxString name
= wxMacMakeStringFromPascal( *chooserName
);
288 HUnlock( (Handle
) chooserName
);
289 ReleaseResource( (Handle
) chooserName
);
290 wxStrncpy( buf
, name
, maxSize
- 1 );
296 int wxKill(long pid
, wxSignal sig
, wxKillError
*rc
, int flags
)
302 WXDLLEXPORT
bool wxGetEnv(const wxString
& var
, wxString
*value
)
304 // TODO : under classic there is no environement support, under X yes
308 // set the env var name to the given value, return true on success
309 WXDLLEXPORT
bool wxSetEnv(const wxString
& var
, const wxString
& value
)
311 // TODO : under classic there is no environement support, under X yes
315 WXDLLEXPORT
bool wxUnsetEnv(const wxString
& var
)
317 // TODO : under classic there is no environement support, under X yes
321 // Execute a program in an Interactive Shell
322 bool wxShell(const wxString
& command
)
328 // Shutdown or reboot the PC
329 bool wxShutdown(wxShutdownFlags wFlags
)
335 // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX)
336 wxMemorySize
wxGetFreeMemory()
338 return (wxMemorySize
)FreeMem();
343 void wxMicroSleep(unsigned long microseconds
)
345 AbsoluteTime wakeup
= AddDurationToAbsolute( microseconds
* durationMicrosecond
, UpTime());
346 MPDelayUntil( & wakeup
);
349 void wxMilliSleep(unsigned long milliseconds
)
351 AbsoluteTime wakeup
= AddDurationToAbsolute( milliseconds
, UpTime());
352 MPDelayUntil( & wakeup
);
355 void wxSleep(int nSecs
)
357 wxMilliSleep(1000*nSecs
);
362 // Consume all events until no more left
367 #endif // !__DARWIN__
382 wxPortId
wxGUIAppTraits::GetToolkitVersion(int *verMaj
, int *verMin
) const
384 // We suppose that toolkit version is the same as OS version under Mac
385 wxGetOsVersion(verMaj
, verMin
);
390 wxEventLoopBase
* wxGUIAppTraits::CreateEventLoop()
392 return new wxEventLoop
;
395 wxTimerImpl
* wxGUIAppTraits::CreateTimerImpl(wxTimer
*timer
)
397 return new wxCarbonTimerImpl(timer
);
400 int gs_wxBusyCursorCount
= 0;
401 extern wxCursor gMacCurrentCursor
;
402 wxCursor gMacStoredActiveCursor
;
404 // Set the cursor to the busy cursor for all windows
405 void wxBeginBusyCursor(const wxCursor
*cursor
)
407 if (gs_wxBusyCursorCount
++ == 0)
409 gMacStoredActiveCursor
= gMacCurrentCursor
;
410 cursor
->MacInstall();
412 //else: nothing to do, already set
415 // Restore cursor to normal
416 void wxEndBusyCursor()
418 wxCHECK_RET( gs_wxBusyCursorCount
> 0,
419 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
421 if (--gs_wxBusyCursorCount
== 0)
423 gMacStoredActiveCursor
.MacInstall();
424 gMacStoredActiveCursor
= wxNullCursor
;
428 // true if we're between the above two calls
431 return (gs_wxBusyCursorCount
> 0);
438 wxString
wxMacFindFolderNoSeparator( short vol
,
440 Boolean createFolder
)
445 if ( FSFindFolder( vol
, folderType
, createFolder
, &fsRef
) == noErr
)
447 strDir
= wxMacFSRefToPath( &fsRef
);
453 wxString
wxMacFindFolder( short vol
,
455 Boolean createFolder
)
457 return wxMacFindFolderNoSeparator(vol
, folderType
, createFolder
) + wxFILE_SEP_PATH
;
464 // Check whether this window wants to process messages, e.g. Stop button
465 // in long calculations.
466 bool wxCheckForInterrupt(wxWindow
*WXUNUSED(wnd
))
472 void wxGetMousePosition( int* x
, int* y
)
475 #if wxMAC_USE_CORE_GRAPHICS
479 LocalToGlobal( &pt
);
485 // Return true if we have a colour display
486 bool wxColourDisplay()
491 // Returns depth of screen
495 #if wxMAC_USE_CORE_GRAPHICS
496 theDepth
= (int) CGDisplayBitsPerPixel(CGMainDisplayID());
499 SetRect(&globRect
, -32760, -32760, 32760, 32760);
500 GDHandle theMaxDevice
;
502 theMaxDevice
= GetMaxDevice(&globRect
);
503 if (theMaxDevice
!= NULL
)
504 theDepth
= (**(**theMaxDevice
).gdPMap
).pixelSize
;
509 // Get size of display
510 void wxDisplaySize(int *width
, int *height
)
512 #if wxMAC_USE_CORE_GRAPHICS
513 // TODO adapt for multi-displays
514 CGRect bounds
= CGDisplayBounds(CGMainDisplayID());
516 *width
= (int)bounds
.size
.width
;
518 *height
= (int)bounds
.size
.height
;
521 GetQDGlobalsScreenBits( &screenBits
);
524 *width
= screenBits
.bounds
.right
- screenBits
.bounds
.left
;
527 *height
= screenBits
.bounds
.bottom
- screenBits
.bounds
.top
;
531 void wxDisplaySizeMM(int *width
, int *height
)
533 wxDisplaySize(width
, height
);
534 // on mac 72 is fixed (at least now;-)
535 float cvPt2Mm
= 25.4 / 72;
538 *width
= int( *width
* cvPt2Mm
);
541 *height
= int( *height
* cvPt2Mm
);
544 void wxClientDisplayRect(int *x
, int *y
, int *width
, int *height
)
546 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
548 HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay
,kHICoordSpace72DPIGlobal
,
551 *x
= bounds
.origin
.x
;
553 *y
= bounds
.origin
.y
;
555 *width
= bounds
.size
.width
;
557 *height
= bounds
.size
.height
;
560 GetAvailableWindowPositioningBounds( GetMainDevice() , &r
);
566 *width
= r
.right
- r
.left
;
568 *height
= r
.bottom
- r
.top
;
572 wxWindow
* wxFindWindowAtPoint(const wxPoint
& pt
)
574 return wxGenericFindWindowAtPoint(pt
);
581 wxString
wxGetOsDescription()
583 #ifdef WXWIN_OS_DESCRIPTION
584 // use configure generated description if available
585 return wxString(wxT("MacOS (")) + wxT(WXWIN_OS_DESCRIPTION
) + wxString(wxT(")"));
587 return wxT("MacOS"); //TODO:define further
592 wxString
wxGetUserHome (const wxString
& user
)
598 bool wxGetDiskSpace(const wxString
& path
, wxDiskspaceSize_t
*pTotal
, wxDiskspaceSize_t
*pFree
)
607 int pos
= p
.Find(':');
608 if ( pos
!= wxNOT_FOUND
)
616 err
= wxMacPathToFSRef( p
, &fsRef
);
619 FSVolumeRefNum vRefNum
;
620 err
= FSGetVRefNum( &fsRef
, &vRefNum
);
623 UInt64 freeBytes
, totalBytes
;
624 err
= FSGetVInfo( vRefNum
, NULL
, &freeBytes
, &totalBytes
);
628 *pTotal
= wxDiskspaceSize_t( totalBytes
);
630 *pFree
= wxDiskspaceSize_t( freeBytes
);
637 #endif // !__DARWIN__
639 //---------------------------------------------------------------------------
640 // wxMac Specific utility functions
641 //---------------------------------------------------------------------------
643 void wxMacStringToPascal( const wxString
&from
, StringPtr to
)
645 wxCharBuffer buf
= from
.mb_str( wxConvLocal
);
646 int len
= strlen(buf
);
651 memcpy( (char*) &to
[1] , buf
, len
);
654 wxString
wxMacMakeStringFromPascal( ConstStringPtr from
)
656 return wxString( (char*) &from
[1] , wxConvLocal
, from
[0] );
659 // ----------------------------------------------------------------------------
660 // Common Event Support
661 // ----------------------------------------------------------------------------
663 extern ProcessSerialNumber gAppProcess
;
667 ProcessSerialNumber psn
;
669 psn
.highLongOfPSN
= 0;
670 psn
.lowLongOfPSN
= kCurrentProcess
;
671 SameProcess( &gAppProcess
, &psn
, &isSame
);
675 OSStatus err
= noErr
;
678 // lead sometimes to race conditions, although all calls used should be thread safe ...
679 static wxMacCarbonEvent s_wakeupEvent
;
680 if ( !s_wakeupEvent
.IsValid() )
682 err
= s_wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
683 kEventAttributeNone
);
688 if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent
) )
690 s_wakeupEvent
.SetCurrentTime();
691 err
= PostEventToQueue(GetMainEventQueue(), s_wakeupEvent
,
692 kEventPriorityHigh
);
695 wxMacCarbonEvent wakeupEvent
;
696 wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
697 kEventAttributeNone
);
698 err
= PostEventToQueue(GetMainEventQueue(), wakeupEvent
,
699 kEventPriorityHigh
);
702 PostEvent( nullEvent
, 0 );
707 WakeUpProcess( &gAppProcess
);
715 // ----------------------------------------------------------------------------
716 // Native Struct Conversions
717 // ----------------------------------------------------------------------------
719 void wxMacRectToNative( const wxRect
*wx
, Rect
*n
)
723 n
->right
= wx
->x
+ wx
->width
;
724 n
->bottom
= wx
->y
+ wx
->height
;
727 void wxMacNativeToRect( const Rect
*n
, wxRect
* wx
)
731 wx
->width
= n
->right
- n
->left
;
732 wx
->height
= n
->bottom
- n
->top
;
735 void wxMacPointToNative( const wxPoint
* wx
, Point
*n
)
741 void wxMacNativeToPoint( const Point
*n
, wxPoint
* wx
)
747 // ----------------------------------------------------------------------------
748 // Carbon Event Support
749 // ----------------------------------------------------------------------------
751 OSStatus
wxMacCarbonEvent::GetParameter(EventParamName inName
, EventParamType inDesiredType
, UInt32 inBufferSize
, void * outData
)
753 return ::GetEventParameter( m_eventRef
, inName
, inDesiredType
, NULL
, inBufferSize
, NULL
, outData
);
756 OSStatus
wxMacCarbonEvent::SetParameter(EventParamName inName
, EventParamType inType
, UInt32 inBufferSize
, const void * inData
)
758 return ::SetEventParameter( m_eventRef
, inName
, inType
, inBufferSize
, inData
);
761 // ----------------------------------------------------------------------------
762 // Control Access Support
763 // ----------------------------------------------------------------------------
765 IMPLEMENT_DYNAMIC_CLASS( wxMacControl
, wxObject
)
767 wxMacControl::wxMacControl()
772 wxMacControl::wxMacControl(wxWindow
* peer
, bool isRootControl
)
776 m_isRootControl
= isRootControl
;
779 wxMacControl::wxMacControl( wxWindow
* peer
, ControlRef control
)
783 m_controlRef
= control
;
786 wxMacControl::wxMacControl( wxWindow
* peer
, WXWidget control
)
790 m_controlRef
= (ControlRef
) control
;
793 wxMacControl::~wxMacControl()
797 void wxMacControl::Init()
801 m_needsFocusRect
= false;
802 m_isRootControl
= false;
805 void wxMacControl::Dispose()
807 wxASSERT_MSG( m_controlRef
!= NULL
, wxT("Control Handle already NULL, Dispose called twice ?") );
808 wxASSERT_MSG( IsValidControlHandle(m_controlRef
) , wxT("Invalid Control Handle (maybe already released) in Dispose") );
810 // we cannot check the ref count here anymore, as autorelease objects might delete their refs later
811 // we can have situations when being embedded, where the control gets deleted behind our back, so only
812 // CFRelease if we are safe
813 if ( IsValidControlHandle(m_controlRef
) )
814 CFRelease(m_controlRef
);
818 void wxMacControl::SetReference( URefCon data
)
820 SetControlReference( m_controlRef
, data
);
823 OSStatus
wxMacControl::GetData(ControlPartCode inPartCode
, ResType inTag
, Size inBufferSize
, void * inOutBuffer
, Size
* outActualSize
) const
825 return ::GetControlData( m_controlRef
, inPartCode
, inTag
, inBufferSize
, inOutBuffer
, outActualSize
);
828 OSStatus
wxMacControl::GetDataSize(ControlPartCode inPartCode
, ResType inTag
, Size
* outActualSize
) const
830 return ::GetControlDataSize( m_controlRef
, inPartCode
, inTag
, outActualSize
);
833 OSStatus
wxMacControl::SetData(ControlPartCode inPartCode
, ResType inTag
, Size inSize
, const void * inData
)
835 return ::SetControlData( m_controlRef
, inPartCode
, inTag
, inSize
, inData
);
838 OSStatus
wxMacControl::SendEvent( EventRef event
, OptionBits inOptions
)
840 #if TARGET_API_MAC_OSX
841 return SendEventToEventTargetWithOptions( event
,
842 HIObjectGetEventTarget( (HIObjectRef
) m_controlRef
), inOptions
);
844 #pragma unused(inOptions)
845 return SendEventToEventTarget(event
,GetControlEventTarget( m_controlRef
) );
849 OSStatus
wxMacControl::SendHICommand( HICommand
&command
, OptionBits inOptions
)
851 wxMacCarbonEvent
event( kEventClassCommand
, kEventCommandProcess
);
853 event
.SetParameter
<HICommand
>(kEventParamDirectObject
,command
);
855 return SendEvent( event
, inOptions
);
858 OSStatus
wxMacControl::SendHICommand( UInt32 commandID
, OptionBits inOptions
)
862 memset( &command
, 0 , sizeof(command
) );
863 command
.commandID
= commandID
;
864 return SendHICommand( command
, inOptions
);
867 void wxMacControl::Flash( ControlPartCode part
, UInt32 ticks
)
869 unsigned long finalTicks
;
871 HiliteControl( m_controlRef
, part
);
872 Delay( ticks
, &finalTicks
);
873 HiliteControl( m_controlRef
, kControlNoPart
);
876 SInt32
wxMacControl::GetValue() const
878 return ::GetControl32BitValue( m_controlRef
);
881 SInt32
wxMacControl::GetMaximum() const
883 return ::GetControl32BitMaximum( m_controlRef
);
886 SInt32
wxMacControl::GetMinimum() const
888 return ::GetControl32BitMinimum( m_controlRef
);
891 void wxMacControl::SetValue( SInt32 v
)
893 ::SetControl32BitValue( m_controlRef
, v
);
896 void wxMacControl::SetMinimum( SInt32 v
)
898 ::SetControl32BitMinimum( m_controlRef
, v
);
901 void wxMacControl::SetMaximum( SInt32 v
)
903 ::SetControl32BitMaximum( m_controlRef
, v
);
906 void wxMacControl::SetValueAndRange( SInt32 value
, SInt32 minimum
, SInt32 maximum
)
908 ::SetControl32BitMinimum( m_controlRef
, minimum
);
909 ::SetControl32BitMaximum( m_controlRef
, maximum
);
910 ::SetControl32BitValue( m_controlRef
, value
);
913 OSStatus
wxMacControl::SetFocus( ControlFocusPart focusPart
)
915 return SetKeyboardFocus( GetControlOwner( m_controlRef
), m_controlRef
, focusPart
);
918 bool wxMacControl::HasFocus() const
921 GetKeyboardFocus( GetUserFocusWindow() , &control
);
922 return control
== m_controlRef
;
925 void wxMacControl::SetNeedsFocusRect( bool needs
)
927 m_needsFocusRect
= needs
;
930 bool wxMacControl::NeedsFocusRect() const
932 return m_needsFocusRect
;
935 void wxMacControl::VisibilityChanged(bool WXUNUSED(shown
))
939 void wxMacControl::SuperChangedPosition()
943 void wxMacControl::SetFont( const wxFont
& font
, const wxColour
& foreground
, long windowStyle
)
947 ControlFontStyleRec fontStyle
;
948 if ( font
.MacGetThemeFontID() != kThemeCurrentPortFont
)
950 switch ( font
.MacGetThemeFontID() )
952 case kThemeSmallSystemFont
:
953 fontStyle
.font
= kControlFontSmallSystemFont
;
956 case 109 : // mini font
960 case kThemeSystemFont
:
961 fontStyle
.font
= kControlFontBigSystemFont
;
965 fontStyle
.font
= kControlFontBigSystemFont
;
969 fontStyle
.flags
= kControlUseFontMask
;
973 fontStyle
.font
= font
.MacGetFontNum();
974 fontStyle
.style
= font
.MacGetFontStyle();
975 fontStyle
.size
= font
.MacGetFontSize();
976 fontStyle
.flags
= kControlUseFontMask
| kControlUseFaceMask
| kControlUseSizeMask
;
979 fontStyle
.just
= teJustLeft
;
980 fontStyle
.flags
|= kControlUseJustMask
;
981 if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_CENTER_HORIZONTAL
)
982 fontStyle
.just
= teJustCenter
;
983 else if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_RIGHT
)
984 fontStyle
.just
= teJustRight
;
987 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
988 // won't get grayed out by the system anymore
990 if ( foreground
!= *wxBLACK
)
992 fontStyle
.foreColor
= MAC_WXCOLORREF( foreground
.GetPixel() );
993 fontStyle
.flags
|= kControlUseForeColorMask
;
996 ::SetControlFontStyle( m_controlRef
, &fontStyle
);
1000 void wxMacControl::SetBackground( const wxBrush
&WXUNUSED(brush
) )
1003 // setting up a color proc is not recommended anymore
1006 void wxMacControl::SetRange( SInt32 minimum
, SInt32 maximum
)
1008 ::SetControl32BitMinimum( m_controlRef
, minimum
);
1009 ::SetControl32BitMaximum( m_controlRef
, maximum
);
1012 short wxMacControl::HandleKey( SInt16 keyCode
, SInt16 charCode
, EventModifiers modifiers
)
1015 return HandleControlKey( m_controlRef
, keyCode
, charCode
, modifiers
);
1021 void wxMacControl::SetActionProc( ControlActionUPP actionProc
)
1023 SetControlAction( m_controlRef
, actionProc
);
1026 void wxMacControl::SetViewSize( SInt32 viewSize
)
1028 SetControlViewSize(m_controlRef
, viewSize
);
1031 SInt32
wxMacControl::GetViewSize() const
1033 return GetControlViewSize( m_controlRef
);
1036 bool wxMacControl::IsVisible() const
1038 return IsControlVisible( m_controlRef
);
1041 void wxMacControl::SetVisibility( bool visible
, bool redraw
)
1043 SetControlVisibility( m_controlRef
, visible
, redraw
);
1046 bool wxMacControl::IsEnabled() const
1048 #if TARGET_API_MAC_OSX
1049 return IsControlEnabled( m_controlRef
);
1051 return IsControlActive( m_controlRef
);
1055 bool wxMacControl::IsActive() const
1057 return IsControlActive( m_controlRef
);
1060 void wxMacControl::Enable( bool enable
)
1063 EnableControl( m_controlRef
);
1065 DisableControl( m_controlRef
);
1068 void wxMacControl::SetDrawingEnabled( bool enable
)
1070 HIViewSetDrawingEnabled( m_controlRef
, enable
);
1073 bool wxMacControl::GetNeedsDisplay() const
1075 return HIViewGetNeedsDisplay( m_controlRef
);
1078 void wxMacControl::SetNeedsDisplay( RgnHandle where
)
1083 HIViewSetNeedsDisplayInRegion( m_controlRef
, where
, true );
1086 void wxMacControl::SetNeedsDisplay( Rect
* where
)
1091 if ( where
!= NULL
)
1093 RgnHandle update
= NewRgn();
1094 RectRgn( update
, where
);
1095 HIViewSetNeedsDisplayInRegion( m_controlRef
, update
, true );
1096 DisposeRgn( update
);
1099 HIViewSetNeedsDisplay( m_controlRef
, true );
1102 void wxMacControl::Convert( wxPoint
*pt
, wxMacControl
*from
, wxMacControl
*to
)
1108 HIViewConvertPoint( &hiPoint
, from
->m_controlRef
, to
->m_controlRef
);
1109 pt
->x
= (int)hiPoint
.x
;
1110 pt
->y
= (int)hiPoint
.y
;
1113 void wxMacControl::SetRect( Rect
*r
)
1115 //A HIRect is actually a CGRect on OSX - which consists of two structures -
1116 //CGPoint and CGSize, which have two floats each
1117 HIRect hir
= { { r
->left
, r
->top
}, { r
->right
- r
->left
, r
->bottom
- r
->top
} };
1118 HIViewSetFrame ( m_controlRef
, &hir
);
1119 // eventuall we might have to do a SetVisibility( false , true );
1120 // before and a SetVisibility( true , true ); after
1123 void wxMacControl::GetRect( Rect
*r
)
1125 GetControlBounds( m_controlRef
, r
);
1128 void wxMacControl::GetRectInWindowCoords( Rect
*r
)
1130 UMAGetControlBoundsInWindowCoords( m_controlRef
, r
);
1133 void wxMacControl::GetBestRect( Rect
*r
)
1135 short baselineoffset
;
1137 GetBestControlRect( m_controlRef
, r
, &baselineoffset
);
1140 void wxMacControl::SetLabel( const wxString
&title
)
1142 wxFontEncoding encoding
;
1145 encoding
= m_font
.GetEncoding();
1147 encoding
= wxFont::GetDefaultEncoding();
1149 UMASetControlTitle( m_controlRef
, title
, encoding
);
1152 void wxMacControl::GetFeatures( UInt32
* features
)
1154 GetControlFeatures( m_controlRef
, features
);
1157 OSStatus
wxMacControl::GetRegion( ControlPartCode partCode
, RgnHandle region
)
1159 OSStatus err
= GetControlRegion( m_controlRef
, partCode
, region
);
1163 OSStatus
wxMacControl::SetZOrder( bool above
, wxMacControl
* other
)
1165 #if TARGET_API_MAC_OSX
1166 return HIViewSetZOrder( m_controlRef
,above
? kHIViewZOrderAbove
: kHIViewZOrderBelow
,
1167 (other
!= NULL
) ? other
->m_controlRef
: NULL
);
1173 #if TARGET_API_MAC_OSX
1174 // SetNeedsDisplay would not invalidate the children
1175 static void InvalidateControlAndChildren( HIViewRef control
)
1177 HIViewSetNeedsDisplay( control
, true );
1178 UInt16 childrenCount
= 0;
1179 OSStatus err
= CountSubControls( control
, &childrenCount
);
1180 if ( err
== errControlIsNotEmbedder
)
1183 wxASSERT_MSG( err
== noErr
, wxT("Unexpected error when accessing subcontrols") );
1185 for ( UInt16 i
= childrenCount
; i
>=1; --i
)
1189 err
= GetIndexedSubControl( control
, i
, & child
);
1190 if ( err
== errControlIsNotEmbedder
)
1193 InvalidateControlAndChildren( child
);
1198 void wxMacControl::InvalidateWithChildren()
1200 #if TARGET_API_MAC_OSX
1201 InvalidateControlAndChildren( m_controlRef
);
1205 void wxMacControl::ScrollRect( wxRect
*r
, int dx
, int dy
)
1207 wxASSERT( r
!= NULL
);
1209 HIRect scrollarea
= CGRectMake( r
->x
, r
->y
, r
->width
, r
->height
);
1210 HIViewScrollRect ( m_controlRef
, &scrollarea
, dx
,dy
);
1213 OSType wxMacCreator
= 'WXMC';
1214 OSType wxMacControlProperty
= 'MCCT';
1216 void wxMacControl::SetReferenceInNativeControl()
1219 verify_noerr( SetControlProperty ( m_controlRef
,
1220 wxMacCreator
,wxMacControlProperty
, sizeof(data
), &data
) );
1223 wxMacControl
* wxMacControl::GetReferenceFromNativeControl(ControlRef control
)
1225 wxMacControl
* ctl
= NULL
;
1226 ByteCount actualSize
;
1227 if ( GetControlProperty( control
,wxMacCreator
,wxMacControlProperty
, sizeof(ctl
) ,
1228 &actualSize
, &ctl
) == noErr
)
1235 // ============================================================================
1236 // DataBrowser Wrapper
1237 // ============================================================================
1239 // basing on DataBrowserItemIDs
1242 IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl
, wxMacControl
)
1244 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
1246 DataBrowserItemID itemID
,
1247 DataBrowserItemNotification message
,
1248 DataBrowserItemDataRef itemData
)
1250 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1253 ctl
->ItemNotification(itemID
, message
, itemData
);
1257 pascal OSStatus
wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
1259 DataBrowserItemID itemID
,
1260 DataBrowserPropertyID property
,
1261 DataBrowserItemDataRef itemData
,
1262 Boolean changeValue
)
1264 OSStatus err
= errDataBrowserPropertyNotSupported
;
1265 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1268 err
= ctl
->GetSetItemData(itemID
, property
, itemData
, changeValue
);
1273 pascal Boolean
wxMacDataBrowserControl::DataBrowserCompareProc(
1275 DataBrowserItemID itemOneID
,
1276 DataBrowserItemID itemTwoID
,
1277 DataBrowserPropertyID sortProperty
)
1279 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1282 return ctl
->CompareItems(itemOneID
, itemTwoID
, sortProperty
);
1287 DataBrowserItemDataUPP gDataBrowserItemDataUPP
= NULL
;
1288 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP
= NULL
;
1289 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP
= NULL
;
1291 wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow
* peer
,
1294 long WXUNUSED(style
))
1295 : wxMacControl( peer
)
1297 Rect bounds
= wxMacGetBoundsForControl( peer
, pos
, size
);
1298 OSStatus err
= ::CreateDataBrowserControl(
1299 MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),
1300 &bounds
, kDataBrowserListView
, &m_controlRef
);
1301 SetReferenceInNativeControl();
1302 verify_noerr( err
);
1303 if ( gDataBrowserItemCompareUPP
== NULL
)
1304 gDataBrowserItemCompareUPP
= NewDataBrowserItemCompareUPP(DataBrowserCompareProc
);
1305 if ( gDataBrowserItemDataUPP
== NULL
)
1306 gDataBrowserItemDataUPP
= NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc
);
1307 if ( gDataBrowserItemNotificationUPP
== NULL
)
1309 gDataBrowserItemNotificationUPP
=
1310 #if TARGET_API_MAC_OSX
1311 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc
);
1313 NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc
);
1317 DataBrowserCallbacks callbacks
;
1318 InitializeDataBrowserCallbacks( &callbacks
, kDataBrowserLatestCallbacks
);
1320 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserItemDataUPP
;
1321 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserItemCompareUPP
;
1322 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserItemNotificationUPP
;
1323 SetCallbacks( &callbacks
);
1327 OSStatus
wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container
,
1329 DataBrowserItemState state
,
1330 ItemCount
*numItems
) const
1332 return GetDataBrowserItemCount( m_controlRef
, container
, recurse
, state
, numItems
);
1335 OSStatus
wxMacDataBrowserControl::GetItems( DataBrowserItemID container
,
1337 DataBrowserItemState state
,
1340 return GetDataBrowserItems( m_controlRef
, container
, recurse
, state
, items
);
1343 OSStatus
wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options
)
1345 return SetDataBrowserSelectionFlags( m_controlRef
, options
);
1348 OSStatus
wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc
*columnDesc
,
1349 DataBrowserTableViewColumnIndex position
)
1351 return AddDataBrowserListViewColumn( m_controlRef
, columnDesc
, position
);
1354 OSStatus
wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position
, DataBrowserTableViewColumnID
* id
){
1355 return GetDataBrowserTableViewColumnProperty( m_controlRef
, position
, id
);
1358 OSStatus
wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position
)
1360 DataBrowserTableViewColumnID id
;
1361 GetColumnIDFromIndex( position
, &id
);
1362 return RemoveDataBrowserTableViewColumn( m_controlRef
, id
);
1365 OSStatus
wxMacDataBrowserControl::AutoSizeColumns()
1367 return AutoSizeDataBrowserListViewColumns(m_controlRef
);
1370 OSStatus
wxMacDataBrowserControl::SetHasScrollBars( bool horiz
, bool vert
)
1372 return SetDataBrowserHasScrollBars( m_controlRef
, horiz
, vert
);
1375 OSStatus
wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle
)
1377 return SetDataBrowserTableViewHiliteStyle( m_controlRef
, hiliteStyle
);
1380 OSStatus
wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height
)
1382 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1385 OSStatus
wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16
*height
)
1387 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1390 OSStatus
wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks
*callbacks
)
1392 return SetDataBrowserCallbacks( m_controlRef
, callbacks
);
1395 OSStatus
wxMacDataBrowserControl::UpdateItems(
1396 DataBrowserItemID container
,
1398 const DataBrowserItemID
*items
,
1399 DataBrowserPropertyID preSortProperty
,
1400 DataBrowserPropertyID propertyID
) const
1402 return UpdateDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
, propertyID
);
1405 bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item
) const
1407 return IsDataBrowserItemSelected( m_controlRef
, item
);
1410 OSStatus
wxMacDataBrowserControl::AddItems(
1411 DataBrowserItemID container
,
1413 const DataBrowserItemID
*items
,
1414 DataBrowserPropertyID preSortProperty
)
1416 return AddDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1419 OSStatus
wxMacDataBrowserControl::RemoveItems(
1420 DataBrowserItemID container
,
1422 const DataBrowserItemID
*items
,
1423 DataBrowserPropertyID preSortProperty
)
1425 return RemoveDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1428 OSStatus
wxMacDataBrowserControl::RevealItem(
1429 DataBrowserItemID item
,
1430 DataBrowserPropertyID propertyID
,
1431 DataBrowserRevealOptions options
) const
1433 return RevealDataBrowserItem( m_controlRef
, item
, propertyID
, options
);
1436 OSStatus
wxMacDataBrowserControl::SetSelectedItems(
1438 const DataBrowserItemID
*items
,
1439 DataBrowserSetOption operation
)
1441 return SetDataBrowserSelectedItems( m_controlRef
, numItems
, items
, operation
);
1444 OSStatus
wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID
*first
, DataBrowserItemID
*last
) const
1446 return GetDataBrowserSelectionAnchor( m_controlRef
, first
, last
);
1449 OSStatus
wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
1451 return GetDataBrowserTableViewItemID( m_controlRef
, row
, item
);
1454 OSStatus
wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
1456 return GetDataBrowserTableViewItemRow( m_controlRef
, item
, row
);
1459 OSStatus
wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height
)
1461 return SetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1464 OSStatus
wxMacDataBrowserControl::GetDefaultRowHeight( UInt16
* height
) const
1466 return GetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1469 OSStatus
wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item
, UInt16 height
)
1471 return SetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1474 OSStatus
wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item
, UInt16
*height
) const
1476 return GetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1479 OSStatus
wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column
, UInt16
*width
) const
1481 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1484 OSStatus
wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column
, UInt16 width
)
1486 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1489 OSStatus
wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16
*width
) const
1491 return GetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1494 OSStatus
wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width
)
1496 return SetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1499 OSStatus
wxMacDataBrowserControl::GetColumnCount(UInt32
* numColumns
) const
1501 return GetDataBrowserTableViewColumnCount( m_controlRef
, numColumns
);
1504 OSStatus
wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column
,
1505 DataBrowserTableViewColumnIndex
*position
) const
1507 return GetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1510 OSStatus
wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column
, DataBrowserTableViewColumnIndex position
)
1512 return SetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1515 OSStatus
wxMacDataBrowserControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
1517 return GetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1520 OSStatus
wxMacDataBrowserControl::SetScrollPosition( UInt32 top
, UInt32 left
)
1522 return SetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1525 OSStatus
wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID
*column
) const
1527 return GetDataBrowserSortProperty( m_controlRef
, column
);
1530 OSStatus
wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column
)
1532 return SetDataBrowserSortProperty( m_controlRef
, column
);
1535 OSStatus
wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder
*order
) const
1537 return GetDataBrowserSortOrder( m_controlRef
, order
);
1540 OSStatus
wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order
)
1542 return SetDataBrowserSortOrder( m_controlRef
, order
);
1545 OSStatus
wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property
,
1546 DataBrowserPropertyFlags
*flags
) const
1548 return GetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1551 OSStatus
wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property
,
1552 DataBrowserPropertyFlags flags
)
1554 return SetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1557 OSStatus
wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property
,
1558 DataBrowserListViewHeaderDesc
*desc
) const
1560 return GetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1563 OSStatus
wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property
,
1564 DataBrowserListViewHeaderDesc
*desc
)
1566 return SetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1569 OSStatus
wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property
,
1570 Boolean expandableRows
)
1572 return SetDataBrowserListViewDisclosureColumn( m_controlRef
, property
, expandableRows
);
1575 // ============================================================================
1576 // Higher-level Databrowser
1577 // ============================================================================
1579 // basing on data item objects
1582 wxMacDataItem::wxMacDataItem()
1587 m_colId
= kTextColumnId
; // for compat with existing wx*ListBox impls.
1590 wxMacDataItem::~wxMacDataItem()
1594 void wxMacDataItem::SetOrder( SInt32 order
)
1599 SInt32
wxMacDataItem::GetOrder() const
1604 void wxMacDataItem::SetData( void* data
)
1609 void* wxMacDataItem::GetData() const
1614 short wxMacDataItem::GetColumn()
1619 void wxMacDataItem::SetColumn( short col
)
1624 void wxMacDataItem::SetLabel( const wxString
& str
)
1627 m_cfLabel
.Assign( str
, wxLocale::GetSystemEncoding());
1630 const wxString
& wxMacDataItem::GetLabel() const
1635 bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1636 const wxMacDataItem
* rhs
,
1637 DataBrowserPropertyID sortProperty
) const
1639 const wxMacDataItem
* otherItem
= wx_const_cast(wxMacDataItem
*,rhs
);
1640 bool retval
= false;
1642 if ( sortProperty
== m_colId
){
1643 retval
= m_label
.CmpNoCase( otherItem
->m_label
) < 0;
1646 else if ( sortProperty
== kNumericOrderColumnId
)
1647 retval
= m_order
< otherItem
->m_order
;
1652 OSStatus
wxMacDataItem::GetSetData( wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1653 DataBrowserPropertyID property
,
1654 DataBrowserItemDataRef itemData
,
1657 OSStatus err
= errDataBrowserPropertyNotSupported
;
1660 if ( property
== m_colId
){
1661 err
= ::SetDataBrowserItemDataText( itemData
, m_cfLabel
);
1664 else if ( property
== kNumericOrderColumnId
){
1665 err
= ::SetDataBrowserItemDataValue( itemData
, m_order
);
1675 // no editable props here
1684 void wxMacDataItem::Notification(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1685 DataBrowserItemNotification
WXUNUSED(message
),
1686 DataBrowserItemDataRef
WXUNUSED(itemData
) ) const
1690 IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl
, wxMacDataBrowserControl
)
1692 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) :
1693 wxMacDataBrowserControl( peer
, pos
, size
, style
)
1695 m_suppressSelection
= false;
1696 m_sortOrder
= SortOrder_None
;
1697 m_clientDataItemsType
= wxClientData_None
;
1700 wxMacDataItem
* wxMacDataItemBrowserControl::CreateItem()
1702 return new wxMacDataItem();
1705 wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl
*browser
)
1707 m_former
= browser
->SuppressSelection(true);
1708 m_browser
= browser
;
1711 wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1713 m_browser
->SuppressSelection(m_former
);
1716 bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress
)
1718 bool former
= m_suppressSelection
;
1719 m_suppressSelection
= suppress
;
1724 Boolean
wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID
,
1725 DataBrowserItemID itemTwoID
,
1726 DataBrowserPropertyID sortProperty
)
1728 wxMacDataItem
* itemOne
= (wxMacDataItem
*) itemOneID
;
1729 wxMacDataItem
* itemTwo
= (wxMacDataItem
*) itemTwoID
;
1730 return CompareItems( itemOne
, itemTwo
, sortProperty
);
1733 Boolean
wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem
* itemOne
,
1734 const wxMacDataItem
* itemTwo
,
1735 DataBrowserPropertyID sortProperty
)
1737 Boolean retval
= false;
1738 if ( itemOne
!= NULL
)
1739 retval
= itemOne
->IsLessThan( this , itemTwo
, sortProperty
);
1743 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1744 DataBrowserItemID itemID
,
1745 DataBrowserPropertyID property
,
1746 DataBrowserItemDataRef itemData
,
1747 Boolean changeValue
)
1749 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1750 return GetSetItemData(item
, property
, itemData
, changeValue
);
1753 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1754 wxMacDataItem
* item
,
1755 DataBrowserPropertyID property
,
1756 DataBrowserItemDataRef itemData
,
1757 Boolean changeValue
)
1759 OSStatus err
= errDataBrowserPropertyNotSupported
;
1762 case kDataBrowserContainerIsClosableProperty
:
1763 case kDataBrowserContainerIsSortableProperty
:
1764 case kDataBrowserContainerIsOpenableProperty
:
1765 // right now default behaviour on these
1769 if ( item
!= NULL
){
1770 err
= item
->GetSetData( this, property
, itemData
, changeValue
);
1778 void wxMacDataItemBrowserControl::ItemNotification(
1779 DataBrowserItemID itemID
,
1780 DataBrowserItemNotification message
,
1781 DataBrowserItemDataRef itemData
)
1783 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1784 ItemNotification( item
, message
, itemData
);
1787 void wxMacDataItemBrowserControl::ItemNotification(
1788 const wxMacDataItem
* item
,
1789 DataBrowserItemNotification message
,
1790 DataBrowserItemDataRef itemData
)
1793 item
->Notification( this, message
, itemData
);
1796 unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem
* container
,
1797 bool recurse
, DataBrowserItemState state
) const
1799 ItemCount numItems
= 0;
1800 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID
)container
,
1801 recurse
, state
, &numItems
) );
1805 unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem
* container
,
1806 bool recurse
) const
1808 return GetItemCount( container
, recurse
, kDataBrowserItemIsSelected
);
1812 void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem
* container
,
1813 bool recurse
, DataBrowserItemState state
, wxArrayMacDataItemPtr
&items
) const
1815 Handle handle
= NewHandle(0);
1816 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID
)container
,
1817 recurse
, state
, handle
) );
1819 int itemCount
= GetHandleSize(handle
)/sizeof(DataBrowserItemID
);
1821 wxMacDataItemPtr
* itemsArray
= (wxMacDataItemPtr
*) *handle
;
1822 for ( int i
= 0; i
< itemCount
; ++i
)
1824 items
.Add(itemsArray
[i
]);
1827 DisposeHandle( handle
);
1830 unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem
* item
) const
1832 DataBrowserTableViewRowIndex row
;
1833 OSStatus err
= GetItemRow( (DataBrowserItemID
) item
, &row
);
1834 wxASSERT( err
== noErr
);
1838 wxMacDataItem
* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n
) const
1840 DataBrowserItemID id
;
1841 OSStatus err
= GetItemID( (DataBrowserTableViewRowIndex
) n
, &id
);
1842 wxASSERT( err
== noErr
);
1843 return (wxMacDataItem
*) id
;
1846 void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem
*container
,
1847 const wxMacDataItem
*item
, DataBrowserPropertyID property
) const
1849 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, 1,
1850 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1853 void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem
*container
,
1854 wxArrayMacDataItemPtr
&itemArray
, DataBrowserPropertyID property
) const
1856 unsigned int noItems
= itemArray
.GetCount();
1857 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1858 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1859 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1861 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, noItems
,
1862 items
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1866 void wxMacDataItemBrowserControl::InsertColumn(int colId
, DataBrowserPropertyType colType
,
1867 const wxString
& title
, SInt16 just
, int defaultWidth
)
1869 DataBrowserListViewColumnDesc columnDesc
;
1870 columnDesc
.headerBtnDesc
.titleOffset
= 0;
1871 columnDesc
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
1873 columnDesc
.headerBtnDesc
.btnFontStyle
.flags
=
1874 kControlUseFontMask
| kControlUseJustMask
;
1876 columnDesc
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentTextOnly
;
1877 columnDesc
.headerBtnDesc
.btnFontStyle
.just
= just
;
1878 columnDesc
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
1879 columnDesc
.headerBtnDesc
.btnFontStyle
.style
= normal
;
1881 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1882 // defined for other modes?
1885 enc
= m_font
.GetEncoding();
1887 enc
= wxLocale::GetSystemEncoding();
1888 wxMacCFStringHolder cfTitle
;
1889 cfTitle
.Assign( title
, enc
);
1890 columnDesc
.headerBtnDesc
.titleString
= cfTitle
;
1892 columnDesc
.headerBtnDesc
.minimumWidth
= 0;
1893 columnDesc
.headerBtnDesc
.maximumWidth
= 30000;
1895 columnDesc
.propertyDesc
.propertyID
= (kMinColumnId
+ colId
);
1896 columnDesc
.propertyDesc
.propertyType
= colType
;
1897 columnDesc
.propertyDesc
.propertyFlags
= kDataBrowserListViewSortableColumn
;
1898 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
1899 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
;
1901 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
1902 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
1905 verify_noerr( AddColumn( &columnDesc
, kDataBrowserListViewAppendColumn
) );
1907 if (defaultWidth
> 0){
1908 SetColumnWidth(colId
, defaultWidth
);
1913 void wxMacDataItemBrowserControl::SetColumnWidth(int colId
, int width
)
1915 DataBrowserPropertyID id
;
1916 GetColumnIDFromIndex(colId
, &id
);
1917 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id
, width
));
1920 int wxMacDataItemBrowserControl::GetColumnWidth(int colId
)
1922 DataBrowserPropertyID id
;
1923 GetColumnIDFromIndex(colId
, &id
);
1925 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id
, &result
));
1929 void wxMacDataItemBrowserControl::AddItem(wxMacDataItem
*container
, wxMacDataItem
*item
)
1931 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, 1,
1932 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
) );
1935 void wxMacDataItemBrowserControl::AddItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1937 unsigned int noItems
= itemArray
.GetCount();
1938 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1939 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1940 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1942 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, noItems
,
1943 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
) );
1947 void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem
*container
, wxMacDataItem
* item
)
1949 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 1,
1950 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
);
1951 verify_noerr( err
);
1954 void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1956 unsigned int noItems
= itemArray
.GetCount();
1957 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1958 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1959 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1961 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, noItems
,
1962 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
);
1963 verify_noerr( err
);
1967 void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem
*container
)
1969 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 0 , NULL
, kDataBrowserItemNoProperty
);
1970 verify_noerr( err
);
1973 void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem
* item
, DataBrowserSetOption option
)
1975 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID
*) &item
, option
));
1978 void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option
)
1980 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL
, option
));
1983 void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr
&itemArray
, DataBrowserSetOption option
)
1985 unsigned int noItems
= itemArray
.GetCount();
1986 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1987 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1988 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1990 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems
, (DataBrowserItemID
*) items
, option
));
1994 Boolean
wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem
* item
) const
1996 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID
) item
);
1999 void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem
* item
, DataBrowserRevealOptions options
)
2001 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID
) item
, kDataBrowserNoItem
, options
) );
2004 void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr
* first
, wxMacDataItemPtr
* last
) const
2006 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID
*) first
, (DataBrowserItemID
*) last
) );
2009 wxClientDataType
wxMacDataItemBrowserControl::GetClientDataType() const
2011 return m_clientDataItemsType
;
2013 void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType
)
2015 m_clientDataItemsType
= clientDataItemsType
;
2018 unsigned int wxMacDataItemBrowserControl::MacGetCount() const
2020 return GetItemCount(wxMacDataBrowserRootContainer
,false,kDataBrowserItemAnyState
);
2023 void wxMacDataItemBrowserControl::MacDelete( unsigned int n
)
2025 wxMacDataItem
* item
= (wxMacDataItem
*)GetItemFromLine( n
);
2026 RemoveItem( wxMacDataBrowserRootContainer
, item
);
2029 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
,
2030 const wxArrayStringsAdapter
& items
,
2033 size_t itemsCount
= items
.GetCount();
2034 if ( itemsCount
== 0 )
2037 SInt32 frontLineOrder
= 0;
2039 if ( m_sortOrder
== SortOrder_None
)
2041 // increase the order of the lines to be shifted
2042 unsigned int lines
= MacGetCount();
2043 for ( unsigned int i
= n
; i
< lines
; ++i
)
2045 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
2046 iter
->SetOrder( iter
->GetOrder() + itemsCount
);
2050 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
2051 frontLineOrder
= iter
->GetOrder();
2055 wxArrayMacDataItemPtr ids
;
2056 ids
.SetCount( itemsCount
);
2058 for ( unsigned int i
= 0; i
< itemsCount
; ++i
)
2060 wxMacDataItem
* item
= CreateItem();
2061 item
->SetLabel( items
[i
]);
2063 item
->SetColumn( kMinColumnId
+ column
);
2065 if ( m_sortOrder
== SortOrder_None
)
2066 item
->SetOrder( frontLineOrder
+ 1 + i
);
2071 AddItems( wxMacDataBrowserRootContainer
, ids
);
2074 int wxMacDataItemBrowserControl::MacAppend( const wxString
& text
)
2076 wxMacDataItem
* item
= CreateItem();
2077 item
->SetLabel( text
);
2078 if ( m_sortOrder
== SortOrder_None
)
2080 unsigned int lines
= MacGetCount();
2082 item
->SetOrder( 1 );
2085 wxMacDataItem
* frontItem
= (wxMacDataItem
*) GetItemFromLine(lines
-1);
2086 item
->SetOrder( frontItem
->GetOrder() + 1 );
2089 AddItem( wxMacDataBrowserRootContainer
, item
);
2091 return GetLineFromItem(item
);
2094 void wxMacDataItemBrowserControl::MacClear()
2096 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2097 RemoveAllItems(wxMacDataBrowserRootContainer
);
2100 void wxMacDataItemBrowserControl::MacDeselectAll()
2102 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2103 SetSelectedAllItems( kDataBrowserItemsRemove
);
2106 void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n
, bool select
, bool multi
)
2108 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
2109 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2111 if ( IsItemSelected( item
) != select
)
2114 SetSelectedItem( item
, multi
? kDataBrowserItemsAdd
: kDataBrowserItemsAssign
);
2116 SetSelectedItem( item
, kDataBrowserItemsRemove
);
2122 bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n
) const
2124 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
2125 return IsItemSelected( item
);
2128 int wxMacDataItemBrowserControl::MacGetSelection() const
2130 wxMacDataItemPtr first
, last
;
2131 GetSelectionAnchor( &first
, &last
);
2133 if ( first
!= NULL
)
2135 return GetLineFromItem( first
);
2141 int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt
& aSelections
) const
2143 aSelections
.Empty();
2144 wxArrayMacDataItemPtr selectedItems
;
2145 GetItems( wxMacDataBrowserRootContainer
, false , kDataBrowserItemIsSelected
, selectedItems
);
2147 int count
= selectedItems
.GetCount();
2149 for ( int i
= 0; i
< count
; ++i
)
2151 aSelections
.Add(GetLineFromItem(selectedItems
[i
]));
2157 void wxMacDataItemBrowserControl::MacSetString( unsigned int n
, const wxString
& text
)
2159 // as we don't store the strings we only have to issue a redraw
2160 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2161 item
->SetLabel( text
);
2162 UpdateItem( wxMacDataBrowserRootContainer
, item
, kTextColumnId
);
2165 wxString
wxMacDataItemBrowserControl::MacGetString( unsigned int n
) const
2167 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2168 return item
->GetLabel();
2171 void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n
, void * data
)
2173 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2174 item
->SetData( data
);
2175 // not displayed, therefore no Update infos to DataBrowser
2178 void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n
) const
2180 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2181 return item
->GetData();
2184 void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n
)
2187 GetScrollPosition( &top
, &left
) ;
2188 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2191 GetRowHeight( (DataBrowserItemID
) item
, &height
) ;
2192 SetScrollPosition( n
* ((UInt32
)height
) , left
) ;
2194 RevealItem( item
, kDataBrowserRevealWithoutSelecting
);
2203 OSStatus
wxMacControl::SetTabEnabled( SInt16 tabNo
, bool enable
)
2205 return ::SetTabEnabled( m_controlRef
, tabNo
, enable
);
2212 #ifdef __WXMAC_OSX__
2213 // snippets from Sketch Sample from Apple :
2215 #define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc"
2218 This function locates, opens, and returns the profile reference for the calibrated
2219 Generic RGB color space. It is up to the caller to call CMCloseProfile when done
2220 with the profile reference this function returns.
2222 CMProfileRef
wxMacOpenGenericProfile()
2224 static CMProfileRef cachedRGBProfileRef
= NULL
;
2226 // we only create the profile reference once
2227 if (cachedRGBProfileRef
== NULL
)
2229 CMProfileLocation loc
;
2231 loc
.locType
= cmPathBasedProfile
;
2232 strcpy(loc
.u
.pathLoc
.path
, kGenericRGBProfilePathStr
);
2234 verify_noerr( CMOpenProfile(&cachedRGBProfileRef
, &loc
) );
2237 // clone the profile reference so that the caller has their own reference, not our cached one
2238 if (cachedRGBProfileRef
)
2239 CMCloneProfileRef(cachedRGBProfileRef
);
2241 return cachedRGBProfileRef
;
2245 Return the generic RGB color space. This is a 'get' function and the caller should
2246 not release the returned value unless the caller retains it first. Usually callers
2247 of this routine will immediately use the returned colorspace with CoreGraphics
2248 so they typically do not need to retain it themselves.
2250 This function creates the generic RGB color space once and hangs onto it so it can
2251 return it whenever this function is called.
2254 CGColorSpaceRef
wxMacGetGenericRGBColorSpace()
2256 static wxMacCFRefHolder
<CGColorSpaceRef
> genericRGBColorSpace
;
2258 if (genericRGBColorSpace
== NULL
)
2260 if ( UMAGetSystemVersion() >= 0x1040 )
2262 genericRGBColorSpace
.Set( CGColorSpaceCreateWithName( CFSTR("kCGColorSpaceGenericRGB") ) );
2266 CMProfileRef genericRGBProfile
= wxMacOpenGenericProfile();
2268 if (genericRGBProfile
)
2270 genericRGBColorSpace
.Set( CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile
) );
2272 wxASSERT_MSG( genericRGBColorSpace
!= NULL
, wxT("couldn't create the generic RGB color space") );
2274 // we opened the profile so it is up to us to close it
2275 CMCloseProfile(genericRGBProfile
);
2280 return genericRGBColorSpace
;
2286 wxMacPortSaver::wxMacPortSaver( GrafPtr port
)
2288 ::GetPort( &m_port
);
2292 wxMacPortSaver::~wxMacPortSaver()
2294 ::SetPort( m_port
);
2298 void wxMacGlobalToLocal( WindowRef window
, Point
*pt
)
2300 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
2301 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
2302 HIViewRef contentView
;
2303 // TODO check toolbar offset
2304 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
2305 HIPointConvert( &p
, kHICoordSpace72DPIGlobal
, NULL
, kHICoordSpaceView
, contentView
);
2309 QDGlobalToLocalPoint( GetWindowPort(window
), pt
) ;
2313 void wxMacLocalToGlobal( WindowRef window
, Point
*pt
)
2315 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
2316 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
2317 HIViewRef contentView
;
2318 // TODO check toolbar offset
2319 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
2320 HIPointConvert( &p
, kHICoordSpaceView
, contentView
, kHICoordSpace72DPIGlobal
, NULL
);
2324 QDLocalToGlobalPoint( GetWindowPort(window
), pt
) ;