[Libreoffice-commits] core.git: 8 commits - sc/inc sc/source

Eike Rathke erack at redhat.com
Wed Sep 2 16:48:05 PDT 2015


 sc/inc/dbdata.hxx                |    6 ++
 sc/inc/document.hxx              |    1 
 sc/inc/rangelst.hxx              |    1 
 sc/source/core/data/documen3.cxx |    6 ++
 sc/source/core/tool/dbdata.cxx   |   82 ++++++++++++++++++++++++++++++++-------
 sc/source/core/tool/rangelst.cxx |    9 ++++
 sc/source/ui/docshell/docsh.cxx  |   18 ++++++++
 sc/source/ui/inc/docsh.hxx       |    6 ++
 8 files changed, 115 insertions(+), 14 deletions(-)

New commits:
commit bf1498a15b1c3105f5ab38896f6d98c3f1729be9
Author: Eike Rathke <erack at redhat.com>
Date:   Thu Sep 3 00:27:35 2015 +0200

    introduce ScRangeList::Join(const ScRangeList&)

diff --git a/sc/inc/rangelst.hxx b/sc/inc/rangelst.hxx
index 062e618..6a9e81c 100644
--- a/sc/inc/rangelst.hxx
+++ b/sc/inc/rangelst.hxx
@@ -48,6 +48,7 @@ public:
                             sal_Unicode cDelimiter = 0 ) const;
 
     void            Join( const ScRange&, bool bIsInList = false );
+    void            Join( const ScRangeList& );
 
     bool            UpdateReference( UpdateRefMode, ScDocument*,
                                      const ScRange& rWhere,
diff --git a/sc/source/core/tool/rangelst.cxx b/sc/source/core/tool/rangelst.cxx
index d4bc70e..9243a34 100644
--- a/sc/source/core/tool/rangelst.cxx
+++ b/sc/source/core/tool/rangelst.cxx
@@ -349,6 +349,15 @@ void ScRangeList::Join( const ScRange& r, bool bIsInList )
         Append( r );
 }
 
