]> 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 e602f93fabec8748d20fbfa1304b25047cafbe0c..f3ba668abef4a7379766f61d8f275921768906af 100644 (file)
@@ -23,6 +23,8 @@
 #include "wx/layout.h"
 #include "wx/dialog.h"
 #include "wx/listbox.h"
+#include "wx/scrolbar.h"
+#include "wx/statbox.h"
 #include "wx/button.h"
 #include "wx/settings.h"
 #include "wx/msgdlg.h"
@@ -30,8 +32,9 @@
 #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/mac/window.h"
+#include "wx/window.h"
 
 #include "wx/menuitem.h"
 #include "wx/log.h"
@@ -62,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
@@ -192,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 ) ;
        }
@@ -202,6 +205,9 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
 
 void wxWindow::SetFocus()
 {
+       if ( gFocusWindow == this )
+               return ;
+               
        if ( AcceptsFocus() )
        {
                if (gFocusWindow )
@@ -437,8 +443,8 @@ void wxWindow::DoGetClientSize(int *x, int *y) const
     *x = m_width ;
     *y = m_height ;
 
-       *x -= 2 * MacGetBorderSize(  ) ;
-       *y -= 2 * MacGetBorderSize(  ) ;
+       *x -= MacGetLeftBorderSize(  )  + MacGetRightBorderSize(  ) ;
+       *y -= MacGetTopBorderSize(  ) + MacGetBottomBorderSize( );
        
   if ( (m_vScrollBar && m_vScrollBar->IsShown()) || (m_hScrollBar  && m_hScrollBar->IsShown()) )
   {
@@ -507,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)
 {
 
@@ -528,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
@@ -562,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 ;
@@ -583,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 ) ) )
                        {
@@ -595,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
                }
@@ -627,7 +682,7 @@ void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 
 wxPoint wxWindow::GetClientAreaOrigin() const
 {
-    return wxPoint(MacGetBorderSize(  ) , MacGetBorderSize(  ) );
+    return wxPoint(MacGetLeftBorderSize(  ) , MacGetTopBorderSize(  ) );
 }
 
 // Makes an adjustment to the window position (for example, a frame that has
