1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/mac/carbon/utils.cpp
3 // Purpose: Various utilities
4 // Author: Stefan Csomor
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
20 #include "wx/toplevel.h"
25 #include "wx/apptrait.h"
28 #include "wx/mac/uma.h"
38 #include "MoreFilesX.h"
46 #if TARGET_API_MAC_OSX
47 #include <CoreServices/CoreServices.h>
49 #include <DriverServices.h>
50 #include <Multiprocessing.h>
54 #include <Carbon/Carbon.h>
56 #include <ATSUnicode.h>
57 #include <TextCommon.h>
58 #include <TextEncodingConverter.h>
62 #include "wx/mac/private.h"
64 #if defined(__MWERKS__) && wxUSE_UNICODE
65 #if __MWERKS__ < 0x4100 || !defined(__DARWIN__)
72 // our OS version is the same in non GUI and GUI cases
73 wxOperatingSystemId
wxGetOsVersion(int *majorVsn
, int *minorVsn
)
76 Gestalt(gestaltSystemVersion
, &theSystem
);
78 if ( majorVsn
!= NULL
)
79 *majorVsn
= (theSystem
>> 8);
81 if ( minorVsn
!= NULL
)
82 *minorVsn
= (theSystem
& 0xFF);
84 #if defined( __DARWIN__ )
85 return wxOS_MAC_OSX_DARWIN
;
91 // ----------------------------------------------------------------------------
93 // ----------------------------------------------------------------------------
95 #if defined(__WXDEBUG__) && defined(__WXMAC__) && !defined(__DARWIN__) && defined(__MWERKS__) && (__MWERKS__ >= 0x2400)
97 // MetroNub stuff doesn't seem to work in CodeWarrior 5.3 Carbon builds...
99 #ifndef __MetroNubUtils__
100 #include "MetroNubUtils.h"
107 #if TARGET_API_MAC_CARBON
109 #include <CodeFragments.h>
111 extern "C" long CallUniversalProc(UniversalProcPtr theProcPtr
, ProcInfoType procInfo
, ...);
113 ProcPtr gCallUniversalProc_Proc
= NULL
;
117 static MetroNubUserEntryBlock
* gMetroNubEntry
= NULL
;
119 static long fRunOnce
= false;
122 Boolean
IsMetroNubInstalled()
129 gMetroNubEntry
= NULL
;
131 if (Gestalt(gestaltSystemVersion
, &value
) == noErr
&& value
< 0x1000)
133 // look for MetroNub's Gestalt selector
134 if (Gestalt(kMetroNubUserSignature
, &result
) == noErr
)
136 #if TARGET_API_MAC_CARBON
137 if (gCallUniversalProc_Proc
== NULL
)
139 CFragConnectionID connectionID
;
142 ProcPtr symbolAddress
;
144 CFragSymbolClass symbolClass
;
146 symbolAddress
= NULL
;
147 err
= GetSharedLibrary("\pInterfaceLib", kPowerPCCFragArch
, kFindCFrag
,
148 &connectionID
, &mainAddress
, errorString
);
152 gCallUniversalProc_Proc
= NULL
;
156 err
= FindSymbol(connectionID
, "\pCallUniversalProc",
157 (Ptr
*) &gCallUniversalProc_Proc
, &symbolClass
);
161 gCallUniversalProc_Proc
= NULL
;
168 MetroNubUserEntryBlock
* block
= (MetroNubUserEntryBlock
*)result
;
170 // make sure the version of the API is compatible
171 if (block
->apiLowVersion
<= kMetroNubUserAPIVersion
&&
172 kMetroNubUserAPIVersion
<= block
->apiHiVersion
)
175 gMetroNubEntry
= block
;
184 #if TARGET_API_MAC_CARBON
185 return (gMetroNubEntry
!= NULL
&& gCallUniversalProc_Proc
!= NULL
);
187 return (gMetroNubEntry
!= NULL
);
191 Boolean
IsMWDebuggerRunning()
193 if (IsMetroNubInstalled())
194 return CallIsDebuggerRunningProc(gMetroNubEntry
->isDebuggerRunning
);
199 Boolean
AmIBeingMWDebugged()
201 if (IsMetroNubInstalled())
202 return CallAmIBeingDebuggedProc(gMetroNubEntry
->amIBeingDebugged
);
207 extern bool WXDLLEXPORT
wxIsDebuggerRunning()
209 return IsMWDebuggerRunning() && AmIBeingMWDebugged();
214 extern bool WXDLLEXPORT
wxIsDebuggerRunning()
219 #endif // defined(__WXMAC__) && !defined(__DARWIN__) && (__MWERKS__ >= 0x2400)
223 // defined in unix/utilsunx.cpp for Mac OS X
225 // get full hostname (with domain name if possible)
226 bool wxGetFullHostName(wxChar
*buf
, int maxSize
)
228 return wxGetHostName(buf
, maxSize
);
231 // Get user ID e.g. jacs
232 bool wxGetUserId(wxChar
*buf
, int maxSize
)
234 return wxGetUserName( buf
, maxSize
);
237 const wxChar
* wxGetHomeDir(wxString
*pstr
)
239 *pstr
= wxMacFindFolder( (short) kOnSystemDisk
, kPreferencesFolderType
, kDontCreateFolder
);
240 return pstr
->c_str();
243 // Get hostname only (without domain name)
244 bool wxGetHostName(wxChar
*buf
, int maxSize
)
246 // Gets Chooser name of user by examining a System resource.
249 const short kComputerNameID
= -16413;
251 short oldResFile
= CurResFile();
253 StringHandle chooserName
= (StringHandle
)::GetString(kComputerNameID
);
254 UseResFile(oldResFile
);
256 if (chooserName
&& *chooserName
)
258 HLock( (Handle
) chooserName
);
259 wxString name
= wxMacMakeStringFromPascal( *chooserName
);
260 HUnlock( (Handle
) chooserName
);
261 ReleaseResource( (Handle
) chooserName
);
262 wxStrncpy( buf
, name
, maxSize
- 1 );
268 // Get user name e.g. Stefan Csomor
269 bool wxGetUserName(wxChar
*buf
, int maxSize
)
271 // Gets Chooser name of user by examining a System resource.
274 const short kChooserNameID
= -16096;
276 short oldResFile
= CurResFile();
278 StringHandle chooserName
= (StringHandle
)::GetString(kChooserNameID
);
279 UseResFile(oldResFile
);
281 if (chooserName
&& *chooserName
)
283 HLock( (Handle
) chooserName
);
284 wxString name
= wxMacMakeStringFromPascal( *chooserName
);
285 HUnlock( (Handle
) chooserName
);
286 ReleaseResource( (Handle
) chooserName
);
287 wxStrncpy( buf
, name
, maxSize
- 1 );
293 int wxKill(long pid
, wxSignal sig
, wxKillError
*rc
, int flags
)
299 WXDLLEXPORT
bool wxGetEnv(const wxString
& var
, wxString
*value
)
301 // TODO : under classic there is no environement support, under X yes
305 // set the env var name to the given value, return true on success
306 WXDLLEXPORT
bool wxSetEnv(const wxString
& var
, const wxChar
*value
)
308 // TODO : under classic there is no environement support, under X yes
312 // Execute a program in an Interactive Shell
313 bool wxShell(const wxString
& command
)
319 // Shutdown or reboot the PC
320 bool wxShutdown(wxShutdownFlags wFlags
)
326 // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX)
327 wxMemorySize
wxGetFreeMemory()
329 return (wxMemorySize
)FreeMem();
334 void wxMicroSleep(unsigned long microseconds
)
336 AbsoluteTime wakeup
= AddDurationToAbsolute( microseconds
* durationMicrosecond
, UpTime());
337 MPDelayUntil( & wakeup
);
340 void wxMilliSleep(unsigned long milliseconds
)
342 AbsoluteTime wakeup
= AddDurationToAbsolute( milliseconds
, UpTime());
343 MPDelayUntil( & wakeup
);
346 void wxSleep(int nSecs
)
348 wxMilliSleep(1000*nSecs
);
353 // Consume all events until no more left
358 #endif // !__DARWIN__
373 wxPortId
wxGUIAppTraits::GetToolkitVersion(int *verMaj
, int *verMin
) const
375 // We suppose that toolkit version is the same as OS version under Mac
376 wxGetOsVersion(verMaj
, verMin
);
381 int gs_wxBusyCursorCount
= 0;
382 extern wxCursor gMacCurrentCursor
;
383 wxCursor gMacStoredActiveCursor
;
385 // Set the cursor to the busy cursor for all windows
386 void wxBeginBusyCursor(const wxCursor
*cursor
)
388 if (gs_wxBusyCursorCount
++ == 0)
390 gMacStoredActiveCursor
= gMacCurrentCursor
;
391 cursor
->MacInstall();
393 //else: nothing to do, already set
396 // Restore cursor to normal
397 void wxEndBusyCursor()
399 wxCHECK_RET( gs_wxBusyCursorCount
> 0,
400 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
402 if (--gs_wxBusyCursorCount
== 0)
404 gMacStoredActiveCursor
.MacInstall();
405 gMacStoredActiveCursor
= wxNullCursor
;
409 // true if we're between the above two calls
412 return (gs_wxBusyCursorCount
> 0);
419 wxString
wxMacFindFolderNoSeparator( short vol
,
421 Boolean createFolder
)
426 if ( FSFindFolder( vol
, folderType
, createFolder
, &fsRef
) == noErr
)
428 strDir
= wxMacFSRefToPath( &fsRef
);
434 wxString
wxMacFindFolder( short vol
,
436 Boolean createFolder
)
438 return wxMacFindFolderNoSeparator(vol
, folderType
, createFolder
) + wxFILE_SEP_PATH
;
445 // Check whether this window wants to process messages, e.g. Stop button
446 // in long calculations.
447 bool wxCheckForInterrupt(wxWindow
*wnd
)
453 void wxGetMousePosition( int* x
, int* y
)
456 #if wxMAC_USE_CORE_GRAPHICS
460 LocalToGlobal( &pt
);
466 // Return true if we have a colour display
467 bool wxColourDisplay()
472 // Returns depth of screen
476 #if wxMAC_USE_CORE_GRAPHICS
477 theDepth
= (int) CGDisplayBitsPerPixel(CGMainDisplayID());
480 SetRect(&globRect
, -32760, -32760, 32760, 32760);
481 GDHandle theMaxDevice
;
483 theMaxDevice
= GetMaxDevice(&globRect
);
484 if (theMaxDevice
!= NULL
)
485 theDepth
= (**(**theMaxDevice
).gdPMap
).pixelSize
;
490 // Get size of display
491 void wxDisplaySize(int *width
, int *height
)
493 #if wxMAC_USE_CORE_GRAPHICS
494 // TODO adapt for multi-displays
495 CGRect bounds
= CGDisplayBounds(CGMainDisplayID());
497 *width
= (int)bounds
.size
.width
;
499 *height
= (int)bounds
.size
.height
;
502 GetQDGlobalsScreenBits( &screenBits
);
505 *width
= screenBits
.bounds
.right
- screenBits
.bounds
.left
;
508 *height
= screenBits
.bounds
.bottom
- screenBits
.bounds
.top
;
512 void wxDisplaySizeMM(int *width
, int *height
)
514 wxDisplaySize(width
, height
);
515 // on mac 72 is fixed (at least now;-)
516 float cvPt2Mm
= 25.4 / 72;
519 *width
= int( *width
* cvPt2Mm
);
522 *height
= int( *height
* cvPt2Mm
);
525 void wxClientDisplayRect(int *x
, int *y
, int *width
, int *height
)
527 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
529 HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay
,kHICoordSpace72DPIGlobal
,
532 *x
= bounds
.origin
.x
;
534 *y
= bounds
.origin
.y
;
536 *width
= bounds
.size
.width
;
538 *height
= bounds
.size
.height
;
541 GetAvailableWindowPositioningBounds( GetMainDevice() , &r
);
547 *width
= r
.right
- r
.left
;
549 *height
= r
.bottom
- r
.top
;
553 wxWindow
* wxFindWindowAtPoint(const wxPoint
& pt
)
555 return wxGenericFindWindowAtPoint(pt
);
562 wxString
wxGetOsDescription()
564 #ifdef WXWIN_OS_DESCRIPTION
565 // use configure generated description if available
566 return wxString(wxT("MacOS (")) + wxT(WXWIN_OS_DESCRIPTION
) + wxString(wxT(")"));
568 return wxT("MacOS"); //TODO:define further
573 wxChar
*wxGetUserHome (const wxString
& user
)
579 bool wxGetDiskSpace(const wxString
& path
, wxDiskspaceSize_t
*pTotal
, wxDiskspaceSize_t
*pFree
)
588 int pos
= p
.Find(':');
589 if ( pos
!= wxNOT_FOUND
)
597 err
= wxMacPathToFSRef( p
, &fsRef
);
600 FSVolumeRefNum vRefNum
;
601 err
= FSGetVRefNum( &fsRef
, &vRefNum
);
604 UInt64 freeBytes
, totalBytes
;
605 err
= FSGetVInfo( vRefNum
, NULL
, &freeBytes
, &totalBytes
);
609 *pTotal
= wxDiskspaceSize_t( totalBytes
);
611 *pFree
= wxDiskspaceSize_t( freeBytes
);
618 #endif // !__DARWIN__
620 //---------------------------------------------------------------------------
621 // wxMac Specific utility functions
622 //---------------------------------------------------------------------------
624 void wxMacStringToPascal( const wxString
&from
, StringPtr to
)
626 wxCharBuffer buf
= from
.mb_str( wxConvLocal
);
627 int len
= strlen(buf
);
632 memcpy( (char*) &to
[1] , buf
, len
);
635 wxString
wxMacMakeStringFromPascal( ConstStringPtr from
)
637 return wxString( (char*) &from
[1] , wxConvLocal
, from
[0] );
640 // ----------------------------------------------------------------------------
641 // Common Event Support
642 // ----------------------------------------------------------------------------
644 extern ProcessSerialNumber gAppProcess
;
648 ProcessSerialNumber psn
;
650 psn
.highLongOfPSN
= 0;
651 psn
.lowLongOfPSN
= kCurrentProcess
;
652 SameProcess( &gAppProcess
, &psn
, &isSame
);
656 OSStatus err
= noErr
;
659 // lead sometimes to race conditions, although all calls used should be thread safe ...
660 static wxMacCarbonEvent s_wakeupEvent
;
661 if ( !s_wakeupEvent
.IsValid() )
663 err
= s_wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
664 kEventAttributeNone
);
669 if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent
) )
671 s_wakeupEvent
.SetCurrentTime();
672 err
= PostEventToQueue(GetMainEventQueue(), s_wakeupEvent
,
673 kEventPriorityHigh
);
676 wxMacCarbonEvent wakeupEvent
;
677 wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
678 kEventAttributeNone
);
679 err
= PostEventToQueue(GetMainEventQueue(), wakeupEvent
,
680 kEventPriorityHigh
);
683 PostEvent( nullEvent
, 0 );
688 WakeUpProcess( &gAppProcess
);
696 // ----------------------------------------------------------------------------
697 // Native Struct Conversions
698 // ----------------------------------------------------------------------------
700 void wxMacRectToNative( const wxRect
*wx
, Rect
*n
)
704 n
->right
= wx
->x
+ wx
->width
;
705 n
->bottom
= wx
->y
+ wx
->height
;
708 void wxMacNativeToRect( const Rect
*n
, wxRect
* wx
)
712 wx
->width
= n
->right
- n
->left
;
713 wx
->height
= n
->bottom
- n
->top
;
716 void wxMacPointToNative( const wxPoint
* wx
, Point
*n
)
722 void wxMacNativeToPoint( const Point
*n
, wxPoint
* wx
)
728 // ----------------------------------------------------------------------------
729 // Carbon Event Support
730 // ----------------------------------------------------------------------------
732 OSStatus
wxMacCarbonEvent::GetParameter(EventParamName inName
, EventParamType inDesiredType
, UInt32 inBufferSize
, void * outData
)
734 return ::GetEventParameter( m_eventRef
, inName
, inDesiredType
, NULL
, inBufferSize
, NULL
, outData
);
737 OSStatus
wxMacCarbonEvent::SetParameter(EventParamName inName
, EventParamType inType
, UInt32 inBufferSize
, const void * inData
)
739 return ::SetEventParameter( m_eventRef
, inName
, inType
, inBufferSize
, inData
);
742 // ----------------------------------------------------------------------------
743 // Control Access Support
744 // ----------------------------------------------------------------------------
746 IMPLEMENT_DYNAMIC_CLASS( wxMacControl
, wxObject
)
748 wxMacControl::wxMacControl()
753 wxMacControl::wxMacControl(wxWindow
* peer
, bool isRootControl
)
757 m_isRootControl
= isRootControl
;
760 wxMacControl::wxMacControl( wxWindow
* peer
, ControlRef control
)
764 m_controlRef
= control
;
767 wxMacControl::wxMacControl( wxWindow
* peer
, WXWidget control
)
771 m_controlRef
= (ControlRef
) control
;
774 wxMacControl::~wxMacControl()
778 void wxMacControl::Init()
782 m_needsFocusRect
= false;
783 m_isRootControl
= false;
786 void wxMacControl::Dispose()
788 wxASSERT_MSG( m_controlRef
!= NULL
, wxT("Control Handle already NULL, Dispose called twice ?") );
789 wxASSERT_MSG( IsValidControlHandle(m_controlRef
) , wxT("Invalid Control Handle (maybe already released) in Dispose") );
791 // we cannot check the ref count here anymore, as autorelease objects might delete their refs later
792 CFRelease(m_controlRef
);
796 void wxMacControl::SetReference( URefCon data
)
798 SetControlReference( m_controlRef
, data
);
801 OSStatus
wxMacControl::GetData(ControlPartCode inPartCode
, ResType inTag
, Size inBufferSize
, void * inOutBuffer
, Size
* outActualSize
) const
803 return ::GetControlData( m_controlRef
, inPartCode
, inTag
, inBufferSize
, inOutBuffer
, outActualSize
);
806 OSStatus
wxMacControl::GetDataSize(ControlPartCode inPartCode
, ResType inTag
, Size
* outActualSize
) const
808 return ::GetControlDataSize( m_controlRef
, inPartCode
, inTag
, outActualSize
);
811 OSStatus
wxMacControl::SetData(ControlPartCode inPartCode
, ResType inTag
, Size inSize
, const void * inData
)
813 return ::SetControlData( m_controlRef
, inPartCode
, inTag
, inSize
, inData
);
816 OSStatus
wxMacControl::SendEvent( EventRef event
, OptionBits inOptions
)
818 #if TARGET_API_MAC_OSX
819 return SendEventToEventTargetWithOptions( event
,
820 HIObjectGetEventTarget( (HIObjectRef
) m_controlRef
), inOptions
);
822 #pragma unused(inOptions)
823 return SendEventToEventTarget(event
,GetControlEventTarget( m_controlRef
) );
827 OSStatus
wxMacControl::SendHICommand( HICommand
&command
, OptionBits inOptions
)
829 wxMacCarbonEvent
event( kEventClassCommand
, kEventCommandProcess
);
831 event
.SetParameter
<HICommand
>(kEventParamDirectObject
,command
);
833 return SendEvent( event
, inOptions
);
836 OSStatus
wxMacControl::SendHICommand( UInt32 commandID
, OptionBits inOptions
)
840 memset( &command
, 0 , sizeof(command
) );
841 command
.commandID
= commandID
;
842 return SendHICommand( command
, inOptions
);
845 void wxMacControl::Flash( ControlPartCode part
, UInt32 ticks
)
847 unsigned long finalTicks
;
849 HiliteControl( m_controlRef
, part
);
850 Delay( ticks
, &finalTicks
);
851 HiliteControl( m_controlRef
, kControlNoPart
);
854 SInt32
wxMacControl::GetValue() const
856 return ::GetControl32BitValue( m_controlRef
);
859 SInt32
wxMacControl::GetMaximum() const
861 return ::GetControl32BitMaximum( m_controlRef
);
864 SInt32
wxMacControl::GetMinimum() const
866 return ::GetControl32BitMinimum( m_controlRef
);
869 void wxMacControl::SetValue( SInt32 v
)
871 ::SetControl32BitValue( m_controlRef
, v
);
874 void wxMacControl::SetMinimum( SInt32 v
)
876 ::SetControl32BitMinimum( m_controlRef
, v
);
879 void wxMacControl::SetMaximum( SInt32 v
)
881 ::SetControl32BitMaximum( m_controlRef
, v
);
884 void wxMacControl::SetValueAndRange( SInt32 value
, SInt32 minimum
, SInt32 maximum
)
886 ::SetControl32BitMinimum( m_controlRef
, minimum
);
887 ::SetControl32BitMaximum( m_controlRef
, maximum
);
888 ::SetControl32BitValue( m_controlRef
, value
);
891 OSStatus
wxMacControl::SetFocus( ControlFocusPart focusPart
)
893 return SetKeyboardFocus( GetControlOwner( m_controlRef
), m_controlRef
, focusPart
);
896 bool wxMacControl::HasFocus() const
899 GetKeyboardFocus( GetUserFocusWindow() , &control
);
900 return control
== m_controlRef
;
903 void wxMacControl::SetNeedsFocusRect( bool needs
)
905 m_needsFocusRect
= needs
;
908 bool wxMacControl::NeedsFocusRect() const
910 return m_needsFocusRect
;
913 void wxMacControl::VisibilityChanged(bool shown
)
917 void wxMacControl::SuperChangedPosition()
921 void wxMacControl::SetFont( const wxFont
& font
, const wxColour
& foreground
, long windowStyle
)
924 ControlFontStyleRec fontStyle
;
925 if ( font
.MacGetThemeFontID() != kThemeCurrentPortFont
)
927 switch ( font
.MacGetThemeFontID() )
929 case kThemeSmallSystemFont
:
930 fontStyle
.font
= kControlFontSmallSystemFont
;
933 case 109 : // mini font
937 case kThemeSystemFont
:
938 fontStyle
.font
= kControlFontBigSystemFont
;
942 fontStyle
.font
= kControlFontBigSystemFont
;
946 fontStyle
.flags
= kControlUseFontMask
;
950 fontStyle
.font
= font
.MacGetFontNum();
951 fontStyle
.style
= font
.MacGetFontStyle();
952 fontStyle
.size
= font
.MacGetFontSize();
953 fontStyle
.flags
= kControlUseFontMask
| kControlUseFaceMask
| kControlUseSizeMask
;
956 fontStyle
.just
= teJustLeft
;
957 fontStyle
.flags
|= kControlUseJustMask
;
958 if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_CENTER_HORIZONTAL
)
959 fontStyle
.just
= teJustCenter
;
960 else if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_RIGHT
)
961 fontStyle
.just
= teJustRight
;
964 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
965 // won't get grayed out by the system anymore
967 if ( foreground
!= *wxBLACK
)
969 fontStyle
.foreColor
= MAC_WXCOLORREF( foreground
.GetPixel() );
970 fontStyle
.flags
|= kControlUseForeColorMask
;
973 ::SetControlFontStyle( m_controlRef
, &fontStyle
);
976 void wxMacControl::SetBackground( const wxBrush
&WXUNUSED(brush
) )
979 // setting up a color proc is not recommended anymore
982 void wxMacControl::SetRange( SInt32 minimum
, SInt32 maximum
)
984 ::SetControl32BitMinimum( m_controlRef
, minimum
);
985 ::SetControl32BitMaximum( m_controlRef
, maximum
);
988 short wxMacControl::HandleKey( SInt16 keyCode
, SInt16 charCode
, EventModifiers modifiers
)
991 return HandleControlKey( m_controlRef
, keyCode
, charCode
, modifiers
);
997 void wxMacControl::SetActionProc( ControlActionUPP actionProc
)
999 SetControlAction( m_controlRef
, actionProc
);
1002 void wxMacControl::SetViewSize( SInt32 viewSize
)
1004 SetControlViewSize(m_controlRef
, viewSize
);
1007 SInt32
wxMacControl::GetViewSize() const
1009 return GetControlViewSize( m_controlRef
);
1012 bool wxMacControl::IsVisible() const
1014 return IsControlVisible( m_controlRef
);
1017 void wxMacControl::SetVisibility( bool visible
, bool redraw
)
1019 SetControlVisibility( m_controlRef
, visible
, redraw
);
1022 bool wxMacControl::IsEnabled() const
1024 #if TARGET_API_MAC_OSX
1025 return IsControlEnabled( m_controlRef
);
1027 return IsControlActive( m_controlRef
);
1031 bool wxMacControl::IsActive() const
1033 return IsControlActive( m_controlRef
);
1036 void wxMacControl::Enable( bool enable
)
1039 EnableControl( m_controlRef
);
1041 DisableControl( m_controlRef
);
1044 void wxMacControl::SetDrawingEnabled( bool enable
)
1046 HIViewSetDrawingEnabled( m_controlRef
, enable
);
1049 bool wxMacControl::GetNeedsDisplay() const
1051 return HIViewGetNeedsDisplay( m_controlRef
);
1054 void wxMacControl::SetNeedsDisplay( RgnHandle where
)
1059 HIViewSetNeedsDisplayInRegion( m_controlRef
, where
, true );
1062 void wxMacControl::SetNeedsDisplay( Rect
* where
)
1067 if ( where
!= NULL
)
1069 RgnHandle update
= NewRgn();
1070 RectRgn( update
, where
);
1071 HIViewSetNeedsDisplayInRegion( m_controlRef
, update
, true );
1072 DisposeRgn( update
);
1075 HIViewSetNeedsDisplay( m_controlRef
, true );
1078 void wxMacControl::Convert( wxPoint
*pt
, wxMacControl
*from
, wxMacControl
*to
)
1084 HIViewConvertPoint( &hiPoint
, from
->m_controlRef
, to
->m_controlRef
);
1085 pt
->x
= (int)hiPoint
.x
;
1086 pt
->y
= (int)hiPoint
.y
;
1089 void wxMacControl::SetRect( Rect
*r
)
1091 //A HIRect is actually a CGRect on OSX - which consists of two structures -
1092 //CGPoint and CGSize, which have two floats each
1093 HIRect hir
= { { r
->left
, r
->top
}, { r
->right
- r
->left
, r
->bottom
- r
->top
} };
1094 HIViewSetFrame ( m_controlRef
, &hir
);
1095 // eventuall we might have to do a SetVisibility( false , true );
1096 // before and a SetVisibility( true , true ); after
1099 void wxMacControl::GetRect( Rect
*r
)
1101 GetControlBounds( m_controlRef
, r
);
1104 void wxMacControl::GetRectInWindowCoords( Rect
*r
)
1106 UMAGetControlBoundsInWindowCoords( m_controlRef
, r
);
1109 void wxMacControl::GetBestRect( Rect
*r
)
1111 short baselineoffset
;
1113 GetBestControlRect( m_controlRef
, r
, &baselineoffset
);
1116 void wxMacControl::SetLabel( const wxString
&title
)
1118 wxFontEncoding encoding
;
1121 encoding
= m_font
.GetEncoding();
1123 encoding
= wxFont::GetDefaultEncoding();
1125 UMASetControlTitle( m_controlRef
, title
, encoding
);
1128 void wxMacControl::GetFeatures( UInt32
* features
)
1130 GetControlFeatures( m_controlRef
, features
);
1133 OSStatus
wxMacControl::GetRegion( ControlPartCode partCode
, RgnHandle region
)
1135 OSStatus err
= GetControlRegion( m_controlRef
, partCode
, region
);
1139 OSStatus
wxMacControl::SetZOrder( bool above
, wxMacControl
* other
)
1141 #if TARGET_API_MAC_OSX
1142 return HIViewSetZOrder( m_controlRef
,above
? kHIViewZOrderAbove
: kHIViewZOrderBelow
,
1143 (other
!= NULL
) ? other
->m_controlRef
: NULL
);
1149 #if TARGET_API_MAC_OSX
1150 // SetNeedsDisplay would not invalidate the children
1151 static void InvalidateControlAndChildren( HIViewRef control
)
1153 HIViewSetNeedsDisplay( control
, true );
1154 UInt16 childrenCount
= 0;
1155 OSStatus err
= CountSubControls( control
, &childrenCount
);
1156 if ( err
== errControlIsNotEmbedder
)
1159 wxASSERT_MSG( err
== noErr
, wxT("Unexpected error when accessing subcontrols") );
1161 for ( UInt16 i
= childrenCount
; i
>=1; --i
)
1165 err
= GetIndexedSubControl( control
, i
, & child
);
1166 if ( err
== errControlIsNotEmbedder
)
1169 InvalidateControlAndChildren( child
);
1174 void wxMacControl::InvalidateWithChildren()
1176 #if TARGET_API_MAC_OSX
1177 InvalidateControlAndChildren( m_controlRef
);
1181 void wxMacControl::ScrollRect( wxRect
*r
, int dx
, int dy
)
1183 wxASSERT( r
!= NULL
);
1185 HIRect scrollarea
= CGRectMake( r
->x
, r
->y
, r
->width
, r
->height
);
1186 HIViewScrollRect ( m_controlRef
, &scrollarea
, dx
,dy
);
1189 OSType wxMacCreator
= 'WXMC';
1190 OSType wxMacControlProperty
= 'MCCT';
1192 void wxMacControl::SetReferenceInNativeControl()
1195 verify_noerr( SetControlProperty ( m_controlRef
,
1196 wxMacCreator
,wxMacControlProperty
, sizeof(data
), &data
) );
1199 wxMacControl
* wxMacControl::GetReferenceFromNativeControl(ControlRef control
)
1201 wxMacControl
* ctl
= NULL
;
1202 ByteCount actualSize
;
1203 if ( GetControlProperty( control
,wxMacCreator
,wxMacControlProperty
, sizeof(ctl
) ,
1204 &actualSize
, &ctl
) == noErr
)
1211 // ============================================================================
1212 // DataBrowser Wrapper
1213 // ============================================================================
1215 // basing on DataBrowserItemIDs
1218 IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl
, wxMacControl
)
1220 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
1222 DataBrowserItemID itemID
,
1223 DataBrowserItemNotification message
,
1224 DataBrowserItemDataRef itemData
)
1226 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1229 ctl
->ItemNotification(itemID
, message
, itemData
);
1233 pascal OSStatus
wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
1235 DataBrowserItemID itemID
,
1236 DataBrowserPropertyID property
,
1237 DataBrowserItemDataRef itemData
,
1238 Boolean changeValue
)
1240 OSStatus err
= errDataBrowserPropertyNotSupported
;
1241 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1244 err
= ctl
->GetSetItemData(itemID
, property
, itemData
, changeValue
);
1249 pascal Boolean
wxMacDataBrowserControl::DataBrowserCompareProc(
1251 DataBrowserItemID itemOneID
,
1252 DataBrowserItemID itemTwoID
,
1253 DataBrowserPropertyID sortProperty
)
1255 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1258 return ctl
->CompareItems(itemOneID
, itemTwoID
, sortProperty
);
1263 DataBrowserItemDataUPP gDataBrowserItemDataUPP
= NULL
;
1264 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP
= NULL
;
1265 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP
= NULL
;
1267 wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) : wxMacControl( peer
)
1269 Rect bounds
= wxMacGetBoundsForControl( peer
, pos
, size
);
1270 OSStatus err
= ::CreateDataBrowserControl(
1271 MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),
1272 &bounds
, kDataBrowserListView
, &m_controlRef
);
1273 SetReferenceInNativeControl();
1274 verify_noerr( err
);
1275 if ( gDataBrowserItemCompareUPP
== NULL
)
1276 gDataBrowserItemCompareUPP
= NewDataBrowserItemCompareUPP(DataBrowserCompareProc
);
1277 if ( gDataBrowserItemDataUPP
== NULL
)
1278 gDataBrowserItemDataUPP
= NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc
);
1279 if ( gDataBrowserItemNotificationUPP
== NULL
)
1281 gDataBrowserItemNotificationUPP
=
1282 #if TARGET_API_MAC_OSX
1283 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc
);
1285 NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc
);
1289 DataBrowserCallbacks callbacks
;
1290 InitializeDataBrowserCallbacks( &callbacks
, kDataBrowserLatestCallbacks
);
1292 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserItemDataUPP
;
1293 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserItemCompareUPP
;
1294 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserItemNotificationUPP
;
1295 SetCallbacks( &callbacks
);
1299 OSStatus
wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container
,
1301 DataBrowserItemState state
,
1302 ItemCount
*numItems
) const
1304 return GetDataBrowserItemCount( m_controlRef
, container
, recurse
, state
, numItems
);
1307 OSStatus
wxMacDataBrowserControl::GetItems( DataBrowserItemID container
,
1309 DataBrowserItemState state
,
1312 return GetDataBrowserItems( m_controlRef
, container
, recurse
, state
, items
);
1315 OSStatus
wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options
)
1317 return SetDataBrowserSelectionFlags( m_controlRef
, options
);
1320 OSStatus
wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc
*columnDesc
,
1321 DataBrowserTableViewColumnIndex position
)
1323 return AddDataBrowserListViewColumn( m_controlRef
, columnDesc
, position
);
1326 OSStatus
wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position
, DataBrowserTableViewColumnID
* id
){
1327 return GetDataBrowserTableViewColumnProperty( m_controlRef
, position
, id
);
1330 OSStatus
wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position
)
1332 DataBrowserTableViewColumnID id
;
1333 GetColumnIDFromIndex( position
, &id
);
1334 return RemoveDataBrowserTableViewColumn( m_controlRef
, id
);
1337 OSStatus
wxMacDataBrowserControl::AutoSizeColumns()
1339 return AutoSizeDataBrowserListViewColumns(m_controlRef
);
1342 OSStatus
wxMacDataBrowserControl::SetHasScrollBars( bool horiz
, bool vert
)
1344 return SetDataBrowserHasScrollBars( m_controlRef
, horiz
, vert
);
1347 OSStatus
wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle
)
1349 return SetDataBrowserTableViewHiliteStyle( m_controlRef
, hiliteStyle
);
1352 OSStatus
wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height
)
1354 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1357 OSStatus
wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16
*height
)
1359 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1362 OSStatus
wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks
*callbacks
)
1364 return SetDataBrowserCallbacks( m_controlRef
, callbacks
);
1367 OSStatus
wxMacDataBrowserControl::UpdateItems(
1368 DataBrowserItemID container
,
1370 const DataBrowserItemID
*items
,
1371 DataBrowserPropertyID preSortProperty
,
1372 DataBrowserPropertyID propertyID
) const
1374 return UpdateDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
, propertyID
);
1377 bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item
) const
1379 return IsDataBrowserItemSelected( m_controlRef
, item
);
1382 OSStatus
wxMacDataBrowserControl::AddItems(
1383 DataBrowserItemID container
,
1385 const DataBrowserItemID
*items
,
1386 DataBrowserPropertyID preSortProperty
)
1388 return AddDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1391 OSStatus
wxMacDataBrowserControl::RemoveItems(
1392 DataBrowserItemID container
,
1394 const DataBrowserItemID
*items
,
1395 DataBrowserPropertyID preSortProperty
)
1397 return RemoveDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1400 OSStatus
wxMacDataBrowserControl::RevealItem(
1401 DataBrowserItemID item
,
1402 DataBrowserPropertyID propertyID
,
1403 DataBrowserRevealOptions options
) const
1405 return RevealDataBrowserItem( m_controlRef
, item
, propertyID
, options
);
1408 OSStatus
wxMacDataBrowserControl::SetSelectedItems(
1410 const DataBrowserItemID
*items
,
1411 DataBrowserSetOption operation
)
1413 return SetDataBrowserSelectedItems( m_controlRef
, numItems
, items
, operation
);
1416 OSStatus
wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID
*first
, DataBrowserItemID
*last
) const
1418 return GetDataBrowserSelectionAnchor( m_controlRef
, first
, last
);
1421 OSStatus
wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
1423 return GetDataBrowserTableViewItemID( m_controlRef
, row
, item
);
1426 OSStatus
wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
1428 return GetDataBrowserTableViewItemRow( m_controlRef
, item
, row
);
1431 OSStatus
wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height
)
1433 return SetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1436 OSStatus
wxMacDataBrowserControl::GetDefaultRowHeight( UInt16
* height
) const
1438 return GetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1441 OSStatus
wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item
, UInt16 height
)
1443 return SetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1446 OSStatus
wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item
, UInt16
*height
) const
1448 return GetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1451 OSStatus
wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column
, UInt16
*width
) const
1453 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1456 OSStatus
wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column
, UInt16 width
)
1458 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1461 OSStatus
wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16
*width
) const
1463 return GetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1466 OSStatus
wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width
)
1468 return SetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1471 OSStatus
wxMacDataBrowserControl::GetColumnCount(UInt32
* numColumns
) const
1473 return GetDataBrowserTableViewColumnCount( m_controlRef
, numColumns
);
1476 OSStatus
wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column
,
1477 DataBrowserTableViewColumnIndex
*position
) const
1479 return GetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1482 OSStatus
wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column
, DataBrowserTableViewColumnIndex position
)
1484 return SetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1487 OSStatus
wxMacDataBrowserControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
1489 return GetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1492 OSStatus
wxMacDataBrowserControl::SetScrollPosition( UInt32 top
, UInt32 left
)
1494 return SetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1497 OSStatus
wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID
*column
) const
1499 return GetDataBrowserSortProperty( m_controlRef
, column
);
1502 OSStatus
wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column
)
1504 return SetDataBrowserSortProperty( m_controlRef
, column
);
1507 OSStatus
wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder
*order
) const
1509 return GetDataBrowserSortOrder( m_controlRef
, order
);
1512 OSStatus
wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order
)
1514 return SetDataBrowserSortOrder( m_controlRef
, order
);
1517 OSStatus
wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property
,
1518 DataBrowserPropertyFlags
*flags
) const
1520 return GetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1523 OSStatus
wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property
,
1524 DataBrowserPropertyFlags flags
)
1526 return SetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1529 OSStatus
wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property
,
1530 DataBrowserListViewHeaderDesc
*desc
) const
1532 return GetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1535 OSStatus
wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property
,
1536 DataBrowserListViewHeaderDesc
*desc
)
1538 return SetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1541 OSStatus
wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property
,
1542 Boolean expandableRows
)
1544 return SetDataBrowserListViewDisclosureColumn( m_controlRef
, property
, expandableRows
);
1547 // ============================================================================
1548 // Higher-level Databrowser
1549 // ============================================================================
1551 // basing on data item objects
1554 wxMacDataItem::wxMacDataItem()
1559 m_colId
= kTextColumnId
; // for compat with existing wx*ListBox impls.
1562 wxMacDataItem::~wxMacDataItem()
1566 void wxMacDataItem::SetOrder( SInt32 order
)
1571 SInt32
wxMacDataItem::GetOrder() const
1576 void wxMacDataItem::SetData( void* data
)
1581 void* wxMacDataItem::GetData() const
1586 short wxMacDataItem::GetColumn()
1591 void wxMacDataItem::SetColumn( short col
)
1596 void wxMacDataItem::SetLabel( const wxString
& str
)
1599 m_cfLabel
.Assign( str
, wxLocale::GetSystemEncoding());
1602 const wxString
& wxMacDataItem::GetLabel() const
1607 bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl
*owner
,
1608 const wxMacDataItem
* rhs
,
1609 DataBrowserPropertyID sortProperty
) const
1611 const wxMacDataItem
* otherItem
= wx_const_cast(wxMacDataItem
*,rhs
);
1612 bool retval
= false;
1614 if ( sortProperty
== m_colId
){
1615 retval
= m_label
.CmpNoCase( otherItem
->m_label
) < 0;
1618 else if ( sortProperty
== kNumericOrderColumnId
)
1619 retval
= m_order
< otherItem
->m_order
;
1624 OSStatus
wxMacDataItem::GetSetData( wxMacDataItemBrowserControl
*owner
,
1625 DataBrowserPropertyID property
,
1626 DataBrowserItemDataRef itemData
,
1629 OSStatus err
= errDataBrowserPropertyNotSupported
;
1632 if ( property
== m_colId
){
1633 err
= ::SetDataBrowserItemDataText( itemData
, m_cfLabel
);
1636 else if ( property
== kNumericOrderColumnId
){
1637 err
= ::SetDataBrowserItemDataValue( itemData
, m_order
);
1647 // no editable props here
1656 void wxMacDataItem::Notification(wxMacDataItemBrowserControl
*owner
,
1657 DataBrowserItemNotification message
,
1658 DataBrowserItemDataRef itemData
) const
1662 IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl
, wxMacDataBrowserControl
)
1664 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) :
1665 wxMacDataBrowserControl( peer
, pos
, size
, style
)
1667 m_suppressSelection
= false;
1668 m_sortOrder
= SortOrder_None
;
1669 m_clientDataItemsType
= wxClientData_None
;
1672 wxMacDataItem
* wxMacDataItemBrowserControl::CreateItem()
1674 return new wxMacDataItem();
1677 wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl
*browser
)
1679 m_former
= browser
->SuppressSelection(true);
1680 m_browser
= browser
;
1683 wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1685 m_browser
->SuppressSelection(m_former
);
1688 bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress
)
1690 bool former
= m_suppressSelection
;
1691 m_suppressSelection
= suppress
;
1696 Boolean
wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID
,
1697 DataBrowserItemID itemTwoID
,
1698 DataBrowserPropertyID sortProperty
)
1700 wxMacDataItem
* itemOne
= (wxMacDataItem
*) itemOneID
;
1701 wxMacDataItem
* itemTwo
= (wxMacDataItem
*) itemTwoID
;
1702 return CompareItems( itemOne
, itemTwo
, sortProperty
);
1705 Boolean
wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem
* itemOne
,
1706 const wxMacDataItem
* itemTwo
,
1707 DataBrowserPropertyID sortProperty
)
1709 Boolean retval
= false;
1710 if ( itemOne
!= NULL
)
1711 retval
= itemOne
->IsLessThan( this , itemTwo
, sortProperty
);
1715 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1716 DataBrowserItemID itemID
,
1717 DataBrowserPropertyID property
,
1718 DataBrowserItemDataRef itemData
,
1719 Boolean changeValue
)
1721 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1722 return GetSetItemData(item
, property
, itemData
, changeValue
);
1725 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1726 wxMacDataItem
* item
,
1727 DataBrowserPropertyID property
,
1728 DataBrowserItemDataRef itemData
,
1729 Boolean changeValue
)
1731 OSStatus err
= errDataBrowserPropertyNotSupported
;
1734 case kDataBrowserContainerIsClosableProperty
:
1735 case kDataBrowserContainerIsSortableProperty
:
1736 case kDataBrowserContainerIsOpenableProperty
:
1737 // right now default behaviour on these
1741 if ( item
!= NULL
){
1742 err
= item
->GetSetData( this, property
, itemData
, changeValue
);
1750 void wxMacDataItemBrowserControl::ItemNotification(
1751 DataBrowserItemID itemID
,
1752 DataBrowserItemNotification message
,
1753 DataBrowserItemDataRef itemData
)
1755 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1756 ItemNotification( item
, message
, itemData
);
1759 void wxMacDataItemBrowserControl::ItemNotification(
1760 const wxMacDataItem
* item
,
1761 DataBrowserItemNotification message
,
1762 DataBrowserItemDataRef itemData
)
1765 item
->Notification( this, message
, itemData
);
1768 unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem
* container
,
1769 bool recurse
, DataBrowserItemState state
) const
1771 ItemCount numItems
= 0;
1772 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID
)container
,
1773 recurse
, state
, &numItems
) );
1777 unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem
* container
,
1778 bool recurse
) const
1780 return GetItemCount( container
, recurse
, kDataBrowserItemIsSelected
);
1784 void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem
* container
,
1785 bool recurse
, DataBrowserItemState state
, wxArrayMacDataItemPtr
&items
) const
1787 Handle handle
= NewHandle(0);
1788 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID
)container
,
1789 recurse
, state
, handle
) );
1791 int itemCount
= GetHandleSize(handle
)/sizeof(DataBrowserItemID
);
1793 wxMacDataItemPtr
* itemsArray
= (wxMacDataItemPtr
*) *handle
;
1794 for ( int i
= 0; i
< itemCount
; ++i
)
1796 items
.Add(itemsArray
[i
]);
1799 DisposeHandle( handle
);
1802 unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem
* item
) const
1804 DataBrowserTableViewRowIndex row
;
1805 OSStatus err
= GetItemRow( (DataBrowserItemID
) item
, &row
);
1806 wxASSERT( err
== noErr
);
1810 wxMacDataItem
* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n
) const
1812 DataBrowserItemID id
;
1813 OSStatus err
= GetItemID( (DataBrowserTableViewRowIndex
) n
, &id
);
1814 wxASSERT( err
== noErr
);
1815 return (wxMacDataItem
*) id
;
1818 void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem
*container
,
1819 const wxMacDataItem
*item
, DataBrowserPropertyID property
) const
1821 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, 1,
1822 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1825 void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem
*container
,
1826 wxArrayMacDataItemPtr
&itemArray
, DataBrowserPropertyID property
) const
1828 unsigned int noItems
= itemArray
.GetCount();
1829 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1830 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1831 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1833 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, noItems
,
1834 items
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1838 void wxMacDataItemBrowserControl::InsertColumn(int colId
, DataBrowserPropertyType colType
,
1839 const wxString
& title
, SInt16 just
, int defaultWidth
)
1841 DataBrowserListViewColumnDesc columnDesc
;
1842 columnDesc
.headerBtnDesc
.titleOffset
= 0;
1843 columnDesc
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
1845 columnDesc
.headerBtnDesc
.btnFontStyle
.flags
=
1846 kControlUseFontMask
| kControlUseJustMask
;
1848 columnDesc
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentTextOnly
;
1849 columnDesc
.headerBtnDesc
.btnFontStyle
.just
= just
;
1850 columnDesc
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
1851 columnDesc
.headerBtnDesc
.btnFontStyle
.style
= normal
;
1853 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1854 // defined for other modes?
1857 enc
= m_font
.GetEncoding();
1859 enc
= wxLocale::GetSystemEncoding();
1860 wxMacCFStringHolder cfTitle
;
1861 cfTitle
.Assign( title
, enc
);
1862 columnDesc
.headerBtnDesc
.titleString
= cfTitle
;
1864 columnDesc
.headerBtnDesc
.minimumWidth
= 0;
1865 columnDesc
.headerBtnDesc
.maximumWidth
= 30000;
1867 columnDesc
.propertyDesc
.propertyID
= (kMinColumnId
+ colId
);
1868 columnDesc
.propertyDesc
.propertyType
= colType
;
1869 columnDesc
.propertyDesc
.propertyFlags
= kDataBrowserListViewSortableColumn
;
1870 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
1871 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
;
1873 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
1874 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
1877 verify_noerr( AddColumn( &columnDesc
, kDataBrowserListViewAppendColumn
) );
1879 if (defaultWidth
> 0){
1880 SetColumnWidth(colId
, defaultWidth
);
1885 void wxMacDataItemBrowserControl::SetColumnWidth(int colId
, int width
)
1887 DataBrowserPropertyID id
;
1888 GetColumnIDFromIndex(colId
, &id
);
1889 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id
, width
));
1892 int wxMacDataItemBrowserControl::GetColumnWidth(int colId
)
1894 DataBrowserPropertyID id
;
1895 GetColumnIDFromIndex(colId
, &id
);
1897 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id
, &result
));
1901 void wxMacDataItemBrowserControl::AddItem(wxMacDataItem
*container
, wxMacDataItem
*item
)
1903 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, 1,
1904 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
) );
1907 void wxMacDataItemBrowserControl::AddItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1909 unsigned int noItems
= itemArray
.GetCount();
1910 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1911 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1912 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1914 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, noItems
,
1915 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
) );
1919 void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem
*container
, wxMacDataItem
* item
)
1921 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 1,
1922 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
);
1923 verify_noerr( err
);
1926 void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1928 unsigned int noItems
= itemArray
.GetCount();
1929 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1930 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1931 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1933 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, noItems
,
1934 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
);
1935 verify_noerr( err
);
1939 void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem
*container
)
1941 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 0 , NULL
, kDataBrowserItemNoProperty
);
1942 verify_noerr( err
);
1945 void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem
* item
, DataBrowserSetOption option
)
1947 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID
*) &item
, option
));
1950 void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option
)
1952 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL
, option
));
1955 void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr
&itemArray
, DataBrowserSetOption option
)
1957 unsigned int noItems
= itemArray
.GetCount();
1958 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1959 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1960 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1962 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems
, (DataBrowserItemID
*) items
, option
));
1966 Boolean
wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem
* item
) const
1968 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID
) item
);
1971 void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem
* item
, DataBrowserRevealOptions options
)
1973 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID
) item
, kDataBrowserNoItem
, options
) );
1976 void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr
* first
, wxMacDataItemPtr
* last
) const
1978 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID
*) first
, (DataBrowserItemID
*) last
) );
1981 wxClientDataType
wxMacDataItemBrowserControl::GetClientDataType() const
1983 return m_clientDataItemsType
;
1985 void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType
)
1987 m_clientDataItemsType
= clientDataItemsType
;
1990 unsigned int wxMacDataItemBrowserControl::MacGetCount() const
1992 return GetItemCount(wxMacDataBrowserRootContainer
,false,kDataBrowserItemAnyState
);
1995 void wxMacDataItemBrowserControl::MacDelete( unsigned int n
)
1997 wxMacDataItem
* item
= (wxMacDataItem
*)GetItemFromLine( n
);
1998 RemoveItem( wxMacDataBrowserRootContainer
, item
);
2001 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
, const wxString
& text
, int column
)
2003 wxMacDataItem
* newItem
= CreateItem();
2004 newItem
->SetLabel( text
);
2006 newItem
->SetColumn( kMinColumnId
+ column
);
2008 if ( m_sortOrder
== SortOrder_None
)
2010 // increase the order of the lines to be shifted
2011 unsigned int lines
= MacGetCount();
2012 for ( unsigned int i
= n
; i
< lines
; ++i
)
2014 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
2015 iter
->SetOrder( iter
->GetOrder() + 1 );
2018 SInt32 frontLineOrder
= 0;
2021 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
2022 frontLineOrder
= iter
->GetOrder();
2024 newItem
->SetOrder( frontLineOrder
+ 1 );
2027 AddItem( wxMacDataBrowserRootContainer
, newItem
);
2030 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
, const wxArrayString
& items
, int column
)
2032 size_t itemsCount
= items
.GetCount();
2033 if ( itemsCount
== 0 )
2036 SInt32 frontLineOrder
= 0;
2038 if ( m_sortOrder
== SortOrder_None
)
2040 // increase the order of the lines to be shifted
2041 unsigned int lines
= MacGetCount();
2042 for ( unsigned int i
= n
; i
< lines
; ++i
)
2044 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
2045 iter
->SetOrder( iter
->GetOrder() + itemsCount
);
2049 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
2050 frontLineOrder
= iter
->GetOrder();
2054 wxArrayMacDataItemPtr ids
;
2055 ids
.SetCount( itemsCount
);
2057 for ( unsigned int i
= 0; i
< itemsCount
; ++i
)
2059 wxMacDataItem
* item
= CreateItem();
2060 item
->SetLabel( items
[i
]);
2062 item
->SetColumn( kMinColumnId
+ column
);
2064 if ( m_sortOrder
== SortOrder_None
)
2065 item
->SetOrder( frontLineOrder
+ 1 + i
);
2070 AddItems( wxMacDataBrowserRootContainer
, ids
);
2073 int wxMacDataItemBrowserControl::MacAppend( const wxString
& text
)
2075 wxMacDataItem
* item
= CreateItem();
2076 item
->SetLabel( text
);
2077 if ( m_sortOrder
== SortOrder_None
)
2079 unsigned int lines
= MacGetCount();
2081 item
->SetOrder( 1 );
2084 wxMacDataItem
* frontItem
= (wxMacDataItem
*) GetItemFromLine(lines
-1);
2085 item
->SetOrder( frontItem
->GetOrder() + 1 );
2088 AddItem( wxMacDataBrowserRootContainer
, item
);
2090 return GetLineFromItem(item
);
2093 void wxMacDataItemBrowserControl::MacClear()
2095 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2096 RemoveAllItems(wxMacDataBrowserRootContainer
);
2099 void wxMacDataItemBrowserControl::MacDeselectAll()
2101 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2102 SetSelectedAllItems( kDataBrowserItemsRemove
);
2105 void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n
, bool select
, bool multi
)
2107 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
2108 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2110 if ( IsItemSelected( item
) != select
)
2113 SetSelectedItem( item
, multi
? kDataBrowserItemsAdd
: kDataBrowserItemsAssign
);
2115 SetSelectedItem( item
, kDataBrowserItemsRemove
);
2121 bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n
) const
2123 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
2124 return IsItemSelected( item
);
2127 int wxMacDataItemBrowserControl::MacGetSelection() const
2129 wxMacDataItemPtr first
, last
;
2130 GetSelectionAnchor( &first
, &last
);
2132 if ( first
!= NULL
)
2134 return GetLineFromItem( first
);
2140 int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt
& aSelections
) const
2142 aSelections
.Empty();
2143 wxArrayMacDataItemPtr selectedItems
;
2144 GetItems( wxMacDataBrowserRootContainer
, false , kDataBrowserItemIsSelected
, selectedItems
);
2146 int count
= selectedItems
.GetCount();
2148 for ( int i
= 0; i
< count
; ++i
)
2150 aSelections
.Add(GetLineFromItem(selectedItems
[i
]));
2156 void wxMacDataItemBrowserControl::MacSetString( unsigned int n
, const wxString
& text
)
2158 // as we don't store the strings we only have to issue a redraw
2159 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2160 item
->SetLabel( text
);
2161 UpdateItem( wxMacDataBrowserRootContainer
, item
, kTextColumnId
);
2164 wxString
wxMacDataItemBrowserControl::MacGetString( unsigned int n
) const
2166 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2167 return item
->GetLabel();
2170 void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n
, void * data
)
2172 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2173 item
->SetData( data
);
2174 // not displayed, therefore no Update infos to DataBrowser
2177 void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n
) const
2179 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2180 return item
->GetData();
2183 void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n
)
2185 RevealItem( GetItemFromLine( n
) , kDataBrowserRevealWithoutSelecting
);
2194 OSStatus
wxMacControl::SetTabEnabled( SInt16 tabNo
, bool enable
)
2196 return ::SetTabEnabled( m_controlRef
, tabNo
, enable
);
2203 #ifdef __WXMAC_OSX__
2204 // snippets from Sketch Sample from Apple :
2206 #define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc"
2209 This function locates, opens, and returns the profile reference for the calibrated
2210 Generic RGB color space. It is up to the caller to call CMCloseProfile when done
2211 with the profile reference this function returns.
2213 CMProfileRef
wxMacOpenGenericProfile()
2215 static CMProfileRef cachedRGBProfileRef
= NULL
;
2217 // we only create the profile reference once
2218 if (cachedRGBProfileRef
== NULL
)
2220 CMProfileLocation loc
;
2222 loc
.locType
= cmPathBasedProfile
;
2223 strcpy(loc
.u
.pathLoc
.path
, kGenericRGBProfilePathStr
);
2225 verify_noerr( CMOpenProfile(&cachedRGBProfileRef
, &loc
) );
2228 // clone the profile reference so that the caller has their own reference, not our cached one
2229 if (cachedRGBProfileRef
)
2230 CMCloneProfileRef(cachedRGBProfileRef
);
2232 return cachedRGBProfileRef
;
2236 Return the generic RGB color space. This is a 'get' function and the caller should
2237 not release the returned value unless the caller retains it first. Usually callers
2238 of this routine will immediately use the returned colorspace with CoreGraphics
2239 so they typically do not need to retain it themselves.
2241 This function creates the generic RGB color space once and hangs onto it so it can
2242 return it whenever this function is called.
2245 CGColorSpaceRef
wxMacGetGenericRGBColorSpace()
2247 static wxMacCFRefHolder
<CGColorSpaceRef
> genericRGBColorSpace
;
2249 if (genericRGBColorSpace
== NULL
)
2251 if ( UMAGetSystemVersion() >= 0x1040 )
2253 genericRGBColorSpace
.Set( CGColorSpaceCreateWithName( CFSTR("kCGColorSpaceGenericRGB") ) );
2257 CMProfileRef genericRGBProfile
= wxMacOpenGenericProfile();
2259 if (genericRGBProfile
)
2261 genericRGBColorSpace
.Set( CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile
) );
2263 wxASSERT_MSG( genericRGBColorSpace
!= NULL
, wxT("couldn't create the generic RGB color space") );
2265 // we opened the profile so it is up to us to close it
2266 CMCloseProfile(genericRGBProfile
);
2271 return genericRGBColorSpace
;
2277 wxMacPortSaver::wxMacPortSaver( GrafPtr port
)
2279 ::GetPort( &m_port
);
2283 wxMacPortSaver::~wxMacPortSaver()
2285 ::SetPort( m_port
);
2289 void wxMacGlobalToLocal( WindowRef window
, Point
*pt
)
2291 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
2292 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
2293 HIViewRef contentView
;
2294 // TODO check toolbar offset
2295 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
2296 HIPointConvert( &p
, kHICoordSpace72DPIGlobal
, NULL
, kHICoordSpaceView
, contentView
);
2300 QDGlobalToLocalPoint( GetWindowPort(window
), pt
) ;
2304 void wxMacLocalToGlobal( WindowRef window
, Point
*pt
)
2306 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
2307 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
2308 HIViewRef contentView
;
2309 // TODO check toolbar offset
2310 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
2311 HIPointConvert( &p
, kHICoordSpaceView
, contentView
, kHICoordSpace72DPIGlobal
, NULL
);
2315 QDLocalToGlobalPoint( GetWindowPort(window
), pt
) ;