+void ScRangeList::Join( const ScRangeList& r )
+{
+    if (this == &r)
+        return;
+
+    for (auto const& it : r.maRanges)
+        Join( *it );
+}
+
 bool ScRangeList::operator==( const ScRangeList& r ) const
 {
     if ( this == &r )
commit f0744793c85f6305201f5122d5a4376eb6df9ae6
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Sep 2 20:52:15 2015 +0200

    comment a nice-to-have idea
    
    Change-Id: If03dba2fa7394ec898cb6d87e06bc85171319fcd

diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index 560ba3e..84dff20 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -3069,6 +3069,10 @@ ScDocShellModificator::~ScDocShellModificator()
     ScDocument& rDoc = rDocShell.GetDocument();
     if (!maContentModified.empty() && !rDoc.IsImportingXML())
     {
+        /* TODO: it would be nice to join a pending list with the next
+         * instance further down in the stack so that only the last one
+         * popped actually does the work. For that we'd need a parent or keep a
+         * master list at ScDocShell. */
         for (size_t i=0, n = maContentModified.size(); i < n; ++i)
         {
             const ScRange* p = maContentModified[i];
commit 0347ba13460fdd33ca77efa53457ee66651f189b
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Sep 2 20:29:35 2015 +0200

    TableRef: use ScRangeList instead of vector for Join()
    
    ... so adjacent areas result in one call to RefreshTableColumnNames().
    
    Change-Id: I1c42a37cbe9630b66504654fec021e39f0c0e67c

diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index 5acd5b4..560ba3e 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -3067,10 +3067,14 @@ ScDocShellModificator::ScDocShellModificator( ScDocShell& rDS )
 ScDocShellModificator::~ScDocShellModificator()
 {
     ScDocument& rDoc = rDocShell.GetDocument();
-    if (!mvContentModified.empty() && !rDoc.IsImportingXML())
+    if (!maContentModified.empty() && !rDoc.IsImportingXML())
     {
-        for (auto const& it : mvContentModified)
-            rDoc.RefreshTableColumnNames( it);
+        for (size_t i=0, n = maContentModified.size(); i < n; ++i)
+        {
+            const ScRange* p = maContentModified[i];
+            if (p)
+                rDoc.RefreshTableColumnNames( *p);
+        }
     }
     rDoc.SetAutoCalcShellDisabled( bAutoCalcShellDisabled );
     if ( !bAutoCalcShellDisabled && rDocShell.IsDocumentModifiedPending() )
@@ -3100,7 +3104,7 @@ void ScDocShellModificator::SetDocumentModified()
 
 void ScDocShellModificator::AppendCellContentModified( const ScRange& rRange )
 {
-    mvContentModified.push_back( rRange);
+    maContentModified.Join( rRange);
 }
 
 bool ScDocShell::IsChangeRecording() const
diff --git a/sc/source/ui/inc/docsh.hxx b/sc/source/ui/inc/docsh.hxx
index 7aab3ff..3c4c7d9 100644
--- a/sc/source/ui/inc/docsh.hxx
+++ b/sc/source/ui/inc/docsh.hxx
@@ -453,7 +453,7 @@ typedef tools::SvRef<ScDocShell> ScDocShellRef;
  */
 class SC_DLLPUBLIC ScDocShellModificator
 {
-    ::std::vector<ScRange>  mvContentModified;
+            ScRangeList     maContentModified;
             ScDocShell&     rDocShell;
     boost::scoped_ptr<ScRefreshTimerProtector> mpProtector;
             bool            bAutoCalcShellDisabled;
commit 034b1b724aeed9ae02990354caa2a402a13386c0
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Sep 2 20:22:44 2015 +0200

    TableRef: ensure column name vector has the minimum needed size
    
    ... otherwise refresh completely.
    
    Change-Id: I51b2a87a1c61a0ceef0424192f3b3e9cef24174b

diff --git a/sc/source/core/tool/dbdata.cxx b/sc/source/core/tool/dbdata.cxx
index 156a2fd..d6e2a52 100644
--- a/sc/source/core/tool/dbdata.cxx
+++ b/sc/source/core/tool/dbdata.cxx
@@ -744,7 +744,8 @@ void ScDBData::RefreshTableColumnNames( ScDocument* pDoc, const ScRange& rRange
     if (!aIntersection.IsValid())
         return;
 
-    if (maTableColumnNames.empty())
+    if (maTableColumnNames.empty() ||
+            maTableColumnNames.size() < static_cast<size_t>(aIntersection.aEnd.Col() - nStartCol + 1))
     {
         RefreshTableColumnNames( pDoc);
         return;
commit e716e43c3ba2397ddcea8659981e9ebdadda639b
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Sep 2 19:57:16 2015 +0200

    TableRef: factor out and reuse SetTableColumnName()
    
    Change-Id: Ie18530e3fd9d7028a0f36646c56b6ff4375e6b2d

diff --git a/sc/source/core/tool/dbdata.cxx b/sc/source/core/tool/dbdata.cxx
index 82ee2c6..156a2fd 100644
--- a/sc/source/core/tool/dbdata.cxx
+++ b/sc/source/core/tool/dbdata.cxx
@@ -643,6 +643,23 @@ public:
 private:
     OUString maSearchName;
 };
+
+/** Set a numbered table column name at given nIndex, preventing duplicates,
+    numbering starting at nCount. No check whether nIndex is valid. */
+void SetTableColumnName( ::std::vector<OUString>& rVec, size_t nIndex, const OUString& rName, sal_Int32 nCount )
+{
+    do
+    {
+        OUString aStr( rName + OUString::number( nCount));
+        auto it( ::std::find_if( rVec.begin(), rVec.end(), TableColumnNameSearch( aStr)));
+        if (it == rVec.end())
+        {
+            rVec[nIndex] = aStr;
+            break;  // do while
+        }
+        ++nCount;
+    } while(true);
+}
 }
 
 void ScDBData::RefreshTableColumnNames( ScDocument* pDoc )
@@ -708,20 +725,7 @@ void ScDBData::RefreshTableColumnNames( ScDocument* pDoc )
         for (size_t i=0, n=aNewNames.size(); i < n; ++i)
         {
             if (aNewNames[i].isEmpty())
-            {
-                size_t nCount = i+1;
-                do
-                {
-                    OUString aStr( aColumn + OUString::number( nCount));
-                    auto it( ::std::find_if( aNewNames.begin(), aNewNames.end(), TableColumnNameSearch( aStr)));
-                    if (it == aNewNames.end())
-                    {
-                        aNewNames[i] = aStr;
-                        break;  // do while
-                    }
-                    ++nCount;
-                } while(true);
-            }
+                SetTableColumnName( aNewNames, i, aColumn, i+1);
         }
     }
 
@@ -760,6 +764,13 @@ void ScDBData::RefreshTableColumnNames( ScDocument* pDoc, const ScRange& rRange
             const OUString& rStr = pCell->getString( pDoc);
             if (!rStr.isEmpty())
                 maTableColumnNames[nCol-nStartCol] = rStr;
+            else
+            {
+                // Usually this is called for only a few positions of which
+                // most are not empty, so init from resource only if necessary.
+                OUString aColumn( ScGlobal::GetRscString(STR_COLUMN));
+                SetTableColumnName( maTableColumnNames, nCol-nStartCol, aColumn, nCol-nStartCol+1);
+            }
         }
     }
 }
commit b2e5de0b998fac091452190d0386b1d998900399
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Sep 2 19:50:34 2015 +0200

    replace for with while
    
    'i' was unused now..
    
    Change-Id: I1ee7c5af75d049b0dfec6d3a17d730503c71ffc6

diff --git a/sc/source/core/tool/dbdata.cxx b/sc/source/core/tool/dbdata.cxx
index cf86a1e..82ee2c6 100644
--- a/sc/source/core/tool/dbdata.cxx
+++ b/sc/source/core/tool/dbdata.cxx
@@ -753,7 +753,7 @@ void ScDBData::RefreshTableColumnNames( ScDocument* pDoc, const ScRange& rRange
     ScRefCellValue* pCell;
     SCCOL nCol;
     SCROW nRow;
-    for (size_t i=0; (pCell = aIter.GetNext( nCol, nRow)) != nullptr; ++i)
+    while((pCell = aIter.GetNext( nCol, nRow)) != nullptr)
     {
         if (pCell->hasString())
         {
commit 834eddc8f75fa73b36f3ab5804104829809d8949
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Sep 2 19:31:29 2015 +0200

    TableRef: add RefreshTableColumnNames() from range
    
    Change-Id: I32a47e306469aec5fe366a6621129e14b0d49c13

diff --git a/sc/inc/dbdata.hxx b/sc/inc/dbdata.hxx
index efe0d2f..22ccc329 100644
--- a/sc/inc/dbdata.hxx
+++ b/sc/inc/dbdata.hxx
@@ -125,6 +125,10 @@ public:
     /** Refresh/update the column names with the header row's cell contents. */
     SC_DLLPUBLIC void RefreshTableColumnNames( ScDocument* pDoc );
 
+    /** Refresh/update the column names with the header row's cell contents
+        within the given range. */
+    void RefreshTableColumnNames( ScDocument* pDoc, const ScRange& rRange );
+
     /** Finds the column named rName and returns the corresponding offset
         within the table.
         @returns -1 if not found.
@@ -283,6 +287,8 @@ public:
     ScDBData* GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2);
     ScDBData* GetDBNearCursor(SCCOL nCol, SCROW nRow, SCTAB nTab );
 
+    void RefreshTableColumnNames( const ScRange& rRange );
+
     void    DeleteOnTab( SCTAB nTab );
     void    UpdateReference(UpdateRefMode eUpdateRefMode,
                                 SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 9ea6729..c19bc6f 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -570,6 +570,7 @@ public:
     ScDBData* GetDBAtCursor(SCCOL nCol, SCROW nRow, SCTAB nTab, ScDBDataPortion ePortion);
     const ScDBData* GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2) const;
     ScDBData* GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2);
+    void RefreshTableColumnNames( const ScRange& rRange );
 
     SC_DLLPUBLIC const ScRangeData* GetRangeAtBlock( const ScRange& rBlock, OUString* pName=NULL ) const;
 
diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx
index 32791da..53dff92 100644
--- a/sc/source/core/data/documen3.cxx
+++ b/sc/source/core/data/documen3.cxx
@@ -313,6 +313,12 @@ ScDBData* ScDocument::GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nC
         return NULL;
 }
 
+void ScDocument::RefreshTableColumnNames( const ScRange& rRange )
+{
+    if (pDBCollection)
+        pDBCollection->RefreshTableColumnNames( rRange);
+}
+
 bool ScDocument::HasPivotTable() const
 {
     return pDPCollection && pDPCollection->GetCount();
diff --git a/sc/source/core/tool/dbdata.cxx b/sc/source/core/tool/dbdata.cxx
index 825e6ca..cf86a1e 100644
--- a/sc/source/core/tool/dbdata.cxx
+++ b/sc/source/core/tool/dbdata.cxx
@@ -728,6 +728,42 @@ void ScDBData::RefreshTableColumnNames( ScDocument* pDoc )
     aNewNames.swap( maTableColumnNames);
 }
 
+void ScDBData::RefreshTableColumnNames( ScDocument* pDoc, const ScRange& rRange )
+{
+    if (!HasHeader())
+        return;
+
+    ScRange aRange( ScAddress::UNINITIALIZED);
+    GetArea( aRange);
+    aRange.aEnd.SetRow( aRange.aStart.Row());
+    ScRange aIntersection( aRange.Intersection( rRange));
+    if (!aIntersection.IsValid())
+        return;
+
+    if (maTableColumnNames.empty())
+    {
+        RefreshTableColumnNames( pDoc);
+        return;
+    }
+
+    // Update column names from cells in intersecting header range, but don't
+    // set names to empty string.
+    ScHorizontalCellIterator aIter( pDoc, nTable,
+            aIntersection.aStart.Col(), nStartRow, aIntersection.aEnd.Col(), nStartRow);
+    ScRefCellValue* pCell;
+    SCCOL nCol;
+    SCROW nRow;
+    for (size_t i=0; (pCell = aIter.GetNext( nCol, nRow)) != nullptr; ++i)
+    {
+        if (pCell->hasString())
+        {
+            const OUString& rStr = pCell->getString( pDoc);
+            if (!rStr.isEmpty())
+                maTableColumnNames[nCol-nStartCol] = rStr;
+        }
+    }
+}
+
 sal_Int32 ScDBData::GetColumnNameOffset( const OUString& rName ) const
 {
     if (maTableColumnNames.empty())
@@ -1173,6 +1209,12 @@ ScDBData* ScDBCollection::GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCO
     return NULL;
 }
 
+void ScDBCollection::RefreshTableColumnNames( const ScRange& rRange )
+{
+    for (auto const& it : maNamedDBs)
+        it->RefreshTableColumnNames( pDoc, rRange);
+}
+
 void ScDBCollection::DeleteOnTab( SCTAB nTab )
 {
     FindByTable func(nTab);
diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index db72e8e..5acd5b4 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -3067,6 +3067,11 @@ ScDocShellModificator::ScDocShellModificator( ScDocShell& rDS )
 ScDocShellModificator::~ScDocShellModificator()
 {
     ScDocument& rDoc = rDocShell.GetDocument();
+    if (!mvContentModified.empty() && !rDoc.IsImportingXML())
+    {
+        for (auto const& it : mvContentModified)
+            rDoc.RefreshTableColumnNames( it);
+    }
     rDoc.SetAutoCalcShellDisabled( bAutoCalcShellDisabled );
     if ( !bAutoCalcShellDisabled && rDocShell.IsDocumentModifiedPending() )
         rDocShell.SetDocumentModified();    // last one shuts off the lights
commit 1cb61611c2308df86bf9acfafe25faff624dad26
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Sep 2 17:23:41 2015 +0200

    add ScDocShellModificator::AppendCellContentModified()
    
    ... e.g. for future ScDBData column names update.
    
    Change-Id: I893b494c50a278022d3ea4fa73230dfdc3d468b1

diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index c9c6b70..db72e8e 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -3093,6 +3093,11 @@ void ScDocShellModificator::SetDocumentModified()
     }
 }
 
+void ScDocShellModificator::AppendCellContentModified( const ScRange& rRange )
+{
+    mvContentModified.push_back( rRange);
+}
+
 bool ScDocShell::IsChangeRecording() const
 {
     ScChangeTrack* pChangeTrack = aDocument.GetChangeTrack();
diff --git a/sc/source/ui/inc/docsh.hxx b/sc/source/ui/inc/docsh.hxx
index ce1d312..7aab3ff 100644
--- a/sc/source/ui/inc/docsh.hxx
+++ b/sc/source/ui/inc/docsh.hxx
@@ -453,6 +453,7 @@ typedef tools::SvRef<ScDocShell> ScDocShellRef;
  */
 class SC_DLLPUBLIC ScDocShellModificator
 {
+    ::std::vector<ScRange>  mvContentModified;
             ScDocShell&     rDocShell;
     boost::scoped_ptr<ScRefreshTimerProtector> mpProtector;
             bool            bAutoCalcShellDisabled;
@@ -465,6 +466,11 @@ public:
                             ScDocShellModificator( ScDocShell& );
                             ~ScDocShellModificator();
             void            SetDocumentModified();
+
+            /** Append a cell position/range to the list of modified cell
+                contents. Used in dtor to call maintenance on data structures
+                that depend on cell content. */
+            void            AppendCellContentModified( const ScRange& rRange );
 };
 
 //#i97876# Spreadsheet data changes are not notified


More information about the Libreoffice-commits mailing list