]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/fileconf.h
WXFARPROC prototyped as `typedef int (__stdcall *WXFARPROC)()' (does Borland
[wxWidgets.git] / include / wx / fileconf.h
index 97c03c8ffa73cd7b8592eedaa30e7acfaf4a305f..b7a24d77477861112a035df36adb6038c7613ff5 100644 (file)
@@ -1,21 +1,22 @@
-/*****************************************************************************\
- * Project:   CppLib: C++ library for Windows/UNIX platfroms                 *
- * File:      fileconf.h - file based implementation of Config               *
- *---------------------------------------------------------------------------*
- * Language:  C++                                                            *
- * Platfrom:  Any                                                            *
- *---------------------------------------------------------------------------*
- * Classes:                                                                  *
- *---------------------------------------------------------------------------*
- * Author:    Vadim Zeitlin zeitlin@dptmaths.ens-cachan.fr>                  *
- *            adapted from earlier class by VZ & Karsten Ballüder            *
- * History:                                                                  *
- *  27.04.98  created                                                        *
-\*****************************************************************************/
+///////////////////////////////////////////////////////////////////////////////
+// Name:        fileconf.h
+// Purpose:     wxFileConfig derivation of wxConfigBase
+// Author:      Vadim Zeitlin
+// Modified by:
+// Created:     07.04.98 (adapted from appconf.cpp)
+// RCS-ID:      $Id$
+// Copyright:   (c) 1997 Karsten Ballüder   &  Vadim Zeitlin
+//                       Ballueder@usa.net     <zeitlin@dptmaths.ens-cachan.fr>
+// Licence:     wxWindows license
+///////////////////////////////////////////////////////////////////////////////
 
 #ifndef   _FILECONF_H
 #define   _FILECONF_H
 
 
 #ifndef   _FILECONF_H
 #define   _FILECONF_H
 
+#ifdef __GNUG__
+#pragma interface "fileconf.h"
+#endif
+
 // ----------------------------------------------------------------------------
 // compile options
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // compile options
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 
 /*
 // ----------------------------------------------------------------------------
 
 /*
-  wxFileConfig derives from base Config and implements file based config class, 
+  wxFileConfig derives from base Config and implements file based config class,
   i.e. it uses ASCII disk files to store the information. These files are
   i.e. it uses ASCII disk files to store the information. These files are
-  alternatively called INI, .conf or .rc in the documentation. They are 
+  alternatively called INI, .conf or .rc in the documentation. They are
   organized in groups or sections, which can nest (i.e. a group contains
   subgroups, which contain their own subgroups &c). Each group has some
   organized in groups or sections, which can nest (i.e. a group contains
   subgroups, which contain their own subgroups &c). Each group has some
-  number of entries, which are "key = value" pairs. More precisely, the format 
+  number of entries, which are "key = value" pairs. More precisely, the format
   is:
 
   # comments are allowed after either ';' or '#' (Win/UNIX standard)
   is:
 
   # comments are allowed after either ';' or '#' (Win/UNIX standard)
   and local value is ignored. Of course, the changes are always written to local
   file only.
 
   and local value is ignored. Of course, the changes are always written to local
   file only.
 
-  @@@@ describe environment variable expansion
+  The names of these files can be specified in a number of ways. First of all,
+  you can use the standard convention: using the ctor which takes 'strAppName'
+  parameter will probably be sufficient for 90% of cases. If, for whatever
+  reason you wish to use the files with some other names, you can always use the
+  second ctor.
+
+  wxFileConfig also may automatically expand the values of environment variables
+  in the entries it reads: for example, if you have an entry
+    score_file = $HOME/.score
+  a call to Read(&str, "score_file") will return a complete path to .score file
+  unless the expansion was previousle disabled with SetExpandEnvVars(FALSE) call
+  (it's on by default, the current status can be retrieved with
+   IsExpandingEnvVars function).
 */
 
 */
 
-class wxFileConfig : public wxConfig
+class wxFileConfig : public wxConfigBase
 {
 public:
   // construct the "standard" full name for global (system-wide) and
 {
 public:
   // construct the "standard" full name for global (system-wide) and
@@ -99,9 +112,17 @@ public:
   static wxString GetLocalFileName(const char *szFile);
 
   // ctor & dtor
   static wxString GetLocalFileName(const char *szFile);
 
   // ctor & dtor
-    // if strGlobal is empty, only local config file is used
-  wxFileConfig(const wxString& strLocal,
-               const wxString& strGlobal = "");
+    // the names of local and global (if not disabled) config files are
+    // constructed using Get{Local|Global}FileName functions described above
+    // (szAppName is just the (short) name of your application)
+  wxFileConfig(const char *szAppName, bool bLocalOnly = FALSE);
+    // this ctor allows you to specify custom names for both files (if strGlobal
+    // isn't a full path, it's considered to be relative to the standard
+    // directory, i.e. /etc under Unix and %windir% under Windows, if strLocal
+    // is not an absolute path, it's considered to be relative to the user's
+    // directory). If either of strings is empty, the corresponding file is not
+    // used.
+  wxFileConfig(const wxString& strLocal, const wxString& strGlobal);
     // dtor will save unsaved data
   virtual ~wxFileConfig();
 
     // dtor will save unsaved data
   virtual ~wxFileConfig();
 
@@ -109,16 +130,24 @@ public:
   virtual void SetPath(const wxString& strPath);
   virtual const wxString& GetPath() const { return m_strPath; }
 
   virtual void SetPath(const wxString& strPath);
   virtual const wxString& GetPath() const { return m_strPath; }
 
-  virtual bool GetFirstGroup(wxString& str, long& lIndex);
-  virtual bool GetNextGroup (wxString& str, long& lIndex);
-  virtual bool GetFirstEntry(wxString& str, long& lIndex);
-  virtual bool GetNextEntry (wxString& str, long& lIndex);
+  virtual bool GetFirstGroup(wxString& str, long& lIndex) const;
+  virtual bool GetNextGroup (wxString& str, long& lIndex) const;
+  virtual bool GetFirstEntry(wxString& str, long& lIndex) const;
+  virtual bool GetNextEntry (wxString& str, long& lIndex) const;
+
+  virtual uint GetNumberOfEntries(bool bRecursive = FALSE) const;
+  virtual uint GetNumberOfGroups(bool bRecursive = FALSE) const;
+
+  virtual bool HasGroup(const wxString& strName) const;
+  virtual bool HasEntry(const wxString& strName) const;
 
   virtual bool Read(wxString *pstr, const char *szKey,
                     const char *szDefault = 0) const;
   virtual const char *Read(const char *szKey,
                            const char *szDefault = 0) const;
   virtual bool Read(long *pl, const char *szKey, long lDefault) const;
 
   virtual bool Read(wxString *pstr, const char *szKey,
                     const char *szDefault = 0) const;
   virtual const char *Read(const char *szKey,
                            const char *szDefault = 0) const;
   virtual bool Read(long *pl, const char *szKey, long lDefault) const;
+  virtual long Read(const char *szKey, long lDefault) const
+    { return wxConfigBase::Read(szKey, lDefault); }
   virtual bool Write(const char *szKey, const char *szValue);
   virtual bool Write(const char *szKey, long lValue);
   virtual bool Flush(bool bCurrentOnly = FALSE);
   virtual bool Write(const char *szKey, const char *szValue);
   virtual bool Write(const char *szKey, long lValue);
   virtual bool Flush(bool bCurrentOnly = FALSE);
@@ -137,12 +166,14 @@ public:
   {
   public:
     // ctor
   {
   public:
     // ctor
-    LineList(const wxString& str, LineList *pNext = NULL) : m_strLine(str) 
-      { SetNext(pNext); }
-    
-    // 
+    LineList(const wxString& str, LineList *pNext = NULL) : m_strLine(str)
+      { SetNext(pNext); SetPrev(NULL); }
+
+    //
     LineList *Next() const              { return m_pNext;  }
     LineList *Next() const              { return m_pNext;  }
+    LineList *Prev() const              { return m_pPrev;  }
     void      SetNext(LineList *pNext)  { m_pNext = pNext; }
     void      SetNext(LineList *pNext)  { m_pNext = pNext; }
+    void      SetPrev(LineList *pPrev)  { m_pPrev = pPrev; }
 
     //
     void SetText(const wxString& str) { m_strLine = str;  }
 
     //
     void SetText(const wxString& str) { m_strLine = str;  }
@@ -150,19 +181,29 @@ public:
 
   private:
     wxString  m_strLine;      // line contents
 
   private:
     wxString  m_strLine;      // line contents
-    LineList *m_pNext;        // next node
+    LineList *m_pNext,        // next node
+             *m_pPrev;        // previous one
   };
   };
-  
+
   // functions to work with this list
   LineList *LineListAppend(const wxString& str);
   // functions to work with this list
   LineList *LineListAppend(const wxString& str);
-  LineList *LineListInsert(const wxString& str, 
-                           LineList *pLine);    // NULL => Append()
+  LineList *LineListInsert(const wxString& str,
+                           LineList *pLine);    // NULL => Prepend()
+  void      LineListRemove(LineList *pLine);
   bool      LineListIsEmpty();
 
 private:
   bool      LineListIsEmpty();
 
 private:
-  // put the object in the initial state
+  // GetXXXFileame helpers: return ('/' terminated) directory names
+  static wxString GetGlobalDir();
+  static wxString GetLocalDir();
+
+  // common part of all ctors (assumes that m_str{Local|Global}File are already
+  // initialized
   void Init();
 
   void Init();
 
+  // common part of from dtor and DeleteAll
+  void CleanUp();
+
   // parse the whole file
   void Parse(wxTextFile& file, bool bLocal);
 
   // parse the whole file
   void Parse(wxTextFile& file, bool bLocal);
 
@@ -184,8 +225,8 @@ private:
 //protected: --- if wxFileConfig::ConfigEntry is not public, functions in
 //               ConfigGroup such as Find/AddEntry can't return "ConfigEntry *"
 public:
 //protected: --- if wxFileConfig::ConfigEntry is not public, functions in
 //               ConfigGroup such as Find/AddEntry can't return "ConfigEntry *"
 public:
-  WX_DEFINE_ARRAY(ConfigEntry *, ArrayEntries);
-  WX_DEFINE_ARRAY(ConfigGroup *, ArrayGroups);
+  WX_DEFINE_SORTED_ARRAY(ConfigEntry *, ArrayEntries);
+  WX_DEFINE_SORTED_ARRAY(ConfigGroup *, ArrayGroups);
 
   class ConfigEntry
   {
 
   class ConfigEntry
   {
@@ -218,19 +259,21 @@ public:
     void SetLine(LineList *pLine);
   };
 
     void SetLine(LineList *pLine);
   };
 
-protected:
   class ConfigGroup
   {
   private:
   class ConfigGroup
   {
   private:
-    wxFileConfig *m_pConfig;      // config object we belong to
-    ConfigGroup  *m_pParent;      // parent group (NULL for root group)
-    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
-    LineList     *m_pLine;        // pointer to our line in the linked list
-    int           m_nLastEntry,   // last here means "last added"
-                  m_nLastGroup;   // 
+    wxFileConfig *m_pConfig;        // config object we belong to
+    ConfigGroup  *m_pParent;        // parent group (NULL for root group)
+    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
+    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
 
   public:
     // ctor
@@ -254,7 +297,7 @@ protected:
     ConfigEntry *FindEntry   (const char *szName) const;
 
     // delete entry/subgroup, return FALSE if doesn't exist
     ConfigEntry *FindEntry   (const char *szName) const;
 
     // delete entry/subgroup, return FALSE if doesn't exist
-    bool DeleteSubgroup(const char *szName);
+    bool DeleteSubgroupByName(const char *szName);
     bool DeleteEntry(const char *szName);
 
     // create new entry/subgroup returning pointer to newly created element
     bool DeleteEntry(const char *szName);
 
     // create new entry/subgroup returning pointer to newly created element
@@ -265,12 +308,17 @@ protected:
     void SetDirty();
     void SetLine(LineList *pLine);
 
     void SetDirty();
     void SetLine(LineList *pLine);
 
+    //
     wxString GetFullName() const;
 
     // get the last line belonging to an entry/subgroup of this group
     wxString GetFullName() const;
 
     // get the last line belonging to an entry/subgroup of this group
-    LineList *GetGroupLine();
-    LineList *GetLastEntryLine();
-    LineList *GetLastGroupLine();
+    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; }
   };
 };
 
   };
 };