![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /***************************************************************************** 00002 * Copyright (c) 2012 MAK Technologies, Inc. 00003 * All rights reserved. 00004 *****************************************************************************/ 00005 00009 00010 #pragma once 00011 00012 #include <vrvUtil/vrvUtil.h> 00013 00014 #include <vrvCore/DtSettingsBackup.h> 00015 #include <vrvCore/DtReadSettingsLock.h> 00016 #include <vrvCore/DtWriteSettingsLock.h> 00017 #include <vrvCore/DtRecordSettingsBackup.h> 00018 00019 #include <vrvUtil/DtSignalConnectionManager.h> 00020 #include <vrvUtil/DtVirtualBaseClass.h> 00021 00022 namespace makVrv 00023 { 00024 00033 template <typename RecordType> 00034 class DtCommonBaseSettingsManager : public DtVirtualBaseClass 00035 { 00036 public: 00037 00042 DtCommonBaseSettingsManager( DtDe& de, const std::string& name, 00043 const std::string& displayName, const std::string& ext ) 00044 : myName( name ) 00045 , myExtension( ext ) 00046 , myDisplayName( displayName ) 00047 , myUseDefaultSettingsRecordFlag( false ) 00048 , myAutoSaveFlag( true ) 00049 , mySettingsBackup( 0 ) 00050 , myDe( de ) 00051 { 00052 // Create the settings object 00053 DtDeSettingsManager::instance( myDe ).createSettings( name, ext ); 00054 } 00055 00057 virtual ~DtCommonBaseSettingsManager() 00058 { 00059 } 00060 00064 virtual void autoSaveIfNecessary() 00065 { 00066 if ( autoSave() ) 00067 { 00068 saveDefaultSettings(); 00069 } 00070 } 00071 00074 virtual void setAutoSave( bool doit ) 00075 { 00076 myAutoSaveFlag = doit; 00077 } 00078 00081 virtual bool autoSave() const 00082 { 00083 return myAutoSaveFlag; 00084 } 00085 00090 virtual void setUseDefaultSettingsRecord( bool useit ) 00091 { 00092 myUseDefaultSettingsRecordFlag = useit; 00093 } 00094 00099 virtual bool useDefaultSettingsRecord() const 00100 { 00101 return myUseDefaultSettingsRecordFlag; 00102 } 00103 00106 virtual DtDeSettings* settings() 00107 { 00108 DtDeSettings* deSettings = 00109 DtDeSettingsManager::instance(myDe).findSettings( myName ); 00110 if ( ! deSettings ) 00111 { 00112 DtTHROW_NEW( DtCorruptedState, "DtDeSettings have gone missing!" ); 00113 } 00114 return deSettings; 00115 } 00116 00119 virtual const DtDeSettings* settings() const 00120 { 00121 DtDeSettings* deSettings = 00122 DtDeSettingsManager::instance(myDe).findSettings( myName ); 00123 if ( ! deSettings ) 00124 { 00125 DtTHROW_NEW( DtCorruptedState, "DtDeSettings have gone missing!" ); 00126 } 00127 return deSettings; 00128 } 00129 00131 virtual DtSettingsBackup* settingsBackup() 00132 { 00133 return mySettingsBackup; 00134 } 00135 00137 virtual const DtSettingsBackup* settingsBackup() const 00138 { 00139 return mySettingsBackup; 00140 } 00141 00144 00149 virtual void loadDefaults() 00150 { 00151 // Disable auto saving and store state. 00152 bool autoSaved = autoSave(); 00153 setAutoSave( false ); 00154 00155 // Either set from the default record (if present) or load defaults. 00156 RecordType record; 00157 if ( myUseDefaultSettingsRecordFlag && 00158 myDe.deInitializer().findDefaultSettingsRecord(myName,record) ) 00159 { 00160 setFromRecord( record ); 00161 } 00162 else 00163 { 00164 loadDefaultSettings( false ); 00165 } 00166 00167 // Restore the auto save state. 00168 setAutoSave( autoSaved ); 00169 00170 // Initialize the settings backup. 00171 initializeBackup(); 00172 } 00173 00175 virtual void initializeBackup() = 0; 00176 00178 virtual void saveDefaultSettings() 00179 { 00180 RecordType record; 00181 getRecord( record ); 00182 settings()->writeDefaultRecord( record ); 00183 } 00184 00188 virtual void loadDefaultSettings( bool loadOnlyFactorySettings ) 00189 { 00190 DtDeSettings* deSettings = settings(); 00191 RecordType record; 00192 if ( loadOnlyFactorySettings ) 00193 { 00194 if ( deSettings->readFactoryDefaultRecord(record) ) 00195 { 00196 setFromRecord( record ); 00197 } 00198 } 00199 else 00200 { 00201 if ( deSettings->readDefaultRecord(record) ) 00202 { 00203 setFromRecord( record ); 00204 } 00205 } 00206 } 00207 00209 virtual void importSettings( const std::string& filePath ) 00210 { 00211 RecordType record; 00212 if ( settings()->readRecordFrom(record,filePath) ) 00213 { 00214 setFromRecord( record ); 00215 autoSaveIfNecessary(); 00216 } 00217 } 00218 00220 virtual void exportSettings( const std::string& filePath ) const 00221 { 00222 RecordType record; 00223 getRecord( record ); 00224 settings()->writeRecordTo( record, filePath ); 00225 } 00226 00228 virtual void setFromRecord( const RecordType& record ) = 0; 00229 00231 virtual void getRecord( RecordType& record ) const = 0; 00232 00234 00235 protected: 00236 00237 DtSignalConnectionManager myConnections; 00238 00239 std::string myName; 00240 std::string myExtension; 00241 std::string myDisplayName; 00242 00243 bool myUseDefaultSettingsRecordFlag; 00244 bool myAutoSaveFlag; 00245 00246 DtSettingsBackup* mySettingsBackup; 00247 00248 DtDe& myDe; 00249 00250 }; 00251 00252 00260 template <typename RecordType> 00261 class DtBaseSettingsManager : public DtCommonBaseSettingsManager<RecordType> 00262 { 00263 protected: 00264 00266 typedef DtRecordSettingsBackup<DtBaseSettingsManager<RecordType>,RecordType> RecordBackupType; 00267 00268 public: 00269 00272 DtBaseSettingsManager( DtDe& de, const std::string& name, 00273 const std::string& displayName, const std::string& ext ) 00274 : DtCommonBaseSettingsManager<RecordType>( de, name, displayName, ext ) 00275 { 00276 } 00277 00279 virtual ~DtBaseSettingsManager() 00280 { 00281 DtDELETE( this->mySettingsBackup ); 00282 } 00283 00286 00288 virtual void initializeBackup() 00289 { 00290 DtDELETE( this->mySettingsBackup ); 00291 this->mySettingsBackup = new RecordBackupType( this->myDe, this, this->myName, this->myDisplayName ); 00292 this->mySettingsBackup->setFactoryFile( this->settings()->factoryFilePath() ); 00293 DtSettingsBackupManager::instance(this->myDe).registerSettingsBackup( this->mySettingsBackup ); 00294 this->mySettingsBackup->backup(); 00295 } 00296 00298 virtual void setFromRecord( const RecordType& record ) = 0; 00299 00301 virtual void getRecord( RecordType& record ) const = 0; 00302 00304 00305 }; 00306 00307 00321 template <typename RecordType,typename SettingsType> 00322 class DtBaseSharedSettingsManager : public DtCommonBaseSettingsManager<RecordType> 00323 { 00324 protected: 00325 00327 typedef DtSharedRecordSettingsBackup<SettingsType,RecordType> SharedRecordBackupType; 00328 00329 public: 00330 00333 DtBaseSharedSettingsManager( DtDe& de, const std::string& name, 00334 const std::string& displayName, const std::string& ext ) 00335 : DtCommonBaseSettingsManager<RecordType>( de, name, displayName, ext ) 00336 { 00337 } 00338 00340 virtual ~DtBaseSharedSettingsManager() 00341 { 00342 // Don't delete the settings backup (it's owned by the settings object). 00343 } 00344 00347 00349 virtual void initializeBackup() 00350 { 00351 DtWriteSettingsLock<SettingsType> 00352 writeSettings( DtSharedSettingsManager::instance(this->myDe) ); 00353 this->mySettingsBackup = writeSettings->settingsBackup(); 00354 this->mySettingsBackup->setFactoryFile( this->settings()->factoryFilePath() ); 00355 DtSettingsBackupManager::instance(this->myDe).registerSettingsBackup( this->mySettingsBackup ); 00356 writeSettings->backup(); 00357 } 00358 00360 virtual void setFromRecord( const RecordType& record ) 00361 { 00362 DtWriteSettingsLock<SettingsType> 00363 settings( DtSharedSettingsManager::instance(this->myDe) ); 00364 settings->setFromRecord( record ); 00365 } 00366 00368 virtual void getRecord( RecordType& record ) const 00369 { 00370 DtReadSettingsLock<SettingsType> 00371 settings( DtSharedSettingsManager::instance(this->myDe) ); 00372 settings->getRecord( record ); 00373 } 00374 00376 00377 }; 00378 00379 }