]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/window.cpp
applied patch 923858 (fixes crash in zlib streams)
[wxWidgets.git] / src / mac / carbon / window.cpp
index 4ebd816b71c8a4307cb2b2fd2eaa31bbedc88634..01521d2df9707912f839a7c924d09d35056d6ee0 100644 (file)
 #include <ToolUtils.h>
 #endif
 
+#if TARGET_API_MAC_OSX
 #ifndef __HIVIEW__
        #include <HIToolbox/HIView.h>
 #endif
+#endif
 
 #if  wxUSE_DRAG_AND_DROP
 #include "wx/dnd.h"
@@ -103,9 +105,14 @@ pascal OSStatus wxMacSetupControlBackground( ControlRef iControl , SInt16 iMessa
 static const EventTypeSpec eventList[] =
 {
 #if TARGET_API_MAC_OSX
-       { kEventClassControl , kEventControlDraw } ,
+    { kEventClassControl , kEventControlDraw } ,
+    { kEventClassControl , kEventControlVisibilityChanged } ,
+    { kEventClassControl , kEventControlEnabledStateChanged } ,
+    { kEventClassControl , kEventControlHiliteChanged } ,
 //     { kEventClassControl , kEventControlInvalidateForSizeChange } , // 10.3 only
 //  { kEventClassControl , kEventControlBoundsChanged } ,
+
+    {}
 #else
     {}
 #endif
@@ -126,7 +133,19 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
     {
         case kEventControlDraw :
             {
-                RgnHandle updateRgn = cEvent.GetParameter<RgnHandle>(kEventParamRgnHandle) ;
+                RgnHandle updateRgn = NULL ;
+
+                wxRegion visRegion = thisWindow->MacGetVisibleRegion() ;
+                if ( cEvent.GetParameter<RgnHandle>(kEventParamRgnHandle, &updateRgn) != noErr ) 
+                {
+                    updateRgn = (RgnHandle) visRegion.GetWXHRGN() ;
+                }
+                else
+                {
+                    // unfortunately this update region may be incorrect (tree ctrl sample )
+                    // so we have to reset it
+                    updateRgn = (RgnHandle) visRegion.GetWXHRGN() ;
+                }
                 // GrafPtr myport = cEvent.GetParameter<GrafPtr>(kEventParamGrafPort,typeGrafPtr) ;
 
 #if 0 // in case we would need a coregraphics compliant background erase first
@@ -146,6 +165,15 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
                     result = eventNotHandledErr; 
             }
             break ;
+        case kEventControlVisibilityChanged :
+                thisWindow->MacVisibilityChanged() ;
+            break ;
+        case kEventControlEnabledStateChanged :
+                thisWindow->MacEnabledStateChanged() ;
+            break ;
+        case kEventControlHiliteChanged :
+                thisWindow->MacHiliteChanged() ;
+            break ;
         default :
             break ;
     }
@@ -1345,6 +1373,9 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
 
 wxSize wxWindowMac::DoGetBestSize() const
 {
+    if ( m_macIsUserPane || IsTopLevel() )
+        return wxWindowBase::DoGetBestSize() ;
+        
     Rect    bestsize = { 0 , 0 , 0 , 0 } ;
     short   baselineoffset ;
     int bestWidth, bestHeight ;
@@ -1376,6 +1407,7 @@ wxSize wxWindowMac::DoGetBestSize() const
         bestHeight = 13 ;
         
     return wxSize(bestWidth, bestHeight);
+//    return wxWindowBase::DoGetBestSize() ;
 }
 
 
@@ -1398,7 +1430,7 @@ void wxWindowMac::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 
     // ... and don't do anything (avoiding flicker) if it's already ok
     if ( x == currentX && y == currentY &&
-        width == currentW && height == currentH )
+        width == currentW && height == currentH && ( height != -1 && width != -1 ) )
     {
         // TODO REMOVE
         MacRepositionScrollBars() ; // we might have a real position shift
@@ -1497,8 +1529,44 @@ wxString wxWindowMac::GetTitle() const
     return m_label ;
 }
 
+bool wxWindowMac::Show(bool show)
+{
+    if ( !wxWindowBase::Show(show) )
+        return FALSE;
+    
+    // TODO use visibilityChanged Carbon Event for OSX
+    bool former = MacIsReallyShown() ;
+    
+    SetControlVisibility( (ControlRef) m_macControl , show , true ) ;
+    if ( former != MacIsReallyShown() )
+        MacPropagateVisibilityChanged() ;
+    return TRUE;
+}
+
+bool wxWindowMac::Enable(bool enable)
+{
+    wxASSERT( m_macControl != NULL ) ;
+    if ( !wxWindowBase::Enable(enable) )
+        return FALSE;
+
+    bool former = MacIsReallyEnabled() ;
+    if ( enable )
+        EnableControl( (ControlRef) m_macControl ) ;
+    else
+        DisableControl( (ControlRef) m_macControl ) ;
+
+    if ( former != MacIsReallyEnabled() )
+        MacPropagateEnabledStateChanged() ;
+    return TRUE;
+}
+
+//  
+// status change propagations (will be not necessary for OSX later )
+//
+
 void wxWindowMac::MacPropagateVisibilityChanged()
 {
+#if !TARGET_API_MAC_OSX
     MacVisibilityChanged() ;
     
     wxWindowListNode *node = GetChildren().GetFirst();
@@ -1509,22 +1577,61 @@ void wxWindowMac::MacPropagateVisibilityChanged()
             child->MacPropagateVisibilityChanged(  ) ;
         node = node->GetNext();
     }
+#endif
 }
 
