settings_set.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:10k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: settings_set.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/04/12 18:11:56  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_CONFIG____SETTINGSSET_HPP
  10. #define GUI_CONFIG____SETTINGSSET_HPP
  11. /* $Id: settings_set.hpp,v 1000.2 2004/04/12 18:11:56 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Robert G. Smith
  37.  *
  38.  */
  39.  
  40.  /**
  41.  * File Description:
  42.  *   CSettingsSet is an adapter of the PluginConfigCache.  It is meant to be
  43.  *   used as a base class for individual plugins' configuration classes.
  44.  *   It constrains our access to the ConfigCache to a particular type.
  45.  *  
  46.  *   Preference/Settings classes that inherit from this need to provide:
  47.  *    1) a map of default key/value pairs, 
  48.  *    2) a type name
  49.  *    3) methods LoadCurrentSettings and SaveCurrentSettings
  50.  *      which convert between the derived class's data and key/value
  51.  *      pairs.  They would call this classes Set/Get methods.
  52.  *  
  53.  *   It seems that modifications of the global ConfigCache would only happen
  54.  *   from a user interface event. Hence we shouldn't have to worry about 
  55.  *   locking.  But if this is not true, perhaps there should be a mutex
  56.  *   in this class to keep multiple threads from colliding data. 
  57.  *
  58.  */
  59. #include <gui/config/PluginConfigCache.hpp>
  60. #include <corelib/ncbiobj.hpp>
  61. #include <corelib/ncbistr.hpp>
  62. #include <string>
  63. #include <map>
  64. BEGIN_NCBI_SCOPE
  65. /// IFactoryDefaultSettings
  66. /// abstract base class for all Factory Default Settings classes that provide
  67. /// key/value string pair defaults for descedants of CSettingsSet.
  68. class NCBI_GUICONFIG_EXPORT IFactoryDefaultSettings
  69. {
  70. public:
  71.     virtual ~IFactoryDefaultSettings() {}
  72.     virtual string   Get(const string& key) const = 0;
  73. };
  74. /// Exceptions thrown by CSettings Set and Factory default classes should derive from this.
  75. class CConfigException : public CException
  76. {
  77. public:
  78.     /// Error types that subsystem can generate.
  79.     enum EErrCode {
  80.         eNoDefaultValue,         ///< the Factory Default class does not recognize this key.
  81.         eConfigPanel,            ///< a problem with a configuration panel.
  82.         eThemeUnknownSet        ///< a ThemeSet was asked for a CSettingSet it doesn own.
  83.     };
  84.     /// Translate from the error code value to its string representation.   
  85.     virtual const char* GetErrCodeString(void) const
  86.     {
  87.         switch (GetErrCode()) {
  88.         case eNoDefaultValue: return "No default value.";
  89.         case eConfigPanel:  return "configuration panel error.";
  90.         case eThemeUnknownSet: return "theme does not handle this type.";
  91.         default:     return CException::GetErrCodeString();
  92.         }
  93.     }
  94.     
  95.     // Standard exception boilerplate code.    
  96.     NCBI_EXCEPTION_DEFAULT(CConfigException, CException);
  97. }; 
  98. /// CFactoryDefaultSettings: simple class to provide
  99. /// a fixed set of default settings.
  100. class NCBI_GUICONFIG_EXPORT CFactoryDefaultSettings
  101.     : public IFactoryDefaultSettings
  102. {
  103. public:
  104.     typedef map<string, string> TFDInput;
  105.     CFactoryDefaultSettings() {}
  106.     CFactoryDefaultSettings(const TFDInput& kvs) : m_vals(kvs)
  107.     { }
  108.     virtual ~CFactoryDefaultSettings() {}
  109.     
  110.     string   Get(const string& key) const;
  111. private:
  112.     TFDInput m_vals;
  113. };
  114. /// this is a pure virtual class
  115. class NCBI_GUICONFIG_EXPORT CSettingsSet : public CObject
  116. {
  117. public:
  118.     // constructor
  119.     CSettingsSet(objects::CPluginConfigCache* config_cache, 
  120.                  const string& type,
  121.                  const AutoPtr<IFactoryDefaultSettings>& fds, 
  122.                  const string& typedesc = "",
  123.                  const string& delim = "|");
  124.     virtual ~CSettingsSet();
  125.     enum ELoadValueSource {
  126.         eLoad_Current,      ///< Get values from the current PCV (current style), 
  127.                             ///< if not there look in Factory Defaults.
  128.         eLoad_FactDefs      ///< Only get values from the Factory Defaults.
  129.     };
  130.     
  131.     /// convert between current settings and the PluginConfigCache.
  132.     virtual bool    LoadCurrentSettings(ELoadValueSource src) = 0;
  133.     virtual bool    SaveCurrentSettings(void) = 0;
  134.     
  135.     const string&   GetType(void) const;
  136.     const string&   GetCurrentStyleName(void) const;
  137.     void            SetCurrentStyleName(const string& new_style);
  138.     bool            CurrentSettingsModified(void) const;
  139.     void            CurrentSettingsModified(bool modified);    
  140.     
  141.     const string&   GetTypeDescription(void) const;
  142.     void            SetTypeDescription(const string&);
  143.     
  144.     /** 
  145.         Methods to edit our list of valid styles. 
  146.         These do not change the current style, except DeleteStyle().
  147.         
  148.      */
  149.     
  150.     /// use to set up menu to chose between saved sets/styles.
  151.     list<string>    GetStyleNames(void) const;
  152.     /// these all return the name of the style just added.
  153.     /// on failure they will return empty strings.
  154.     string          AddStyle(void);
  155.     string          DuplicateStyle(const string& style);
  156.     string          RenameStyle(const string& old_style, const string& new_style);
  157.     bool            CanRenameStyle(const string& style);
  158.     // returns true on success, false on failure.
  159.     bool            DeleteStyle(const string& style);
  160.     objects::CPluginConfigCache&    SetConfigCache(void);
  161.     
  162. protected:
  163.     /// what is the delimiter character between parts of a multi-part key?
  164.     const string&   GetKeyDelimiter() const;
  165.     
  166.     /// Access values in the current settings PCV and Factory defaults.
  167.     string          Get(const string& key, ELoadValueSource src) const;
  168.     /// Set values in the current settings PCV.
  169.     void            Set(const string& key, const string& value);
  170.     /// Set values in the current settings, include-type PCV.
  171.     void            Set(const string& typekey, const string& key, const string& value);
  172.     /// Delete a key/value in the current settings.
  173.     /// returns true if the key was found and deleted, false if not.
  174.     bool            Delete(const string& key);
  175.     
  176.     unsigned int    GetArraySize(const string& array_key, ELoadValueSource src) const;
  177.     string          GetArrayItem(const string& array_key, unsigned int i, const string& item_key, ELoadValueSource src) const;
  178.     void            SetArraySize(const string& array_key, unsigned int i);
  179.     void            SetArrayItem(const string& array_key, unsigned int i, const string& item_key, const string& value);
  180.     string          ArrayHeaderKey(const string& array_key) const;
  181.     string          ArrayItemKey(const string& array_key, unsigned int i, const string& item_key) const;
  182.     
  183.     objects::CPluginConfigValues&   SetCurrentSavedSet(void);
  184.     static const string     sm_StartupStyleName;
  185.         
  186. private:
  187.     
  188.     AutoPtr<IFactoryDefaultSettings>         m_FactoryDefault;
  189.     CRef<objects::CPluginConfigCache>        m_ConfigCache; // CAN be null
  190.     const string    m_Type;             ///> key used in PCC.
  191.     string          m_TypeDescription;  ///> used for display and menus.
  192.     const string    m_KeyDelim;
  193.     bool            m_CurrentSetModified;
  194.     string          m_CurrentStyleName;
  195.     CRef<objects::CPluginConfigValues>  m_CurrentSavedSet; // CAN be null
  196. };
  197. END_NCBI_SCOPE
  198. /*
  199. * ===========================================================================
  200. *
  201. * $Log: settings_set.hpp,v $
  202. * Revision 1000.2  2004/04/12 18:11:56  gouriano
  203. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.9
  204. *
  205. * Revision 1.9  2004/02/04 16:48:59  rsmith
  206. * add theme_set exception type.
  207. *
  208. * Revision 1.8  2004/02/02 18:43:26  rsmith
  209. * add description to CSettingsSet, constructor and descendants.
  210. *
  211. * Revision 1.7  2003/12/29 14:32:15  rsmith
  212. * Get always returns string not string&. Get always throws exceptions.
  213. * Add Config exception class.
  214. * Add Array methods.
  215. *
  216. * Revision 1.6  2003/11/21 12:48:32  rsmith
  217. * Add ability to delete entries by key.
  218. *
  219. * Revision 1.5  2003/10/28 19:02:55  dicuccio
  220. * Added export specifiers.  Changed ctor param from CRef<> to raw pointer
  221. *
  222. * Revision 1.4  2003/10/24 16:09:25  rsmith
  223. * add doxygen comments and GetKeyDelimiter
  224. *
  225. * Revision 1.3  2003/10/17 19:42:55  rsmith
  226. * make an abstract interface for factory defaults, and hence store them as a pointer in CSettingsSet.
  227. *
  228. * Revision 1.2  2003/10/10 19:35:31  dicuccio
  229. * Added export specifiers
  230. *
  231. * Revision 1.1  2003/10/10 17:41:43  rsmith
  232. * moved from gui/core to gui/config
  233. *
  234. * Revision 1.1  2003/09/26 18:13:16  rsmith
  235. * plugin configuration data and dialogs.
  236. *
  237. *
  238. * ===========================================================================
  239. */
  240. #endif // GUI_CONFIG____SETTINGSSET_HPP