X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ea5af9c5356676a5c4d81b4d4915ad32ca3c9c6e..d247a50d453899d1c3ce4fc8c3b4f468d0317a99:/src/propgrid/propgridpagestate.cpp diff --git a/src/propgrid/propgridpagestate.cpp b/src/propgrid/propgridpagestate.cpp index fb9c1c8d7e..51959e3362 100644 --- a/src/propgrid/propgridpagestate.cpp +++ b/src/propgrid/propgridpagestate.cpp @@ -38,9 +38,9 @@ // This define is necessary to prevent macro clearing #define __wxPG_SOURCE_FILE__ -#include -#include -#include +#include "wx/propgrid/propgridpagestate.h" +#include "wx/propgrid/propgrid.h" +#include "wx/propgrid/editors.h" #define wxPG_DEFAULT_SPLITTERX 110 @@ -74,11 +74,10 @@ void wxPropertyGridIteratorBase::Init( wxPropertyGridPageState* state, int flags void wxPropertyGridIteratorBase::Init( wxPropertyGridPageState* state, int flags, int startPos, int dir ) { - wxPGProperty* property; + wxPGProperty* property = NULL; if ( startPos == wxTOP ) { - property = NULL; if ( dir == 0 ) dir = 1; } @@ -90,8 +89,7 @@ void wxPropertyGridIteratorBase::Init( wxPropertyGridPageState* state, int flags } else { - wxASSERT_MSG( false, wxT("Only supported stating positions are wxTOP and wxBOTTOM") ); - property = NULL; + wxFAIL_MSG("Only supported starting positions are wxTOP and wxBOTTOM"); } Init( state, flags, property, dir ); @@ -203,12 +201,12 @@ void wxPropertyGridIteratorBase::Next( bool iterateChildren ) wxPropertyGridPageState::wxPropertyGridPageState() { - m_pPropGrid = (wxPropertyGrid*) NULL; + m_pPropGrid = NULL; m_regularArray.SetParentState(this); m_properties = &m_regularArray; - m_abcArray = (wxPGRootProperty*) NULL; - m_currentCategory = (wxPropertyCategory*) NULL; - m_selected = (wxPGProperty*) NULL; + m_abcArray = NULL; + m_currentCategory = NULL; + m_selected = NULL; m_width = 0; m_virtualHeight = 0; m_lastCaptionBottomnest = 1; @@ -247,17 +245,17 @@ void wxPropertyGridPageState::InitNonCatMode() if ( m_properties->GetChildCount() ) { - // Copy items. - wxPropertyGridIterator it( this, wxPG_ITERATE_DEFAULT|wxPG_ITERATE_CATEGORIES ); + // + // Prepare m_abcArray + wxPropertyGridIterator it( this, wxPG_ITERATE_PROPERTIES ); for ( ; !it.AtEnd(); it.Next() ) { wxPGProperty* p = it.GetProperty(); wxPGProperty* parent = p->GetParent(); - if ( p->HasFlag(wxPG_PROP_MISC_PARENT) && - ( parent == m_properties || (parent->IsCategory() || parent->IsRoot()) ) ) + if ( parent->IsCategory() || parent->IsRoot() ) { - m_abcArray->AddChild2( p ); + m_abcArray->AddChild2(p); p->m_parent = &m_regularArray; } } @@ -276,14 +274,14 @@ void wxPropertyGridPageState::DoClear() m_dictName.clear(); - m_currentCategory = (wxPropertyCategory*) NULL; + m_currentCategory = NULL; m_lastCaptionBottomnest = 1; m_itemsAdded = 0; m_virtualHeight = 0; m_vhCalcPending = 0; - m_selected = (wxPGProperty*) NULL; + m_selected = NULL; } // ----------------------------------------------------------------------- @@ -371,7 +369,7 @@ void wxPropertyGridPageState::OnClientWidthChange( int newWidth, int widthChange wxPGProperty* wxPropertyGridPageState::GetLastItem( int flags ) { if ( !m_properties->GetChildCount() ) - return (wxPGProperty*) NULL; + return NULL; wxPG_ITERATOR_CREATE_MASKS(flags, int itemExMask, int parentExMask) @@ -405,7 +403,7 @@ wxPropertyCategory* wxPropertyGridPageState::GetPropertyCategory( const wxPGProp return (wxPropertyCategory*)parent; } while ( grandparent ); - return (wxPropertyCategory*) NULL; + return NULL; } // ----------------------------------------------------------------------- @@ -445,7 +443,7 @@ wxPGProperty* wxPropertyGridPageState::BaseGetPropertyByName( const wxString& na it = m_dictName.find(name); if ( it != m_dictName.end() ) return (wxPGProperty*) it->second; - return (wxPGProperty*) NULL; + return NULL; } // ----------------------------------------------------------------------- @@ -455,8 +453,15 @@ void wxPropertyGridPageState::DoSetPropertyName( wxPGProperty* p, { wxCHECK_RET( p, wxT("invalid property id") ); - if ( p->GetBaseName().Len() ) m_dictName.erase( p->GetBaseName() ); - if ( newName.Len() ) m_dictName[newName] = (void*) p; + wxPGProperty* parent = p->GetParent(); + + if ( parent->IsCategory() || parent->IsRoot() ) + { + if ( p->GetBaseName().length() ) + m_dictName.erase( p->GetBaseName() ); + if ( newName.length() ) + m_dictName[newName] = (void*) p; + } p->DoSetName(newName); } @@ -470,7 +475,7 @@ void wxPropertyGridPageState::DoSetPropertyName( wxPGProperty* p, // NB: Nowadays only needed for alphabetic/categoric mode switching. // ----------------------------------------------------------------------- -#define II_INVALID_I 0x00FFFFFF +//#define II_INVALID_I 0x00FFFFFF #define ITEM_ITERATION_VARIABLES \ wxPGProperty* parent; \ @@ -481,14 +486,16 @@ void wxPropertyGridPageState::DoSetPropertyName( wxPGProperty* p, parent = m_properties; \ i = 0; +#if 0 #define ITEM_ITERATION_INIT(startparent, startindex, state) \ parent = startparent; \ i = (unsigned int)startindex; \ - if ( parent == (wxPGProperty*) NULL ) \ + if ( parent == NULL ) \ { \ parent = state->m_properties; \ i = 0; \ } +#endif #define ITEM_ITERATION_LOOP_BEGIN \ do \ @@ -595,66 +602,116 @@ bool wxPropertyGridPageState::EnableCategories( bool enable ) #if wxUSE_STL #include -static bool wxPG_SortFunc(wxPGProperty *p1, wxPGProperty *p2) +static bool wxPG_SortFunc_ByFunction(wxPGProperty *p1, wxPGProperty *p2) { - return p1->GetLabel() < p2->GetLabel(); + wxPropertyGrid* pg = p1->GetGrid(); + wxPGSortCallback sortFunction = pg->GetSortFunction(); + return sortFunction(pg, p1, p2) < 0; +} + +static bool wxPG_SortFunc_ByLabel(wxPGProperty *p1, wxPGProperty *p2) +{ + return p1->GetLabel().CmpNoCase( p2->GetLabel() ) < 0; } #else -static int wxPG_SortFunc(wxPGProperty **p1, wxPGProperty **p2) +static int wxPG_SortFunc_ByFunction(wxPGProperty **pp1, wxPGProperty **pp2) { - wxPGProperty *pp1 = *p1; - wxPGProperty *pp2 = *p2; - return pp1->GetLabel().compare( pp2->GetLabel() ); + wxPGProperty *p1 = *pp1; + wxPGProperty *p2 = *pp2; + wxPropertyGrid* pg = p1->GetGrid(); + wxPGSortCallback sortFunction = pg->GetSortFunction(); + return sortFunction(pg, p1, p2); +} + +static int wxPG_SortFunc_ByLabel(wxPGProperty **pp1, wxPGProperty **pp2) +{ + wxPGProperty *p1 = *pp1; + wxPGProperty *p2 = *pp2; + return p1->GetLabel().CmpNoCase( p2->GetLabel() ); } #endif -void wxPropertyGridPageState::SortChildren( wxPGProperty* p ) +void wxPropertyGridPageState::DoSortChildren( wxPGProperty* p, + int flags ) { if ( !p ) - p = (wxPGProperty*)m_properties; + p = m_properties; + // Can only sort items with children if ( !p->GetChildCount() ) return; - wxPGProperty* pwc = (wxPGProperty*)p; + // Never sort children of aggregate properties + if ( p->HasFlag(wxPG_PROP_AGGREGATE) ) + return; - // Can only sort items with children - if ( pwc->GetChildCount() < 1 ) + if ( (flags & wxPG_SORT_TOP_LEVEL_ONLY) + && !p->IsCategory() && !p->IsRoot() ) return; #if wxUSE_STL - std::sort(pwc->m_children.begin(), pwc->m_children.end(), wxPG_SortFunc); + if ( GetGrid()->GetSortFunction() ) + std::sort(p->m_children.begin(), p->m_children.end(), + wxPG_SortFunc_ByFunction); + else + std::sort(p->m_children.begin(), p->m_children.end(), + wxPG_SortFunc_ByLabel); #else - pwc->m_children.Sort( wxPG_SortFunc ); + if ( GetGrid()->GetSortFunction() ) + p->m_children.Sort( wxPG_SortFunc_ByFunction ); + else + p->m_children.Sort( wxPG_SortFunc_ByLabel ); #endif - // Fix indexes - pwc->FixIndexesOfChildren(); + // Fix indices + p->FixIndicesOfChildren(); + if ( flags & wxPG_RECURSE ) + { + // Apply sort recursively + for ( unsigned int i=0; iGetChildCount(); i++ ) + DoSortChildren(p->Item(i), flags); + } } // ----------------------------------------------------------------------- -void wxPropertyGridPageState::Sort() +void wxPropertyGridPageState::DoSort( int flags ) { - SortChildren( m_properties ); + DoSortChildren( m_properties, flags | wxPG_RECURSE ); - // Sort categories as well - if ( !IsInNonCatMode() ) + // Sort categories as well (but we need not do it recursively) + if ( IsInNonCatMode() ) { size_t i; - for ( i=0;iGetChildCount();i++) + for ( i=0;iItem(i); + wxPGProperty* p = m_regularArray.Item(i); if ( p->IsCategory() ) - SortChildren( p ); + DoSortChildren( p, 0 ); } } } +// ----------------------------------------------------------------------- + +bool wxPropertyGridPageState::PrepareAfterItemsAdded() +{ + if ( !m_itemsAdded ) return false; + + wxPropertyGrid* pg = GetGrid(); + + m_itemsAdded = 0; + + if ( pg->HasFlag(wxPG_AUTO_SORT) ) + DoSort(wxPG_SORT_TOP_LEVEL_ONLY); + + return true; +} + // ----------------------------------------------------------------------- // wxPropertyGridPageState splitter, column and hittest functions // ----------------------------------------------------------------------- @@ -663,7 +720,7 @@ wxPGProperty* wxPropertyGridPageState::DoGetItemAtY( int y ) const { // Outside? if ( y < 0 ) - return (wxPGProperty*) NULL; + return NULL; unsigned int a = 0; return m_properties->GetItemAtY(y, GetGrid()->m_lineHeight, &a); @@ -697,7 +754,10 @@ int wxPropertyGridPageState::GetColumnFitWidth(wxClientDC& dc, wxPGProperty* p = pwc->Item(i); if ( !p->IsCategory() ) { - dc.GetTextExtent( p->GetColumnText(col), &w, &h ); + const wxPGCell* cell = NULL; + wxString text; + p->GetDisplayInfo(col, -1, 0, &text, &cell); + dc.GetTextExtent(text, &w, &h); if ( col == 0 ) w += ( ((int)p->m_depth-1) * pg->m_subgroup_extramargin ); @@ -892,8 +952,6 @@ void wxPropertyGridPageState::CheckColumnWidths( int widthChange ) int reduceCol = -1; int highestColWidth = 0; - bool minimizedCols = false; - #ifdef __WXDEBUG__ if ( debug ) wxLogDebug(wxT("ColumnWidthCheck (virtualWidth: %i, clientWidth: %i)"), width, clientWidth); @@ -907,7 +965,6 @@ void wxPropertyGridPageState::CheckColumnWidths( int widthChange ) if ( m_colWidths[i] <= min ) { m_colWidths[i] = min; - minimizedCols = true; } else { @@ -944,10 +1001,10 @@ void wxPropertyGridPageState::CheckColumnWidths( int widthChange ) if ( colsWidth < width ) { // Increase column - #ifdef __WXDEBUG__ - if ( debug ) - wxLogDebug(wxT(" Adjust last column to %i"), m_colWidths[lastColumn] + widthHigher); - #endif +#ifdef __WXDEBUG__ + if ( debug ) + wxLogDebug(wxT(" Adjust last column to %i"), m_colWidths[lastColumn] + widthHigher); +#endif m_colWidths[lastColumn] = m_colWidths[lastColumn] + widthHigher; } else if ( colsWidth > width ) @@ -1100,7 +1157,7 @@ bool wxPropertyGridPageState::DoSetPropertyValueString( wxPGProperty* p, const w { if ( p ) { - int flags = wxPG_REPORT_ERROR|wxPG_FULL_VALUE; + int flags = wxPG_REPORT_ERROR|wxPG_FULL_VALUE|wxPG_PROGRAMMATIC_VALUE; wxVariant variant = p->GetValueRef(); bool res; @@ -1114,7 +1171,7 @@ bool wxPropertyGridPageState::DoSetPropertyValueString( wxPGProperty* p, const w { p->SetValue(variant); if ( m_selected==p && this==m_pPropGrid->GetState() ) - p->UpdateControl(m_pPropGrid->GetEditorControl()); + m_pPropGrid->RefreshEditor(); } return true; @@ -1130,7 +1187,7 @@ bool wxPropertyGridPageState::DoSetPropertyValue( wxPGProperty* p, wxVariant& va { p->SetValue(value); if ( m_selected==p && this==m_pPropGrid->GetState() ) - p->UpdateControl(m_pPropGrid->GetEditorControl()); + m_pPropGrid->RefreshEditor(); return true; } @@ -1151,33 +1208,6 @@ bool wxPropertyGridPageState::DoSetPropertyValueWxObjectPtr( wxPGProperty* p, wx return false; } -// ----------------------------------------------------------------------- - -void wxPropertyGridPageState::DoSetPropertyValueUnspecified( wxPGProperty* p ) -{ - wxCHECK_RET( p, wxT("invalid property id") ); - - if ( !p->IsValueUnspecified() ) - { - // Value should be set first - editor class methods may need it - p->m_value.MakeNull(); - - wxASSERT( m_pPropGrid ); - - if ( m_pPropGrid->GetState() == this ) - { - if ( m_pPropGrid->m_selected == p && m_pPropGrid->m_wndEditor ) - { - p->GetEditorClass()->SetValueToUnspecified(p, m_pPropGrid->GetEditorControl()); - } - } - - unsigned int i; - for ( i = 0; i < p->GetChildCount(); i++ ) - DoSetPropertyValueUnspecified( p->Item(i) ); - } -} - // ----------------------------------------------------------------------- // wxPropertyGridPageState property operations // ----------------------------------------------------------------------- @@ -1373,7 +1403,7 @@ void wxPropertyGridPageState::DoSetPropertyValues( const wxVariantList& list, wx // // Second pass for special entries - for ( node = list.begin(); node != list.end(); node++ ) + for ( node = list.begin(); node != list.end(); ++node ) { wxVariant *current = (wxVariant*)*node; @@ -1401,7 +1431,7 @@ void wxPropertyGridPageState::DoSetPropertyValues( const wxVariantList& list, wx if ( wxStrcmp(current->GetType(), wxS("list")) == 0 ) { DoSetPropertyValues( current->GetList(), - p->IsCategory()?p:((wxPGProperty*)NULL) + p->IsCategory()?p:(NULL) ); } else @@ -1437,7 +1467,7 @@ void wxPropertyGridPageState::DoSetPropertyValues( const wxVariantList& list, wx if ( numSpecialEntries ) { - for ( node = list.begin(); node != list.end(); node++ ) + for ( node = list.begin(); node != list.end(); ++node ) { wxVariant *current = (wxVariant*)*node; @@ -1468,7 +1498,7 @@ void wxPropertyGridPageState::DoSetPropertyValues( const wxVariantList& list, wx wxVariantList& list2 = current->GetList(); wxVariantList::const_iterator node2; - for ( node2 = list2.begin(); node2 != list2.end(); node2++ ) + for ( node2 = list2.begin(); node2 != list2.end(); ++node2 ) { wxVariant *attr = (wxVariant*)*node2; foundProp->SetAttribute( attr->GetName(), *attr ); @@ -1497,9 +1527,7 @@ void wxPropertyGridPageState::DoSetPropertyValues( const wxVariantList& list, wx m_pPropGrid->Thaw(); if ( this == m_pPropGrid->GetState() ) - { - m_selected->UpdateControl(m_pPropGrid->GetEditorControl()); - } + m_pPropGrid->RefreshEditor(); } } @@ -1508,14 +1536,14 @@ void wxPropertyGridPageState::DoSetPropertyValues( const wxVariantList& list, wx // wxPropertyGridPageState property adding and removal // ----------------------------------------------------------------------- -int wxPropertyGridPageState::PrepareToAddItem( wxPGProperty* property, - wxPGProperty* scheduledParent ) +bool wxPropertyGridPageState::PrepareToAddItem( wxPGProperty* property, + wxPGProperty* scheduledParent ) { wxPropertyGrid* propGrid = m_pPropGrid; // This will allow better behavior. if ( scheduledParent == m_properties ) - scheduledParent = (wxPGProperty*) NULL; + scheduledParent = NULL; if ( scheduledParent && !scheduledParent->IsCategory() ) { @@ -1545,7 +1573,7 @@ int wxPropertyGridPageState::PrepareToAddItem( wxPGProperty* property, { delete property; m_currentCategory = pwc; - return 2; // Tells the caller what we did. + return false; } } } @@ -1562,123 +1590,29 @@ int wxPropertyGridPageState::PrepareToAddItem( wxPGProperty* property, #endif // Make sure nothing is selected. - if ( propGrid && propGrid->m_selected ) - { - bool selRes = propGrid->ClearSelection(); - wxPG_CHECK_MSG_DBG( selRes, - -1, - wxT("failed to deselect a property (editor probably had invalid value)") ); - } - - if ( scheduledParent ) - { - // Use parent's colours. - property->m_bgColIndex = scheduledParent->m_bgColIndex; - property->m_fgColIndex = scheduledParent->m_fgColIndex; - - // Fix no parent does not yet have parenting flag yet, set one now - if ( !scheduledParent->HasFlag(wxPG_PROP_PARENTAL_FLAGS) ) - scheduledParent->SetParentalType(wxPG_PROP_MISC_PARENT); - //scheduledParent->SetFlag(wxPG_PROP_MISC_PARENT); - } - - // If in hideable adding mode, or if assigned parent is hideable, then - // make this one hideable. - if ( - ( scheduledParent && (scheduledParent->m_flags & wxPG_PROP_HIDDEN) ) || - ( propGrid && (propGrid->m_iFlags & wxPG_FL_ADDING_HIDEABLES) ) - ) - property->SetFlag( wxPG_PROP_HIDDEN ); - - // Set custom image flag. - int custImgHeight = property->OnMeasureImage().y; - if ( custImgHeight < 0 /*|| custImgHeight > 1*/ ) - { - property->m_flags |= wxPG_PROP_CUSTOMIMAGE; - } + if ( propGrid ) + propGrid->ClearSelection(false); - if ( propGrid && (propGrid->GetWindowStyleFlag() & wxPG_LIMITED_EDITING) ) - property->m_flags |= wxPG_PROP_NOEDITOR; + // NULL parent == root parent + if ( !scheduledParent ) + scheduledParent = DoGetRoot(); - if ( !property->IsCategory() ) - { - // This is not a category. - - //wxASSERT_MSG( property->GetEditorClass(), wxT("Editor class not initialized!") ); - - // Depth. - // - unsigned char depth = 1; - if ( scheduledParent ) - { - depth = scheduledParent->m_depth; - if ( !scheduledParent->IsCategory() ) - depth++; - } - property->m_depth = depth; - unsigned char greyDepth = depth; - - if ( scheduledParent ) - { - wxPropertyCategory* pc; - - if ( scheduledParent->IsCategory() || scheduledParent->IsRoot() ) - pc = (wxPropertyCategory*)scheduledParent; - else - // This conditional compile is necessary to - // bypass some compiler bug. - pc = GetPropertyCategory(scheduledParent); - - if ( pc ) - greyDepth = pc->GetDepth(); - else - greyDepth = scheduledParent->m_depthBgCol; - } + property->m_parent = scheduledParent; - property->m_depthBgCol = greyDepth; + property->InitAfterAdded(this, propGrid); - // Prepare children pre-added children - if ( property->GetChildCount() ) - { - property->SetParentalType(wxPG_PROP_AGGREGATE); - - property->SetExpanded(false); // Properties with children are not expanded by default. - if ( propGrid && propGrid->GetWindowStyleFlag() & wxPG_HIDE_MARGIN ) - property->SetExpanded(true); // ...unless it cannot be expanded. - - property->PrepareSubProperties(); - - return -1; - } - - if ( propGrid && (propGrid->GetExtraStyle() & wxPG_EX_AUTO_UNSPECIFIED_VALUES) ) - property->SetFlagRecursively(wxPG_PROP_AUTO_UNSPECIFIED, true); - - return 0; - } - else + if ( property->IsCategory() ) { - // This is a category. - - // depth - unsigned char depth = 1; - if ( scheduledParent ) - { - depth = scheduledParent->m_depth + 1; - } - property->m_depth = depth; - property->m_depthBgCol = depth; + wxPropertyCategory* pc = wxStaticCast(property, wxPropertyCategory); - m_currentCategory = (wxPropertyCategory*)property; + m_currentCategory = pc; - wxPropertyCategory* pc = (wxPropertyCategory*)property; - - // Calculate text extent for caption item. + // Calculate text extent for category caption if ( propGrid ) pc->CalculateTextExtent(propGrid, propGrid->GetCaptionFont()); - - return 1; } + + return true; } // ----------------------------------------------------------------------- @@ -1687,7 +1621,7 @@ wxPGProperty* wxPropertyGridPageState::DoAppend( wxPGProperty* property ) { wxPropertyCategory* cur_cat = m_currentCategory; if ( property->IsCategory() ) - cur_cat = (wxPropertyCategory*) NULL; + cur_cat = NULL; return DoInsert( cur_cat, -1, property ); } @@ -1703,11 +1637,11 @@ wxPGProperty* wxPropertyGridPageState::DoInsert( wxPGProperty* parent, int index wxNullProperty, wxT("when adding properties to fixed parents, use BeginAddChildren and EndAddChildren.") ); - int parenting = PrepareToAddItem( property, (wxPropertyCategory*)parent ); + bool res = PrepareToAddItem( property, (wxPropertyCategory*)parent ); - // This type of invalid parenting value indicates we should exit now, returning - // id of most recent category. - if ( parenting > 1 ) + // PrepareToAddItem() may just decide to use use current category + // instead of adding new one. + if ( !res ) return m_currentCategory; // Note that item must be added into current mode later. @@ -1736,7 +1670,7 @@ wxPGProperty* wxPropertyGridPageState::DoInsert( wxPGProperty* parent, int index // Categorized mode // Only add non-categories to m_abcArray. - if ( m_abcArray && parenting <= 0 ) + if ( m_abcArray && !property->IsCategory() ) m_abcArray->AddChild2( property, -1, false ); // Add to current mode. @@ -1755,7 +1689,7 @@ wxPGProperty* wxPropertyGridPageState::DoInsert( wxPGProperty* parent, int index m_regularArray.AddChild2( property, -1, false ); // Add to current mode (no categories). - if ( parenting <= 0 ) + if ( !property->IsCategory() ) m_abcArray->AddChild2( property, index ); } } @@ -1770,7 +1704,8 @@ wxPGProperty* wxPropertyGridPageState::DoInsert( wxPGProperty* parent, int index } // Only add name to hashmap if parent is root or category - if ( (parent->IsCategory() || parent->IsRoot()) && property->m_name.length() ) + if ( property->m_name.length() && + (parent->IsCategory() || parent->IsRoot()) ) m_dictName[property->m_name] = (void*) property; VirtualHeightChanged(); @@ -1784,7 +1719,7 @@ wxPGProperty* wxPropertyGridPageState::DoInsert( wxPGProperty* parent, int index // ----------------------------------------------------------------------- -void wxPropertyGridPageState::DoDelete( wxPGProperty* item ) +void wxPropertyGridPageState::DoDelete( wxPGProperty* item, bool doDelete ) { wxCHECK_RET( item->GetParent(), wxT("this property was already deleted") ); @@ -1792,59 +1727,43 @@ void wxPropertyGridPageState::DoDelete( wxPGProperty* item ) wxCHECK_RET( item != &m_regularArray && item != m_abcArray, wxT("wxPropertyGrid: Do not attempt to remove the root item.") ); - size_t i; unsigned int indinparent = item->GetIndexInParent(); wxPGProperty* pwc = (wxPGProperty*)item; + wxPGProperty* parent = item->GetParent(); - wxCHECK_RET( !item->GetParent()->HasFlag(wxPG_PROP_AGGREGATE), + wxCHECK_RET( !parent->HasFlag(wxPG_PROP_AGGREGATE), wxT("wxPropertyGrid: Do not attempt to remove sub-properties.") ); - if ( item->IsCategory() ) + // Delete children + if ( item->GetChildCount() && !item->HasFlag(wxPG_PROP_AGGREGATE) ) { // deleting a category - - // erase category entries from the hash table - for ( i=0; iGetChildCount(); i++ ) + if ( item->IsCategory() ) { - wxPGProperty* sp = pwc->Item( i ); - if ( sp->GetBaseName().Len() ) m_dictName.erase(sp->GetBaseName()); + if ( pwc == m_currentCategory ) + m_currentCategory = NULL; } - if ( pwc == m_currentCategory ) - m_currentCategory = (wxPropertyCategory*) NULL; - - if ( m_abcArray ) - { - // Remove children from non-categorized array. - for ( i=0; iGetChildCount(); i++ ) - { - wxPGProperty * p = pwc->Item( i ); - wxASSERT( p != NULL ); - if ( !p->IsCategory() ) - m_abcArray->RemoveChild(p); - } - - if ( IsInNonCatMode() ) - m_abcArray->FixIndexesOfChildren(); - } + item->DeleteChildren(); } if ( !IsInNonCatMode() ) { // categorized mode - non-categorized array - // Remove from non-cat array, but only if parent is in it - if ( !item->IsCategory() && item->GetParent()->IsCategory() ) + // Remove from non-cat array + if ( !item->IsCategory() && + (parent->IsCategory() || parent->IsRoot()) ) { if ( m_abcArray ) m_abcArray->RemoveChild(item); } // categorized mode - categorized array - wxArrayPGProperty& parentsChildren = item->m_parent->m_children; + wxArrayPGProperty& parentsChildren = parent->m_children; parentsChildren.erase( parentsChildren.begin() + indinparent ); - item->m_parent->FixIndexesOfChildren(); + item->m_parent->FixIndicesOfChildren(); } else { @@ -1877,14 +1796,17 @@ void wxPropertyGridPageState::DoDelete( wxPGProperty* item ) wxASSERT( item->m_parent == m_abcArray ); wxArrayPGProperty& parentsChildren = item->m_parent->m_children; parentsChildren.erase(parentsChildren.begin() + indinparent); - item->m_parent->FixIndexesOfChildren(indinparent); + item->m_parent->FixIndicesOfChildren(indinparent); } } - if ( item->GetBaseName().Len() ) m_dictName.erase(item->GetBaseName()); + if ( item->GetBaseName().length() && + (parent->IsCategory() || parent->IsRoot()) ) + m_dictName.erase(item->GetBaseName()); // We can actually delete it now - delete item; + if ( doDelete ) + delete item; m_itemsAdded = 1; // Not a logical assignment (but required nonetheless).