]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/utils.cpp
adding CoreText implementation
[wxWidgets.git] / src / mac / carbon / utils.cpp
index 3b74155503fa6686b3b483fdd1b4488c22349704..2ad859c32db6746caf6b007e5cf154efc54a1b6a 100644 (file)
@@ -189,10 +189,14 @@ bool wxCheckForInterrupt(wxWindow *WXUNUSED(wnd))
 
 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
@@ -204,6 +208,7 @@ bool wxColourDisplay()
 // Returns depth of screen
 int wxDisplayDepth()
 {
+#if wxMAC_USE_QUICKDRAW
     int theDepth = (int) CGDisplayBitsPerPixel(CGMainDisplayID());
     Rect globRect;
     SetRect(&globRect, -32760, -32760, 32760, 32760);
@@ -214,6 +219,9 @@ int wxDisplayDepth()
         theDepth = (**(**theMaxDevice).gdPMap).pixelSize;
 
     return theDepth;
+#else
+    return 32; // TODO 
+#endif
 }
 
 // Get size of display
@@ -243,6 +251,8 @@ void wxDisplaySizeMM(int *width, int *height)
 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);
@@ -254,6 +264,18 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height)
         *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 );
@@ -359,48 +381,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
@@ -457,6 +465,8 @@ OSStatus wxMacCarbonEvent::SetParameter(EventParamName inName, EventParamType in
 // Control Access Support
 // ----------------------------------------------------------------------------
 
+#if wxMAC_USE_QUICKDRAW
+
 IMPLEMENT_DYNAMIC_CLASS( wxMacControl , wxObject )
 
 wxMacControl::wxMacControl() 
@@ -687,10 +697,9 @@ void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , l
 #endif
 }
 
-void wxMacControl::SetBackground( const wxBrush &WXUNUSED(brush) )
+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 )
@@ -735,11 +744,7 @@ void wxMacControl::SetVisibility( bool visible , bool redraw )
 
 bool wxMacControl::IsEnabled() const
 {
-#if TARGET_API_MAC_OSX
     return IsControlEnabled( m_controlRef );
-#else
-    return IsControlActive( m_controlRef );
-#endif
 }
 
 bool wxMacControl::IsActive() const
@@ -817,7 +822,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 )
@@ -836,7 +852,7 @@ void wxMacControl::SetLabel( const wxString &title )
     else
         encoding = wxFont::GetDefaultEncoding();
 
-    UMASetControlTitle( m_controlRef , title , encoding );
+    SetControlTitleWithCFString( m_controlRef , wxMacCFStringHolder( title , encoding ) );
 }
 
 void wxMacControl::GetFeatures( UInt32 * features )
@@ -852,15 +868,10 @@ OSStatus wxMacControl::GetRegion( ControlPartCode partCode , RgnHandle region )
 
 OSStatus wxMacControl::SetZOrder( bool above , wxMacControl* other )
 {
-#if TARGET_API_MAC_OSX
     return HIViewSetZOrder( m_controlRef,above ? kHIViewZOrderAbove : kHIViewZOrderBelow,
        (other != NULL) ? other->m_controlRef : NULL);
-#else
-    return 0;
-#endif
 }
 
-#if TARGET_API_MAC_OSX
 // SetNeedsDisplay would not invalidate the children
 static void InvalidateControlAndChildren( HIViewRef control )
 {
@@ -883,13 +894,10 @@ static void InvalidateControlAndChildren( HIViewRef control )
         InvalidateControlAndChildren( child );
     }
 }
-#endif
 
 void wxMacControl::InvalidateWithChildren()
 {
-#if TARGET_API_MAC_OSX
     InvalidateControlAndChildren( m_controlRef );
-#endif
 }
 
 void wxMacControl::ScrollRect( wxRect *r , int dx , int dy )
@@ -997,11 +1005,7 @@ wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow* peer,
     if ( gDataBrowserItemNotificationUPP == NULL )
     {
         gDataBrowserItemNotificationUPP =
-#if TARGET_API_MAC_OSX
             (DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc);
-#else
-            NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc);
-#endif
     }
 
     DataBrowserCallbacks callbacks;
@@ -1873,9 +1877,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 );
 }
@@ -1891,41 +1904,12 @@ OSStatus wxMacControl::SetTabEnabled( SInt16 tabNo , bool enable )
     return ::SetTabEnabled( m_controlRef , tabNo , enable );
 }
 
+#endif
+
 //
 // Quartz Support
 //
 
-// snippets from Sketch Sample from Apple :
-
-#define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc"
-
-/*
-    This function locates, opens, and returns the profile reference for the calibrated
-    Generic RGB color space. It is up to the caller to call CMCloseProfile when done
-    with the profile reference this function returns.
-*/
-CMProfileRef wxMacOpenGenericProfile()
-{
-    static CMProfileRef cachedRGBProfileRef = NULL;
-
-    // we only create the profile reference once
-    if (cachedRGBProfileRef == NULL)
-    {
-        CMProfileLocation loc;
-
-        loc.locType = cmPathBasedProfile;
-        strcpy(loc.u.pathLoc.path, kGenericRGBProfilePathStr);
-
-        verify_noerr( CMOpenProfile(&cachedRGBProfileRef, &loc) );
-    }
-
-    // clone the profile reference so that the caller has their own reference, not our cached one
-    if (cachedRGBProfileRef)
-        CMCloneProfileRef(cachedRGBProfileRef);
-
-    return cachedRGBProfileRef;
-}
-
 /*
     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
@@ -1948,19 +1932,14 @@ CGColorSpaceRef wxMacGetGenericRGBColorSpace()
     return genericRGBColorSpace;
 }
 
-#ifndef __LP64__
-
-wxMacPortSaver::wxMacPortSaver( GrafPtr port )
+CGColorRef wxMacCreateCGColorFromHITheme( ThemeBrush brush ) 
 {
-    ::GetPort( &m_port );
-    ::SetPort( port );
+    CGColorRef color ;
+    HIThemeBrushCreateCGColor( brush, &color );
+    return color;
 }
 
-wxMacPortSaver::~wxMacPortSaver()
-{
-    ::SetPort( m_port );
-}
-#endif
+#if wxMAC_USE_QUICKDRAW
 
 void wxMacGlobalToLocal( WindowRef window , Point*pt )
 {
@@ -1983,5 +1962,10 @@ void wxMacLocalToGlobal( WindowRef window , Point*pt )
     pt->h = p.x;
     pt->v = p.y;
 }
+#endif
 
 #endif // wxUSE_GUI
+
+#if wxUSE_BASE
+
+#endif