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

Eike Rathke erack at redhat.com
Thu Jun 15 13:49:41 UTC 2017


 sc/inc/attarray.hxx              |    7 +++++++
 sc/source/core/data/attarray.cxx |    7 +++++++
 sc/source/core/data/column4.cxx  |   23 ++++++++++++++++++-----
 3 files changed, 32 insertions(+), 5 deletions(-)

New commits:
commit d48ea7a1db4eaae0bae094f2155dcd3bc87720eb
Author: Eike Rathke <erack at redhat.com>
Date:   Thu Jun 15 15:15:52 2017 +0200

    Prevent excess rows included in the resulting range list, tdf#95883 follow-up
    
    Change-Id: Id2fdffa4d7bba8225ea5fcf583a562467342ad3d
    Reviewed-on: https://gerrit.libreoffice.org/38728
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/sc/inc/attarray.hxx b/sc/inc/attarray.hxx
index bfa224cbc791..7504610f6a06 100644
--- a/sc/inc/attarray.hxx
+++ b/sc/inc/attarray.hxx
@@ -122,7 +122,14 @@ public:
     bool    Concat(SCSIZE nPos);
 
     const ScPatternAttr* GetPattern( SCROW nRow ) const;
+
+    /** Returns if you search for attributes at nRow the range from rStartRow
+        to rEndRow where that attribute combination (ScPatternAttr) is applied.
+        The next ScPatternAttr different from this one starts at rEndRow+1
+        (if that is <= MAXROW).
+     */
     const ScPatternAttr* GetPatternRange( SCROW& rStartRow, SCROW& rEndRow, SCROW nRow ) const;
+
     void    MergePatternArea( SCROW nStartRow, SCROW nEndRow, ScMergePatternState& rState, bool bDeep ) const;
 
     void    MergeBlockFrame( SvxBoxItem* pLineOuter, SvxBoxInfoItem* pLineInner, ScLineFlags& rFlags,
diff --git a/sc/source/core/data/attarray.cxx b/sc/source/core/data/attarray.cxx
index 28fd7e5681a4..7ef3044ed633 100644
--- a/sc/source/core/data/attarray.cxx
+++ b/sc/source/core/data/attarray.cxx
@@ -211,6 +211,13 @@ bool ScAttrArray::Concat(SCSIZE nPos)
     return bRet;
 }
 
+/*
+ * nCount is the number of runs of different attribute combinations;
+ * no attribute in a column => nCount==1, one attribute somewhere => nCount == 3
+ * (ie. one run with no attribute + one attribute + another run with no attribute)
+ * so a range of identical attributes is only one entry in ScAttrArray.
+ */
+
 bool ScAttrArray::Search( SCROW nRow, SCSIZE& nIndex ) const
 {
     long nHi = static_cast<long>(nCount) - 1;
diff --git a/sc/source/core/data/column4.cxx b/sc/source/core/data/column4.cxx
index 3541c8fced6b..cafe77043671 100644
--- a/sc/source/core/data/column4.cxx
+++ b/sc/source/core/data/column4.cxx
@@ -769,21 +769,34 @@ void ScColumn::GetNotesInRange(SCROW nStartRow, SCROW nEndRow,
     std::for_each(it, ++itEnd, NoteEntryCollector(rNotes, nTab, nCol, nStartRow, nEndRow));
 }
 
-void ScColumn::GetUnprotectedCells(SCROW nStartRow, SCROW nEndRow,
-        ScRangeList& rRangeList ) const
+void ScColumn::GetUnprotectedCells( SCROW nStartRow, SCROW nEndRow, ScRangeList& rRangeList ) const
 {
     SCROW nTmpStartRow = nStartRow, nTmpEndRow = nEndRow;
     const ScPatternAttr* pPattern = pAttrArray->GetPatternRange(nTmpStartRow, nTmpEndRow, nStartRow);
     bool bProtection = static_cast<const ScProtectionAttr&>(pPattern->GetItem(ATTR_PROTECTION)).GetProtection();
-    if(!bProtection)
-        rRangeList.Join(ScRange( nCol, nTmpStartRow, nTab, nCol, nTmpEndRow, nTab));
+    if (!bProtection)
+    {
+        // Limit the span to the range in question.
+        if (nTmpStartRow < nStartRow)
+            nTmpStartRow = nStartRow;
+        if (nTmpEndRow > nEndRow)
+            nTmpEndRow = nEndRow;
+        rRangeList.Join( ScRange( nCol, nTmpStartRow, nTab, nCol, nTmpEndRow, nTab));
+    }
     while (nEndRow > nTmpEndRow)
     {
         nStartRow = nTmpEndRow + 1;
         pPattern = pAttrArray->GetPatternRange(nTmpStartRow, nTmpEndRow, nStartRow);
         bool bTmpProtection = static_cast<const ScProtectionAttr&>(pPattern->GetItem(ATTR_PROTECTION)).GetProtection();
         if (!bTmpProtection)
-            rRangeList.Join(ScRange( nCol, nTmpStartRow, nTab, nCol, nTmpEndRow, nTab));
+        {
+            // Limit the span to the range in question.
+            // Only end row needs to be checked as we enter here only for spans
+            // below the original nStartRow.
+            if (nTmpEndRow > nEndRow)
+                nTmpEndRow = nEndRow;
+            rRangeList.Join( ScRange( nCol, nTmpStartRow, nTab, nCol, nTmpEndRow, nTab));
+        }
     }
 }
 


More information about the Libreoffice-commits mailing list