]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/window.cpp
Added extra MicroWindows functions
[wxWidgets.git] / src / mac / carbon / window.cpp
index 78cbd8ca195c0150ecd20caff67dd6cd6bc1b767..1dc5b4e6ae3ed4fb3765bc703ded4de9efe6108c 100644 (file)
@@ -15,6 +15,7 @@
 
 #include "wx/setup.h"
 #include "wx/menu.h"
+#include "wx/window.h"
 #include "wx/dc.h"
 #include "wx/dcclient.h"
 #include "wx/utils.h" 
@@ -33,9 +34,6 @@
 #include "wx/tabctrl.h"
 #include "wx/tooltip.h"
 #include "wx/statusbr.h"
-// TODO remove the line below, just for lookup-up convenience CS
-#include "wx/window.h"
-
 #include "wx/menuitem.h"
 #include "wx/log.h"
 
@@ -110,11 +108,15 @@ void wxRemoveMacWindowAssociation(wxWindow *win)
 // constructors and such
 // ----------------------------------------------------------------------------
 
+WindowRef wxWindow::s_macWindowInUpdate = NULL;
+
 void wxWindow::Init()
 {
     // generic
     InitBase();
 
+    m_macEraseOnRedraw = true ;
+
     // MSW specific
     m_doubleClickAllowed = 0;
     m_winCaptured = FALSE;
@@ -132,6 +134,7 @@ void wxWindow::Init()
     m_isShown = TRUE;
 
        m_macWindowData = NULL ;
+       m_macEraseOnRedraw = true ;
 
        m_x = 0;
        m_y = 0 ;       
@@ -149,6 +152,20 @@ void wxWindow::Init()
 // Destructor
 wxWindow::~wxWindow()
 {
+    // deleting a window while it is shown invalidates the region
+    if ( IsShown() ) {
+        wxWindow* iter = this ;
+        while( iter ) {
+            if ( iter->m_macWindowData )
+            {
+                Refresh() ;
+                break ;
+            }
+            iter = iter->GetParent() ;
+            
+        }
+    }
+    
     m_isBeingDeleted = TRUE;
 
        if ( s_lastMouseWindow == this )
@@ -410,11 +427,19 @@ void wxWindow::MacRootWindowToClient( int *x , int *y ) const
 
 bool wxWindow::SetCursor(const wxCursor& cursor)
 {
-   if ( !wxWindowBase::SetCursor(cursor) )
-   {
-       // no change
+    if (m_cursor == cursor)
        return FALSE;
-   }
+
+    if (wxNullCursor == cursor)
+    {
+       if ( ! wxWindowBase::SetCursor( *wxSTANDARD_CURSOR ) )
+        return FALSE ;
+    }
+    else
+    {
+       if ( ! wxWindowBase::SetCursor( cursor ) )
+        return FALSE ;
+    }
 
   wxASSERT_MSG( m_cursor.Ok(),
                   wxT("cursor must be valid after call to the base version"));
@@ -429,7 +454,7 @@ bool wxWindow::SetCursor(const wxCursor& cursor)
   {
        if ( mouseWin == this && !wxIsBusy() )
        {
-               cursor.MacInstall() ;
+               m_cursor.MacInstall() ;
        }
   }
 
@@ -618,7 +643,7 @@ void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
                        if ( focus.Ok() )
                        {
                                Rect clientrect = { 0 , 0 , m_height , m_width } ;
-                               ClipRect( &clientrect ) ;
+                               // ClipRect( &clientrect ) ;
                        InvalWindowRect( GetMacRootWindow() , &clientrect ) ;
                        }
                }
@@ -653,7 +678,7 @@ void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
                                if ( focus.Ok() )
                                {
                                        Rect clientrect = { 0 , 0 , m_height , m_width } ;
-                                       ClipRect( &clientrect ) ;
+                                       // ClipRect( &clientrect ) ;
                                InvalWindowRect( GetMacRootWindow() , &clientrect ) ;
                                }
                        }
@@ -664,16 +689,18 @@ void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
                MacRepositionScrollBars() ;
                if ( doMove )
                {
-               wxMoveEvent event(wxPoint(m_x, m_y), m_windowId);
+               wxPoint point(m_x, m_y);
+               wxMoveEvent event(point, m_windowId);
                event.SetEventObject(this);
                GetEventHandler()->ProcessEvent(event) ;
        }
        if ( doResize )
        {
-                       MacRepositionScrollBars() ;
-               wxSizeEvent event(wxSize(m_width, m_height), m_windowId);
-               event.SetEventObject(this);
-               GetEventHandler()->ProcessEvent(event);
+           MacRepositionScrollBars() ;
+           wxSize size(m_width, m_height);
+           wxSizeEvent event(size, m_windowId);
+           event.SetEventObject(this);
+           GetEventHandler()->ProcessEvent(event);
        }
        }
 }
