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/mac/private.h"
66 #if defined(__MWERKS__) && wxUSE_UNICODE
67 #if __MWERKS__ < 0x4100 || !defined(__DARWIN__)
74 // our OS version is the same in non GUI and GUI cases
75 wxOperatingSystemId
wxGetOsVersion(int *majorVsn
, int *minorVsn
)
78 Gestalt(gestaltSystemVersion
, &theSystem
);
80 if ( majorVsn
!= NULL
)
81 *majorVsn
= (theSystem
>> 8);
83 if ( minorVsn
!= NULL
)
84 *minorVsn
= (theSystem
& 0xFF);
86 #if defined( __DARWIN__ )
87 return wxOS_MAC_OSX_DARWIN
;
93 // ----------------------------------------------------------------------------
95 // ----------------------------------------------------------------------------
97 #if defined(__WXDEBUG__) && defined(__WXMAC__) && !defined(__DARWIN__) && defined(__MWERKS__) && (__MWERKS__ >= 0x2400)
99 // MetroNub stuff doesn't seem to work in CodeWarrior 5.3 Carbon builds...
101 #ifndef __MetroNubUtils__
102 #include "MetroNubUtils.h"
109 #if TARGET_API_MAC_CARBON
111 #include <CodeFragments.h>
113 extern "C" long CallUniversalProc(UniversalProcPtr theProcPtr
, ProcInfoType procInfo
, ...);
115 ProcPtr gCallUniversalProc_Proc
= NULL
;
119 static MetroNubUserEntryBlock
* gMetroNubEntry
= NULL
;
121 static long fRunOnce
= false;
124 Boolean
IsMetroNubInstalled()
131 gMetroNubEntry
= NULL
;
133 if (Gestalt(gestaltSystemVersion
, &value
) == noErr
&& value
< 0x1000)
135 // look for MetroNub's Gestalt selector
136 if (Gestalt(kMetroNubUserSignature
, &result
) == noErr
)
138 #if TARGET_API_MAC_CARBON
139 if (gCallUniversalProc_Proc
== NULL
)
141 CFragConnectionID connectionID
;
144 ProcPtr symbolAddress
;
146 CFragSymbolClass symbolClass
;
148 symbolAddress
= NULL
;
149 err
= GetSharedLibrary("\pInterfaceLib", kPowerPCCFragArch
, kFindCFrag
,
150 &connectionID
, &mainAddress
, errorString
);
154 gCallUniversalProc_Proc
= NULL
;
158 err
= FindSymbol(connectionID
, "\pCallUniversalProc",
159 (Ptr
*) &gCallUniversalProc_Proc
, &symbolClass
);
163 gCallUniversalProc_Proc
= NULL
;
170 MetroNubUserEntryBlock
* block
= (MetroNubUserEntryBlock
*)result
;
172 // make sure the version of the API is compatible
173 if (block
->apiLowVersion
<= kMetroNubUserAPIVersion
&&
174 kMetroNubUserAPIVersion
<= block
->apiHiVersion
)
177 gMetroNubEntry
= block
;
186 #if TARGET_API_MAC_CARBON
187 return (gMetroNubEntry
!= NULL
&& gCallUniversalProc_Proc
!= NULL
);
189 return (gMetroNubEntry
!= NULL
);
193 Boolean
IsMWDebuggerRunning()
195 if (IsMetroNubInstalled())
196 return CallIsDebuggerRunningProc(gMetroNubEntry
->isDebuggerRunning
);
201 Boolean
AmIBeingMWDebugged()
203 if (IsMetroNubInstalled())
204 return CallAmIBeingDebuggedProc(gMetroNubEntry
->amIBeingDebugged
);
209 extern bool WXDLLEXPORT
wxIsDebuggerRunning()
211 return IsMWDebuggerRunning() && AmIBeingMWDebugged();
216 extern bool WXDLLEXPORT
wxIsDebuggerRunning()
221 #endif // defined(__WXMAC__) && !defined(__DARWIN__) && (__MWERKS__ >= 0x2400)
225 // defined in unix/utilsunx.cpp for Mac OS X
227 // get full hostname (with domain name if possible)
228 bool wxGetFullHostName(wxChar
*buf
, int maxSize
)
230 return wxGetHostName(buf
, maxSize
);
233 // Get user ID e.g. jacs
234 bool wxGetUserId(wxChar
*buf
, int maxSize
)
236 return wxGetUserName( buf
, maxSize
);
239 const wxChar
* wxGetHomeDir(wxString
*pstr
)
241 *pstr
= wxMacFindFolder( (short) kOnSystemDisk
, kPreferencesFolderType
, kDontCreateFolder
);
242 return pstr
->c_str();
245 // Get hostname only (without domain name)
246 bool wxGetHostName(wxChar
*buf
, int maxSize
)
248 // Gets Chooser name of user by examining a System resource.
251 const short kComputerNameID
= -16413;
253 short oldResFile
= CurResFile();
255 StringHandle chooserName
= (StringHandle
)::GetString(kComputerNameID
);
256 UseResFile(oldResFile
);
258 if (chooserName
&& *chooserName
)
260 HLock( (Handle
) chooserName
);
261 wxString name
= wxMacMakeStringFromPascal( *chooserName
);
262 HUnlock( (Handle
) chooserName
);
263 ReleaseResource( (Handle
) chooserName
);
264 wxStrncpy( buf
, name
, maxSize
- 1 );
270 // Get user name e.g. Stefan Csomor
271 bool wxGetUserName(wxChar
*buf
, int maxSize
)
273 // Gets Chooser name of user by examining a System resource.
276 const short kChooserNameID
= -16096;
278 short oldResFile
= CurResFile();
280 StringHandle chooserName
= (StringHandle
)::GetString(kChooserNameID
);
281 UseResFile(oldResFile
);
283 if (chooserName
&& *chooserName
)
285 HLock( (Handle
) chooserName
);
286 wxString name
= wxMacMakeStringFromPascal( *chooserName
);
287 HUnlock( (Handle
) chooserName
);
288 ReleaseResource( (Handle
) chooserName
);
289 wxStrncpy( buf
, name
, maxSize
- 1 );
295 int wxKill(long pid
, wxSignal sig
, wxKillError
*rc
, int flags
)
301 WXDLLEXPORT
bool wxGetEnv(const wxString
& var
, wxString
*value
)
303 // TODO : under classic there is no environement support, under X yes
307 // set the env var name to the given value, return true on success
308 WXDLLEXPORT
bool wxSetEnv(const wxString
& var
, const wxChar
*value
)
310 // TODO : under classic there is no environement support, under X yes
314 // Execute a program in an Interactive Shell
315 bool wxShell(const wxString
& command
)
321 // Shutdown or reboot the PC
322 bool wxShutdown(wxShutdownFlags wFlags
)
328 // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX)
329 wxMemorySize
wxGetFreeMemory()
331 return (wxMemorySize
)FreeMem();
336 void wxMicroSleep(unsigned long microseconds
)
338 AbsoluteTime wakeup
= AddDurationToAbsolute( microseconds
* durationMicrosecond
, UpTime());
339 MPDelayUntil( & wakeup
);
342 void wxMilliSleep(unsigned long milliseconds
)
344 AbsoluteTime wakeup
= AddDurationToAbsolute( milliseconds
, UpTime());
345 MPDelayUntil( & wakeup
);
348 void wxSleep(int nSecs
)
350 wxMilliSleep(1000*nSecs
);
355 // Consume all events until no more left
360 #endif // !__DARWIN__
375 wxPortId
wxGUIAppTraits::GetToolkitVersion(int *verMaj
, int *verMin
) const
377 // We suppose that toolkit version is the same as OS version under Mac
378 wxGetOsVersion(verMaj
, verMin
);
383 wxTimerImpl
* wxGUIAppTraits::CreateTimerImpl(wxTimer
*timer
)
385 return new wxCarbonTimerImpl(timer
);
388 int gs_wxBusyCursorCount
= 0;
389 extern wxCursor gMacCurrentCursor
;
390 wxCursor gMacStoredActiveCursor
;
392 // Set the cursor to the busy cursor for all windows
393 void wxBeginBusyCursor(const wxCursor
*cursor
)
395 if (gs_wxBusyCursorCount
++ == 0)
397 gMacStoredActiveCursor
= gMacCurrentCursor
;
398 cursor
->MacInstall();
400 //else: nothing to do, already set
403 // Restore cursor to normal
404 void wxEndBusyCursor()
406 wxCHECK_RET( gs_wxBusyCursorCount
> 0,
407 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
409 if (--gs_wxBusyCursorCount
== 0)
411 gMacStoredActiveCursor
.MacInstall();
412 gMacStoredActiveCursor
= wxNullCursor
;
416 // true if we're between the above two calls
419 return (gs_wxBusyCursorCount
> 0);
426 wxString
wxMacFindFolderNoSeparator( short vol
,
428 Boolean createFolder
)
433 if ( FSFindFolder( vol
, folderType
, createFolder
, &fsRef
) == noErr
)
435 strDir
= wxMacFSRefToPath( &fsRef
);
441 wxString
wxMacFindFolder( short vol
,
443 Boolean createFolder
)
445 return wxMacFindFolderNoSeparator(vol
, folderType
, createFolder
) + wxFILE_SEP_PATH
;
452 // Check whether this window wants to process messages, e.g. Stop button
453 // in long calculations.
454 bool wxCheckForInterrupt(wxWindow
*wnd
)
460 void wxGetMousePosition( int* x
, int* y
)
463 #if wxMAC_USE_CORE_GRAPHICS
467 LocalToGlobal( &pt
);
473 // Return true if we have a colour display
474 bool wxColourDisplay()
479 // Returns depth of screen
483 #if wxMAC_USE_CORE_GRAPHICS
484 theDepth
= (int) CGDisplayBitsPerPixel(CGMainDisplayID());
487 SetRect(&globRect
, -32760, -32760, 32760, 32760);
488 GDHandle theMaxDevice
;
490 theMaxDevice
= GetMaxDevice(&globRect
);
491 if (theMaxDevice
!= NULL
)
492 theDepth
= (**(**theMaxDevice
).gdPMap
).pixelSize
;
497 // Get size of display
498 void wxDisplaySize(int *width
, int *height
)
500 #if wxMAC_USE_CORE_GRAPHICS
501 // TODO adapt for multi-displays
502 CGRect bounds
= CGDisplayBounds(CGMainDisplayID());
504 *width
= (int)bounds
.size
.width
;
506 *height
= (int)bounds
.size
.height
;
509 GetQDGlobalsScreenBits( &screenBits
);
512 *width
= screenBits
.bounds
.right
- screenBits
.bounds
.left
;
515 *height
= screenBits
.bounds
.bottom
- screenBits
.bounds
.top
;
519 void wxDisplaySizeMM(int *width
, int *height
)
521 wxDisplaySize(width
, height
);
522 // on mac 72 is fixed (at least now;-)
523 float cvPt2Mm
= 25.4 / 72;
526 *width
= int( *width
* cvPt2Mm
);
529 *height
= int( *height
* cvPt2Mm
);
532 void wxClientDisplayRect(int *x
, int *y
, int *width
, int *height
)
534 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
536 HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay
,kHICoordSpace72DPIGlobal
,
539 *x
= bounds
.origin
.x
;
541 *y
= bounds
.origin
.y
;
543 *width
= bounds
.size
.width
;
545 *height
= bounds
.size
.height
;
548 GetAvailableWindowPositioningBounds( GetMainDevice() , &r
);
554 *width
= r
.right
- r
.left
;
556 *height
= r
.bottom
- r
.top
;
560 wxWindow
* wxFindWindowAtPoint(const wxPoint
& pt
)
562 return wxGenericFindWindowAtPoint(pt
);
569 wxString
wxGetOsDescription()
571 #ifdef WXWIN_OS_DESCRIPTION
572 // use configure generated description if available
573 return wxString(wxT("MacOS (")) + wxT(WXWIN_OS_DESCRIPTION
) + wxString(wxT(")"));
575 return wxT("MacOS"); //TODO:define further
580 wxChar
*wxGetUserHome (const wxString
& user
)
586 bool wxGetDiskSpace(const wxString
& path
, wxDiskspaceSize_t
*pTotal
, wxDiskspaceSize_t
*pFree
)
595 int pos
= p
.Find(':');
596 if ( pos
!= wxNOT_FOUND
)
604 err
= wxMacPathToFSRef( p
, &fsRef
);
607 FSVolumeRefNum vRefNum
;
608 err
= FSGetVRefNum( &fsRef
, &vRefNum
);
611 UInt64 freeBytes
, totalBytes
;
612 err
= FSGetVInfo( vRefNum
, NULL
, &freeBytes
, &totalBytes
);
616 *pTotal
= wxDiskspaceSize_t( totalBytes
);
618 *pFree
= wxDiskspaceSize_t( freeBytes
);
625 #endif // !__DARWIN__
627 //---------------------------------------------------------------------------
628 // wxMac Specific utility functions
629 //---------------------------------------------------------------------------
631 void wxMacStringToPascal( const wxString
&from
, StringPtr to
)
633 wxCharBuffer buf
= from
.mb_str( wxConvLocal
);
634 int len
= strlen(buf
);
639 memcpy( (char*) &to
[1] , buf
, len
);
642 wxString
wxMacMakeStringFromPascal( ConstStringPtr from
)
644 return wxString( (char*) &from
[1] , wxConvLocal
, from
[0] );
647 // ----------------------------------------------------------------------------
648 // Common Event Support
649 // ----------------------------------------------------------------------------
651 extern ProcessSerialNumber gAppProcess
;
655 ProcessSerialNumber psn
;
657 psn
.highLongOfPSN
= 0;
658 psn
.lowLongOfPSN
= kCurrentProcess
;
659 SameProcess( &gAppProcess
, &psn
, &isSame
);
663 OSStatus err
= noErr
;
666 // lead sometimes to race conditions, although all calls used should be thread safe ...
667 static wxMacCarbonEvent s_wakeupEvent
;
668 if ( !s_wakeupEvent
.IsValid() )
670 err
= s_wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
671 kEventAttributeNone
);
676 if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent
) )
678 s_wakeupEvent
.SetCurrentTime();
679 err
= PostEventToQueue(GetMainEventQueue(), s_wakeupEvent
,
680 kEventPriorityHigh
);
683 wxMacCarbonEvent wakeupEvent
;
684 wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
685 kEventAttributeNone
);
686 err
= PostEventToQueue(GetMainEventQueue(), wakeupEvent
,
687 kEventPriorityHigh
);
690 PostEvent( nullEvent
, 0 );
695 WakeUpProcess( &gAppProcess
);
703 // ----------------------------------------------------------------------------
704 // Native Struct Conversions
705 // ----------------------------------------------------------------------------
707 void wxMacRectToNative( const wxRect
*wx
, Rect
*n
)
711 n
->right
= wx
->x
+ wx
->width
;
712 n
->bottom
= wx
->y
+ wx
->height
;
715 void wxMacNativeToRect( const Rect
*n
, wxRect
* wx
)
719 wx
->width
= n
->right
- n
->left
;
720 wx
->height
= n
->bottom
- n
->top
;
723 void wxMacPointToNative( const wxPoint
* wx
, Point
*n
)
729 void wxMacNativeToPoint( const Point
*n
, wxPoint
* wx
)
735 // ----------------------------------------------------------------------------
736 // Carbon Event Support
737 // ----------------------------------------------------------------------------
739 OSStatus
wxMacCarbonEvent::GetParameter(EventParamName inName
, EventParamType inDesiredType
, UInt32 inBufferSize
, void * outData
)
741 return ::GetEventParameter( m_eventRef
, inName
, inDesiredType
, NULL
, inBufferSize
, NULL
, outData
);
744 OSStatus
wxMacCarbonEvent::SetParameter(EventParamName inName
, EventParamType inType
, UInt32 inBufferSize
, const void * inData
)
746 return ::SetEventParameter( m_eventRef
, inName
, inType
, inBufferSize
, inData
);
749 // ----------------------------------------------------------------------------
750 // Control Access Support
751 // ----------------------------------------------------------------------------
753 IMPLEMENT_DYNAMIC_CLASS( wxMacControl
, wxObject
)
755 wxMacControl::wxMacControl()
760 wxMacControl::wxMacControl(wxWindow
* peer
, bool isRootControl
)
764 m_isRootControl
= isRootControl
;
767 wxMacControl::wxMacControl( wxWindow
* peer
, ControlRef control
)
771 m_controlRef
= control
;
774 wxMacControl::wxMacControl( wxWindow
* peer
, WXWidget control
)
778 m_controlRef
= (ControlRef
) control
;
781 wxMacControl::~wxMacControl()
785 void wxMacControl::Init()
789 m_needsFocusRect
= false;
790 m_isRootControl
= false;
793 void wxMacControl::Dispose()
795 wxASSERT_MSG( m_controlRef
!= NULL
, wxT("Control Handle already NULL, Dispose called twice ?") );
796 wxASSERT_MSG( IsValidControlHandle(m_controlRef
) , wxT("Invalid Control Handle (maybe already released) in Dispose") );
798 // we cannot check the ref count here anymore, as autorelease objects might delete their refs later
799 // we can have situations when being embedded, where the control gets deleted behind our back, so only
800 // CFRelease if we are safe
801 if ( IsValidControlHandle(m_controlRef
) )
802 CFRelease(m_controlRef
);
806 void wxMacControl::SetReference( URefCon data
)
808 SetControlReference( m_controlRef
, data
);
811 OSStatus
wxMacControl::GetData(ControlPartCode inPartCode
, ResType inTag
, Size inBufferSize
, void * inOutBuffer
, Size
* outActualSize
) const
813 return ::GetControlData( m_controlRef
, inPartCode
, inTag
, inBufferSize
, inOutBuffer
, outActualSize
);
816 OSStatus
wxMacControl::GetDataSize(ControlPartCode inPartCode
, ResType inTag
, Size
* outActualSize
) const
818 return ::GetControlDataSize( m_controlRef
, inPartCode
, inTag
, outActualSize
);
821 OSStatus
wxMacControl::SetData(ControlPartCode inPartCode
, ResType inTag
, Size inSize
, const void * inData
)
823 return ::SetControlData( m_controlRef
, inPartCode
, inTag
, inSize
, inData
);
826 OSStatus
wxMacControl::SendEvent( EventRef event
, OptionBits inOptions
)
828 #if TARGET_API_MAC_OSX
829 return SendEventToEventTargetWithOptions( event
,
830 HIObjectGetEventTarget( (HIObjectRef
) m_controlRef
), inOptions
);
832 #pragma unused(inOptions)
833 return SendEventToEventTarget(event
,GetControlEventTarget( m_controlRef
) );
837 OSStatus
wxMacControl::SendHICommand( HICommand
&command
, OptionBits inOptions
)
839 wxMacCarbonEvent
event( kEventClassCommand
, kEventCommandProcess
);
841 event
.SetParameter
<HICommand
>(kEventParamDirectObject
,command
);
843 return SendEvent( event
, inOptions
);
846 OSStatus
wxMacControl::SendHICommand( UInt32 commandID
, OptionBits inOptions
)
850 memset( &command
, 0 , sizeof(command
) );
851 command
.commandID
= commandID
;
852 return SendHICommand( command
, inOptions
);
855 void wxMacControl::Flash( ControlPartCode part
, UInt32 ticks
)
857 unsigned long finalTicks
;
859 HiliteControl( m_controlRef
, part
);
860 Delay( ticks
, &finalTicks
);
861 HiliteControl( m_controlRef
, kControlNoPart
);
864 SInt32
wxMacControl::GetValue() const
866 return ::GetControl32BitValue( m_controlRef
);
869 SInt32
wxMacControl::GetMaximum() const
871 return ::GetControl32BitMaximum( m_controlRef
);
874 SInt32
wxMacControl::GetMinimum() const
876 return ::GetControl32BitMinimum( m_controlRef
);
879 void wxMacControl::SetValue( SInt32 v
)
881 ::SetControl32BitValue( m_controlRef
, v
);
884 void wxMacControl::SetMinimum( SInt32 v
)
886 ::SetControl32BitMinimum( m_controlRef
, v
);
889 void wxMacControl::SetMaximum( SInt32 v
)
891 ::SetControl32BitMaximum( m_controlRef
, v
);
894 void wxMacControl::SetValueAndRange( SInt32 value
, SInt32 minimum
, SInt32 maximum
)
896 ::SetControl32BitMinimum( m_controlRef
, minimum
);
897 ::SetControl32BitMaximum( m_controlRef
, maximum
);
898 ::SetControl32BitValue( m_controlRef
, value
);
901 OSStatus
wxMacControl::SetFocus( ControlFocusPart focusPart
)
903 return SetKeyboardFocus( GetControlOwner( m_controlRef
), m_controlRef
, focusPart
);
906 bool wxMacControl::HasFocus() const
909 GetKeyboardFocus( GetUserFocusWindow() , &control
);
910 return control
== m_controlRef
;
913 void wxMacControl::SetNeedsFocusRect( bool needs
)
915 m_needsFocusRect
= needs
;
918 bool wxMacControl::NeedsFocusRect() const
920 return m_needsFocusRect
;
923 void wxMacControl::VisibilityChanged(bool shown
)
927 void wxMacControl::SuperChangedPosition()
931 void wxMacControl::SetFont( const wxFont
& font
, const wxColour
& foreground
, long windowStyle
)
934 ControlFontStyleRec fontStyle
;
935 if ( font
.MacGetThemeFontID() != kThemeCurrentPortFont
)
937 switch ( font
.MacGetThemeFontID() )
939 case kThemeSmallSystemFont
:
940 fontStyle
.font
= kControlFontSmallSystemFont
;
943 case 109 : // mini font
947 case kThemeSystemFont
:
948 fontStyle
.font
= kControlFontBigSystemFont
;
952 fontStyle
.font
= kControlFontBigSystemFont
;
956 fontStyle
.flags
= kControlUseFontMask
;
960 fontStyle
.font
= font
.MacGetFontNum();
961 fontStyle
.style
= font
.MacGetFontStyle();
962 fontStyle
.size
= font
.MacGetFontSize();
963 fontStyle
.flags
= kControlUseFontMask
| kControlUseFaceMask
| kControlUseSizeMask
;
966 fontStyle
.just
= teJustLeft
;
967 fontStyle
.flags
|= kControlUseJustMask
;
968 if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_CENTER_HORIZONTAL
)
969 fontStyle
.just
= teJustCenter
;
970 else if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_RIGHT
)
971 fontStyle
.just
= teJustRight
;
974 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
975 // won't get grayed out by the system anymore
977 if ( foreground
!= *wxBLACK
)
979 fontStyle
.foreColor
= MAC_WXCOLORREF( foreground
.GetPixel() );
980 fontStyle
.flags
|= kControlUseForeColorMask
;
983 ::SetControlFontStyle( m_controlRef
, &fontStyle
);
986 void wxMacControl::SetBackground( const wxBrush
&WXUNUSED(brush
) )
989 // setting up a color proc is not recommended anymore
992 void wxMacControl::SetRange( SInt32 minimum
, SInt32 maximum
)
994 ::SetControl32BitMinimum( m_controlRef
, minimum
);
995 ::SetControl32BitMaximum( m_controlRef
, maximum
);
998 short wxMacControl::HandleKey( SInt16 keyCode
, SInt16 charCode
, EventModifiers modifiers
)
1001 return HandleControlKey( m_controlRef
, keyCode
, charCode
, modifiers
);
1007 void wxMacControl::SetActionProc( ControlActionUPP actionProc
)
1009 SetControlAction( m_controlRef
, actionProc
);
1012 void wxMacControl::SetViewSize( SInt32 viewSize
)
1014 SetControlViewSize(m_controlRef
, viewSize
);
1017 SInt32
wxMacControl::GetViewSize() const
1019 return GetControlViewSize( m_controlRef
);
1022 bool wxMacControl::IsVisible() const
1024 return IsControlVisible( m_controlRef
);
1027 void wxMacControl::SetVisibility( bool visible
, bool redraw
)
1029 SetControlVisibility( m_controlRef
, visible
, redraw
);
1032 bool wxMacControl::IsEnabled() const
1034 #if TARGET_API_MAC_OSX
1035 return IsControlEnabled( m_controlRef
);
1037 return IsControlActive( m_controlRef
);
1041 bool wxMacControl::IsActive() const
1043 return IsControlActive( m_controlRef
);
1046 void wxMacControl::Enable( bool enable
)
1049 EnableControl( m_controlRef
);
1051 DisableControl( m_controlRef
);
1054 void wxMacControl::SetDrawingEnabled( bool enable
)
1056 HIViewSetDrawingEnabled( m_controlRef
, enable
);
1059 bool wxMacControl::GetNeedsDisplay() const
1061 return HIViewGetNeedsDisplay( m_controlRef
);
1064 void wxMacControl::SetNeedsDisplay( RgnHandle where
)
1069 HIViewSetNeedsDisplayInRegion( m_controlRef
, where
, true );
1072 void wxMacControl::SetNeedsDisplay( Rect
* where
)
1077 if ( where
!= NULL
)
1079 RgnHandle update
= NewRgn();
1080 RectRgn( update
, where
);
1081 HIViewSetNeedsDisplayInRegion( m_controlRef
, update
, true );
1082 DisposeRgn( update
);
1085 HIViewSetNeedsDisplay( m_controlRef
, true );
1088 void wxMacControl::Convert( wxPoint
*pt
, wxMacControl
*from
, wxMacControl
*to
)
1094 HIViewConvertPoint( &hiPoint
, from
->m_controlRef
, to
->m_controlRef
);
1095 pt
->x
= (int)hiPoint
.x
;
1096 pt
->y
= (int)hiPoint
.y
;
1099 void wxMacControl::SetRect( Rect
*r
)
1101 //A HIRect is actually a CGRect on OSX - which consists of two structures -
1102 //CGPoint and CGSize, which have two floats each
1103 HIRect hir
= { { r
->left
, r
->top
}, { r
->right
- r
->left
, r
->bottom
- r
->top
} };
1104 HIViewSetFrame ( m_controlRef
, &hir
);
1105 // eventuall we might have to do a SetVisibility( false , true );
1106 // before and a SetVisibility( true , true ); after
1109 void wxMacControl::GetRect( Rect
*r
)
1111 GetControlBounds( m_controlRef
, r
);
1114 void wxMacControl::GetRectInWindowCoords( Rect
*r
)
1116 UMAGetControlBoundsInWindowCoords( m_controlRef
, r
);
1119 void wxMacControl::GetBestRect( Rect
*r
)
1121 short baselineoffset
;
1123 GetBestControlRect( m_controlRef
, r
, &baselineoffset
);
1126 void wxMacControl::SetLabel( const wxString
&title
)
1128 wxFontEncoding encoding
;
1131 encoding
= m_font
.GetEncoding();
1133 encoding
= wxFont::GetDefaultEncoding();
1135 UMASetControlTitle( m_controlRef
, title
, encoding
);
1138 void wxMacControl::GetFeatures( UInt32
* features
)
1140 GetControlFeatures( m_controlRef
, features
);
1143 OSStatus
wxMacControl::GetRegion( ControlPartCode partCode
, RgnHandle region
)
1145 OSStatus err
= GetControlRegion( m_controlRef
, partCode
, region
);
1149 OSStatus
wxMacControl::SetZOrder( bool above
, wxMacControl
* other
)
1151 #if TARGET_API_MAC_OSX
1152 return HIViewSetZOrder( m_controlRef
,above
? kHIViewZOrderAbove
: kHIViewZOrderBelow
,
1153 (other
!= NULL
) ? other
->m_controlRef
: NULL
);
1159 #if TARGET_API_MAC_OSX
1160 // SetNeedsDisplay would not invalidate the children
1161 static void InvalidateControlAndChildren( HIViewRef control
)
1163 HIViewSetNeedsDisplay( control
, true );
1164 UInt16 childrenCount
= 0;
1165 OSStatus err
= CountSubControls( control
, &childrenCount
);
1166 if ( err
== errControlIsNotEmbedder
)
1169 wxASSERT_MSG( err
== noErr
, wxT("Unexpected error when accessing subcontrols") );
1171 for ( UInt16 i
= childrenCount
; i
>=1; --i
)
1175 err
= GetIndexedSubControl( control
, i
, & child
);
1176 if ( err
== errControlIsNotEmbedder
)
1179 InvalidateControlAndChildren( child
);
1184 void wxMacControl::InvalidateWithChildren()
1186 #if TARGET_API_MAC_OSX
1187 InvalidateControlAndChildren( m_controlRef
);
1191 void wxMacControl::ScrollRect( wxRect
*r
, int dx
, int dy
)
1193 wxASSERT( r
!= NULL
);
1195 HIRect scrollarea
= CGRectMake( r
->x
, r
->y
, r
->width
, r
->height
);
1196 HIViewScrollRect ( m_controlRef
, &scrollarea
, dx
,dy
);
1199 OSType wxMacCreator
= 'WXMC';
1200 OSType wxMacControlProperty
= 'MCCT';
1202 void wxMacControl::SetReferenceInNativeControl()
1205 verify_noerr( SetControlProperty ( m_controlRef
,
1206 wxMacCreator
,wxMacControlProperty
, sizeof(data
), &data
) );
1209 wxMacControl
* wxMacControl::GetReferenceFromNativeControl(ControlRef control
)
1211 wxMacControl
* ctl
= NULL
;
1212 ByteCount actualSize
;
1213 if ( GetControlProperty( control
,wxMacCreator
,wxMacControlProperty
, sizeof(ctl
) ,
1214 &actualSize
, &ctl
) == noErr
)
1221 // ============================================================================
1222 // DataBrowser Wrapper
1223 // ============================================================================
1225 // basing on DataBrowserItemIDs
1228 IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl
, wxMacControl
)
1230 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
1232 DataBrowserItemID itemID
,
1233 DataBrowserItemNotification message
,
1234 DataBrowserItemDataRef itemData
)
1236 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1239 ctl
->ItemNotification(itemID
, message
, itemData
);
1243 pascal OSStatus
wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
1245 DataBrowserItemID itemID
,
1246 DataBrowserPropertyID property
,
1247 DataBrowserItemDataRef itemData
,
1248 Boolean changeValue
)
1250 OSStatus err
= errDataBrowserPropertyNotSupported
;
1251 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1254 err
= ctl
->GetSetItemData(itemID
, property
, itemData
, changeValue
);
1259 pascal Boolean
wxMacDataBrowserControl::DataBrowserCompareProc(
1261 DataBrowserItemID itemOneID
,
1262 DataBrowserItemID itemTwoID
,
1263 DataBrowserPropertyID sortProperty
)
1265 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1268 return ctl
->CompareItems(itemOneID
, itemTwoID
, sortProperty
);
1273 DataBrowserItemDataUPP gDataBrowserItemDataUPP
= NULL
;
1274 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP
= NULL
;
1275 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP
= NULL
;
1277 wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) : wxMacControl( peer
)
1279 Rect bounds
= wxMacGetBoundsForControl( peer
, pos
, size
);
1280 OSStatus err
= ::CreateDataBrowserControl(
1281 MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),
1282 &bounds
, kDataBrowserListView
, &m_controlRef
);
1283 SetReferenceInNativeControl();
1284 verify_noerr( err
);
1285 if ( gDataBrowserItemCompareUPP
== NULL
)
1286 gDataBrowserItemCompareUPP
= NewDataBrowserItemCompareUPP(DataBrowserCompareProc
);
1287 if ( gDataBrowserItemDataUPP
== NULL
)
1288 gDataBrowserItemDataUPP
= NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc
);
1289 if ( gDataBrowserItemNotificationUPP
== NULL
)
1291 gDataBrowserItemNotificationUPP
=
1292 #if TARGET_API_MAC_OSX
1293 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc
);
1295 NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc
);
1299 DataBrowserCallbacks callbacks
;
1300 InitializeDataBrowserCallbacks( &callbacks
, kDataBrowserLatestCallbacks
);
1302 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserItemDataUPP
;
1303 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserItemCompareUPP
;
1304 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserItemNotificationUPP
;
1305 SetCallbacks( &callbacks
);
1309 OSStatus
wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container
,
1311 DataBrowserItemState state
,
1312 ItemCount
*numItems
) const
1314 return GetDataBrowserItemCount( m_controlRef
, container
, recurse
, state
, numItems
);
1317 OSStatus
wxMacDataBrowserControl::GetItems( DataBrowserItemID container
,
1319 DataBrowserItemState state
,
1322 return GetDataBrowserItems( m_controlRef
, container
, recurse
, state
, items
);
1325 OSStatus
wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options
)
1327 return SetDataBrowserSelectionFlags( m_controlRef
, options
);
1330 OSStatus
wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc
*columnDesc
,
1331 DataBrowserTableViewColumnIndex position
)
1333 return AddDataBrowserListViewColumn( m_controlRef
, columnDesc
, position
);
1336 OSStatus
wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position
, DataBrowserTableViewColumnID
* id
){
1337 return GetDataBrowserTableViewColumnProperty( m_controlRef
, position
, id
);
1340 OSStatus
wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position
)
1342 DataBrowserTableViewColumnID id
;
1343 GetColumnIDFromIndex( position
, &id
);
1344 return RemoveDataBrowserTableViewColumn( m_controlRef
, id
);
1347 OSStatus
wxMacDataBrowserControl::AutoSizeColumns()
1349 return AutoSizeDataBrowserListViewColumns(m_controlRef
);
1352 OSStatus
wxMacDataBrowserControl::SetHasScrollBars( bool horiz
, bool vert
)
1354 return SetDataBrowserHasScrollBars( m_controlRef
, horiz
, vert
);
1357 OSStatus
wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle
)
1359 return SetDataBrowserTableViewHiliteStyle( m_controlRef
, hiliteStyle
);
1362 OSStatus
wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height
)
1364 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1367 OSStatus
wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16
*height
)
1369 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1372 OSStatus
wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks
*callbacks
)
1374 return SetDataBrowserCallbacks( m_controlRef
, callbacks
);
1377 OSStatus
wxMacDataBrowserControl::UpdateItems(
1378 DataBrowserItemID container
,
1380 const DataBrowserItemID
*items
,
1381 DataBrowserPropertyID preSortProperty
,
1382 DataBrowserPropertyID propertyID
) const
1384 return UpdateDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
, propertyID
);
1387 bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item
) const
1389 return IsDataBrowserItemSelected( m_controlRef
, item
);
1392 OSStatus
wxMacDataBrowserControl::AddItems(
1393 DataBrowserItemID container
,
1395 const DataBrowserItemID
*items
,
1396 DataBrowserPropertyID preSortProperty
)
1398 return AddDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1401 OSStatus
wxMacDataBrowserControl::RemoveItems(
1402 DataBrowserItemID container
,
1404 const DataBrowserItemID
*items
,
1405 DataBrowserPropertyID preSortProperty
)
1407 return RemoveDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1410 OSStatus
wxMacDataBrowserControl::RevealItem(
1411 DataBrowserItemID item
,
1412 DataBrowserPropertyID propertyID
,
1413 DataBrowserRevealOptions options
) const
1415 return RevealDataBrowserItem( m_controlRef
, item
, propertyID
, options
);
1418 OSStatus
wxMacDataBrowserControl::SetSelectedItems(
1420 const DataBrowserItemID
*items
,
1421 DataBrowserSetOption operation
)
1423 return SetDataBrowserSelectedItems( m_controlRef
, numItems
, items
, operation
);
1426 OSStatus
wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID
*first
, DataBrowserItemID
*last
) const
1428 return GetDataBrowserSelectionAnchor( m_controlRef
, first
, last
);
1431 OSStatus
wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
1433 return GetDataBrowserTableViewItemID( m_controlRef
, row
, item
);
1436 OSStatus
wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
1438 return GetDataBrowserTableViewItemRow( m_controlRef
, item
, row
);
1441 OSStatus
wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height
)
1443 return SetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1446 OSStatus
wxMacDataBrowserControl::GetDefaultRowHeight( UInt16
* height
) const
1448 return GetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1451 OSStatus
wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item
, UInt16 height
)
1453 return SetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1456 OSStatus
wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item
, UInt16
*height
) const
1458 return GetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1461 OSStatus
wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column
, UInt16
*width
) const
1463 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1466 OSStatus
wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column
, UInt16 width
)
1468 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1471 OSStatus
wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16
*width
) const
1473 return GetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1476 OSStatus
wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width
)
1478 return SetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1481 OSStatus
wxMacDataBrowserControl::GetColumnCount(UInt32
* numColumns
) const
1483 return GetDataBrowserTableViewColumnCount( m_controlRef
, numColumns
);
1486 OSStatus
wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column
,
1487 DataBrowserTableViewColumnIndex
*position
) const
1489 return GetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1492 OSStatus
wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column
, DataBrowserTableViewColumnIndex position
)
1494 return SetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1497 OSStatus
wxMacDataBrowserControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
1499 return GetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1502 OSStatus
wxMacDataBrowserControl::SetScrollPosition( UInt32 top
, UInt32 left
)
1504 return SetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1507 OSStatus
wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID
*column
) const
1509 return GetDataBrowserSortProperty( m_controlRef
, column
);
1512 OSStatus
wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column
)
1514 return SetDataBrowserSortProperty( m_controlRef
, column
);
1517 OSStatus
wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder
*order
) const
1519 return GetDataBrowserSortOrder( m_controlRef
, order
);
1522 OSStatus
wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order
)
1524 return SetDataBrowserSortOrder( m_controlRef
, order
);
1527 OSStatus
wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property
,
1528 DataBrowserPropertyFlags
*flags
) const
1530 return GetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1533 OSStatus
wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property
,
1534 DataBrowserPropertyFlags flags
)
1536 return SetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1539 OSStatus
wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property
,
1540 DataBrowserListViewHeaderDesc
*desc
) const
1542 return GetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1545 OSStatus
wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property
,
1546 DataBrowserListViewHeaderDesc
*desc
)
1548 return SetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1551 OSStatus
wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property
,
1552 Boolean expandableRows
)
1554 return SetDataBrowserListViewDisclosureColumn( m_controlRef
, property
, expandableRows
);
1557 // ============================================================================
1558 // Higher-level Databrowser
1559 // ============================================================================
1561 // basing on data item objects
1564 wxMacDataItem::wxMacDataItem()
1569 m_colId
= kTextColumnId
; // for compat with existing wx*ListBox impls.
1572 wxMacDataItem::~wxMacDataItem()
1576 void wxMacDataItem::SetOrder( SInt32 order
)
1581 SInt32
wxMacDataItem::GetOrder() const
1586 void wxMacDataItem::SetData( void* data
)
1591 void* wxMacDataItem::GetData() const
1596 short wxMacDataItem::GetColumn()
1601 void wxMacDataItem::SetColumn( short col
)
1606 void wxMacDataItem::SetLabel( const wxString
& str
)
1609 m_cfLabel
.Assign( str
, wxLocale::GetSystemEncoding());
1612 const wxString
& wxMacDataItem::GetLabel() const
1617 bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl
*owner
,
1618 const wxMacDataItem
* rhs
,
1619 DataBrowserPropertyID sortProperty
) const
1621 const wxMacDataItem
* otherItem
= wx_const_cast(wxMacDataItem
*,rhs
);
1622 bool retval
= false;
1624 if ( sortProperty
== m_colId
){
1625 retval
= m_label
.CmpNoCase( otherItem
->m_label
) < 0;
1628 else if ( sortProperty
== kNumericOrderColumnId
)
1629 retval
= m_order
< otherItem
->m_order
;
1634 OSStatus
wxMacDataItem::GetSetData( wxMacDataItemBrowserControl
*owner
,
1635 DataBrowserPropertyID property
,
1636 DataBrowserItemDataRef itemData
,
1639 OSStatus err
= errDataBrowserPropertyNotSupported
;
1642 if ( property
== m_colId
){
1643 err
= ::SetDataBrowserItemDataText( itemData
, m_cfLabel
);
1646 else if ( property
== kNumericOrderColumnId
){
1647 err
= ::SetDataBrowserItemDataValue( itemData
, m_order
);
1657 // no editable props here
1666 void wxMacDataItem::Notification(wxMacDataItemBrowserControl
*owner
,
1667 DataBrowserItemNotification message
,
1668 DataBrowserItemDataRef itemData
) const
1672 IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl
, wxMacDataBrowserControl
)
1674 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) :
1675 wxMacDataBrowserControl( peer
, pos
, size
, style
)
1677 m_suppressSelection
= false;
1678 m_sortOrder
= SortOrder_None
;
1679 m_clientDataItemsType
= wxClientData_None
;
1682 wxMacDataItem
* wxMacDataItemBrowserControl::CreateItem()
1684 return new wxMacDataItem();
1687 wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl
*browser
)
1689 m_former
= browser
->SuppressSelection(true);
1690 m_browser
= browser
;
1693 wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1695 m_browser
->SuppressSelection(m_former
);
1698 bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress
)
1700 bool former
= m_suppressSelection
;
1701 m_suppressSelection
= suppress
;
1706 Boolean
wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID
,
1707 DataBrowserItemID itemTwoID
,
1708 DataBrowserPropertyID sortProperty
)
1710 wxMacDataItem
* itemOne
= (wxMacDataItem
*) itemOneID
;
1711 wxMacDataItem
* itemTwo
= (wxMacDataItem
*) itemTwoID
;
1712 return CompareItems( itemOne
, itemTwo
, sortProperty
);
1715 Boolean
wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem
* itemOne
,
1716 const wxMacDataItem
* itemTwo
,
1717 DataBrowserPropertyID sortProperty
)
1719 Boolean retval
= false;
1720 if ( itemOne
!= NULL
)
1721 retval
= itemOne
->IsLessThan( this , itemTwo
, sortProperty
);
1725 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1726 DataBrowserItemID itemID
,
1727 DataBrowserPropertyID property
,
1728 DataBrowserItemDataRef itemData
,
1729 Boolean changeValue
)
1731 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1732 return GetSetItemData(item
, property
, itemData
, changeValue
);
1735 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1736 wxMacDataItem
* item
,
1737 DataBrowserPropertyID property
,
1738 DataBrowserItemDataRef itemData
,
1739 Boolean changeValue
)
1741 OSStatus err
= errDataBrowserPropertyNotSupported
;
1744 case kDataBrowserContainerIsClosableProperty
:
1745 case kDataBrowserContainerIsSortableProperty
:
1746 case kDataBrowserContainerIsOpenableProperty
:
1747 // right now default behaviour on these
1751 if ( item
!= NULL
){
1752 err
= item
->GetSetData( this, property
, itemData
, changeValue
);
1760 void wxMacDataItemBrowserControl::ItemNotification(
1761 DataBrowserItemID itemID
,
1762 DataBrowserItemNotification message
,
1763 DataBrowserItemDataRef itemData
)
1765 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1766 ItemNotification( item
, message
, itemData
);
1769 void wxMacDataItemBrowserControl::ItemNotification(
1770 const wxMacDataItem
* item
,
1771 DataBrowserItemNotification message
,
1772 DataBrowserItemDataRef itemData
)
1775 item
->Notification( this, message
, itemData
);
1778 unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem
* container
,
1779 bool recurse
, DataBrowserItemState state
) const
1781 ItemCount numItems
= 0;
1782 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID
)container
,
1783 recurse
, state
, &numItems
) );
1787 unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem
* container
,
1788 bool recurse
) const
1790 return GetItemCount( container
, recurse
, kDataBrowserItemIsSelected
);
1794 void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem
* container
,
1795 bool recurse
, DataBrowserItemState state
, wxArrayMacDataItemPtr
&items
) const
1797 Handle handle
= NewHandle(0);
1798 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID
)container
,
1799 recurse
, state
, handle
) );
1801 int itemCount
= GetHandleSize(handle
)/sizeof(DataBrowserItemID
);
1803 wxMacDataItemPtr
* itemsArray
= (wxMacDataItemPtr
*) *handle
;
1804 for ( int i
= 0; i
< itemCount
; ++i
)
1806 items
.Add(itemsArray
[i
]);
1809 DisposeHandle( handle
);
1812 unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem
* item
) const
1814 DataBrowserTableViewRowIndex row
;
1815 OSStatus err
= GetItemRow( (DataBrowserItemID
) item
, &row
);
1816 wxASSERT( err
== noErr
);
1820 wxMacDataItem
* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n
) const
1822 DataBrowserItemID id
;
1823 OSStatus err
= GetItemID( (DataBrowserTableViewRowIndex
) n
, &id
);
1824 wxASSERT( err
== noErr
);
1825 return (wxMacDataItem
*) id
;
1828 void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem
*container
,
1829 const wxMacDataItem
*item
, DataBrowserPropertyID property
) const
1831 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, 1,
1832 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1835 void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem
*container
,
1836 wxArrayMacDataItemPtr
&itemArray
, DataBrowserPropertyID property
) const
1838 unsigned int noItems
= itemArray
.GetCount();
1839 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1840 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1841 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1843 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, noItems
,
1844 items
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1848 void wxMacDataItemBrowserControl::InsertColumn(int colId
, DataBrowserPropertyType colType
,
1849 const wxString
& title
, SInt16 just
, int defaultWidth
)
1851 DataBrowserListViewColumnDesc columnDesc
;
1852 columnDesc
.headerBtnDesc
.titleOffset
= 0;
1853 columnDesc
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
1855 columnDesc
.headerBtnDesc
.btnFontStyle
.flags
=
1856 kControlUseFontMask
| kControlUseJustMask
;
1858 columnDesc
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentTextOnly
;
1859 columnDesc
.headerBtnDesc
.btnFontStyle
.just
= just
;
1860 columnDesc
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
1861 columnDesc
.headerBtnDesc
.btnFontStyle
.style
= normal
;
1863 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1864 // defined for other modes?
1867 enc
= m_font
.GetEncoding();
1869 enc
= wxLocale::GetSystemEncoding();
1870 wxMacCFStringHolder cfTitle
;
1871 cfTitle
.Assign( title
, enc
);
1872 columnDesc
.headerBtnDesc
.titleString
= cfTitle
;
1874 columnDesc
.headerBtnDesc
.minimumWidth
= 0;
1875 columnDesc
.headerBtnDesc
.maximumWidth
= 30000;
1877 columnDesc
.propertyDesc
.propertyID
= (kMinColumnId
+ colId
);
1878 columnDesc
.propertyDesc
.propertyType
= colType
;
1879 columnDesc
.propertyDesc
.propertyFlags
= kDataBrowserListViewSortableColumn
;
1880 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
1881 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
;
1883 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
1884 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
1887 verify_noerr( AddColumn( &columnDesc
, kDataBrowserListViewAppendColumn
) );
1889 if (defaultWidth
> 0){
1890 SetColumnWidth(colId
, defaultWidth
);
1895 void wxMacDataItemBrowserControl::SetColumnWidth(int colId
, int width
)
1897 DataBrowserPropertyID id
;
1898 GetColumnIDFromIndex(colId
, &id
);
1899 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id
, width
));
1902 int wxMacDataItemBrowserControl::GetColumnWidth(int colId
)
1904 DataBrowserPropertyID id
;
1905 GetColumnIDFromIndex(colId
, &id
);
1907 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id
, &result
));
1911 void wxMacDataItemBrowserControl::AddItem(wxMacDataItem
*container
, wxMacDataItem
*item
)
1913 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, 1,
1914 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
) );
1917 void wxMacDataItemBrowserControl::AddItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1919 unsigned int noItems
= itemArray
.GetCount();
1920 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1921 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1922 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1924 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, noItems
,
1925 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
) );
1929 void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem
*container
, wxMacDataItem
* item
)
1931 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 1,
1932 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
);
1933 verify_noerr( err
);
1936 void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1938 unsigned int noItems
= itemArray
.GetCount();
1939 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1940 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1941 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1943 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, noItems
,
1944 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
);
1945 verify_noerr( err
);
1949 void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem
*container
)
1951 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 0 , NULL
, kDataBrowserItemNoProperty
);
1952 verify_noerr( err
);
1955 void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem
* item
, DataBrowserSetOption option
)
1957 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID
*) &item
, option
));
1960 void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option
)
1962 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL
, option
));
1965 void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr
&itemArray
, DataBrowserSetOption option
)
1967 unsigned int noItems
= itemArray
.GetCount();
1968 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1969 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1970 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1972 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems
, (DataBrowserItemID
*) items
, option
));
1976 Boolean
wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem
* item
) const
1978 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID
) item
);
1981 void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem
* item
, DataBrowserRevealOptions options
)
1983 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID
) item
, kDataBrowserNoItem
, options
) );
1986 void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr
* first
, wxMacDataItemPtr
* last
) const
1988 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID
*) first
, (DataBrowserItemID
*) last
) );
1991 wxClientDataType
wxMacDataItemBrowserControl::GetClientDataType() const
1993 return m_clientDataItemsType
;
1995 void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType
)
1997 m_clientDataItemsType
= clientDataItemsType
;
2000 unsigned int wxMacDataItemBrowserControl::MacGetCount() const
2002 return GetItemCount(wxMacDataBrowserRootContainer
,false,kDataBrowserItemAnyState
);
2005 void wxMacDataItemBrowserControl::MacDelete( unsigned int n
)
2007 wxMacDataItem
* item
= (wxMacDataItem
*)GetItemFromLine( n
);
2008 RemoveItem( wxMacDataBrowserRootContainer
, item
);
2011 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
, const wxString
& text
, int column
)
2013 wxMacDataItem
* newItem
= CreateItem();
2014 newItem
->SetLabel( text
);
2016 newItem
->SetColumn( kMinColumnId
+ column
);
2018 if ( m_sortOrder
== SortOrder_None
)
2020 // increase the order of the lines to be shifted
2021 unsigned int lines
= MacGetCount();
2022 for ( unsigned int i
= n
; i
< lines
; ++i
)
2024 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
2025 iter
->SetOrder( iter
->GetOrder() + 1 );
2028 SInt32 frontLineOrder
= 0;
2031 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
2032 frontLineOrder
= iter
->GetOrder();
2034 newItem
->SetOrder( frontLineOrder
+ 1 );
2037 AddItem( wxMacDataBrowserRootContainer
, newItem
);
2040 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
, const wxArrayString
& items
, int column
)
2042 size_t itemsCount
= items
.GetCount();
2043 if ( itemsCount
== 0 )
2046 SInt32 frontLineOrder
= 0;
2048 if ( m_sortOrder
== SortOrder_None
)
2050 // increase the order of the lines to be shifted
2051 unsigned int lines
= MacGetCount();
2052 for ( unsigned int i
= n
; i
< lines
; ++i
)
2054 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
2055 iter
->SetOrder( iter
->GetOrder() + itemsCount
);
2059 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
2060 frontLineOrder
= iter
->GetOrder();
2064 wxArrayMacDataItemPtr ids
;
2065 ids
.SetCount( itemsCount
);
2067 for ( unsigned int i
= 0; i
< itemsCount
; ++i
)
2069 wxMacDataItem
* item
= CreateItem();
2070 item
->SetLabel( items
[i
]);
2072 item
->SetColumn( kMinColumnId
+ column
);
2074 if ( m_sortOrder
== SortOrder_None
)
2075 item
->SetOrder( frontLineOrder
+ 1 + i
);
2080 AddItems( wxMacDataBrowserRootContainer
, ids
);
2083 int wxMacDataItemBrowserControl::MacAppend( const wxString
& text
)
2085 wxMacDataItem
* item
= CreateItem();
2086 item
->SetLabel( text
);
2087 if ( m_sortOrder
== SortOrder_None
)
2089 unsigned int lines
= MacGetCount();
2091 item
->SetOrder( 1 );
2094 wxMacDataItem
* frontItem
= (wxMacDataItem
*) GetItemFromLine(lines
-1);
2095 item
->SetOrder( frontItem
->GetOrder() + 1 );
2098 AddItem( wxMacDataBrowserRootContainer
, item
);
2100 return GetLineFromItem(item
);
2103 void wxMacDataItemBrowserControl::MacClear()
2105 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2106 RemoveAllItems(wxMacDataBrowserRootContainer
);
2109 void wxMacDataItemBrowserControl::MacDeselectAll()
2111 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2112 SetSelectedAllItems( kDataBrowserItemsRemove
);
2115 void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n
, bool select
, bool multi
)
2117 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
2118 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2120 if ( IsItemSelected( item
) != select
)
2123 SetSelectedItem( item
, multi
? kDataBrowserItemsAdd
: kDataBrowserItemsAssign
);
2125 SetSelectedItem( item
, kDataBrowserItemsRemove
);
2131 bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n
) const
2133 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
2134 return IsItemSelected( item
);
2137 int wxMacDataItemBrowserControl::MacGetSelection() const
2139 wxMacDataItemPtr first
, last
;
2140 GetSelectionAnchor( &first
, &last
);
2142 if ( first
!= NULL
)
2144 return GetLineFromItem( first
);
2150 int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt
& aSelections
) const
2152 aSelections
.Empty();
2153 wxArrayMacDataItemPtr selectedItems
;
2154 GetItems( wxMacDataBrowserRootContainer
, false , kDataBrowserItemIsSelected
, selectedItems
);
2156 int count
= selectedItems
.GetCount();
2158 for ( int i
= 0; i
< count
; ++i
)
2160 aSelections
.Add(GetLineFromItem(selectedItems
[i
]));
2166 void wxMacDataItemBrowserControl::MacSetString( unsigned int n
, const wxString
& text
)
2168 // as we don't store the strings we only have to issue a redraw
2169 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2170 item
->SetLabel( text
);
2171 UpdateItem( wxMacDataBrowserRootContainer
, item
, kTextColumnId
);
2174 wxString
wxMacDataItemBrowserControl::MacGetString( unsigned int n
) const
2176 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2177 return item
->GetLabel();
2180 void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n
, void * data
)
2182 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2183 item
->SetData( data
);
2184 // not displayed, therefore no Update infos to DataBrowser
2187 void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n
) const
2189 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2190 return item
->GetData();
2193 void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n
)
2195 RevealItem( GetItemFromLine( n
) , kDataBrowserRevealWithoutSelecting
);
2204 OSStatus
wxMacControl::SetTabEnabled( SInt16 tabNo
, bool enable
)
2206 return ::SetTabEnabled( m_controlRef
, tabNo
, enable
);
2213 #ifdef __WXMAC_OSX__
2214 // snippets from Sketch Sample from Apple :
2216 #define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc"
2219 This function locates, opens, and returns the profile reference for the calibrated
2220 Generic RGB color space. It is up to the caller to call CMCloseProfile when done
2221 with the profile reference this function returns.
2223 CMProfileRef
wxMacOpenGenericProfile()
2225 static CMProfileRef cachedRGBProfileRef
= NULL
;
2227 // we only create the profile reference once
2228 if (cachedRGBProfileRef
== NULL
)
2230 CMProfileLocation loc
;
2232 loc
.locType
= cmPathBasedProfile
;
2233 strcpy(loc
.u
.pathLoc
.path
, kGenericRGBProfilePathStr
);
2235 verify_noerr( CMOpenProfile(&cachedRGBProfileRef
, &loc
) );
2238 // clone the profile reference so that the caller has their own reference, not our cached one
2239 if (cachedRGBProfileRef
)
2240 CMCloneProfileRef(cachedRGBProfileRef
);
2242 return cachedRGBProfileRef
;
2246 Return the generic RGB color space. This is a 'get' function and the caller should
2247 not release the returned value unless the caller retains it first. Usually callers
2248 of this routine will immediately use the returned colorspace with CoreGraphics
2249 so they typically do not need to retain it themselves.
2251 This function creates the generic RGB color space once and hangs onto it so it can
2252 return it whenever this function is called.
2255 CGColorSpaceRef
wxMacGetGenericRGBColorSpace()
2257 static wxMacCFRefHolder
<CGColorSpaceRef
> genericRGBColorSpace
;
2259 if (genericRGBColorSpace
== NULL
)
2261 if ( UMAGetSystemVersion() >= 0x1040 )
2263 genericRGBColorSpace
.Set( CGColorSpaceCreateWithName( CFSTR("kCGColorSpaceGenericRGB") ) );
2267 CMProfileRef genericRGBProfile
= wxMacOpenGenericProfile();
2269 if (genericRGBProfile
)
2271 genericRGBColorSpace
.Set( CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile
) );
2273 wxASSERT_MSG( genericRGBColorSpace
!= NULL
, wxT("couldn't create the generic RGB color space") );
2275 // we opened the profile so it is up to us to close it
2276 CMCloseProfile(genericRGBProfile
);
2281 return genericRGBColorSpace
;
2287 wxMacPortSaver::wxMacPortSaver( GrafPtr port
)
2289 ::GetPort( &m_port
);
2293 wxMacPortSaver::~wxMacPortSaver()
2295 ::SetPort( m_port
);
2299 void wxMacGlobalToLocal( WindowRef window
, Point
*pt
)
2301 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
2302 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
2303 HIViewRef contentView
;
2304 // TODO check toolbar offset
2305 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
2306 HIPointConvert( &p
, kHICoordSpace72DPIGlobal
, NULL
, kHICoordSpaceView
, contentView
);
2310 QDGlobalToLocalPoint( GetWindowPort(window
), pt
) ;
2314 void wxMacLocalToGlobal( WindowRef window
, Point
*pt
)
2316 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
2317 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
2318 HIViewRef contentView
;
2319 // TODO check toolbar offset
2320 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
2321 HIPointConvert( &p
, kHICoordSpaceView
, contentView
, kHICoordSpace72DPIGlobal
, NULL
);
2325 QDLocalToGlobalPoint( GetWindowPort(window
), pt
) ;