]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/window.cpp
moved splines rendering code into wxDCBase
[wxWidgets.git] / src / mac / carbon / window.cpp
index 6c4f516f71d7b30ec7b8d950081303a60137f4f3..f3ba668abef4a7379766f61d8f275921768906af 100644 (file)
@@ -32,6 +32,7 @@
 #include "wx/notebook.h"
 #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"
 
@@ -64,7 +65,7 @@ BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler)
   EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged)
   EVT_INIT_DIALOG(wxWindow::OnInitDialog)
   EVT_IDLE(wxWindow::OnIdle)
-//  EVT_SCROLL(wxWindow::OnScroll)
+  EVT_SET_FOCUS(wxWindow::OnSetFocus)
 END_EVENT_TABLE()
 
 #endif
@@ -194,7 +195,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
        m_width = WidthDefault( size.x );
        m_height = HeightDefault( size.y ) ;
 
-       if ( ! IsKindOf( CLASSINFO ( wxControl ) ) )
+       if ( ! IsKindOf( CLASSINFO ( wxControl ) ) && ! IsKindOf( CLASSINFO( wxStatusBar ) ) )
        {
        MacCreateScrollBars( style ) ;
        }
@@ -204,6 +205,9 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
 
 void wxWindow::SetFocus()
 {
+       if ( gFocusWindow == this )
+               return ;
+               
        if ( AcceptsFocus() )
        {
                if (gFocusWindow )
@@ -509,6 +513,14 @@ void wxWindow::DoMoveWindow(int x, int y, int width, int height)
        DoSetSize( x,y, width, height ) ;
 }
 
+// set the size of the window: if the dimensions are positive, just use them,
+// but if any of them is equal to -1, it means that we must find the value for
+// it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in
+// which case -1 is a valid value for x and y)
+//
+// If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate
+// the width/height to best suit our contents, otherwise we reuse the current
+// width/height
 void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 {
 
@@ -530,11 +542,49 @@ void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
       actualX = currentX;
   if (y == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
       actualY = currentY;
-  if (width == -1)
+  
+  wxSize size( -1 , -1 ) ;
+  
+  if (width == -1 || height == -1 )
+  {
+       size = DoGetBestSize() ;
+  }
+  
+  if ( width == -1 )
+  {
+       if ( sizeFlags & wxSIZE_AUTO_WIDTH )
+    {
+      actualWidth = size.x ;   
+      if ( actualWidth == -1 )
+       actualWidth = 80 ;
+    }
+    else
+    {
       actualWidth = currentW ;
+    }
+  }
   if (height == -1)
+  {
+       if ( sizeFlags & wxSIZE_AUTO_HEIGHT )
+       {
+               actualHeight = size.y ;
+               if ( actualHeight == -1 )
+                       actualHeight = 26 ;
+       }
+       else 
+       {
       actualHeight = currentH ;
+    }
+  }
 
+    if ((m_minWidth != -1) && (actualWidth < m_minWidth)) 
+       actualWidth = m_minWidth;
+    if ((m_minHeight != -1) && (actualHeight < m_minHeight)) 
+       actualHeight = m_minHeight;
+    if ((m_maxWidth != -1) && (actualWidth > m_maxWidth)) 
+       actualWidth = m_maxWidth;
+    if ((m_maxHeight != -1) && (actualHeight > m_maxHeight)) 
+       actualHeight = m_maxHeight;
        if ( actualX == currentX && actualY == currentY && actualWidth == currentW && actualHeight == currentH)
        {
                MacRepositionScrollBars() ; // we might have a real position shift
@@ -564,13 +614,12 @@ void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
                else
                {
                        // erase former position
+                       wxMacDrawingHelper focus( this ) ;
+                       if ( focus.Ok() )
                        {
-                               wxMacDrawingClientHelper focus( this ) ;
-                               if ( focus.Ok() )
-                               {
-                               Rect clientrect = { 0 , 0 , m_height , m_width } ;
-                           InvalWindowRect( GetMacRootWindow() , &clientrect ) ;
-                               }
+                               Rect clientrect = { 0 , 0 , m_height , m_width } ;
+                               ClipRect( &clientrect ) ;
+                       InvalWindowRect( GetMacRootWindow() , &clientrect ) ;
                        }
                }
                m_x = actualX ;
@@ -585,7 +634,8 @@ void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
                        if ( doResize )
                                ::SizeWindow(m_macWindowData->m_macWindow, m_width, m_height  , true); 
                        
-                       // the OS takes care of invalidating and erasing        
+                       // the OS takes care of invalidating and erasing the new area
+                       // we have erased the old one   
                        
                        if ( IsKindOf( CLASSINFO( wxFrame ) ) )
                        {
@@ -597,14 +647,17 @@ void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
                else
                {
                        // erase new position
+                       
                        {
-                               wxMacDrawingClientHelper focus( this ) ;
+                               wxMacDrawingHelper focus( this ) ;
                                if ( focus.Ok() )
                                {
                                        Rect clientrect = { 0 , 0 , m_height , m_width } ;
+                                       ClipRect( &clientrect ) ;
                                InvalWindowRect( GetMacRootWindow() , &clientrect ) ;
                                }
                        }
+                       
                        if ( doMove )
                                wxWindow::MacSuperChangedPosition() ; // like this only children will be notified
                }
@@ -708,6 +761,18 @@ void wxWindow::MacSuperShown( bool show )
        }
 }
 
+bool wxWindow::MacIsReallyShown() const 
+{
+       bool status = m_isShown ;
+       wxWindow * win = this ;
+       while ( status && win->m_parent != NULL )
+       {
+               win = win->m_parent ;
+               status = win->m_isShown ;
+       }
+       return status ;
+}
+
 int wxWindow::GetCharHeight() const
 {
        wxClientDC dc ( (wxWindow*)this ) ;
@@ -1012,27 +1077,16 @@ void  wxWindow::MacCreateRealWindow( const wxString& title,
                        attr |= kWindowSideTitlebarAttribute ;
                }
        }
-       else if ( HasFlag( wxTHICK_FRAME ) )
+       else if ( HasFlag( wxCAPTION ) )
        {
                if ( HasFlag( wxDIALOG_MODAL ) )
                {
                        wclass = kMovableModalWindowClass ;
                }
-               else if ( HasFlag( wxDIALOG_MODELESS ) )
+               else 
                {
                        wclass = kDocumentWindowClass ;
                }
-               else
-               {
-                       if ( HasFlag( wxCAPTION ) )
-                       {
-                               wclass = kDocumentWindowClass ;
-                       }
-                       else
-                       {
-                               wclass = kModalWindowClass ;
-                       }
-               }
        }
        else
        {
@@ -1345,6 +1399,30 @@ wxObject* wxWindow::GetChild(int number) const
 }
 #endif // WXWIN_COMPATIBILITY
 
+void wxWindow::OnSetFocus(wxFocusEvent& event)
+{
+    // panel wants to track the window which was the last to have focus in it,
+    // so we want to set ourselves as the window which last had focus
+    //
+    // notice that it's also important to do it upwards the tree becaus
+    // otherwise when the top level panel gets focus, it won't set it back to
+    // us, but to some other sibling
+    wxWindow *win = this;
+    while ( win )
+    {
+        wxWindow *parent = win->GetParent();
+        wxPanel *panel = wxDynamicCast(parent, wxPanel);
+        if ( panel )
+        {
+            panel->SetLastFocus(win);
+        }
+
+        win = parent;
+    }
+
+    event.Skip();
+}
+
 void wxWindow::Clear()
 {
        if ( m_macWindowData )
@@ -1509,6 +1587,13 @@ bool wxWindow::MacDispatchMouseEvent(wxMouseEvent& event)
        {
                m_cursor.MacInstall() ;
        }
+       
+       if ( event.GetEventType() == wxEVT_LEFT_DOWN )
+       {
+       // set focus to this window
+        if (AcceptsFocus() && FindFocus()!=this)
+               SetFocus();
+    }
 
 #if wxUSE_TOOLTIPS
     if ( event.GetEventType() == wxEVT_MOTION 
@@ -1658,7 +1743,7 @@ void wxWindow::MacMouseMoved( EventRecord *ev , short part)
 }
 void wxWindow::MacActivate( EventRecord *ev , bool inIsActivating )
 {
-       wxActivateEvent event(wxEVT_ACTIVATE, inIsActivating);
+       wxActivateEvent event(wxEVT_ACTIVATE, inIsActivating , m_windowId);
        event.m_timeStamp = ev->when ;
        event.SetEventObject(this);
        
@@ -2007,56 +2092,6 @@ void wxWindow::MacSuperChangedPosition()
                node = node->Next();
        }
 }
-/*
-
-bool wxWindow::MacSetupFocusPort(  ) 
-{
-       Point localOrigin ;
-       Rect clipRect ;
-       WindowRef window ;
-       wxWindow *rootwin ;
-       GrafPtr port ;
-       
-       MacGetPortParams( &localOrigin , &clipRect , &window , &rootwin) ;
-       return  MacSetPortFocusParams( localOrigin, clipRect, window , rootwin ) ; 
-}
-
-bool wxWindow::MacSetupFocusClientPort(  ) 
-{
-       Point localOrigin ;
-       Rect clipRect ;
-       WindowRef window ;
-       wxWindow *rootwin ;
-       GrafPtr port ;
-       
-       MacGetPortClientParams( &localOrigin , &clipRect , &window , &rootwin) ;
-       return  MacSetPortFocusParams( localOrigin, clipRect, window , rootwin ) ; 
-}
-
-bool wxWindow::MacSetupDrawingPort(  ) 
-{
-       Point localOrigin ;
-       Rect clipRect ;
-       WindowRef window ;
-       wxWindow *rootwin ;
-       GrafPtr port ;
-       
-       MacGetPortParams( &localOrigin , &clipRect , &window , &rootwin) ;
-       return  MacSetPortDrawingParams( localOrigin, clipRect, window , rootwin ) ; 
-}
-
-bool wxWindow::MacSetupDrawingClientPort(  ) 
-{
-       Point localOrigin ;
-       Rect clipRect ;
-       WindowRef window ;
-       wxWindow *rootwin ;
-       GrafPtr port ;
-       
-       MacGetPortClientParams( &localOrigin , &clipRect , &window , &rootwin) ;
-       return  MacSetPortDrawingParams( localOrigin, clipRect, window , rootwin ) ; 
-}
-*/
 
 bool wxWindow::MacSetPortFocusParams( const Point & localOrigin, const Rect & clipRect, WindowRef window , wxWindow* win ) 
 {
@@ -2271,37 +2306,8 @@ long wxWindow::MacRemoveBordersFromStyle( long style )
 {
        return style & ~( wxDOUBLE_BORDER | wxSUNKEN_BORDER | wxRAISED_BORDER | wxBORDER | wxSTATIC_BORDER ) ;
 }
-/*
-wxMacFocusHelper::wxMacFocusHelper( wxWindow * theWindow ) 
-{
-       m_ok = false ;
-       Point localOrigin ;
-       Rect clipRect ;
-       WindowRef window ;
-       wxWindow *rootwin ;
-       m_currentPort = NULL ;
-       GetPort( &m_formerPort ) ;
-       if ( theWindow )
-       {
-       
-               theWindow->MacGetPortParams( &localOrigin , &clipRect , &window , &rootwin) ;
-               m_currentPort = UMAGetWindowPort( window ) ;
-               theWindow->MacSetPortFocusParams( localOrigin, clipRect, window , rootwin ) ; 
-               m_ok = true ;
-       }
-}
-       
-wxMacFocusHelper::~wxMacFocusHelper() 
-{
-       if ( m_ok )
-       {
-               SetPort( m_currentPort ) ;
-               SetOrigin( 0 , 0 ) ;
-       }
-       if ( m_formerPort != m_currentPort )
-               SetPort( m_formerPort ) ;
-}
-*/
+
+
 wxMacDrawingHelper::wxMacDrawingHelper( wxWindow * theWindow ) 
 {
        m_ok = false ;
@@ -2334,43 +2340,12 @@ wxMacDrawingHelper::~wxMacDrawingHelper()
                Rect portRect ;
                GetPortBounds( m_currentPort , &portRect ) ;
                ClipRect( &portRect ) ;
+               wxDC::MacInvalidateSetup() ;    
        }
                
        if ( m_formerPort != m_currentPort )
                SetPort( m_formerPort ) ;
 }
-/*
-wxMacFocusClientHelper::wxMacFocusClientHelper( wxWindow * theWindow ) 
-{
-       m_ok = false ;
-       Point localOrigin ;
-       Rect clipRect ;
-       WindowRef window ;
-       wxWindow *rootwin ;
-       m_currentPort = NULL ;
-       
-       GetPort( &m_formerPort ) ;
-
-       if ( theWindow )
-       {
-               theWindow->MacGetPortClientParams( &localOrigin , &clipRect , &window , &rootwin) ;
-               m_currentPort = UMAGetWindowPort( window ) ;
-               theWindow->MacSetPortFocusParams( localOrigin, clipRect, window , rootwin ) ; 
-               m_ok = true ;
-       }
-}
-       
-wxMacFocusClientHelper::~wxMacFocusClientHelper() 
-{
-       if ( m_ok )
-       {
-               SetPort( m_currentPort ) ;
-               SetOrigin( 0 , 0 ) ;
-       }
-       if ( m_formerPort != m_currentPort )
-               SetPort( m_formerPort ) ;
-}
-*/
 
 wxMacDrawingClientHelper::wxMacDrawingClientHelper( wxWindow * theWindow ) 
 {