]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/utils.cpp
correct hhp2cached path
[wxWidgets.git] / src / mac / carbon / utils.cpp
index cd21f9999a649cc405c99d0ead2b6e8fcc6dd8bf..02f46c0bc5f69b170aa8b6e25a56d72e6556ee0f 100644 (file)
@@ -37,9 +37,8 @@
 
 // #include "MoreFilesX.h"
 
-#ifndef __DARWIN__
-    #include <Threads.h>
-    #include <Sound.h>
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+    #include <AudioToolbox/AudioServices.h>
 #endif
 
 #if wxUSE_GUI
@@ -87,8 +86,16 @@ extern bool WXDLLEXPORT wxIsDebuggerRunning()
 // Emit a beeeeeep
 void wxBell()
 {
-#ifndef __LP64__
-    SysBeep(30);
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+    if ( AudioServicesPlayAlertSound )
+        AudioServicesPlayAlertSound(kUserPreferredAlert);
+    else
+#endif
+#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
+        SysBeep(30);
+#else
+    {
+    }
 #endif
 }
 
@@ -126,6 +133,8 @@ void wxBeginBusyCursor(const wxCursor *cursor)
     {
         gMacStoredActiveCursor = gMacCurrentCursor;
         cursor->MacInstall();
+
+        wxSetCursor(*cursor);
     }
     //else: nothing to do, already set
 }
@@ -140,6 +149,8 @@ void wxEndBusyCursor()
     {
         gMacStoredActiveCursor.MacInstall();
         gMacStoredActiveCursor = wxNullCursor;
+
+        wxSetCursor(wxNullCursor);
     }
 }
 
@@ -194,6 +205,8 @@ void wxGetMousePosition( int* x, int* y )
     GetGlobalMouse(&pt);
     *x = pt.h;
     *y = pt.v;
+#else
+    // TODO
 #endif
 };
 
@@ -218,7 +231,7 @@ int wxDisplayDepth()
 
     return theDepth;
 #else
-    return 32;
+    return 32; // TODO
 #endif
 }
 
@@ -264,7 +277,7 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height)
         *height = bounds.size.height;
 #else
     int w, h;
-    wxDisplaySize(&w,&h); 
+    wxDisplaySize(&w,&h);
     if ( x )
         *x = 0;
     if ( y )
@@ -297,14 +310,16 @@ wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
 
 #if wxUSE_BASE
 
+#include <sys/utsname.h>
+
 wxString wxGetOsDescription()
 {
-#ifdef WXWIN_OS_DESCRIPTION
-    // use configure generated description if available
-    return wxString(wxT("MacOS (")) + wxT(WXWIN_OS_DESCRIPTION) + wxString(wxT(")"));
-#else
-    return wxT("MacOS"); //TODO:define further
-#endif
+    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__
@@ -379,48 +394,34 @@ wxString wxMacMakeStringFromPascal( ConstStringPtr from )
 // Common Event Support
 // ----------------------------------------------------------------------------
 
-extern ProcessSerialNumber gAppProcess;
-
 void wxMacWakeUp()
 {
-    ProcessSerialNumber psn;
-    Boolean isSame;
-    psn.highLongOfPSN = 0;
-    psn.lowLongOfPSN = kCurrentProcess;
-    SameProcess( &gAppProcess , &psn , &isSame );
-    if ( isSame )
-    {
-        OSStatus err = noErr;
+    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
+    // 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 );
     }
-    else
+    if ( err == noErr )
     {
-        WakeUpProcess( &gAppProcess );
+
+        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
@@ -481,7 +482,7 @@ OSStatus wxMacCarbonEvent::SetParameter(EventParamName inName, EventParamType in
 
 IMPLEMENT_DYNAMIC_CLASS( wxMacControl , wxObject )
 
-wxMacControl::wxMacControl() 
+wxMacControl::wxMacControl()
 {
     Init();
 }
@@ -655,7 +656,29 @@ void wxMacControl::SuperChangedPosition()
 void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle )
 {
     m_font = font;
-#ifndef __LP64__
+#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 )
     {
@@ -711,8 +734,7 @@ void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , l
 
 void wxMacControl::SetBackgroundColour( const wxColour &WXUNUSED(col) )
 {
-    // TODO
-    // setting up a color proc is not recommended anymore
+//    HITextViewSetBackgroundColor( m_textView , color );
 }
 
 void wxMacControl::SetRange( SInt32 minimum , SInt32 maximum )
@@ -835,7 +857,18 @@ void wxMacControl::GetRect( Rect *r )
 
 void wxMacControl::GetRectInWindowCoords( Rect *r )
 {
-    UMAGetControlBoundsInWindowCoords( m_controlRef , r );
+    GetControlBounds( m_controlRef , r ) ;
+
+    WindowRef tlwref = GetControlOwner( m_controlRef ) ;
+
+    wxTopLevelWindowMac* tlwwx = wxFindWinFromMacWindow( tlwref ) ;
+    if ( tlwwx != NULL )
+    {
+        ControlRef rootControl = tlwwx->GetPeer()->GetControlRef() ;
+        HIPoint hiPoint = CGPointMake( 0 , 0 ) ;
+        HIViewConvertPoint( &hiPoint , HIViewGetSuperview(m_controlRef) , rootControl ) ;
+        OffsetRect( r , (short) hiPoint.x , (short) hiPoint.y ) ;
+    }
 }
 
 void wxMacControl::GetBestRect( Rect *r )
@@ -854,7 +887,7 @@ void wxMacControl::SetLabel( const wxString &title )
     else
         encoding = wxFont::GetDefaultEncoding();
 
-    UMASetControlTitle( m_controlRef , title , encoding );
+    SetControlTitleWithCFString( m_controlRef , wxCFStringRef( title , encoding ) );
 }
 
 void wxMacControl::GetFeatures( UInt32 * features )
@@ -1320,7 +1353,7 @@ void wxMacDataItem::SetColumn( short col )
 void wxMacDataItem::SetLabel( const wxString& str)
 {
     m_label = str;
-    m_cfLabel.Assign( str , wxLocale::GetSystemEncoding());
+    m_cfLabel = wxCFStringRef( str , wxLocale::GetSystemEncoding());
 }
 
 const wxString& wxMacDataItem::GetLabel() const
@@ -1527,7 +1560,7 @@ unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem* i
 {
     DataBrowserTableViewRowIndex row;
     OSStatus err = GetItemRow( (DataBrowserItemID) item , &row);
-    wxASSERT( err == noErr);
+    wxCHECK( err == noErr, (unsigned)-1 );
     return row;
 }
 
@@ -1535,7 +1568,7 @@ wxMacDataItem*  wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n) con
 {
     DataBrowserItemID id;
     OSStatus err =  GetItemID( (DataBrowserTableViewRowIndex) n , &id);
-    wxASSERT( err == noErr);
+    wxCHECK( err == noErr, NULL );
     return (wxMacDataItem*) id;
 }
 
@@ -1581,8 +1614,7 @@ void wxMacDataItemBrowserControl::InsertColumn(int colId, DataBrowserPropertyTyp
         enc = m_font.GetEncoding();
     else
         enc = wxLocale::GetSystemEncoding();
-    wxMacCFStringHolder cfTitle;
-    cfTitle.Assign( title, enc );
+    wxCFStringRef cfTitle( title, enc );
     columnDesc.headerBtnDesc.titleString = cfTitle;
 
     columnDesc.headerBtnDesc.minimumWidth = 0;
@@ -1879,9 +1911,18 @@ void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n )
     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 ) ;
-    SetScrollPosition( n * ((UInt32)height) , left ) ;
+    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 );
 }
