[Libreoffice-commits] core.git: Branch 'libreoffice-5-0' - sc/inc sc/source

Mike Kaganski mikekaganski at hotmail.com
Thu Jun 11 13:03:20 PDT 2015


 sc/inc/externalrefmgr.hxx                |    7 ++++++
 sc/inc/formulacell.hxx                   |    3 ++
 sc/source/core/data/formulacell.cxx      |   18 +++++++++++----
 sc/source/ui/docshell/externalrefmgr.cxx |   35 ++++++++++++++++++++++++++++++-
 4 files changed, 57 insertions(+), 6 deletions(-)

New commits:
commit bc00e475d45c0e0cf44dc46c67308c152a2b3f70
Author: Mike Kaganski <mikekaganski at hotmail.com>
Date:   Thu Jun 4 06:47:38 2015 +1000

    tdf#89972: also copy external reference status
    
    fixes regression from commit 4467c67dc8bf17c67c70985c0d0ea64636884f9f,
    where the new optimized code path failed to properly register
    ScFormulaCell with ScExternalRefManager.
    Introduces a new public method in ScExternalRefManager: insertRefCellAsTmpl
    that registers a formula cell to listen to the same external references
    as template cell
    Introduces new property to ScFormulaCell: mbIsExtRef
    that indicates that some external references are referenced by this cell
    
    Change-Id: Iee07d7b51949fd31953b5fa662a213052eb85181
    Reviewed-on: https://gerrit.libreoffice.org/16066
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
    Tested-by: Michael Meeks <michael.meeks at collabora.com>
    (cherry picked from commit 17282387d650e843e0f5a28611d91597ccd09970)
    Reviewed-on: https://gerrit.libreoffice.org/16219
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/sc/inc/externalrefmgr.hxx b/sc/inc/externalrefmgr.hxx
index 9af6eef..1105136 100644
--- a/sc/inc/externalrefmgr.hxx
+++ b/sc/inc/externalrefmgr.hxx
@@ -701,6 +701,12 @@ public:
     bool containsUnsavedReferences() const { return !maUnsavedDocShells.empty(); }
 
     void insertRefCell(sal_uInt16 nFileId, const ScAddress& rCell);
+    /**
+     * Add a cell to reference the same files as the template cell.
+     */
+    void insertRefCellFromTemplate( ScFormulaCell* pTemplateCell, ScFormulaCell* pCell );
+
+    bool hasCellExternalReference(const ScAddress& rCell);
 
     void enableDocTimer( bool bEnable );
 
@@ -790,6 +796,7 @@ private:
      */
     void transformUnsavedRefToSavedRef( SfxObjectShell* pShell );
 
+    void insertRefCell(RefCellMap::iterator& itr, ScFormulaCell* pCell);
 private:
     ScDocument* mpDoc;
 
diff --git a/sc/inc/formulacell.hxx b/sc/inc/formulacell.hxx
index 8e84e00..66f4c9b 100644
--- a/sc/inc/formulacell.hxx
+++ b/sc/inc/formulacell.hxx
@@ -143,6 +143,7 @@ private:
     bool            bNeedListening : 1; // Listeners need to be re-established after UpdateReference
     bool            mbNeedsNumberFormat : 1; // set the calculated number format as hard number format
     bool            mbPostponedDirty : 1;   // if cell needs to be set dirty later
+    bool            mbIsExtRef       : 1; // has references in ScExternalRefManager; never cleared after set
 
                     enum ScInterpretTailParameter
                     {
@@ -426,6 +427,8 @@ public:
     void SyncSharedCode();
 
     bool IsPostponedDirty() const { return mbPostponedDirty;}
+
+    void SetIsExtRef() { mbIsExtRef = true; }
 };
 
 #endif
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 85b0f83..4af29d6 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -608,6 +608,7 @@ ScFormulaCell::ScFormulaCell( ScDocument* pDoc, const ScAddress& rPos ) :
     bNeedListening(false),
     mbNeedsNumberFormat(false),
     mbPostponedDirty(false),
