X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d595fb29c93249b72930cad9a85a5c237a8ceff7..f2c88494b6978bee502f4c856ba9dc7e3b7c3954:/src/common/fileconf.cpp?ds=sidebyside diff --git a/src/common/fileconf.cpp b/src/common/fileconf.cpp index fae2059278..cc4823e058 100644 --- a/src/common/fileconf.cpp +++ b/src/common/fileconf.cpp @@ -889,12 +889,44 @@ bool wxFileConfig::HasGroup(const wxString& strName) const return rc; } -bool wxFileConfig::HasEntry(const wxString& strName) const +bool wxFileConfig::HasEntry(const wxString& entry) const { - wxConfigPathChanger path(this, strName); + // path is the part before the last "/" + wxString path = entry.BeforeLast(wxCONFIG_PATH_SEPARATOR); - wxFileConfigEntry *pEntry = m_pCurrentGroup->FindEntry(path.Name()); - return pEntry != NULL; + // except in the special case of "/keyname" when there is nothing before "/" + if ( path.empty() && *entry.c_str() == wxCONFIG_PATH_SEPARATOR ) + { + path = wxCONFIG_PATH_SEPARATOR; + } + + // change to the path of the entry if necessary and remember the old path + // to restore it later + wxString pathOld; + wxFileConfig * const self = wx_const_cast(wxFileConfig *, this); + if ( !path.empty() ) + { + pathOld = GetPath(); + if ( pathOld.empty() ) + pathOld = wxCONFIG_PATH_SEPARATOR; + + if ( !self->DoSetPath(path, false /* don't create if doesn't exist */) ) + { + return false; + } + } + + // check if the entry exists in this group + const bool exists = m_pCurrentGroup->FindEntry( + entry.AfterLast(wxCONFIG_PATH_SEPARATOR)) != NULL; + + // restore the old path if we changed it above + if ( !pathOld.empty() ) + { + self->SetPath(pathOld); + } + + return exists; } // ---------------------------------------------------------------------------- @@ -1145,6 +1177,8 @@ bool wxFileConfig::DeleteGroup(const wxString& key) if ( !m_pCurrentGroup->DeleteSubgroupByName(path.Name()) ) return false; + path.UpdateIfDeleted(); + SetDirty(); return true; @@ -1650,9 +1684,9 @@ bool wxFileConfigGroup::DeleteSubgroup(wxFileConfigGroup *pGroup) wxLogTrace( FILECONF_TRACE_MASK, _T(" (m_pLine) = prev: %p, this %p, next %p"), - m_pLine ? m_pLine->Prev() : NULL, - m_pLine, - m_pLine ? m_pLine->Next() : NULL ); + m_pLine ? wx_static_cast(void*, m_pLine->Prev()) : 0, + wx_static_cast(void*, m_pLine), + m_pLine ? wx_static_cast(void*, m_pLine->Next()) : 0 ); wxLogTrace( FILECONF_TRACE_MASK, _T(" text: '%s'"), m_pLine ? m_pLine->Text().c_str() : wxEmptyString );