diff --git a/ApplicationLibCode/Application/RiaApplication.cpp b/ApplicationLibCode/Application/RiaApplication.cpp index f40f2ae5c6..3cf5c02397 100644 --- a/ApplicationLibCode/Application/RiaApplication.cpp +++ b/ApplicationLibCode/Application/RiaApplication.cpp @@ -461,8 +461,9 @@ bool RiaApplication::loadProject( const QString& projectFileName, ProjectLoadAct return false; } - m_project->fileName = fullPathProjectFileName; + m_project->setFileName( fullPathProjectFileName ); m_project->readFile(); + m_project->updatesAfterProjectFileIsRead(); // Apply any modifications to the loaded project before we go ahead and load actual data if ( projectModifier ) @@ -493,6 +494,11 @@ bool RiaApplication::loadProject( const QString& projectFileName, ProjectLoadAct return true; } + // At this point, all the file paths variables are replaced and all file paths updated to the new location. This will enable use of file + // paths in initAfterRead(). + m_project->resolveReferencesRecursively(); + m_project->initAfterReadRecursively(); + // Migrate all RimGridCases to RimFileSummaryCase RimGridSummaryCase_obsolete::convertGridCasesToSummaryFileCases( m_project.get() ); @@ -802,7 +808,7 @@ bool RiaApplication::saveProjectAs( const QString& fileName, gsl::not_nullfileName = RiaFilePathTools::toInternalSeparator( fileName ); + m_project->setFileName( RiaFilePathTools::toInternalSeparator( fileName ) ); onProjectBeingSaved(); diff --git a/ApplicationLibCode/Commands/ExportCommands/RicExportSelectedWellPathsFeature.cpp b/ApplicationLibCode/Commands/ExportCommands/RicExportSelectedWellPathsFeature.cpp index 6cd44b54af..9c692e92fc 100644 --- a/ApplicationLibCode/Commands/ExportCommands/RicExportSelectedWellPathsFeature.cpp +++ b/ApplicationLibCode/Commands/ExportCommands/RicExportSelectedWellPathsFeature.cpp @@ -113,7 +113,7 @@ void RicExportSelectedWellPathsFeature::writeWellPathGeometryToStream( QTextStre if ( writeProjectInfo ) { - formatter.comment( "Project: " + RimProject::current()->fileName ); + formatter.comment( "Project: " + RimProject::current()->fileName() ); stream << "\n"; } diff --git a/ApplicationLibCode/ProjectDataModel/RimProject.cpp b/ApplicationLibCode/ProjectDataModel/RimProject.cpp index 5b6605f265..bac06037db 100644 --- a/ApplicationLibCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimProject.cpp @@ -283,7 +283,7 @@ void RimProject::close() delete viewLinkerCollection->viewLinker(); viewLinkerCollection->viewLinker = nullptr; - fileName = ""; + setFileName( "" ); m_globalPathList = ""; @@ -303,7 +303,7 @@ void RimProject::close() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimProject::beforeInitAfterRead() +void RimProject::updatesAfterProjectFileIsRead() { distributePathsFromGlobalPathList(); @@ -408,7 +408,7 @@ bool RimProject::writeProjectFile() { transferPathsToGlobalPathList(); - QFile xmlFile( fileName ); + QFile xmlFile( fileName() ); if ( !xmlFile.open( QIODevice::WriteOnly | QIODevice::Text ) ) return false; QString content = documentAsString(); @@ -416,7 +416,7 @@ bool RimProject::writeProjectFile() if ( RiaPreferences::current()->storeBackupOfProjectFiles() ) { - QString backupFilename = fileName + "db"; + QString backupFilename = fileName() + "db"; const int maximumRecordCount = 50; RiaProjectBackupTools::appendTextToDatabase( backupFilename, maximumRecordCount, content ); } @@ -488,9 +488,10 @@ bool RimProject::isProjectFileVersionEqualOrOlderThan( const QString& otherProje void RimProject::setProjectFileNameAndUpdateDependencies( const QString& projectFileName ) { // Extract the filename of the project file when it was saved - QString oldProjectFileName = fileName; + QString oldProjectFileName = fileName(); + // Replace with the new actual filename - fileName = projectFileName; + setFileName( projectFileName ); QFileInfo fileInfo( projectFileName ); QString newProjectPath = fileInfo.path(); diff --git a/ApplicationLibCode/ProjectDataModel/RimProject.h b/ApplicationLibCode/ProjectDataModel/RimProject.h index 97fdc0ef7d..6c4641c481 100644 --- a/ApplicationLibCode/ProjectDataModel/RimProject.h +++ b/ApplicationLibCode/ProjectDataModel/RimProject.h @@ -195,8 +195,9 @@ public: std::vector allFilePaths() const; + void updatesAfterProjectFileIsRead(); + protected: - void beforeInitAfterRead() override; void initAfterRead() override; void setupBeforeSave() override; diff --git a/ApplicationLibCode/UnitTests/RimRelocatePath-Test.cpp b/ApplicationLibCode/UnitTests/RimRelocatePath-Test.cpp index 36a152638a..1ca4fa22c5 100644 --- a/ApplicationLibCode/UnitTests/RimRelocatePath-Test.cpp +++ b/ApplicationLibCode/UnitTests/RimRelocatePath-Test.cpp @@ -59,7 +59,7 @@ TEST( RimRelocatePathTest, findPathsInProjectFile ) RimProject project; - project.fileName = fileName; + project.setFileName( fileName ); project.readFile(); std::vector filePaths; diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmDocument.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmDocument.cpp index 8fe5ecadc8..3dd6db57f1 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmDocument.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmDocument.cpp @@ -48,7 +48,23 @@ CAF_PDM_SOURCE_INIT( PdmDocument, "PdmDocument" ); //-------------------------------------------------------------------------------------------------- PdmDocument::PdmDocument() { - CAF_PDM_InitFieldNoDefault( &fileName, "DocumentFileName", "File Name" ); + CAF_PDM_InitFieldNoDefault( &m_fileName, "DocumentFileName", "File Name" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString PdmDocument::fileName() const +{ + return m_fileName; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void PdmDocument::setFileName( const QString& fileName ) +{ + m_fileName = fileName; } //-------------------------------------------------------------------------------------------------- @@ -56,7 +72,7 @@ PdmDocument::PdmDocument() //-------------------------------------------------------------------------------------------------- void PdmDocument::readFile() { - QFile xmlFile( fileName ); + QFile xmlFile( m_fileName ); if ( !xmlFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) return; readFile( &xmlFile ); @@ -76,19 +92,11 @@ void PdmDocument::readFile( QIODevice* xmlFile ) { if ( !matchesClassKeyword( xmlStream.name().toString() ) ) { - // Error: This is not a Ceetron Pdm based xml document return; } readFields( xmlStream, PdmDefaultObjectFactory::instance(), false ); } } - - // Ask all objects to initialize and set up internal data structures and pointers - // after everything is read from file - - resolveReferencesRecursively(); - beforeInitAfterRead(); - initAfterReadRecursively(); } //-------------------------------------------------------------------------------------------------- @@ -96,7 +104,7 @@ void PdmDocument::readFile( QIODevice* xmlFile ) //-------------------------------------------------------------------------------------------------- bool PdmDocument::writeFile() { - QFile xmlFile( fileName ); + QFile xmlFile( m_fileName ); if ( !xmlFile.open( QIODevice::WriteOnly | QIODevice::Text ) ) return false; writeFile( &xmlFile ); @@ -161,13 +169,6 @@ void PdmDocument::updateUiIconStateRecursively( PdmObjectHandle* object ) } } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void PdmDocument::beforeInitAfterRead() -{ -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmDocument.h b/Fwk/AppFwk/cafProjectDataModel/cafPdmDocument.h index 6451c43c20..a072a8c266 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmDocument.h +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmDocument.h @@ -54,23 +54,24 @@ class PdmDocument : public PdmObject public: PdmDocument(); - PdmField fileName; + QString fileName() const; + void setFileName( const QString& fileName ); void readFile(); bool writeFile(); - QString documentAsString(); - - void readFile( QIODevice* device ); - void writeFile( QIODevice* device ); - static void updateUiIconStateRecursively( PdmObjectHandle* root ); protected: - virtual void beforeInitAfterRead(); + QString documentAsString(); private: void writeDocumentToXmlStream( QXmlStreamWriter& xmlStream ); + void readFile( QIODevice* device ); + void writeFile( QIODevice* device ); + +private: + PdmField m_fileName; }; } // End of namespace caf diff --git a/Fwk/AppFwk/cafProjectDataModel/cafProjectDataModel_UnitTests/cafPdmBasicTest.cpp b/Fwk/AppFwk/cafProjectDataModel/cafProjectDataModel_UnitTests/cafPdmBasicTest.cpp index d128f321af..1e4b245750 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafProjectDataModel_UnitTests/cafPdmBasicTest.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafProjectDataModel_UnitTests/cafPdmBasicTest.cpp @@ -476,6 +476,9 @@ TEST( BaseTest, ReadWrite ) { QString xmlDocumentContentWithErrors; + QString fileName = "PdmTestFil.xml"; + QString fileNameCopy = "PdmTestFil_copy.xml"; + { MyPdmDocument xmlDoc; @@ -524,7 +527,7 @@ TEST( BaseTest, ReadWrite ) xmlDoc.objects.push_back( id2 ); // Write file - xmlDoc.fileName = "PdmTestFil.xml"; + xmlDoc.setFileName( fileName ); xmlDoc.writeFile(); caf::PdmObjectGroup pog; @@ -557,9 +560,14 @@ TEST( BaseTest, ReadWrite ) MyPdmDocument xmlDoc; // Read file - xmlDoc.fileName = "PdmTestFil.xml"; + xmlDoc.setFileName( fileName ); xmlDoc.readFile(); + QFile f( fileNameCopy ); + f.remove(); + + std::rename( fileName.toStdString().data(), fileNameCopy.toStdString().data() ); + caf::PdmObjectGroup pog; for ( size_t i = 0; i < xmlDoc.objects.size(); i++ ) { @@ -578,16 +586,14 @@ TEST( BaseTest, ReadWrite ) EXPECT_EQ( QString( "ÆØÅ Test text end" ), ihDObjs[0]->m_textField() ); // Write file - QFile xmlFile( "PdmTestFil2.xml" ); - xmlFile.open( QIODevice::WriteOnly | QIODevice::Text ); - xmlDoc.writeFile( &xmlFile ); - xmlFile.close(); + xmlDoc.setFileName( fileName ); + xmlDoc.writeFile(); } // Check that the files are identical { - QFile f1( "PdmTestFil.xml" ); - QFile f2( "PdmTestFil2.xml" ); + QFile f1( fileName ); + QFile f2( fileNameCopy ); f1.open( QIODevice::ReadOnly | QIODevice::Text ); f2.open( QIODevice::ReadOnly | QIODevice::Text ); QByteArray ba1 = f1.readAll(); @@ -677,7 +683,7 @@ TEST( BaseTest, ReadWrite ) // Read the document containing errors MyPdmDocument xmlErrorDoc; - xmlErrorDoc.fileName = "PdmTestFilWithError.xml"; + xmlErrorDoc.setFileName( "PdmTestFilWithError.xml" ); xmlErrorDoc.readFile(); caf::PdmObjectGroup pog; diff --git a/Fwk/AppFwk/cafTests/cafTestApplication/MainWindow.cpp b/Fwk/AppFwk/cafTests/cafTestApplication/MainWindow.cpp index 3e0bdee720..c9ea6c4de7 100644 --- a/Fwk/AppFwk/cafTests/cafTestApplication/MainWindow.cpp +++ b/Fwk/AppFwk/cafTests/cafTestApplication/MainWindow.cpp @@ -1612,9 +1612,11 @@ void MainWindow::slotLoadProject() setPdmRoot( nullptr ); releaseTestData(); - m_testRoot = new DemoPdmObjectGroup; - m_testRoot->fileName = fileName; + m_testRoot = new DemoPdmObjectGroup; + m_testRoot->setFileName( fileName ); m_testRoot->readFile(); + m_testRoot->resolveReferencesRecursively(); + m_testRoot->initAfterReadRecursively(); setPdmRoot( m_testRoot ); } @@ -1631,7 +1633,7 @@ void MainWindow::slotSaveProject() "Project Files (*.proj);;All files(*.*)" ); if ( !fileName.isEmpty() ) { - m_testRoot->fileName = fileName; + m_testRoot->setFileName( fileName ); m_testRoot->writeFile(); } }