@@ -1915,38 +1956,30 @@ OSStatus wxMacControl::SetTabEnabled( SInt16 tabNo , bool enable )
 
 CGColorSpaceRef wxMacGetGenericRGBColorSpace()
 {
-    static wxMacCFRefHolder<CGColorSpaceRef> genericRGBColorSpace;
+    static wxCFRef<CGColorSpaceRef> genericRGBColorSpace;
 
     if (genericRGBColorSpace == NULL)
     {
-        genericRGBColorSpace.Set( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB ) );
+        genericRGBColorSpace.reset( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB ) );
     }
 
     return genericRGBColorSpace;
 }
 
-CGColorRef wxMacCreateCGColorFromHITheme( ThemeBrush brush ) 
+CGColorRef wxMacCreateCGColorFromHITheme( ThemeBrush brush )
 {
     CGColorRef color ;
     HIThemeBrushCreateCGColor( brush, &color );
     return color;
 }
 
-#ifndef __LP64__
-
-wxMacPortSaver::wxMacPortSaver( GrafPtr port )
-{
-    ::GetPort( &m_port );
-    ::SetPort( port );
-}
+#if wxMAC_USE_QUICKDRAW
 
-wxMacPortSaver::~wxMacPortSaver()
+static inline void PointFromHIPoint(const HIPoint& p, Point *pt)
 {
-    ::SetPort( m_port );
+    pt->h = wx_static_cast(short, p.x);
+    pt->v = wx_static_cast(short, p.y);
 }
-#endif
-
-#if wxMAC_USE_QUICKDRAW
 
 void wxMacGlobalToLocal( WindowRef window , Point*pt )
 {
@@ -1955,8 +1988,7 @@ void wxMacGlobalToLocal( WindowRef window , Point*pt )
     // TODO check toolbar offset
     HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ;
     HIPointConvert( &p, kHICoordSpace72DPIGlobal, NULL, kHICoordSpaceView, contentView );
-    pt->h = p.x;
-    pt->v = p.y;
+    PointFromHIPoint(p, pt);
 }
 
 void wxMacLocalToGlobal( WindowRef window , Point*pt )
@@ -1966,9 +1998,13 @@ void wxMacLocalToGlobal( WindowRef window , Point*pt )
     // TODO check toolbar offset
     HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ;
     HIPointConvert( &p, kHICoordSpaceView, contentView, kHICoordSpace72DPIGlobal, NULL );
-    pt->h = p.x;
-    pt->v = p.y;
+    PointFromHIPoint(p, pt);
 }
-#endif
+
+#endif // wxMAC_USE_QUICKDRAW
 
 #endif // wxUSE_GUI
+
+#if wxUSE_BASE
+
+#endif