]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/window.cpp
Applied patch [ 828303 ] Slight wxColour cleanup
[wxWidgets.git] / src / mac / carbon / window.cpp
index 51406e6bb79aec70ed8a97a398668f86d6835527..6a23f1cab358c63007f8e4174d27988ab0507b72 100644 (file)
@@ -100,10 +100,6 @@ END_EVENT_TABLE()
 
 void wxWindowMac::Init()
 {
-    // generic
-    InitBase();
-
-    m_isBeingDeleted = FALSE;
     m_backgroundTransparent = FALSE;
 
     // as all windows are created with WS_VISIBLE style...
@@ -116,8 +112,6 @@ void wxWindowMac::Init()
 
     m_hScrollBar = NULL ;
     m_vScrollBar = NULL ;
-
-    m_label = wxEmptyString;
 }
 
 // Destructor
@@ -174,15 +168,8 @@ wxWindowMac::~wxWindowMac()
         gFocusWindow = NULL ;
     }
 
-       // CS: copied from MSW :
-    // VS: destroy children first and _then_ detach *this from its parent.
-    //     If we'd do it the other way around, children wouldn't be able
-    //     find their parent frame (see above).
     DestroyChildren();
 
-    if ( m_parent )
-        m_parent->RemoveChild(this);
-
     // delete our drop target if we've got one
 #if wxUSE_DRAG_AND_DROP
     if ( m_dropTarget != NULL )
@@ -634,7 +621,7 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
 
         bool partialRepaint = false ;
 
-        if ( HasFlag(wxNO_FULL_REPAINT_ON_RESIZE) )
+        if ( !HasFlag(wxFULL_REPAINT_ON_RESIZE) )
         {
             wxPoint oldPos( m_x , m_y ) ;
             wxPoint newPos( actualX , actualY ) ;
@@ -1189,10 +1176,14 @@ void wxWindowMac::SetScrollbar(int orient, int pos, int thumbVisible,
 // Does a physical scroll
 void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
 {
-    wxClientDC dc(this) ;
-    wxMacPortSetter helper(&dc) ;
+    if( dx == 0 && dy ==0 )
+        return ;
+        
 
     {
+        wxClientDC dc(this) ;
+        wxMacPortSetter helper(&dc) ;
+
         int width , height ;
         GetClientSize( &width , &height ) ;
 
@@ -1206,8 +1197,27 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
             SectRect( &scrollrect , &r , &scrollrect ) ;
         }
         ScrollRect( &scrollrect , dx , dy , updateRgn ) ;
-        InvalWindowRgn( (WindowRef) MacGetRootWindow() ,  updateRgn ) ;
+        // we also have to scroll the update rgn in this rectangle 
+        // in order not to loose updates
+        WindowRef rootWindow = (WindowRef) MacGetRootWindow() ;
+        RgnHandle formerUpdateRgn = NewRgn() ;
+        RgnHandle scrollRgn = NewRgn() ;
+        RectRgn( scrollRgn , &scrollrect ) ;
+        GetWindowUpdateRgn( rootWindow , formerUpdateRgn ) ;
+        Point pt = {0,0} ;
+        LocalToGlobal( &pt ) ;
+        OffsetRgn( formerUpdateRgn , -pt.h , -pt.v ) ;
+        SectRgn( formerUpdateRgn , scrollRgn , formerUpdateRgn ) ;
+        if ( !EmptyRgn( formerUpdateRgn ) )
+        {
+            MacOffsetRgn( formerUpdateRgn , dx , dy ) ;
+            SectRgn( formerUpdateRgn , scrollRgn , formerUpdateRgn ) ;
+            InvalWindowRgn(rootWindow  ,  formerUpdateRgn ) ;
+        }
+        InvalWindowRgn(rootWindow  ,  updateRgn ) ;
         DisposeRgn( updateRgn ) ;
+        DisposeRgn( formerUpdateRgn ) ;
+        DisposeRgn( scrollRgn ) ;
     }
 
     for (wxWindowListNode *node = GetChildren().GetFirst(); node; node = node->GetNext())
@@ -1223,6 +1233,8 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
         child->GetSize( &w, &h );
         child->SetSize( x+dx, y+dy, w, h );
     }
+    
+    Update() ;
 
 }
 
