handle child destruction notifications in wxTLW itself and reset both normal and temporary default item pointers when the default window is destroyed

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45275 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2007-04-06 19:22:38 +00:00
parent d1cd787b75
commit f8ab85ae72
3 changed files with 18 additions and 15 deletions

View File

@@ -295,6 +295,11 @@ protected:
static int WidthDefault(int w) { return w == wxDefaultCoord ? GetDefaultSize().x : w; }
static int HeightDefault(int h) { return h == wxDefaultCoord ? GetDefaultSize().y : h; }
// reset m_winDefault and m_winTmpDefault if they point to the window being
// destroyed
void OnChildDestroy(wxWindowDestroyEvent& event);
// the frame icon
wxIconBundle m_icons;

View File

@@ -39,6 +39,7 @@
BEGIN_EVENT_TABLE(wxTopLevelWindowBase, wxWindow)
EVT_CLOSE(wxTopLevelWindowBase::OnCloseWindow)
EVT_SIZE(wxTopLevelWindowBase::OnSize)
EVT_WINDOW_DESTROY(wxTopLevelWindowBase::OnChildDestroy)
END_EVENT_TABLE()
// ============================================================================
@@ -369,6 +370,17 @@ void wxTopLevelWindowBase::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
Destroy();
}
void wxTopLevelWindowBase::OnChildDestroy(wxWindowDestroyEvent& event)
{
event.Skip();
wxWindow * const win = event.GetWindow();
if ( win == m_winDefault )
m_winDefault = NULL;
if ( win == m_winTmpDefault )
m_winTmpDefault = NULL;
}
bool wxTopLevelWindowBase::SendIconizeEvent(bool iconized)
{
wxIconizeEvent event(GetId(), iconized);

View File

@@ -318,23 +318,9 @@ wxWindowBase::~wxWindowBase()
wxASSERT_MSG( GetChildren().GetCount() == 0, wxT("children not destroyed") );
// reset the top-level parent's default item if it is this widget
// notify the parent about this window destruction
if ( m_parent )
{
wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent((wxWindow*)this),
wxTopLevelWindow);
if ( tlw && tlw->GetDefaultItem() == this )
tlw->SetDefaultItem(NULL);
if ( tlw && tlw->GetTmpDefaultItem() == this )
tlw->SetTmpDefaultItem(NULL);
}
// reset the dangling pointer our parent window may keep to us
if ( m_parent )
{
m_parent->RemoveChild(this);
}
#if wxUSE_CARET
delete m_caret;