]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/window.cpp
applied correction from Marc Newsam in calculations of linesize
[wxWidgets.git] / src / mac / carbon / window.cpp
index 605f3af77c7b9dc337ceac41a233a81d460292ec..382b71024f1d48411f461dc841eba2c322d464b7 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"
 
@@ -65,7 +63,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
@@ -205,6 +203,9 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
 
 void wxWindow::SetFocus()
 {
+       if ( gFocusWindow == this )
+               return ;
+               
        if ( AcceptsFocus() )
        {
                if (gFocusWindow )
@@ -510,6 +511,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)
 {
 
@@ -531,11 +540,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
@@ -714,6 +761,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 )
@@ -722,6 +774,7 @@ bool wxWindow::MacIsReallyShown() const
                status = win->m_isShown ;
        }
        return status ;
+*/
 }
 
 int wxWindow::GetCharHeight() const
@@ -745,7 +798,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 )
@@ -1034,23 +1087,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
        {
@@ -1363,6 +1403,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 )
@@ -1527,6 +1591,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 
@@ -1676,7 +1747,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);
        
@@ -2239,7 +2310,37 @@ 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 ) 
 {