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
);
674 OSStatus err
= noErr
;
677 // lead sometimes to race conditions, although all calls used should be thread safe ...
678 static wxMacCarbonEvent s_wakeupEvent
;
679 if ( !s_wakeupEvent
.IsValid() )
681 err
= s_wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
682 kEventAttributeNone
);
687 if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent
) )
689 s_wakeupEvent
.SetCurrentTime();
690 err
= PostEventToQueue(GetMainEventQueue(), s_wakeupEvent
,
691 kEventPriorityHigh
);
694 wxMacCarbonEvent wakeupEvent
;
695 wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
696 kEventAttributeNone
);
697 err
= PostEventToQueue(GetMainEventQueue(), wakeupEvent
,
698 kEventPriorityHigh
);
703 WakeUpProcess( &gAppProcess
);
711 // ----------------------------------------------------------------------------
712 // Native Struct Conversions
713 // ----------------------------------------------------------------------------
715 void wxMacRectToNative( const wxRect
*wx
, Rect
*n
)
719 n
->right
= wx
->x
+ wx
->width
;
720 n
->bottom
= wx
->y
+ wx
->height
;
723 void wxMacNativeToRect( const Rect
*n
, wxRect
* wx
)
727 wx
->width
= n
->right
- n
->left
;
728 wx
->height
= n
->bottom
- n
->top
;
731 void wxMacPointToNative( const wxPoint
* wx
, Point
*n
)
737 void wxMacNativeToPoint( const Point
*n
, wxPoint
* wx
)
743 // ----------------------------------------------------------------------------
744 // Carbon Event Support
745 // ----------------------------------------------------------------------------
747 OSStatus
wxMacCarbonEvent::GetParameter(EventParamName inName
, EventParamType inDesiredType
, UInt32 inBufferSize
, void * outData
)
749 return ::GetEventParameter( m_eventRef
, inName
, inDesiredType
, NULL
, inBufferSize
, NULL
, outData
);
752 OSStatus
wxMacCarbonEvent::SetParameter(EventParamName inName
, EventParamType inType
, UInt32 inBufferSize
, const void * inData
)
754 return ::SetEventParameter( m_eventRef
, inName
, inType
, inBufferSize
, inData
);
757 // ----------------------------------------------------------------------------
758 // Control Access Support
759 // ----------------------------------------------------------------------------
761 IMPLEMENT_DYNAMIC_CLASS( wxMacControl
, wxObject
)
763 wxMacControl::wxMacControl()
768 wxMacControl::wxMacControl(wxWindow
* peer
, bool isRootControl
)
772 m_isRootControl
= isRootControl
;
775 wxMacControl::wxMacControl( wxWindow
* peer
, ControlRef control
)
779 m_controlRef
= control
;
782 wxMacControl::wxMacControl( wxWindow
* peer
, WXWidget control
)
786 m_controlRef
= (ControlRef
) control
;
789 wxMacControl::~wxMacControl()
793 void wxMacControl::Init()
797 m_needsFocusRect
= false;
798 m_isRootControl
= false;
801 void wxMacControl::Dispose()
803 wxASSERT_MSG( m_controlRef
!= NULL
, wxT("Control Handle already NULL, Dispose called twice ?") );
804 wxASSERT_MSG( IsValidControlHandle(m_controlRef
) , wxT("Invalid Control Handle (maybe already released) in Dispose") );
806 // we cannot check the ref count here anymore, as autorelease objects might delete their refs later
807 // we can have situations when being embedded, where the control gets deleted behind our back, so only
808 // CFRelease if we are safe
809 if ( IsValidControlHandle(m_controlRef
) )
810 CFRelease(m_controlRef
);
814 void wxMacControl::SetReference( URefCon data
)
816 SetControlReference( m_controlRef
, data
);
819 OSStatus
wxMacControl::GetData(ControlPartCode inPartCode
, ResType inTag
, Size inBufferSize
, void * inOutBuffer
, Size
* outActualSize
) const
821 return ::GetControlData( m_controlRef
, inPartCode
, inTag
, inBufferSize
, inOutBuffer
, outActualSize
);
824 OSStatus
wxMacControl::GetDataSize(ControlPartCode inPartCode
, ResType inTag
, Size
* outActualSize
) const
826 return ::GetControlDataSize( m_controlRef
, inPartCode
, inTag
, outActualSize
);
829 OSStatus
wxMacControl::SetData(ControlPartCode inPartCode
, ResType inTag
, Size inSize
, const void * inData
)
831 return ::SetControlData( m_controlRef
, inPartCode
, inTag
, inSize
, inData
);
834 OSStatus
wxMacControl::SendEvent( EventRef event
, OptionBits inOptions
)
836 #if TARGET_API_MAC_OSX
837 return SendEventToEventTargetWithOptions( event
,
838 HIObjectGetEventTarget( (HIObjectRef
) m_controlRef
), inOptions
);
840 #pragma unused(inOptions)
841 return SendEventToEventTarget(event
,GetControlEventTarget( m_controlRef
) );
845 OSStatus
wxMacControl::SendHICommand( HICommand
&command
, OptionBits inOptions
)
847 wxMacCarbonEvent
event( kEventClassCommand
, kEventCommandProcess
);
849 event
.SetParameter
<HICommand
>(kEventParamDirectObject
,command
);
851 return SendEvent( event
, inOptions
);
854 OSStatus
wxMacControl::SendHICommand( UInt32 commandID
, OptionBits inOptions
)
858 memset( &command
, 0 , sizeof(command
) );
859 command
.commandID
= commandID
;
860 return SendHICommand( command
, inOptions
);
863 void wxMacControl::Flash( ControlPartCode part
, UInt32 ticks
)
865 unsigned long finalTicks
;
867 HiliteControl( m_controlRef
, part
);
868 Delay( ticks
, &finalTicks
);
869 HiliteControl( m_controlRef
, kControlNoPart
);
872 SInt32
wxMacControl::GetValue() const
874 return ::GetControl32BitValue( m_controlRef
);
877 SInt32
wxMacControl::GetMaximum() const
879 return ::GetControl32BitMaximum( m_controlRef
);
882 SInt32
wxMacControl::GetMinimum() const
884 return ::GetControl32BitMinimum( m_controlRef
);
887 void wxMacControl::SetValue( SInt32 v
)
889 ::SetControl32BitValue( m_controlRef
, v
);
892 void wxMacControl::SetMinimum( SInt32 v
)
894 ::SetControl32BitMinimum( m_controlRef
, v
);
897 void wxMacControl::SetMaximum( SInt32 v
)
899 ::SetControl32BitMaximum( m_controlRef
, v
);
902 void wxMacControl::SetValueAndRange( SInt32 value
, SInt32 minimum
, SInt32 maximum
)
904 ::SetControl32BitMinimum( m_controlRef
, minimum
);
905 ::SetControl32BitMaximum( m_controlRef
, maximum
);
906 ::SetControl32BitValue( m_controlRef
, value
);
909 OSStatus
wxMacControl::SetFocus( ControlFocusPart focusPart
)
911 return SetKeyboardFocus( GetControlOwner( m_controlRef
), m_controlRef
, focusPart
);
914 bool wxMacControl::HasFocus() const
917 GetKeyboardFocus( GetUserFocusWindow() , &control
);
918 return control
== m_controlRef
;
921 void wxMacControl::SetNeedsFocusRect( bool needs
)
923 m_needsFocusRect
= needs
;
926 bool wxMacControl::NeedsFocusRect() const
928 return m_needsFocusRect
;
931 void wxMacControl::VisibilityChanged(bool WXUNUSED(shown
))
935 void wxMacControl::SuperChangedPosition()
939 void wxMacControl::SetFont( const wxFont
& font
, const wxColour
& foreground
, long windowStyle
)
943 ControlFontStyleRec fontStyle
;
944 if ( font
.MacGetThemeFontID() != kThemeCurrentPortFont
)
946 switch ( font
.MacGetThemeFontID() )
948 case kThemeSmallSystemFont
:
949 fontStyle
.font
= kControlFontSmallSystemFont
;
952 case 109 : // mini font
956 case kThemeSystemFont
:
957 fontStyle
.font
= kControlFontBigSystemFont
;
961 fontStyle
.font
= kControlFontBigSystemFont
;
965 fontStyle
.flags
= kControlUseFontMask
;
969 fontStyle
.font
= font
.MacGetFontNum();
970 fontStyle
.style
= font
.MacGetFontStyle();
971 fontStyle
.size
= font
.MacGetFontSize();
972 fontStyle
.flags
= kControlUseFontMask
| kControlUseFaceMask
| kControlUseSizeMask
;
975 fontStyle
.just
= teJustLeft
;
976 fontStyle
.flags
|= kControlUseJustMask
;
977 if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_CENTER_HORIZONTAL
)
978 fontStyle
.just
= teJustCenter
;
979 else if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_RIGHT
)
980 fontStyle
.just
= teJustRight
;
983 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
984 // won't get grayed out by the system anymore
986 if ( foreground
!= *wxBLACK
)
988 fontStyle
.foreColor
= MAC_WXCOLORREF( foreground
.GetPixel() );
989 fontStyle
.flags
|= kControlUseForeColorMask
;
992 ::SetControlFontStyle( m_controlRef
, &fontStyle
);
996 void wxMacControl::SetBackground( const wxBrush
&WXUNUSED(brush
) )
999 // setting up a color proc is not recommended anymore
1002 void wxMacControl::SetRange( SInt32 minimum
, SInt32 maximum
)
1004 ::SetControl32BitMinimum( m_controlRef
, minimum
);
1005 ::SetControl32BitMaximum( m_controlRef
, maximum
);
1008 short wxMacControl::HandleKey( SInt16 keyCode
, SInt16 charCode
, EventModifiers modifiers
)
1011 return HandleControlKey( m_controlRef
, keyCode
, charCode
, modifiers
);
1017 void wxMacControl::SetActionProc( ControlActionUPP actionProc
)
1019 SetControlAction( m_controlRef
, actionProc
);
1022 void wxMacControl::SetViewSize( SInt32 viewSize
)
1024 SetControlViewSize(m_controlRef
, viewSize
);
1027 SInt32
wxMacControl::GetViewSize() const
1029 return GetControlViewSize( m_controlRef
);
1032 bool wxMacControl::IsVisible() const
1034 return IsControlVisible( m_controlRef
);
1037 void wxMacControl::SetVisibility( bool visible
, bool redraw
)
1039 SetControlVisibility( m_controlRef
, visible
, redraw
);
1042 bool wxMacControl::IsEnabled() const
1044 #if TARGET_API_MAC_OSX
1045 return IsControlEnabled( m_controlRef
);
1047 return IsControlActive( m_controlRef
);
1051 bool wxMacControl::IsActive() const
1053 return IsControlActive( m_controlRef
);
1056 void wxMacControl::Enable( bool enable
)
1059 EnableControl( m_controlRef
);
1061 DisableControl( m_controlRef
);
1064 void wxMacControl::SetDrawingEnabled( bool enable
)
1066 HIViewSetDrawingEnabled( m_controlRef
, enable
);
1069 bool wxMacControl::GetNeedsDisplay() const
1071 return HIViewGetNeedsDisplay( m_controlRef
);
1074 void wxMacControl::SetNeedsDisplay( RgnHandle where
)
1079 HIViewSetNeedsDisplayInRegion( m_controlRef
, where
, true );
1082 void wxMacControl::SetNeedsDisplay( Rect
* where
)
1087 if ( where
!= NULL
)
1089 RgnHandle update
= NewRgn();
1090 RectRgn( update
, where
);
1091 HIViewSetNeedsDisplayInRegion( m_controlRef
, update
, true );
1092 DisposeRgn( update
);
1095 HIViewSetNeedsDisplay( m_controlRef
, true );
1098 void wxMacControl::Convert( wxPoint
*pt
, wxMacControl
*from
, wxMacControl
*to
)
1104 HIViewConvertPoint( &hiPoint
, from
->m_controlRef
, to
->m_controlRef
);
1105 pt
->x
= (int)hiPoint
.x
;
1106 pt
->y
= (int)hiPoint
.y
;
1109 void wxMacControl::SetRect( Rect
*r
)
1111 //A HIRect is actually a CGRect on OSX - which consists of two structures -
1112 //CGPoint and CGSize, which have two floats each
1113 HIRect hir
= { { r
->left
, r
->top
}, { r
->right
- r
->left
, r
->bottom
- r
->top
} };
1114 HIViewSetFrame ( m_controlRef
, &hir
);
1115 // eventuall we might have to do a SetVisibility( false , true );
1116 // before and a SetVisibility( true , true ); after
1119 void wxMacControl::GetRect( Rect
*r
)
1121 GetControlBounds( m_controlRef
, r
);
1124 void wxMacControl::GetRectInWindowCoords( Rect
*r
)
1126 UMAGetControlBoundsInWindowCoords( m_controlRef
, r
);
1129 void wxMacControl::GetBestRect( Rect
*r
)
1131 short baselineoffset
;
1133 GetBestControlRect( m_controlRef
, r
, &baselineoffset
);
1136 void wxMacControl::SetLabel( const wxString
&title
)
1138 wxFontEncoding encoding
;
1141 encoding
= m_font
.GetEncoding();
1143 encoding
= wxFont::GetDefaultEncoding();
1145 UMASetControlTitle( m_controlRef
, title
, encoding
);
1148 void wxMacControl::GetFeatures( UInt32
* features
)
1150 GetControlFeatures( m_controlRef
, features
);
1153 OSStatus
wxMacControl::GetRegion( ControlPartCode partCode
, RgnHandle region
)
1155 OSStatus err
= GetControlRegion( m_controlRef
, partCode
, region
);
1159 OSStatus
wxMacControl::SetZOrder( bool above
, wxMacControl
* other
)
1161 #if TARGET_API_MAC_OSX
1162 return HIViewSetZOrder( m_controlRef
,above
? kHIViewZOrderAbove
: kHIViewZOrderBelow
,
1163 (other
!= NULL
) ? other
->m_controlRef
: NULL
);
1169 #if TARGET_API_MAC_OSX
1170 // SetNeedsDisplay would not invalidate the children
1171 static void InvalidateControlAndChildren( HIViewRef control
)
1173 HIViewSetNeedsDisplay( control
, true );
1174 UInt16 childrenCount
= 0;
1175 OSStatus err
= CountSubControls( control
, &childrenCount
);
1176 if ( err
== errControlIsNotEmbedder
)
1179 wxASSERT_MSG( err
== noErr
, wxT("Unexpected error when accessing subcontrols") );
1181 for ( UInt16 i
= childrenCount
; i
>=1; --i
)
1185 err
= GetIndexedSubControl( control
, i
, & child
);
1186 if ( err
== errControlIsNotEmbedder
)
1189 InvalidateControlAndChildren( child
);
1194 void wxMacControl::InvalidateWithChildren()
1196 #if TARGET_API_MAC_OSX
1197 InvalidateControlAndChildren( m_controlRef
);
1201 void wxMacControl::ScrollRect( wxRect
*r
, int dx
, int dy
)
1203 wxASSERT( r
!= NULL
);
1205 HIRect scrollarea
= CGRectMake( r
->x
, r
->y
, r
->width
, r
->height
);
1206 HIViewScrollRect ( m_controlRef
, &scrollarea
, dx
,dy
);
1209 OSType wxMacCreator
= 'WXMC';
1210 OSType wxMacControlProperty
= 'MCCT';
1212 void wxMacControl::SetReferenceInNativeControl()
1215 verify_noerr( SetControlProperty ( m_controlRef
,
1216 wxMacCreator
,wxMacControlProperty
, sizeof(data
), &data
) );
1219 wxMacControl
* wxMacControl::GetReferenceFromNativeControl(ControlRef control
)
1221 wxMacControl
* ctl
= NULL
;
1222 ByteCount actualSize
;
1223 if ( GetControlProperty( control
,wxMacCreator
,wxMacControlProperty
, sizeof(ctl
) ,
1224 &actualSize
, &ctl
) == noErr
)
1231 // ============================================================================
1232 // DataBrowser Wrapper
1233 // ============================================================================
1235 // basing on DataBrowserItemIDs
1238 IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl
, wxMacControl
)
1240 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
1242 DataBrowserItemID itemID
,
1243 DataBrowserItemNotification message
,
1244 DataBrowserItemDataRef itemData
)
1246 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1249 ctl
->ItemNotification(itemID
, message
, itemData
);
1253 pascal OSStatus
wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
1255 DataBrowserItemID itemID
,
1256 DataBrowserPropertyID property
,
1257 DataBrowserItemDataRef itemData
,
1258 Boolean changeValue
)
1260 OSStatus err
= errDataBrowserPropertyNotSupported
;
1261 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1264 err
= ctl
->GetSetItemData(itemID
, property
, itemData
, changeValue
);
1269 pascal Boolean
wxMacDataBrowserControl::DataBrowserCompareProc(
1271 DataBrowserItemID itemOneID
,
1272 DataBrowserItemID itemTwoID
,
1273 DataBrowserPropertyID sortProperty
)
1275 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1278 return ctl
->CompareItems(itemOneID
, itemTwoID
, sortProperty
);
1283 DataBrowserItemDataUPP gDataBrowserItemDataUPP
= NULL
;
1284 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP
= NULL
;
1285 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP
= NULL
;
1287 wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow
* peer
,
1290 long WXUNUSED(style
))
1291 : wxMacControl( peer
)
1293 Rect bounds
= wxMacGetBoundsForControl( peer
, pos
, size
);
1294 OSStatus err
= ::CreateDataBrowserControl(
1295 MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),
1296 &bounds
, kDataBrowserListView
, &m_controlRef
);
1297 SetReferenceInNativeControl();
1298 verify_noerr( err
);
1299 if ( gDataBrowserItemCompareUPP
== NULL
)
1300 gDataBrowserItemCompareUPP
= NewDataBrowserItemCompareUPP(DataBrowserCompareProc
);
1301 if ( gDataBrowserItemDataUPP
== NULL
)
1302 gDataBrowserItemDataUPP
= NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc
);
1303 if ( gDataBrowserItemNotificationUPP
== NULL
)
1305 gDataBrowserItemNotificationUPP
=
1306 #if TARGET_API_MAC_OSX
1307 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc
);
1309 NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc
);
1313 DataBrowserCallbacks callbacks
;
1314 InitializeDataBrowserCallbacks( &callbacks
, kDataBrowserLatestCallbacks
);
1316 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserItemDataUPP
;
1317 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserItemCompareUPP
;
1318 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserItemNotificationUPP
;
1319 SetCallbacks( &callbacks
);
1323 OSStatus
wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container
,
1325 DataBrowserItemState state
,
1326 ItemCount
*numItems
) const
1328 return GetDataBrowserItemCount( m_controlRef
, container
, recurse
, state
, numItems
);
1331 OSStatus
wxMacDataBrowserControl::GetItems( DataBrowserItemID container
,
1333 DataBrowserItemState state
,
1336 return GetDataBrowserItems( m_controlRef
, container
, recurse
, state
, items
);
1339 OSStatus
wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options
)
1341 return SetDataBrowserSelectionFlags( m_controlRef
, options
);
1344 OSStatus
wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc
*columnDesc
,
1345 DataBrowserTableViewColumnIndex position
)
1347 return AddDataBrowserListViewColumn( m_controlRef
, columnDesc
, position
);
1350 OSStatus
wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position
, DataBrowserTableViewColumnID
* id
){
1351 return GetDataBrowserTableViewColumnProperty( m_controlRef
, position
, id
);
1354 OSStatus
wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position
)
1356 DataBrowserTableViewColumnID id
;
1357 GetColumnIDFromIndex( position
, &id
);
1358 return RemoveDataBrowserTableViewColumn( m_controlRef
, id
);
1361 OSStatus
wxMacDataBrowserControl::AutoSizeColumns()
1363 return AutoSizeDataBrowserListViewColumns(m_controlRef
);
1366 OSStatus
wxMacDataBrowserControl::SetHasScrollBars( bool horiz
, bool vert
)
1368 return SetDataBrowserHasScrollBars( m_controlRef
, horiz
, vert
);
1371 OSStatus
wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle
)
1373 return SetDataBrowserTableViewHiliteStyle( m_controlRef
, hiliteStyle
);
1376 OSStatus
wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height
)
1378 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1381 OSStatus
wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16
*height
)
1383 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1386 OSStatus
wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks
*callbacks
)
1388 return SetDataBrowserCallbacks( m_controlRef
, callbacks
);
1391 OSStatus
wxMacDataBrowserControl::UpdateItems(
1392 DataBrowserItemID container
,
1394 const DataBrowserItemID
*items
,
1395 DataBrowserPropertyID preSortProperty
,
1396 DataBrowserPropertyID propertyID
) const
1398 return UpdateDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
, propertyID
);
1401 bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item
) const
1403 return IsDataBrowserItemSelected( m_controlRef
, item
);
1406 OSStatus
wxMacDataBrowserControl::AddItems(
1407 DataBrowserItemID container
,
1409 const DataBrowserItemID
*items
,
1410 DataBrowserPropertyID preSortProperty
)
1412 return AddDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1415 OSStatus
wxMacDataBrowserControl::RemoveItems(
1416 DataBrowserItemID container
,
1418 const DataBrowserItemID
*items
,
1419 DataBrowserPropertyID preSortProperty
)
1421 return RemoveDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1424 OSStatus
wxMacDataBrowserControl::RevealItem(
1425 DataBrowserItemID item
,
1426 DataBrowserPropertyID propertyID
,
1427 DataBrowserRevealOptions options
) const
1429 return RevealDataBrowserItem( m_controlRef
, item
, propertyID
, options
);
1432 OSStatus
wxMacDataBrowserControl::SetSelectedItems(
1434 const DataBrowserItemID
*items
,
1435 DataBrowserSetOption operation
)
1437 return SetDataBrowserSelectedItems( m_controlRef
, numItems
, items
, operation
);
1440 OSStatus
wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID
*first
, DataBrowserItemID
*last
) const
1442 return GetDataBrowserSelectionAnchor( m_controlRef
, first
, last
);
1445 OSStatus
wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
1447 return GetDataBrowserTableViewItemID( m_controlRef
, row
, item
);
1450 OSStatus
wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
1452 return GetDataBrowserTableViewItemRow( m_controlRef
, item
, row
);
1455 OSStatus
wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height
)
1457 return SetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1460 OSStatus
wxMacDataBrowserControl::GetDefaultRowHeight( UInt16
* height
) const
1462 return GetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1465 OSStatus
wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item
, UInt16 height
)
1467 return SetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1470 OSStatus
wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item
, UInt16
*height
) const
1472 return GetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1475 OSStatus
wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column
, UInt16
*width
) const
1477 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1480 OSStatus
wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column
, UInt16 width
)
1482 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1485 OSStatus
wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16
*width
) const
1487 return GetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1490 OSStatus
wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width
)
1492 return SetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1495 OSStatus
wxMacDataBrowserControl::GetColumnCount(UInt32
* numColumns
) const
1497 return GetDataBrowserTableViewColumnCount( m_controlRef
, numColumns
);
1500 OSStatus
wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column
,
1501 DataBrowserTableViewColumnIndex
*position
) const
1503 return GetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1506 OSStatus
wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column
, DataBrowserTableViewColumnIndex position
)
1508 return SetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1511 OSStatus
wxMacDataBrowserControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
1513 return GetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1516 OSStatus
wxMacDataBrowserControl::SetScrollPosition( UInt32 top
, UInt32 left
)
1518 return SetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1521 OSStatus
wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID
*column
) const
1523 return GetDataBrowserSortProperty( m_controlRef
, column
);
1526 OSStatus
wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column
)
1528 return SetDataBrowserSortProperty( m_controlRef
, column
);
1531 OSStatus
wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder
*order
) const
1533 return GetDataBrowserSortOrder( m_controlRef
, order
);
1536 OSStatus
wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order
)
1538 return SetDataBrowserSortOrder( m_controlRef
, order
);
1541 OSStatus
wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property
,
1542 DataBrowserPropertyFlags
*flags
) const
1544 return GetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1547 OSStatus
wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property
,
1548 DataBrowserPropertyFlags flags
)
1550 return SetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1553 OSStatus
wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property
,
1554 DataBrowserListViewHeaderDesc
*desc
) const
1556 return GetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1559 OSStatus
wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property
,
1560 DataBrowserListViewHeaderDesc
*desc
)
1562 return SetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1565 OSStatus
wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property
,
1566 Boolean expandableRows
)
1568 return SetDataBrowserListViewDisclosureColumn( m_controlRef
, property
, expandableRows
);
1571 // ============================================================================
1572 // Higher-level Databrowser
1573 // ============================================================================
1575 // basing on data item objects
1578 wxMacDataItem::wxMacDataItem()
1583 m_colId
= kTextColumnId
; // for compat with existing wx*ListBox impls.
1586 wxMacDataItem::~wxMacDataItem()
1590 void wxMacDataItem::SetOrder( SInt32 order
)
1595 SInt32
wxMacDataItem::GetOrder() const
1600 void wxMacDataItem::SetData( void* data
)
1605 void* wxMacDataItem::GetData() const
1610 short wxMacDataItem::GetColumn()
1615 void wxMacDataItem::SetColumn( short col
)
1620 void wxMacDataItem::SetLabel( const wxString
& str
)
1623 m_cfLabel
.Assign( str
, wxLocale::GetSystemEncoding());
1626 const wxString
& wxMacDataItem::GetLabel() const
1631 bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1632 const wxMacDataItem
* rhs
,
1633 DataBrowserPropertyID sortProperty
) const
1635 const wxMacDataItem
* otherItem
= wx_const_cast(wxMacDataItem
*,rhs
);
1636 bool retval
= false;
1638 if ( sortProperty
== m_colId
){
1639 retval
= m_label
.CmpNoCase( otherItem
->m_label
) < 0;
1642 else if ( sortProperty
== kNumericOrderColumnId
)
1643 retval
= m_order
< otherItem
->m_order
;
1648 OSStatus
wxMacDataItem::GetSetData( wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1649 DataBrowserPropertyID property
,
1650 DataBrowserItemDataRef itemData
,
1653 OSStatus err
= errDataBrowserPropertyNotSupported
;
1656 if ( property
== m_colId
){
1657 err
= ::SetDataBrowserItemDataText( itemData
, m_cfLabel
);
1660 else if ( property
== kNumericOrderColumnId
){
1661 err
= ::SetDataBrowserItemDataValue( itemData
, m_order
);
1671 // no editable props here
1680 void wxMacDataItem::Notification(wxMacDataItemBrowserControl
*WXUNUSED(owner
) ,
1681 DataBrowserItemNotification
WXUNUSED(message
),
1682 DataBrowserItemDataRef
WXUNUSED(itemData
) ) const
1686 IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl
, wxMacDataBrowserControl
)
1688 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) :
1689 wxMacDataBrowserControl( peer
, pos
, size
, style
)
1691 m_suppressSelection
= false;
1692 m_sortOrder
= SortOrder_None
;
1693 m_clientDataItemsType
= wxClientData_None
;
1696 wxMacDataItem
* wxMacDataItemBrowserControl::CreateItem()
1698 return new wxMacDataItem();
1701 wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl
*browser
)
1703 m_former
= browser
->SuppressSelection(true);
1704 m_browser
= browser
;
1707 wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1709 m_browser
->SuppressSelection(m_former
);
1712 bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress
)
1714 bool former
= m_suppressSelection
;
1715 m_suppressSelection
= suppress
;
1720 Boolean
wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID
,
1721 DataBrowserItemID itemTwoID
,
1722 DataBrowserPropertyID sortProperty
)
1724 wxMacDataItem
* itemOne
= (wxMacDataItem
*) itemOneID
;
1725 wxMacDataItem
* itemTwo
= (wxMacDataItem
*) itemTwoID
;
1726 return CompareItems( itemOne
, itemTwo
, sortProperty
);
1729 Boolean
wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem
* itemOne
,
1730 const wxMacDataItem
* itemTwo
,
1731 DataBrowserPropertyID sortProperty
)
1733 Boolean retval
= false;
1734 if ( itemOne
!= NULL
)
1735 retval
= itemOne
->IsLessThan( this , itemTwo
, sortProperty
);
1739 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1740 DataBrowserItemID itemID
,
1741 DataBrowserPropertyID property
,
1742 DataBrowserItemDataRef itemData
,
1743 Boolean changeValue
)
1745 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1746 return GetSetItemData(item
, property
, itemData
, changeValue
);
1749 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1750 wxMacDataItem
* item
,
1751 DataBrowserPropertyID property
,
1752 DataBrowserItemDataRef itemData
,
1753 Boolean changeValue
)
1755 OSStatus err
= errDataBrowserPropertyNotSupported
;
1758 case kDataBrowserContainerIsClosableProperty
:
1759 case kDataBrowserContainerIsSortableProperty
:
1760 case kDataBrowserContainerIsOpenableProperty
:
1761 // right now default behaviour on these
1765 if ( item
!= NULL
){
1766 err
= item
->GetSetData( this, property
, itemData
, changeValue
);
1774 void wxMacDataItemBrowserControl::ItemNotification(
1775 DataBrowserItemID itemID
,
1776 DataBrowserItemNotification message
,
1777 DataBrowserItemDataRef itemData
)
1779 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1780 ItemNotification( item
, message
, itemData
);
1783 void wxMacDataItemBrowserControl::ItemNotification(
1784 const wxMacDataItem
* item
,
1785 DataBrowserItemNotification message
,
1786 DataBrowserItemDataRef itemData
)
1789 item
->Notification( this, message
, itemData
);
1792 unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem
* container
,
1793 bool recurse
, DataBrowserItemState state
) const
1795 ItemCount numItems
= 0;
1796 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID
)container
,
1797 recurse
, state
, &numItems
) );
1801 unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem
* container
,
1802 bool recurse
) const
1804 return GetItemCount( container
, recurse
, kDataBrowserItemIsSelected
);
1808 void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem
* container
,
1809 bool recurse
, DataBrowserItemState state
, wxArrayMacDataItemPtr
&items
) const
1811 Handle handle
= NewHandle(0);
1812 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID
)container
,
1813 recurse
, state
, handle
) );
1815 int itemCount
= GetHandleSize(handle
)/sizeof(DataBrowserItemID
);
1817 wxMacDataItemPtr
* itemsArray
= (wxMacDataItemPtr
*) *handle
;
1818 for ( int i
= 0; i
< itemCount
; ++i
)
1820 items
.Add(itemsArray
[i
]);
1823 DisposeHandle( handle
);
1826 unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem
* item
) const
1828 DataBrowserTableViewRowIndex row
;
1829 OSStatus err
= GetItemRow( (DataBrowserItemID
) item
, &row
);
1830 wxASSERT( err
== noErr
);
1834 wxMacDataItem
* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n
) const
1836 DataBrowserItemID id
;
1837 OSStatus err
= GetItemID( (DataBrowserTableViewRowIndex
) n
, &id
);
1838 wxASSERT( err
== noErr
);
1839 return (wxMacDataItem
*) id
;
1842 void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem
*container
,
1843 const wxMacDataItem
*item
, DataBrowserPropertyID property
) const
1845 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, 1,
1846 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1849 void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem
*container
,
1850 wxArrayMacDataItemPtr
&itemArray
, DataBrowserPropertyID property
) const
1852 unsigned int noItems
= itemArray
.GetCount();
1853 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1854 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1855 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1857 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, noItems
,
1858 items
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1862 void wxMacDataItemBrowserControl::InsertColumn(int colId
, DataBrowserPropertyType colType
,
1863 const wxString
& title
, SInt16 just
, int defaultWidth
)
1865 DataBrowserListViewColumnDesc columnDesc
;
1866 columnDesc
.headerBtnDesc
.titleOffset
= 0;
1867 columnDesc
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
1869 columnDesc
.headerBtnDesc
.btnFontStyle
.flags
=
1870 kControlUseFontMask
| kControlUseJustMask
;
1872 columnDesc
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentTextOnly
;
1873 columnDesc
.headerBtnDesc
.btnFontStyle
.just
= just
;
1874 columnDesc
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
1875 columnDesc
.headerBtnDesc
.btnFontStyle
.style
= normal
;
1877 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1878 // defined for other modes?
1881 enc
= m_font
.GetEncoding();
1883 enc
= wxLocale::GetSystemEncoding();
1884 wxMacCFStringHolder cfTitle
;
1885 cfTitle
.Assign( title
, enc
);
1886 columnDesc
.headerBtnDesc
.titleString
= cfTitle
;
1888 columnDesc
.headerBtnDesc
.minimumWidth
= 0;
1889 columnDesc
.headerBtnDesc
.maximumWidth
= 30000;
1891 columnDesc
.propertyDesc
.propertyID
= (kMinColumnId
+ colId
);
1892 columnDesc
.propertyDesc
.propertyType
= colType
;
1893 columnDesc
.propertyDesc
.propertyFlags
= kDataBrowserListViewSortableColumn
;
1894 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
;
1895 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
1896 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
1899 verify_noerr( AddColumn( &columnDesc
, kDataBrowserListViewAppendColumn
) );
1901 if (defaultWidth
> 0){
1902 SetColumnWidth(colId
, defaultWidth
);
1907 void wxMacDataItemBrowserControl::SetColumnWidth(int colId
, int width
)
1909 DataBrowserPropertyID id
;
1910 GetColumnIDFromIndex(colId
, &id
);
1911 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id
, width
));
1914 int wxMacDataItemBrowserControl::GetColumnWidth(int colId
)
1916 DataBrowserPropertyID id
;
1917 GetColumnIDFromIndex(colId
, &id
);
1919 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id
, &result
));
1923 void wxMacDataItemBrowserControl::AddItem(wxMacDataItem
*container
, wxMacDataItem
*item
)
1925 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, 1,
1926 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
) );
1929 void wxMacDataItemBrowserControl::AddItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1931 unsigned int noItems
= itemArray
.GetCount();
1932 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1933 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1934 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1936 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, noItems
,
1937 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
) );
1941 void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem
*container
, wxMacDataItem
* item
)
1943 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 1,
1944 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
);
1945 verify_noerr( err
);
1948 void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1950 unsigned int noItems
= itemArray
.GetCount();
1951 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1952 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1953 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1955 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, noItems
,
1956 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
);
1957 verify_noerr( err
);
1961 void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem
*container
)
1963 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 0 , NULL
, kDataBrowserItemNoProperty
);
1964 verify_noerr( err
);
1967 void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem
* item
, DataBrowserSetOption option
)
1969 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID
*) &item
, option
));
1972 void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option
)
1974 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL
, option
));
1977 void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr
&itemArray
, DataBrowserSetOption option
)
1979 unsigned int noItems
= itemArray
.GetCount();
1980 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1981 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1982 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1984 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems
, (DataBrowserItemID
*) items
, option
));
1988 Boolean
wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem
* item
) const
1990 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID
) item
);
1993 void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem
* item
, DataBrowserRevealOptions options
)
1995 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID
) item
, kDataBrowserNoItem
, options
) );
1998 void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr
* first
, wxMacDataItemPtr
* last
) const
2000 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID
*) first
, (DataBrowserItemID
*) last
) );
2003 wxClientDataType
wxMacDataItemBrowserControl::GetClientDataType() const
2005 return m_clientDataItemsType
;
2007 void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType
)
2009 m_clientDataItemsType
= clientDataItemsType
;
2012 unsigned int wxMacDataItemBrowserControl::MacGetCount() const
2014 return GetItemCount(wxMacDataBrowserRootContainer
,false,kDataBrowserItemAnyState
);
2017 void wxMacDataItemBrowserControl::MacDelete( unsigned int n
)
2019 wxMacDataItem
* item
= (wxMacDataItem
*)GetItemFromLine( n
);
2020 RemoveItem( wxMacDataBrowserRootContainer
, item
);
2023 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
,
2024 const wxArrayStringsAdapter
& items
,
2027 size_t itemsCount
= items
.GetCount();
2028 if ( itemsCount
== 0 )
2031 SInt32 frontLineOrder
= 0;
2033 if ( m_sortOrder
== SortOrder_None
)
2035 // increase the order of the lines to be shifted
2036 unsigned int lines
= MacGetCount();
2037 for ( unsigned int i
= n
; i
< lines
; ++i
)
2039 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
2040 iter
->SetOrder( iter
->GetOrder() + itemsCount
);
2044 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
2045 frontLineOrder
= iter
->GetOrder();
2049 wxArrayMacDataItemPtr ids
;
2050 ids
.SetCount( itemsCount
);
2052 for ( unsigned int i
= 0; i
< itemsCount
; ++i
)
2054 wxMacDataItem
* item
= CreateItem();
2055 item
->SetLabel( items
[i
]);
2057 item
->SetColumn( kMinColumnId
+ column
);
2059 if ( m_sortOrder
== SortOrder_None
)
2060 item
->SetOrder( frontLineOrder
+ 1 + i
);
2065 AddItems( wxMacDataBrowserRootContainer
, ids
);
2068 int wxMacDataItemBrowserControl::MacAppend( const wxString
& text
)
2070 wxMacDataItem
* item
= CreateItem();
2071 item
->SetLabel( text
);
2072 if ( m_sortOrder
== SortOrder_None
)
2074 unsigned int lines
= MacGetCount();
2076 item
->SetOrder( 1 );
2079 wxMacDataItem
* frontItem
= (wxMacDataItem
*) GetItemFromLine(lines
-1);
2080 item
->SetOrder( frontItem
->GetOrder() + 1 );
2083 AddItem( wxMacDataBrowserRootContainer
, item
);
2085 return GetLineFromItem(item
);
2088 void wxMacDataItemBrowserControl::MacClear()
2090 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2091 RemoveAllItems(wxMacDataBrowserRootContainer
);
2094 void wxMacDataItemBrowserControl::MacDeselectAll()
2096 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2097 SetSelectedAllItems( kDataBrowserItemsRemove
);
2100 void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n
, bool select
, bool multi
)
2102 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
2103 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2105 if ( IsItemSelected( item
) != select
)
2108 SetSelectedItem( item
, multi
? kDataBrowserItemsAdd
: kDataBrowserItemsAssign
);
2110 SetSelectedItem( item
, kDataBrowserItemsRemove
);
2116 bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n
) const
2118 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
2119 return IsItemSelected( item
);
2122 int wxMacDataItemBrowserControl::MacGetSelection() const
2124 wxMacDataItemPtr first
, last
;
2125 GetSelectionAnchor( &first
, &last
);
2127 if ( first
!= NULL
)
2129 return GetLineFromItem( first
);
2135 int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt
& aSelections
) const
2137 aSelections
.Empty();
2138 wxArrayMacDataItemPtr selectedItems
;
2139 GetItems( wxMacDataBrowserRootContainer
, false , kDataBrowserItemIsSelected
, selectedItems
);
2141 int count
= selectedItems
.GetCount();
2143 for ( int i
= 0; i
< count
; ++i
)
2145 aSelections
.Add(GetLineFromItem(selectedItems
[i
]));
2151 void wxMacDataItemBrowserControl::MacSetString( unsigned int n
, const wxString
& text
)
2153 // as we don't store the strings we only have to issue a redraw
2154 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2155 item
->SetLabel( text
);
2156 UpdateItem( wxMacDataBrowserRootContainer
, item
, kTextColumnId
);
2159 wxString
wxMacDataItemBrowserControl::MacGetString( unsigned int n
) const
2161 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2162 return item
->GetLabel();
2165 void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n
, void * data
)
2167 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2168 item
->SetData( data
);
2169 // not displayed, therefore no Update infos to DataBrowser
2172 void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n
) const
2174 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2175 return item
->GetData();
2178 void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n
)
2181 GetScrollPosition( &top
, &left
) ;
2182 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2185 GetRowHeight( (DataBrowserItemID
) item
, &height
) ;
2186 SetScrollPosition( n
* ((UInt32
)height
) , left
) ;
2188 RevealItem( item
, kDataBrowserRevealWithoutSelecting
);
2197 OSStatus
wxMacControl::SetTabEnabled( SInt16 tabNo
, bool enable
)
2199 return ::SetTabEnabled( m_controlRef
, tabNo
, enable
);
2206 // snippets from Sketch Sample from Apple :
2208 #define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc"
2211 This function locates, opens, and returns the profile reference for the calibrated
2212 Generic RGB color space. It is up to the caller to call CMCloseProfile when done
2213 with the profile reference this function returns.
2215 CMProfileRef
wxMacOpenGenericProfile()
2217 static CMProfileRef cachedRGBProfileRef
= NULL
;
2219 // we only create the profile reference once
2220 if (cachedRGBProfileRef
== NULL
)
2222 CMProfileLocation loc
;
2224 loc
.locType
= cmPathBasedProfile
;
2225 strcpy(loc
.u
.pathLoc
.path
, kGenericRGBProfilePathStr
);
2227 verify_noerr( CMOpenProfile(&cachedRGBProfileRef
, &loc
) );
2230 // clone the profile reference so that the caller has their own reference, not our cached one
2231 if (cachedRGBProfileRef
)
2232 CMCloneProfileRef(cachedRGBProfileRef
);
2234 return cachedRGBProfileRef
;
2238 Return the generic RGB color space. This is a 'get' function and the caller should
2239 not release the returned value unless the caller retains it first. Usually callers
2240 of this routine will immediately use the returned colorspace with CoreGraphics
2241 so they typically do not need to retain it themselves.
2243 This function creates the generic RGB color space once and hangs onto it so it can
2244 return it whenever this function is called.
2247 CGColorSpaceRef
wxMacGetGenericRGBColorSpace()
2249 static wxMacCFRefHolder
<CGColorSpaceRef
> genericRGBColorSpace
;
2251 if (genericRGBColorSpace
== NULL
)
2253 if ( UMAGetSystemVersion() >= 0x1040 )
2255 genericRGBColorSpace
.Set( CGColorSpaceCreateWithName( CFSTR("kCGColorSpaceGenericRGB") ) );
2259 CMProfileRef genericRGBProfile
= wxMacOpenGenericProfile();
2261 if (genericRGBProfile
)
2263 genericRGBColorSpace
.Set( CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile
) );
2265 wxASSERT_MSG( genericRGBColorSpace
!= NULL
, wxT("couldn't create the generic RGB color space") );
2267 // we opened the profile so it is up to us to close it
2268 CMCloseProfile(genericRGBProfile
);
2273 return genericRGBColorSpace
;
2278 wxMacPortSaver::wxMacPortSaver( GrafPtr port
)
2280 ::GetPort( &m_port
);
2284 wxMacPortSaver::~wxMacPortSaver()
2286 ::SetPort( m_port
);
2290 void wxMacGlobalToLocal( WindowRef window
, Point
*pt
)
2292 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
2293 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
2294 HIViewRef contentView
;
2295 // TODO check toolbar offset
2296 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
2297 HIPointConvert( &p
, kHICoordSpace72DPIGlobal
, NULL
, kHICoordSpaceView
, contentView
);
2301 QDGlobalToLocalPoint( GetWindowPort(window
), pt
) ;
2305 void wxMacLocalToGlobal( WindowRef window
, Point
*pt
)
2307 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
2308 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
2309 HIViewRef contentView
;
2310 // TODO check toolbar offset
2311 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
2312 HIPointConvert( &p
, kHICoordSpaceView
, contentView
, kHICoordSpace72DPIGlobal
, NULL
);
2316 QDLocalToGlobalPoint( GetWindowPort(window
), pt
) ;