+    mbIsExtRef(false),
     aPos(rPos)
 {
     SAL_INFO( "sc.core.formulacell", "ScFormulaCell ctor this " << this);
@@ -638,7 +639,8 @@ ScFormulaCell::ScFormulaCell( ScDocument* pDoc, const ScAddress& rPos,
     bNeedListening( false ),
     mbNeedsNumberFormat( false ),
     mbPostponedDirty(false),
-    aPos( rPos )
+    mbIsExtRef(false),
+    aPos(rPos)
 {
     SAL_INFO( "sc.core.formulacell", "ScFormulaCell ctor this " << this);
 
@@ -672,7 +674,8 @@ ScFormulaCell::ScFormulaCell(
     bNeedListening( false ),
     mbNeedsNumberFormat( false ),
     mbPostponedDirty(false),
-    aPos( rPos )
+    mbIsExtRef(false),
+    aPos(rPos)
 {
     SAL_INFO( "sc.core.formulacell", "ScFormulaCell ctor this " << this);
     assert(pArray); // Never pass a NULL pointer here.
@@ -721,7 +724,8 @@ ScFormulaCell::ScFormulaCell(
     bNeedListening( false ),
     mbNeedsNumberFormat( false ),
     mbPostponedDirty(false),
-    aPos( rPos )
+    mbIsExtRef(false),
+    aPos(rPos)
 {
     SAL_INFO( "sc.core.formulacell", "ScFormulaCell ctor this " << this);
 
@@ -770,7 +774,8 @@ ScFormulaCell::ScFormulaCell(
     bNeedListening( false ),
     mbNeedsNumberFormat( false ),
     mbPostponedDirty(false),
-    aPos( rPos )
+    mbIsExtRef(false),
+    aPos(rPos)
 {
     SAL_INFO( "sc.core.formulacell", "ScFormulaCell ctor this " << this);
 
@@ -801,7 +806,8 @@ ScFormulaCell::ScFormulaCell( const ScFormulaCell& rCell, ScDocument& rDoc, cons
     bNeedListening( false ),
     mbNeedsNumberFormat( false ),
     mbPostponedDirty(false),
-    aPos( rPos )
+    mbIsExtRef(false),
+    aPos(rPos)
 {
     SAL_INFO( "sc.core.formulacell", "ScFormulaCell ctor this " << this);
 
@@ -1296,6 +1302,8 @@ void ScFormulaCell::CompileXML( sc::CompileFormulaContext& rCxt, ScProgress& rPr
 
                 bSkipCompile = true;
                 pCode = pPreviousCell->pCode;
+                if (pPreviousCell->mbIsExtRef)
+                    pDocument->GetExternalRefManager()->insertRefCellFromTemplate( pPreviousCell, this );
 
                 SAL_INFO( "sc", "merged '" << aFormula << "' == '" << aShouldBe
                           << "'extend group to " << xGroup->mnLength );
diff --git a/sc/source/ui/docshell/externalrefmgr.cxx b/sc/source/ui/docshell/externalrefmgr.cxx
index 36dc18d..8bb9e7d 100644
--- a/sc/source/ui/docshell/externalrefmgr.cxx
+++ b/sc/source/ui/docshell/externalrefmgr.cxx
@@ -2043,6 +2043,15 @@ void ScExternalRefManager::refreshAllRefCells(sal_uInt16 nFileId)
     pVShell->PaintGrid();
 }
 
+void ScExternalRefManager::insertRefCell(RefCellMap::iterator& itr, ScFormulaCell* pCell)
+{
+    if (pCell)
+    {
+        itr->second.insert(pCell);
+        pCell->SetIsExtRef();
+    }
+}
+
 void ScExternalRefManager::insertRefCell(sal_uInt16 nFileId, const ScAddress& rCell)
 {
     RefCellMap::iterator itr = maRefCells.find(nFileId);
@@ -2058,9 +2067,33 @@ void ScExternalRefManager::insertRefCell(sal_uInt16 nFileId, const ScAddress& rC
         itr = r.first;
     }
 
+    insertRefCell(itr, mpDoc->GetFormulaCell(rCell));
+}
+
+void ScExternalRefManager::insertRefCellFromTemplate( ScFormulaCell* pTemplateCell, ScFormulaCell* pCell )
+{
+    if (!pTemplateCell || !pCell)
+        return;
+
+    for (RefCellMap::iterator itr = maRefCells.begin(); itr != maRefCells.end(); ++itr)
+    {
+        if (itr->second.find(pTemplateCell) != itr->second.end())
+            insertRefCell(itr, pCell);
+    }
+}
+
+bool ScExternalRefManager::hasCellExternalReference(const ScAddress& rCell)
+{
     ScFormulaCell* pCell = mpDoc->GetFormulaCell(rCell);
+
     if (pCell)
-        itr->second.insert(pCell);
+      for (RefCellMap::iterator itr = maRefCells.begin(); itr != maRefCells.end(); ++itr)
+      {
+          if (itr->second.find(pCell) != itr->second.end())
+              return true;
+      }
+
+    return false;
 }
 
 void ScExternalRefManager::enableDocTimer( bool bEnable )


More information about the Libreoffice-commits mailing list