]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/window_osx.cpp
use wxOSX_USE_COCOA instead of __WXOSX_COCOA__ (which was checked incorrectly)
[wxWidgets.git] / src / osx / window_osx.cpp
index b9817fbfc108ed1af488756b191a5dcdbbfe0a20..1eb9d99b2869d28ff071ecad8af47004e30b0a83 100644 (file)
@@ -85,7 +85,6 @@
 BEGIN_EVENT_TABLE(wxWindowMac, wxWindowBase)
     EVT_NC_PAINT(wxWindowMac::OnNcPaint)
     EVT_ERASE_BACKGROUND(wxWindowMac::OnEraseBackground)
-    EVT_PAINT(wxWindowMac::OnPaint)
     EVT_MOUSE_EVENTS(wxWindowMac::OnMouseEvent)
 END_EVENT_TABLE()
 
@@ -196,13 +195,11 @@ wxWindowMac::~wxWindowMac()
 
 WXWidget wxWindowMac::GetHandle() const
 {
-    return (WXWidget) m_peer->GetWXWidget() ;
+    if ( m_peer )
+        return (WXWidget) m_peer->GetWXWidget() ;
+    return NULL;
 }
 
-//
-// TODO END move to window_osx.cpp
-//
-
 // ---------------------------------------------------------------------------
 // Utility Routines to move between different coordinate systems
 // ---------------------------------------------------------------------------
@@ -336,33 +333,26 @@ void wxWindowMac::DoSetWindowVariant( wxWindowVariant variant )
     m_peer->SetData<ControlSize>(kControlEntireControl, kControlSizeTag, &size ) ;
 #endif
 
-#if wxOSX_USE_COCOA_OR_CARBON
     wxFont font ;
 
-#if wxOSX_USE_ATSU_TEXT
-    ThemeFontID themeFont = kThemeSystemFont ;
-
-    // we will get that from the settings later
-    // and make this NORMAL later, but first
-    // we have a few calculations that we must fix
+    wxOSXSystemFont systemFont = wxOSX_SYSTEM_FONT_NORMAL ;
 
     switch ( variant )
     {
         case wxWINDOW_VARIANT_NORMAL :
-            themeFont = kThemeSystemFont ;
+            systemFont = wxOSX_SYSTEM_FONT_NORMAL ;
             break ;
 
         case wxWINDOW_VARIANT_SMALL :
-            themeFont = kThemeSmallSystemFont ;
+            systemFont = wxOSX_SYSTEM_FONT_SMALL ;
             break ;
 
         case wxWINDOW_VARIANT_MINI :
-            // not always defined in the headers
-            themeFont = 109 ;
+            systemFont = wxOSX_SYSTEM_FONT_MINI ;
             break ;
 
         case wxWINDOW_VARIANT_LARGE :
-            themeFont = kThemeSystemFont ;
+            systemFont = wxOSX_SYSTEM_FONT_NORMAL ;
             break ;
 
         default:
@@ -370,36 +360,9 @@ void wxWindowMac::DoSetWindowVariant( wxWindowVariant variant )
             break ;
     }
 
-    font.MacCreateFromThemeFont( themeFont ) ;
-#else
-    CTFontUIFontType themeFont = kCTFontSystemFontType ;
-    switch ( variant )
-    {
-        case wxWINDOW_VARIANT_NORMAL :
-            themeFont = kCTFontSystemFontType;
-            break ;
-
-        case wxWINDOW_VARIANT_SMALL :
-            themeFont = kCTFontSmallSystemFontType;
-            break ;
-
-        case wxWINDOW_VARIANT_MINI :
-            themeFont = kCTFontMiniSystemFontType;
-            break ;
-
-        case wxWINDOW_VARIANT_LARGE :
-            themeFont = kCTFontSystemFontType;
-            break ;
-
-        default:
-            wxFAIL_MSG(_T("unexpected window variant"));
-            break ;
-    }
-    font.MacCreateFromUIFont( themeFont ) ;
-#endif
+    font.CreateSystemFont( systemFont ) ;
 
     SetFont( font ) ;
-#endif
 }
 
 void wxWindowMac::MacUpdateControlFont()
@@ -442,11 +405,25 @@ bool wxWindowMac::SetBackgroundColour(const wxColour& col )
     return true ;
 }
 
