]> git.saurik.com Git - wxWidgets.git/commitdiff
RenameEntry/Group() functions added to wxConfig and derivations (not yet
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 20 Jan 1999 19:54:17 +0000 (19:54 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 20 Jan 1999 19:54:17 +0000 (19:54 +0000)
implemented for wxIniCnfig and wxRegConfig)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1438 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/config.tex
include/wx/confbase.h
include/wx/fileconf.h
include/wx/msw/iniconf.h
include/wx/msw/regconf.h
src/common/fileconf.cpp

index af679b31a58c7c31caa96c063204281362053edf..8e74b3d4294bd09f90323d50cc3978719f568bd5 100644 (file)
@@ -257,6 +257,17 @@ arbitrary path (either relative or absolute), not just the key name.
 \helpref{Write}{wxconfigbasewrite}\\
 \helpref{Flush}{wxconfigbaseflush}
 
 \helpref{Write}{wxconfigbasewrite}\\
 \helpref{Flush}{wxconfigbaseflush}
 
+\membersection{Rename entries/groups}
+
+The functions in this section allow to rename entries or subgroups of the
+current group. They will return FALSE on error. typically because either the
+entry/group with the original name doesn't exist, because the entry/group with
+the new name already exists or because the function is not supported in this
+wxConfig implementation.
+
+\helpref{RenameEntry}{wxconfigbaserenameentry}\\
+\helpref{RenameGroup}{wxconfigbaserenamegroup}
+
 \membersection{Delete entries/groups}
 
 The functions in this section delete entries and/or groups of entries from the
 \membersection{Delete entries/groups}
 
 The functions in this section delete entries and/or groups of entries from the
@@ -561,6 +572,28 @@ not found, {\it b} is not changed.
 Reads a bool value, returning TRUE if the value was found. If the value was
 not found, {\it defaultVal} is used instead.
 
 Reads a bool value, returning TRUE if the value was found. If the value was
 not found, {\it defaultVal} is used instead.
 
+\membersection{wxConfigBase::RenameEntry}\label{wxconfigbaserenameentry}
+
+\func{bool}{RenameEntry}{\param{const wxString\& }{ oldName}, \param{const wxString\& }{ newName}}
+
+Renames an entry in the current group. The entries names (both the old and
+the new one) shouldn't contain backslashes, i.e. only simple names and not
+arbitrary paths are accepted by this function.
+
+Returns FALSE if the {\it oldName} doesn't exist or if {\it newName} already
+exists.
+
+\membersection{wxConfigBase::RenameGroup}\label{wxconfigbaserenamegroup}
+
+\func{bool}{RenameGroup}{\param{const wxString\& }{ oldName}, \param{const wxString\& }{ newName}}
+
+Renames a subgroup of the current group. The subgroup names (both the old and
+the new one) shouldn't contain backslashes, i.e. only simple names and not
+arbitrary paths are accepted by this function.
+
+Returns FALSE if the {\it oldName} doesn't exist or if {\it newName} already
+exists.
+
 \membersection{wxConfigBase::Set}\label{wxconfigbaseset}
 
 \func{wxConfigBase *}{Set}{\param{wxConfigBase *}{pConfig}}
 \membersection{wxConfigBase::Set}\label{wxconfigbaseset}
 
 \func{wxConfigBase *}{Set}{\param{wxConfigBase *}{pConfig}}
index 36a9d05efe07985b4536d987cbd6f3cbf4a6f806..b2a4ceb21faaebb1fc0f83eeee982237c2ba5264 100644 (file)
@@ -185,6 +185,15 @@ public:
     // permanently writes all changes
   virtual bool Flush(bool bCurrentOnly = FALSE) = 0;
 
     // permanently writes all changes
   virtual bool Flush(bool bCurrentOnly = FALSE) = 0;
 
+  // renaming, all functions return FALSE on failure (probably because the new
+  // name is already taken by an existing entry)
+    // rename an entry
+  virtual bool RenameEntry(const wxString& oldName,
+                           const wxString& newName) = 0;
+    // rename a group
+  virtual bool RenameGroup(const wxString& oldName,
+                           const wxString& newName) = 0;
+
   // delete entries/groups
     // deletes the specified entry and the group it belongs to if
     // it was the last key in it and the second parameter is true
   // delete entries/groups
     // deletes the specified entry and the group it belongs to if
     // it was the last key in it and the second parameter is true
index 0e19e079545121778a1383c0867b425769a7452a..3465dc923f72ace9478418c36e384ebb075eca84 100644 (file)
   (it's on by default, the current status can be retrieved with
    IsExpandingEnvVars function).
 */
   (it's on by default, the current status can be retrieved with
    IsExpandingEnvVars function).
 */
-  class wxFileConfig; //linea nueva
-  class ConfigGroup;
-  class ConfigEntry;
+class wxFileConfig;
+class ConfigGroup;
+class ConfigEntry;
 
 
-  // we store all lines of the local config file as a linked list in memory
-  class LineList
-  {
-  public:
-    void      SetNext(LineList *pNext)  { m_pNext = pNext; }
-    void      SetPrev(LineList *pPrev)  { m_pPrev = pPrev; }
-
-    // ctor
-    LineList(const wxString& str, LineList *pNext = (LineList *) NULL) : m_strLine(str)
-      { SetNext(pNext); SetPrev((LineList *) NULL); }
+// we store all lines of the local config file as a linked list in memory
+class LineList
+{
+public:
+  void      SetNext(LineList *pNext)  { m_pNext = pNext; }
+  void      SetPrev(LineList *pPrev)  { m_pPrev = pPrev; }
 
 
-    //
-    LineList *Next() const              { return m_pNext;  }
-    LineList *Prev() const              { return m_pPrev;  }
+  // ctor
+  LineList(const wxString& str, LineList *pNext = (LineList *) NULL) : m_strLine(str)
+    { SetNext(pNext); SetPrev((LineList *) NULL); }
 
 
-    //
-    void SetText(const wxString& str) { m_strLine = str;  }
-    const wxString& Text() const      { return m_strLine; }
+  //
+  LineList *Next() const              { return m_pNext;  }
+  LineList *Prev() const              { return m_pPrev;  }
 
 
-  private:
-    wxString  m_strLine;      // line contents
-    LineList *m_pNext,        // next node
-             *m_pPrev;        // previous one
-  };
+  //
+  void SetText(const wxString& str) { m_strLine = str;  }
+  const wxString& Text() const      { return m_strLine; }
 
 
+private:
+  wxString  m_strLine;      // line contents
+  LineList *m_pNext,        // next node
+           *m_pPrev;        // previous one
+};
 
 class wxFileConfig : public wxConfigBase
 {
 
 class wxFileConfig : public wxConfigBase
 {
@@ -190,32 +189,33 @@ public:
 
   // The following are necessary to satisfy the compiler
   wxString Read(const wxString& key, const wxString& defVal) const
 
   // The following are necessary to satisfy the compiler
   wxString Read(const wxString& key, const wxString& defVal) const
-  { return wxConfigBase::Read(key, defVal); }
+    { return wxConfigBase::Read(key, defVal); }
   bool Read(const wxString& key, long *pl, long defVal) const
   bool Read(const wxString& key, long *pl, long defVal) const
-  { return wxConfigBase::Read(key, pl, defVal); }
+    { return wxConfigBase::Read(key, pl, defVal); }
   long Read(const wxString& key, long defVal) const
   long Read(const wxString& key, long defVal) const
-  { return wxConfigBase::Read(key, defVal); }
+    { return wxConfigBase::Read(key, defVal); }
   bool Read(const wxString& key, int *pi, int defVal) const
     { return wxConfigBase::Read(key, pi, defVal); }
   bool Read(const wxString& key, int *pi) const
     { return wxConfigBase::Read(key, pi); }
   bool Read(const wxString& key, double* val) const
   bool Read(const wxString& key, int *pi, int defVal) const
     { return wxConfigBase::Read(key, pi, defVal); }
   bool Read(const wxString& key, int *pi) const
     { return wxConfigBase::Read(key, pi); }
   bool Read(const wxString& key, double* val) const
-  { return wxConfigBase::Read(key, val); }
+    { return wxConfigBase::Read(key, val); }
   bool Read(const wxString& key, double* val, double defVal) const
   bool Read(const wxString& key, double* val, double defVal) const
-  { return wxConfigBase::Read(key, val, defVal); }
+    { return wxConfigBase::Read(key, val, defVal); }
 
   virtual bool Write(const wxString& key, const wxString& szValue);
   virtual bool Write(const wxString& key, long lValue);
 
   virtual bool Flush(bool bCurrentOnly = FALSE);
 
 
   virtual bool Write(const wxString& key, const wxString& szValue);
   virtual bool Write(const wxString& key, long lValue);
 
   virtual bool Flush(bool bCurrentOnly = FALSE);
 
+  virtual bool RenameEntry(const wxString& oldName, const wxString& newName);
+  virtual bool RenameGroup(const wxString& oldName, const wxString& newName);
+
   virtual bool DeleteEntry(const wxString& key, bool bGroupIfEmptyAlso);
   virtual bool DeleteGroup(const wxString& szKey);
   virtual bool DeleteAll();
 
 public:
   virtual bool DeleteEntry(const wxString& key, bool bGroupIfEmptyAlso);
   virtual bool DeleteGroup(const wxString& szKey);
   virtual bool DeleteAll();
 
 public:
-  // fwd decl
-
   // functions to work with this list
   LineList *LineListAppend(const wxString& str);
   LineList *LineListInsert(const wxString& str,
   // functions to work with this list
   LineList *LineListAppend(const wxString& str);
   LineList *LineListInsert(const wxString& str,
@@ -224,7 +224,7 @@ public:
   bool      LineListIsEmpty();
 
 private:
   bool      LineListIsEmpty();
 
 private:
-  // GetXXXFileame helpers: return ('/' terminated) directory names
+  // GetXXXFileName helpers: return ('/' terminated) directory names
   static wxString GetGlobalDir();
   static wxString GetLocalDir();
 
   static wxString GetGlobalDir();
   static wxString GetLocalDir();
 
@@ -253,111 +253,106 @@ private:
   ConfigGroup *m_pRootGroup,      // the top (unnamed) group
               *m_pCurrentGroup;   // the current group
 
   ConfigGroup *m_pRootGroup,      // the top (unnamed) group
               *m_pCurrentGroup;   // the current group
 
-//protected: --- if wxFileConfig::ConfigEntry is not public, functions in
-//               ConfigGroup such as Find/AddEntry can't return "ConfigEntry *"
 public:
   WX_DEFINE_SORTED_ARRAY(ConfigEntry *, ArrayEntries);
   WX_DEFINE_SORTED_ARRAY(ConfigGroup *, ArrayGroups);
 public:
   WX_DEFINE_SORTED_ARRAY(ConfigEntry *, ArrayEntries);
   WX_DEFINE_SORTED_ARRAY(ConfigGroup *, ArrayGroups);
+};
 
 
+class ConfigEntry
+{
+private:
+  ConfigGroup  *m_pParent;      // group that contains us
+  wxString      m_strName,      // entry name
+                m_strValue;     //       value
+  bool          m_bDirty,       // changed since last read?
+                m_bImmutable;   // can be overriden locally?
+  int           m_nLine;        // used if m_pLine == NULL only
+  LineList     *m_pLine;        // pointer to our line in the linked list
+                                // or NULL if it was found in global file
+
+public:
+  ConfigEntry(ConfigGroup *pParent, const wxString& strName, int nLine);
+
+  // simple accessors
+  const wxString& Name()        const { return m_strName;    }
+  const wxString& Value()       const { return m_strValue;   }
+  ConfigGroup    *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;      }
+  LineList       *GetLine()     const { return m_pLine;      }
+
+  // modify entry attributes
+  void SetValue(const wxString& strValue, bool bUser = TRUE);
+  void SetDirty();
+  void SetLine(LineList *pLine);
 };
 
 };
 
-  class ConfigEntry
-  {
-  private:
-    ConfigGroup  *m_pParent;      // group that contains us
-    wxString      m_strName,      // entry name
-                  m_strValue;     //       value
-    bool          m_bDirty,       // changed since last read?
-                  m_bImmutable;   // can be overriden locally?
-    int           m_nLine;        // used if m_pLine == NULL only
-    LineList     *m_pLine;        // pointer to our line in the linked list
-                                  // or NULL if it was found in global file
-
-  public:
-    ConfigEntry(ConfigGroup *pParent, const wxString& strName, int nLine);
-
-    // simple accessors
-    const wxString& Name()        const { return m_strName;    }
-    const wxString& Value()       const { return m_strValue;   }
-    ConfigGroup    *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;      }
-    LineList       *GetLine()     const { return m_pLine;      }
-
-    // modify entry attributes
-    void SetValue(const wxString& strValue, bool bUser = TRUE);
-    void SetDirty();
-    void SetLine(LineList *pLine);
-  };
-
-  class ConfigGroup
-  {
-  private:
-    wxFileConfig *m_pConfig;        // config object we belong to
-    ConfigGroup  *m_pParent;        // parent group (NULL for root group)
-    wxFileConfig::ArrayEntries  m_aEntries;       // entries in this group
-    wxFileConfig::ArrayGroups   m_aSubgroups;     // subgroups
-    wxString      m_strName;        // group's name
-    bool          m_bDirty;         // if FALSE => all subgroups are not dirty
-    LineList     *m_pLine;          // pointer to our line in the linked list
-    ConfigEntry  *m_pLastEntry;     // last entry/subgroup of this group in the
-    ConfigGroup  *m_pLastGroup;     // local file (we insert new ones after it)
-
-    // DeleteSubgroupByName helper
-    bool DeleteSubgroup(ConfigGroup *pGroup);
-
-  public:
-    // ctor
-    ConfigGroup(ConfigGroup *pParent, const wxString& strName, wxFileConfig *);
-
-    // dtor deletes all entries and subgroups also
-    ~ConfigGroup();
-
-    // simple accessors
-    const wxString& Name()    const { return m_strName; }
-    ConfigGroup    *Parent()  const { return m_pParent; }
-    wxFileConfig   *Config()  const { return m_pConfig; }
-    bool            IsDirty() const { return m_bDirty;  }
-
-    const wxFileConfig::ArrayEntries& Entries() const { return m_aEntries;   }
-    const wxFileConfig::ArrayGroups&  Groups()  const { return m_aSubgroups; }
-    bool  IsEmpty() const { return Entries().IsEmpty() && Groups().IsEmpty(); }
-
-    // find entry/subgroup (NULL if not found)
-    ConfigGroup *FindSubgroup(const char *szName) const;
-    ConfigEntry *FindEntry   (const char *szName) const;
-
-    // delete entry/subgroup, return FALSE if doesn't exist
-    bool DeleteSubgroupByName(const char *szName);
-    bool DeleteEntry(const char *szName);
-
-    // create new entry/subgroup returning pointer to newly created element
-    ConfigGroup *AddSubgroup(const wxString& strName);
-    ConfigEntry *AddEntry   (const wxString& strName, int nLine = wxNOT_FOUND);
-
-    // will also recursively set parent's dirty flag
-    void SetDirty();
-    void SetLine(LineList *pLine);
-
-    //
-    wxString GetFullName() const;
-
-    // get the last line belonging to an entry/subgroup of this group
-    LineList *GetGroupLine();     // line which contains [group]
-    LineList *GetLastEntryLine(); // after which our subgroups start
-    LineList *GetLastGroupLine(); // after which the next group starts
-
-    // called by entries/subgroups when they're created/deleted
-    void SetLastEntry(ConfigEntry *pEntry) { m_pLastEntry = pEntry; }
-    void SetLastGroup(ConfigGroup *pGroup) { m_pLastGroup = pGroup; }
-  };
+class ConfigGroup
+{
+private:
+  wxFileConfig *m_pConfig;        // config object we belong to
+  ConfigGroup  *m_pParent;        // parent group (NULL for root group)
+  wxFileConfig::ArrayEntries  m_aEntries;       // entries in this group
+  wxFileConfig::ArrayGroups   m_aSubgroups;     // subgroups
+  wxString      m_strName;        // group's name
+  bool          m_bDirty;         // if FALSE => all subgroups are not dirty
+  LineList     *m_pLine;          // pointer to our line in the linked list
+  ConfigEntry  *m_pLastEntry;     // last entry/subgroup of this group in the
+  ConfigGroup  *m_pLastGroup;     // local file (we insert new ones after it)
+
+  // DeleteSubgroupByName helper
+  bool DeleteSubgroup(ConfigGroup *pGroup);
 
 
-#endif  //_FILECONF_H
+public:
+  // ctor
+  ConfigGroup(ConfigGroup *pParent, const wxString& strName, wxFileConfig *);
+
+  // dtor deletes all entries and subgroups also
+  ~ConfigGroup();
+
+  // simple accessors
+  const wxString& Name()    const { return m_strName; }
+  ConfigGroup    *Parent()  const { return m_pParent; }
+  wxFileConfig   *Config()  const { return m_pConfig; }
+  bool            IsDirty() const { return m_bDirty;  }
+
+  const wxFileConfig::ArrayEntries& Entries() const { return m_aEntries;   }
+  const wxFileConfig::ArrayGroups&  Groups()  const { return m_aSubgroups; }
+  bool  IsEmpty() const { return Entries().IsEmpty() && Groups().IsEmpty(); }
 
 
+  // find entry/subgroup (NULL if not found)
+  ConfigGroup *FindSubgroup(const char *szName) const;
+  ConfigEntry *FindEntry   (const char *szName) const;
 
 
+  // delete entry/subgroup, return FALSE if doesn't exist
+  bool DeleteSubgroupByName(const char *szName);
+  bool DeleteEntry(const char *szName);
 
 
+  // create new entry/subgroup returning pointer to newly created element
+  ConfigGroup *AddSubgroup(const wxString& strName);
+  ConfigEntry *AddEntry   (const wxString& strName, int nLine = wxNOT_FOUND);
 
 
+  // will also recursively set parent's dirty flag
+  void SetDirty();
+  void SetLine(LineList *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
+  LineList *GetGroupLine();     // line which contains [group]
+  LineList *GetLastEntryLine(); // after which our subgroups start
+  LineList *GetLastGroupLine(); // after which the next group starts
+
+  // called by entries/subgroups when they're created/deleted
+  void SetLastEntry(ConfigEntry *pEntry) { m_pLastEntry = pEntry; }
+  void SetLastGroup(ConfigGroup *pGroup) { m_pLastGroup = pGroup; }
+};
+
+#endif  //_FILECONF_H
 
 
index 331ee3f46989f46daf719a505a7b6e8095d08b9b..a49994978fa602a812de7d8da2f7eef78af32ca2 100644 (file)
@@ -91,6 +91,9 @@ public:
 
   virtual bool Flush(bool bCurrentOnly = FALSE);
 
 
   virtual bool Flush(bool bCurrentOnly = FALSE);
 
+  virtual bool RenameEntry(const wxString& oldName, const wxString& newName);
+  virtual bool RenameGroup(const wxString& oldName, const wxString& newName);
+
   virtual bool DeleteEntry(const wxString& Key, bool bGroupIfEmptyAlso);
   virtual bool DeleteGroup(const wxString& szKey);
   virtual bool DeleteAll();
   virtual bool DeleteEntry(const wxString& Key, bool bGroupIfEmptyAlso);
   virtual bool DeleteGroup(const wxString& szKey);
   virtual bool DeleteAll();
index f9fd74eb902c75938df236ea628c21c90a54269f..630bab52d6595fa234061ad4720aee26eecc586d 100644 (file)
@@ -85,6 +85,10 @@ public:
 
   virtual bool Flush(bool /* bCurrentOnly = FALSE */ ) { return TRUE; }
 
 
   virtual bool Flush(bool /* bCurrentOnly = FALSE */ ) { return TRUE; }
 
+  // rename
+  virtual bool RenameEntry(const wxString& oldName, const wxString& newName);
+  virtual bool RenameGroup(const wxString& oldName, const wxString& newName);
+
   // delete
   virtual bool DeleteEntry(const wxString& key, bool bGroupIfEmptyAlso);
   virtual bool DeleteGroup(const wxString& key);
   // delete
   virtual bool DeleteEntry(const wxString& key, bool bGroupIfEmptyAlso);
   virtual bool DeleteGroup(const wxString& key);
index c887bc6b8664edfae8eb68918f75c3deab764e95..dd99938e9a3b8ae194b182be5bddf12766db8c5a 100644 (file)
 inline bool IsValid(char c) { return isalnum(c) || strchr("@_/-!.*%", c); }
 
 // compare functions for sorting the arrays
 inline bool IsValid(char c) { return isalnum(c) || strchr("@_/-!.*%", c); }
 
 // compare functions for sorting the arrays
-static int CompareEntries(ConfigEntry *p1,
-                          ConfigEntry *p2);
-static int CompareGroups(ConfigGroup *p1,
-                         ConfigGroup *p2);
+static int CompareEntries(ConfigEntry *p1, ConfigEntry *p2);
+static int CompareGroups(ConfigGroup *p1, ConfigGroup *p2);
 
 // filter strings
 static wxString FilterIn(const wxString& str);
 
 // filter strings
 static wxString FilterIn(const wxString& str);
@@ -654,6 +652,50 @@ bool wxFileConfig::Flush(bool /* bCurrentOnly */)
   return file.Commit();
 }
 
   return file.Commit();
 }
 
