sc/inc/table.hxx                 |    4 +++-
 sc/source/core/data/documen2.cxx |    8 +++++++-
 sc/source/core/data/table2.cxx   |   23 ++++++++++++++++-------
 3 files changed, 26 insertions(+), 9 deletions(-)

New commits:
commit 6af70ec9d0f87553a7fb795d957d41cf6d2d7c6d
Author: Eike Rathke <er...@redhat.com>
Date:   Sat Nov 26 11:23:24 2016 +0100

    Resolves: tdf#103493 copying note captions needs a completed destination 
sheet
    
    If a copied sheet's destination position is before its source position, the
    source's ScColumn::nTab members still pointed to the original source 
position
    when the captions were created, which led to the wrong drawing layer page 
being
    used and at the end the drawing shapes not being correctly assigned.
    
    Change-Id: I9c3cc97d8b4486756023b9ab02da28079a1d0627
    (cherry picked from commit 0a2a7436b4041bb34b01a183b9264af8488d1af3)
    Reviewed-on: https://gerrit.libreoffice.org/31228
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Tested-by: Eike Rathke <er...@redhat.com>

diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index e984c2e..da69ea9 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -454,7 +454,9 @@ public:
         sc::CopyToDocContext& rCxt, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, 
SCROW nRow2,
         InsertDeleteFlags nFlags, bool bMarked, ScTable* pDestTab,
         const ScMarkData* pMarkData = nullptr, bool bAsLink = false, bool 
bColRowFlags = true,
-        bool bGlobalNamesToLocal = false );
+        bool bGlobalNamesToLocal = false, bool bCopyCaptions = true );
+
+    void CopyCaptionsToTable( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW 
nRow2, ScTable* pDestTab, bool bCloneCaption );
 
     void UndoToTable(
         sc::CopyToDocContext& rCxt, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, 
SCROW nRow2,
diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx
index 20db59e..766aa9f 100644
--- a/sc/source/core/data/documen2.cxx
+++ b/sc/source/core/data/documen2.cxx
@@ -899,7 +899,7 @@ bool ScDocument::CopyTab( SCTAB nOldPos, SCTAB nNewPos, 
const ScMarkData* pOnlyM
         sc::CopyToDocContext aCopyDocCxt(*this);
         maTabs[nOldPos]->CopyToTable(aCopyDocCxt, 0, 0, MAXCOL, MAXROW, 
InsertDeleteFlags::ALL,
                 (pOnlyMarked != nullptr), maTabs[nNewPos], pOnlyMarked,
-                false /*bAsLink*/, true /*bColRowFlags*/, bGlobalNamesToLocal 
);
+                false /*bAsLink*/, true /*bColRowFlags*/, bGlobalNamesToLocal, 
false /*bCopyCaptions*/ );
         maTabs[nNewPos]->SetTabBgColor(maTabs[nOldPos]->GetTabBgColor());
 
         SCTAB nDz = nNewPos - nOldPos;
@@ -938,6 +938,12 @@ bool ScDocument::CopyTab( SCTAB nOldPos, SCTAB nNewPos, 
const ScMarkData* pOnlyM
         // Copy the RTL settings
         maTabs[nNewPos]->SetLayoutRTL(maTabs[nOldPos]->IsLayoutRTL());
         maTabs[nNewPos]->SetLoadingRTL(maTabs[nOldPos]->IsLoadingRTL());
+
+        // Finally copy the note captions, which need
+        // 1. the updated source ScColumn::nTab members if nNewPos <= nOldPos
+        // 2. row heights and column widths of the destination
+        // 3. RTL settings of the destination
+        maTabs[nOldPos]->CopyCaptionsToTable( 0, 0, MAXCOL, MAXROW, 
maTabs[nNewPos], true /*bCloneCaption*/);
     }
 
     return bValid;
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 0f817d9..a046bc5 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -1089,7 +1089,7 @@ void ScTable::StartListeningFormulaCells(
 void ScTable::CopyToTable(
     sc::CopyToDocContext& rCxt, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW 
nRow2,
     InsertDeleteFlags nFlags, bool bMarked, ScTable* pDestTab, const 
ScMarkData* pMarkData,
-    bool bAsLink, bool bColRowFlags, bool bGlobalNamesToLocal )
+    bool bAsLink, bool bColRowFlags, bool bGlobalNamesToLocal, bool 
bCopyCaptions )
 {
     if (!ValidColRow(nCol1, nRow1) || !ValidColRow(nCol2, nRow2))
         return;
@@ -1209,14 +1209,23 @@ void ScTable::CopyToTable(
     if(nFlags & InsertDeleteFlags::OUTLINE) // also only when bColRowFlags
         pDestTab->SetOutlineTable( pOutlineTable );
 
-    if (nFlags & (InsertDeleteFlags::NOTE|InsertDeleteFlags::ADDNOTES))
+    if (bCopyCaptions && (nFlags & (InsertDeleteFlags::NOTE | 
InsertDeleteFlags::ADDNOTES)))
     {
         bool bCloneCaption = (nFlags & InsertDeleteFlags::NOCAPTIONS) == 
InsertDeleteFlags::NONE;
-        for (SCCOL i = nCol1; i <= nCol2; i++)
-        {
-            aCol[i].CopyCellNotesToDocument(nRow1, nRow2, pDestTab->aCol[i], 
bCloneCaption);
-            pDestTab->aCol[i].UpdateNoteCaptions(nRow1, nRow2);
-        }
+        CopyCaptionsToTable( nCol1, nRow1, nCol2, nRow2, pDestTab, 
bCloneCaption);
+    }
+}
+
+void ScTable::CopyCaptionsToTable( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, 
SCROW nRow2, ScTable* pDestTab,
+        bool bCloneCaption )
+{
+    if (!ValidColRow(nCol1, nRow1) || !ValidColRow(nCol2, nRow2))
+        return;
+
+    for (SCCOL i = nCol1; i <= nCol2; i++)
+    {
+        aCol[i].CopyCellNotesToDocument(nRow1, nRow2, pDestTab->aCol[i], 
bCloneCaption);
+        pDestTab->aCol[i].UpdateNoteCaptions(nRow1, nRow2);
     }
 }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to