]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/fileconf.h
code using ms_PaintDC changed a little (a couple of asserts added, the behaviour
[wxWidgets.git] / include / wx / fileconf.h
index a2bbecb415e2e7dc6938427d833c61489851e3cb..b7a24d77477861112a035df36adb6038c7613ff5 100644 (file)
@@ -1,17 +1,14 @@
-/*****************************************************************************\
- * 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
 // ----------------------------------------------------------------------------
 
 /*
-  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
-  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
-  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)
   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
@@ -103,9 +112,17 @@ public:
   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();
 
@@ -113,16 +130,24 @@ public:
   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 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);
@@ -141,12 +166,14 @@ public:
   {
   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 *Prev() const              { return m_pPrev;  }
     void      SetNext(LineList *pNext)  { m_pNext = pNext; }
+    void      SetPrev(LineList *pPrev)  { m_pPrev = pPrev; }
 
     //
     void SetText(const wxString& str) { m_strLine = str;  }
@@ -154,19 +181,29 @@ public:
 
   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);
-  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:
-  // 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();
 
+  // common part of from dtor and DeleteAll
+  void CleanUp();
+
   // parse the whole file
   void Parse(wxTextFile& file, bool bLocal);
 
@@ -188,8 +225,8 @@ private:
 //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
   {
@@ -222,19 +259,21 @@ public:
     void SetLine(LineList *pLine);
   };
 
-protected:
   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
-    ConfigEntry  *m_pLastEntry;   // last entry of this group in the local file
-    ConfigGroup  *m_pLastGroup;   // last subgroup
+    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
@@ -258,7 +297,7 @@ protected:
     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
@@ -268,18 +307,18 @@ protected:
     // will also recursively set parent's dirty flag
     void SetDirty();
     void SetLine(LineList *pLine);
-    
-    // the new entries in this subgroup will be inserted after the last subgroup
-    // or, if there is none, after the last entry
-    void SetLastEntry(ConfigEntry *pLastEntry) { m_pLastEntry = pLastEntry; }
-    void SetLastGroup(ConfigGroup *pLastGroup) { m_pLastGroup = pLastGroup; }
 
+    //
     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; }
   };
 };