VR-Forces 4.0.4 Class Documentation
include/vrfGuiCore/DtVrfGuiApplicationSettings.h
Go to the documentation of this file.
00001 /******************************************************************************
00002 ** Copyright (c) 2010 MAK Technologies, Inc.
00003 ** All rights reserved.
00004 ******************************************************************************/
00005 /******************************************************************************
00006 ** $RCSfile: DtVrfGuiApplicationSettings.h,v $ $Revision: 1.8.2.1 $ $State: Exp $
00007 ******************************************************************************/
00008 
00011 
00015 
00016 #pragma once
00017 
00018 #include <vrfGuiCore/vrfGuiCore.h>
00019 
00020 #include <boost/signal.hpp>
00021 #include <boost/function.hpp>
00022 
00023 #include <vrvUtil/DtVirtualBaseClass.h>
00024 
00025 #include <boost/archive/xml_iarchive.hpp>
00026 #include <boost/archive/xml_oarchive.hpp>
00027 #include <boost/serialization/access.hpp>
00028 #include <boost/serialization/nvp.hpp>
00029 #include <boost/serialization/list.hpp>
00030 #include <boost/serialization/map.hpp>
00031 #include <boost/serialization/vector.hpp>
00032 #include <boost/serialization/string.hpp>
00033 
00034 namespace makVrv
00035 {
00036    class DtDe;
00037 }
00038 
00039 namespace makVrf
00040 {
00041    class DT_DLL_VRFGUICORE DtVrfGuiApplicationSetting
00042    {
00043    public:
00044       DtVrfGuiApplicationSetting(makVrv::DtDe* = 0);
00045       DtVrfGuiApplicationSetting(const DtVrfGuiApplicationSetting&);
00046       virtual ~DtVrfGuiApplicationSetting();
00047 
00049       virtual DtVrfGuiApplicationSetting* clone() const = 0;
00050 
00053       virtual std::string classType() const = 0;
00054 
00055       template <typename T> static std::string theClassType()
00056       {
00057          return T().classType();
00058       }
00059 
00060       template <typename T> static DtVrfGuiApplicationSetting* create(makVrv::DtDe& de)
00061       {
00062          return new T(&de);
00063       }
00064 
00066       virtual void write(boost::archive::xml_oarchive& out, const unsigned int) = 0;
00067       virtual void read(boost::archive::xml_iarchive& in, const unsigned int) = 0;
00068 
00070       virtual int dataVersion() { return 1; };
00071 
00072    protected:
00073       friend class boost::serialization::access;
00074 
00078       template<class Archive>
00079          void serialize(Archive & ar, const unsigned int version)
00080       {
00081          if (Archive::is_loading::value)
00082          {
00083             int dVersion = version;
00084 
00085             if (version > 1)
00086             {
00087                *((boost::archive::xml_iarchive*)&ar) >> boost::serialization::make_nvp("version", dVersion);
00088             }
00089 
00090             read(*(boost::archive::xml_iarchive*)&ar, dVersion);
00091          }
00092          else
00093          {
00094             int dVersion = dataVersion();
00095 
00096             *((boost::archive::xml_oarchive*)&ar) << boost::serialization::make_nvp("version", dVersion);
00097             write(*(boost::archive::xml_oarchive*)&ar, dVersion);
00098          }
00099       }
00100 
00101    protected:
00102       makVrv::DtDe* myDe;
00103    };
00104 
00105    typedef DtVrfGuiApplicationSetting* (*DtApplicationSettingCreatorFcn)(makVrv::DtDe&);
00106 
00107    class DT_DLL_VRFGUICORE DtVrfGuiSettingsFactory
00108    {
00109    protected:
00110       typedef std::map<std::string, DtApplicationSettingCreatorFcn> SettingsCreatorMap;
00111 
00112    public:
00113       DtVrfGuiSettingsFactory();
00114       virtual ~DtVrfGuiSettingsFactory();
00115 
00116    public:
00117       static bool addSettingCreator(const std::string& name, DtApplicationSettingCreatorFcn f);
00118       static DtVrfGuiApplicationSetting* createSetting(const std::string& name, makVrv::DtDe&);
00119 
00120    protected:
00121       static std::map<std::string, DtApplicationSettingCreatorFcn>* theSettingsCreators;
00122    };
00123 
00124    #define REGISTER_APPLICATION_SETTING(AppSetting) static bool AppSetting##_Registered = \
00125    DtVrfGuiSettingsFactory::addSettingCreator(DtVrfGuiApplicationSetting::theClassType<AppSetting>(), \
00126       DtVrfGuiApplicationSetting::create<AppSetting>);
00127 
00128    class DT_DLL_VRFGUICORE DtVrfGuiApplicationSettings : public makVrv::DtVirtualBaseClass
00129    {
00130       typedef std::map<std::string, DtVrfGuiApplicationSetting*> VrfGuiSettings;
00131 
00132    public:
00134       DtVrfGuiApplicationSettings( makVrv::DtDe& );
00135       
00137       virtual ~DtVrfGuiApplicationSettings();
00138             
00140       static DtVrfGuiApplicationSettings& instance( makVrv::DtDe& de );
00141    
00142    public:
00143       virtual void loadSettings(const std::string& settingsFile);
00144       virtual void saveSettings();
00145       virtual void saveSettings(const std::string& settingsFile);
00146 
00147    public:
00149       virtual DtVrfGuiApplicationSetting* addSetting(const std::string&, const DtVrfGuiApplicationSetting&);
00150 
00151       virtual DtVrfGuiApplicationSetting* settingFor(const std::string&);
00152 
00154       virtual void removeSetting(const std::string&);
00155 
00156       const VrfGuiSettings& settings() const
00157       {
00158          return mySettings;
00159       }
00160 
00161       void setAutoSave(bool b)
00162       {
00163          myAutoSave = b;
00164       }
00165 
00166       bool autoSave() const
00167       {
00168          return myAutoSave;
00169       }
00170 
00171       virtual void clearSettings();
00172 
00173    protected:
00174       friend class boost::serialization::access;
00175 
00179       template<class Archive>
00180          void serialize(Archive & ar, const unsigned int version)
00181       {
00182          VrfGuiSettings::const_iterator iter = mySettings.begin();
00183          
00184          if (Archive::is_loading::value)
00185          {
00186             int size = 0;
00187             std::string classType;
00188             std::string name;
00189 
00190             ar & BOOST_SERIALIZATION_NVP(size);
00191 
00192             for (int i = 0; i < size; i++)
00193             {
00194                ar & BOOST_SERIALIZATION_NVP(name);
00195                ar & BOOST_SERIALIZATION_NVP(classType);
00196                DtVrfGuiApplicationSetting* iface = DtVrfGuiSettingsFactory::createSetting(classType, myDe);
00197 
00198                if (iface)
00199                {
00200                   DtVrfGuiApplicationSetting& guiSetting = *iface;
00201                   ar & BOOST_SERIALIZATION_NVP(guiSetting);
00202                   mySettings[name] = iface;
00203                }
00204             }
00205 
00206          }
00207          else
00208          {
00209             int size = mySettings.size();
00210             ar & BOOST_SERIALIZATION_NVP(size);
00211             VrfGuiSettings::const_iterator iter = mySettings.begin();
00212 
00213             while (iter != mySettings.end())
00214             {
00215                std::string name = iter->first;
00216 
00217                ar & BOOST_SERIALIZATION_NVP(name);
00218                std::string classType = iter->second->classType();
00219                ar & BOOST_SERIALIZATION_NVP(classType);
00220 
00221                DtVrfGuiApplicationSetting& guiSetting = *iter->second;
00222                ar & BOOST_SERIALIZATION_NVP(guiSetting);
00223 
00224                ++iter;
00225             }
00226          }
00227       }
00228 
00229    protected:
00230       makVrv::DtDe&  myDe;
00231       VrfGuiSettings mySettings;
00232       std::string    mySettingsFile;
00233       bool           myAutoSave;
00234    };
00235 }
00236 
00237 BOOST_CLASS_VERSION(makVrf::DtVrfGuiApplicationSetting,2)

Document ID: Generated on Fri Jun 29 16:33:32 EDT 2012 from SVN revision 116588
Copyright © 2005-2012 VT MÄK Inc. All Rights Reserved (www.mak.com)