From cb468f0c4804030032970f163134679ea98ce9c3 Mon Sep 17 00:00:00 2001
From: Magne Sjaastad <magne.sjaastad@ceetronsolutions.com>
Date: Mon, 7 Nov 2016 15:57:21 +0100
Subject: [PATCH] #908 Replace file summary case with Eclipse summary case when
 grid is imported

---
 .../Application/RiaApplication.cpp            | 71 ++++++++++++++++---
 .../Summary/RimGridSummaryCase.h              |  2 +-
 .../Summary/RimSummaryCaseCollection.cpp      | 66 +++++++++++++++--
 .../Summary/RimSummaryCaseCollection.h        |  8 +++
 4 files changed, 130 insertions(+), 17 deletions(-)

diff --git a/ApplicationCode/Application/RiaApplication.cpp b/ApplicationCode/Application/RiaApplication.cpp
index 77bc686b9c..0396cf71c3 100644
--- a/ApplicationCode/Application/RiaApplication.cpp
+++ b/ApplicationCode/Application/RiaApplication.cpp
@@ -60,6 +60,8 @@
 #include "RimScriptCollection.h"
 #include "RimSummaryCase.h"
 #include "RimSummaryCaseCollection.h"
+#include "RimSummaryCurve.h"
+#include "RimSummaryCurveFilter.h"
 #include "RimSummaryPlot.h"
 #include "RimSummaryPlotCollection.h"
 #include "RimViewLinker.h"
@@ -848,20 +850,69 @@ bool RiaApplication::openEclipseCase(const QString& caseName, const QString& cas
                 m_mainPlotWindow->hide();
             }
 
-            RimSummaryCase* newSumCase = sumCaseColl->createAndAddSummaryCaseFromEclipseResultCase(rimResultReservoir);
-            if (newSumCase)
+            if (!sumCaseColl->findSummaryCaseFromEclipseResultCase(rimResultReservoir))
             {
-                newSumCase->loadCase();
+                RimSummaryCase* newSumCase = sumCaseColl->createAndAddSummaryCaseFromEclipseResultCase(rimResultReservoir);
 
-                if (m_preferences->autoCreatePlotsOnImport())
+                if (newSumCase)
                 {
-                    RimMainPlotCollection* mainPlotColl = m_project->mainPlotCollection();
-                    RimSummaryPlotCollection* summaryPlotColl = mainPlotColl->summaryPlotCollection();
-                
-                    RicNewSummaryPlotFeature::createNewSummaryPlot(summaryPlotColl, newSumCase);
-                }
+                    newSumCase->loadCase();
 
-                sumCaseColl->updateConnectedEditors();
+                    RimSummaryCase* existingFileSummaryCase = sumCaseColl->findSummaryCaseFromFileName(newSumCase->summaryHeaderFilename());
+                    if (existingFileSummaryCase)
+                    {
+                        // Replace all occurrences of file sum with ecl sum
+
+                        std::vector<caf::PdmObjectHandle*> referringObjects;
+                        existingFileSummaryCase->objectsWithReferringPtrFields(referringObjects);
+
+                        std::set<RimSummaryCurveFilter*> curveFilters;
+
+                        for (caf::PdmObjectHandle* objHandle : referringObjects)
+                        {
+                            RimSummaryCurve* summaryCurve = dynamic_cast<RimSummaryCurve*>(objHandle);
+                            if (summaryCurve)
+                            {
+                                summaryCurve->setSummaryCase(newSumCase);
+                                summaryCurve->updateConnectedEditors();
+
+                                RimSummaryCurveFilter* parentFilter = nullptr;
+                                summaryCurve->firstAncestorOrThisOfType(parentFilter);
+                                if (parentFilter)
+                                {
+                                    curveFilters.insert(parentFilter);
+                                }
+                            }
+                        }
+
+                        // UI settings of a curve filter is updated based
+                        // on the new case association for the curves in the curve filter
+                        // UI is updated by loadDataAndUpdate()
+
+                        for (RimSummaryCurveFilter* curveFilter : curveFilters)
+                        {
+                            curveFilter->loadDataAndUpdate();
+                            curveFilter->updateConnectedEditors();
+                        }
+
+                        sumCaseColl->deleteCase(existingFileSummaryCase);
+
+                        delete existingFileSummaryCase;
+
+                    }
+                    else
+                    {
+                        if (m_preferences->autoCreatePlotsOnImport())
+                        {
+                            RimMainPlotCollection* mainPlotColl = m_project->mainPlotCollection();
+                            RimSummaryPlotCollection* summaryPlotColl = mainPlotColl->summaryPlotCollection();
+                
+                            RicNewSummaryPlotFeature::createNewSummaryPlot(summaryPlotColl, newSumCase);
+                        }
+                    }
+
+                    sumCaseColl->updateConnectedEditors();
+                }
             }
         }
     }