+// ----------------------------------------------------------------------------
+// renaming groups/entries
+// ----------------------------------------------------------------------------
+
+bool wxFileConfig::RenameEntry(const wxString& oldName,
+                               const wxString& newName)
+{
+    // check that the entry exists
+    ConfigEntry *oldEntry = m_pCurrentGroup->FindEntry(oldName);
+    if ( !oldEntry )
+        return FALSE;
+
+    // check that the new entry doesn't already exist
+    if ( m_pCurrentGroup->FindEntry(newName) )
+        return FALSE;
+
+    // delete the old entry, create the new one
+    wxString value = oldEntry->Value();
+    if ( !m_pCurrentGroup->DeleteEntry(oldName) )
+        return FALSE;
+
+    ConfigEntry *newEntry = m_pCurrentGroup->AddEntry(newName);
+    newEntry->SetValue(value);
+
+    return TRUE;
+}
+
+bool wxFileConfig::RenameGroup(const wxString& oldName,
+                               const wxString& newName)
+{
+    // check that the group exists
+    ConfigGroup *group = m_pCurrentGroup->FindSubgroup(oldName);
+    if ( !group )
+        return FALSE;
+
+    // check that the new group doesn't already exist
+    if ( m_pCurrentGroup->FindSubgroup(newName) )
+        return FALSE;
+
+    group->Rename(newName);
+
+    return TRUE;
+}
+
 // ----------------------------------------------------------------------------
 // delete groups/entries
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // delete groups/entries
 // ----------------------------------------------------------------------------
