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
)
946 ControlFontStyleRec fontStyle
;
947 if ( font
.MacGetThemeFontID() != kThemeCurrentPortFont
)
949 switch ( font
.MacGetThemeFontID() )
951 case kThemeSmallSystemFont
:
952 fontStyle
.font
= kControlFontSmallSystemFont
;
955 case 109 : // mini font
959 case kThemeSystemFont
:
960 fontStyle
.font
= kControlFontBigSystemFont
;
964 fontStyle
.font
= kControlFontBigSystemFont
;
968 fontStyle
.flags
= kControlUseFontMask
;
972 fontStyle
.font
= font
.MacGetFontNum();
973 fontStyle
.style
= font
.MacGetFontStyle();
974 fontStyle
.size
= font
.MacGetFontSize();
975 fontStyle
.flags
= kControlUseFontMask
| kControlUseFaceMask
| kControlUseSizeMask
;
978 fontStyle
.just
= teJustLeft
;
979 fontStyle
.flags
|= kControlUseJustMask
;
980 if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_CENTER_HORIZONTAL
)
981 fontStyle
.just
= teJustCenter
;
982 else if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_RIGHT
)
983 fontStyle
.just
= teJustRight
;
986 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
987 // won't get grayed out by the system anymore
989 if ( foreground
!= *wxBLACK
)
991 fontStyle
.foreColor
= MAC_WXCOLORREF( foreground
.GetPixel() );
992 fontStyle
.flags
|= kControlUseForeColorMask
;
995 ::SetControlFontStyle( m_controlRef
, &fontStyle
);
998 void wxMacControl::SetBackground( const wxBrush
&WXUNUSED(brush
) )
1001 // setting up a color proc is not recommended anymore
1004 void wxMacControl::SetRange( SInt32 minimum
, SInt32 maximum
)
1006 ::SetControl32BitMinimum( m_controlRef
, minimum
);
1007 ::SetControl32BitMaximum( m_controlRef
, maximum
);
1010 short wxMacControl::HandleKey( SInt16 keyCode
, SInt16 charCode
, EventModifiers modifiers
)
1013 return HandleControlKey( m_controlRef
, keyCode
, charCode
, modifiers
);
1019 void wxMacControl::SetActionProc( ControlActionUPP actionProc
)
1021 SetControlAction( m_controlRef
, actionProc
);
1024 void wxMacControl::SetViewSize( SInt32 viewSize
)
1026 SetControlViewSize(m_controlRef
, viewSize
);
1029 SInt32
wxMacControl::GetViewSize() const
1031 return GetControlViewSize( m_controlRef
);
1034 bool wxMacControl::IsVisible() const
1036 return IsControlVisible( m_controlRef
);
1039 void wxMacControl::SetVisibility( bool visible
, bool redraw
)
1041 SetControlVisibility( m_controlRef
, visible
, redraw
);
1044 bool wxMacControl::IsEnabled() const
1046 #if TARGET_API_MAC_OSX
1047 return IsControlEnabled( m_controlRef
);
1049 return IsControlActive( m_controlRef
);
1053 bool wxMacControl::IsActive() const
1055 return IsControlActive( m_controlRef
);
1058 void wxMacControl::Enable( bool enable
)
1061 EnableControl( m_controlRef
);
1063 DisableControl( m_controlRef
);
1066 void wxMacControl::SetDrawingEnabled( bool enable
)
1068 HIViewSetDrawingEnabled( m_controlRef
, enable
);
1071 bool wxMacControl::GetNeedsDisplay() const
1073 return HIViewGetNeedsDisplay( m_controlRef
);
1076 void wxMacControl::SetNeedsDisplay( RgnHandle where
)
1081 HIViewSetNeedsDisplayInRegion( m_controlRef
, where
, true );
1084 void wxMacControl::SetNeedsDisplay( Rect
* where
)
1089 if ( where
!= NULL
)
1091 RgnHandle update
= NewRgn();
1092 RectRgn( update
, where
);
1093 HIViewSetNeedsDisplayInRegion( m_controlRef
, update
, true );
1094 DisposeRgn( update
);
1097 HIViewSetNeedsDisplay( m_controlRef
, true );
1100 void wxMacControl::Convert( wxPoint
*pt
, wxMacControl
*from
, wxMacControl
*to
)
1106 HIViewConvertPoint( &hiPoint
, from
->m_controlRef
, to
->m_controlRef
);
1107 pt
->x
= (int)hiPoint
.x
;
1108 pt
->y
= (int)hiPoint
.y
;
1111 void wxMacControl::SetRect( Rect
*r
)
1113 //A HIRect is actually a CGRect on OSX - which consists of two structures -
1114 //CGPoint and CGSize, which have two floats each
1115 HIRect hir
= { { r
->left
, r
->top
}, { r
->right
- r
->left
, r
->bottom
- r
->top
} };
1116 HIViewSetFrame ( m_controlRef
, &hir
);
1117 // eventuall we might have to do a SetVisibility( false , true );
1118 // before and a SetVisibility( true , true ); after
1121 void wxMacControl::GetRect( Rect
*r
)
1123 GetControlBounds( m_controlRef
, r
);
1126 void wxMacControl::GetRectInWindowCoords( Rect
*r
)
1128 UMAGetControlBoundsInWindowCoords( m_controlRef
, r
);
1131 void wxMacControl::GetBestRect( Rect
*r
)
1133 short baselineoffset
;
1135 GetBestControlRect( m_controlRef
, r
, &baselineoffset
);
1138 void wxMacControl::SetLabel( const wxString
&title
)
1140 wxFontEncoding encoding
;
1143 encoding
= m_font
.GetEncoding();
1145 encoding
= wxFont::GetDefaultEncoding();
1147 UMASetControlTitle( m_controlRef
, title
, encoding
);
1150 void wxMacControl::GetFeatures( UInt32
* features
)
1152 GetControlFeatures( m_controlRef
, features
);
1155 OSStatus
wxMacControl::GetRegion( ControlPartCode partCode
, RgnHandle region
)
1157 OSStatus err
= GetControlRegion( m_controlRef
, partCode
, region
);
1161 OSStatus
wxMacControl::SetZOrder( bool above
, wxMacControl
* other
)
1163 #if TARGET_API_MAC_OSX
1164 return HIViewSetZOrder( m_controlRef
,above
? kHIViewZOrderAbove
: kHIViewZOrderBelow
,
1165 (other
!= NULL
) ? other
->m_controlRef
: NULL
);
1171 #if TARGET_API_MAC_OSX
1172 // SetNeedsDisplay would not invalidate the children
1173 static void InvalidateControlAndChildren( HIViewRef control
)
1175 HIViewSetNeedsDisplay( control
, true );
1176 UInt16 childrenCount
= 0;
1177 OSStatus err
= CountSubControls( control
, &childrenCount
);
1178 if ( err
== errControlIsNotEmbedder
)
1181 wxASSERT_MSG( err
== noErr
, wxT("Unexpected error when accessing subcontrols") );
1183 for ( UInt16 i
= childrenCount
; i
>=1; --i
)
1187 err
= GetIndexedSubControl( control
, i
, & child
);
1188 if ( err
== errControlIsNotEmbedder
)
1191 InvalidateControlAndChildren( child
);
1196 void wxMacControl::InvalidateWithChildren()
1198 #if TARGET_API_MAC_OSX
1199 InvalidateControlAndChildren( m_controlRef
);
1203 void wxMacControl::ScrollRect( wxRect
*r
, int dx
, int dy
)
1205 wxASSERT( r
!= NULL
);
1207 HIRect scrollarea
= CGRectMake( r
->x
, r
->y
, r
->width
, r
->height
);
1208 HIViewScrollRect ( m_controlRef
, &scrollarea
, dx
,dy
);
1211 OSType wxMacCreator
= 'WXMC';
1212 OSType wxMacControlProperty
= 'MCCT';
1214 void wxMacControl::SetReferenceInNativeControl()
1217 verify_noerr( SetControlProperty ( m_controlRef
,
1218 wxMacCreator
,wxMacControlProperty
, sizeof(data
), &data
) );
1221 wxMacControl
* wxMacControl::GetReferenceFromNativeControl(ControlRef control
)
1223 wxMacControl
* ctl
= NULL
;
1224 ByteCount actualSize
;
1225 if ( GetControlProperty( control
,wxMacCreator
,wxMacControlProperty
, sizeof(ctl
) ,
1226 &actualSize
, &ctl
) == noErr
)
1233 // ============================================================================
1234 // DataBrowser Wrapper
1235 // ============================================================================
1237 // basing on DataBrowserItemIDs
1240 IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl
, wxMacControl
)
1242 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
1244 DataBrowserItemID itemID
,
1245 DataBrowserItemNotification message
,
1246 DataBrowserItemDataRef itemData
)
1248 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1251 ctl
->ItemNotification(itemID
, message
, itemData
);
1255 pascal OSStatus
wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
1257 DataBrowserItemID itemID
,
1258 DataBrowserPropertyID property
,
1259 DataBrowserItemDataRef itemData
,
1260 Boolean changeValue
)
1262 OSStatus err
= errDataBrowserPropertyNotSupported
;
1263 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1266 err
= ctl
->GetSetItemData(itemID
, property
, itemData
, changeValue
);
1271 pascal Boolean
wxMacDataBrowserControl::DataBrowserCompareProc(
1273 DataBrowserItemID itemOneID
,
1274 DataBrowserItemID itemTwoID
,
1275 DataBrowserPropertyID sortProperty
)
1277 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1280 return ctl
->CompareItems(itemOneID
, itemTwoID
, sortProperty
);
1285 DataBrowserItemDataUPP gDataBrowserItemDataUPP
= NULL
;
1286 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP
= NULL
;
1287 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP
= NULL
;
1289 wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow
* peer
,
1292 long WXUNUSED(style
))
1293 : wxMacControl( peer
)
1295 Rect bounds
= wxMacGetBoundsForControl( peer
, pos
, size
);
1296 OSStatus err
= ::CreateDataBrowserControl(
1297 MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),
1298 &bounds
, kDataBrowserListView
, &m_controlRef
);
1299 SetReferenceInNativeControl();
1300 verify_noerr( err
);
1301 if ( gDataBrowserItemCompareUPP
== NULL
)
1302 gDataBrowserItemCompareUPP
= NewDataBrowserItemCompareUPP(DataBrowserCompareProc
);
1303 if ( gDataBrowserItemDataUPP
== NULL
)
1304 gDataBrowserItemDataUPP
= NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc
);
1305 if ( gDataBrowserItemNotificationUPP
== NULL
)
1307 gDataBrowserItemNotificationUPP
=
1308 #if TARGET_API_MAC_OSX
1309 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc
);
1311 NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc
);
1315 DataBrowserCallbacks callbacks
;
1316 InitializeDataBrowserCallbacks( &callbacks
, kDataBrowserLatestCallbacks
);
1318 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserItemDataUPP
;
1319 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserItemCompareUPP
;
1320 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserItemNotificationUPP
;
1321 SetCallbacks( &callbacks
);
1325 OSStatus
wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container
,
1327 DataBrowserItemState state
,
1328 ItemCount
*numItems
) const
1330 return GetDataBrowserItemCount( m_controlRef
, container
, recurse
, state
, numItems
);
1333 OSStatus
wxMacDataBrowserControl::GetItems( DataBrowserItemID container
,
1335 DataBrowserItemState state
,
1338 return GetDataBrowserItems( m_controlRef
, container
, recurse
, state
, items
);
1341 OSStatus
wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options
)
1343 return SetDataBrowserSelectionFlags( m_controlRef
, options
);
1346 OSStatus
wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc
*columnDesc
,
1347 DataBrowserTableViewColumnIndex position
)
1349 return AddDataBrowserListViewColumn( m_controlRef
, columnDesc
, position
);
1352 OSStatus
wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position
, DataBrowserTableViewColumnID
* id
){
1353 return GetDataBrowserTableViewColumnProperty( m_controlRef
, position
, id
);
1356 OSStatus
wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position
)
1358 DataBrowserTableViewColumnID id
;
1359 GetColumnIDFromIndex( position
, &id
);
1360 return RemoveDataBrowserTableViewColumn( m_controlRef
, id
);
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 DataBrowserTableViewColumnIndex
*position
) const
1505 return GetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1508 OSStatus
wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column
, DataBrowserTableViewColumnIndex 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()
1585 m_colId
= kTextColumnId
; // for compat with existing wx*ListBox impls.
1588 wxMacDataItem::~wxMacDataItem()
1592 void wxMacDataItem::SetOrder( SInt32 order
)
1597 SInt32
wxMacDataItem::GetOrder() const
1602 void wxMacDataItem::SetData( void* data
)
1607 void* wxMacDataItem::GetData() const
1612 short wxMacDataItem::GetColumn()
1617 void wxMacDataItem::SetColumn( short col
)
1622 void wxMacDataItem::SetLabel( const wxString
& str
)
1625 m_cfLabel
.Assign( str
, wxLocale::GetSystemEncoding());
1628 const wxString
& wxMacDataItem::GetLabel() const
1633 bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1634 const wxMacDataItem
* rhs
,
1635 DataBrowserPropertyID sortProperty
) const
1637 const wxMacDataItem
* otherItem
= wx_const_cast(wxMacDataItem
*,rhs
);
1638 bool retval
= false;
1640 if ( sortProperty
== m_colId
){
1641 retval
= m_label
.CmpNoCase( otherItem
->m_label
) < 0;
1644 else if ( sortProperty
== kNumericOrderColumnId
)
1645 retval
= m_order
< otherItem
->m_order
;
1650 OSStatus
wxMacDataItem::GetSetData( wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1651 DataBrowserPropertyID property
,
1652 DataBrowserItemDataRef itemData
,
1655 OSStatus err
= errDataBrowserPropertyNotSupported
;
1658 if ( property
== m_colId
){
1659 err
= ::SetDataBrowserItemDataText( itemData
, m_cfLabel
);
1662 else if ( property
== kNumericOrderColumnId
){
1663 err
= ::SetDataBrowserItemDataValue( itemData
, m_order
);
1673 // no editable props here
1682 void wxMacDataItem::Notification(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1683 DataBrowserItemNotification
WXUNUSED(message
),
1684 DataBrowserItemDataRef
WXUNUSED(itemData
) ) const
1688 IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl
, wxMacDataBrowserControl
)
1690 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) :
1691 wxMacDataBrowserControl( peer
, pos
, size
, style
)
1693 m_suppressSelection
= false;
1694 m_sortOrder
= SortOrder_None
;
1695 m_clientDataItemsType
= wxClientData_None
;
1698 wxMacDataItem
* wxMacDataItemBrowserControl::CreateItem()
1700 return new wxMacDataItem();
1703 wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl
*browser
)
1705 m_former
= browser
->SuppressSelection(true);
1706 m_browser
= browser
;
1709 wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1711 m_browser
->SuppressSelection(m_former
);
1714 bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress
)
1716 bool former
= m_suppressSelection
;
1717 m_suppressSelection
= suppress
;
1722 Boolean
wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID
,
1723 DataBrowserItemID itemTwoID
,
1724 DataBrowserPropertyID sortProperty
)
1726 wxMacDataItem
* itemOne
= (wxMacDataItem
*) itemOneID
;
1727 wxMacDataItem
* itemTwo
= (wxMacDataItem
*) itemTwoID
;
1728 return CompareItems( itemOne
, itemTwo
, sortProperty
);
1731 Boolean
wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem
* itemOne
,
1732 const wxMacDataItem
* itemTwo
,
1733 DataBrowserPropertyID sortProperty
)
1735 Boolean retval
= false;
1736 if ( itemOne
!= NULL
)
1737 retval
= itemOne
->IsLessThan( this , itemTwo
, sortProperty
);
1741 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1742 DataBrowserItemID itemID
,
1743 DataBrowserPropertyID property
,
1744 DataBrowserItemDataRef itemData
,
1745 Boolean changeValue
)
1747 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1748 return GetSetItemData(item
, property
, itemData
, changeValue
);
1751 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1752 wxMacDataItem
* item
,
1753 DataBrowserPropertyID property
,
1754 DataBrowserItemDataRef itemData
,
1755 Boolean changeValue
)
1757 OSStatus err
= errDataBrowserPropertyNotSupported
;
1760 case kDataBrowserContainerIsClosableProperty
:
1761 case kDataBrowserContainerIsSortableProperty
:
1762 case kDataBrowserContainerIsOpenableProperty
:
1763 // right now default behaviour on these
1767 if ( item
!= NULL
){
1768 err
= item
->GetSetData( this, property
, itemData
, changeValue
);
1776 void wxMacDataItemBrowserControl::ItemNotification(
1777 DataBrowserItemID itemID
,
1778 DataBrowserItemNotification message
,
1779 DataBrowserItemDataRef itemData
)
1781 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1782 ItemNotification( item
, message
, itemData
);
1785 void wxMacDataItemBrowserControl::ItemNotification(
1786 const wxMacDataItem
* item
,
1787 DataBrowserItemNotification message
,
1788 DataBrowserItemDataRef itemData
)
1791 item
->Notification( this, message
, itemData
);
1794 unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem
* container
,
1795 bool recurse
, DataBrowserItemState state
) const
1797 ItemCount numItems
= 0;
1798 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID
)container
,
1799 recurse
, state
, &numItems
) );
1803 unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem
* container
,
1804 bool recurse
) const
1806 return GetItemCount( container
, recurse
, kDataBrowserItemIsSelected
);
1810 void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem
* container
,
1811 bool recurse
, DataBrowserItemState state
, wxArrayMacDataItemPtr
&items
) const
1813 Handle handle
= NewHandle(0);
1814 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID
)container
,
1815 recurse
, state
, handle
) );
1817 int itemCount
= GetHandleSize(handle
)/sizeof(DataBrowserItemID
);
1819 wxMacDataItemPtr
* itemsArray
= (wxMacDataItemPtr
*) *handle
;
1820 for ( int i
= 0; i
< itemCount
; ++i
)
1822 items
.Add(itemsArray
[i
]);
1825 DisposeHandle( handle
);
1828 unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem
* item
) const
1830 DataBrowserTableViewRowIndex row
;
1831 OSStatus err
= GetItemRow( (DataBrowserItemID
) item
, &row
);
1832 wxASSERT( err
== noErr
);
1836 wxMacDataItem
* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n
) const
1838 DataBrowserItemID id
;
1839 OSStatus err
= GetItemID( (DataBrowserTableViewRowIndex
) n
, &id
);
1840 wxASSERT( err
== noErr
);
1841 return (wxMacDataItem
*) id
;
1844 void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem
*container
,
1845 const wxMacDataItem
*item
, DataBrowserPropertyID property
) const
1847 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, 1,
1848 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1851 void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem
*container
,
1852 wxArrayMacDataItemPtr
&itemArray
, DataBrowserPropertyID property
) const
1854 unsigned int noItems
= itemArray
.GetCount();
1855 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1856 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1857 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1859 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, noItems
,
1860 items
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1864 void wxMacDataItemBrowserControl::InsertColumn(int colId
, DataBrowserPropertyType colType
,
1865 const wxString
& title
, SInt16 just
, int defaultWidth
)
1867 DataBrowserListViewColumnDesc columnDesc
;
1868 columnDesc
.headerBtnDesc
.titleOffset
= 0;
1869 columnDesc
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
1871 columnDesc
.headerBtnDesc
.btnFontStyle
.flags
=
1872 kControlUseFontMask
| kControlUseJustMask
;
1874 columnDesc
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentTextOnly
;
1875 columnDesc
.headerBtnDesc
.btnFontStyle
.just
= just
;
1876 columnDesc
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
1877 columnDesc
.headerBtnDesc
.btnFontStyle
.style
= normal
;
1879 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1880 // defined for other modes?
1883 enc
= m_font
.GetEncoding();
1885 enc
= wxLocale::GetSystemEncoding();
1886 wxMacCFStringHolder cfTitle
;
1887 cfTitle
.Assign( title
, enc
);
1888 columnDesc
.headerBtnDesc
.titleString
= cfTitle
;
1890 columnDesc
.headerBtnDesc
.minimumWidth
= 0;
1891 columnDesc
.headerBtnDesc
.maximumWidth
= 30000;
1893 columnDesc
.propertyDesc
.propertyID
= (kMinColumnId
+ colId
);
1894 columnDesc
.propertyDesc
.propertyType
= colType
;
1895 columnDesc
.propertyDesc
.propertyFlags
= kDataBrowserListViewSortableColumn
;
1896 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
1897 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
;
1899 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
1900 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
1903 verify_noerr( AddColumn( &columnDesc
, kDataBrowserListViewAppendColumn
) );
1905 if (defaultWidth
> 0){
1906 SetColumnWidth(colId
, defaultWidth
);
1911 void wxMacDataItemBrowserControl::SetColumnWidth(int colId
, int width
)
1913 DataBrowserPropertyID id
;
1914 GetColumnIDFromIndex(colId
, &id
);
1915 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id
, width
));
1918 int wxMacDataItemBrowserControl::GetColumnWidth(int colId
)
1920 DataBrowserPropertyID id
;
1921 GetColumnIDFromIndex(colId
, &id
);
1923 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id
, &result
));
1927 void wxMacDataItemBrowserControl::AddItem(wxMacDataItem
*container
, wxMacDataItem
*item
)
1929 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, 1,
1930 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
) );
1933 void wxMacDataItemBrowserControl::AddItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1935 unsigned int noItems
= itemArray
.GetCount();
1936 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1937 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1938 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1940 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, noItems
,
1941 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
) );
1945 void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem
*container
, wxMacDataItem
* item
)
1947 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 1,
1948 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
);
1949 verify_noerr( err
);
1952 void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1954 unsigned int noItems
= itemArray
.GetCount();
1955 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1956 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1957 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1959 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, noItems
,
1960 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
);
1961 verify_noerr( err
);
1965 void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem
*container
)
1967 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 0 , NULL
, kDataBrowserItemNoProperty
);
1968 verify_noerr( err
);
1971 void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem
* item
, DataBrowserSetOption option
)
1973 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID
*) &item
, option
));
1976 void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option
)
1978 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL
, option
));
1981 void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr
&itemArray
, DataBrowserSetOption option
)
1983 unsigned int noItems
= itemArray
.GetCount();
1984 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1985 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1986 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1988 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems
, (DataBrowserItemID
*) items
, option
));
1992 Boolean
wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem
* item
) const
1994 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID
) item
);
1997 void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem
* item
, DataBrowserRevealOptions options
)
1999 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID
) item
, kDataBrowserNoItem
, options
) );
2002 void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr
* first
, wxMacDataItemPtr
* last
) const
2004 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID
*) first
, (DataBrowserItemID
*) last
) );
2007 wxClientDataType
wxMacDataItemBrowserControl::GetClientDataType() const
2009 return m_clientDataItemsType
;
2011 void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType
)
2013 m_clientDataItemsType
= clientDataItemsType
;
2016 unsigned int wxMacDataItemBrowserControl::MacGetCount() const
2018 return GetItemCount(wxMacDataBrowserRootContainer
,false,kDataBrowserItemAnyState
);
2021 void wxMacDataItemBrowserControl::MacDelete( unsigned int n
)
2023 wxMacDataItem
* item
= (wxMacDataItem
*)GetItemFromLine( n
);
2024 RemoveItem( wxMacDataBrowserRootContainer
, item
);
2027 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
,
2028 const wxArrayStringsAdapter
& items
,
2031 size_t itemsCount
= items
.GetCount();
2032 if ( itemsCount
== 0 )
2035 SInt32 frontLineOrder
= 0;
2037 if ( m_sortOrder
== SortOrder_None
)
2039 // increase the order of the lines to be shifted
2040 unsigned int lines
= MacGetCount();
2041 for ( unsigned int i
= n
; i
< lines
; ++i
)
2043 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
2044 iter
->SetOrder( iter
->GetOrder() + itemsCount
);
2048 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
2049 frontLineOrder
= iter
->GetOrder();
2053 wxArrayMacDataItemPtr ids
;
2054 ids
.SetCount( itemsCount
);
2056 for ( unsigned int i
= 0; i
< itemsCount
; ++i
)
2058 wxMacDataItem
* item
= CreateItem();
2059 item
->SetLabel( items
[i
]);
2061 item
->SetColumn( kMinColumnId
+ column
);
2063 if ( m_sortOrder
== SortOrder_None
)
2064 item
->SetOrder( frontLineOrder
+ 1 + i
);
2069 AddItems( wxMacDataBrowserRootContainer
, ids
);
2072 int wxMacDataItemBrowserControl::MacAppend( const wxString
& text
)
2074 wxMacDataItem
* item
= CreateItem();
2075 item
->SetLabel( text
);
2076 if ( m_sortOrder
== SortOrder_None
)
2078 unsigned int lines
= MacGetCount();
2080 item
->SetOrder( 1 );
2083 wxMacDataItem
* frontItem
= (wxMacDataItem
*) GetItemFromLine(lines
-1);
2084 item
->SetOrder( frontItem
->GetOrder() + 1 );
2087 AddItem( wxMacDataBrowserRootContainer
, item
);
2089 return GetLineFromItem(item
);
2092 void wxMacDataItemBrowserControl::MacClear()
2094 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2095 RemoveAllItems(wxMacDataBrowserRootContainer
);
2098 void wxMacDataItemBrowserControl::MacDeselectAll()
2100 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2101 SetSelectedAllItems( kDataBrowserItemsRemove
);
2104 void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n
, bool select
, bool multi
)
2106 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
2107 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2109 if ( IsItemSelected( item
) != select
)
2112 SetSelectedItem( item
, multi
? kDataBrowserItemsAdd
: kDataBrowserItemsAssign
);
2114 SetSelectedItem( item
, kDataBrowserItemsRemove
);
2120 bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n
) const
2122 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
2123 return IsItemSelected( item
);
2126 int wxMacDataItemBrowserControl::MacGetSelection() const
2128 wxMacDataItemPtr first
, last
;
2129 GetSelectionAnchor( &first
, &last
);
2131 if ( first
!= NULL
)
2133 return GetLineFromItem( first
);
2139 int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt
& aSelections
) const
2141 aSelections
.Empty();
2142 wxArrayMacDataItemPtr selectedItems
;
2143 GetItems( wxMacDataBrowserRootContainer
, false , kDataBrowserItemIsSelected
, selectedItems
);
2145 int count
= selectedItems
.GetCount();
2147 for ( int i
= 0; i
< count
; ++i
)
2149 aSelections
.Add(GetLineFromItem(selectedItems
[i
]));
2155 void wxMacDataItemBrowserControl::MacSetString( unsigned int n
, const wxString
& text
)
2157 // as we don't store the strings we only have to issue a redraw
2158 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2159 item
->SetLabel( text
);
2160 UpdateItem( wxMacDataBrowserRootContainer
, item
, kTextColumnId
);
2163 wxString
wxMacDataItemBrowserControl::MacGetString( unsigned int n
) const
2165 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2166 return item
->GetLabel();
2169 void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n
, void * data
)
2171 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2172 item
->SetData( data
);
2173 // not displayed, therefore no Update infos to DataBrowser
2176 void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n
) const
2178 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2179 return item
->GetData();
2182 void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n
)
2184 RevealItem( GetItemFromLine( n
) , kDataBrowserRevealWithoutSelecting
);
2193 OSStatus
wxMacControl::SetTabEnabled( SInt16 tabNo
, bool enable
)
2195 return ::SetTabEnabled( m_controlRef
, tabNo
, enable
);
2202 #ifdef __WXMAC_OSX__
2203 // snippets from Sketch Sample from Apple :
2205 #define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc"
2208 This function locates, opens, and returns the profile reference for the calibrated
2209 Generic RGB color space. It is up to the caller to call CMCloseProfile when done
2210 with the profile reference this function returns.
2212 CMProfileRef
wxMacOpenGenericProfile()
2214 static CMProfileRef cachedRGBProfileRef
= NULL
;
2216 // we only create the profile reference once
2217 if (cachedRGBProfileRef
== NULL
)
2219 CMProfileLocation loc
;
2221 loc
.locType
= cmPathBasedProfile
;
2222 strcpy(loc
.u
.pathLoc
.path
, kGenericRGBProfilePathStr
);
2224 verify_noerr( CMOpenProfile(&cachedRGBProfileRef
, &loc
) );
2227 // clone the profile reference so that the caller has their own reference, not our cached one
2228 if (cachedRGBProfileRef
)
2229 CMCloneProfileRef(cachedRGBProfileRef
);
2231 return cachedRGBProfileRef
;
2235 Return the generic RGB color space. This is a 'get' function and the caller should
2236 not release the returned value unless the caller retains it first. Usually callers
2237 of this routine will immediately use the returned colorspace with CoreGraphics
2238 so they typically do not need to retain it themselves.
2240 This function creates the generic RGB color space once and hangs onto it so it can
2241 return it whenever this function is called.
2244 CGColorSpaceRef
wxMacGetGenericRGBColorSpace()
2246 static wxMacCFRefHolder
<CGColorSpaceRef
> genericRGBColorSpace
;
2248 if (genericRGBColorSpace
== NULL
)
2250 if ( UMAGetSystemVersion() >= 0x1040 )
2252 genericRGBColorSpace
.Set( CGColorSpaceCreateWithName( CFSTR("kCGColorSpaceGenericRGB") ) );
2256 CMProfileRef genericRGBProfile
= wxMacOpenGenericProfile();
2258 if (genericRGBProfile
)
2260 genericRGBColorSpace
.Set( CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile
) );
2262 wxASSERT_MSG( genericRGBColorSpace
!= NULL
, wxT("couldn't create the generic RGB color space") );
2264 // we opened the profile so it is up to us to close it
2265 CMCloseProfile(genericRGBProfile
);
2270 return genericRGBColorSpace
;
2276 wxMacPortSaver::wxMacPortSaver( GrafPtr port
)
2278 ::GetPort( &m_port
);
2282 wxMacPortSaver::~wxMacPortSaver()
2284 ::SetPort( m_port
);
2288 void wxMacGlobalToLocal( WindowRef window
, Point
*pt
)
2290 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
2291 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
2292 HIViewRef contentView
;
2293 // TODO check toolbar offset
2294 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
2295 HIPointConvert( &p
, kHICoordSpace72DPIGlobal
, NULL
, kHICoordSpaceView
, contentView
);
2299 QDGlobalToLocalPoint( GetWindowPort(window
), pt
) ;
2303 void wxMacLocalToGlobal( WindowRef window
, Point
*pt
)
2305 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
2306 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
2307 HIViewRef contentView
;
2308 // TODO check toolbar offset
2309 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
2310 HIPointConvert( &p
, kHICoordSpaceView
, contentView
, kHICoordSpace72DPIGlobal
, NULL
);
2314 QDLocalToGlobalPoint( GetWindowPort(window
), pt
) ;