+ // used by Rename()
+ void UpdateGroupAndSubgroupsLines();
+
+public:
+ // ctor
+ wxFileConfigGroup(wxFileConfigGroup *pParent, const wxString& strName, wxFileConfig *);
+
+ // dtor deletes all entries and subgroups also
+ ~wxFileConfigGroup();
+
+ // simple accessors
+ const wxString& Name() const { return m_strName; }
+ wxFileConfigGroup *Parent() const { return m_pParent; }
+ wxFileConfig *Config() const { return m_pConfig; }
+
+ const ArrayEntries& Entries() const { return m_aEntries; }
+ const ArrayGroups& Groups() const { return m_aSubgroups; }
+ bool IsEmpty() const { return Entries().IsEmpty() && Groups().IsEmpty(); }
+
+ // find entry/subgroup (NULL if not found)
+ wxFileConfigGroup *FindSubgroup(const wxString& name) const;
+ wxFileConfigEntry *FindEntry (const wxString& name) const;
+
+ // delete entry/subgroup, return false if doesn't exist
+ bool DeleteSubgroupByName(const wxString& name);
+ bool DeleteEntry(const wxString& name);
+
+ // create new entry/subgroup returning pointer to newly created element
+ wxFileConfigGroup *AddSubgroup(const wxString& strName);
+ wxFileConfigEntry *AddEntry (const wxString& strName, int nLine = wxNOT_FOUND);
+
+ void SetLine(wxFileConfigLineList *pLine);
+
+ // rename: no checks are done to ensure that the name is unique!
+ void Rename(const wxString& newName);
+
+ //
+ wxString GetFullName() const;
+
+ // get the last line belonging to an entry/subgroup of this group
+ wxFileConfigLineList *GetGroupLine(); // line which contains [group]
+ // may be NULL for "/" only
+ wxFileConfigLineList *GetLastEntryLine(); // after which our subgroups start
+ wxFileConfigLineList *GetLastGroupLine(); // after which the next group starts
+
+ // called by entries/subgroups when they're created/deleted
+ void SetLastEntry(wxFileConfigEntry *pEntry);
+ void SetLastGroup(wxFileConfigGroup *pGroup)
+ { m_pLastGroup = pGroup; }
+
+ wxDECLARE_NO_COPY_CLASS(wxFileConfigGroup);
+};
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// static functions
+// ----------------------------------------------------------------------------
+
+// this function modifies in place the given wxFileName object if it doesn't
+// already have an extension
+//
+// note that it's slightly misnamed under Mac as there it doesn't add an
+// extension but modifies the file name instead, so you shouldn't suppose that
+// fn.HasExt() is true after it returns
+static void AddConfFileExtIfNeeded(wxFileName& fn)
+{
+ if ( !fn.HasExt() )
+ {
+#if defined( __WXMAC__ )
+ fn.SetName(fn.GetName() + wxT(" Preferences"));
+#elif defined( __UNIX__ )
+ fn.SetExt(wxT("conf"));
+#else // Windows
+ fn.SetExt(wxT("ini"));
+#endif // UNIX/Win