+static bool wxIsWindowOrParentDisabled(wxWindow* w)
+{
+    while (w && !w->IsTopLevel())
+    {
+        if (!w->IsEnabled())
+            return true;
+        w = w->GetParent();
+    }
+    return false;
+}
+
 void wxWindowMac::SetFocus()
 {
     if ( !AcceptsFocus() )
             return ;
 
+    if (wxIsWindowOrParentDisabled((wxWindow*) this))
+        return;
+
     wxWindow* former = FindFocus() ;
     if ( former == this )
         return ;
@@ -783,16 +760,14 @@ void wxWindowMac::MacInvalidateBorders()
         return ;
 
     int outerBorder = MacGetLeftBorderSize() ;
-#if wxOSX_USE_CARBON
-    if ( m_peer->NeedsFocusRect() /* && m_peer->HasFocus() */ )
+
+    if ( m_peer->NeedsFocusRect() )
         outerBorder += 4 ;
-#endif
 
     if ( outerBorder == 0 )
         return ;
 
     // now we know that we have something to do at all
-    
 
     int tx,ty,tw,th;
     
@@ -834,6 +809,8 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
     int actualX = x;
     int actualY = y;
 
+#if 0
+    // min and max sizes are only for sizers, not for explicit size setting
     if ((m_minWidth != -1) && (actualWidth < m_minWidth))
         actualWidth = m_minWidth;
     if ((m_minHeight != -1) && (actualHeight < m_minHeight))
@@ -842,6 +819,7 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
         actualWidth = m_maxWidth;
     if ((m_maxHeight != -1) && (actualHeight > m_maxHeight))
         actualHeight = m_maxHeight;
+#endif
 
     bool doMove = false, doResize = false ;
 
@@ -1045,7 +1023,7 @@ void wxWindowMac::SetLabel(const wxString& title)
 {
     m_label = title ;
 
-    if ( m_peer && m_peer->IsOk() )
+    if ( m_peer && m_peer->IsOk() && !(IsKindOf( CLASSINFO(wxButton) ) && GetId() == wxID_HELP) )
         m_peer->SetLabel( wxStripMenuCodes(m_label, wxStrip_Mnemonics), GetFont().GetEncoding() ) ;
 
     // do not trigger refreshes upon invisible and possible partly created objects
@@ -1125,8 +1103,11 @@ int wxWindowMac::GetCharWidth() const
     return width;
 }
 
-void wxWindowMac::GetTextExtent(const wxString& str, int *x, int *y,
-                           int *descent, int *externalLeading, const wxFont *theFont ) const
+void wxWindowMac::DoGetTextExtent(const wxString& str,
+                                  int *x, int *y,
+                                  int *descent,
+                                  int *externalLeading,
+                                  const wxFont *theFont) const
 {
     const wxFont *fontToUse = theFont;
     wxFont tempFont;
@@ -1344,7 +1325,6 @@ void  wxWindowMac::MacPaintGrowBox()
 
         int size = m_hScrollBar ? m_hScrollBar->GetSize().y : ( m_vScrollBar ? m_vScrollBar->GetSize().x : MAC_SCROLLBAR_SIZE ) ;
         CGRect cgrect = CGRectMake( rect.right - size , rect.bottom - size , size , size ) ;
-        CGPoint cgpoint = CGPointMake( rect.right - size , rect.bottom - size ) ;
         CGContextSaveGState( cgContext );
 
         if ( m_backgroundColour.Ok() )
@@ -1383,50 +1363,35 @@ void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(right
         CGRect cgrect = CGRectMake( rect.left , rect.top , rect.right - rect.left ,
             rect.bottom - rect.top ) ;
 
-        HIThemeFrameDrawInfo info ;
-        memset( &info, 0 , sizeof(info) ) ;
-
-        info.version = 0 ;
-        info.kind = 0 ;
-        info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ;
-        info.isFocused = hasFocus ;
-
         CGContextRef cgContext = (CGContextRef) GetParent()->MacGetCGContextRef() ;
         wxASSERT( cgContext ) ;
 
-        if ( HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) )
-        {
-            info.kind = kHIThemeFrameTextFieldSquare ;
-            HIThemeDrawFrame( &cgrect , &info , cgContext , kHIThemeOrientationNormal ) ;
-        }
-        else if ( HasFlag(wxSIMPLE_BORDER) )
+        if ( m_peer->NeedsFrame() )
         {
-            info.kind = kHIThemeFrameListBox ;
-            HIThemeDrawFrame( &cgrect , &info , cgContext , kHIThemeOrientationNormal ) ;
+            HIThemeFrameDrawInfo info ;
+            memset( &info, 0 , sizeof(info) ) ;
+
+            info.version = 0 ;
+            info.kind = 0 ;
+            info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ;
+            info.isFocused = hasFocus ;
+
+            if ( HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) )
+            {
+                info.kind = kHIThemeFrameTextFieldSquare ;
+                HIThemeDrawFrame( &cgrect , &info , cgContext , kHIThemeOrientationNormal ) ;
+            }
+            else if ( HasFlag(wxSIMPLE_BORDER) )
+            {
+                info.kind = kHIThemeFrameListBox ;
+                HIThemeDrawFrame( &cgrect , &info , cgContext , kHIThemeOrientationNormal ) ;
+            }
         }
-        else if ( hasFocus )
+        
+        if ( hasFocus )
         {
             HIThemeDrawFocusRect( &cgrect , true , cgContext , kHIThemeOrientationNormal ) ;
         }
-#if 0 // TODO REMOVE now done in a separate call earlier in drawing the window itself
-        m_peer->GetRect( &rect ) ;
-        if ( MacHasScrollBarCorner() )
-        {
-            int variant = (m_hScrollBar == NULL ? m_vScrollBar : m_hScrollBar ) ->GetWindowVariant();
-            int size = m_hScrollBar ? m_hScrollBar->GetSize().y : ( m_vScrollBar ? m_vScrollBar->GetSize().x : MAC_SCROLLBAR_SIZE ) ;
-            CGRect cgrect = CGRectMake( rect.right - size , rect.bottom - size , size , size ) ;
-            CGPoint cgpoint = CGPointMake( rect.right - size , rect.bottom - size ) ;
-            HIThemeGrowBoxDrawInfo info ;
-            memset( &info, 0, sizeof(info) ) ;
-            info.version = 0 ;
-            info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ;
-            info.kind = kHIThemeGrowBoxKindNone ;
-            // contrary to the docs ...SizeSmall does not work
-            info.size = kHIThemeGrowBoxSizeNormal ;
-            info.direction = 0 ;
-            HIThemeDrawGrowBox( &cgpoint , &info , cgContext , kHIThemeOrientationNormal ) ;
-        }
-#endif
     }
 #endif // wxOSX_USE_COCOA_OR_CARBON
 }
