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 CFRelease(m_controlRef
);
803 void wxMacControl::SetReference( URefCon data
)
805 SetControlReference( m_controlRef
, data
);
808 OSStatus
wxMacControl::GetData(ControlPartCode inPartCode
, ResType inTag
, Size inBufferSize
, void * inOutBuffer
, Size
* outActualSize
) const
810 return ::GetControlData( m_controlRef
, inPartCode
, inTag
, inBufferSize
, inOutBuffer
, outActualSize
);
813 OSStatus
wxMacControl::GetDataSize(ControlPartCode inPartCode
, ResType inTag
, Size
* outActualSize
) const
815 return ::GetControlDataSize( m_controlRef
, inPartCode
, inTag
, outActualSize
);
818 OSStatus
wxMacControl::SetData(ControlPartCode inPartCode
, ResType inTag
, Size inSize
, const void * inData
)
820 return ::SetControlData( m_controlRef
, inPartCode
, inTag
, inSize
, inData
);
823 OSStatus
wxMacControl::SendEvent( EventRef event
, OptionBits inOptions
)
825 #if TARGET_API_MAC_OSX
826 return SendEventToEventTargetWithOptions( event
,
827 HIObjectGetEventTarget( (HIObjectRef
) m_controlRef
), inOptions
);
829 #pragma unused(inOptions)
830 return SendEventToEventTarget(event
,GetControlEventTarget( m_controlRef
) );
834 OSStatus
wxMacControl::SendHICommand( HICommand
&command
, OptionBits inOptions
)
836 wxMacCarbonEvent
event( kEventClassCommand
, kEventCommandProcess
);
838 event
.SetParameter
<HICommand
>(kEventParamDirectObject
,command
);
840 return SendEvent( event
, inOptions
);
843 OSStatus
wxMacControl::SendHICommand( UInt32 commandID
, OptionBits inOptions
)
847 memset( &command
, 0 , sizeof(command
) );
848 command
.commandID
= commandID
;
849 return SendHICommand( command
, inOptions
);
852 void wxMacControl::Flash( ControlPartCode part
, UInt32 ticks
)
854 unsigned long finalTicks
;
856 HiliteControl( m_controlRef
, part
);
857 Delay( ticks
, &finalTicks
);
858 HiliteControl( m_controlRef
, kControlNoPart
);
861 SInt32
wxMacControl::GetValue() const
863 return ::GetControl32BitValue( m_controlRef
);
866 SInt32
wxMacControl::GetMaximum() const
868 return ::GetControl32BitMaximum( m_controlRef
);
871 SInt32
wxMacControl::GetMinimum() const
873 return ::GetControl32BitMinimum( m_controlRef
);
876 void wxMacControl::SetValue( SInt32 v
)
878 ::SetControl32BitValue( m_controlRef
, v
);
881 void wxMacControl::SetMinimum( SInt32 v
)
883 ::SetControl32BitMinimum( m_controlRef
, v
);
886 void wxMacControl::SetMaximum( SInt32 v
)
888 ::SetControl32BitMaximum( m_controlRef
, v
);
891 void wxMacControl::SetValueAndRange( SInt32 value
, SInt32 minimum
, SInt32 maximum
)
893 ::SetControl32BitMinimum( m_controlRef
, minimum
);
894 ::SetControl32BitMaximum( m_controlRef
, maximum
);
895 ::SetControl32BitValue( m_controlRef
, value
);
898 OSStatus
wxMacControl::SetFocus( ControlFocusPart focusPart
)
900 return SetKeyboardFocus( GetControlOwner( m_controlRef
), m_controlRef
, focusPart
);
903 bool wxMacControl::HasFocus() const
906 GetKeyboardFocus( GetUserFocusWindow() , &control
);
907 return control
== m_controlRef
;
910 void wxMacControl::SetNeedsFocusRect( bool needs
)
912 m_needsFocusRect
= needs
;
915 bool wxMacControl::NeedsFocusRect() const
917 return m_needsFocusRect
;
920 void wxMacControl::VisibilityChanged(bool shown
)
924 void wxMacControl::SuperChangedPosition()
928 void wxMacControl::SetFont( const wxFont
& font
, const wxColour
& foreground
, long windowStyle
)
931 ControlFontStyleRec fontStyle
;
932 if ( font
.MacGetThemeFontID() != kThemeCurrentPortFont
)
934 switch ( font
.MacGetThemeFontID() )
936 case kThemeSmallSystemFont
:
937 fontStyle
.font
= kControlFontSmallSystemFont
;
940 case 109 : // mini font
944 case kThemeSystemFont
:
945 fontStyle
.font
= kControlFontBigSystemFont
;
949 fontStyle
.font
= kControlFontBigSystemFont
;
953 fontStyle
.flags
= kControlUseFontMask
;
957 fontStyle
.font
= font
.MacGetFontNum();
958 fontStyle
.style
= font
.MacGetFontStyle();
959 fontStyle
.size
= font
.MacGetFontSize();
960 fontStyle
.flags
= kControlUseFontMask
| kControlUseFaceMask
| kControlUseSizeMask
;
963 fontStyle
.just
= teJustLeft
;
964 fontStyle
.flags
|= kControlUseJustMask
;
965 if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_CENTER_HORIZONTAL
)
966 fontStyle
.just
= teJustCenter
;
967 else if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_RIGHT
)
968 fontStyle
.just
= teJustRight
;
971 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
972 // won't get grayed out by the system anymore
974 if ( foreground
!= *wxBLACK
)
976 fontStyle
.foreColor
= MAC_WXCOLORREF( foreground
.GetPixel() );
977 fontStyle
.flags
|= kControlUseForeColorMask
;
980 ::SetControlFontStyle( m_controlRef
, &fontStyle
);
983 void wxMacControl::SetBackground( const wxBrush
&WXUNUSED(brush
) )
986 // setting up a color proc is not recommended anymore
989 void wxMacControl::SetRange( SInt32 minimum
, SInt32 maximum
)
991 ::SetControl32BitMinimum( m_controlRef
, minimum
);
992 ::SetControl32BitMaximum( m_controlRef
, maximum
);
995 short wxMacControl::HandleKey( SInt16 keyCode
, SInt16 charCode
, EventModifiers modifiers
)
998 return HandleControlKey( m_controlRef
, keyCode
, charCode
, modifiers
);
1004 void wxMacControl::SetActionProc( ControlActionUPP actionProc
)
1006 SetControlAction( m_controlRef
, actionProc
);
1009 void wxMacControl::SetViewSize( SInt32 viewSize
)
1011 SetControlViewSize(m_controlRef
, viewSize
);
1014 SInt32
wxMacControl::GetViewSize() const
1016 return GetControlViewSize( m_controlRef
);
1019 bool wxMacControl::IsVisible() const
1021 return IsControlVisible( m_controlRef
);
1024 void wxMacControl::SetVisibility( bool visible
, bool redraw
)
1026 SetControlVisibility( m_controlRef
, visible
, redraw
);
1029 bool wxMacControl::IsEnabled() const
1031 #if TARGET_API_MAC_OSX
1032 return IsControlEnabled( m_controlRef
);
1034 return IsControlActive( m_controlRef
);
1038 bool wxMacControl::IsActive() const
1040 return IsControlActive( m_controlRef
);
1043 void wxMacControl::Enable( bool enable
)
1046 EnableControl( m_controlRef
);
1048 DisableControl( m_controlRef
);
1051 void wxMacControl::SetDrawingEnabled( bool enable
)
1053 HIViewSetDrawingEnabled( m_controlRef
, enable
);
1056 bool wxMacControl::GetNeedsDisplay() const
1058 return HIViewGetNeedsDisplay( m_controlRef
);
1061 void wxMacControl::SetNeedsDisplay( RgnHandle where
)
1066 HIViewSetNeedsDisplayInRegion( m_controlRef
, where
, true );
1069 void wxMacControl::SetNeedsDisplay( Rect
* where
)
1074 if ( where
!= NULL
)
1076 RgnHandle update
= NewRgn();
1077 RectRgn( update
, where
);
1078 HIViewSetNeedsDisplayInRegion( m_controlRef
, update
, true );
1079 DisposeRgn( update
);
1082 HIViewSetNeedsDisplay( m_controlRef
, true );
1085 void wxMacControl::Convert( wxPoint
*pt
, wxMacControl
*from
, wxMacControl
*to
)
1091 HIViewConvertPoint( &hiPoint
, from
->m_controlRef
, to
->m_controlRef
);
1092 pt
->x
= (int)hiPoint
.x
;
1093 pt
->y
= (int)hiPoint
.y
;
1096 void wxMacControl::SetRect( Rect
*r
)
1098 //A HIRect is actually a CGRect on OSX - which consists of two structures -
1099 //CGPoint and CGSize, which have two floats each
1100 HIRect hir
= { { r
->left
, r
->top
}, { r
->right
- r
->left
, r
->bottom
- r
->top
} };
1101 HIViewSetFrame ( m_controlRef
, &hir
);
1102 // eventuall we might have to do a SetVisibility( false , true );
1103 // before and a SetVisibility( true , true ); after
1106 void wxMacControl::GetRect( Rect
*r
)
1108 GetControlBounds( m_controlRef
, r
);
1111 void wxMacControl::GetRectInWindowCoords( Rect
*r
)
1113 UMAGetControlBoundsInWindowCoords( m_controlRef
, r
);
1116 void wxMacControl::GetBestRect( Rect
*r
)
1118 short baselineoffset
;
1120 GetBestControlRect( m_controlRef
, r
, &baselineoffset
);
1123 void wxMacControl::SetLabel( const wxString
&title
)
1125 wxFontEncoding encoding
;
1128 encoding
= m_font
.GetEncoding();
1130 encoding
= wxFont::GetDefaultEncoding();
1132 UMASetControlTitle( m_controlRef
, title
, encoding
);
1135 void wxMacControl::GetFeatures( UInt32
* features
)
1137 GetControlFeatures( m_controlRef
, features
);
1140 OSStatus
wxMacControl::GetRegion( ControlPartCode partCode
, RgnHandle region
)
1142 OSStatus err
= GetControlRegion( m_controlRef
, partCode
, region
);
1146 OSStatus
wxMacControl::SetZOrder( bool above
, wxMacControl
* other
)
1148 #if TARGET_API_MAC_OSX
1149 return HIViewSetZOrder( m_controlRef
,above
? kHIViewZOrderAbove
: kHIViewZOrderBelow
,
1150 (other
!= NULL
) ? other
->m_controlRef
: NULL
);
1156 #if TARGET_API_MAC_OSX
1157 // SetNeedsDisplay would not invalidate the children
1158 static void InvalidateControlAndChildren( HIViewRef control
)
1160 HIViewSetNeedsDisplay( control
, true );
1161 UInt16 childrenCount
= 0;
1162 OSStatus err
= CountSubControls( control
, &childrenCount
);
1163 if ( err
== errControlIsNotEmbedder
)
1166 wxASSERT_MSG( err
== noErr
, wxT("Unexpected error when accessing subcontrols") );
1168 for ( UInt16 i
= childrenCount
; i
>=1; --i
)
1172 err
= GetIndexedSubControl( control
, i
, & child
);
1173 if ( err
== errControlIsNotEmbedder
)
1176 InvalidateControlAndChildren( child
);
1181 void wxMacControl::InvalidateWithChildren()
1183 #if TARGET_API_MAC_OSX
1184 InvalidateControlAndChildren( m_controlRef
);
1188 void wxMacControl::ScrollRect( wxRect
*r
, int dx
, int dy
)
1190 wxASSERT( r
!= NULL
);
1192 HIRect scrollarea
= CGRectMake( r
->x
, r
->y
, r
->width
, r
->height
);
1193 HIViewScrollRect ( m_controlRef
, &scrollarea
, dx
,dy
);
1196 OSType wxMacCreator
= 'WXMC';
1197 OSType wxMacControlProperty
= 'MCCT';
1199 void wxMacControl::SetReferenceInNativeControl()
1202 verify_noerr( SetControlProperty ( m_controlRef
,
1203 wxMacCreator
,wxMacControlProperty
, sizeof(data
), &data
) );
1206 wxMacControl
* wxMacControl::GetReferenceFromNativeControl(ControlRef control
)
1208 wxMacControl
* ctl
= NULL
;
1209 ByteCount actualSize
;
1210 if ( GetControlProperty( control
,wxMacCreator
,wxMacControlProperty
, sizeof(ctl
) ,
1211 &actualSize
, &ctl
) == noErr
)
1218 // ============================================================================
1219 // DataBrowser Wrapper
1220 // ============================================================================
1222 // basing on DataBrowserItemIDs
1225 IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl
, wxMacControl
)
1227 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
1229 DataBrowserItemID itemID
,
1230 DataBrowserItemNotification message
,
1231 DataBrowserItemDataRef itemData
)
1233 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1236 ctl
->ItemNotification(itemID
, message
, itemData
);
1240 pascal OSStatus
wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
1242 DataBrowserItemID itemID
,
1243 DataBrowserPropertyID property
,
1244 DataBrowserItemDataRef itemData
,
1245 Boolean changeValue
)
1247 OSStatus err
= errDataBrowserPropertyNotSupported
;
1248 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1251 err
= ctl
->GetSetItemData(itemID
, property
, itemData
, changeValue
);
1256 pascal Boolean
wxMacDataBrowserControl::DataBrowserCompareProc(
1258 DataBrowserItemID itemOneID
,
1259 DataBrowserItemID itemTwoID
,
1260 DataBrowserPropertyID sortProperty
)
1262 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1265 return ctl
->CompareItems(itemOneID
, itemTwoID
, sortProperty
);
1270 DataBrowserItemDataUPP gDataBrowserItemDataUPP
= NULL
;
1271 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP
= NULL
;
1272 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP
= NULL
;
1274 wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) : wxMacControl( peer
)
1276 Rect bounds
= wxMacGetBoundsForControl( peer
, pos
, size
);
1277 OSStatus err
= ::CreateDataBrowserControl(
1278 MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),
1279 &bounds
, kDataBrowserListView
, &m_controlRef
);
1280 SetReferenceInNativeControl();
1281 verify_noerr( err
);
1282 if ( gDataBrowserItemCompareUPP
== NULL
)
1283 gDataBrowserItemCompareUPP
= NewDataBrowserItemCompareUPP(DataBrowserCompareProc
);
1284 if ( gDataBrowserItemDataUPP
== NULL
)
1285 gDataBrowserItemDataUPP
= NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc
);
1286 if ( gDataBrowserItemNotificationUPP
== NULL
)
1288 gDataBrowserItemNotificationUPP
=
1289 #if TARGET_API_MAC_OSX
1290 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc
);
1292 NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc
);
1296 DataBrowserCallbacks callbacks
;
1297 InitializeDataBrowserCallbacks( &callbacks
, kDataBrowserLatestCallbacks
);
1299 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserItemDataUPP
;
1300 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserItemCompareUPP
;
1301 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserItemNotificationUPP
;
1302 SetCallbacks( &callbacks
);
1306 OSStatus
wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container
,
1308 DataBrowserItemState state
,
1309 ItemCount
*numItems
) const
1311 return GetDataBrowserItemCount( m_controlRef
, container
, recurse
, state
, numItems
);
1314 OSStatus
wxMacDataBrowserControl::GetItems( DataBrowserItemID container
,
1316 DataBrowserItemState state
,
1319 return GetDataBrowserItems( m_controlRef
, container
, recurse
, state
, items
);
1322 OSStatus
wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options
)
1324 return SetDataBrowserSelectionFlags( m_controlRef
, options
);
1327 OSStatus
wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc
*columnDesc
,
1328 DataBrowserTableViewColumnIndex position
)
1330 return AddDataBrowserListViewColumn( m_controlRef
, columnDesc
, position
);
1333 OSStatus
wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position
, DataBrowserTableViewColumnID
* id
){
1334 return GetDataBrowserTableViewColumnProperty( m_controlRef
, position
, id
);
1337 OSStatus
wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position
)
1339 DataBrowserTableViewColumnID id
;
1340 GetColumnIDFromIndex( position
, &id
);
1341 return RemoveDataBrowserTableViewColumn( m_controlRef
, id
);
1344 OSStatus
wxMacDataBrowserControl::AutoSizeColumns()
1346 return AutoSizeDataBrowserListViewColumns(m_controlRef
);
1349 OSStatus
wxMacDataBrowserControl::SetHasScrollBars( bool horiz
, bool vert
)
1351 return SetDataBrowserHasScrollBars( m_controlRef
, horiz
, vert
);
1354 OSStatus
wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle
)
1356 return SetDataBrowserTableViewHiliteStyle( m_controlRef
, hiliteStyle
);
1359 OSStatus
wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height
)
1361 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1364 OSStatus
wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16
*height
)
1366 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1369 OSStatus
wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks
*callbacks
)
1371 return SetDataBrowserCallbacks( m_controlRef
, callbacks
);
1374 OSStatus
wxMacDataBrowserControl::UpdateItems(
1375 DataBrowserItemID container
,
1377 const DataBrowserItemID
*items
,
1378 DataBrowserPropertyID preSortProperty
,
1379 DataBrowserPropertyID propertyID
) const
1381 return UpdateDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
, propertyID
);
1384 bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item
) const
1386 return IsDataBrowserItemSelected( m_controlRef
, item
);
1389 OSStatus
wxMacDataBrowserControl::AddItems(
1390 DataBrowserItemID container
,
1392 const DataBrowserItemID
*items
,
1393 DataBrowserPropertyID preSortProperty
)
1395 return AddDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1398 OSStatus
wxMacDataBrowserControl::RemoveItems(
1399 DataBrowserItemID container
,
1401 const DataBrowserItemID
*items
,
1402 DataBrowserPropertyID preSortProperty
)
1404 return RemoveDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1407 OSStatus
wxMacDataBrowserControl::RevealItem(
1408 DataBrowserItemID item
,
1409 DataBrowserPropertyID propertyID
,
1410 DataBrowserRevealOptions options
) const
1412 return RevealDataBrowserItem( m_controlRef
, item
, propertyID
, options
);
1415 OSStatus
wxMacDataBrowserControl::SetSelectedItems(
1417 const DataBrowserItemID
*items
,
1418 DataBrowserSetOption operation
)
1420 return SetDataBrowserSelectedItems( m_controlRef
, numItems
, items
, operation
);
1423 OSStatus
wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID
*first
, DataBrowserItemID
*last
) const
1425 return GetDataBrowserSelectionAnchor( m_controlRef
, first
, last
);
1428 OSStatus
wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
1430 return GetDataBrowserTableViewItemID( m_controlRef
, row
, item
);
1433 OSStatus
wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
1435 return GetDataBrowserTableViewItemRow( m_controlRef
, item
, row
);
1438 OSStatus
wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height
)
1440 return SetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1443 OSStatus
wxMacDataBrowserControl::GetDefaultRowHeight( UInt16
* height
) const
1445 return GetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1448 OSStatus
wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item
, UInt16 height
)
1450 return SetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1453 OSStatus
wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item
, UInt16
*height
) const
1455 return GetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1458 OSStatus
wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column
, UInt16
*width
) const
1460 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1463 OSStatus
wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column
, UInt16 width
)
1465 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1468 OSStatus
wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16
*width
) const
1470 return GetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1473 OSStatus
wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width
)
1475 return SetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1478 OSStatus
wxMacDataBrowserControl::GetColumnCount(UInt32
* numColumns
) const
1480 return GetDataBrowserTableViewColumnCount( m_controlRef
, numColumns
);
1483 OSStatus
wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column
,
1484 DataBrowserTableViewColumnIndex
*position
) const
1486 return GetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1489 OSStatus
wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column
, DataBrowserTableViewColumnIndex position
)
1491 return SetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1494 OSStatus
wxMacDataBrowserControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
1496 return GetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1499 OSStatus
wxMacDataBrowserControl::SetScrollPosition( UInt32 top
, UInt32 left
)
1501 return SetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1504 OSStatus
wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID
*column
) const
1506 return GetDataBrowserSortProperty( m_controlRef
, column
);
1509 OSStatus
wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column
)
1511 return SetDataBrowserSortProperty( m_controlRef
, column
);
1514 OSStatus
wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder
*order
) const
1516 return GetDataBrowserSortOrder( m_controlRef
, order
);
1519 OSStatus
wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order
)
1521 return SetDataBrowserSortOrder( m_controlRef
, order
);
1524 OSStatus
wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property
,
1525 DataBrowserPropertyFlags
*flags
) const
1527 return GetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1530 OSStatus
wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property
,
1531 DataBrowserPropertyFlags flags
)
1533 return SetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1536 OSStatus
wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property
,
1537 DataBrowserListViewHeaderDesc
*desc
) const
1539 return GetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1542 OSStatus
wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property
,
1543 DataBrowserListViewHeaderDesc
*desc
)
1545 return SetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1548 OSStatus
wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property
,
1549 Boolean expandableRows
)
1551 return SetDataBrowserListViewDisclosureColumn( m_controlRef
, property
, expandableRows
);
1554 // ============================================================================
1555 // Higher-level Databrowser
1556 // ============================================================================
1558 // basing on data item objects
1561 wxMacDataItem::wxMacDataItem()
1566 m_colId
= kTextColumnId
; // for compat with existing wx*ListBox impls.
1569 wxMacDataItem::~wxMacDataItem()
1573 void wxMacDataItem::SetOrder( SInt32 order
)
1578 SInt32
wxMacDataItem::GetOrder() const
1583 void wxMacDataItem::SetData( void* data
)
1588 void* wxMacDataItem::GetData() const
1593 short wxMacDataItem::GetColumn()
1598 void wxMacDataItem::SetColumn( short col
)
1603 void wxMacDataItem::SetLabel( const wxString
& str
)
1606 m_cfLabel
.Assign( str
, wxLocale::GetSystemEncoding());
1609 const wxString
& wxMacDataItem::GetLabel() const
1614 bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl
*owner
,
1615 const wxMacDataItem
* rhs
,
1616 DataBrowserPropertyID sortProperty
) const
1618 const wxMacDataItem
* otherItem
= wx_const_cast(wxMacDataItem
*,rhs
);
1619 bool retval
= false;
1621 if ( sortProperty
== m_colId
){
1622 retval
= m_label
.CmpNoCase( otherItem
->m_label
) < 0;
1625 else if ( sortProperty
== kNumericOrderColumnId
)
1626 retval
= m_order
< otherItem
->m_order
;
1631 OSStatus
wxMacDataItem::GetSetData( wxMacDataItemBrowserControl
*owner
,
1632 DataBrowserPropertyID property
,
1633 DataBrowserItemDataRef itemData
,
1636 OSStatus err
= errDataBrowserPropertyNotSupported
;
1639 if ( property
== m_colId
){
1640 err
= ::SetDataBrowserItemDataText( itemData
, m_cfLabel
);
1643 else if ( property
== kNumericOrderColumnId
){
1644 err
= ::SetDataBrowserItemDataValue( itemData
, m_order
);
1654 // no editable props here
1663 void wxMacDataItem::Notification(wxMacDataItemBrowserControl
*owner
,
1664 DataBrowserItemNotification message
,
1665 DataBrowserItemDataRef itemData
) const
1669 IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl
, wxMacDataBrowserControl
)
1671 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) :
1672 wxMacDataBrowserControl( peer
, pos
, size
, style
)
1674 m_suppressSelection
= false;
1675 m_sortOrder
= SortOrder_None
;
1676 m_clientDataItemsType
= wxClientData_None
;
1679 wxMacDataItem
* wxMacDataItemBrowserControl::CreateItem()
1681 return new wxMacDataItem();
1684 wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl
*browser
)
1686 m_former
= browser
->SuppressSelection(true);
1687 m_browser
= browser
;
1690 wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1692 m_browser
->SuppressSelection(m_former
);
1695 bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress
)
1697 bool former
= m_suppressSelection
;
1698 m_suppressSelection
= suppress
;
1703 Boolean
wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID
,
1704 DataBrowserItemID itemTwoID
,
1705 DataBrowserPropertyID sortProperty
)
1707 wxMacDataItem
* itemOne
= (wxMacDataItem
*) itemOneID
;
1708 wxMacDataItem
* itemTwo
= (wxMacDataItem
*) itemTwoID
;
1709 return CompareItems( itemOne
, itemTwo
, sortProperty
);
1712 Boolean
wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem
* itemOne
,
1713 const wxMacDataItem
* itemTwo
,
1714 DataBrowserPropertyID sortProperty
)
1716 Boolean retval
= false;
1717 if ( itemOne
!= NULL
)
1718 retval
= itemOne
->IsLessThan( this , itemTwo
, sortProperty
);
1722 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1723 DataBrowserItemID itemID
,
1724 DataBrowserPropertyID property
,
1725 DataBrowserItemDataRef itemData
,
1726 Boolean changeValue
)
1728 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1729 return GetSetItemData(item
, property
, itemData
, changeValue
);
1732 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1733 wxMacDataItem
* item
,
1734 DataBrowserPropertyID property
,
1735 DataBrowserItemDataRef itemData
,
1736 Boolean changeValue
)
1738 OSStatus err
= errDataBrowserPropertyNotSupported
;
1741 case kDataBrowserContainerIsClosableProperty
:
1742 case kDataBrowserContainerIsSortableProperty
:
1743 case kDataBrowserContainerIsOpenableProperty
:
1744 // right now default behaviour on these
1748 if ( item
!= NULL
){
1749 err
= item
->GetSetData( this, property
, itemData
, changeValue
);
1757 void wxMacDataItemBrowserControl::ItemNotification(
1758 DataBrowserItemID itemID
,
1759 DataBrowserItemNotification message
,
1760 DataBrowserItemDataRef itemData
)
1762 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1763 ItemNotification( item
, message
, itemData
);
1766 void wxMacDataItemBrowserControl::ItemNotification(
1767 const wxMacDataItem
* item
,
1768 DataBrowserItemNotification message
,
1769 DataBrowserItemDataRef itemData
)
1772 item
->Notification( this, message
, itemData
);
1775 unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem
* container
,
1776 bool recurse
, DataBrowserItemState state
) const
1778 ItemCount numItems
= 0;
1779 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID
)container
,
1780 recurse
, state
, &numItems
) );
1784 unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem
* container
,
1785 bool recurse
) const
1787 return GetItemCount( container
, recurse
, kDataBrowserItemIsSelected
);
1791 void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem
* container
,
1792 bool recurse
, DataBrowserItemState state
, wxArrayMacDataItemPtr
&items
) const
1794 Handle handle
= NewHandle(0);
1795 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID
)container
,
1796 recurse
, state
, handle
) );
1798 int itemCount
= GetHandleSize(handle
)/sizeof(DataBrowserItemID
);
1800 wxMacDataItemPtr
* itemsArray
= (wxMacDataItemPtr
*) *handle
;
1801 for ( int i
= 0; i
< itemCount
; ++i
)
1803 items
.Add(itemsArray
[i
]);
1806 DisposeHandle( handle
);
1809 unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem
* item
) const
1811 DataBrowserTableViewRowIndex row
;
1812 OSStatus err
= GetItemRow( (DataBrowserItemID
) item
, &row
);
1813 wxASSERT( err
== noErr
);
1817 wxMacDataItem
* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n
) const
1819 DataBrowserItemID id
;
1820 OSStatus err
= GetItemID( (DataBrowserTableViewRowIndex
) n
, &id
);
1821 wxASSERT( err
== noErr
);
1822 return (wxMacDataItem
*) id
;
1825 void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem
*container
,
1826 const wxMacDataItem
*item
, DataBrowserPropertyID property
) const
1828 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, 1,
1829 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1832 void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem
*container
,
1833 wxArrayMacDataItemPtr
&itemArray
, DataBrowserPropertyID property
) const
1835 unsigned int noItems
= itemArray
.GetCount();
1836 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1837 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1838 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1840 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, noItems
,
1841 items
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1845 void wxMacDataItemBrowserControl::InsertColumn(int colId
, DataBrowserPropertyType colType
,
1846 const wxString
& title
, SInt16 just
, int defaultWidth
)
1848 DataBrowserListViewColumnDesc columnDesc
;
1849 columnDesc
.headerBtnDesc
.titleOffset
= 0;
1850 columnDesc
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
1852 columnDesc
.headerBtnDesc
.btnFontStyle
.flags
=
1853 kControlUseFontMask
| kControlUseJustMask
;
1855 columnDesc
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentTextOnly
;
1856 columnDesc
.headerBtnDesc
.btnFontStyle
.just
= just
;
1857 columnDesc
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
1858 columnDesc
.headerBtnDesc
.btnFontStyle
.style
= normal
;
1860 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1861 // defined for other modes?
1864 enc
= m_font
.GetEncoding();
1866 enc
= wxLocale::GetSystemEncoding();
1867 wxMacCFStringHolder cfTitle
;
1868 cfTitle
.Assign( title
, enc
);
1869 columnDesc
.headerBtnDesc
.titleString
= cfTitle
;
1871 columnDesc
.headerBtnDesc
.minimumWidth
= 0;
1872 columnDesc
.headerBtnDesc
.maximumWidth
= 30000;
1874 columnDesc
.propertyDesc
.propertyID
= (kMinColumnId
+ colId
);
1875 columnDesc
.propertyDesc
.propertyType
= colType
;
1876 columnDesc
.propertyDesc
.propertyFlags
= kDataBrowserListViewSortableColumn
;
1877 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
1878 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
;
1880 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
1881 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
1884 verify_noerr( AddColumn( &columnDesc
, kDataBrowserListViewAppendColumn
) );
1886 if (defaultWidth
> 0){
1887 SetColumnWidth(colId
, defaultWidth
);
1892 void wxMacDataItemBrowserControl::SetColumnWidth(int colId
, int width
)
1894 DataBrowserPropertyID id
;
1895 GetColumnIDFromIndex(colId
, &id
);
1896 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id
, width
));
1899 int wxMacDataItemBrowserControl::GetColumnWidth(int colId
)
1901 DataBrowserPropertyID id
;
1902 GetColumnIDFromIndex(colId
, &id
);
1904 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id
, &result
));
1908 void wxMacDataItemBrowserControl::AddItem(wxMacDataItem
*container
, wxMacDataItem
*item
)
1910 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, 1,
1911 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
) );
1914 void wxMacDataItemBrowserControl::AddItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1916 unsigned int noItems
= itemArray
.GetCount();
1917 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1918 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1919 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1921 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, noItems
,
1922 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
) );
1926 void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem
*container
, wxMacDataItem
* item
)
1928 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 1,
1929 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
);
1930 verify_noerr( err
);
1933 void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1935 unsigned int noItems
= itemArray
.GetCount();
1936 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1937 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1938 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1940 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, noItems
,
1941 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
);
1942 verify_noerr( err
);
1946 void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem
*container
)
1948 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 0 , NULL
, kDataBrowserItemNoProperty
);
1949 verify_noerr( err
);
1952 void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem
* item
, DataBrowserSetOption option
)
1954 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID
*) &item
, option
));
1957 void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option
)
1959 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL
, option
));
1962 void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr
&itemArray
, DataBrowserSetOption option
)
1964 unsigned int noItems
= itemArray
.GetCount();
1965 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1966 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1967 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1969 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems
, (DataBrowserItemID
*) items
, option
));
1973 Boolean
wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem
* item
) const
1975 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID
) item
);
1978 void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem
* item
, DataBrowserRevealOptions options
)
1980 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID
) item
, kDataBrowserNoItem
, options
) );
1983 void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr
* first
, wxMacDataItemPtr
* last
) const
1985 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID
*) first
, (DataBrowserItemID
*) last
) );
1988 wxClientDataType
wxMacDataItemBrowserControl::GetClientDataType() const
1990 return m_clientDataItemsType
;
1992 void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType
)
1994 m_clientDataItemsType
= clientDataItemsType
;
1997 unsigned int wxMacDataItemBrowserControl::MacGetCount() const
1999 return GetItemCount(wxMacDataBrowserRootContainer
,false,kDataBrowserItemAnyState
);
2002 void wxMacDataItemBrowserControl::MacDelete( unsigned int n
)
2004 wxMacDataItem
* item
= (wxMacDataItem
*)GetItemFromLine( n
);
2005 RemoveItem( wxMacDataBrowserRootContainer
, item
);
2008 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
, const wxString
& text
, int column
)
2010 wxMacDataItem
* newItem
= CreateItem();
2011 newItem
->SetLabel( text
);
2013 newItem
->SetColumn( kMinColumnId
+ column
);
2015 if ( m_sortOrder
== SortOrder_None
)
2017 // increase the order of the lines to be shifted
2018 unsigned int lines
= MacGetCount();
2019 for ( unsigned int i
= n
; i
< lines
; ++i
)
2021 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
2022 iter
->SetOrder( iter
->GetOrder() + 1 );
2025 SInt32 frontLineOrder
= 0;
2028 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
2029 frontLineOrder
= iter
->GetOrder();
2031 newItem
->SetOrder( frontLineOrder
+ 1 );
2034 AddItem( wxMacDataBrowserRootContainer
, newItem
);
2037 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
, const wxArrayString
& items
, int column
)
2039 size_t itemsCount
= items
.GetCount();
2040 if ( itemsCount
== 0 )
2043 SInt32 frontLineOrder
= 0;
2045 if ( m_sortOrder
== SortOrder_None
)
2047 // increase the order of the lines to be shifted
2048 unsigned int lines
= MacGetCount();
2049 for ( unsigned int i
= n
; i
< lines
; ++i
)
2051 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
2052 iter
->SetOrder( iter
->GetOrder() + itemsCount
);
2056 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
2057 frontLineOrder
= iter
->GetOrder();
2061 wxArrayMacDataItemPtr ids
;
2062 ids
.SetCount( itemsCount
);
2064 for ( unsigned int i
= 0; i
< itemsCount
; ++i
)
2066 wxMacDataItem
* item
= CreateItem();
2067 item
->SetLabel( items
[i
]);
2069 item
->SetColumn( kMinColumnId
+ column
);
2071 if ( m_sortOrder
== SortOrder_None
)
2072 item
->SetOrder( frontLineOrder
+ 1 + i
);
2077 AddItems( wxMacDataBrowserRootContainer
, ids
);
2080 int wxMacDataItemBrowserControl::MacAppend( const wxString
& text
)
2082 wxMacDataItem
* item
= CreateItem();
2083 item
->SetLabel( text
);
2084 if ( m_sortOrder
== SortOrder_None
)
2086 unsigned int lines
= MacGetCount();
2088 item
->SetOrder( 1 );
2091 wxMacDataItem
* frontItem
= (wxMacDataItem
*) GetItemFromLine(lines
-1);
2092 item
->SetOrder( frontItem
->GetOrder() + 1 );
2095 AddItem( wxMacDataBrowserRootContainer
, item
);
2097 return GetLineFromItem(item
);
2100 void wxMacDataItemBrowserControl::MacClear()
2102 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2103 RemoveAllItems(wxMacDataBrowserRootContainer
);
2106 void wxMacDataItemBrowserControl::MacDeselectAll()
2108 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2109 SetSelectedAllItems( kDataBrowserItemsRemove
);
2112 void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n
, bool select
, bool multi
)
2114 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
2115 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2117 if ( IsItemSelected( item
) != select
)
2120 SetSelectedItem( item
, multi
? kDataBrowserItemsAdd
: kDataBrowserItemsAssign
);
2122 SetSelectedItem( item
, kDataBrowserItemsRemove
);
2128 bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n
) const
2130 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
2131 return IsItemSelected( item
);
2134 int wxMacDataItemBrowserControl::MacGetSelection() const
2136 wxMacDataItemPtr first
, last
;
2137 GetSelectionAnchor( &first
, &last
);
2139 if ( first
!= NULL
)
2141 return GetLineFromItem( first
);
2147 int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt
& aSelections
) const
2149 aSelections
.Empty();
2150 wxArrayMacDataItemPtr selectedItems
;
2151 GetItems( wxMacDataBrowserRootContainer
, false , kDataBrowserItemIsSelected
, selectedItems
);
2153 int count
= selectedItems
.GetCount();
2155 for ( int i
= 0; i
< count
; ++i
)
2157 aSelections
.Add(GetLineFromItem(selectedItems
[i
]));
2163 void wxMacDataItemBrowserControl::MacSetString( unsigned int n
, const wxString
& text
)
2165 // as we don't store the strings we only have to issue a redraw
2166 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2167 item
->SetLabel( text
);
2168 UpdateItem( wxMacDataBrowserRootContainer
, item
, kTextColumnId
);
2171 wxString
wxMacDataItemBrowserControl::MacGetString( unsigned int n
) const
2173 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2174 return item
->GetLabel();
2177 void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n
, void * data
)
2179 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2180 item
->SetData( data
);
2181 // not displayed, therefore no Update infos to DataBrowser
2184 void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n
) const
2186 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2187 return item
->GetData();
2190 void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n
)
2192 RevealItem( GetItemFromLine( n
) , kDataBrowserRevealWithoutSelecting
);
2201 OSStatus
wxMacControl::SetTabEnabled( SInt16 tabNo
, bool enable
)
2203 return ::SetTabEnabled( m_controlRef
, tabNo
, enable
);
2210 #ifdef __WXMAC_OSX__
2211 // snippets from Sketch Sample from Apple :
2213 #define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc"
2216 This function locates, opens, and returns the profile reference for the calibrated
2217 Generic RGB color space. It is up to the caller to call CMCloseProfile when done
2218 with the profile reference this function returns.
2220 CMProfileRef
wxMacOpenGenericProfile()
2222 static CMProfileRef cachedRGBProfileRef
= NULL
;
2224 // we only create the profile reference once
2225 if (cachedRGBProfileRef
== NULL
)
2227 CMProfileLocation loc
;
2229 loc
.locType
= cmPathBasedProfile
;
2230 strcpy(loc
.u
.pathLoc
.path
, kGenericRGBProfilePathStr
);
2232 verify_noerr( CMOpenProfile(&cachedRGBProfileRef
, &loc
) );
2235 // clone the profile reference so that the caller has their own reference, not our cached one
2236 if (cachedRGBProfileRef
)
2237 CMCloneProfileRef(cachedRGBProfileRef
);
2239 return cachedRGBProfileRef
;
2243 Return the generic RGB color space. This is a 'get' function and the caller should
2244 not release the returned value unless the caller retains it first. Usually callers
2245 of this routine will immediately use the returned colorspace with CoreGraphics
2246 so they typically do not need to retain it themselves.
2248 This function creates the generic RGB color space once and hangs onto it so it can
2249 return it whenever this function is called.
2252 CGColorSpaceRef
wxMacGetGenericRGBColorSpace()
2254 static wxMacCFRefHolder
<CGColorSpaceRef
> genericRGBColorSpace
;
2256 if (genericRGBColorSpace
== NULL
)
2258 if ( UMAGetSystemVersion() >= 0x1040 )
2260 genericRGBColorSpace
.Set( CGColorSpaceCreateWithName( CFSTR("kCGColorSpaceGenericRGB") ) );
2264 CMProfileRef genericRGBProfile
= wxMacOpenGenericProfile();
2266 if (genericRGBProfile
)
2268 genericRGBColorSpace
.Set( CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile
) );
2270 wxASSERT_MSG( genericRGBColorSpace
!= NULL
, wxT("couldn't create the generic RGB color space") );
2272 // we opened the profile so it is up to us to close it
2273 CMCloseProfile(genericRGBProfile
);
2278 return genericRGBColorSpace
;
2284 wxMacPortSaver::wxMacPortSaver( GrafPtr port
)
2286 ::GetPort( &m_port
);
2290 wxMacPortSaver::~wxMacPortSaver()
2292 ::SetPort( m_port
);
2296 void wxMacGlobalToLocal( WindowRef window
, Point
*pt
)
2298 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
2299 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
2300 HIViewRef contentView
;
2301 // TODO check toolbar offset
2302 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
2303 HIPointConvert( &p
, kHICoordSpace72DPIGlobal
, NULL
, kHICoordSpaceView
, contentView
);
2307 QDGlobalToLocalPoint( GetWindowPort(window
), pt
) ;
2311 void wxMacLocalToGlobal( WindowRef window
, Point
*pt
)
2313 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
2314 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
2315 HIViewRef contentView
;
2316 // TODO check toolbar offset
2317 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
2318 HIPointConvert( &p
, kHICoordSpaceView
, contentView
, kHICoordSpace72DPIGlobal
, NULL
);
2322 QDLocalToGlobalPoint( GetWindowPort(window
), pt
) ;