-bool wxWindowMac::Show(bool show)
+void wxWindowMac::MacPropagateEnabledStateChanged( )
 {
-    if ( !wxWindowBase::Show(show) )
-        return FALSE;
+#if !TARGET_API_MAC_OSX
+    MacEnabledStateChanged() ;
     
-    // TODO use visibilityChanged Carbon Event for OSX
-    bool former = MacIsReallyShown() ;
+    wxWindowListNode *node = GetChildren().GetFirst();
+    while ( node )
+    {
+        wxWindowMac *child = node->GetData();
+        if ( child->IsEnabled() )
+            child->MacPropagateEnabledStateChanged() ;
+        node = node->GetNext();
+    }
+#endif
+}
+
+void wxWindowMac::MacPropagateHiliteChanged( )
+{
+#if !TARGET_API_MAC_OSX
+    MacHiliteChanged() ;
     
-    SetControlVisibility( (ControlRef) m_macControl , show , true ) ;
-    if ( former != MacIsReallyShown() )
-        MacPropagateVisibilityChanged() ;
-    return TRUE;
+    wxWindowListNode *node = GetChildren().GetFirst();
+    while ( node )
+    {
+        wxWindowMac *child = node->GetData();
+        // if ( child->IsEnabled() )
+            child->MacPropagateHiliteChanged() ;
+        node = node->GetNext();
+    }
+#endif
 }
 
+//
+// status change notifications
+// 
+
+void wxWindowMac::MacVisibilityChanged() 
+{
+}
+
+void wxWindowMac::MacHiliteChanged() 
+{
+}
+
+void wxWindowMac::MacEnabledStateChanged() 
+{
+}
+
+//
+// status queries on the inherited window's state
+//
+
 bool wxWindowMac::MacIsReallyShown() 
 {
     // only under OSX the visibility of the TLW is taken into account
@@ -1546,50 +1653,20 @@ bool wxWindowMac::MacIsReallyShown()
 #endif
 }
 
-void wxWindowMac::MacVisibilityChanged() 
-{
-}
-
-void wxWindowMac::MacPropagateEnabledStateChanged( )
-{
-    MacEnabledStateChanged() ;
-    
-    wxWindowListNode *node = GetChildren().GetFirst();
-    while ( node )
-    {
-        wxWindowMac *child = node->GetData();
-        if ( child->IsEnabled() )
-            child->MacPropagateEnabledStateChanged() ;
-        node = node->GetNext();
-    }
-}
-
-bool wxWindowMac::Enable(bool enable)
-{
-    wxASSERT( m_macControl != NULL ) ;
-    if ( !wxWindowBase::Enable(enable) )
-        return FALSE;
-
-    bool former = MacIsReallyEnabled() ;
-    if ( enable )
-        UMAActivateControl( (ControlRef) m_macControl ) ;
-    else
-        UMADeactivateControl( (ControlRef) m_macControl ) ;
-
-    if ( former != MacIsReallyEnabled() )
-        MacPropagateEnabledStateChanged() ;
-    return TRUE;
-}
-
 bool wxWindowMac::MacIsReallyEnabled() 
 {
     return IsControlEnabled( (ControlRef) m_macControl ) ;
 }
 
-void wxWindowMac::MacEnabledStateChanged() 
+bool wxWindowMac::MacIsReallyHilited() 
 {
+    return IsControlActive( (ControlRef) m_macControl ) ;
 }
 
+//
+//
+//
+
 int wxWindowMac::GetCharHeight() const
 {
     wxClientDC dc ( (wxWindowMac*)this ) ;
@@ -1630,7 +1707,15 @@ void wxWindowMac::GetTextExtent(const wxString& string, int *x, int *y,
 void wxWindowMac::Refresh(bool eraseBack, const wxRect *rect)
 {
 #if TARGET_API_MAC_OSX
-    HIViewSetNeedsDisplay( (ControlRef) m_macControl , true ) ; 
+    if ( rect == NULL )
+        HIViewSetNeedsDisplay( (ControlRef) m_macControl , true ) ; 
+    else
+    {
+        RgnHandle update = NewRgn() ;
+        SetRectRgn( update , rect->x , rect->y , rect->x + rect->width , rect->y + rect->height ) ;
+        SectRgn( (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , update , update ) ;        
+        HIViewSetNeedsDisplayInRegion( (ControlRef) m_macControl , update , true ) ;
+    }
 #else
     if ( IsControlVisible( (ControlRef) m_macControl ) )
     {
@@ -2233,6 +2318,10 @@ wxRegion wxWindowMac::MacGetVisibleRegion( bool includeOuterStructures )
  */
 bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr , long time ) 
 {
+    // we let the OS handle root control redraws
+    if ( m_macControl == MacGetTopLevelWindow()->GetHandle() )
+        return false ;
+        
     RgnHandle updatergn = (RgnHandle) updatergnr ;
     bool handled = false ;