@@ -852,7 +894,7 @@ void ConfigGroup::SetLine(LineList *pLine)
       backwards in the config file (OTOH, it's not that important) and as we
       would still need to do it for the subgroups the code wouldn't have been
       significantly less complicated.
       backwards in the config file (OTOH, it's not that important) and as we
       would still need to do it for the subgroups the code wouldn't have been
       significantly less complicated.
- */
+*/
 
 // Return the line which contains "[our name]". If we're still not in the list,
 // add our line to it immediately after the last line of our parent group if we
 
 // Return the line which contains "[our name]". If we're still not in the list,
 // add our line to it immediately after the last line of our parent group if we
@@ -917,6 +959,18 @@ LineList *ConfigGroup::GetLastEntryLine()
 // group name
 // ----------------------------------------------------------------------------
 
 // group name
 // ----------------------------------------------------------------------------
 
+void ConfigGroup::Rename(const wxString& newName)
+{
+    m_strName = newName;
+
+    LineList *line = GetGroupLine();
+    wxString strFullName;
+    strFullName << "[" << (GetFullName().c_str() + 1) << "]"; // +1: no '/'
+    line->SetText(strFullName);
+
+    SetDirty();
+}
+
 wxString ConfigGroup::GetFullName() const
 {
   if ( Parent() )
 wxString ConfigGroup::GetFullName() const
 {
   if ( Parent() )