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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: settings_set.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:46:07  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: settings_set.cpp,v 1000.1 2004/06/01 20:46:07 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Robert G. Smith
  35.  *
  36.  * File Description:
  37.  *   CSettingsSet is an adapter of the PluginConfigCache.  It is meant to be
  38.  *   used as a base class for individual plugins' configuration classes, and
  39.  *   provides an interface to the PluginConfigCache for plugins.
  40.  *   It constrains our access to the PluginConfigCache to a particular type.
  41.  *
  42.  */
  43. #include <ncbi_pch.hpp>
  44. #include <gui/config/settings_set.hpp>
  45. BEGIN_NCBI_SCOPE
  46. const string     CSettingsSet::sm_StartupStyleName("default");
  47. CSettingsSet::CSettingsSet(objects::CPluginConfigCache* config_cache, 
  48.                  const string& type,
  49.                  const AutoPtr<IFactoryDefaultSettings>& fds,
  50.                  const string& typedesc,
  51.                  const string& delim
  52.                 )
  53.       : m_FactoryDefault(fds),
  54.         m_ConfigCache(config_cache), 
  55.         m_Type(type), 
  56.         m_TypeDescription(typedesc),
  57.         m_KeyDelim(delim)
  58. {
  59.     if (m_TypeDescription.empty()) {
  60.         m_TypeDescription = m_Type;
  61.     }
  62.     SetCurrentStyleName(sm_StartupStyleName);
  63. }
  64. CSettingsSet::~CSettingsSet()
  65. {
  66. }
  67. const string& CSettingsSet::GetKeyDelimiter() const
  68. {
  69.     return m_KeyDelim;
  70. }
  71. const string&  CSettingsSet::GetType(void) const
  72. {
  73.     return m_Type;
  74. }
  75. const string& CSettingsSet::GetCurrentStyleName(void) const
  76. {
  77.     return m_CurrentStyleName;
  78. }
  79. void CSettingsSet::SetCurrentStyleName(const string& new_style)
  80. {
  81.     if ( m_CurrentStyleName != new_style) {
  82.         m_CurrentStyleName = new_style;
  83.         if (m_ConfigCache.NotEmpty()  &&  m_ConfigCache->HasPCV(m_Type, m_CurrentStyleName) ) {
  84.             m_CurrentSavedSet.Reset(& m_ConfigCache->SetPCV(m_Type, m_CurrentStyleName));
  85.         } else {
  86.             m_CurrentSavedSet.Reset();
  87.         }
  88.         CurrentSettingsModified(false);       
  89.     }
  90. }
  91. bool CSettingsSet::CurrentSettingsModified(void) const
  92. {
  93.     return m_CurrentSetModified;
  94. }
  95. void CSettingsSet::CurrentSettingsModified(bool modified)
  96. {
  97.     m_CurrentSetModified = modified;
  98. }
  99. const string& CSettingsSet::GetTypeDescription(void) const
  100. {
  101.     return m_TypeDescription;
  102. }
  103. void CSettingsSet::SetTypeDescription(const string& desc)
  104. {
  105.     m_TypeDescription = desc;
  106. }
  107. list<string> CSettingsSet::GetStyleNames() const
  108. {
  109.     list <string> ret_list;
  110.     if ( m_ConfigCache.NotEmpty() ) {
  111.         ret_list = m_ConfigCache->GetStyleNamesByType(m_Type);
  112.         ret_list.remove(sm_StartupStyleName);
  113.         ret_list.sort();
  114.     }
  115.     // Make sure the default name is always at the top of the list
  116.     // whether or not it exists in the PCC.
  117.     ret_list.push_front(sm_StartupStyleName);
  118.     return ret_list;
  119. }
  120. string CSettingsSet::AddStyle(void)
  121. {
  122.     objects::CPluginConfigCache& pcc = SetConfigCache();
  123.     string  new_name("New Default Values");  
  124.     new_name = pcc.MakeUniqueStyle(m_Type, new_name);
  125.     pcc.SetPCV(m_Type, new_name);
  126.     return new_name;
  127. }
  128. string CSettingsSet::DuplicateStyle(const string& style)
  129. {
  130.     objects::CPluginConfigCache& pcc = SetConfigCache();
  131.     // make new unique name.
  132.     string  new_name(style + " copy");  
  133.     new_name = pcc.MakeUniqueStyle(m_Type, new_name);
  134.     
  135.     // Some style names (default) may not actually exist
  136.     // so there is nothing to duplicate.
  137.     if (pcc.HasPCV(m_Type, style)) {
  138.         pcc.DupPCV(m_Type, style, new_name);
  139.     } else {
  140.         pcc.SetPCV(m_Type, new_name);
  141.     }
  142.     return new_name;
  143. }
  144. string CSettingsSet::RenameStyle(const string& old_style, const string& new_style)
  145. {
  146.     if (old_style == sm_StartupStyleName  ||  
  147.         new_style.empty() ||
  148.         old_style == new_style ) {
  149.         return kEmptyStr;
  150.     }
  151.     
  152.     objects::CPluginConfigCache& pcc = SetConfigCache();
  153.     objects::CPluginConfigValues& pcv = pcc.SetPCV(m_Type, old_style);
  154.     string new_name = pcc.MakeUniqueStyle(m_Type, new_style);
  155.     pcv.SetId().SetStyle(new_name);
  156.     return new_name;
  157. }
  158. bool CSettingsSet::CanRenameStyle(const string& style)
  159. {
  160.     if (style == sm_StartupStyleName)
  161.         return false;
  162.     
  163.     return SetConfigCache().HasPCV(m_Type, style);
  164. }
  165. bool   CSettingsSet::DeleteStyle(const string& style)
  166. {
  167.     if (style == sm_StartupStyleName) {
  168.         return false;
  169.     }
  170.     SetConfigCache().DeletePCV(m_Type, style);
  171.     return true;
  172. }
  173. string CSettingsSet::Get(const string& key, ELoadValueSource data_src) const
  174. {
  175.     if (data_src == eLoad_Current  &&  
  176.             m_ConfigCache.NotEmpty()  && 
  177.             m_CurrentSavedSet.NotEmpty() ) {
  178.         try { // keys never saved with a value get Factory Defaults.
  179.             return m_ConfigCache->GetStringByKey(*m_CurrentSavedSet, key, m_KeyDelim);
  180.         }
  181.         catch (const CSerialException&) {
  182.         }
  183.     }
  184.     return m_FactoryDefault->Get( key );
  185. }
  186. void CSettingsSet::Set(const string& key, const string& value)
  187. {
  188.     CurrentSettingsModified(true);
  189.     
  190.     SetCurrentSavedSet().AddKeyString(key, value, m_KeyDelim);
  191. }
  192. void CSettingsSet::Set(const string& typekey, const string& key, const string& value)
  193. {
  194.     CurrentSettingsModified(true);
  195.     
  196.     SetConfigCache().AddKeyString( SetCurrentSavedSet(), typekey, key, value, m_KeyDelim);
  197. }
  198. bool CSettingsSet::Delete(const string& key)
  199. {
  200.     if (SetConfigCache().DelKeyvalue(SetCurrentSavedSet(),  key, m_KeyDelim)) {
  201.         CurrentSettingsModified(true);
  202.         return true;
  203.     }
  204.     return false;
  205. }
  206. objects::CPluginConfigCache& CSettingsSet::SetConfigCache(void)
  207. {
  208.     if ( m_ConfigCache.Empty() ) {
  209.         m_ConfigCache.Reset( new objects::CPluginConfigCache );
  210.     }
  211.     return *m_ConfigCache;
  212. }
  213. objects::CPluginConfigValues& CSettingsSet::SetCurrentSavedSet(void)
  214. {
  215.     if ( m_CurrentSavedSet.Empty() ) {
  216.         m_CurrentSavedSet.Reset(& (SetConfigCache().SetPCV(m_Type, m_CurrentStyleName)) );
  217.     }
  218.     return *m_CurrentSavedSet;
  219. }
  220. // Array access methods.
  221. const string kArrayCountSubKey("array");
  222. string CSettingsSet::ArrayHeaderKey(const string& array_key) const
  223. {
  224.     return array_key + GetKeyDelimiter() + kArrayCountSubKey;
  225. }
  226. string CSettingsSet::ArrayItemKey(const string& array_key, unsigned int i, const string& item_key) const
  227. {
  228.     string array_item_key = array_key + GetKeyDelimiter() + NStr::UIntToString(i);
  229.     if ( ! item_key.empty()) {
  230.         array_item_key += GetKeyDelimiter() + item_key;
  231.     }
  232.     return array_item_key;
  233. }
  234.     
  235. unsigned int CSettingsSet::GetArraySize(const string& array_key, ELoadValueSource src) const
  236. {
  237.     string array_size_str = Get(ArrayHeaderKey(array_key), src);
  238.     return NStr::StringToUInt(array_size_str);
  239. }
  240. string CSettingsSet::GetArrayItem(const string& array_key, unsigned int i, const string& item_key, ELoadValueSource data_src) const
  241. {
  242.     try {
  243.         return Get(ArrayItemKey(array_key, i, item_key), data_src);
  244.     }
  245.     catch (const CConfigException& e1) {
  246.         /// no array item i in the PCC or in the Factory Defaults.
  247.         /// try array item 0 as a default.
  248.         if (e1.GetErrCode() == CConfigException::eNoDefaultValue) {
  249.             try {
  250.                 return Get(ArrayItemKey(array_key, 0, item_key), data_src);
  251.             }
  252.             catch (const CConfigException&) {
  253.                 // no item 0 either.
  254.                 // rethrow the original exception.
  255.                 throw e1;
  256.              }
  257.         }
  258.         throw;
  259.     }
  260.     _ASSERT(false); // can't reach here.
  261.     return kEmptyStr; // satisfy compilers.
  262. }
  263. void CSettingsSet::SetArraySize(const string& array_key, unsigned int array_size)
  264. {
  265.     Set(ArrayHeaderKey(array_key), NStr::UIntToString(array_size));
  266. }
  267. void CSettingsSet::SetArrayItem(const string& array_key, unsigned int i, const string& item_key, const string& value)
  268. {
  269.     Set(ArrayItemKey(array_key, i, item_key), value);
  270. }
  271. string CFactoryDefaultSettings::Get(const string& key) const {
  272.     TFDInput::const_iterator i =  m_vals.find(key);
  273.     if (i == m_vals.end()) {
  274.         NCBI_THROW(CConfigException, eNoDefaultValue, "key: " + key); 
  275.     }
  276.     return i->second;
  277. }
  278. END_NCBI_SCOPE
  279. /*
  280. * ===========================================================================
  281. *
  282. * $Log: settings_set.cpp,v $
  283. * Revision 1000.1  2004/06/01 20:46:07  gouriano
  284. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  285. *
  286. * Revision 1.2  2004/05/21 22:27:41  gorelenk
  287. * Added PCH ncbi_pch.hpp
  288. *
  289. * Revision 1.1  2004/02/12 14:57:45  rsmith
  290. * initial checkin. Moved from gui/config/test
  291. *
  292. * Revision 1.8  2004/02/02 18:44:18  rsmith
  293. * add description to CSettingsSet, constructor and descendants.
  294. *
  295. * Revision 1.7  2003/12/30 15:01:07  dicuccio
  296. * Fixed compiler warnings on MSVC
  297. *
  298. * Revision 1.6  2003/12/29 14:40:57  rsmith
  299. * Add array utility methods. Get returns string not const string&.
  300. * Get always throws on failure, does not return special values.
  301. *
  302. * Revision 1.5  2003/11/21 12:49:12  rsmith
  303. * Add ability to delete values by key.
  304. *
  305. * Revision 1.4  2003/10/28 19:02:17  dicuccio
  306. * Changed ctor parameter for config cache from CRef<> to raw pointer
  307. *
  308. * Revision 1.3  2003/10/24 14:39:39  rsmith
  309. * Add more doxygen comments.
  310. *
  311. * Revision 1.2  2003/10/17 19:42:54  rsmith
  312. * make an abstract interface for factory defaults, and hence store them as a pointer in CSettingsSet.
  313. *
  314. * Revision 1.1  2003/10/10 17:43:42  rsmith
  315. * moved from gui/core to gui/config
  316. *
  317. * Revision 1.1  2003/09/26 18:15:31  rsmith
  318. * plugin configration data and dialog
  319. *
  320. *
  321. * ===========================================================================
  322. */