diff --git a/ApplicationCode/ProjectDataModel/Summary/RimGridSummaryCase.h b/ApplicationCode/ProjectDataModel/Summary/RimGridSummaryCase.h
index 113f1a607c..9f978dc4eb 100644
--- a/ApplicationCode/ProjectDataModel/Summary/RimGridSummaryCase.h
+++ b/ApplicationCode/ProjectDataModel/Summary/RimGridSummaryCase.h
@@ -37,7 +37,7 @@ public:
     void                            setAssociatedEclipseCase(RimEclipseCase* eclipseCase);
     RimEclipseCase*                 associatedEclipseCase();
 
-    virtual QString                 summaryHeaderFilename() const  override;
+    virtual QString                 summaryHeaderFilename() const override;
     virtual QString                 caseName() const override;
 
 private:
diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp
index eab3eb0f82..e545de047a 100644
--- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp
+++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp
@@ -16,14 +16,16 @@
 //
 /////////////////////////////////////////////////////////////////////////////////
 #include "RimSummaryCaseCollection.h"
-#include "RimSummaryCase.h"
+
+#include "RifEclipseSummaryTools.h"
+#include "RimEclipseResultCase.h"
+#include "RimFileSummaryCase.h"
+#include "RimGridSummaryCase.h"
 #include "RimOilField.h"
 #include "RimProject.h"
-#include "RimEclipseResultCase.h"
-#include "RimGridSummaryCase.h"
-#include "RifEclipseSummaryTools.h"
+#include "RimSummaryCase.h"
+
 #include <QDir>
-#include "RimFileSummaryCase.h"
 
 
 CAF_PDM_SOURCE_INIT(RimSummaryCaseCollection,"SummaryCaseCollection");
@@ -88,10 +90,62 @@ void RimSummaryCaseCollection::createSummaryCasesFromRelevantEclipseResultCases(
                 }
             }
         }
-
     }
 }
 
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+RimSummaryCase* RimSummaryCaseCollection::findSummaryCaseFromEclipseResultCase(RimEclipseResultCase* eclipseResultCase) const
+{
+    for (RimSummaryCase* summaryCase : m_cases)
+    {
+        RimGridSummaryCase* gridSummaryCase = dynamic_cast<RimGridSummaryCase*>(summaryCase);
+        if (gridSummaryCase)
+        {
+            if (gridSummaryCase->associatedEclipseCase()->gridFileName() == eclipseResultCase->gridFileName())
+            {
+                return gridSummaryCase;
+            }
+        }
+    }
+
+    return nullptr;
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+RimSummaryCase* RimSummaryCaseCollection::findSummaryCaseFromFileName(const QString& fileName) const
+{
+    // Use QFileInfo object to compare two file names to avoid mix of / and \\
+
+    QFileInfo incomingFileInfo(fileName);
+
+    for (RimSummaryCase* summaryCase : m_cases)
+    {
+        RimFileSummaryCase* fileSummaryCase = dynamic_cast<RimFileSummaryCase*>(summaryCase);
+        if (fileSummaryCase)
+        {
+            QFileInfo summaryFileInfo(fileSummaryCase->summaryHeaderFilename());
+            if (incomingFileInfo == summaryFileInfo)
+            {
+                return fileSummaryCase;
+            }
+        }
+    }
+
+    return nullptr;
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+void RimSummaryCaseCollection::deleteCase(RimSummaryCase* summaryCase)
+{
+    m_cases.removeChildObject(summaryCase);
+}
+
 //--------------------------------------------------------------------------------------------------
 /// 
 //--------------------------------------------------------------------------------------------------
diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h
index 676a59713b..5eaaa731a1 100644
--- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h
+++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h
@@ -36,11 +36,19 @@ public:
     void                createSummaryCasesFromRelevantEclipseResultCases();
     RimSummaryCase*     createAndAddSummaryCaseFromEclipseResultCase(RimEclipseResultCase* eclResCase);
     RimSummaryCase*     createAndAddSummaryCaseFromFileName(const QString& fileName);
+    
+    RimSummaryCase*     findSummaryCaseFromEclipseResultCase(RimEclipseResultCase* eclResCase) const;
+    RimSummaryCase*     findSummaryCaseFromFileName(const QString& fileName) const;
+
+    void                deleteCase(RimSummaryCase* summaryCase);
+
 
     void                loadAllSummaryCaseData();
 
     QString             uniqueShortNameForCase(RimSummaryCase* summaryCase);
 
+private:
+
 private:
     caf::PdmChildArrayField<RimSummaryCase*> m_cases;
 };