@@ -1523,17 +1535,34 @@ wxString wxWindowMac::MacGetToolTipString( wxPoint &pt )
 
 void wxWindowMac::Update()
 {
-    wxTopLevelWindowMac* win = MacGetTopLevelWindow(  ) ;
-    if ( win )
-    {
-      win->MacUpdate( 0 ) ;
+    wxRegion visRgn = MacGetVisibleRegion( false ) ;
+    int top = 0 , left = 0 ;
+    MacWindowToRootWindow( &left , &top ) ;
+    WindowRef rootWindow = (WindowRef) MacGetRootWindow() ;
+    RgnHandle updateRgn = NewRgn() ;    
+    // getting the update region in macos local coordinates
+    GetWindowUpdateRgn( rootWindow , updateRgn ) ;
+    GrafPtr     port ;
+    ::GetPort( &port ) ;
+    ::SetPort( UMAGetWindowPort( rootWindow ) ) ;
+    Point pt = {0,0} ;
+    LocalToGlobal( &pt ) ;
+    ::SetPort( port ) ;
+    OffsetRgn( updateRgn , -pt.h , -pt.v ) ;
+    // translate to window local coordinates
+    OffsetRgn( updateRgn , -left , -top ) ;
+    SectRgn( updateRgn , (RgnHandle) visRgn.GetWXHRGN() , updateRgn ) ;
+    MacRedraw( updateRgn , 0 , true ) ;
+    // for flushing and validating we need macos-local coordinates again
+    OffsetRgn( updateRgn , left , top ) ;
 #if TARGET_API_MAC_CARBON
-        if ( QDIsPortBuffered( GetWindowPort( (WindowRef) win->MacGetWindowRef() ) ) )
-        {
-                QDFlushPortBuffer( GetWindowPort( (WindowRef) win->MacGetWindowRef() ) , NULL ) ;
-        }
+    if ( QDIsPortBuffered( GetWindowPort( rootWindow ) ) )
+    {
+        QDFlushPortBuffer( GetWindowPort( rootWindow ) , updateRgn ) ;
+    }
 #endif
-      }
+    ValidWindowRgn( rootWindow , updateRgn ) ;
+    DisposeRgn( updateRgn ) ;
 }
 
 wxTopLevelWindowMac* wxWindowMac::MacGetTopLevelWindow() const
@@ -1691,10 +1720,32 @@ void wxWindowMac::MacRedraw( WXHRGN updatergnr , long time, bool erase)
         DisposeRgn( ownUpdateRgn ) ;
         if ( !m_updateRegion.Empty() )
         {
+            wxWindowList hiddenWindows ;
+            for (wxWindowListNode *node = GetChildren().GetFirst(); node; node = node->GetNext())
+            {
+                wxControl *child = wxDynamicCast( ( wxWindow*)node->GetData() , wxControl ) ;
+
+                if ( child && child->MacGetRootWindow() == window && child->IsShown() && child->GetMacControl() )
+                {
+                    SetControlVisibility( (ControlHandle) child->GetMacControl() , false , false ) ;
+                    hiddenWindows.Append( child ) ;
+                }
+            }
+            
             wxPaintEvent event;
             event.m_timeStamp = time ;
             event.SetEventObject(this);
             GetEventHandler()->ProcessEvent(event);
+            for (wxWindowListNode *node = hiddenWindows.GetFirst(); node; node = node->GetNext())
+            {
+                wxControl *child = wxDynamicCast( ( wxWindow*)node->GetData() , wxControl ) ;
+
+                if ( child && child->GetMacControl() )
+                {
+                    SetControlVisibility( (ControlHandle) child->GetMacControl() , true , false ) ;
+                }
+            }
         }
     }