bool ConfigGroup::DeleteEntry(const wxChar *szName) { ConfigEntry *pEntry = FindEntry(szName); wxCHECK( pEntry != NULL, FALSE ); // deleting non existing item? LineList *pLine = pEntry->GetLine(); if ( pLine != NULL ) { // notice that we may do this test inside the previous "if" because the // last entry's line is surely !NULL if ( pEntry == m_pLastEntry ) { // our last entry is being deleted - find the last one which stays wxASSERT( m_pLine != NULL ); // if we have an entry with !NULL pLine... // go back until we find another entry or reach the group's line ConfigEntry *pNewLast = NULL; size_t n, nEntries = m_aEntries.Count(); LineList *pl; for ( pl = pLine->Prev(); pl != m_pLine; pl = pl->Prev() ) { // is it our subgroup? for ( n = 0; (pNewLast == NULL) && (n < nEntries); n++ ) { if ( m_aEntries[n]->GetLine() == m_pLine ) pNewLast = m_aEntries[n]; } if ( pNewLast != NULL ) // found? break; } if ( pl == m_pLine ) { wxASSERT( !pNewLast ); // how comes it has the same line as we? // we've reached the group line without finding any subgroups m_pLastEntry = NULL; } else m_pLastEntry = pNewLast; } m_pConfig->LineListRemove(pLine); } // we must be written back for the changes to be saved SetDirty(); m_aEntries.Remove(pEntry); delete pEntry; return TRUE; }
// doesn't delete the subgroup itself, but does remove references to it from // all other data structures (and normally the returned pointer should be // deleted a.s.a.p. because there is nothing much to be done with it anyhow) bool ConfigGroup::DeleteSubgroup(ConfigGroup *pGroup) { wxCHECK( pGroup != NULL, FALSE ); // deleting non existing group? // delete all entries size_t nCount = pGroup->m_aEntries.Count(); for ( size_t nEntry = 0; nEntry < nCount; nEntry++ ) { LineList *pLine = pGroup->m_aEntries[nEntry]->GetLine(); if ( pLine != NULL ) m_pConfig->LineListRemove(pLine); } // and subgroups of this sungroup nCount = pGroup->m_aSubgroups.Count(); for ( size_t nGroup = 0; nGroup < nCount; nGroup++ ) { pGroup->DeleteSubgroup(pGroup->m_aSubgroups[0]); } LineList *pLine = pGroup->m_pLine; if ( pLine != NULL ) { // notice that we may do this test inside the previous "if" because the // last entry's line is surely !NULL if ( pGroup == m_pLastGroup ) { // our last entry is being deleted - find the last one which stays wxASSERT( m_pLine != NULL ); // we have a subgroup with !NULL pLine... // go back until we find a subgroup or reach the group's line ConfigGroup *pNewLast = NULL; size_t n, nSubgroups = m_aSubgroups.Count(); LineList *pl; for ( pl = pLine->Prev(); pl != m_pLine; pl = pl->Prev() ) { // is it our subgroup? for ( n = 0; (pNewLast == NULL) && (n < nSubgroups); n++ ) { // do _not_ call GetGroupLine! we don't want to add it to the local // file if it's not already there if ( m_aSubgroups[n]->m_pLine == m_pLine ) pNewLast = m_aSubgroups[n]; } if ( pNewLast != NULL ) // found? break; } if ( pl == m_pLine ) { wxASSERT( !pNewLast ); // how comes it has the same line as we? // we've reached the group line without finding any subgroups m_pLastGroup = NULL; } else m_pLastGroup = pNewLast; } m_pConfig->LineListRemove(pLine); } SetDirty(); m_aSubgroups.Remove(pGroup); delete pGroup; return TRUE; }