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 // Reading and writing resources (eg WIN.INI, .Xdefaults)
383 bool wxWriteResource(const wxString
& section
, const wxString
& entry
, const wxString
& value
, const wxString
& file
)
389 bool wxWriteResource(const wxString
& section
, const wxString
& entry
, float value
, const wxString
& file
)
392 buf
.Printf(wxT("%.4f"), value
);
394 return wxWriteResource(section
, entry
, buf
, file
);
397 bool wxWriteResource(const wxString
& section
, const wxString
& entry
, long value
, const wxString
& file
)
400 buf
.Printf(wxT("%ld"), value
);
402 return wxWriteResource(section
, entry
, buf
, file
);
405 bool wxWriteResource(const wxString
& section
, const wxString
& entry
, int value
, const wxString
& file
)
408 buf
.Printf(wxT("%d"), value
);
410 return wxWriteResource(section
, entry
, buf
, file
);
413 bool wxGetResource(const wxString
& section
, const wxString
& entry
, char **value
, const wxString
& file
)
419 bool wxGetResource(const wxString
& section
, const wxString
& entry
, float *value
, const wxString
& file
)
422 bool succ
= wxGetResource(section
, entry
, (char **)&s
, file
);
425 *value
= (float)strtod(s
, NULL
);
432 bool wxGetResource(const wxString
& section
, const wxString
& entry
, long *value
, const wxString
& file
)
435 bool succ
= wxGetResource(section
, entry
, (char **)&s
, file
);
438 *value
= strtol(s
, NULL
, 10);
445 bool wxGetResource(const wxString
& section
, const wxString
& entry
, int *value
, const wxString
& file
)
448 bool succ
= wxGetResource(section
, entry
, (char **)&s
, file
);
451 *value
= (int)strtol(s
, NULL
, 10);
457 #endif // wxUSE_RESOURCES
459 int gs_wxBusyCursorCount
= 0;
460 extern wxCursor gMacCurrentCursor
;
461 wxCursor gMacStoredActiveCursor
;
463 // Set the cursor to the busy cursor for all windows
464 void wxBeginBusyCursor(const wxCursor
*cursor
)
466 if (gs_wxBusyCursorCount
++ == 0)
468 gMacStoredActiveCursor
= gMacCurrentCursor
;
469 cursor
->MacInstall();
471 //else: nothing to do, already set
474 // Restore cursor to normal
475 void wxEndBusyCursor()
477 wxCHECK_RET( gs_wxBusyCursorCount
> 0,
478 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
480 if (--gs_wxBusyCursorCount
== 0)
482 gMacStoredActiveCursor
.MacInstall();
483 gMacStoredActiveCursor
= wxNullCursor
;
487 // true if we're between the above two calls
490 return (gs_wxBusyCursorCount
> 0);
497 wxString
wxMacFindFolderNoSeparator( short vol
,
499 Boolean createFolder
)
504 if ( FSFindFolder( vol
, folderType
, createFolder
, &fsRef
) == noErr
)
506 strDir
= wxMacFSRefToPath( &fsRef
);
512 wxString
wxMacFindFolder( short vol
,
514 Boolean createFolder
)
516 return wxMacFindFolderNoSeparator(vol
, folderType
, createFolder
) + wxFILE_SEP_PATH
;
523 // Check whether this window wants to process messages, e.g. Stop button
524 // in long calculations.
525 bool wxCheckForInterrupt(wxWindow
*wnd
)
531 void wxGetMousePosition( int* x
, int* y
)
534 #if wxMAC_USE_CORE_GRAPHICS
538 LocalToGlobal( &pt
);
544 // Return true if we have a colour display
545 bool wxColourDisplay()
550 // Returns depth of screen
554 #if wxMAC_USE_CORE_GRAPHICS
555 theDepth
= (int) CGDisplayBitsPerPixel(CGMainDisplayID());
558 SetRect(&globRect
, -32760, -32760, 32760, 32760);
559 GDHandle theMaxDevice
;
561 theMaxDevice
= GetMaxDevice(&globRect
);
562 if (theMaxDevice
!= NULL
)
563 theDepth
= (**(**theMaxDevice
).gdPMap
).pixelSize
;
568 // Get size of display
569 void wxDisplaySize(int *width
, int *height
)
571 #if wxMAC_USE_CORE_GRAPHICS
572 // TODO adapt for multi-displays
573 CGRect bounds
= CGDisplayBounds(CGMainDisplayID());
575 *width
= (int)bounds
.size
.width
;
577 *height
= (int)bounds
.size
.height
;
580 GetQDGlobalsScreenBits( &screenBits
);
583 *width
= screenBits
.bounds
.right
- screenBits
.bounds
.left
;
586 *height
= screenBits
.bounds
.bottom
- screenBits
.bounds
.top
;
590 void wxDisplaySizeMM(int *width
, int *height
)
592 wxDisplaySize(width
, height
);
593 // on mac 72 is fixed (at least now;-)
594 float cvPt2Mm
= 25.4 / 72;
597 *width
= int( *width
* cvPt2Mm
);
600 *height
= int( *height
* cvPt2Mm
);
603 void wxClientDisplayRect(int *x
, int *y
, int *width
, int *height
)
605 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
607 HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay
,kHICoordSpace72DPIGlobal
,
610 *x
= bounds
.origin
.x
;
612 *y
= bounds
.origin
.y
;
614 *width
= bounds
.size
.width
;
616 *height
= bounds
.size
.height
;
619 GetAvailableWindowPositioningBounds( GetMainDevice() , &r
);
625 *width
= r
.right
- r
.left
;
627 *height
= r
.bottom
- r
.top
;
631 wxWindow
* wxFindWindowAtPoint(const wxPoint
& pt
)
633 return wxGenericFindWindowAtPoint(pt
);
640 wxString
wxGetOsDescription()
642 #ifdef WXWIN_OS_DESCRIPTION
643 // use configure generated description if available
644 return wxString(wxT("MacOS (")) + wxT(WXWIN_OS_DESCRIPTION
) + wxString(wxT(")"));
646 return wxT("MacOS"); //TODO:define further
651 wxChar
*wxGetUserHome (const wxString
& user
)
657 bool wxGetDiskSpace(const wxString
& path
, wxDiskspaceSize_t
*pTotal
, wxDiskspaceSize_t
*pFree
)
666 int pos
= p
.Find(':');
667 if ( pos
!= wxNOT_FOUND
)
675 err
= wxMacPathToFSRef( p
, &fsRef
);
678 FSVolumeRefNum vRefNum
;
679 err
= FSGetVRefNum( &fsRef
, &vRefNum
);
682 UInt64 freeBytes
, totalBytes
;
683 err
= FSGetVInfo( vRefNum
, NULL
, &freeBytes
, &totalBytes
);
687 *pTotal
= wxDiskspaceSize_t( totalBytes
);
689 *pFree
= wxDiskspaceSize_t( freeBytes
);
696 #endif // !__DARWIN__
698 //---------------------------------------------------------------------------
699 // wxMac Specific utility functions
700 //---------------------------------------------------------------------------
702 void wxMacStringToPascal( const wxString
&from
, StringPtr to
)
704 wxCharBuffer buf
= from
.mb_str( wxConvLocal
);
705 int len
= strlen(buf
);
710 memcpy( (char*) &to
[1] , buf
, len
);
713 wxString
wxMacMakeStringFromPascal( ConstStringPtr from
)
715 return wxString( (char*) &from
[1] , wxConvLocal
, from
[0] );
718 // ----------------------------------------------------------------------------
719 // Common Event Support
720 // ----------------------------------------------------------------------------
722 extern ProcessSerialNumber gAppProcess
;
726 ProcessSerialNumber psn
;
728 psn
.highLongOfPSN
= 0;
729 psn
.lowLongOfPSN
= kCurrentProcess
;
730 SameProcess( &gAppProcess
, &psn
, &isSame
);
734 OSStatus err
= noErr
;
737 // lead sometimes to race conditions, although all calls used should be thread safe ...
738 static wxMacCarbonEvent s_wakeupEvent
;
739 if ( !s_wakeupEvent
.IsValid() )
741 err
= s_wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
742 kEventAttributeNone
);
747 if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent
) )
749 s_wakeupEvent
.SetCurrentTime();
750 err
= PostEventToQueue(GetMainEventQueue(), s_wakeupEvent
,
751 kEventPriorityHigh
);
754 wxMacCarbonEvent wakeupEvent
;
755 wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
756 kEventAttributeNone
);
757 err
= PostEventToQueue(GetMainEventQueue(), wakeupEvent
,
758 kEventPriorityHigh
);
761 PostEvent( nullEvent
, 0 );
766 WakeUpProcess( &gAppProcess
);
774 // ----------------------------------------------------------------------------
775 // Native Struct Conversions
776 // ----------------------------------------------------------------------------
778 void wxMacRectToNative( const wxRect
*wx
, Rect
*n
)
782 n
->right
= wx
->x
+ wx
->width
;
783 n
->bottom
= wx
->y
+ wx
->height
;
786 void wxMacNativeToRect( const Rect
*n
, wxRect
* wx
)
790 wx
->width
= n
->right
- n
->left
;
791 wx
->height
= n
->bottom
- n
->top
;
794 void wxMacPointToNative( const wxPoint
* wx
, Point
*n
)
800 void wxMacNativeToPoint( const Point
*n
, wxPoint
* wx
)
806 // ----------------------------------------------------------------------------
807 // Carbon Event Support
808 // ----------------------------------------------------------------------------
810 OSStatus
wxMacCarbonEvent::GetParameter(EventParamName inName
, EventParamType inDesiredType
, UInt32 inBufferSize
, void * outData
)
812 return ::GetEventParameter( m_eventRef
, inName
, inDesiredType
, NULL
, inBufferSize
, NULL
, outData
);
815 OSStatus
wxMacCarbonEvent::SetParameter(EventParamName inName
, EventParamType inType
, UInt32 inBufferSize
, const void * inData
)
817 return ::SetEventParameter( m_eventRef
, inName
, inType
, inBufferSize
, inData
);
820 // ----------------------------------------------------------------------------
821 // Control Access Support
822 // ----------------------------------------------------------------------------
824 IMPLEMENT_DYNAMIC_CLASS( wxMacControl
, wxObject
)
826 wxMacControl::wxMacControl()
831 wxMacControl::wxMacControl(wxWindow
* peer
, bool isRootControl
)
835 m_isRootControl
= isRootControl
;
838 wxMacControl::wxMacControl( wxWindow
* peer
, ControlRef control
)
842 m_controlRef
= control
;
845 wxMacControl::wxMacControl( wxWindow
* peer
, WXWidget control
)
849 m_controlRef
= (ControlRef
) control
;
852 wxMacControl::~wxMacControl()
856 void wxMacControl::Init()
860 m_needsFocusRect
= false;
861 m_isRootControl
= false;
864 void wxMacControl::Dispose()
866 wxASSERT_MSG( IsValidControlHandle(m_controlRef
) , wxT("Invalid Control Handle (maybe already released) in Dispose") );
868 CFIndex count
= CFGetRetainCount( m_controlRef
) ;
869 wxASSERT_MSG( count
== 1 , wxT("Reference Count of native control was not 1 in Dispose") );
871 ::DisposeControl( m_controlRef
);
875 void wxMacControl::SetReference( URefCon data
)
877 SetControlReference( m_controlRef
, data
);
880 OSStatus
wxMacControl::GetData(ControlPartCode inPartCode
, ResType inTag
, Size inBufferSize
, void * inOutBuffer
, Size
* outActualSize
) const
882 return ::GetControlData( m_controlRef
, inPartCode
, inTag
, inBufferSize
, inOutBuffer
, outActualSize
);
885 OSStatus
wxMacControl::GetDataSize(ControlPartCode inPartCode
, ResType inTag
, Size
* outActualSize
) const
887 return ::GetControlDataSize( m_controlRef
, inPartCode
, inTag
, outActualSize
);
890 OSStatus
wxMacControl::SetData(ControlPartCode inPartCode
, ResType inTag
, Size inSize
, const void * inData
)
892 return ::SetControlData( m_controlRef
, inPartCode
, inTag
, inSize
, inData
);
895 OSStatus
wxMacControl::SendEvent( EventRef event
, OptionBits inOptions
)
897 #if TARGET_API_MAC_OSX
898 return SendEventToEventTargetWithOptions( event
,
899 HIObjectGetEventTarget( (HIObjectRef
) m_controlRef
), inOptions
);
901 #pragma unused(inOptions)
902 return SendEventToEventTarget(event
,GetControlEventTarget( m_controlRef
) );
906 OSStatus
wxMacControl::SendHICommand( HICommand
&command
, OptionBits inOptions
)
908 wxMacCarbonEvent
event( kEventClassCommand
, kEventCommandProcess
);
910 event
.SetParameter
<HICommand
>(kEventParamDirectObject
,command
);
912 return SendEvent( event
, inOptions
);
915 OSStatus
wxMacControl::SendHICommand( UInt32 commandID
, OptionBits inOptions
)
919 memset( &command
, 0 , sizeof(command
) );
920 command
.commandID
= commandID
;
921 return SendHICommand( command
, inOptions
);
924 void wxMacControl::Flash( ControlPartCode part
, UInt32 ticks
)
926 unsigned long finalTicks
;
928 HiliteControl( m_controlRef
, part
);
929 Delay( ticks
, &finalTicks
);
930 HiliteControl( m_controlRef
, kControlNoPart
);
933 SInt32
wxMacControl::GetValue() const
935 return ::GetControl32BitValue( m_controlRef
);
938 SInt32
wxMacControl::GetMaximum() const
940 return ::GetControl32BitMaximum( m_controlRef
);
943 SInt32
wxMacControl::GetMinimum() const
945 return ::GetControl32BitMinimum( m_controlRef
);
948 void wxMacControl::SetValue( SInt32 v
)
950 ::SetControl32BitValue( m_controlRef
, v
);
953 void wxMacControl::SetMinimum( SInt32 v
)
955 ::SetControl32BitMinimum( m_controlRef
, v
);
958 void wxMacControl::SetMaximum( SInt32 v
)
960 ::SetControl32BitMaximum( m_controlRef
, v
);
963 void wxMacControl::SetValueAndRange( SInt32 value
, SInt32 minimum
, SInt32 maximum
)
965 ::SetControl32BitMinimum( m_controlRef
, minimum
);
966 ::SetControl32BitMaximum( m_controlRef
, maximum
);
967 ::SetControl32BitValue( m_controlRef
, value
);
970 OSStatus
wxMacControl::SetFocus( ControlFocusPart focusPart
)
972 return SetKeyboardFocus( GetControlOwner( m_controlRef
), m_controlRef
, focusPart
);
975 bool wxMacControl::HasFocus() const
978 GetKeyboardFocus( GetUserFocusWindow() , &control
);
979 return control
== m_controlRef
;
982 void wxMacControl::SetNeedsFocusRect( bool needs
)
984 m_needsFocusRect
= needs
;
987 bool wxMacControl::NeedsFocusRect() const
989 return m_needsFocusRect
;
992 void wxMacControl::VisibilityChanged(bool shown
)
996 void wxMacControl::SuperChangedPosition()
1000 void wxMacControl::SetFont( const wxFont
& font
, const wxColour
& foreground
, long windowStyle
)
1003 ControlFontStyleRec fontStyle
;
1004 if ( font
.MacGetThemeFontID() != kThemeCurrentPortFont
)
1006 switch ( font
.MacGetThemeFontID() )
1008 case kThemeSmallSystemFont
:
1009 fontStyle
.font
= kControlFontSmallSystemFont
;
1012 case 109 : // mini font
1013 fontStyle
.font
= -5;
1016 case kThemeSystemFont
:
1017 fontStyle
.font
= kControlFontBigSystemFont
;
1021 fontStyle
.font
= kControlFontBigSystemFont
;
1025 fontStyle
.flags
= kControlUseFontMask
;
1029 fontStyle
.font
= font
.MacGetFontNum();
1030 fontStyle
.style
= font
.MacGetFontStyle();
1031 fontStyle
.size
= font
.MacGetFontSize();
1032 fontStyle
.flags
= kControlUseFontMask
| kControlUseFaceMask
| kControlUseSizeMask
;
1035 fontStyle
.just
= teJustLeft
;
1036 fontStyle
.flags
|= kControlUseJustMask
;
1037 if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_CENTER_HORIZONTAL
)
1038 fontStyle
.just
= teJustCenter
;
1039 else if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_RIGHT
)
1040 fontStyle
.just
= teJustRight
;
1043 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
1044 // won't get grayed out by the system anymore
1046 if ( foreground
!= *wxBLACK
)
1048 fontStyle
.foreColor
= MAC_WXCOLORREF( foreground
.GetPixel() );
1049 fontStyle
.flags
|= kControlUseForeColorMask
;
1052 ::SetControlFontStyle( m_controlRef
, &fontStyle
);
1055 void wxMacControl::SetBackground( const wxBrush
&WXUNUSED(brush
) )
1058 // setting up a color proc is not recommended anymore
1061 void wxMacControl::SetRange( SInt32 minimum
, SInt32 maximum
)
1063 ::SetControl32BitMinimum( m_controlRef
, minimum
);
1064 ::SetControl32BitMaximum( m_controlRef
, maximum
);
1067 short wxMacControl::HandleKey( SInt16 keyCode
, SInt16 charCode
, EventModifiers modifiers
)
1070 return HandleControlKey( m_controlRef
, keyCode
, charCode
, modifiers
);
1076 void wxMacControl::SetActionProc( ControlActionUPP actionProc
)
1078 SetControlAction( m_controlRef
, actionProc
);
1081 void wxMacControl::SetViewSize( SInt32 viewSize
)
1083 SetControlViewSize(m_controlRef
, viewSize
);
1086 SInt32
wxMacControl::GetViewSize() const
1088 return GetControlViewSize( m_controlRef
);
1091 bool wxMacControl::IsVisible() const
1093 return IsControlVisible( m_controlRef
);
1096 void wxMacControl::SetVisibility( bool visible
, bool redraw
)
1098 SetControlVisibility( m_controlRef
, visible
, redraw
);
1101 bool wxMacControl::IsEnabled() const
1103 #if TARGET_API_MAC_OSX
1104 return IsControlEnabled( m_controlRef
);
1106 return IsControlActive( m_controlRef
);
1110 bool wxMacControl::IsActive() const
1112 return IsControlActive( m_controlRef
);
1115 void wxMacControl::Enable( bool enable
)
1118 EnableControl( m_controlRef
);
1120 DisableControl( m_controlRef
);
1123 void wxMacControl::SetDrawingEnabled( bool enable
)
1125 HIViewSetDrawingEnabled( m_controlRef
, enable
);
1128 bool wxMacControl::GetNeedsDisplay() const
1130 return HIViewGetNeedsDisplay( m_controlRef
);
1133 void wxMacControl::SetNeedsDisplay( RgnHandle where
)
1138 HIViewSetNeedsDisplayInRegion( m_controlRef
, where
, true );
1141 void wxMacControl::SetNeedsDisplay( Rect
* where
)
1146 if ( where
!= NULL
)
1148 RgnHandle update
= NewRgn();
1149 RectRgn( update
, where
);
1150 HIViewSetNeedsDisplayInRegion( m_controlRef
, update
, true );
1151 DisposeRgn( update
);
1154 HIViewSetNeedsDisplay( m_controlRef
, true );
1157 void wxMacControl::Convert( wxPoint
*pt
, wxMacControl
*from
, wxMacControl
*to
)
1163 HIViewConvertPoint( &hiPoint
, from
->m_controlRef
, to
->m_controlRef
);
1164 pt
->x
= (int)hiPoint
.x
;
1165 pt
->y
= (int)hiPoint
.y
;
1168 void wxMacControl::SetRect( Rect
*r
)
1170 //A HIRect is actually a CGRect on OSX - which consists of two structures -
1171 //CGPoint and CGSize, which have two floats each
1172 HIRect hir
= { { r
->left
, r
->top
}, { r
->right
- r
->left
, r
->bottom
- r
->top
} };
1173 HIViewSetFrame ( m_controlRef
, &hir
);
1174 // eventuall we might have to do a SetVisibility( false , true );
1175 // before and a SetVisibility( true , true ); after
1178 void wxMacControl::GetRect( Rect
*r
)
1180 GetControlBounds( m_controlRef
, r
);
1183 void wxMacControl::GetRectInWindowCoords( Rect
*r
)
1185 UMAGetControlBoundsInWindowCoords( m_controlRef
, r
);
1188 void wxMacControl::GetBestRect( Rect
*r
)
1190 short baselineoffset
;
1192 GetBestControlRect( m_controlRef
, r
, &baselineoffset
);
1195 void wxMacControl::SetLabel( const wxString
&title
)
1197 wxFontEncoding encoding
;
1200 encoding
= m_font
.GetEncoding();
1202 encoding
= wxFont::GetDefaultEncoding();
1204 UMASetControlTitle( m_controlRef
, title
, encoding
);
1207 void wxMacControl::GetFeatures( UInt32
* features
)
1209 GetControlFeatures( m_controlRef
, features
);
1212 OSStatus
wxMacControl::GetRegion( ControlPartCode partCode
, RgnHandle region
)
1214 OSStatus err
= GetControlRegion( m_controlRef
, partCode
, region
);
1218 OSStatus
wxMacControl::SetZOrder( bool above
, wxMacControl
* other
)
1220 #if TARGET_API_MAC_OSX
1221 return HIViewSetZOrder( m_controlRef
,above
? kHIViewZOrderAbove
: kHIViewZOrderBelow
,
1222 (other
!= NULL
) ? other
->m_controlRef
: NULL
);
1228 #if TARGET_API_MAC_OSX
1229 // SetNeedsDisplay would not invalidate the children
1230 static void InvalidateControlAndChildren( HIViewRef control
)
1232 HIViewSetNeedsDisplay( control
, true );
1233 UInt16 childrenCount
= 0;
1234 OSStatus err
= CountSubControls( control
, &childrenCount
);
1235 if ( err
== errControlIsNotEmbedder
)
1238 wxASSERT_MSG( err
== noErr
, wxT("Unexpected error when accessing subcontrols") );
1240 for ( UInt16 i
= childrenCount
; i
>=1; --i
)
1244 err
= GetIndexedSubControl( control
, i
, & child
);
1245 if ( err
== errControlIsNotEmbedder
)
1248 InvalidateControlAndChildren( child
);
1253 void wxMacControl::InvalidateWithChildren()
1255 #if TARGET_API_MAC_OSX
1256 InvalidateControlAndChildren( m_controlRef
);
1260 void wxMacControl::ScrollRect( wxRect
*r
, int dx
, int dy
)
1262 wxASSERT( r
!= NULL
);
1264 HIRect scrollarea
= CGRectMake( r
->x
, r
->y
, r
->width
, r
->height
);
1265 HIViewScrollRect ( m_controlRef
, &scrollarea
, dx
,dy
);
1268 OSType wxMacCreator
= 'WXMC';
1269 OSType wxMacControlProperty
= 'MCCT';
1271 void wxMacControl::SetReferenceInNativeControl()
1274 verify_noerr( SetControlProperty ( m_controlRef
,
1275 wxMacCreator
,wxMacControlProperty
, sizeof(data
), &data
) );
1278 wxMacControl
* wxMacControl::GetReferenceFromNativeControl(ControlRef control
)
1280 wxMacControl
* ctl
= NULL
;
1281 ByteCount actualSize
;
1282 if ( GetControlProperty( control
,wxMacCreator
,wxMacControlProperty
, sizeof(ctl
) ,
1283 &actualSize
, &ctl
) == noErr
)
1290 // ============================================================================
1291 // DataBrowser Wrapper
1292 // ============================================================================
1294 // basing on DataBrowserItemIDs
1297 IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl
, wxMacControl
)
1299 pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
1301 DataBrowserItemID itemID
,
1302 DataBrowserItemNotification message
,
1303 DataBrowserItemDataRef itemData
)
1305 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1308 ctl
->ItemNotification(itemID
, message
, itemData
);
1312 pascal OSStatus
wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
1314 DataBrowserItemID itemID
,
1315 DataBrowserPropertyID property
,
1316 DataBrowserItemDataRef itemData
,
1317 Boolean changeValue
)
1319 OSStatus err
= errDataBrowserPropertyNotSupported
;
1320 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1323 err
= ctl
->GetSetItemData(itemID
, property
, itemData
, changeValue
);
1328 pascal Boolean
wxMacDataBrowserControl::DataBrowserCompareProc(
1330 DataBrowserItemID itemOneID
,
1331 DataBrowserItemID itemTwoID
,
1332 DataBrowserPropertyID sortProperty
)
1334 wxMacDataBrowserControl
* ctl
= wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser
), wxMacDataBrowserControl
);
1337 return ctl
->CompareItems(itemOneID
, itemTwoID
, sortProperty
);
1342 DataBrowserItemDataUPP gDataBrowserItemDataUPP
= NULL
;
1343 DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP
= NULL
;
1344 DataBrowserItemCompareUPP gDataBrowserItemCompareUPP
= NULL
;
1346 wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) : wxMacControl( peer
)
1348 Rect bounds
= wxMacGetBoundsForControl( peer
, pos
, size
);
1349 OSStatus err
= ::CreateDataBrowserControl(
1350 MAC_WXHWND(peer
->MacGetTopLevelWindowRef()),
1351 &bounds
, kDataBrowserListView
, &m_controlRef
);
1352 SetReferenceInNativeControl();
1353 verify_noerr( err
);
1354 if ( gDataBrowserItemCompareUPP
== NULL
)
1355 gDataBrowserItemCompareUPP
= NewDataBrowserItemCompareUPP(DataBrowserCompareProc
);
1356 if ( gDataBrowserItemDataUPP
== NULL
)
1357 gDataBrowserItemDataUPP
= NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc
);
1358 if ( gDataBrowserItemNotificationUPP
== NULL
)
1360 gDataBrowserItemNotificationUPP
=
1361 #if TARGET_API_MAC_OSX
1362 (DataBrowserItemNotificationUPP
) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc
);
1364 NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc
);
1368 DataBrowserCallbacks callbacks
;
1369 InitializeDataBrowserCallbacks( &callbacks
, kDataBrowserLatestCallbacks
);
1371 callbacks
.u
.v1
.itemDataCallback
= gDataBrowserItemDataUPP
;
1372 callbacks
.u
.v1
.itemCompareCallback
= gDataBrowserItemCompareUPP
;
1373 callbacks
.u
.v1
.itemNotificationCallback
= gDataBrowserItemNotificationUPP
;
1374 SetCallbacks( &callbacks
);
1378 OSStatus
wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container
,
1380 DataBrowserItemState state
,
1381 ItemCount
*numItems
) const
1383 return GetDataBrowserItemCount( m_controlRef
, container
, recurse
, state
, numItems
);
1386 OSStatus
wxMacDataBrowserControl::GetItems( DataBrowserItemID container
,
1388 DataBrowserItemState state
,
1391 return GetDataBrowserItems( m_controlRef
, container
, recurse
, state
, items
);
1394 OSStatus
wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options
)
1396 return SetDataBrowserSelectionFlags( m_controlRef
, options
);
1399 OSStatus
wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc
*columnDesc
,
1400 DataBrowserTableViewColumnIndex position
)
1402 return AddDataBrowserListViewColumn( m_controlRef
, columnDesc
, position
);
1405 OSStatus
wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position
, DataBrowserTableViewColumnID
* id
){
1406 return GetDataBrowserTableViewColumnProperty( m_controlRef
, position
, id
);
1409 OSStatus
wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position
)
1411 DataBrowserTableViewColumnID id
;
1412 GetColumnIDFromIndex( position
, &id
);
1413 return RemoveDataBrowserTableViewColumn( m_controlRef
, id
);
1416 OSStatus
wxMacDataBrowserControl::AutoSizeColumns()
1418 return AutoSizeDataBrowserListViewColumns(m_controlRef
);
1421 OSStatus
wxMacDataBrowserControl::SetHasScrollBars( bool horiz
, bool vert
)
1423 return SetDataBrowserHasScrollBars( m_controlRef
, horiz
, vert
);
1426 OSStatus
wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle
)
1428 return SetDataBrowserTableViewHiliteStyle( m_controlRef
, hiliteStyle
);
1431 OSStatus
wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height
)
1433 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1436 OSStatus
wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16
*height
)
1438 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef
, height
);
1441 OSStatus
wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks
*callbacks
)
1443 return SetDataBrowserCallbacks( m_controlRef
, callbacks
);
1446 OSStatus
wxMacDataBrowserControl::UpdateItems(
1447 DataBrowserItemID container
,
1449 const DataBrowserItemID
*items
,
1450 DataBrowserPropertyID preSortProperty
,
1451 DataBrowserPropertyID propertyID
) const
1453 return UpdateDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
, propertyID
);
1456 bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item
) const
1458 return IsDataBrowserItemSelected( m_controlRef
, item
);
1461 OSStatus
wxMacDataBrowserControl::AddItems(
1462 DataBrowserItemID container
,
1464 const DataBrowserItemID
*items
,
1465 DataBrowserPropertyID preSortProperty
)
1467 return AddDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1470 OSStatus
wxMacDataBrowserControl::RemoveItems(
1471 DataBrowserItemID container
,
1473 const DataBrowserItemID
*items
,
1474 DataBrowserPropertyID preSortProperty
)
1476 return RemoveDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
);
1479 OSStatus
wxMacDataBrowserControl::RevealItem(
1480 DataBrowserItemID item
,
1481 DataBrowserPropertyID propertyID
,
1482 DataBrowserRevealOptions options
) const
1484 return RevealDataBrowserItem( m_controlRef
, item
, propertyID
, options
);
1487 OSStatus
wxMacDataBrowserControl::SetSelectedItems(
1489 const DataBrowserItemID
*items
,
1490 DataBrowserSetOption operation
)
1492 return SetDataBrowserSelectedItems( m_controlRef
, numItems
, items
, operation
);
1495 OSStatus
wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID
*first
, DataBrowserItemID
*last
) const
1497 return GetDataBrowserSelectionAnchor( m_controlRef
, first
, last
);
1500 OSStatus
wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row
, DataBrowserItemID
* item
) const
1502 return GetDataBrowserTableViewItemID( m_controlRef
, row
, item
);
1505 OSStatus
wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item
, DataBrowserTableViewRowIndex
* row
) const
1507 return GetDataBrowserTableViewItemRow( m_controlRef
, item
, row
);
1510 OSStatus
wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height
)
1512 return SetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1515 OSStatus
wxMacDataBrowserControl::GetDefaultRowHeight( UInt16
* height
) const
1517 return GetDataBrowserTableViewRowHeight( m_controlRef
, height
);
1520 OSStatus
wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item
, UInt16 height
)
1522 return SetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1525 OSStatus
wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item
, UInt16
*height
) const
1527 return GetDataBrowserTableViewItemRowHeight( m_controlRef
, item
, height
);
1530 OSStatus
wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column
, UInt16
*width
) const
1532 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1535 OSStatus
wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column
, UInt16 width
)
1537 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef
, column
, width
);
1540 OSStatus
wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16
*width
) const
1542 return GetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1545 OSStatus
wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width
)
1547 return SetDataBrowserTableViewColumnWidth( m_controlRef
, width
);
1550 OSStatus
wxMacDataBrowserControl::GetColumnCount(UInt32
* numColumns
) const
1552 return GetDataBrowserTableViewColumnCount( m_controlRef
, numColumns
);
1555 OSStatus
wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column
,
1556 DataBrowserTableViewColumnIndex
*position
) const
1558 return GetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1561 OSStatus
wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column
, DataBrowserTableViewColumnIndex position
)
1563 return SetDataBrowserTableViewColumnPosition( m_controlRef
, column
, position
);
1566 OSStatus
wxMacDataBrowserControl::GetScrollPosition( UInt32
*top
, UInt32
*left
) const
1568 return GetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1571 OSStatus
wxMacDataBrowserControl::SetScrollPosition( UInt32 top
, UInt32 left
)
1573 return SetDataBrowserScrollPosition( m_controlRef
, top
, left
);
1576 OSStatus
wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID
*column
) const
1578 return GetDataBrowserSortProperty( m_controlRef
, column
);
1581 OSStatus
wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column
)
1583 return SetDataBrowserSortProperty( m_controlRef
, column
);
1586 OSStatus
wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder
*order
) const
1588 return GetDataBrowserSortOrder( m_controlRef
, order
);
1591 OSStatus
wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order
)
1593 return SetDataBrowserSortOrder( m_controlRef
, order
);
1596 OSStatus
wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property
,
1597 DataBrowserPropertyFlags
*flags
) const
1599 return GetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1602 OSStatus
wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property
,
1603 DataBrowserPropertyFlags flags
)
1605 return SetDataBrowserPropertyFlags( m_controlRef
, property
, flags
);
1608 OSStatus
wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property
,
1609 DataBrowserListViewHeaderDesc
*desc
) const
1611 return GetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1614 OSStatus
wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property
,
1615 DataBrowserListViewHeaderDesc
*desc
)
1617 return SetDataBrowserListViewHeaderDesc( m_controlRef
, property
, desc
);
1620 OSStatus
wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property
,
1621 Boolean expandableRows
)
1623 return SetDataBrowserListViewDisclosureColumn( m_controlRef
, property
, expandableRows
);
1626 // ============================================================================
1627 // Higher-level Databrowser
1628 // ============================================================================
1630 // basing on data item objects
1633 wxMacDataItem::wxMacDataItem()
1638 m_colId
= kTextColumnId
; // for compat with existing wx*ListBox impls.
1641 wxMacDataItem::~wxMacDataItem()
1645 void wxMacDataItem::SetOrder( SInt32 order
)
1650 SInt32
wxMacDataItem::GetOrder() const
1655 void wxMacDataItem::SetData( void* data
)
1660 void* wxMacDataItem::GetData() const
1665 short wxMacDataItem::GetColumn()
1670 void wxMacDataItem::SetColumn( short col
)
1675 void wxMacDataItem::SetLabel( const wxString
& str
)
1678 m_cfLabel
.Assign( str
, wxLocale::GetSystemEncoding());
1681 const wxString
& wxMacDataItem::GetLabel() const
1686 bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl
*owner
,
1687 const wxMacDataItem
* rhs
,
1688 DataBrowserPropertyID sortProperty
) const
1690 const wxMacDataItem
* otherItem
= wx_const_cast(wxMacDataItem
*,rhs
);
1691 bool retval
= false;
1693 if ( sortProperty
== m_colId
){
1694 retval
= m_label
.CmpNoCase( otherItem
->m_label
) < 0;
1697 else if ( sortProperty
== kNumericOrderColumnId
)
1698 retval
= m_order
< otherItem
->m_order
;
1703 OSStatus
wxMacDataItem::GetSetData( wxMacDataItemBrowserControl
*owner
,
1704 DataBrowserPropertyID property
,
1705 DataBrowserItemDataRef itemData
,
1708 OSStatus err
= errDataBrowserPropertyNotSupported
;
1711 if ( property
== m_colId
){
1712 err
= ::SetDataBrowserItemDataText( itemData
, m_cfLabel
);
1715 else if ( property
== kNumericOrderColumnId
){
1716 err
= ::SetDataBrowserItemDataValue( itemData
, m_order
);
1726 // no editable props here
1735 void wxMacDataItem::Notification(wxMacDataItemBrowserControl
*owner
,
1736 DataBrowserItemNotification message
,
1737 DataBrowserItemDataRef itemData
) const
1741 IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl
, wxMacDataBrowserControl
)
1743 wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow
* peer
, const wxPoint
& pos
, const wxSize
& size
, long style
) :
1744 wxMacDataBrowserControl( peer
, pos
, size
, style
)
1746 m_suppressSelection
= false;
1747 m_sortOrder
= SortOrder_None
;
1748 m_clientDataItemsType
= wxClientData_None
;
1751 wxMacDataItem
* wxMacDataItemBrowserControl::CreateItem()
1753 return new wxMacDataItem();
1756 wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl
*browser
)
1758 m_former
= browser
->SuppressSelection(true);
1759 m_browser
= browser
;
1762 wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1764 m_browser
->SuppressSelection(m_former
);
1767 bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress
)
1769 bool former
= m_suppressSelection
;
1770 m_suppressSelection
= suppress
;
1775 Boolean
wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID
,
1776 DataBrowserItemID itemTwoID
,
1777 DataBrowserPropertyID sortProperty
)
1779 wxMacDataItem
* itemOne
= (wxMacDataItem
*) itemOneID
;
1780 wxMacDataItem
* itemTwo
= (wxMacDataItem
*) itemTwoID
;
1781 return CompareItems( itemOne
, itemTwo
, sortProperty
);
1784 Boolean
wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem
* itemOne
,
1785 const wxMacDataItem
* itemTwo
,
1786 DataBrowserPropertyID sortProperty
)
1788 Boolean retval
= false;
1789 if ( itemOne
!= NULL
)
1790 retval
= itemOne
->IsLessThan( this , itemTwo
, sortProperty
);
1794 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1795 DataBrowserItemID itemID
,
1796 DataBrowserPropertyID property
,
1797 DataBrowserItemDataRef itemData
,
1798 Boolean changeValue
)
1800 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1801 return GetSetItemData(item
, property
, itemData
, changeValue
);
1804 OSStatus
wxMacDataItemBrowserControl::GetSetItemData(
1805 wxMacDataItem
* item
,
1806 DataBrowserPropertyID property
,
1807 DataBrowserItemDataRef itemData
,
1808 Boolean changeValue
)
1810 OSStatus err
= errDataBrowserPropertyNotSupported
;
1813 case kDataBrowserContainerIsClosableProperty
:
1814 case kDataBrowserContainerIsSortableProperty
:
1815 case kDataBrowserContainerIsOpenableProperty
:
1816 // right now default behaviour on these
1820 if ( item
!= NULL
){
1821 err
= item
->GetSetData( this, property
, itemData
, changeValue
);
1829 void wxMacDataItemBrowserControl::ItemNotification(
1830 DataBrowserItemID itemID
,
1831 DataBrowserItemNotification message
,
1832 DataBrowserItemDataRef itemData
)
1834 wxMacDataItem
* item
= (wxMacDataItem
*) itemID
;
1835 ItemNotification( item
, message
, itemData
);
1838 void wxMacDataItemBrowserControl::ItemNotification(
1839 const wxMacDataItem
* item
,
1840 DataBrowserItemNotification message
,
1841 DataBrowserItemDataRef itemData
)
1844 item
->Notification( this, message
, itemData
);
1847 unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem
* container
,
1848 bool recurse
, DataBrowserItemState state
) const
1850 ItemCount numItems
= 0;
1851 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID
)container
,
1852 recurse
, state
, &numItems
) );
1856 unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem
* container
,
1857 bool recurse
) const
1859 return GetItemCount( container
, recurse
, kDataBrowserItemIsSelected
);
1863 void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem
* container
,
1864 bool recurse
, DataBrowserItemState state
, wxArrayMacDataItemPtr
&items
) const
1866 Handle handle
= NewHandle(0);
1867 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID
)container
,
1868 recurse
, state
, handle
) );
1870 int itemCount
= GetHandleSize(handle
)/sizeof(DataBrowserItemID
);
1872 wxMacDataItemPtr
* itemsArray
= (wxMacDataItemPtr
*) *handle
;
1873 for ( int i
= 0; i
< itemCount
; ++i
)
1875 items
.Add(itemsArray
[i
]);
1878 DisposeHandle( handle
);
1881 unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem
* item
) const
1883 DataBrowserTableViewRowIndex row
;
1884 OSStatus err
= GetItemRow( (DataBrowserItemID
) item
, &row
);
1885 wxASSERT( err
== noErr
);
1889 wxMacDataItem
* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n
) const
1891 DataBrowserItemID id
;
1892 OSStatus err
= GetItemID( (DataBrowserTableViewRowIndex
) n
, &id
);
1893 wxASSERT( err
== noErr
);
1894 return (wxMacDataItem
*) id
;
1897 void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem
*container
,
1898 const wxMacDataItem
*item
, DataBrowserPropertyID property
) const
1900 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, 1,
1901 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1904 void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem
*container
,
1905 wxArrayMacDataItemPtr
&itemArray
, DataBrowserPropertyID property
) const
1907 unsigned int noItems
= itemArray
.GetCount();
1908 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1909 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1910 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1912 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID
)container
, noItems
,
1913 items
, kDataBrowserItemNoProperty
/* notSorted */, property
) );
1917 void wxMacDataItemBrowserControl::InsertColumn(int colId
, DataBrowserPropertyType colType
,
1918 const wxString
& title
, SInt16 just
, int defaultWidth
)
1920 DataBrowserListViewColumnDesc columnDesc
;
1921 columnDesc
.headerBtnDesc
.titleOffset
= 0;
1922 columnDesc
.headerBtnDesc
.version
= kDataBrowserListViewLatestHeaderDesc
;
1924 columnDesc
.headerBtnDesc
.btnFontStyle
.flags
=
1925 kControlUseFontMask
| kControlUseJustMask
;
1927 columnDesc
.headerBtnDesc
.btnContentInfo
.contentType
= kControlContentTextOnly
;
1928 columnDesc
.headerBtnDesc
.btnFontStyle
.just
= just
;
1929 columnDesc
.headerBtnDesc
.btnFontStyle
.font
= kControlFontViewSystemFont
;
1930 columnDesc
.headerBtnDesc
.btnFontStyle
.style
= normal
;
1932 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1933 // defined for other modes?
1936 enc
= m_font
.GetEncoding();
1938 enc
= wxLocale::GetSystemEncoding();
1939 wxMacCFStringHolder cfTitle
;
1940 cfTitle
.Assign( title
, enc
);
1941 columnDesc
.headerBtnDesc
.titleString
= cfTitle
;
1943 columnDesc
.headerBtnDesc
.minimumWidth
= 0;
1944 columnDesc
.headerBtnDesc
.maximumWidth
= 30000;
1946 columnDesc
.propertyDesc
.propertyID
= (kMinColumnId
+ colId
);
1947 columnDesc
.propertyDesc
.propertyType
= colType
;
1948 columnDesc
.propertyDesc
.propertyFlags
= kDataBrowserListViewSortableColumn
;
1949 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
1950 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewTypeSelectColumn
;
1952 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
1953 columnDesc
.propertyDesc
.propertyFlags
|= kDataBrowserListViewNoGapForIconInHeaderButton
;
1956 verify_noerr( AddColumn( &columnDesc
, kDataBrowserListViewAppendColumn
) );
1958 if (defaultWidth
> 0){
1959 SetColumnWidth(colId
, defaultWidth
);
1964 void wxMacDataItemBrowserControl::SetColumnWidth(int colId
, int width
)
1966 DataBrowserPropertyID id
;
1967 GetColumnIDFromIndex(colId
, &id
);
1968 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id
, width
));
1971 int wxMacDataItemBrowserControl::GetColumnWidth(int colId
)
1973 DataBrowserPropertyID id
;
1974 GetColumnIDFromIndex(colId
, &id
);
1976 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id
, &result
));
1980 void wxMacDataItemBrowserControl::AddItem(wxMacDataItem
*container
, wxMacDataItem
*item
)
1982 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, 1,
1983 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
) );
1986 void wxMacDataItemBrowserControl::AddItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
1988 unsigned int noItems
= itemArray
.GetCount();
1989 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
1990 for ( unsigned int i
= 0; i
< noItems
; ++i
)
1991 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
1993 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID
)container
, noItems
,
1994 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
) );
1998 void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem
*container
, wxMacDataItem
* item
)
2000 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 1,
2001 (DataBrowserItemID
*) &item
, kDataBrowserItemNoProperty
);
2002 verify_noerr( err
);
2005 void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem
*container
, wxArrayMacDataItemPtr
&itemArray
)
2007 unsigned int noItems
= itemArray
.GetCount();
2008 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
2009 for ( unsigned int i
= 0; i
< noItems
; ++i
)
2010 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
2012 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, noItems
,
2013 (DataBrowserItemID
*) items
, kDataBrowserItemNoProperty
);
2014 verify_noerr( err
);
2018 void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem
*container
)
2020 OSStatus err
= wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID
)container
, 0 , NULL
, kDataBrowserItemNoProperty
);
2021 verify_noerr( err
);
2024 void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem
* item
, DataBrowserSetOption option
)
2026 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID
*) &item
, option
));
2029 void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option
)
2031 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL
, option
));
2034 void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr
&itemArray
, DataBrowserSetOption option
)
2036 unsigned int noItems
= itemArray
.GetCount();
2037 DataBrowserItemID
*items
= new DataBrowserItemID
[noItems
];
2038 for ( unsigned int i
= 0; i
< noItems
; ++i
)
2039 items
[i
] = (DataBrowserItemID
) itemArray
[i
];
2041 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems
, (DataBrowserItemID
*) items
, option
));
2045 Boolean
wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem
* item
) const
2047 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID
) item
);
2050 void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem
* item
, DataBrowserRevealOptions options
)
2052 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID
) item
, kDataBrowserNoItem
, options
) );
2055 void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr
* first
, wxMacDataItemPtr
* last
) const
2057 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID
*) first
, (DataBrowserItemID
*) last
) );
2060 wxClientDataType
wxMacDataItemBrowserControl::GetClientDataType() const
2062 return m_clientDataItemsType
;
2064 void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType
)
2066 m_clientDataItemsType
= clientDataItemsType
;
2069 unsigned int wxMacDataItemBrowserControl::MacGetCount() const
2071 return GetItemCount(wxMacDataBrowserRootContainer
,false,kDataBrowserItemAnyState
);
2074 void wxMacDataItemBrowserControl::MacDelete( unsigned int n
)
2076 wxMacDataItem
* item
= (wxMacDataItem
*)GetItemFromLine( n
);
2077 RemoveItem( wxMacDataBrowserRootContainer
, item
);
2080 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
, const wxString
& text
, int column
)
2082 wxMacDataItem
* newItem
= CreateItem();
2083 newItem
->SetLabel( text
);
2085 newItem
->SetColumn( kMinColumnId
+ column
);
2087 if ( m_sortOrder
== SortOrder_None
)
2089 // increase the order of the lines to be shifted
2090 unsigned int lines
= MacGetCount();
2091 for ( unsigned int i
= n
; i
< lines
; ++i
)
2093 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
2094 iter
->SetOrder( iter
->GetOrder() + 1 );
2097 SInt32 frontLineOrder
= 0;
2100 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
2101 frontLineOrder
= iter
->GetOrder();
2103 newItem
->SetOrder( frontLineOrder
+ 1 );
2106 AddItem( wxMacDataBrowserRootContainer
, newItem
);
2109 void wxMacDataItemBrowserControl::MacInsert( unsigned int n
, const wxArrayString
& items
, int column
)
2111 size_t itemsCount
= items
.GetCount();
2112 if ( itemsCount
== 0 )
2115 SInt32 frontLineOrder
= 0;
2117 if ( m_sortOrder
== SortOrder_None
)
2119 // increase the order of the lines to be shifted
2120 unsigned int lines
= MacGetCount();
2121 for ( unsigned int i
= n
; i
< lines
; ++i
)
2123 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(i
);
2124 iter
->SetOrder( iter
->GetOrder() + itemsCount
);
2128 wxMacDataItem
* iter
= (wxMacDataItem
*) GetItemFromLine(n
-1);
2129 frontLineOrder
= iter
->GetOrder();
2133 wxArrayMacDataItemPtr ids
;
2134 ids
.SetCount( itemsCount
);
2136 for ( unsigned int i
= 0; i
< itemsCount
; ++i
)
2138 wxMacDataItem
* item
= CreateItem();
2139 item
->SetLabel( items
[i
]);
2141 item
->SetColumn( kMinColumnId
+ column
);
2143 if ( m_sortOrder
== SortOrder_None
)
2144 item
->SetOrder( frontLineOrder
+ 1 + i
);
2149 AddItems( wxMacDataBrowserRootContainer
, ids
);
2152 int wxMacDataItemBrowserControl::MacAppend( const wxString
& text
)
2154 wxMacDataItem
* item
= CreateItem();
2155 item
->SetLabel( text
);
2156 if ( m_sortOrder
== SortOrder_None
)
2158 unsigned int lines
= MacGetCount();
2160 item
->SetOrder( 1 );
2163 wxMacDataItem
* frontItem
= (wxMacDataItem
*) GetItemFromLine(lines
-1);
2164 item
->SetOrder( frontItem
->GetOrder() + 1 );
2167 AddItem( wxMacDataBrowserRootContainer
, item
);
2169 return GetLineFromItem(item
);
2172 void wxMacDataItemBrowserControl::MacClear()
2174 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2175 RemoveAllItems(wxMacDataBrowserRootContainer
);
2178 void wxMacDataItemBrowserControl::MacDeselectAll()
2180 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2181 SetSelectedAllItems( kDataBrowserItemsRemove
);
2184 void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n
, bool select
, bool multi
)
2186 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
2187 wxMacDataItemBrowserSelectionSuppressor
suppressor(this);
2189 if ( IsItemSelected( item
) != select
)
2192 SetSelectedItem( item
, multi
? kDataBrowserItemsAdd
: kDataBrowserItemsAssign
);
2194 SetSelectedItem( item
, kDataBrowserItemsRemove
);
2200 bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n
) const
2202 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine(n
);
2203 return IsItemSelected( item
);
2206 int wxMacDataItemBrowserControl::MacGetSelection() const
2208 wxMacDataItemPtr first
, last
;
2209 GetSelectionAnchor( &first
, &last
);
2211 if ( first
!= NULL
)
2213 return GetLineFromItem( first
);
2219 int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt
& aSelections
) const
2221 aSelections
.Empty();
2222 wxArrayMacDataItemPtr selectedItems
;
2223 GetItems( wxMacDataBrowserRootContainer
, false , kDataBrowserItemIsSelected
, selectedItems
);
2225 int count
= selectedItems
.GetCount();
2227 for ( int i
= 0; i
< count
; ++i
)
2229 aSelections
.Add(GetLineFromItem(selectedItems
[i
]));
2235 void wxMacDataItemBrowserControl::MacSetString( unsigned int n
, const wxString
& text
)
2237 // as we don't store the strings we only have to issue a redraw
2238 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2239 item
->SetLabel( text
);
2240 UpdateItem( wxMacDataBrowserRootContainer
, item
, kTextColumnId
);
2243 wxString
wxMacDataItemBrowserControl::MacGetString( unsigned int n
) const
2245 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2246 return item
->GetLabel();
2249 void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n
, void * data
)
2251 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2252 item
->SetData( data
);
2253 // not displayed, therefore no Update infos to DataBrowser
2256 void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n
) const
2258 wxMacDataItem
* item
= (wxMacDataItem
*) GetItemFromLine( n
);
2259 return item
->GetData();
2262 void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n
)
2264 RevealItem( GetItemFromLine( n
) , kDataBrowserRevealWithoutSelecting
);
2273 OSStatus
wxMacControl::SetTabEnabled( SInt16 tabNo
, bool enable
)
2275 return ::SetTabEnabled( m_controlRef
, tabNo
, enable
);
2282 #ifdef __WXMAC_OSX__
2283 // snippets from Sketch Sample from Apple :
2285 #define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc"
2288 This function locates, opens, and returns the profile reference for the calibrated
2289 Generic RGB color space. It is up to the caller to call CMCloseProfile when done
2290 with the profile reference this function returns.
2292 CMProfileRef
wxMacOpenGenericProfile()
2294 static CMProfileRef cachedRGBProfileRef
= NULL
;
2296 // we only create the profile reference once
2297 if (cachedRGBProfileRef
== NULL
)
2299 CMProfileLocation loc
;
2301 loc
.locType
= cmPathBasedProfile
;
2302 strcpy(loc
.u
.pathLoc
.path
, kGenericRGBProfilePathStr
);
2304 verify_noerr( CMOpenProfile(&cachedRGBProfileRef
, &loc
) );
2307 // clone the profile reference so that the caller has their own reference, not our cached one
2308 if (cachedRGBProfileRef
)
2309 CMCloneProfileRef(cachedRGBProfileRef
);
2311 return cachedRGBProfileRef
;
2315 Return the generic RGB color space. This is a 'get' function and the caller should
2316 not release the returned value unless the caller retains it first. Usually callers
2317 of this routine will immediately use the returned colorspace with CoreGraphics
2318 so they typically do not need to retain it themselves.
2320 This function creates the generic RGB color space once and hangs onto it so it can
2321 return it whenever this function is called.
2324 CGColorSpaceRef
wxMacGetGenericRGBColorSpace()
2326 static wxMacCFRefHolder
<CGColorSpaceRef
> genericRGBColorSpace
;
2328 if (genericRGBColorSpace
== NULL
)
2330 if ( UMAGetSystemVersion() >= 0x1040 )
2332 genericRGBColorSpace
.Set( CGColorSpaceCreateWithName( CFSTR("kCGColorSpaceGenericRGB") ) );
2336 CMProfileRef genericRGBProfile
= wxMacOpenGenericProfile();
2338 if (genericRGBProfile
)
2340 genericRGBColorSpace
.Set( CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile
) );
2342 wxASSERT_MSG( genericRGBColorSpace
!= NULL
, wxT("couldn't create the generic RGB color space") );
2344 // we opened the profile so it is up to us to close it
2345 CMCloseProfile(genericRGBProfile
);
2350 return genericRGBColorSpace
;
2356 wxMacPortSaver::wxMacPortSaver( GrafPtr port
)
2358 ::GetPort( &m_port
);
2362 wxMacPortSaver::~wxMacPortSaver()
2364 ::SetPort( m_port
);
2368 void wxMacGlobalToLocal( WindowRef window
, Point
*pt
)
2370 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
2371 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
2372 HIViewRef contentView
;
2373 // TODO check toolbar offset
2374 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
2375 HIPointConvert( &p
, kHICoordSpace72DPIGlobal
, NULL
, kHICoordSpaceView
, contentView
);
2379 QDGlobalToLocalPoint( GetWindowPort(window
), pt
) ;
2383 void wxMacLocalToGlobal( WindowRef window
, Point
*pt
)
2385 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
2386 HIPoint p
= CGPointMake( pt
->h
, pt
->v
);
2387 HIViewRef contentView
;
2388 // TODO check toolbar offset
2389 HIViewFindByID( HIViewGetRoot( window
), kHIViewWindowContentID
, &contentView
) ;
2390 HIPointConvert( &p
, kHICoordSpaceView
, contentView
, kHICoordSpace72DPIGlobal
, NULL
);
2394 QDLocalToGlobalPoint( GetWindowPort(window
), pt
) ;