@@ -1566,16 +1531,9 @@ void wxWindowMac::MacOnScroll( wxScrollEvent &event )
     }
 }
 
-// Get the window with the focus
 wxWindow *wxWindowBase::DoFindFocus()
 {
-#if wxOSX_USE_CARBON
-    ControlRef control ;
-    GetKeyboardFocus( GetUserFocusWindow() , &control ) ;
-    return wxFindWindowFromWXWidget( (WXWidget) control ) ;
-#else
-    return NULL;
-#endif
+    return wxFindWindowFromWXWidget(wxWidgetImpl::FindFocus());
 }
 
 void wxWindowMac::OnInternalIdle()
@@ -1819,104 +1777,96 @@ void wxWindowMac::MacUpdateClippedRects() const
 /*
     This function must not change the updatergn !
  */
-bool wxWindowMac::MacDoRedraw( void* updatergnr , long time )
+bool wxWindowMac::MacDoRedraw( long time )
 {
     bool handled = false ;
-#if wxOSX_USE_CARBON
-    Rect updatebounds ;
-    RgnHandle updatergn = (RgnHandle) updatergnr ;
-    GetRegionBounds( updatergn , &updatebounds ) ;
+    
+    wxRegion formerUpdateRgn = m_updateRegion;
+    wxRegion clientUpdateRgn = formerUpdateRgn;
+
+    wxSize sz = GetClientSize() ;
+    wxPoint origin = GetClientAreaOrigin() ;
+    
+    clientUpdateRgn.Intersect(origin.x , origin.y , origin.x + sz.x , origin.y + sz.y);
+    
+    // first send an erase event to the entire update area
+    {
+        // for the toplevel window this really is the entire area
+        // for all the others only their client area, otherwise they
+        // might be drawing with full alpha and eg put blue into
+        // the grow-box area of a scrolled window (scroll sample)
+        wxDC* dc = new wxWindowDC(this);
+        if ( IsTopLevel() )
+            dc->SetDeviceClippingRegion(formerUpdateRgn);
+        else
+            dc->SetDeviceClippingRegion(clientUpdateRgn);
 
-    // wxLogDebug(wxT("update for %s bounds %d, %d, %d, %d"), wxString(GetClassInfo()->GetClassName()).c_str(), updatebounds.left, updatebounds.top , updatebounds.right , updatebounds.bottom ) ;
+        wxEraseEvent eevent( GetId(), dc );
+        eevent.SetEventObject( this );
+        HandleWindowEvent( eevent );
+        delete dc ;
+    }
 
-    if ( !EmptyRgn(updatergn) )
-    {
-        RgnHandle newupdate = NewRgn() ;
-        wxSize point = GetClientSize() ;
-        wxPoint origin = GetClientAreaOrigin() ;
-        SetRectRgn( newupdate , origin.x , origin.y , origin.x + point.x , origin.y + point.y ) ;
-        SectRgn( newupdate , updatergn , newupdate ) ;
+    MacPaintGrowBox();
 
-        // first send an erase event to the entire update area
-        {
-            // for the toplevel window this really is the entire area
-            // for all the others only their client area, otherwise they
-            // might be drawing with full alpha and eg put blue into
-            // the grow-box area of a scrolled window (scroll sample)
-            wxDC* dc = new wxWindowDC(this);
-            if ( IsTopLevel() )
-                dc->SetDeviceClippingRegion(wxRegion(HIShapeCreateWithQDRgn(updatergn)));
-            else
-                dc->SetDeviceClippingRegion(wxRegion(HIShapeCreateWithQDRgn(newupdate)));
+    // calculate a client-origin version of the update rgn and set m_updateRegion to that
+    clientUpdateRgn.Offset( -origin.x , -origin.y );
+    m_updateRegion = clientUpdateRgn ;
 
-            wxEraseEvent eevent( GetId(), dc );
-            eevent.SetEventObject( this );
-            HandleWindowEvent( eevent );
-            delete dc ;
-        }
+    if ( !m_updateRegion.Empty() )
+    {
+        // paint the window itself
 
-        MacPaintGrowBox();
+        wxPaintEvent event(GetId());
+        event.SetTimestamp(time);
+        event.SetEventObject(this);
+        handled = HandleWindowEvent(event);
+    }
 
-        // calculate a client-origin version of the update rgn and set m_updateRegion to that
-        OffsetRgn( newupdate , -origin.x , -origin.y ) ;
-        m_updateRegion = wxRegion(HIShapeCreateWithQDRgn(newupdate)) ;
-        DisposeRgn( newupdate ) ;
+    m_updateRegion = formerUpdateRgn;
+    return handled;
+}
 
-        if ( !m_updateRegion.Empty() )
-        {
-            // paint the window itself
+void wxWindowMac::MacPaintChildrenBorders()
+{
+    // now we cannot rely on having its borders drawn by a window itself, as it does not
+    // get the updateRgn wide enough to always do so, so we do it from the parent
+    // this would also be the place to draw any custom backgrounds for native controls
+    // in Composited windowing
+    wxPoint clientOrigin = GetClientAreaOrigin() ;
 
-            wxPaintEvent event;
-            event.SetTimestamp(time);
-            event.SetEventObject(this);
-            HandleWindowEvent(event);
-            handled = true ;
-        }
+    wxWindowMac *child;
+    int x, y, w, h;
+    for (wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); node; node = node->GetNext())
+    {
+        child = node->GetData();
+        if (child == NULL)
+            continue;
+        if (child == m_vScrollBar)
+            continue;
+        if (child == m_hScrollBar)
+            continue;
+        if (child->IsTopLevel())
+            continue;
+        if (!child->IsShown())
+            continue;
 
-        // now we cannot rely on having its borders drawn by a window itself, as it does not
-        // get the updateRgn wide enough to always do so, so we do it from the parent
-        // this would also be the place to draw any custom backgrounds for native controls
-        // in Composited windowing
-        wxPoint clientOrigin = GetClientAreaOrigin() ;
+        // only draw those in the update region (add a safety margin of 10 pixels for shadow effects
 
-        wxWindowMac *child;
-        int x, y, w, h;
-        for (wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); node; node = node->GetNext())
+        child->GetPosition( &x, &y );
+        child->GetSize( &w, &h );
+        
+        if ( m_updateRegion.Contains(clientOrigin.x+x-10, clientOrigin.y+y-10, w+20, h+20) )
         {
-            child = node->GetData();
-            if (child == NULL)
-                continue;
-            if (child == m_vScrollBar)
-                continue;
-            if (child == m_hScrollBar)
-                continue;
-            if (child->IsTopLevel())
-                continue;
-            if (!child->IsShown())
-                continue;
-
-            // only draw those in the update region (add a safety margin of 10 pixels for shadow effects
-
-            child->GetPosition( &x, &y );
-            child->GetSize( &w, &h );
-            Rect childRect = { y , x , y + h , x + w } ;
-            OffsetRect( &childRect , clientOrigin.x , clientOrigin.y ) ;
-            InsetRect( &childRect , -10 , -10) ;
-
-            if ( RectInRgn( &childRect , updatergn ) )
+            // paint custom borders
+            wxNcPaintEvent eventNc( child->GetId() );
+            eventNc.SetEventObject( child );
+            if ( !child->HandleWindowEvent( eventNc ) )
             {
-                // paint custom borders
-                wxNcPaintEvent eventNc( child->GetId() );
-                eventNc.SetEventObject( child );
-                if ( !child->HandleWindowEvent( eventNc ) )
-                {
-                    child->MacPaintBorders(0, 0) ;
-                }
+                child->MacPaintBorders(0, 0) ;
             }
         }
     }
