]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/window.cpp
added live resizing
[wxWidgets.git] / src / mac / window.cpp
index ddb8eebf2b898759b80ea6be4385d41cb2652eb2..e426ed86b9ebeed92ea98f5378d0402880f97731 100644 (file)
@@ -922,48 +922,6 @@ void wxWindowMac::Refresh(bool eraseBack, const wxRect *rect)
     }
 }
 
-#if wxUSE_CARET && WXWIN_COMPATIBILITY
-// ---------------------------------------------------------------------------
-// Caret manipulation
-// ---------------------------------------------------------------------------
-
-void wxWindowMac::CreateCaret(int w, int h)
-{
-    SetCaret(new wxCaret(this, w, h));
-}
-
-void wxWindowMac::CreateCaret(const wxBitmap *WXUNUSED(bitmap))
-{
-    wxFAIL_MSG("not implemented");
-}
-
-void wxWindowMac::ShowCaret(bool show)
-{
-    wxCHECK_RET( m_caret, "no caret to show" );
-
-    m_caret->Show(show);
-}
-
-void wxWindowMac::DestroyCaret()
-{
-    SetCaret(NULL);
-}
-
-void wxWindowMac::SetCaretPos(int x, int y)
-{
-    wxCHECK_RET( m_caret, "no caret to move" );
-
-    m_caret->Move(x, y);
-}
-
-void wxWindowMac::GetCaretPos(int *x, int *y) const
-{
-    wxCHECK_RET( m_caret, "no caret to get position of" );
-
-    m_caret->GetPosition(x, y);
-}
-#endif // wxUSE_CARET
-
 wxWindowMac *wxGetActiveWindow()
 {
     // actually this is a windows-only concept
@@ -1231,6 +1189,9 @@ void wxWindowMac::SetScrollbar(int orient, int pos, int thumbVisible,
 // Does a physical scroll
 void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
 {
+    if( dx == 0 && dy ==0 )
+        return ;
+        
     wxClientDC dc(this) ;
     wxMacPortSetter helper(&dc) ;
 
@@ -1248,8 +1209,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( updateRgn , -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())
@@ -1265,6 +1245,8 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
         child->GetSize( &w, &h );
         child->SetSize( x+dx, y+dy, w, h );
     }
+    
+    Update() ;
 
 }
 
@@ -1304,37 +1286,6 @@ wxWindowMac *wxWindowBase::FindFocus()
     return gFocusWindow ;
 }
 
-#if WXWIN_COMPATIBILITY
-// If nothing defined for this, try the parent.
-// E.g. we may be a button loaded from a resource, with no callback function
-// defined.
-void wxWindowMac::OnCommand(wxWindowMac& win, wxCommandEvent& event)
-{
-    if ( GetEventHandler()->ProcessEvent(event)  )
-        return;
-    if ( m_parent )
-        m_parent->GetEventHandler()->OnCommand(win, event);
-}
-#endif // WXWIN_COMPATIBILITY_2
-
-#if WXWIN_COMPATIBILITY
-wxObject* wxWindowMac::GetChild(int number) const
-{
-    // Return a pointer to the Nth object in the Panel
-    wxNode *node = GetChildren().GetFirst();
-    int n = number;
-    while (node && n--)
-        node = node->GetNext();
-    if ( node )
-    {
-        wxObject *obj = (wxObject *)node->GetData();
-        return(obj);
-    }
-    else
-        return NULL;
-}
-#endif // WXWIN_COMPATIBILITY
-
 void wxWindowMac::OnSetFocus(wxFocusEvent& event)
 {
     // panel wants to track the window which was the last to have focus in it,
@@ -1351,14 +1302,6 @@ void wxWindowMac::OnSetFocus(wxFocusEvent& event)
     event.Skip();
 }
 
-void wxWindowMac::Clear()
-{
-    wxClientDC dc(this);
-    wxBrush brush(GetBackgroundColour(), wxSOLID);
-    dc.SetBackground(brush);
-    dc.Clear();
-}
-
 // Setup background and foreground colours correctly
 void wxWindowMac::SetupColours()
 {
@@ -1604,17 +1547,35 @@ 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 ) ;
+    ::GlobalToLocal( &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