+// Delete the subgroup and remove all references to it from
+// other data structures.
+bool wxFileConfigGroup::DeleteSubgroup(wxFileConfigGroup *pGroup)
+{
+ wxCHECK_MSG( pGroup, FALSE, _T("deleting non existing group?") );
+
+ wxLogTrace( _T("wxFileConfig"),
+ _T("Deleting group '%s' from '%s'"),
+ pGroup->Name().c_str(),
+ Name().c_str() );
+
+ wxLogTrace( _T("wxFileConfig"),
+ _T(" (m_pLine) = prev: %p, this %p, next %p"),
+ ((m_pLine) ? m_pLine->Prev() : 0),
+ m_pLine,
+ ((m_pLine) ? m_pLine->Next() : 0) );
+ wxLogTrace( _T("wxFileConfig"),
+ _T(" text: '%s'"),
+ ((m_pLine) ? m_pLine->Text().c_str() : wxEmptyString) );
+
+ // delete all entries
+ size_t nCount = pGroup->m_aEntries.Count();
+
+ wxLogTrace(_T("wxFileConfig"),
+ _T("Removing %lu Entries"),
+ (unsigned long)nCount );
+
+ for ( size_t nEntry = 0; nEntry < nCount; nEntry++ )
+ {
+ wxFileConfigLineList *pLine = pGroup->m_aEntries[nEntry]->GetLine();
+
+ if ( pLine != 0 )
+ {
+ wxLogTrace( _T("wxFileConfig"),
+ _T(" '%s'"),
+ pLine->Text().c_str() );
+ m_pConfig->LineListRemove(pLine);
+ }
+ }
+
+ // and subgroups of this subgroup
+
+ nCount = pGroup->m_aSubgroups.Count();
+
+ wxLogTrace( _T("wxFileConfig"),
+ _T("Removing %lu SubGroups"),
+ (unsigned long)nCount );
+
+ for ( size_t nGroup = 0; nGroup < nCount; nGroup++ )
+ {
+ pGroup->DeleteSubgroup(pGroup->m_aSubgroups[0]);
+ }
+
+ // finally the group itself
+
+ wxFileConfigLineList *pLine = pGroup->m_pLine;
+
+ if ( pLine != 0 )
+ {
+ wxLogTrace( _T("wxFileConfig"),
+ _T(" Removing line entry for Group '%s' : '%s'"),
+ pGroup->Name().c_str(),
+ pLine->Text().c_str() );
+ wxLogTrace( _T("wxFileConfig"),
+ _T(" Removing from Group '%s' : '%s'"),
+ Name().c_str(),
+ ((m_pLine) ? m_pLine->Text().c_str() : wxEmptyString) );
+
+ // notice that we may do this test inside the previous "if"
+ // because the last entry's line is surely !NULL
+
+ if ( pGroup == m_pLastGroup )
+ {
+ wxLogTrace( _T("wxFileConfig"),
+ _T(" ------- Removing last group -------") );
+
+ // our last entry is being deleted, so find the last one which stays.
+ // go back until we find a subgroup or reach the group's line, unless
+ // we are the root group, which we'll notice shortly.
+
+ wxFileConfigGroup *pNewLast = 0;
+ size_t nSubgroups = m_aSubgroups.Count();
+ wxFileConfigLineList *pl;
+
+ for ( pl = pLine->Prev(); pl != m_pLine; pl = pl->Prev() )
+ {
+ // is it our subgroup?
+
+ for ( size_t n = 0; (pNewLast == 0) && (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 != 0 ) // found?
+ break;
+ }
+
+ if ( pl == m_pLine || m_pParent == 0 )
+ {
+ wxLogTrace( _T("wxFileConfig"),
+ _T(" ------- No previous group found -------") );
+
+ wxASSERT_MSG( !pNewLast || m_pLine == 0,
+ _T("how comes it has the same line as we?") );
+
+ // we've reached the group line without finding any subgroups,
+ // or realised we removed the last group from the root.
+
+ m_pLastGroup = 0;
+ }
+ else
+ {
+ wxLogTrace( _T("wxFileConfig"),
+ _T(" ------- Last Group set to '%s' -------"),
+ pNewLast->Name().c_str() );
+
+ m_pLastGroup = pNewLast;
+ }
+ }
+
+ m_pConfig->LineListRemove(pLine);
+ }
+ else
+ {
+ wxLogTrace( _T("wxFileConfig"),
+ _T(" No line entry for Group '%s'?"),
+ pGroup->Name().c_str() );
+ }
+
+ SetDirty();
+
+ m_aSubgroups.Remove(pGroup);
+ delete pGroup;
+
+ return TRUE;