-#endif
-    return handled ;
 }
 
 
@@ -2065,7 +2015,10 @@ void wxWindowMac::MacRepositionScrollBars()
 
 bool wxWindowMac::AcceptsFocus() const
 {
-    return m_peer->CanFocus() && wxWindowBase::AcceptsFocus();
+    if ( MacIsUserPane() )
+        return wxWindowBase::AcceptsFocus();
+    else
+        return m_peer->CanFocus();
 }
 
 void wxWindowMac::MacSuperChangedPosition()
@@ -2107,25 +2060,28 @@ long wxWindowMac::MacGetLeftBorderSize() const
 
     SInt32 border = 0 ;
 
-    if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER))
+    if ( m_peer && m_peer->NeedsFrame() )
     {
+        if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER))
+        {
 #if wxOSX_USE_COCOA_OR_CARBON
-        // this metric is only the 'outset' outside the simple frame rect
-        GetThemeMetric( kThemeMetricEditTextFrameOutset , &border ) ;
-        border += 1;
+            // this metric is only the 'outset' outside the simple frame rect
+            GetThemeMetric( kThemeMetricEditTextFrameOutset , &border ) ;
+            border += 1;
 #else
-        border += 2;
+            border += 2;
 #endif
-    }
-    else if (HasFlag(wxSIMPLE_BORDER))
-    {
+        }
+        else if (HasFlag(wxSIMPLE_BORDER))
+        {
 #if wxOSX_USE_COCOA_OR_CARBON
-        // this metric is only the 'outset' outside the simple frame rect
-        GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ;
-        border += 1;
+            // this metric is only the 'outset' outside the simple frame rect
+            GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ;
+            border += 1;
 #else
-        border += 1;
+            border += 1;
 #endif
+        }
     }
 
     return border ;
