X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/701fb11eb5c1b04cd903e630e345c977a820e0b6..69c695466d495aca6ab44e3d8e4219fc00ff2146:/src/common/fileconf.cpp diff --git a/src/common/fileconf.cpp b/src/common/fileconf.cpp index 40e7383cf5..afb7f15282 100644 --- a/src/common/fileconf.cpp +++ b/src/common/fileconf.cpp @@ -49,6 +49,7 @@ #if defined(__WXMAC__) #include "wx/mac/private.h" // includes mac headers + #include "wx/filename.h" // for MacSetTypeAndCreator #endif #if defined(__WXMSW__) @@ -205,6 +206,9 @@ private: // DeleteSubgroupByName helper bool DeleteSubgroup(wxFileConfigGroup *pGroup); + // used by Rename() + void UpdateGroupAndSubgroupsLines(); + public: // ctor wxFileConfigGroup(wxFileConfigGroup *pParent, const wxString& strName, wxFileConfig *); @@ -1028,6 +1032,9 @@ bool wxFileConfig::Save(wxOutputStream& os, wxMBConv& conv) bool wxFileConfig::RenameEntry(const wxString& oldName, const wxString& newName) { + wxASSERT_MSG( !wxStrchr(oldName, wxCONFIG_PATH_SEPARATOR), + _T("RenameEntry(): paths are not supported") ); + // check that the entry exists wxFileConfigEntry *oldEntry = m_pCurrentGroup->FindEntry(oldName); if ( !oldEntry ) @@ -1442,28 +1449,41 @@ void wxFileConfigGroup::SetLastEntry(wxFileConfigEntry *pEntry) // group name // ---------------------------------------------------------------------------- +void wxFileConfigGroup::UpdateGroupAndSubgroupsLines() +{ + // update the line of this group + wxFileConfigLineList *line = GetGroupLine(); + wxCHECK_RET( line, _T("a non root group must have a corresponding line!") ); + + // +1: skip the leading '/' + line->SetText(wxString::Format(_T("[%s]"), GetFullName().c_str() + 1)); + + + // also update all subgroups as they have this groups name in their lines + const size_t nCount = m_aSubgroups.Count(); + for ( size_t n = 0; n < nCount; n++ ) + { + m_aSubgroups[n]->UpdateGroupAndSubgroupsLines(); + } +} + void wxFileConfigGroup::Rename(const wxString& newName) { wxCHECK_RET( m_pParent, _T("the root group can't be renamed") ); m_strName = newName; - // +1: no leading '/' - wxString strFullName; - strFullName << wxT("[") << (GetFullName().c_str() + 1) << wxT("]"); - - wxFileConfigLineList *line = GetGroupLine(); - wxCHECK_RET( line, _T("a non root group must have a corresponding line!") ); - - line->SetText(strFullName); + // update the group lines recursively + UpdateGroupAndSubgroupsLines(); } wxString wxFileConfigGroup::GetFullName() const { - if ( Parent() ) - return Parent()->GetFullName() + wxCONFIG_PATH_SEPARATOR + Name(); - else - return wxT(""); + wxString fullname; + if ( Parent() ) + fullname = Parent()->GetFullName() + wxCONFIG_PATH_SEPARATOR + Name(); + + return fullname; } // ---------------------------------------------------------------------------- @@ -1816,8 +1836,20 @@ void wxFileConfigEntry::SetValue(const wxString& strValue, bool bUser) } else // this entry didn't exist in the local file { - // add a new line to the file + // add a new line to the file: note the hack for the root group + // which is special in that it doesn't have its own group line + // (something like "[/]") and so the line we get for it may be not + // its line at all if it doesn't have any entries + // + // this is definitely not the right place to fix it but changing + // the root group to have NULL m_pLine will probably break too + // much stuff elsewhere so I don't dare to do it... wxFileConfigLineList *line = Group()->GetLastEntryLine(); + if ( !Group()->Parent() && line == Group()->GetGroupLine() ) + { + // prepend the first root group entry to the head of the list + line = NULL; + } m_pLine = Group()->Config()->LineListInsert(strLine, line); Group()->SetLastEntry(this);