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

Markus Mohrhard markus.mohrhard at googlemail.com
Wed Oct 30 23:13:52 CET 2013


 sc/inc/column.hxx               |    5 +++--
 sc/source/core/data/column.cxx  |   12 +++++++-----
 sc/source/core/data/column2.cxx |    9 +++++----
 sc/source/core/data/column3.cxx |    8 +++++---
 sc/source/core/data/table1.cxx  |    3 ++-
 sc/source/ui/docshell/impex.cxx |    8 ++++----
 sc/source/ui/inc/impex.hxx      |    2 +-
 7 files changed, 27 insertions(+), 20 deletions(-)

New commits:
commit 7504b3dd8ca4424fd7da91195741b566ce42a2c0
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Wed Oct 30 22:57:45 2013 +0100

    extend the position hint to GetRangeScriptType
    
    brings a bit more performance benefits. Still not as much as I expected.
    
    Change-Id: I1abead8694acdd965520a9353e84824a68672988

diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 61af67c..3ee53d6 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -470,7 +470,8 @@ public:
      * Get combined script types of the specified range. This method may
      * update script types on demand if they have not been determined.
      */
-    sal_uInt8 GetRangeScriptType( sc::CellTextAttrStoreType::iterator& itPos, SCROW nRow1, SCROW nRow2 );
+    sal_uInt8 GetRangeScriptType( sc::CellTextAttrStoreType::iterator& itPos, SCROW nRow1, SCROW nRow2,
+            sc::CellStoreType::iterator itr);
 
     void SetScriptType( SCROW nRow, sal_uInt8 nType );
 
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index 63433c5..018f9e1 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -2952,10 +2952,12 @@ class FindEditCellsHandler
 {
     ScColumn& mrColumn;
     sc::CellTextAttrStoreType::iterator miAttrPos;
+    sc::CellStoreType::iterator miCellPos;
 
 public:
-    FindEditCellsHandler(ScColumn& rColumn, sc::CellTextAttrStoreType& rAttrs) :
-        mrColumn(rColumn), miAttrPos(rAttrs.begin()) {}
+    FindEditCellsHandler(ScColumn& rColumn, sc::CellTextAttrStoreType& rAttrs,
+            sc::CellStoreType::iterator rCellItr) :
+        mrColumn(rColumn), miAttrPos(rAttrs.begin()), miCellPos(rCellItr) {}
 
     bool operator() (size_t, const EditTextObject*)
     {
@@ -2964,7 +2966,7 @@ public:
 
     bool operator() (size_t nRow, const ScFormulaCell* p)
     {
-        sal_uInt8 nScriptType = mrColumn.GetRangeScriptType(miAttrPos, nRow, nRow);
+        sal_uInt8 nScriptType = mrColumn.GetRangeScriptType(miAttrPos, nRow, nRow, miCellPos);
         if (IsAmbiguousScriptNonZero(nScriptType))
             return true;
 
@@ -2981,7 +2983,7 @@ public:
         for (size_t i = 0; i < nDataSize; ++i)
         {
             SCROW nRow = nTopRow + i;
-            sal_uInt8 nScriptType = mrColumn.GetRangeScriptType(miAttrPos, nRow, nRow);
+            sal_uInt8 nScriptType = mrColumn.GetRangeScriptType(miAttrPos, nRow, nRow, miCellPos);
             if (IsAmbiguousScriptNonZero(nScriptType))
                 // Return the offset from the first row.
                 return RetType(i, true);
@@ -3216,7 +3218,7 @@ bool ScColumn::HasEditCells(SCROW nStartRow, SCROW nEndRow, SCROW& rFirst)
 {
     //  used in GetOptimalHeight - ambiguous script type counts as edit cell
 
-    FindEditCellsHandler aFunc(*this, maCellTextAttrs);
+    FindEditCellsHandler aFunc(*this, maCellTextAttrs, maCells.begin());
     std::pair<sc::CellStoreType::const_iterator,size_t> aPos =
         sc::FindFormulaEditText(maCells, nStartRow, nEndRow, aFunc);
 
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 207718c..5176d82 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -874,11 +874,12 @@ void ScColumn::GetOptimalHeight(
                     //  check for cells with different script type
                     sc::CellTextAttrStoreType::iterator itAttr = maCellTextAttrs.begin();
                     sc::SingleColumnSpanSet::SpansType::const_iterator it = aSpans.begin(), itEnd = aSpans.end();
+                    sc::CellStoreType::iterator itCells = maCells.begin();
                     for (; it != itEnd; ++it)
                     {
                         for (SCROW nRow = it->mnRow1; nRow <= it->mnRow2; ++nRow)
                         {
-                            sal_uInt8 nScript = GetRangeScriptType(itAttr, nRow, nRow);
+                            sal_uInt8 nScript = GetRangeScriptType(itAttr, nRow, nRow, itCells);
                             if (nScript == nDefScript)
                                 continue;
 
@@ -2038,7 +2039,7 @@ sal_uInt8 ScColumn::GetScriptType( SCROW nRow ) const
 }
 
 sal_uInt8 ScColumn::GetRangeScriptType(
-    sc::CellTextAttrStoreType::iterator& itPos, SCROW nRow1, SCROW nRow2 )
+    sc::CellTextAttrStoreType::iterator& itPos, SCROW nRow1, SCROW nRow2, sc::CellStoreType::iterator itrCells )
 {
     if (!ValidRow(nRow1) || !ValidRow(nRow2) || nRow1 > nRow2)
         return 0;
@@ -2056,14 +2057,13 @@ sal_uInt8 ScColumn::GetRangeScriptType(
         sc::celltextattr_block::iterator it = sc::celltextattr_block::begin(*itPos->data);
         sc::celltextattr_block::iterator itEnd = sc::celltextattr_block::end(*itPos->data);
         std::advance(it, aRet.second);
-        sc::CellStoreType::iterator itr = maCells.position(nRow).first;
         for (; it != itEnd; ++it, ++nRow)
         {
             if (nRow > nRow2)
                 return nScriptType;
 
             sc::CellTextAttr& rVal = *it;
-            if (UpdateScriptType(rVal, nRow, itr))
+            if (UpdateScriptType(rVal, nRow, itrCells))
                 bUpdated = true;
             nScriptType |= rVal.mnScriptType;
         }
@@ -2074,7 +2074,6 @@ sal_uInt8 ScColumn::GetRangeScriptType(
         nRow += itPos->size - aRet.second;
     }
 
-    sc::CellStoreType::iterator itr = maCells.position(nRow).first;
     while (nRow <= nRow2)
     {
         ++itPos;
@@ -2096,7 +2095,7 @@ sal_uInt8 ScColumn::GetRangeScriptType(
                 return nScriptType;
 
             sc::CellTextAttr& rVal = *it;
-            if (UpdateScriptType(rVal, nRow, itr))
+            if (UpdateScriptType(rVal, nRow, itrCells))
                 bUpdated = true;
 
             nScriptType |= rVal.mnScriptType;
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index ee1ed95..ca8a07c 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -2129,7 +2129,8 @@ sal_uInt8 ScTable::GetRangeScriptType(
     if (!ValidCol(nCol))
         return 0;
 
-    return aCol[nCol].GetRangeScriptType(rBlockPos.miCellTextAttrPos, nRow1, nRow2);
+    sc::CellStoreType::iterator itr = aCol[nCol].maCells.begin();
+    return aCol[nCol].GetRangeScriptType(rBlockPos.miCellTextAttrPos, nRow1, nRow2, itr);
 }
 
 size_t ScTable::GetFormulaHash( SCCOL nCol, SCROW nRow ) const
commit 89d7363b0029458cb924169f3b0d207a29916fd0
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Wed Oct 30 22:56:41 2013 +0100

    don't update row height for csv import, fdo#69009
    
    Multiline cells are already updated and we can skip the other cells.
    
    Change-Id: I6690beeaad01543c12cb42247baec6fbc18aaa77

diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx
index df74149..025737f 100644
--- a/sc/source/ui/docshell/impex.cxx
+++ b/sc/source/ui/docshell/impex.cxx
@@ -234,9 +234,9 @@ bool ScImportExport::StartPaste()
 // Nachbereitung Insert: Undo/Redo-Aktionen erzeugen, Invalidate/Repaint
 
 
-void ScImportExport::EndPaste()
+void ScImportExport::EndPaste(bool bAutoRowHeight)
 {
-    bool bHeight = pDocSh && pDocSh->AdjustRowHeight(
+    bool bHeight = bAutoRowHeight && pDocSh && pDocSh->AdjustRowHeight(
                     aRange.aStart.Row(), aRange.aEnd.Row(), aRange.aStart.Tab() );
 
     if( pUndoDoc && pDoc->IsUndoEnabled() )
@@ -1470,7 +1470,7 @@ bool ScImportExport::ExtText2Doc( SvStream& rStrm )
             nRow = nStartRow;
             if (!StartPaste())
             {
-                EndPaste();
+                EndPaste(false);
                 return false;
             }
         }
@@ -1481,7 +1481,7 @@ bool ScImportExport::ExtText2Doc( SvStream& rStrm )
 
     xProgress.reset();    // make room for AdjustRowHeight progress
     if (bRangeIsDetermined)
-        EndPaste();
+        EndPaste(false);
 
     return true;
 }
diff --git a/sc/source/ui/inc/impex.hxx b/sc/source/ui/inc/impex.hxx
index 0535c94..4356154 100644
--- a/sc/source/ui/inc/impex.hxx
+++ b/sc/source/ui/inc/impex.hxx
@@ -70,7 +70,7 @@ class ScImportExport
     ScAsciiOptions* pExtOptions;        // extended options
 
     bool StartPaste();                  // Protect check, set up Undo
-    void EndPaste();                    // Undo/Redo actions, Repaint
+    void EndPaste(bool bAutoRowHeight = true);                    // Undo/Redo actions, Repaint
     bool Doc2Text( SvStream& );
     bool Text2Doc( SvStream& );
     bool Doc2Sylk( SvStream& );
commit e7f3330c98d83282f957513941fd7b5a7b9c00b7
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Wed Oct 30 00:50:45 2013 +0100

    use positional hint for UpdateScript, fdo#69006
    
    Change-Id: Ie1bdc905e869d56625440e2a52d48993fa2fda9d

diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 44ddf38..61af67c 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -544,7 +544,7 @@ private:
     void ActivateNewFormulaCell( const sc::CellStoreType::iterator& itPos, SCROW nRow, ScFormulaCell& rCell, bool bJoin = true );
     void ActivateNewFormulaCell( const sc::CellStoreType::position_type& aPos, ScFormulaCell& rCell, bool bJoin = true );
     void BroadcastNewCell( SCROW nRow );
-    bool UpdateScriptType( sc::CellTextAttr& rAttr, SCROW nRow );
+    bool UpdateScriptType( sc::CellTextAttr& rAttr, SCROW nRow, sc::CellStoreType::iterator& itr );
 
     const ScFormulaCell* FetchFormulaCell( SCROW nRow ) const;
 
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index c7b8f26..207718c 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -2056,13 +2056,14 @@ sal_uInt8 ScColumn::GetRangeScriptType(
         sc::celltextattr_block::iterator it = sc::celltextattr_block::begin(*itPos->data);
         sc::celltextattr_block::iterator itEnd = sc::celltextattr_block::end(*itPos->data);
         std::advance(it, aRet.second);
+        sc::CellStoreType::iterator itr = maCells.position(nRow).first;
         for (; it != itEnd; ++it, ++nRow)
         {
             if (nRow > nRow2)
                 return nScriptType;
 
             sc::CellTextAttr& rVal = *it;
-            if (UpdateScriptType(rVal, nRow))
+            if (UpdateScriptType(rVal, nRow, itr))
                 bUpdated = true;
             nScriptType |= rVal.mnScriptType;
         }
@@ -2073,6 +2074,7 @@ sal_uInt8 ScColumn::GetRangeScriptType(
         nRow += itPos->size - aRet.second;
     }
 
+    sc::CellStoreType::iterator itr = maCells.position(nRow).first;
     while (nRow <= nRow2)
     {
         ++itPos;
@@ -2094,7 +2096,7 @@ sal_uInt8 ScColumn::GetRangeScriptType(
                 return nScriptType;
 
             sc::CellTextAttr& rVal = *it;
-            if (UpdateScriptType(rVal, nRow))
+            if (UpdateScriptType(rVal, nRow, itr))
                 bUpdated = true;
 
             nScriptType |= rVal.mnScriptType;
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index e1cb2a1..685a8df 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -430,7 +430,7 @@ void ScColumn::BroadcastNewCell( SCROW nRow )
     Broadcast(nRow);
 }
 
-bool ScColumn::UpdateScriptType( sc::CellTextAttr& rAttr, SCROW nRow )
+bool ScColumn::UpdateScriptType( sc::CellTextAttr& rAttr, SCROW nRow, sc::CellStoreType::iterator& itr )
 {
     if (rAttr.mnScriptType != SC_SCRIPTTYPE_UNKNOWN)
         // Already updated. Nothing to do.
@@ -442,9 +442,11 @@ bool ScColumn::UpdateScriptType( sc::CellTextAttr& rAttr, SCROW nRow )
     if (!pPattern)
         return false;
 
-    ScRefCellValue aCell;
+    sc::CellStoreType::position_type pos = maCells.position(itr, nRow);
+    itr = pos.first;
+    size_t nOffset = pos.second;
+    ScRefCellValue aCell = GetCellValue( itr, nOffset );
     ScAddress aPos(nCol, nRow, nTab);
-    aCell.assign(*pDocument, aPos);
 
     const SfxItemSet* pCondSet = NULL;
     ScConditionalFormatList* pCFList = pDocument->GetCondFormList(nTab);


More information about the Libreoffice-commits mailing list