X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1f0c8f31f407ecfce909060464c0ea655221cdab..47e175a24f862aa8b7ca7dd4a2bb5957991e7f2d:/src/osx/carbon/utils.cpp diff --git a/src/osx/carbon/utils.cpp b/src/osx/carbon/utils.cpp index 4192588d15..2d2b5ccdf9 100644 --- a/src/osx/carbon/utils.cpp +++ b/src/osx/carbon/utils.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/mac/carbon/utils.cpp +// Name: src/osx/carbon/utils.cpp // Purpose: Various utilities // Author: Stefan Csomor // Modified by: @@ -9,6 +9,7 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// + #include "wx/wxprec.h" #include "wx/utils.h" @@ -24,10 +25,6 @@ #include "wx/apptrait.h" -#if wxUSE_GUI - #include "wx/osx/uma.h" -#endif - #include #include @@ -41,85 +38,34 @@ #include #endif +#include "wx/osx/private.h" #if wxUSE_GUI - #include - #include #include "wx/osx/private/timer.h" #endif // wxUSE_GUI #include "wx/evtloop.h" -#include "wx/osx/private.h" - -#if defined(__MWERKS__) && wxUSE_UNICODE -#if __MWERKS__ < 0x4100 - #include -#endif -#endif - -#if wxUSE_BASE - -// our OS version is the same in non GUI and GUI cases -wxOperatingSystemId wxGetOsVersion(int *majorVsn, int *minorVsn) -{ - SInt32 theSystem; - Gestalt(gestaltSystemVersion, &theSystem); - if ( majorVsn != NULL ) - *majorVsn = (theSystem >> 8); - - if ( minorVsn != NULL ) - *minorVsn = (theSystem & 0xFF); - -#if defined( __DARWIN__ ) - return wxOS_MAC_OSX_DARWIN; -#else - return wxOS_MAC_OS; -#endif -} - -extern bool WXDLLEXPORT wxIsDebuggerRunning() -{ - // TODO : try to find out ... - return false; -} +#if wxUSE_GUI // Emit a beeeeeep void wxBell() { #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 - if ( AudioServicesPlayAlertSound ) + if ( AudioServicesPlayAlertSound != NULL ) AudioServicesPlayAlertSound(kUserPreferredAlert); else #endif #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - SysBeep(30); + AlertSoundPlay(); #else { } #endif } - -#endif // wxUSE_BASE - -#if wxUSE_GUI - -wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const -{ - // We suppose that toolkit version is the same as OS version under Mac - wxGetOsVersion(verMaj, verMin); - - return wxPORT_MAC; -} - -wxEventLoopBase* wxGUIAppTraits::CreateEventLoop() -{ - return new wxEventLoop; -} - wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer) { - return new wxCarbonTimerImpl(timer); + return new wxOSXTimerImpl(timer); } int gs_wxBusyCursorCount = 0; @@ -164,807 +110,134 @@ bool wxIsBusy() #if wxUSE_BASE -wxString wxMacFindFolderNoSeparator( short vol, - OSType folderType, - Boolean createFolder) -{ - FSRef fsRef; - wxString strDir; - - if ( FSFindFolder( vol, folderType, createFolder, &fsRef) == noErr) - { - strDir = wxMacFSRefToPath( &fsRef ); - } - - return strDir; -} - -wxString wxMacFindFolder( short vol, - OSType folderType, - Boolean createFolder) -{ - return wxMacFindFolderNoSeparator(vol, folderType, createFolder) + wxFILE_SEP_PATH; -} - -#endif // wxUSE_BASE - -#if wxUSE_GUI - -// Check whether this window wants to process messages, e.g. Stop button -// in long calculations. -bool wxCheckForInterrupt(wxWindow *WXUNUSED(wnd)) -{ - // TODO - return false; -} - -void wxGetMousePosition( int* x, int* y ) -{ -#if wxMAC_USE_QUICKDRAW - Point pt; - GetGlobalMouse(&pt); - *x = pt.h; - *y = pt.v; -#else - // TODO -#endif -}; - -// Return true if we have a colour display -bool wxColourDisplay() -{ - return true; -} - -// Returns depth of screen -int wxDisplayDepth() -{ -#if wxMAC_USE_QUICKDRAW - int theDepth = (int) CGDisplayBitsPerPixel(CGMainDisplayID()); - Rect globRect; - SetRect(&globRect, -32760, -32760, 32760, 32760); - GDHandle theMaxDevice; - - theMaxDevice = GetMaxDevice(&globRect); - if (theMaxDevice != NULL) - theDepth = (**(**theMaxDevice).gdPMap).pixelSize; - - return theDepth; -#else - return 32; // TODO -#endif -} - -// Get size of display -void wxDisplaySize(int *width, int *height) -{ - // TODO adapt for multi-displays - CGRect bounds = CGDisplayBounds(CGMainDisplayID()); - if ( width ) - *width = (int)bounds.size.width ; - if ( height ) - *height = (int)bounds.size.height; -} - -void wxDisplaySizeMM(int *width, int *height) -{ - wxDisplaySize(width, height); - // on mac 72 is fixed (at least now;-) - float cvPt2Mm = 25.4 / 72; - - if (width != NULL) - *width = int( *width * cvPt2Mm ); - - if (height != NULL) - *height = int( *height * cvPt2Mm ); -} - -void wxClientDisplayRect(int *x, int *y, int *width, int *height) -{ -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 -#if wxMAC_USE_QUICKDRAW - - HIRect bounds ; - HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay,kHICoordSpace72DPIGlobal, - &bounds); - if ( x ) - *x = bounds.origin.x; - if ( y ) - *y = bounds.origin.y; - if ( width ) - *width = bounds.size.width; - if ( height ) - *height = bounds.size.height; -#else - int w, h; - wxDisplaySize(&w,&h); - if ( x ) - *x = 0; - if ( y ) - *y = 24; - if ( width ) - *width = w; - if ( height ) - *height = h-24; -#endif -#else - Rect r; - GetAvailableWindowPositioningBounds( GetMainDevice() , &r ); - if ( x ) - *x = r.left; - if ( y ) - *y = r.top; - if ( width ) - *width = r.right - r.left; - if ( height ) - *height = r.bottom - r.top; -#endif -} - -wxWindow* wxFindWindowAtPoint(const wxPoint& pt) -{ - return wxGenericFindWindowAtPoint(pt); -} - -#endif // wxUSE_GUI - -#if wxUSE_BASE - -#include - -wxString wxGetOsDescription() -{ - struct utsname name; - uname(&name); - return wxString::Format(_T("Mac OS X (%s %s %s)"), - wxString::FromAscii(name.sysname).c_str(), - wxString::FromAscii(name.release).c_str(), - wxString::FromAscii(name.machine).c_str()); -} - -#ifndef __DARWIN__ -wxString wxGetUserHome (const wxString& user) -{ - // TODO - return wxString(); -} - -bool wxGetDiskSpace(const wxString& path, wxDiskspaceSize_t *pTotal, wxDiskspaceSize_t *pFree) -{ - if ( path.empty() ) - return false; - - wxString p = path; - if (p[0u] == ':' ) - p = wxGetCwd() + p; - - int pos = p.Find(':'); - if ( pos != wxNOT_FOUND ) - p = p.Mid(1,pos); - - p = p + wxT(":"); - - OSErr err = noErr; - - FSRef fsRef; - err = wxMacPathToFSRef( p , &fsRef ); - if ( noErr == err ) - { - FSVolumeRefNum vRefNum; - err = FSGetVRefNum( &fsRef , &vRefNum ); - if ( noErr == err ) - { - UInt64 freeBytes , totalBytes; - err = FSGetVInfo( vRefNum , NULL , &freeBytes , &totalBytes ); - if ( noErr == err ) - { - if ( pTotal ) - *pTotal = wxDiskspaceSize_t( totalBytes ); - if ( pFree ) - *pFree = wxDiskspaceSize_t( freeBytes ); - } - } - } - - return err == noErr; -} -#endif // !__DARWIN__ - -//--------------------------------------------------------------------------- -// wxMac Specific utility functions -//--------------------------------------------------------------------------- - -void wxMacStringToPascal( const wxString&from , StringPtr to ) -{ - wxCharBuffer buf = from.mb_str( wxConvLocal ); - int len = strlen(buf); - - if ( len > 255 ) - len = 255; - to[0] = len; - memcpy( (char*) &to[1] , buf , len ); -} - -wxString wxMacMakeStringFromPascal( ConstStringPtr from ) -{ - return wxString( (char*) &from[1] , wxConvLocal , from[0] ); -} - -// ---------------------------------------------------------------------------- -// Common Event Support -// ---------------------------------------------------------------------------- - -void wxMacWakeUp() -{ - OSStatus err = noErr; - -#if 0 - // lead sometimes to race conditions, although all calls used should be thread safe ... - static wxMacCarbonEvent s_wakeupEvent; - if ( !s_wakeupEvent.IsValid() ) - { - err = s_wakeupEvent.Create( 'WXMC', 'WXMC', GetCurrentEventTime(), - kEventAttributeNone ); - } - if ( err == noErr ) - { - - if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent ) ) - return; - s_wakeupEvent.SetCurrentTime(); - err = PostEventToQueue(GetMainEventQueue(), s_wakeupEvent, - kEventPriorityHigh ); - } -#else - wxMacCarbonEvent wakeupEvent; - wakeupEvent.Create( 'WXMC', 'WXMC', GetCurrentEventTime(), - kEventAttributeNone ); - err = PostEventToQueue(GetMainEventQueue(), wakeupEvent, - kEventPriorityHigh ); -#endif -} - -#endif // wxUSE_BASE - -#if wxUSE_GUI - -// ---------------------------------------------------------------------------- -// Native Struct Conversions -// ---------------------------------------------------------------------------- - -void wxMacRectToNative( const wxRect *wx , Rect *n ) -{ - n->left = wx->x; - n->top = wx->y; - n->right = wx->x + wx->width; - n->bottom = wx->y + wx->height; -} - -void wxMacNativeToRect( const Rect *n , wxRect* wx ) -{ - wx->x = n->left; - wx->y = n->top; - wx->width = n->right - n->left; - wx->height = n->bottom - n->top; -} - -void wxMacPointToNative( const wxPoint* wx , Point *n ) -{ - n->h = wx->x; - n->v = wx->y; -} - -void wxMacNativeToPoint( const Point *n , wxPoint* wx ) -{ - wx->x = n->h; - wx->y = n->v; -} - -// ---------------------------------------------------------------------------- -// Carbon Event Support -// ---------------------------------------------------------------------------- - -OSStatus wxMacCarbonEvent::GetParameter(EventParamName inName, EventParamType inDesiredType, UInt32 inBufferSize, void * outData) -{ - return ::GetEventParameter( m_eventRef , inName , inDesiredType , NULL , inBufferSize , NULL , outData ); -} - -OSStatus wxMacCarbonEvent::SetParameter(EventParamName inName, EventParamType inType, UInt32 inBufferSize, const void * inData) -{ - return ::SetEventParameter( m_eventRef , inName , inType , inBufferSize , inData ); -} - -// ---------------------------------------------------------------------------- -// Control Access Support -// ---------------------------------------------------------------------------- - -#if wxMAC_USE_QUICKDRAW - -IMPLEMENT_DYNAMIC_CLASS( wxMacControl , wxObject ) - -wxMacControl::wxMacControl() -{ - Init(); -} - -wxMacControl::wxMacControl(wxWindow* peer , bool isRootControl ) -{ - Init(); - m_peer = peer; - m_isRootControl = isRootControl; -} - -wxMacControl::wxMacControl( wxWindow* peer , ControlRef control ) -{ - Init(); - m_peer = peer; - m_controlRef = control; -} - -wxMacControl::wxMacControl( wxWindow* peer , WXWidget control ) -{ - Init(); - m_peer = peer; - m_controlRef = (ControlRef) control; -} - -wxMacControl::~wxMacControl() -{ -} - -void wxMacControl::Init() -{ - m_peer = NULL; - m_controlRef = NULL; - m_needsFocusRect = false; - m_isRootControl = false; -} - -void wxMacControl::Dispose() -{ - wxASSERT_MSG( m_controlRef != NULL , wxT("Control Handle already NULL, Dispose called twice ?") ); - wxASSERT_MSG( IsValidControlHandle(m_controlRef) , wxT("Invalid Control Handle (maybe already released) in Dispose") ); - - // we cannot check the ref count here anymore, as autorelease objects might delete their refs later - // we can have situations when being embedded, where the control gets deleted behind our back, so only - // CFRelease if we are safe - if ( IsValidControlHandle(m_controlRef) ) - CFRelease(m_controlRef); - m_controlRef = NULL; -} - -void wxMacControl::SetReference( URefCon data ) -{ - SetControlReference( m_controlRef , data ); -} - -OSStatus wxMacControl::GetData(ControlPartCode inPartCode , ResType inTag , Size inBufferSize , void * inOutBuffer , Size * outActualSize ) const -{ - return ::GetControlData( m_controlRef , inPartCode , inTag , inBufferSize , inOutBuffer , outActualSize ); -} - -OSStatus wxMacControl::GetDataSize(ControlPartCode inPartCode , ResType inTag , Size * outActualSize ) const -{ - return ::GetControlDataSize( m_controlRef , inPartCode , inTag , outActualSize ); -} - -OSStatus wxMacControl::SetData(ControlPartCode inPartCode , ResType inTag , Size inSize , const void * inData) -{ - return ::SetControlData( m_controlRef , inPartCode , inTag , inSize , inData ); -} - -OSStatus wxMacControl::SendEvent( EventRef event , OptionBits inOptions ) -{ - return SendEventToEventTargetWithOptions( event, - HIObjectGetEventTarget( (HIObjectRef) m_controlRef ), inOptions ); -} - -OSStatus wxMacControl::SendHICommand( HICommand &command , OptionBits inOptions ) -{ - wxMacCarbonEvent event( kEventClassCommand , kEventCommandProcess ); - - event.SetParameter(kEventParamDirectObject,command); - - return SendEvent( event , inOptions ); -} - -OSStatus wxMacControl::SendHICommand( UInt32 commandID , OptionBits inOptions ) -{ - HICommand command; - - memset( &command, 0 , sizeof(command) ); - command.commandID = commandID; - return SendHICommand( command , inOptions ); -} - -void wxMacControl::Flash( ControlPartCode part , UInt32 ticks ) -{ - unsigned long finalTicks; - - HiliteControl( m_controlRef , part ); - Delay( ticks , &finalTicks ); - HiliteControl( m_controlRef , kControlNoPart ); -} - -SInt32 wxMacControl::GetValue() const -{ - return ::GetControl32BitValue( m_controlRef ); -} - -SInt32 wxMacControl::GetMaximum() const -{ - return ::GetControl32BitMaximum( m_controlRef ); -} - -SInt32 wxMacControl::GetMinimum() const -{ - return ::GetControl32BitMinimum( m_controlRef ); -} - -void wxMacControl::SetValue( SInt32 v ) -{ - ::SetControl32BitValue( m_controlRef , v ); -} - -void wxMacControl::SetMinimum( SInt32 v ) -{ - ::SetControl32BitMinimum( m_controlRef , v ); -} - -void wxMacControl::SetMaximum( SInt32 v ) -{ - ::SetControl32BitMaximum( m_controlRef , v ); -} - -void wxMacControl::SetValueAndRange( SInt32 value , SInt32 minimum , SInt32 maximum ) -{ - ::SetControl32BitMinimum( m_controlRef , minimum ); - ::SetControl32BitMaximum( m_controlRef , maximum ); - ::SetControl32BitValue( m_controlRef , value ); -} - -OSStatus wxMacControl::SetFocus( ControlFocusPart focusPart ) -{ - return SetKeyboardFocus( GetControlOwner( m_controlRef ), m_controlRef, focusPart ); -} - -bool wxMacControl::HasFocus() const -{ - ControlRef control; - GetKeyboardFocus( GetUserFocusWindow() , &control ); - return control == m_controlRef; -} - -void wxMacControl::SetNeedsFocusRect( bool needs ) -{ - m_needsFocusRect = needs; -} - -bool wxMacControl::NeedsFocusRect() const -{ - return m_needsFocusRect; -} - -void wxMacControl::VisibilityChanged(bool WXUNUSED(shown)) -{ -} - -void wxMacControl::SuperChangedPosition() -{ -} - -void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle ) -{ - m_font = font; -#if wxMAC_USE_CORE_TEXT - if ( UMAGetSystemVersion() >= 0x1050 ) - { - HIViewPartCode part = 0; - HIThemeTextHorizontalFlush flush = kHIThemeTextHorizontalFlushDefault; - if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_CENTER_HORIZONTAL ) - flush = kHIThemeTextHorizontalFlushCenter; - else if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_RIGHT ) - flush = kHIThemeTextHorizontalFlushRight; - HIViewSetTextFont( m_controlRef , part , (CTFontRef) font.MacGetCTFont() ); - HIViewSetTextHorizontalFlush( m_controlRef, part, flush ); - - if ( foreground != *wxBLACK ) - { - ControlFontStyleRec fontStyle; - foreground.GetRGBColor( &fontStyle.foreColor ); - fontStyle.flags = kControlUseForeColorMask; - ::SetControlFontStyle( m_controlRef , &fontStyle ); - } - - } -#endif -#if wxMAC_USE_ATSU_TEXT - ControlFontStyleRec fontStyle; - if ( font.MacGetThemeFontID() != kThemeCurrentPortFont ) - { - switch ( font.MacGetThemeFontID() ) - { - case kThemeSmallSystemFont : - fontStyle.font = kControlFontSmallSystemFont; - break; - - case 109 : // mini font - fontStyle.font = -5; - break; - - case kThemeSystemFont : - fontStyle.font = kControlFontBigSystemFont; - break; - - default : - fontStyle.font = kControlFontBigSystemFont; - break; - } - - fontStyle.flags = kControlUseFontMask; - } - else - { - fontStyle.font = font.MacGetFontNum(); - fontStyle.style = font.MacGetFontStyle(); - fontStyle.size = font.MacGetFontSize(); - fontStyle.flags = kControlUseFontMask | kControlUseFaceMask | kControlUseSizeMask; - } - - fontStyle.just = teJustLeft; - fontStyle.flags |= kControlUseJustMask; - if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_CENTER_HORIZONTAL ) - fontStyle.just = teJustCenter; - else if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_RIGHT ) - fontStyle.just = teJustRight; - - - // we only should do this in case of a non-standard color, as otherwise 'disabled' controls - // won't get grayed out by the system anymore - - if ( foreground != *wxBLACK ) - { - foreground.GetRGBColor( &fontStyle.foreColor ); - fontStyle.flags |= kControlUseForeColorMask; - } - - ::SetControlFontStyle( m_controlRef , &fontStyle ); -#endif -} - -void wxMacControl::SetBackgroundColour( const wxColour &WXUNUSED(col) ) -{ -// HITextViewSetBackgroundColor( m_textView , color ); -} - -void wxMacControl::SetRange( SInt32 minimum , SInt32 maximum ) -{ - ::SetControl32BitMinimum( m_controlRef , minimum ); - ::SetControl32BitMaximum( m_controlRef , maximum ); -} - -short wxMacControl::HandleKey( SInt16 keyCode, SInt16 charCode, EventModifiers modifiers ) -{ -#ifndef __LP64__ - return HandleControlKey( m_controlRef , keyCode , charCode , modifiers ); -#else - return 0; -#endif -} - -void wxMacControl::SetActionProc( ControlActionUPP actionProc ) -{ - SetControlAction( m_controlRef , actionProc ); -} - -void wxMacControl::SetViewSize( SInt32 viewSize ) -{ - SetControlViewSize(m_controlRef , viewSize ); -} - -SInt32 wxMacControl::GetViewSize() const -{ - return GetControlViewSize( m_controlRef ); -} - -bool wxMacControl::IsVisible() const -{ - return IsControlVisible( m_controlRef ); -} - -void wxMacControl::SetVisibility( bool visible , bool redraw ) -{ - SetControlVisibility( m_controlRef , visible , redraw ); -} - -bool wxMacControl::IsEnabled() const -{ - return IsControlEnabled( m_controlRef ); -} - -bool wxMacControl::IsActive() const -{ - return IsControlActive( m_controlRef ); -} - -void wxMacControl::Enable( bool enable ) -{ - if ( enable ) - EnableControl( m_controlRef ); - else - DisableControl( m_controlRef ); -} - -void wxMacControl::SetDrawingEnabled( bool enable ) -{ - HIViewSetDrawingEnabled( m_controlRef , enable ); -} - -bool wxMacControl::GetNeedsDisplay() const -{ - return HIViewGetNeedsDisplay( m_controlRef ); -} - -void wxMacControl::SetNeedsDisplay( RgnHandle where ) -{ - if ( !IsVisible() ) - return; - - HIViewSetNeedsDisplayInRegion( m_controlRef , where , true ); -} - -void wxMacControl::SetNeedsDisplay( Rect* where ) -{ - if ( !IsVisible() ) - return; - - if ( where != NULL ) - { - RgnHandle update = NewRgn(); - RectRgn( update , where ); - HIViewSetNeedsDisplayInRegion( m_controlRef , update , true ); - DisposeRgn( update ); - } - else - HIViewSetNeedsDisplay( m_controlRef , true ); -} - -void wxMacControl::Convert( wxPoint *pt , wxMacControl *from , wxMacControl *to ) -{ - HIPoint hiPoint; - - hiPoint.x = pt->x; - hiPoint.y = pt->y; - HIViewConvertPoint( &hiPoint , from->m_controlRef , to->m_controlRef ); - pt->x = (int)hiPoint.x; - pt->y = (int)hiPoint.y; -} - -void wxMacControl::SetRect( Rect *r ) -{ - //A HIRect is actually a CGRect on OSX - which consists of two structures - - //CGPoint and CGSize, which have two floats each - HIRect hir = { { r->left , r->top }, { r->right - r->left , r->bottom - r->top } }; - HIViewSetFrame ( m_controlRef , &hir ); - // eventuall we might have to do a SetVisibility( false , true ); - // before and a SetVisibility( true , true ); after -} - -void wxMacControl::GetRect( Rect *r ) -{ - GetControlBounds( m_controlRef , r ); -} - -void wxMacControl::GetRectInWindowCoords( Rect *r ) +wxString wxMacFindFolderNoSeparator( short vol, + OSType folderType, + Boolean createFolder) { - GetControlBounds( m_controlRef , r ) ; - - WindowRef tlwref = GetControlOwner( m_controlRef ) ; + FSRef fsRef; + wxString strDir; - wxNonOwnedWindow* tlwwx = wxFindWinFromMacWindow( tlwref ) ; - if ( tlwwx != NULL ) + if ( FSFindFolder( vol, folderType, createFolder, &fsRef) == noErr) { - ControlRef rootControl = tlwwx->GetPeer()->GetControlRef() ; - HIPoint hiPoint = CGPointMake( 0 , 0 ) ; - HIViewConvertPoint( &hiPoint , HIViewGetSuperview(m_controlRef) , rootControl ) ; - OffsetRect( r , (short) hiPoint.x , (short) hiPoint.y ) ; + strDir = wxMacFSRefToPath( &fsRef ); } + + return strDir; } -void wxMacControl::GetBestRect( Rect *r ) +wxString wxMacFindFolder( short vol, + OSType folderType, + Boolean createFolder) { - short baselineoffset; - - GetBestControlRect( m_controlRef , r , &baselineoffset ); + return wxMacFindFolderNoSeparator(vol, folderType, createFolder) + wxFILE_SEP_PATH; } -void wxMacControl::SetLabel( const wxString &title ) -{ - wxFontEncoding encoding; +#endif // wxUSE_BASE - if ( m_font.Ok() ) - encoding = m_font.GetEncoding(); - else - encoding = wxFont::GetDefaultEncoding(); - SetControlTitleWithCFString( m_controlRef , wxCFStringRef( title , encoding ) ); -} +// ============================================================================ +// GUI-only functions from now on +// ============================================================================ -void wxMacControl::GetFeatures( UInt32 * features ) -{ - GetControlFeatures( m_controlRef , features ); -} +#if wxUSE_GUI -OSStatus wxMacControl::GetRegion( ControlPartCode partCode , RgnHandle region ) -{ - OSStatus err = GetControlRegion( m_controlRef , partCode , region ); - return err; -} +// ---------------------------------------------------------------------------- +// Miscellaneous functions +// ---------------------------------------------------------------------------- -OSStatus wxMacControl::SetZOrder( bool above , wxMacControl* other ) +void wxGetMousePosition( int* x, int* y ) { - return HIViewSetZOrder( m_controlRef,above ? kHIViewZOrderAbove : kHIViewZOrderBelow, - (other != NULL) ? other->m_controlRef : NULL); -} + Point pt; + GetGlobalMouse(&pt); + if ( x ) + *x = pt.h; + if ( y ) + *y = pt.v; +}; -// SetNeedsDisplay would not invalidate the children -static void InvalidateControlAndChildren( HIViewRef control ) +void wxClientDisplayRect(int *x, int *y, int *width, int *height) { - HIViewSetNeedsDisplay( control , true ); - UInt16 childrenCount = 0; - OSStatus err = CountSubControls( control , &childrenCount ); - if ( err == errControlIsNotEmbedder ) - return; +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + HIRect bounds ; + HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay,kHICoordSpace72DPIGlobal, + &bounds); + if ( x ) + *x = bounds.origin.x; + if ( y ) + *y = bounds.origin.y; + if ( width ) + *width = bounds.size.width; + if ( height ) + *height = bounds.size.height; +#else + Rect r; + GetAvailableWindowPositioningBounds( GetMainDevice() , &r ); + if ( x ) + *x = r.left; + if ( y ) + *y = r.top; + if ( width ) + *width = r.right - r.left; + if ( height ) + *height = r.bottom - r.top; +#endif +} - wxASSERT_MSG( err == noErr , wxT("Unexpected error when accessing subcontrols") ); +#endif // wxUSE_GUI - for ( UInt16 i = childrenCount; i >=1; --i ) - { - HIViewRef child; +#if wxUSE_GUI - err = GetIndexedSubControl( control , i , & child ); - if ( err == errControlIsNotEmbedder ) - return; +// ---------------------------------------------------------------------------- +// Native Struct Conversions +// ---------------------------------------------------------------------------- - InvalidateControlAndChildren( child ); - } +void wxMacRectToNative( const wxRect *wx , Rect *n ) +{ + n->left = wx->x; + n->top = wx->y; + n->right = wx->x + wx->width; + n->bottom = wx->y + wx->height; } -void wxMacControl::InvalidateWithChildren() +void wxMacNativeToRect( const Rect *n , wxRect* wx ) { - InvalidateControlAndChildren( m_controlRef ); + wx->x = n->left; + wx->y = n->top; + wx->width = n->right - n->left; + wx->height = n->bottom - n->top; } -void wxMacControl::ScrollRect( wxRect *r , int dx , int dy ) +void wxMacPointToNative( const wxPoint* wx , Point *n ) { - wxASSERT( r != NULL ); + n->h = wx->x; + n->v = wx->y; +} - HIRect scrollarea = CGRectMake( r->x , r->y , r->width , r->height); - HIViewScrollRect ( m_controlRef , &scrollarea , dx ,dy ); +void wxMacNativeToPoint( const Point *n , wxPoint* wx ) +{ + wx->x = n->h; + wx->y = n->v; } -OSType wxMacCreator = 'WXMC'; -OSType wxMacControlProperty = 'MCCT'; +// ---------------------------------------------------------------------------- +// Carbon Event Support +// ---------------------------------------------------------------------------- -void wxMacControl::SetReferenceInNativeControl() +OSStatus wxMacCarbonEvent::GetParameter(EventParamName inName, EventParamType inDesiredType, UInt32 inBufferSize, void * outData) { - void * data = this; - verify_noerr( SetControlProperty ( m_controlRef , - wxMacCreator,wxMacControlProperty, sizeof(data), &data ) ); + return ::GetEventParameter( m_eventRef , inName , inDesiredType , NULL , inBufferSize , NULL , outData ); } -wxMacControl* wxMacControl::GetReferenceFromNativeControl(ControlRef control) +OSStatus wxMacCarbonEvent::SetParameter(EventParamName inName, EventParamType inType, UInt32 inBufferSize, const void * inData) { - wxMacControl* ctl = NULL; - ByteCount actualSize; - if ( GetControlProperty( control ,wxMacCreator,wxMacControlProperty, sizeof(ctl) , - &actualSize , &ctl ) == noErr ) - { - return ctl; - } - return NULL; + return ::SetEventParameter( m_eventRef , inName , inType , inBufferSize , inData ); } +// ---------------------------------------------------------------------------- +// Control Access Support +// ---------------------------------------------------------------------------- + + // ============================================================================ // DataBrowser Wrapper // ============================================================================ @@ -1080,7 +353,8 @@ OSStatus wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc *colu return AddDataBrowserListViewColumn( m_controlRef, columnDesc, position ); } -OSStatus wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position, DataBrowserTableViewColumnID* id ){ +OSStatus wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position, DataBrowserTableViewColumnID* id ) +{ return GetDataBrowserTableViewColumnProperty( m_controlRef, position, id ); } @@ -1301,6 +575,11 @@ OSStatus wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID pro return SetDataBrowserListViewDisclosureColumn( m_controlRef, property, expandableRows); } +OSStatus wxMacDataBrowserControl::GetItemPartBounds( DataBrowserItemID item, DataBrowserPropertyID property, DataBrowserPropertyPart part, Rect * bounds ) +{ + return GetDataBrowserItemPartBounds( m_controlRef, item, property, part, bounds); +} + // ============================================================================ // Higher-level Databrowser // ============================================================================ @@ -1310,10 +589,10 @@ OSStatus wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID pro wxMacDataItem::wxMacDataItem() { - m_data = NULL; +// m_data = NULL; m_order = 0; - m_colId = kTextColumnId; // for compat with existing wx*ListBox impls. +// m_colId = kTextColumnId; // for compat with existing wx*ListBox impls. } wxMacDataItem::~wxMacDataItem() @@ -1329,7 +608,7 @@ SInt32 wxMacDataItem::GetOrder() const { return m_order; } - +/* void wxMacDataItem::SetData( void* data) { m_data = data; @@ -1360,20 +639,16 @@ const wxString& wxMacDataItem::GetLabel() const { return m_label; } +*/ bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl *WXUNUSED(owner) , const wxMacDataItem* rhs, DataBrowserPropertyID sortProperty) const { - const wxMacDataItem* otherItem = wx_const_cast(wxMacDataItem*,rhs); bool retval = false; - if ( sortProperty == m_colId ){ - retval = m_label.CmpNoCase( otherItem->m_label) < 0; - } - - else if ( sortProperty == kNumericOrderColumnId ) - retval = m_order < otherItem->m_order; + if ( sortProperty == kNumericOrderColumnId ) + retval = m_order < rhs->m_order; return retval; } @@ -1386,25 +661,11 @@ OSStatus wxMacDataItem::GetSetData( wxMacDataItemBrowserControl *WXUNUSED(owner) OSStatus err = errDataBrowserPropertyNotSupported; if ( !changeValue ) { - if ( property == m_colId ){ - err = ::SetDataBrowserItemDataText( itemData, m_cfLabel ); - err = noErr; - } - else if ( property == kNumericOrderColumnId ){ + if ( property == kNumericOrderColumnId ) + { err = ::SetDataBrowserItemDataValue( itemData, m_order ); err = noErr; } - else{ - } - } - else - { - switch (property) - { - // no editable props here - default: - break; - } } return err; @@ -1426,11 +687,6 @@ wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow* peer , const m_clientDataItemsType = wxClientData_None; } -wxMacDataItem* wxMacDataItemBrowserControl::CreateItem() -{ - return new wxMacDataItem(); -} - wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl *browser) { m_former = browser->SuppressSelection(true); @@ -1456,13 +712,7 @@ Boolean wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID, { wxMacDataItem* itemOne = (wxMacDataItem*) itemOneID; wxMacDataItem* itemTwo = (wxMacDataItem*) itemTwoID; - return CompareItems( itemOne , itemTwo , sortProperty ); -} -Boolean wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem* itemOne, - const wxMacDataItem* itemTwo, - DataBrowserPropertyID sortProperty) -{ Boolean retval = false; if ( itemOne != NULL ) retval = itemOne->IsLessThan( this , itemTwo , sortProperty); @@ -1476,15 +726,6 @@ OSStatus wxMacDataItemBrowserControl::GetSetItemData( Boolean changeValue ) { wxMacDataItem* item = (wxMacDataItem*) itemID; - return GetSetItemData(item, property, itemData , changeValue ); -} - -OSStatus wxMacDataItemBrowserControl::GetSetItemData( - wxMacDataItem* item, - DataBrowserPropertyID property, - DataBrowserItemDataRef itemData, - Boolean changeValue ) -{ OSStatus err = errDataBrowserPropertyNotSupported; switch( property ) { @@ -1510,14 +751,6 @@ void wxMacDataItemBrowserControl::ItemNotification( DataBrowserItemDataRef itemData) { wxMacDataItem* item = (wxMacDataItem*) itemID; - ItemNotification( item , message, itemData); -} - -void wxMacDataItemBrowserControl::ItemNotification( - const wxMacDataItem* item, - DataBrowserItemNotification message, - DataBrowserItemDataRef itemData) -{ if (item != NULL) item->Notification( this, message, itemData); } @@ -1592,7 +825,9 @@ void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem *container, delete [] items; } -void wxMacDataItemBrowserControl::InsertColumn(int colId, DataBrowserPropertyType colType, +static int column_id_counter = 0; + +void wxMacDataItemBrowserControl::InsertColumn(int col, DataBrowserPropertyType colType, const wxString& title, SInt16 just, int defaultWidth) { DataBrowserListViewColumnDesc columnDesc; @@ -1610,7 +845,7 @@ void wxMacDataItemBrowserControl::InsertColumn(int colId, DataBrowserPropertyTyp // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is // defined for other modes? wxFontEncoding enc; - if ( m_font.Ok() ) + if ( m_font.IsOk() ) enc = m_font.GetEncoding(); else enc = wxLocale::GetSystemEncoding(); @@ -1620,18 +855,20 @@ void wxMacDataItemBrowserControl::InsertColumn(int colId, DataBrowserPropertyTyp columnDesc.headerBtnDesc.minimumWidth = 0; columnDesc.headerBtnDesc.maximumWidth = 30000; - columnDesc.propertyDesc.propertyID = (kMinColumnId + colId); + DataBrowserPropertyID id = kMinColumnId + column_id_counter; + column_id_counter++; + + columnDesc.propertyDesc.propertyID = id; columnDesc.propertyDesc.propertyType = colType; columnDesc.propertyDesc.propertyFlags = kDataBrowserListViewSortableColumn; columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn; columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton; - verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) ); + verify_noerr( AddColumn( &columnDesc, col ) ); if (defaultWidth > 0){ - SetColumnWidth(colId, defaultWidth); + SetColumnWidth(col, defaultWidth); } - } void wxMacDataItemBrowserControl::SetColumnWidth(int colId, int width) @@ -1690,6 +927,7 @@ void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem *container, wxArrayM void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem *container) { + SetScrollPosition(0, 0); OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, 0 , NULL , kDataBrowserItemNoProperty ); verify_noerr( err ); } @@ -1739,80 +977,39 @@ void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataI m_clientDataItemsType = clientDataItemsType; } -unsigned int wxMacDataItemBrowserControl::MacGetCount() const -{ - return GetItemCount(wxMacDataBrowserRootContainer,false,kDataBrowserItemAnyState); -} - void wxMacDataItemBrowserControl::MacDelete( unsigned int n ) { wxMacDataItem* item = (wxMacDataItem*)GetItemFromLine( n ); RemoveItem( wxMacDataBrowserRootContainer, item ); } -void wxMacDataItemBrowserControl::MacInsert( unsigned int n, - const wxArrayStringsAdapter& items, - int column ) +void wxMacDataItemBrowserControl::MacInsert( unsigned int n, wxMacDataItem* item) { - size_t itemsCount = items.GetCount(); - if ( itemsCount == 0 ) - return; - - SInt32 frontLineOrder = 0; - if ( m_sortOrder == SortOrder_None ) { + // increase the order of the lines to be shifted unsigned int lines = MacGetCount(); for ( unsigned int i = n; i < lines; ++i) { wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(i); - iter->SetOrder( iter->GetOrder() + itemsCount ); + iter->SetOrder( iter->GetOrder() + 1 ); } + +#if 0 + // I don't understand what this code is supposed to do, RR. + SInt32 frontLineOrder = 0; if ( n > 0 ) { wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(n-1); - frontLineOrder = iter->GetOrder(); + frontLineOrder = iter->GetOrder()+1; } +#else + item->SetOrder( n ); +#endif } - wxArrayMacDataItemPtr ids; - ids.SetCount( itemsCount ); - - for ( unsigned int i = 0; i < itemsCount; ++i ) - { - wxMacDataItem* item = CreateItem(); - item->SetLabel( items[i]); - if ( column != -1 ) - item->SetColumn( kMinColumnId + column ); - - if ( m_sortOrder == SortOrder_None ) - item->SetOrder( frontLineOrder + 1 + i ); - - ids[i] = item; - } - - AddItems( wxMacDataBrowserRootContainer, ids ); -} - -int wxMacDataItemBrowserControl::MacAppend( const wxString& text) -{ - wxMacDataItem* item = CreateItem(); - item->SetLabel( text ); - if ( m_sortOrder == SortOrder_None ) - { - unsigned int lines = MacGetCount(); - if ( lines == 0 ) - item->SetOrder( 1 ); - else - { - wxMacDataItem* frontItem = (wxMacDataItem*) GetItemFromLine(lines-1); - item->SetOrder( frontItem->GetOrder() + 1 ); - } - } AddItem( wxMacDataBrowserRootContainer, item ); - - return GetLineFromItem(item); } void wxMacDataItemBrowserControl::MacClear() @@ -1821,190 +1018,10 @@ void wxMacDataItemBrowserControl::MacClear() RemoveAllItems(wxMacDataBrowserRootContainer); } -void wxMacDataItemBrowserControl::MacDeselectAll() -{ - wxMacDataItemBrowserSelectionSuppressor suppressor(this); - SetSelectedAllItems( kDataBrowserItemsRemove ); -} - -void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n, bool select, bool multi ) -{ - wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine(n); - wxMacDataItemBrowserSelectionSuppressor suppressor(this); - - if ( IsItemSelected( item ) != select ) - { - if ( select ) - SetSelectedItem( item, multi ? kDataBrowserItemsAdd : kDataBrowserItemsAssign ); - else - SetSelectedItem( item, kDataBrowserItemsRemove ); - } - - MacScrollTo( n ); -} - -bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n ) const -{ - wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine(n); - return IsItemSelected( item ); -} - -int wxMacDataItemBrowserControl::MacGetSelection() const -{ - wxMacDataItemPtr first, last; - GetSelectionAnchor( &first, &last ); - - if ( first != NULL ) - { - return GetLineFromItem( first ); - } - - return -1; -} - -int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt& aSelections ) const -{ - aSelections.Empty(); - wxArrayMacDataItemPtr selectedItems; - GetItems( wxMacDataBrowserRootContainer, false , kDataBrowserItemIsSelected, selectedItems); - - int count = selectedItems.GetCount(); - - for ( int i = 0; i < count; ++i) - { - aSelections.Add(GetLineFromItem(selectedItems[i])); - } - - return count; -} - -void wxMacDataItemBrowserControl::MacSetString( unsigned int n, const wxString& text ) -{ - // as we don't store the strings we only have to issue a redraw - wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine( n); - item->SetLabel( text ); - UpdateItem( wxMacDataBrowserRootContainer, item , kTextColumnId ); -} - -wxString wxMacDataItemBrowserControl::MacGetString( unsigned int n ) const -{ - wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n ); - return item->GetLabel(); -} - -void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n, void * data) -{ - wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine( n); - item->SetData( data ); - // not displayed, therefore no Update infos to DataBrowser -} - -void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n) const -{ - wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n ); - return item->GetData(); -} - -void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n ) -{ - UInt32 top , left ; - GetScrollPosition( &top , &left ) ; - wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n ); - - // there is a bug in RevealItem that leads to situations - // in large lists, where the item does not get scrolled - // into sight, so we do a pre-scroll if necessary - UInt16 height ; - GetRowHeight( (DataBrowserItemID) item , &height ) ; - UInt32 linetop = n * ((UInt32) height ); - UInt32 linebottom = linetop + height; - Rect rect ; - GetRect( &rect ); - - if ( linetop < top || linebottom > (top + rect.bottom - rect.top ) ) - SetScrollPosition( wxMax( n-2, 0 ) * ((UInt32)height) , left ) ; - - RevealItem( item , kDataBrowserRevealWithoutSelecting ); -} - - - -// -// Tab Control -// - -OSStatus wxMacControl::SetTabEnabled( SInt16 tabNo , bool enable ) -{ - return ::SetTabEnabled( m_controlRef , tabNo , enable ); -} - -#endif - -// -// Quartz Support -// - -/* - Return the generic RGB color space. This is a 'get' function and the caller should - not release the returned value unless the caller retains it first. Usually callers - of this routine will immediately use the returned colorspace with CoreGraphics - so they typically do not need to retain it themselves. - - This function creates the generic RGB color space once and hangs onto it so it can - return it whenever this function is called. -*/ - -CGColorSpaceRef wxMacGetGenericRGBColorSpace() -{ - static wxCFRef genericRGBColorSpace; - - if (genericRGBColorSpace == NULL) - { - genericRGBColorSpace.reset( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB ) ); - } - - return genericRGBColorSpace; -} - -CGColorRef wxMacCreateCGColorFromHITheme( ThemeBrush brush ) -{ - CGColorRef color ; - HIThemeBrushCreateCGColor( brush, &color ); - return color; -} - -#if wxMAC_USE_QUICKDRAW - -static inline void PointFromHIPoint(const HIPoint& p, Point *pt) -{ - pt->h = wx_static_cast(short, p.x); - pt->v = wx_static_cast(short, p.y); -} - -void wxMacGlobalToLocal( WindowRef window , Point*pt ) -{ - HIPoint p = CGPointMake( pt->h, pt->v ); - HIViewRef contentView ; - // TODO check toolbar offset - HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ; - HIPointConvert( &p, kHICoordSpace72DPIGlobal, NULL, kHICoordSpaceView, contentView ); - PointFromHIPoint(p, pt); -} - -void wxMacLocalToGlobal( WindowRef window , Point*pt ) +unsigned int wxMacDataItemBrowserControl::MacGetCount() const { - HIPoint p = CGPointMake( pt->h, pt->v ); - HIViewRef contentView ; - // TODO check toolbar offset - HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ; - HIPointConvert( &p, kHICoordSpaceView, contentView, kHICoordSpace72DPIGlobal, NULL ); - PointFromHIPoint(p, pt); + return GetItemCount(wxMacDataBrowserRootContainer,false,kDataBrowserItemAnyState); } -#endif // wxMAC_USE_QUICKDRAW - #endif // wxUSE_GUI -#if wxUSE_BASE - -#endif