@@ -732,7 +759,8 @@ bool wxWindow::Show(bool show)
                UMASelectWindow( m_macWindowData->m_macWindow ) ;
                // no need to generate events here, they will get them triggered by macos
                // actually they should be , but apparently they are not
-           wxSizeEvent event(wxSize(m_width, m_height), m_windowId);
+           wxSize size(m_width, m_height);
+           wxSizeEvent event(size, m_windowId);
            event.SetEventObject(this);
            GetEventHandler()->ProcessEvent(event);
          }
@@ -743,8 +771,6 @@ bool wxWindow::Show(bool show)
        }
        MacSuperShown( show ) ;
        Refresh() ;
-       if(m_macWindowData)
-               MacUpdateImmediately() ;
 
     return TRUE;
 }
@@ -763,6 +789,11 @@ void wxWindow::MacSuperShown( bool show )
 
 bool wxWindow::MacIsReallyShown() const 
 {
+       if ( m_isShown && (m_parent != NULL) ) {
+               return m_parent->MacIsReallyShown();
+       }
+       return m_isShown;
+/*     
        bool status = m_isShown ;
        wxWindow * win = this ;
        while ( status && win->m_parent != NULL )
@@ -771,6 +802,7 @@ bool wxWindow::MacIsReallyShown() const
                status = win->m_isShown ;
        }
        return status ;
+*/
 }
 
 int wxWindow::GetCharHeight() const
@@ -794,7 +826,7 @@ void wxWindow::GetTextExtent(const wxString& string, int *x, int *y,
         
     wxClientDC dc( (wxWindow*) this ) ;
     long lx,ly,ld,le ;
-    dc.GetTextExtent( string , &lx , &ly , &ld, &le, fontToUse ) ;
+    dc.GetTextExtent( string , &lx , &ly , &ld, &le, (wxFont *)fontToUse ) ;
     if ( externalLeading )
        *externalLeading = le ;
     if ( descent )
@@ -807,6 +839,7 @@ void wxWindow::GetTextExtent(const wxString& string, int *x, int *y,
 
 void wxWindow::MacEraseBackground( Rect *rect )
 {
+/*
        WindowRef window = GetMacRootWindow() ;
        if ( m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE) )
        {
@@ -874,15 +907,19 @@ void wxWindow::MacEraseBackground( Rect *rect )
                        }
                }
        }
+*/
 }
 
 void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
 {
+//    if ( !IsShown() )
+//        return ;
+        
        wxMacDrawingHelper focus( this ) ;
        if ( focus.Ok() )
        {
                Rect clientrect = { 0 , 0 , m_height , m_width } ;
-               ClipRect( &clientrect ) ;
+               // ClipRect( &clientrect ) ;
 
        if ( rect )
        {
@@ -891,6 +928,10 @@ void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
        }
        InvalWindowRect( GetMacRootWindow() , &clientrect ) ;
        }
+       if ( !eraseBack )
+               m_macEraseOnRedraw = false ;
+       else
+               m_macEraseOnRedraw = true ;
 }
 
 // Responds to colour changes: passes event on to children.
@@ -1083,23 +1124,10 @@ void  wxWindow::MacCreateRealWindow( const wxString& title,
                {
                        wclass = kMovableModalWindowClass ;
                }
-               else if ( HasFlag( wxDIALOG_MODELESS ) )
+               else 
                {
                        wclass = kDocumentWindowClass ;
                }
-               /*
-               else
-               {
-                       if ( HasFlag( wxCAPTION ) )
-                       {
-                               wclass = kDocumentWindowClass ;
-                       }
-                       else
-                       {
-                               wclass = kModalWindowClass ;
-                       }
-               }
-               */
        }
        else
        {
@@ -1131,6 +1159,7 @@ void  wxWindow::MacCreateRealWindow( const wxString& title,
        UMACreateRootControl( m_macWindowData->m_macWindow , &m_macWindowData->m_macRootControl ) ;
 
        m_macWindowData->m_macFocus = NULL ;
+       m_macWindowData->m_macHasReceivedFirstActivate = true ;
 }
 
 void wxWindow::MacPaint( wxPaintEvent &event ) 
@@ -1267,7 +1296,7 @@ void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible,
                                {
                                        if ( !m_hScrollBar->IsShown() )
                                                m_hScrollBar->Show(true) ;
-                                       m_hScrollBar->SetScrollbar( pos , thumbVisible , range , refresh ) ;
+                                       m_hScrollBar->SetScrollbar( pos , thumbVisible , range , thumbVisible , refresh ) ;
                                }
                        }
                }
@@ -1284,7 +1313,7 @@ void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible,
                                {
                                        if ( !m_vScrollBar->IsShown() )
                                                m_vScrollBar->Show(true) ;
-                                       m_vScrollBar->SetScrollbar( pos , thumbVisible , range , refresh ) ;
+                                       m_vScrollBar->SetScrollbar( pos , thumbVisible , range , thumbVisible , refresh ) ;
                                }
                        }
                }
