![]() |
VR-Forces 4.0.4 Class Documentation
|
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)