]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/window.cpp
delete children in ~wxWindow dtor and not in the base class ~wxWindowNative as it...
[wxWidgets.git] / src / mac / carbon / window.cpp
index 40ee2cdef0af0f012c7482212ffaf94ceaae3234..313f6f0b19be708f98b039b3b85ac31450754d70 100644 (file)
@@ -24,7 +24,6 @@
 #include "wx/layout.h"
 #include "wx/dialog.h"
 #include "wx/scrolbar.h"
-#include "wx/scrolwin.h"
 #include "wx/statbox.h"
 #include "wx/button.h"
 #include "wx/settings.h"
@@ -37,8 +36,6 @@
 #include "wx/log.h"
 #include "wx/geometry.h"
 #include "wx/textctrl.h"
-#include "wx/laywin.h"
-#include "wx/splitter.h"
 
 #include "wx/toolbar.h"
 #include "wx/dc.h"
@@ -47,9 +44,6 @@
     #include "wx/caret.h"
 #endif // wxUSE_CARET
 
-#define wxWINDOW_HSCROLL 5998
-#define wxWINDOW_VSCROLL 5997
-
 #define MAC_SCROLLBAR_SIZE 15
 #define MAC_SMALL_SCROLLBAR_SIZE 11
 
@@ -526,6 +520,7 @@ ControlUserPaneBackgroundUPP gControlUserPaneBackgroundUPP = NULL ;
 // implementation
 // ===========================================================================
 
+#if KEY_wxList_DEPRECATED
 wxList wxWinMacControlList(wxKEY_INTEGER);
 
 wxWindow *wxFindControlFromMacControl(ControlRef inControl )
@@ -550,6 +545,42 @@ void wxRemoveMacControlAssociation(wxWindow *control)
 {
     wxWinMacControlList.DeleteObject(control);
 }
+#else
+
+WX_DECLARE_HASH_MAP(ControlRef, wxWindow*, wxPointerHash, wxPointerEqual, MacControlMap);
+
+static MacControlMap wxWinMacControlList;
+
+wxWindow *wxFindControlFromMacControl(ControlRef inControl )
+{
+    MacControlMap::iterator node = wxWinMacControlList.find(inControl);
+
+    return (node == wxWinMacControlList.end()) ? NULL : node->second;
+}
+
+void wxAssociateControlWithMacControl(ControlRef inControl, wxWindow *control)
+{
+    // adding NULL ControlRef is (first) surely a result of an error and
+    // (secondly) breaks native event processing
+    wxCHECK_RET( inControl != (ControlRef) NULL, wxT("attempt to add a NULL WindowRef to window list") );
+
+    wxWinMacControlList[inControl] = control;
+}
+
+void wxRemoveMacControlAssociation(wxWindow *control)
+{
+   // iterate over all the elements in the class
+    MacControlMap::iterator it;
+    for ( it = wxWinMacControlList.begin(); it != wxWinMacControlList.end(); ++it )
+    {
+        if ( it->second == control )
+        {
+            wxWinMacControlList.erase(it);
+            break;
+        }
+    }
+}
+#endif // deprecated wxList
 
 // UPP functions
 ControlActionUPP wxMacLiveScrollbarActionUPP = NULL ;
@@ -813,8 +844,6 @@ bool wxWindowMac::Create(wxWindowMac *parent, wxWindowID id,
     if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) )
         return FALSE;
 
-    parent->AddChild(this);
-
     m_windowVariant = parent->GetWindowVariant() ;
 
     if ( m_macIsUserPane )
@@ -863,17 +892,32 @@ bool wxWindowMac::Create(wxWindowMac *parent, wxWindowID id,
     return TRUE;
 }
 
+void wxWindowMac::MacChildAdded() 
+{
+    if ( m_vScrollBar )
+    {
+        m_vScrollBar->Raise() ;
+    }
+    if ( m_hScrollBar )
+    {
+        m_hScrollBar->Raise() ;
+    }
+
+}
+
 void wxWindowMac::MacPostControlCreate(const wxPoint& pos, const wxSize& size)
 {
     wxASSERT_MSG( m_peer != NULL && m_peer->Ok() , wxT("No valid mac control") ) ;
 
     m_peer->SetReference( (long) this ) ;
+    GetParent()->AddChild(this);
 
     MacInstallEventHandler( (WXWidget) m_peer->GetControlRef() );
 
     ControlRef container = (ControlRef) GetParent()->GetHandle() ;
     wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ;
     ::EmbedControl( m_peer->GetControlRef() , container ) ;
+    GetParent()->MacChildAdded() ;
 
     // adjust font, controlsize etc
     DoSetWindowVariant( m_windowVariant ) ;
@@ -1354,12 +1398,12 @@ void wxWindowMac::MacGetContentAreaInset( int &left , int &top , int &right , in
     if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr )
     {
         GetRegionBounds( rgn , &content ) ;
-        DisposeRgn( rgn ) ;
     }
     else
     {
         m_peer->GetRect( &content ) ;
     }
+    DisposeRgn( rgn ) ;
     Rect structure ;
     m_peer->GetRect( &structure ) ;
 #if !TARGET_API_MAC_OSX
@@ -1382,12 +1426,12 @@ wxSize wxWindowMac::DoGetSizeFromClientSize( const wxSize & size )  const
     if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr )
     {
         GetRegionBounds( rgn , &content ) ;
-        DisposeRgn( rgn ) ;
     }
     else
     {
         m_peer->GetRect( &content ) ;
     }
+    DisposeRgn( rgn ) ;
     Rect structure ;
     m_peer->GetRect( &structure ) ;
 #if !TARGET_API_MAC_OSX
