From 54c7eb3c56ac5c56906cd8c4f004ad7415b8841a Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Mon, 10 Nov 2014 16:41:07 +0000 Subject: [PATCH] Invalidate wxPG property and its sub-properties names prior deferred deletion. If deleted property is a category property then all its sub-properties have to be renamed prior deleting. See #16617. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@78111 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/propgrid/propgridpagestate.h | 10 ++++++ src/propgrid/propgridpagestate.cpp | 41 +++++++++++++++++++------ 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/include/wx/propgrid/propgridpagestate.h b/include/wx/propgrid/propgridpagestate.h index b57efe3d81..4218f1f90b 100644 --- a/include/wx/propgrid/propgridpagestate.h +++ b/include/wx/propgrid/propgridpagestate.h @@ -704,6 +704,16 @@ protected: /** Mark sub-properties as being deleted */ void DoMarkChildrenAsDeleted(wxPGProperty* p, bool recursive); + /** Rename the property + so it won't remain in the way of the user code. + */ + void DoInvalidatePropertyName(wxPGProperty* p); + + /** Rename sub-properties + so it won't remain in the way of the user code. + */ + void DoInvalidateChildrenNames(wxPGProperty* p, bool recursive); + /** If visible, then this is pointer to wxPropertyGrid. This shall *never* be NULL to indicate that this state is not visible. */ diff --git a/src/propgrid/propgridpagestate.cpp b/src/propgrid/propgridpagestate.cpp index fec76a46b1..25edfe733e 100644 --- a/src/propgrid/propgridpagestate.cpp +++ b/src/propgrid/propgridpagestate.cpp @@ -1897,6 +1897,35 @@ void wxPropertyGridPageState::DoMarkChildrenAsDeleted(wxPGProperty* p, } } +void wxPropertyGridPageState::DoInvalidatePropertyName(wxPGProperty* p) +{ + // Let's trust that no sane property uses prefix like + // this. It would be anyway fairly inconvenient (in + // current code) to check whether a new name is used + // by another property with parent (due to the child + // name notation). + wxString newName = wxT("_&/_%$") + p->GetBaseName(); + DoSetPropertyName(p, newName); +} + +void wxPropertyGridPageState::DoInvalidateChildrenNames(wxPGProperty* p, + bool recursive) +{ + if (p->IsCategory()) + { + for( unsigned int i = 0; i < p->GetChildCount(); i++ ) + { + wxPGProperty* child = p->Item(i); + DoInvalidatePropertyName(child); + + if ( recursive ) + { + DoInvalidateChildrenNames(child, recursive); + } + } + } +} + void wxPropertyGridPageState::DoDelete( wxPGProperty* item, bool doDelete ) { wxCHECK_RET( item->GetParent(), @@ -1953,16 +1982,10 @@ void wxPropertyGridPageState::DoDelete( wxPGProperty* item, bool doDelete ) pg->m_removedProperties.push_back(item); } - // Rename the property so it won't remain in the way + // Rename the property and its children so it won't remain in the way // of the user code. - - // Let's trust that no sane property uses prefix like - // this. It would be anyway fairly inconvenient (in - // current code) to check whether a new name is used - // by another property with parent (due to the child - // name notation). - wxString newName = wxS("_&/_%$") + item->GetBaseName(); - DoSetPropertyName(item, newName); + DoInvalidatePropertyName(item); + DoInvalidateChildrenNames(item, true); return; }