From e1cc6874224f903a59086f9e2c7c6043a5389e03 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 3 Oct 2004 22:34:09 +0000 Subject: [PATCH] don't keep a dirty flag in each entry/group, this is totally wasteful as a single flag in wxFileConfig itself is enough; do reset the dirty flag after Flush()ing git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29631 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/fileconf.h | 25 ++++++++------ src/common/fileconf.cpp | 72 ++++++++++++++--------------------------- 2 files changed, 41 insertions(+), 56 deletions(-) diff --git a/include/wx/fileconf.h b/include/wx/fileconf.h index d6eb9223ba..0c8944ce4c 100644 --- a/include/wx/fileconf.h +++ b/include/wx/fileconf.h @@ -126,8 +126,7 @@ public: #if wxUSE_STREAMS // ctor that takes an input stream. - wxFileConfig(wxInputStream &inStream, - wxMBConv& conv = wxConvUTF8); + wxFileConfig(wxInputStream &inStream, wxMBConv& conv = wxConvUTF8); #endif // wxUSE_STREAMS // dtor will save unsaved data @@ -198,14 +197,20 @@ private: // the same as SetPath("/") void SetRootPath(); + // set/test the dirty flag + void SetDirty() { m_isDirty = true; } + void ResetDirty() { m_isDirty = false; } + bool IsDirty() const { return m_isDirty; } + + // member variables // ---------------- - wxFileConfigLineList *m_linesHead, // head of the linked list - *m_linesTail; // tail + wxFileConfigLineList *m_linesHead, // head of the linked list + *m_linesTail; // tail - wxString m_strLocalFile, // local file name passed to ctor - m_strGlobalFile; // global - wxString m_strPath; // current path (not '/' terminated) + wxString m_strLocalFile, // local file name passed to ctor + m_strGlobalFile; // global + wxString m_strPath; // current path (not '/' terminated) wxFileConfigGroup *m_pRootGroup, // the top (unnamed) group *m_pCurrentGroup; // the current group @@ -213,10 +218,12 @@ private: wxMBConv &m_conv; #ifdef __UNIX__ - int m_umask; // the umask to use for file creation + int m_umask; // the umask to use for file creation #endif // __UNIX__ - DECLARE_NO_COPY_CLASS(wxFileConfig) + bool m_isDirty; // if true, we have unsaved changes + + DECLARE_NO_COPY_CLASS(wxFileConfig) }; #endif diff --git a/src/common/fileconf.cpp b/src/common/fileconf.cpp index 442fb4fc15..4592781a63 100644 --- a/src/common/fileconf.cpp +++ b/src/common/fileconf.cpp @@ -154,8 +154,7 @@ private: wxString m_strName, // entry name m_strValue; // value - bool m_bDirty:1, // changed since last read? - m_bImmutable:1, // can be overriden locally? + bool m_bImmutable:1, // can be overriden locally? m_bHasValue:1; // set after first call to SetValue() int m_nLine; // used if m_pLine == NULL only @@ -172,7 +171,6 @@ public: const wxString& Name() const { return m_strName; } const wxString& Value() const { return m_strValue; } wxFileConfigGroup *Group() const { return m_pParent; } - bool IsDirty() const { return m_bDirty; } bool IsImmutable() const { return m_bImmutable; } bool IsLocal() const { return m_pLine != 0; } int Line() const { return m_nLine; } @@ -181,7 +179,6 @@ public: // modify entry attributes void SetValue(const wxString& strValue, bool bUser = true); - void SetDirty(); void SetLine(wxFileConfigLineList *pLine); DECLARE_NO_COPY_CLASS(wxFileConfigEntry) @@ -199,7 +196,6 @@ private: ArrayEntries m_aEntries; // entries in this group ArrayGroups m_aSubgroups; // subgroups wxString m_strName; // group's name - bool m_bDirty; // if false => all subgroups are not dirty wxFileConfigLineList *m_pLine; // pointer to our line in the linked list wxFileConfigEntry *m_pLastEntry; // last entry/subgroup of this group in the wxFileConfigGroup *m_pLastGroup; // local file (we insert new ones after it) @@ -218,7 +214,6 @@ public: const wxString& Name() const { return m_strName; } wxFileConfigGroup *Parent() const { return m_pParent; } wxFileConfig *Config() const { return m_pConfig; } - bool IsDirty() const { return m_bDirty; } const ArrayEntries& Entries() const { return m_aEntries; } const ArrayGroups& Groups() const { return m_aSubgroups; } @@ -236,8 +231,6 @@ public: wxFileConfigGroup *AddSubgroup(const wxString& strName); wxFileConfigEntry *AddEntry (const wxString& strName, int nLine = wxNOT_FOUND); - // will also recursively set parent's dirty flag - void SetDirty(); void SetLine(wxFileConfigLineList *pLine); // rename: no checks are done to ensure that the name is unique! @@ -417,6 +410,8 @@ void wxFileConfig::Init() wxLogWarning(_("can't open user configuration file '%s'."), m_strLocalFile.c_str() ); } } + + m_isDirty = false; } // constructor supports creation of wxFileConfig objects of any type @@ -913,7 +908,7 @@ bool wxFileConfig::DoWriteString(const wxString& key, const wxString& szValue) _T(" Creating group %s"), m_pCurrentGroup->Name().c_str() ); - m_pCurrentGroup->SetDirty(); + SetDirty(); // this will add a line for this group if it didn't have it before @@ -921,9 +916,7 @@ bool wxFileConfig::DoWriteString(const wxString& key, const wxString& szValue) } else { - // writing an entry - // check that the name is reasonable - + // writing an entry check that the name is reasonable if ( strName[0u] == wxCONFIG_IMMUTABLE_PREFIX ) { wxLogError( _("Config entry name cannot start with '%c'."), @@ -945,6 +938,8 @@ bool wxFileConfig::DoWriteString(const wxString& key, const wxString& szValue) _T(" Setting value %s"), szValue.c_str() ); pEntry->SetValue(szValue); + + SetDirty(); } return true; @@ -957,7 +952,7 @@ bool wxFileConfig::DoWriteLong(const wxString& key, long lValue) bool wxFileConfig::Flush(bool /* bCurrentOnly */) { - if ( LineListIsEmpty() || !m_pRootGroup->IsDirty() || !m_strLocalFile ) + if ( !IsDirty() || !m_strLocalFile ) return true; // set the umask if needed @@ -990,6 +985,8 @@ bool wxFileConfig::Flush(bool /* bCurrentOnly */) return false; } + ResetDirty(); + #if defined(__WXMAC__) wxFileName(m_strLocalFile).MacSetTypeAndCreator('TEXT', 'ttxt'); #endif // __WXMAC__ @@ -1018,6 +1015,8 @@ bool wxFileConfig::RenameEntry(const wxString& oldName, if ( !m_pCurrentGroup->DeleteEntry(oldName) ) return false; + SetDirty(); + wxFileConfigEntry *newEntry = m_pCurrentGroup->AddEntry(newName); newEntry->SetValue(value); @@ -1038,6 +1037,8 @@ bool wxFileConfig::RenameGroup(const wxString& oldName, group->Rename(newName); + SetDirty(); + return true; } @@ -1056,7 +1057,8 @@ bool wxFileConfig::DeleteEntry(const wxString& key, bool bGroupIfEmptyAlso) if ( m_pCurrentGroup != m_pRootGroup ) { wxFileConfigGroup *pGroup = m_pCurrentGroup; SetPath(wxT("..")); // changes m_pCurrentGroup! - m_pCurrentGroup->DeleteSubgroupByName(pGroup->Name()); + if ( m_pCurrentGroup->DeleteSubgroupByName(pGroup->Name()) ) + SetDirty(); } //else: never delete the root group } @@ -1068,7 +1070,12 @@ bool wxFileConfig::DeleteGroup(const wxString& key) { wxConfigPathChanger path(this, key); - return m_pCurrentGroup->DeleteSubgroupByName(path.Name()); + if ( !m_pCurrentGroup->DeleteSubgroupByName(path.Name()) ) + return false; + + SetDirty(); + + return true; } bool wxFileConfig::DeleteAll() @@ -1239,7 +1246,6 @@ wxFileConfigGroup::wxFileConfigGroup(wxFileConfigGroup *pParent, { m_pConfig = pConfig; m_pParent = pParent; - m_bDirty = false; m_pLine = NULL; m_pLastEntry = NULL; @@ -1417,8 +1423,6 @@ void wxFileConfigGroup::Rename(const wxString& newName) wxCHECK_RET( line, _T("a non root group must have a corresponding line!") ); line->SetText(strFullName); - - SetDirty(); } wxString wxFileConfigGroup::GetFullName() const @@ -1671,8 +1675,6 @@ bool wxFileConfigGroup::DeleteSubgroup(wxFileConfigGroup *pGroup) pGroup->Name().c_str() ); } - SetDirty(); - m_aSubgroups.Remove(pGroup); delete pGroup; @@ -1720,25 +1722,12 @@ bool wxFileConfigGroup::DeleteEntry(const wxChar *szName) m_pConfig->LineListRemove(pLine); } - // we must be written back for the changes to be saved - SetDirty(); - m_aEntries.Remove(pEntry); delete pEntry; return true; } -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -void wxFileConfigGroup::SetDirty() -{ - m_bDirty = true; - if ( Parent() != NULL ) // propagate upwards - Parent()->SetDirty(); -} - // ============================================================================ // wxFileConfig::wxFileConfigEntry // ============================================================================ @@ -1757,7 +1746,6 @@ wxFileConfigEntry::wxFileConfigEntry(wxFileConfigGroup *pParent, m_nLine = nLine; m_pLine = NULL; - m_bDirty = m_bHasValue = false; m_bImmutable = strName[0] == wxCONFIG_IMMUTABLE_PREFIX; @@ -1791,10 +1779,8 @@ void wxFileConfigEntry::SetValue(const wxString& strValue, bool bUser) return; } - // do nothing if it's the same value: but don't test for it - // if m_bHasValue hadn't been set yet or we'd never write - // empty values to the file - + // do nothing if it's the same value: but don't test for it if m_bHasValue + // hadn't been set yet or we'd never write empty values to the file if ( m_bHasValue && strValue == m_strValue ) return; @@ -1803,7 +1789,7 @@ void wxFileConfigEntry::SetValue(const wxString& strValue, bool bUser) if ( bUser ) { - wxString strValFiltered; + wxString strValFiltered; if ( Group()->Config()->GetStyle() & wxCONFIG_USE_NO_ESCAPE_CHARACTERS ) { @@ -1829,17 +1815,9 @@ void wxFileConfigEntry::SetValue(const wxString& strValue, bool bUser) Group()->SetLastEntry(this); } - - SetDirty(); } } -void wxFileConfigEntry::SetDirty() -{ - m_bDirty = true; - Group()->SetDirty(); -} - // ============================================================================ // global functions // ============================================================================ -- 2.47.2