diff options
-rw-r--r-- | sc/inc/drwlayer.hxx | 1 | ||||
-rw-r--r-- | sc/source/core/data/documen9.cxx | 1 | ||||
-rw-r--r-- | sc/source/core/data/drwlayer.cxx | 37 |
3 files changed, 39 insertions, 0 deletions
diff --git a/sc/inc/drwlayer.hxx b/sc/inc/drwlayer.hxx index 6f4f71dd6902..f879e7475774 100644 --- a/sc/inc/drwlayer.hxx +++ b/sc/inc/drwlayer.hxx @@ -126,6 +126,7 @@ public: void ScMovePage( sal_uInt16 nOldPos, sal_uInt16 nNewPos ); // incl. content, bAlloc=FALSE -> only content void ScCopyPage( sal_uInt16 nOldPos, sal_uInt16 nNewPos, sal_Bool bAlloc ); + void ResetTab( SCTAB nStart, SCTAB nEnd ); ScDocument* GetDocument() const { return pDoc; } diff --git a/sc/source/core/data/documen9.cxx b/sc/source/core/data/documen9.cxx index b8cca4c9f52e..e4dec4ff2301 100644 --- a/sc/source/core/data/documen9.cxx +++ b/sc/source/core/data/documen9.cxx @@ -257,6 +257,7 @@ void ScDocument::DrawCopyPage( sal_uInt16 nOldPos, sal_uInt16 nNewPos ) { // angelegt wird die Page schon im ScTable ctor pDrawLayer->ScCopyPage( nOldPos, nNewPos, false ); + pDrawLayer->ResetTab(static_cast<SCTAB>(nNewPos), static_cast<SCTAB>(maTabs.size())); } void ScDocument::DeleteObjectsInArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, diff --git a/sc/source/core/data/drwlayer.cxx b/sc/source/core/data/drwlayer.cxx index 327f65a15e17..2e2d00a4e606 100644 --- a/sc/source/core/data/drwlayer.cxx +++ b/sc/source/core/data/drwlayer.cxx @@ -435,16 +435,32 @@ void ScDrawLayer::ScCopyPage( sal_uInt16 nOldPos, sal_uInt16 nNewPos, sal_Bool b if (pOldPage && pNewPage) { + SCTAB nOldTab = static_cast<SCTAB>(nOldPos); + SCTAB nNewTab = static_cast<SCTAB>(nNewPos); + SdrObjListIter aIter( *pOldPage, IM_FLAT ); SdrObject* pOldObject = aIter.Next(); while (pOldObject) { + ScDrawObjData* pOldData = GetObjData(pOldObject); + if (pOldData) + { + pOldData->maStart.SetTab(nOldTab); + pOldData->maEnd.SetTab(nOldTab); + } SdrObject* pNewObject = pOldObject->Clone(); pNewObject->SetModel(this); pNewObject->SetPage(pNewPage); pNewObject->NbcMove(Size(0,0)); pNewPage->InsertObject( pNewObject ); + ScDrawObjData* pNewData = GetObjData(pNewObject); + if (pNewData) + { + pNewData->maStart.SetTab(nNewTab); + pNewData->maEnd.SetTab(nNewTab); + } + if (bRecording) AddCalcUndo( new SdrUndoInsertObj( *pNewObject ) ); @@ -456,6 +472,27 @@ void ScDrawLayer::ScCopyPage( sal_uInt16 nOldPos, sal_uInt16 nNewPos, sal_Bool b InsertPage(pNewPage, nNewPos); } +void ScDrawLayer::ResetTab( SCTAB nStart, SCTAB nEnd ) +{ + for (SCTAB i = nStart; i <= nEnd; ++i) + { + SdrPage* pPage = GetPage(static_cast<sal_uInt16>(i)); + if (!pPage) + continue; + + SdrObjListIter aIter(*pPage, IM_FLAT); + for (SdrObject* pObj = aIter.Next(); pObj; pObj = aIter.Next()) + { + ScDrawObjData* pData = GetObjData(pObj); + if (!pData) + continue; + + pData->maStart.SetTab(i); + pData->maEnd.SetTab(i); + } + } +} + inline sal_Bool IsInBlock( const ScAddress& rPos, SCCOL nCol1,SCROW nRow1, SCCOL nCol2,SCROW nRow2 ) { return rPos.Col() >= nCol1 && rPos.Col() <= nCol2 && |