@@ -1489,13 +1518,19 @@ void wxWindow::OnIdle(wxIdleEvent& event)
 // Raise the window to the top of the Z order
 void wxWindow::Raise()
 {
-    // TODO
+    if ( m_macWindowData )
+    {
+        UMABringToFront( m_macWindowData->m_macWindow ) ;
+    }
 }
 
 // Lower the window to the bottom of the Z order
 void wxWindow::Lower()
 {
-    // TODO
+    if ( m_macWindowData )
+    {
+        UMASendBehind( m_macWindowData->m_macWindow , NULL ) ;
+    }
 }
 
 void wxWindow::DoSetClientSize(int width, int height)
@@ -1682,8 +1717,12 @@ void wxWindow::MacFireMouseEvent( EventRecord *ev )
                                else
                                        event.SetEventType(wxEVT_LEFT_DCLICK ) ;
                        }
+                   lastWhen = 0 ;
+               }
+               else
+               {
+                   lastWhen = ev->when ;
                }
-               lastWhen = ev->when ;
                lastWhere = localwhere ;
        }
 
@@ -1756,19 +1795,27 @@ void wxWindow::MacMouseMoved( EventRecord *ev , short part)
 }
 void wxWindow::MacActivate( EventRecord *ev , bool inIsActivating )
 {
-       wxActivateEvent event(wxEVT_ACTIVATE, inIsActivating);
+    if ( !m_macWindowData->m_macHasReceivedFirstActivate )
+        m_macWindowData->m_macHasReceivedFirstActivate = true ;
+    
+       wxActivateEvent event(wxEVT_ACTIVATE, inIsActivating , m_windowId);
        event.m_timeStamp = ev->when ;
        event.SetEventObject(this);
        
        GetEventHandler()->ProcessEvent(event);
        
+    Refresh(false) ;
        UMAHighlightAndActivateWindow( m_macWindowData->m_macWindow , inIsActivating ) ;
+//     MacUpdateImmediately() ;
 }
 
 void wxWindow::MacRedraw( RgnHandle updatergn , long time)
 {
        // updatergn is always already clipped to our boundaries
        WindowRef window = GetMacRootWindow() ;
+       // ownUpdateRgn is the area that this window has to invalidate i.e. its own area without its children
+       RgnHandle ownUpdateRgn = NewRgn() ;
+       CopyRgn( updatergn , ownUpdateRgn ) ;
        wxWindow* win = wxFindWinFromMacWindow( window ) ;
        {
                wxMacDrawingHelper focus( this ) ; // was client
@@ -1833,23 +1880,45 @@ void wxWindow::MacRedraw( RgnHandle updatergn , long time)
                        {
                                RGBBackColor( &m_backgroundColour.GetPixel()) ;
                        }
+            // subtract all non transparent children from updatergn
+            
+           RgnHandle childarea = NewRgn() ;
+               for (wxNode *node = GetChildren().First(); node; node = node->Next())
+               {
+                       wxWindow *child = (wxWindow*)node->Data();
+                       // eventually test for transparent windows
+                       if ( child->GetMacRootWindow() == window && child->IsShown() )
+                       {
+                           if ( child->GetBackgroundColour() != m_backgroundColour && !child->IsKindOf( CLASSINFO( wxControl ) ) && ((wxControl*)child)->GetMacControl() )
+                           {
+                               SetRectRgn( childarea , child->m_x , child->m_y , child->m_x + child->m_width ,  child->m_y + child->m_height ) ;
+                               DiffRgn( ownUpdateRgn , childarea , ownUpdateRgn ) ;
+                           }
+                       }
+               }               
+               DisposeRgn( childarea ) ;
+
                        if ( GetParent() && m_backgroundColour != GetParent()->GetBackgroundColour() )
                                eraseBackground = true ;
-                       SetClip( updatergn ) ;
-                       if ( eraseBackground )
-                       {
-                               EraseRgn( updatergn ) ; 
-                       }
+                       SetClip( ownUpdateRgn ) ;
+                       if ( m_macEraseOnRedraw ) {
+                       if ( eraseBackground  )
+                       {
+                               EraseRgn( ownUpdateRgn ) ;      
+                       }
+               }
+               else {
+                   m_macEraseOnRedraw = true ;
+               }
                }
 
-               m_macUpdateRgn = 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 , m_macUpdateRgn , newupdate ) ;
+                       SectRgn( newupdate , ownUpdateRgn , newupdate ) ;
                        OffsetRgn( newupdate , -origin.x , -origin.y ) ;
                        m_updateRegion = newupdate ;
                        DisposeRgn( newupdate ) ;