@@ -706,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 ) ;
@@ -725,7 +792,7 @@ void wxWindow::GetTextExtent(const wxString& string, int *x, int *y,
     if ( !fontToUse )
         fontToUse = &m_font;
         
-    wxClientDC dc( this ) ;
+    wxClientDC dc( (wxWindow*) this ) ;
     long lx,ly,ld,le ;
     dc.GetTextExtent( string , &lx , &ly , &ld, &le, fontToUse ) ;
     if ( externalLeading )
@@ -999,8 +1066,8 @@ void  wxWindow::MacCreateRealWindow( const wxString& title,
 
        // translate the window attributes in the appropriate window class and attributes
 
-       WindowClass wclass  ;
-       WindowAttributes attr  ;
+       WindowClass wclass = 0;
+       WindowAttributes attr = kWindowNoAttributes ;
        
        if ( HasFlag(wxTINY_CAPTION_HORIZ) ||  HasFlag(wxTINY_CAPTION_VERT) )
        {
@@ -1010,35 +1077,22 @@ 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
        {
                wclass = kModalWindowClass ;
        }
        
-       attr = kWindowNoAttributes ;
-       
        if ( HasFlag( wxMINIMIZE_BOX ) || HasFlag( wxMAXIMIZE_BOX ) )
        {
                attr |= kWindowFullZoomAttribute ;
@@ -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 )
@@ -1417,8 +1495,8 @@ void wxWindow::DoSetClientSize(int width, int height)
                if ( height != -1 && m_vScrollBar )
                        height += MAC_SCROLLBAR_SIZE ;
 
-               width += 2 * MacGetBorderSize(  ) ;
-               height += 2 * MacGetBorderSize(  ) ;
+               width += MacGetLeftBorderSize(  ) + MacGetRightBorderSize( ) ;
+               height += MacGetTopBorderSize(  ) + MacGetBottomBorderSize( ) ;
 
                DoSetSize( -1 , -1 , width , height ) ;
        }
@@ -1443,7 +1521,8 @@ bool wxWindow::MacGetWindowFromPointSub( const wxPoint &point , wxWindow** outWi
        for (wxNode *node = GetChildren().First(); node; node = node->Next())
        {
                wxWindow *child = (wxWindow*)node->Data();
-               if ( child->GetMacRootWindow() == window )
+               // added the m_isShown test --dmazzoni
+               if ( child->GetMacRootWindow() == window && child->m_isShown )
                {
                        if (child->MacGetWindowFromPointSub(newPoint , outWin ))
                                return TRUE;
@@ -1462,9 +1541,12 @@ bool wxWindow::MacGetWindowFromPoint( const wxPoint &screenpoint , wxWindow** ou
        {
                        wxPoint point( screenpoint ) ;
                        wxWindow* win = wxFindWinFromMacWindow( window ) ;
+                       if ( win )
+                       {
                        win->ScreenToClient( point ) ;
                        return win->MacGetWindowFromPointSub( point , outWin ) ;
        }
+       }
        return FALSE ;
 }
 
@@ -1505,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 
@@ -1654,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);
        
@@ -1907,8 +1996,8 @@ void wxWindow::MacRepositionScrollBars()
        int width = m_width ; 
        int height = m_height ;
 
-       width -= 2 * MacGetBorderSize() ;
-       height -= 2 * MacGetBorderSize() ;
+       width -= MacGetLeftBorderSize() + MacGetRightBorderSize();
+       height -= MacGetTopBorderSize() + MacGetBottomBorderSize();
        
        wxPoint vPoint(width-MAC_SCROLLBAR_SIZE, 0) ;
        wxSize vSize(MAC_SCROLLBAR_SIZE, height - adjust) ;
@@ -2003,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 ) 
 {
@@ -2183,7 +2222,7 @@ void wxWindow::MacGetPortClientParams(Point* localOrigin, Rect* clipRect, Window
        SectRect(clipRect, &myClip, clipRect);
 }
 
-long wxWindow::MacGetBorderSize( ) const
+long wxWindow::MacGetLeftBorderSize( ) const
 {
        if( m_macWindowData )
                return 0 ;
@@ -2203,41 +2242,72 @@ long wxWindow::MacGetBorderSize( ) const
        return 0 ;
 }
 
-long wxWindow::MacRemoveBordersFromStyle( long style ) 
+long wxWindow::MacGetRightBorderSize( ) const
 {
-       return style & ~( wxDOUBLE_BORDER | wxSUNKEN_BORDER | wxRAISED_BORDER | wxBORDER | wxSTATIC_BORDER ) ;
+       if( m_macWindowData )
+               return 0 ;
+
+    if (m_windowStyle & wxRAISED_BORDER || m_windowStyle & wxSUNKEN_BORDER )
+    {
+               return 3 ;
+    }
+    else if (  m_windowStyle &wxDOUBLE_BORDER)
+    {
+               return 3 ;
+    }
+    else if (m_windowStyle &wxSIMPLE_BORDER)
+    {
+       return 3 ;
+    }
+       return 0 ;
 }
-/*
-wxMacFocusHelper::wxMacFocusHelper( wxWindow * theWindow ) 
+
+long wxWindow::MacGetTopBorderSize( ) const
 {
-       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 ;
-       }
+       if( m_macWindowData )
+               return 0 ;
+
+    if (m_windowStyle & wxRAISED_BORDER || m_windowStyle & wxSUNKEN_BORDER )
+    {
+               return 2 ;
+    }
+    else if (  m_windowStyle &wxDOUBLE_BORDER)
+    {
+               return 2 ;
+    }
+    else if (m_windowStyle &wxSIMPLE_BORDER)
+    {
+       return 1 ;
+    }
+       return 0 ;
 }
-       
-wxMacFocusHelper::~wxMacFocusHelper() 
+
+long wxWindow::MacGetBottomBorderSize( ) const
 {
-       if ( m_ok )
-       {
-               SetPort( m_currentPort ) ;
-               SetOrigin( 0 , 0 ) ;
-       }
-       if ( m_formerPort != m_currentPort )
-               SetPort( m_formerPort ) ;
+       if( m_macWindowData )
+               return 0 ;
+
+    if (m_windowStyle & wxRAISED_BORDER || m_windowStyle & wxSUNKEN_BORDER )
+    {
+               return 3 ;
+    }
+    else if (  m_windowStyle &wxDOUBLE_BORDER)
+    {
+               return 3 ;
+    }
+    else if (m_windowStyle &wxSIMPLE_BORDER)
+    {
+       return 3 ;
+    }
+       return 0 ;
 }
-*/
+
+long wxWindow::MacRemoveBordersFromStyle( long style ) 
+{
+       return style & ~( wxDOUBLE_BORDER | wxSUNKEN_BORDER | wxRAISED_BORDER | wxBORDER | wxSTATIC_BORDER ) ;
+}
+
+
 wxMacDrawingHelper::wxMacDrawingHelper( wxWindow * theWindow ) 
 {
        m_ok = false ;
@@ -2270,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 ) 
 {