]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/toplvcmn.cpp
added vendor display name (for consistency with app display name &c) (patch 1831303)
[wxWidgets.git] / src / common / toplvcmn.cpp
index 428c54dac5bd9660486cfa6b1d9e97c19e8ed623..4e501fa79de3a11eecbc4a5dcec1a776783a6c55 100644 (file)
@@ -40,8 +40,11 @@ BEGIN_EVENT_TABLE(wxTopLevelWindowBase, wxWindow)
     EVT_CLOSE(wxTopLevelWindowBase::OnCloseWindow)
     EVT_SIZE(wxTopLevelWindowBase::OnSize)
     EVT_WINDOW_DESTROY(wxTopLevelWindowBase::OnChildDestroy)
+    WX_EVENT_TABLE_CONTROL_CONTAINER(wxTopLevelWindowBase)
 END_EVENT_TABLE()
 
+WX_DELEGATE_TO_CONTROL_CONTAINER(wxTopLevelWindowBase, wxWindow)
+
 // ============================================================================
 // implementation
 // ============================================================================
@@ -56,18 +59,51 @@ wxTopLevelWindowBase::wxTopLevelWindowBase()
 {
     // Unlike windows, top level windows are created hidden by default.
     m_isShown = false;
-    m_winDefault = NULL;
+    m_winDefault =
     m_winTmpDefault = NULL;
+
+    WX_INIT_CONTROL_CONTAINER();
 }
 
 wxTopLevelWindowBase::~wxTopLevelWindowBase()
 {
+    m_winDefault =
+    m_winTmpDefault = NULL;
+
     // don't let wxTheApp keep any stale pointers to us
     if ( wxTheApp && wxTheApp->GetTopWindow() == this )
         wxTheApp->SetTopWindow(NULL);
 
     wxTopLevelWindows.DeleteObject(this);
 
+    // delete any our top level children which are still pending for deletion
+    // immediately: this could happen if a child (e.g. a temporary dialog
+    // created with this window as parent) was Destroy()'d) while this window
+    // was deleted directly (with delete, or maybe just because it was created
+    // on the stack) immediately afterwards and before the child TLW was really
+    // destroyed -- not destroying it now would leave it alive with a dangling
+    // parent pointer and result in a crash later
+    for ( wxObjectList::iterator i = wxPendingDelete.begin();
+          i != wxPendingDelete.end();
+          )
+    {
+        wxWindow * const win = wxDynamicCast(*i, wxWindow);
+        if ( win && win->GetParent() == this )
+        {
+            wxPendingDelete.erase(i);
+
+            delete win;
+
+            // deleting it invalidated the list (and not only one node because
+            // it could have resulted in deletion of other objects to)
+            i = wxPendingDelete.begin();
+        }
+        else
+        {
+            ++i;
+        }
+    }
+
     if ( IsLastBeforeExit() )
     {
         // no other (important) windows left, quit the app
@@ -143,29 +179,12 @@ bool wxTopLevelWindowBase::IsLastBeforeExit() const
 
 void wxTopLevelWindowBase::SetMinSize(const wxSize& minSize)
 {
-    SetSizeHints( minSize.x, minSize.y, GetMaxWidth(), GetMaxHeight() );    
+    SetSizeHints(minSize, GetMaxSize());
 }
 
 void wxTopLevelWindowBase::SetMaxSize(const wxSize& maxSize)
 {
-    SetSizeHints( GetMinWidth(), GetMinHeight(), maxSize.x, maxSize.y );
-}
-
-// set the min/max size of the window
-void wxTopLevelWindowBase::DoSetSizeHints(int minW, int minH,
-                                  int maxW, int maxH,
-                                  int WXUNUSED(incW), int WXUNUSED(incH))
-{
-    // setting min width greater than max width leads to infinite loops under
-    // X11 and generally doesn't make any sense, so don't allow it
-    wxCHECK_RET( (minW == wxDefaultCoord || maxW == wxDefaultCoord || minW <= maxW) &&
-                    (minH == wxDefaultCoord || maxH == wxDefaultCoord || minH <= maxH),
-                 _T("min width/height must be less than max width/height!") );
-
-    m_minWidth = minW;
-    m_maxWidth = maxW;
-    m_minHeight = minH;
-    m_maxHeight = maxH;
+    SetSizeHints(GetMinSize(), maxSize);
 }
 
 void wxTopLevelWindowBase::GetRectForTopLevelChildren(int *x, int *y, int *w, int *h)
@@ -429,14 +448,3 @@ void wxTopLevelWindowBase::RequestUserAttention(int WXUNUSED(flags))
     // it's probably better than do nothing, isn't it?
     Raise();
 }
-
-void wxTopLevelWindowBase::RemoveChild(wxWindowBase *child)
-{
-    if ( child == m_winDefault )
-        m_winDefault = NULL;
-
-    if ( child == m_winTmpDefault )
-        m_winTmpDefault = NULL;
-
-    wxWindow::RemoveChild(child);
-}