![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /****************************************************************************** 00002 ** Copyright (c) 2011 MAK Technologies, Inc. 00003 ** All rights reserved. 00004 ******************************************************************************/ 00007 00008 #pragma once 00009 #include <boost/unordered_map.hpp> 00010 #include <vrvUtil/DtUnicode.h> 00011 #include <vrvCore/vrvCore.h> 00012 #include <vrvUtil/DtVirtualBaseClass.h> 00013 #include <vrvUtil/DtSignalConnectionManager.h> 00014 #include <vrvCore/DtVisualizerAttribute.h> 00015 #include <vrvCore/DtElementDefinitionSettings.h> 00016 #include <vrvCore/DtRecordSettingsBackup.h> 00017 00018 #include <makArchives/DtElementsRecord.h> 00019 00020 #include <boost/signal.hpp> 00021 00022 namespace makArchives 00023 { 00024 class DtElementDefinitionRecord; 00025 class DtElementsRecord; 00026 00027 namespace oldRecords 00028 { 00029 class DtElementDefinition; 00030 class DtElementDefinitionHierarchy; 00031 class DtElementDefinitionNode; 00032 class DtVisualAttributeInterface; 00033 }; 00034 } 00035 00036 namespace makVrv 00037 { 00038 class DtDe; 00039 class DtBaseConnection; 00040 class DtElementDefinitionNew; 00041 class DtDeSettings; 00042 00047 class DT_DLL_VRVCORE DtElementDefinitionManager 00048 { 00049 public: 00051 typedef boost::unordered_map<DtUnicode,DtElementDefinitionNew*> 00052 DefinitionMap; 00053 00055 typedef std::vector<const DtElementDefinitionNew*> ElementDefinitions; 00056 00058 static const DtElementDefinitionManager* createConstCopy( 00059 const DtElementDefinitionManager& orig); 00060 00062 ~DtElementDefinitionManager(); 00063 00066 const std::string& name() const; 00067 00070 const DtUnicode& screenName() const; 00071 00073 unsigned int numberOfElementDefinitions() const; 00074 00078 const DefinitionMap& elementDefinitions() const; 00079 00082 DtElementDefinitionNew* findElementDefinition( 00083 const DtUnicode& definitionName); 00084 00087 const DtElementDefinitionNew* findElementDefinition( 00088 const DtUnicode& definitionName) const; 00089 00092 DtElementDefinitionNew* createElementDefinition( 00093 const DtUnicode& definitionName); 00094 00098 DtElementDefinitionNew* createElementDefinition( 00099 const DtUnicode& definitionName, 00100 DtElementDefinitionNew* parentDefinition); 00101 00104 void destroyElementDefinition(DtElementDefinitionNew*); 00105 00107 void destroyElementDefinitionAndChildren(DtElementDefinitionNew*); 00108 00113 DtElementDefinitionNew* copyElementDefinition(DtElementDefinitionNew& def, 00114 const DtUnicode& newName); 00115 00117 DtBackupInterface* backup(); 00118 00123 bool renameElementDefinition(const DtUnicode& oldName, 00124 const DtUnicode& newName); 00125 00127 void loadDefaults(); 00128 00130 void loadDefaults(bool loadOnlyFactory); 00131 00133 void revertSettings(); 00134 00136 virtual void saveAsDefaults(); 00137 00139 virtual void exportSettings(const std::string& fileName); 00140 00145 virtual void importSettings(const std::string& fileName, 00146 ElementDefinitions& addedDefinitions, 00147 ElementDefinitions& skippedDefinitions); 00148 00150 virtual void importSettings(const std::string& fileName); 00151 00156 virtual void mergeSettings(const std::string& fileName, 00157 ElementDefinitions& addedDefinitions, 00158 ElementDefinitions& skippedDefinitions); 00159 00161 virtual DtDeSettings* settings(); 00162 00164 virtual void setFromRecord(const makArchives::DtElementsRecord& rec); 00165 00170 virtual void setFromRecord(const makArchives::DtElementsRecord& rec, 00171 ElementDefinitions& addedDefinitions, 00172 ElementDefinitions& skippedDefinitions); 00173 00176 virtual void mergeRecord( 00177 const makArchives::DtElementsRecord& rec, 00178 ElementDefinitions& addedDefinitions, 00179 ElementDefinitions& skippedDefinitions); 00180 00182 virtual void getRecord(makArchives::DtElementsRecord& rec); 00183 00185 virtual void setAutoSave(bool enabled); 00186 00187 protected: 00188 00189 friend class DtElementDefinitionTypeManager; 00190 00192 DtElementDefinitionManager(const std::string& name, 00193 const DtUnicode& screenName, DtDe& de, bool procedural); 00194 00196 DtElementDefinitionManager(const DtElementDefinitionManager& rhs); 00197 00199 void registerDefinitionHierarchy(DtElementDefinitionNew* root); 00200 00202 static DtVisualizerAttribute* attributeFromOldRecord( 00203 const makArchives::oldRecords::DtVisualAttributeInterface* attributeRecord); 00204 00208 void setFromOldRecord( 00209 const makArchives::oldRecords::DtElementDefinitionHierarchy& oldRe, 00210 ElementDefinitions& addedDefinitions, 00211 ElementDefinitions& skippedDefinitions); 00212 00218 void loadOldDefinitionNode(DtElementDefinitionNew* parent, 00219 const makArchives::oldRecords::DtElementDefinitionNode& oldDef, 00220 ElementDefinitions& addedDefinitions, 00221 ElementDefinitions& skippedDefinitions); 00222 00225 void buildDefinitionSetsFromOldRecord(DtElementDefinitionNew& newElem, 00226 const makArchives::oldRecords::DtElementDefinition& oldElem); 00227 00229 typedef std::vector<const makArchives::DtElementDefinitionRecord*> ElementGroup; 00230 00234 typedef std::map<DtUnicode, ElementGroup> ParentToElementsMap; 00235 00237 virtual void buildElementVisualizers(DtElementDefinitionNew& ed, 00238 const makArchives::DtElementDefinitionRecord& rec); 00239 00242 virtual void buildElementChildren( 00243 DtElementDefinitionNew& ed, ParentToElementsMap& parentToElementsMap, 00244 ElementDefinitions& addedDefinitions, 00245 ElementDefinitions& skippedDefinitions); 00246 00249 static makArchives::DtElementDefinitionRecord buildElementDefinitionRecord( 00250 DtElementDefinitionNew& elementDef); 00251 00254 virtual void registerBackup(); 00255 00256 virtual bool recordMatchesDefinition( 00257 const makArchives::DtElementDefinitionRecord* childRec, 00258 const DtElementDefinitionNew* existingChildDef) const; 00259 00260 protected: 00261 typedef DtRecordSettingsBackup<DtElementDefinitionManager, makArchives::DtElementsRecord> 00262 ElementDefinitionsBackup; 00263 00264 std::string myName; 00265 DtUnicode myScreenName; 00266 00267 DtDe* myOptionalDe; 00268 DefinitionMap myDefinitions; 00269 bool myProceduralFlag; 00270 bool myAutoSave; 00271 00272 ElementDefinitionsBackup* myBackup; 00273 }; 00274 00278 class DT_DLL_VRVCORE DtElementDefinitionTypeManager : 00279 public DtVirtualBaseClass 00280 { 00281 public: 00282 00284 typedef unsigned int ElementDefinitionType; 00285 00288 enum BuiltInElementTypes 00289 { 00290 Entity, 00291 TacticalGraphics, 00292 Interaction, 00293 Aggregate, 00294 Intervisibility, 00295 BuiltInElementTypes_End, 00296 }; 00297 00302 static DtElementDefinitionTypeManager& instance(DtDe& de); 00303 00306 static DtElementDefinitionTypeManager& instance(DtBaseConnection& con); 00307 00310 static void copyInstance(DtBaseConnection& con, DtDe&); 00311 00313 static const DtElementDefinitionTypeManager* createConstCopy(DtDe& de); 00314 00316 virtual ~DtElementDefinitionTypeManager(); 00317 00328 void registerElementType(ElementDefinitionType type, 00329 const std::string& name, const DtUnicode& typeScreenName, 00330 bool proceduralOnly); 00331 00334 DtElementDefinitionManager* findElementManager(ElementDefinitionType type); 00335 00338 DtElementDefinitionManager& elementManager(ElementDefinitionType type); 00339 00343 const DtElementDefinitionManager& elementManager( 00344 ElementDefinitionType type) const; 00345 00347 void loadDefaults(); 00348 00349 protected: 00350 00352 template <typename ManagerClass> 00353 friend ManagerClass& defaultManagerInstanceFunction(DtDe&,bool); 00354 00356 template <typename ManagerClass> 00357 friend void defaultManagerRegisterInstanceFunction(DtDe&, ManagerClass*); 00358 00360 DtElementDefinitionTypeManager(); 00361 00363 DtElementDefinitionTypeManager(DtDe&); 00364 00366 DtElementDefinitionTypeManager(const DtElementDefinitionTypeManager&); 00367 00368 protected: 00369 00370 typedef boost::unordered_map<unsigned int, DtElementDefinitionManager*> 00371 ManagerMap; 00372 00373 DtDe* myOptionalDe; 00374 DtSignalConnectionManager myConnections; 00375 ManagerMap myManagers; 00376 }; 00377 00381 class DT_DLL_VRVCORE DtElementDefinitionSignaler : public DtVirtualBaseClass 00382 { 00383 public: 00385 static DtElementDefinitionSignaler& instance(DtDe&); 00386 00388 virtual ~DtElementDefinitionSignaler(); 00389 00390 //Signals. 00391 boost::signal<void (const DtUnicode& oldName, const DtUnicode& newName)> 00392 signal_elementRenamed; 00393 00394 protected: 00396 DtElementDefinitionSignaler(); 00397 }; 00398 }