diff options
author | Eike Rathke <erack@redhat.com> | 2016-11-26 11:23:24 +0100 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2016-11-29 14:54:24 +0000 |
commit | bea103fa2c331d776c39e126d0d086983d7ec28b (patch) | |
tree | fca45762fa7ff6f3b518cfdabe81726c6bcf402d | |
parent | 8a0575819ae3526831699767177b333270d6c718 (diff) |
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/31229
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
-rw-r--r-- | sc/inc/table.hxx | 4 | ||||
-rw-r--r-- | sc/source/core/data/documen2.cxx | 8 | ||||
-rw-r--r-- | sc/source/core/data/table2.cxx | 23 |
3 files changed, 26 insertions, 9 deletions
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index be833da3cad3..4877f2be9835 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -449,7 +449,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 9c30f0f4740e..e5f4ffc4e15b 100644 --- a/sc/source/core/data/documen2.cxx +++ b/sc/source/core/data/documen2.cxx @@ -902,7 +902,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; @@ -940,6 +940,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 923005a0d250..5c2666884911 100644 --- a/sc/source/core/data/table2.cxx +++ b/sc/source/core/data/table2.cxx @@ -1090,7 +1090,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; @@ -1210,14 +1210,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); } } |