[Libreoffice-commits] core.git: Branch 'feature/sc-notes-storage' - sc/source

Laurent Godard lgodard.libre at laposte.net
Wed Sep 18 08:24:15 PDT 2013


 sc/source/core/data/column.cxx  |   66 ++++++++++++++++------------------------
 sc/source/core/data/column3.cxx |   39 +++++++++--------------
 2 files changed, 43 insertions(+), 62 deletions(-)

New commits:
commit 7cc10ff6cac7fdac9fcc258cbaaf0fcd8bd890ed
Author: Laurent Godard <lgodard.libre at laposte.net>
Date:   Wed Sep 18 17:22:32 2013 +0200

    refactor copy handlers
    
    - no more segfault in unit test
    - loop on rows is suboptimal
    
    Change-Id: I40ce1babc8e54807545a34bd2719df90088b75c2

diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index 4cdcf9a..3438165 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -1302,33 +1302,24 @@ class CopyToClipHandler
         }
     }
 
-    void duplicateNotes(SCROW nStartRow, size_t nOffset, size_t nDataSize )
+    void duplicateNotes(SCROW nStartRow, size_t nDataSize ) // TODO : notes suboptimal
     {
         sc::CellNoteStoreType maSrcCellNotes = mrSrcCol.GetCellNoteStore();
-        std::vector<ScPostIt*> aNotes;
-        aNotes.reserve(nDataSize);
-        SCROW nRow = nStartRow;
+        SCROW nRowMax = nStartRow + nDataSize;
 
-        sc::CellNoteStoreType::const_iterator itNote = maSrcCellNotes.begin();
-        std::advance(itNote, nOffset);
-        sc::CellNoteStoreType::const_iterator itNoteEnd = itNote;
-        std::advance(itNoteEnd, nDataSize);
-
-        for (; itNote != itNoteEnd; ++itNote, ++nRow)
+        for (SCROW nRow = nStartRow; nRow < nRowMax; ++nRow)
+        {
+            ScPostIt* pSrcNote = maSrcCellNotes.get<ScPostIt*>(nRow);
+            if (pSrcNote)
             {
-                ScPostIt* pSrcNote = maSrcCellNotes.get<ScPostIt*>(nRow);
-                if (pSrcNote)
-                {
-                    ScAddress aDestPos = ScAddress(mrDestCol.GetCol(), nRow, mrDestCol.GetTab());
-                    ScPostIt* pClonedNote = pSrcNote->Clone( ScAddress(mrSrcCol.GetCol(), nRow, mrSrcCol.GetTab() ),
-                                     mrDestCol.GetDoc(),
-                                     aDestPos, true );
-                aNotes.push_back(pClonedNote);
-                }
+                ScAddress aDestPos = ScAddress(mrDestCol.GetCol(), nRow, mrDestCol.GetTab());
+                ScPostIt* pClonedNote = pSrcNote->Clone( ScAddress(mrSrcCol.GetCol(), nRow, mrSrcCol.GetTab() ),
+                                 mrDestCol.GetDoc(),
+                                 aDestPos, true );
+                mrDestCol.GetDoc().ReleaseNote(aDestPos);
+                mrDestCol.GetDoc().SetNote(aDestPos, pClonedNote);
             }
-
-        maDestPos.miCellNotePos = mrDestCol.GetCellNoteStore().set(
-            maDestPos.miCellNotePos, nStartRow, aNotes.begin(), aNotes.end());
+        }
     }
 
 public:
@@ -1438,7 +1429,7 @@ public:
             setDefaultAttrsToDest(nTopRow, nDataSize);
 
         if (mbCopyNotes)
-                duplicateNotes(nTopRow, nOffset, nDataSize );
+            duplicateNotes(nTopRow, nDataSize );
     }
 };
 
@@ -1852,25 +1843,24 @@ class CopyByCloneHandler
         }
     }
 