@@ -2200,21 +2156,6 @@ void wxWindowMac::OnMouseEvent( wxMouseEvent &event )
     }
 }
 
-void wxWindowMac::OnPaint( wxPaintEvent & WXUNUSED(event) )
-{
-#if wxOSX_USE_COCOA_OR_CARBON
-    // for native controls: call their native paint method
-    if ( !MacIsUserPane() || ( IsTopLevel() && GetBackgroundStyle() == wxBG_STYLE_SYSTEM ) )
-    {
-        if ( wxTheApp->MacGetCurrentEvent() != NULL && wxTheApp->MacGetCurrentEventHandlerCallRef() != NULL
-             && GetBackgroundStyle() != wxBG_STYLE_TRANSPARENT )
-            CallNextEventHandler(
-                (EventHandlerCallRef)wxTheApp->MacGetCurrentEventHandlerCallRef() ,
-                (EventRef) wxTheApp->MacGetCurrentEvent() ) ;
-    }
-#endif
-}
-
 void wxWindowMac::TriggerScrollEvent( wxEventType WXUNUSED(scrollEvent) )
 {
 }
@@ -2229,7 +2170,7 @@ Rect wxMacGetBoundsForControl( wxWindowMac* window , const wxPoint& pos , const
     return bounds ;
 }
 
-bool wxWindowMac::OSXHandleClicked( double timestampsec )
+bool wxWindowMac::OSXHandleClicked( double WXUNUSED(timestampsec) )
 {
     return false;
 }
@@ -2423,6 +2364,7 @@ void wxWidgetImpl::Init()
     m_isRootControl = false;
     m_wxPeer = NULL;
     m_needsFocusRect = false;
+    m_needsFrame = true;
 }
 
 void wxWidgetImpl::SetNeedsFocusRect( bool needs )
@@ -2435,3 +2377,12 @@ bool wxWidgetImpl::NeedsFocusRect() const
     return m_needsFocusRect;
 }
 
+void wxWidgetImpl::SetNeedsFrame( bool needs )
+{
+    m_needsFrame = needs;
+}
+
+bool wxWidgetImpl::NeedsFrame() const
+{
+    return m_needsFrame;
+}