@@ -1414,12 +1458,12 @@ void wxWindowMac::DoGetClientSize(int *x, int *y) const
     if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr )
     {
         GetRegionBounds( rgn , &content ) ;
-        DisposeRgn( rgn ) ;
     }
     else
     {
         m_peer->GetRect( &content ) ;
     }
+    DisposeRgn( rgn ) ;
 #if !TARGET_API_MAC_OSX
     Rect structure ;
     m_peer->GetRect( &structure ) ;
@@ -1724,10 +1768,12 @@ wxSize wxWindowMac::DoGetBestSize() const
         {
             bestsize.bottom = 16 ;
         }
+#if wxUSE_SPINBTN 
         else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) )
         {
             bestsize.bottom = 24 ;
         }
+#endif // wxUSE_SPINBTN 
         else
         {
             // return wxWindowBase::DoGetBestSize() ;
@@ -1872,11 +1918,14 @@ bool wxWindowMac::Show(bool show)
         return FALSE;
 
     // TODO use visibilityChanged Carbon Event for OSX
-    bool former = MacIsReallyShown() ;
+    if ( m_peer )
+    {
+        bool former = MacIsReallyShown() ;
 
-    m_peer->SetVisibility( show , true ) ;
-    if ( former != MacIsReallyShown() )
-        MacPropagateVisibilityChanged() ;
+        m_peer->SetVisibility( show , true ) ;
+        if ( former != MacIsReallyShown() )
+            MacPropagateVisibilityChanged() ;
+    }
     return TRUE;
 }
 
@@ -1903,7 +1952,7 @@ void wxWindowMac::MacPropagateVisibilityChanged()
 #if !TARGET_API_MAC_OSX
     MacVisibilityChanged() ;
 
-    wxWindowListNode *node = GetChildren().GetFirst();
+    wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
     while ( node )
     {
         wxWindowMac *child = node->GetData();
@@ -1919,7 +1968,7 @@ void wxWindowMac::MacPropagateEnabledStateChanged( )
 #if !TARGET_API_MAC_OSX
     MacEnabledStateChanged() ;
 
-    wxWindowListNode *node = GetChildren().GetFirst();
+    wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
     while ( node )
     {
         wxWindowMac *child = node->GetData();
@@ -1935,7 +1984,7 @@ void wxWindowMac::MacPropagateHiliteChanged( )
 #if !TARGET_API_MAC_OSX
     MacHiliteChanged() ;
 
-    wxWindowListNode *node = GetChildren().GetFirst();
+    wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
     while ( node )
     {
         wxWindowMac *child = node->GetData();
@@ -2434,7 +2483,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
 #endif
     }
 
-    for (wxWindowListNode *node = GetChildren().GetFirst(); node; node = node->GetNext())
+    for (wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); node; node = node->GetNext())
     {
         wxWindowMac *child = node->GetData();
         if (child == m_vScrollBar) continue;
@@ -2489,7 +2538,7 @@ void wxWindowMac::MacOnScroll(wxScrollEvent &event )
 }
 
 // Get the window with the focus
-wxWindowMac *wxWindowBase::FindFocus()
+wxWindowMac *wxWindowBase::DoFindFocus()
 {
     ControlRef control ;
     GetKeyboardFocus( GetUserFocusWindow() , &control ) ;
@@ -2732,9 +2781,8 @@ wxRegion wxWindowMac::MacGetVisibleRegion( bool includeOuterStructures )
                 MacRootWindowToWindow( &x , &y ) ;
 
                 if ( !includeOuterStructures || (
-                    parent->IsKindOf( CLASSINFO( wxScrolledWindow ) ) ||
-                    parent->IsKindOf( CLASSINFO( wxSashLayoutWindow ) ) ||
-                    ( parent->GetParent() && parent->GetParent()->IsKindOf( CLASSINFO( wxSplitterWindow ) ) )
+                    parent->MacClipChildren() ||
+                    ( parent->GetParent() && parent->GetParent()->MacClipGrandChildren() )
                     ) )
                 {
                     SetRectRgn( tempRgn ,
@@ -2816,7 +2864,7 @@ bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr , long time )
         // in Composited windowing
         wxPoint clientOrigin = GetClientAreaOrigin() ;
 
-        for (wxWindowListNode *node = GetChildren().GetFirst(); node; node = node->GetNext())
+        for (wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); node; node = node->GetNext())
         {
             wxWindowMac *child = node->GetData();
             if (child == m_vScrollBar) continue;
@@ -2935,13 +2983,13 @@ void wxWindowMac::MacCreateScrollBars( long style )
 
         if ( style & wxVSCROLL )
         {
-            m_vScrollBar = new wxScrollBar(this, wxWINDOW_VSCROLL, vPoint,
+            m_vScrollBar = new wxScrollBar(this, wxID_ANY, vPoint,
                 vSize , wxVERTICAL);
         }
 
         if ( style  & wxHSCROLL )
         {
-            m_hScrollBar = new wxScrollBar(this, wxWINDOW_HSCROLL, hPoint,
+            m_hScrollBar = new wxScrollBar(this, wxID_ANY, hPoint,
                 hSize , wxHORIZONTAL);
         }
     }
@@ -3039,7 +3087,7 @@ void wxWindowMac::MacSuperChangedPosition()
 {
     // only window-absolute structures have to be moved i.e. controls
 
-    wxWindowListNode *node = GetChildren().GetFirst();
+    wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
     while ( node )
     {
         wxWindowMac *child = node->GetData();
@@ -3052,7 +3100,7 @@ void wxWindowMac::MacTopLevelWindowChangedPosition()
 {
     // only screen-absolute structures have to be moved i.e. glcanvas
 
-    wxWindowListNode *node = GetChildren().GetFirst();
+    wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
     while ( node )
     {
         wxWindowMac *child = node->GetData();