-    void duplicateNotes(SCROW nStartRow, size_t nOffset, size_t nDataSize ) // TODO : notes suboptimal
+    void duplicateNotes(SCROW nStartRow, size_t nDataSize ) // TODO : notes suboptimal
     {
         sc::CellNoteStoreType maSrcCellNotes = mrSrcCol.GetCellNoteStore();
+        SCROW nRowMax = nStartRow + nDataSize;
 
-        for (SCROW nRow = nStartRow; nRow < nStartRow + nDataSize; ++nRow)
+        for (SCROW nRow = nStartRow; nRow < nRowMax; ++nRow)
+        {
+            ScPostIt* pSrcNote = maSrcCellNotes.get<ScPostIt*>(nRow);
+            if (pSrcNote)
             {
-                ScPostIt* pSrcNote = maSrcCellNotes.get<ScPostIt*>(nRow);
-                ScPostIt* pClonedNote;
-                if (pSrcNote)
-                {
-                    ScAddress aDestPos = ScAddress(mrDestCol.GetCol(), nRow, mrDestCol.GetTab());
-                    pClonedNote = pSrcNote->Clone( ScAddress(mrSrcCol.GetCol(), nRow, mrSrcCol.GetTab() ),
-                                     mrDestCol.GetDoc(),
-                                     aDestPos, true );
-                    mrDestCol.GetDoc().ReleaseNote(aDestPos);
-                    mrDestCol.GetDoc().SetNote(aDestPos, pClonedNote);
-                }
+                ScAddress aDestPos = ScAddress(mrDestCol.GetCol(), nRow, mrDestCol.GetTab());
+                ScPostIt* pClonedNote = pSrcNote->Clone( ScAddress(mrSrcCol.GetCol(), nRow, mrSrcCol.GetTab() ),
+                                 mrDestCol.GetDoc(),
+                                 aDestPos, true );
+                mrDestCol.GetDoc().ReleaseNote(aDestPos);
+                mrDestCol.GetDoc().SetNote(aDestPos, pClonedNote);
             }
-
+        }
     }
 
 public:
@@ -1892,7 +1882,7 @@ public:
         size_t nRow = aNode.position + nOffset;
 
         if (mnCopyFlags & (IDF_NOTE|IDF_ADDNOTES))
-                duplicateNotes(nRow, nOffset, nDataSize );
+                duplicateNotes(nRow, nDataSize );
 
         switch (aNode.type)
         {
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index 31a4ff3..f8ef4c5 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -697,34 +697,25 @@ class CopyCellsFromClipHandler
             maDestBlockPos, nDestRow, new ScFormulaCell(&mrDestCol.GetDoc(), aDestPos, &aArr));
     }
 
-    void duplicateNotes(SCROW nStartRow, size_t nOffset, size_t nDataSize )
+    void duplicateNotes(SCROW nStartRow, size_t nDataSize ) // TODO : notes suboptimal
     {
         sc::CellNoteStoreType maSrcCellNotes = mrSrcCol.GetCellNoteStore();
-        std::vector<ScPostIt*> aNotes;
-        aNotes.reserve(nDataSize);
-        SCROW nRow = nStartRow;
 
-        sc::CellNoteStoreType::const_iterator itNote = maSrcCellNotes.begin();
-        std::advance(itNote, nOffset);
-        sc::CellNoteStoreType::const_iterator itNoteEnd = itNote;
-        std::advance(itNoteEnd, nDataSize);
+        SCROW nRowMax = nStartRow + nDataSize;
 
-        for (; itNote != itNoteEnd; ++itNote, ++nRow)
+        for (SCROW nRow = nStartRow; nRow < nRowMax; ++nRow)
+        {
+            ScPostIt* pSrcNote = maSrcCellNotes.get<ScPostIt*>(nRow);
+            if (pSrcNote)
             {
-                ScPostIt* pSrcNote = maSrcCellNotes.get<ScPostIt*>(nRow);
-                ScPostIt* pClonedNote;
-                if (pSrcNote)
-                {
-                    ScAddress aDestPos = ScAddress(mrDestCol.GetCol(), nRow+mnRowOffset, mrDestCol.GetTab());
-                    pClonedNote = pSrcNote->Clone( ScAddress(mrSrcCol.GetCol(), nRow, mrSrcCol.GetTab() ),
-                                     mrDestCol.GetDoc(),
-                                     aDestPos, true );
-                }
-                aNotes.push_back(pClonedNote);
+                ScAddress aDestPos = ScAddress(mrDestCol.GetCol(), nRow+mnRowOffset, mrDestCol.GetTab());
+                ScPostIt* pClonedNote = pSrcNote->Clone( ScAddress(mrSrcCol.GetCol(), nRow, mrSrcCol.GetTab() ),
+                                 mrDestCol.GetDoc(),
+                                 aDestPos, true );
+                mrDestCol.GetDoc().ReleaseNote(aDestPos);
+                mrDestCol.GetDoc().SetNote(aDestPos, pClonedNote);
             }
-
-        maDestBlockPos.miCellNotePos = mrDestCol.GetCellNoteStore().set(
-            maDestBlockPos.miCellNotePos, nStartRow+mnRowOffset, aNotes.begin(), aNotes.end());
+        }
     }
 
 public:
@@ -761,7 +752,7 @@ public:
         if (node.type == sc::element_type_empty)
         {
             if (bCopyCellNotes)
-                duplicateNotes(nSrcRow1, nOffset, nDataSize );
+                duplicateNotes(nSrcRow1, nDataSize );
             return;
         }
 
@@ -928,7 +919,7 @@ public:
                 ;
         }
         if (bCopyCellNotes)
-            duplicateNotes(nSrcRow1, nOffset, nDataSize );
+            duplicateNotes(nSrcRow1, nDataSize );
     }
 };
 


More information about the Libreoffice-commits mailing list