@@ -1869,7 +1938,7 @@ void wxWindow::MacRedraw( RgnHandle updatergn , long time)
        {
                wxWindow *child = (wxWindow*)node->Data();
                SetRectRgn( childupdate , child->m_x , child->m_y , child->m_x + child->m_width ,  child->m_y + child->m_height ) ;
-               SectRgn( childupdate , m_macUpdateRgn , childupdate ) ;
+               SectRgn( childupdate , updatergn , childupdate ) ;
                OffsetRgn( childupdate , -child->m_x , -child->m_y ) ;
                if ( child->GetMacRootWindow() == window && child->IsShown() && !EmptyRgn( childupdate ) )
                {
@@ -1903,7 +1972,7 @@ void wxWindow::MacUpdateImmediately()
                    GetPortVisibleRegion( GetWindowPort( window ), region );
 
                                // if windowshade gives incompatibility , take the follwing out
-                   if ( !EmptyRgn( region ) )
+                   if ( !EmptyRgn( region ) && win->m_macWindowData->m_macHasReceivedFirstActivate )
                    {
                                        win->MacRedraw( region , wxTheApp->sm_lastMessageTime ) ;
                    }
@@ -1934,7 +2003,7 @@ void wxWindow::MacUpdate( EventRecord *ev )
             GetPortVisibleRegion( GetWindowPort( window ), region );
 
                        // if windowshade gives incompatibility , take the follwing out
-            if ( !EmptyRgn( region ) )
+            if ( !EmptyRgn( region ) && win->m_macWindowData->m_macHasReceivedFirstActivate )
             {
                                MacRedraw( region , ev->when ) ;
             }
@@ -2353,7 +2422,6 @@ wxMacDrawingHelper::~wxMacDrawingHelper()
                Rect portRect ;
                GetPortBounds( m_currentPort , &portRect ) ;
                ClipRect( &portRect ) ;
-               wxDC::MacInvalidateSetup() ;    
        }
                
        if ( m_formerPort != m_currentPort )