diff options
author | Rüdiger Timm <rt@openoffice.org> | 2008-12-11 08:36:38 +0000 |
---|---|---|
committer | Rüdiger Timm <rt@openoffice.org> | 2008-12-11 08:36:38 +0000 |
commit | a190965485508c4493ee33228dae68e12cd858f9 (patch) | |
tree | b76399df5762f152857b7e0a7ba21069073c0430 /sc/source/ui/docshell | |
parent | 37d9508882a6783c66adebf9fde0645a3d055b02 (diff) |
CWS-TOOLING: integrate CWS calc47
2008-12-10 20:38:34 +0100 oc r265231 : #i97115#
2008-12-09 14:19:59 +0100 oc r265084 : #i96939#
2008-12-09 11:55:29 +0100 oc r265073 : #i97061#
2008-12-09 11:37:05 +0100 oc r265067 : #i97061#
2008-12-09 11:31:49 +0100 oc r265066 : #i97061#
2008-12-09 11:30:30 +0100 oc r265065 : #i97061#
2008-12-04 17:13:43 +0100 er r264859 : DBG_ERROR needs semicolon
2008-12-04 02:34:13 +0100 er r264811 : unxsols4 needs to be compiled with exceptions when using STL
2008-12-04 02:24:30 +0100 er r264810 : WaE unxsols4: ScZoomSliderWnd::Update hides the function Window::Update()
2008-12-04 01:40:22 +0100 er r264809 : DBG_ASSERT needs semicolon
2008-12-03 11:00:55 +0100 er r264753 : CWS-TOOLING: rebase CWS calc47 to trunk@264325 (milestone: DEV300:m36)
2008-10-31 12:30:09 +0100 nn r262863 : #i90362# call CheckNeedsRepaint in UpdateFormulas
2008-10-29 14:49:48 +0100 nn r262802 : #i88521# initialization order (gcc warning)
2008-10-29 12:31:38 +0100 nn r262782 : #i88521# toolbar entry for scaling factor in page preview (patch from maoyg)
2008-10-29 12:31:00 +0100 nn r262781 : #i88521# toolbar entry for scaling factor in page preview (patch from maoyg)
2008-10-29 12:28:45 +0100 nn r262780 : #i88521# toolbar entry for scaling factor in page preview (patch from maoyg)
2008-10-28 17:01:37 +0100 nn r262756 : resolve gcc warnings
2008-10-28 13:46:07 +0100 nn r262742 : #i9709# always use system encoding for DDE (patch from rail)
2008-10-28 13:45:44 +0100 nn r262741 : #i9709# always use system encoding for DDE (patch from rail)
2008-10-27 20:55:51 +0100 nn r262689 : #i44349# refresh auto filter flags in ScUndoDragDrop::Redo (patch from gaozm)
2008-10-27 20:40:06 +0100 nn r262688 : #i4517# rename sheet with double click (patch from kohei)
2008-10-27 20:28:55 +0100 nn r262687 : #i20491# ensure stable sorting (patch from maoyg)
2008-10-27 20:13:19 +0100 nn r262686 : #i22758# direct sort (toolbar buttons): detect headers (patch from maoyg)
2008-10-27 19:42:51 +0100 nn r262685 : #i7277# default for sorting is cursor column (patch from maoyg)
2008-10-27 19:18:57 +0100 nn r262684 : #i7088# insert/delete columns/rows across selected sheets (patch from maoyg)
2008-10-27 18:59:43 +0100 nn r262683 : #i86856# show formula syntax in tip help (patch from maoyg)
2008-10-27 18:30:45 +0100 nn r262682 : #i89145# scroll wheel handling in page preview (patch from maoyg)
2008-10-27 18:03:10 +0100 nn r262681 : #i85226# take care of subtotal formulas in ScUndoQuery::Undo (patch from gaozm)
2008-10-27 17:41:16 +0100 nn r262680 : #i88437# add zoom slider in status bar also for Calc (patch from maoyg)
2008-10-27 15:53:52 +0100 nn r262678 : #i88467# undo for page margins/column widths in page preview (patch from maoyg)
Diffstat (limited to 'sc/source/ui/docshell')
-rw-r--r-- | sc/source/ui/docshell/docfunc.cxx | 523 | ||||
-rw-r--r-- | sc/source/ui/docshell/docsh3.cxx | 8 |
2 files changed, 360 insertions, 171 deletions
diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx index 79a09424bd8a..4208014ee491 100644 --- a/sc/source/ui/docshell/docfunc.cxx +++ b/sc/source/ui/docshell/docfunc.cxx @@ -1211,7 +1211,7 @@ BOOL ScDocFunc::ApplyStyle( const ScMarkData& rMark, const String& rStyleName, //------------------------------------------------------------------------ -BOOL ScDocFunc::InsertCells( const ScRange& rRange, InsCellCmd eCmd, +BOOL ScDocFunc::InsertCells( const ScRange& rRange, const ScMarkData* pTabMark, InsCellCmd eCmd, BOOL bRecord, BOOL bApi, BOOL bPartOfPaste ) { ScDocShellModificator aModificator( rDocShell ); @@ -1229,7 +1229,6 @@ BOOL ScDocFunc::InsertCells( const ScRange& rRange, InsCellCmd eCmd, return FALSE; } - SCTAB nTab = nStartTab; ScDocument* pDoc = rDocShell.GetDocument(); SCTAB nTabCount = pDoc->GetTableCount(); SCCOL nPaintStartX = nStartCol; @@ -1238,16 +1237,35 @@ BOOL ScDocFunc::InsertCells( const ScRange& rRange, InsCellCmd eCmd, SCROW nPaintEndY = nEndRow; USHORT nPaintFlags = PAINT_GRID; BOOL bSuccess; + SCTAB i; if (bRecord && !pDoc->IsUndoEnabled()) bRecord = FALSE; - // zugehoerige Szenarien auch anpassen - if ( !pDoc->IsScenario(nEndTab) ) - while ( nEndTab+1 < nTabCount && pDoc->IsScenario(nEndTab+1) ) - ++nEndTab; + ScMarkData aMark; + if (pTabMark) + aMark = *pTabMark; + else + { + SCTAB nCount = 0; + for( i=0; i<nTabCount; i++ ) + { + if( !pDoc->IsScenario(i) ) + { + nCount++; + if( nCount == nEndTab+1 ) + { + aMark.SelectTable( i, TRUE ); + break; + } + } + } + } - // Test zusammengefasste + SCTAB nSelCount = aMark.GetSelectCount(); + + // zugehoerige Szenarien auch anpassen + // Test zusammengefasste SCCOL nMergeTestStartX = nStartCol; SCROW nMergeTestStartY = nStartRow; @@ -1274,7 +1292,7 @@ BOOL ScDocFunc::InsertCells( const ScRange& rRange, InsCellCmd eCmd, SCCOL nEditTestEndX = (eCmd==INS_INSCOLS) ? MAXCOL : nMergeTestEndX; SCROW nEditTestEndY = (eCmd==INS_INSROWS) ? MAXROW : nMergeTestEndY; - ScEditableTester aTester( pDoc, nTab, nMergeTestStartX,nMergeTestStartY, nEditTestEndX,nEditTestEndY ); + ScEditableTester aTester( pDoc, nMergeTestStartX, nMergeTestStartY, nEditTestEndX, nEditTestEndY, aMark ); if (!aTester.IsEditable()) { if (!bApi) @@ -1282,42 +1300,46 @@ BOOL ScDocFunc::InsertCells( const ScRange& rRange, InsCellCmd eCmd, return FALSE; } - if (pDoc->HasAttrib( nMergeTestStartX,nMergeTestStartY,nTab, - nMergeTestEndX,nMergeTestEndY,nTab, - HASATTR_MERGED | HASATTR_OVERLAPPED )) + for( i=0; i<nTabCount; i++ ) { - if (eCmd==INS_CELLSRIGHT) - bNeedRefresh = TRUE; + if( aMark.GetTableSelect(i) ) + { + if (pDoc->HasAttrib( nMergeTestStartX,nMergeTestStartY, i, nMergeTestEndX, nMergeTestEndY, i, + HASATTR_MERGED | HASATTR_OVERLAPPED )) + { + if (eCmd==INS_CELLSRIGHT) + bNeedRefresh = TRUE; - SCCOL nMergeStartX = nMergeTestStartX; - SCROW nMergeStartY = nMergeTestStartY; - SCCOL nMergeEndX = nMergeTestEndX; - SCROW nMergeEndY = nMergeTestEndY; + SCCOL nMergeStartX = nMergeTestStartX; + SCROW nMergeStartY = nMergeTestStartY; + SCCOL nMergeEndX = nMergeTestEndX; + SCROW nMergeEndY = nMergeTestEndY; - pDoc->ExtendMerge( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, nTab ); - pDoc->ExtendOverlapped( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, nTab ); - if ( nMergeStartX != nMergeTestStartX || nMergeStartY != nMergeTestStartY || - nMergeEndX != nMergeTestEndX || nMergeEndY != nMergeTestEndY ) - bCanDo = FALSE; + pDoc->ExtendMerge( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, i ); + pDoc->ExtendOverlapped( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, i ); + if ( nMergeStartX != nMergeTestStartX || nMergeStartY != nMergeTestStartY || + nMergeEndX != nMergeTestEndX || nMergeEndY != nMergeTestEndY ) + bCanDo = FALSE; - //! ? nur Start testen ? + //! ? nur Start testen ? - if (!bCanDo) - if ( eCmd==INS_INSCOLS || eCmd==INS_INSROWS ) - if ( nMergeStartX == nMergeTestStartX && nMergeStartY == nMergeTestStartY ) - { - bCanDo = TRUE; -// bNeedRefresh = TRUE; - } - } + if (!bCanDo) + if ( eCmd==INS_INSCOLS || eCmd==INS_INSROWS ) + if ( nMergeStartX == nMergeTestStartX && nMergeStartY == nMergeTestStartY ) + { + bCanDo = TRUE; + } + } - if (!bCanDo) - { - //! auf Verschieben (Drag&Drop) zurueckfuehren !!! - // "Kann nicht in zusammengefasste Bereiche einfuegen" - if (!bApi) - rDocShell.ErrorMessage(STR_MSSG_INSERTCELLS_0); - return FALSE; + if (!bCanDo) + { + //! auf Verschieben (Drag&Drop) zurueckfuehren !!! + // "Kann nicht in zusammengefasste Bereiche einfuegen" + if (!bApi) + rDocShell.ErrorMessage(STR_MSSG_INSERTCELLS_0); + return FALSE; + } + } } // @@ -1343,26 +1365,66 @@ BOOL ScDocFunc::InsertCells( const ScRange& rRange, InsCellCmd eCmd, switch (eCmd) { case INS_CELLSDOWN: - bSuccess = pDoc->InsertRow( nStartCol,nStartTab, nEndCol,nEndTab, - nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc ); + bSuccess = TRUE; + for( i=0; i<nTabCount; i++ ) + { + if( aMark.GetTableSelect( i ) ) + { + SCTAB nScenarioCount = 0; + for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) + nScenarioCount ++; + + bSuccess &= pDoc->InsertRow( nStartCol, i, nEndCol, i+nScenarioCount, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc ); + } + } nPaintEndY = MAXROW; break; case INS_INSROWS: - bSuccess = pDoc->InsertRow( 0,nStartTab, MAXCOL,nEndTab, - nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc ); + bSuccess = TRUE; + for( i=0; i<nTabCount; i++ ) + { + if( aMark.GetTableSelect( i ) ) + { + SCTAB nScenarioCount = 0; + for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) + nScenarioCount ++; + + bSuccess &= pDoc->InsertRow( 0, i, MAXCOL, i+nScenarioCount, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc ); + } + } nPaintStartX = 0; nPaintEndX = MAXCOL; nPaintEndY = MAXROW; nPaintFlags |= PAINT_LEFT; break; case INS_CELLSRIGHT: - bSuccess = pDoc->InsertCol( nStartRow,nStartTab, nEndRow,nEndTab, - nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc ); + bSuccess = TRUE; + for( i=0; i<nTabCount; i++ ) + { + if( aMark.GetTableSelect( i ) ) + { + SCTAB nScenarioCount = 0; + for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) + nScenarioCount ++; + + bSuccess &= pDoc->InsertCol( nStartRow, i, nEndRow, i+nScenarioCount, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc ); + } + } nPaintEndX = MAXCOL; break; case INS_INSCOLS: - bSuccess = pDoc->InsertCol( 0,nStartTab, MAXROW,nEndTab, - nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc ); + bSuccess = TRUE; + for( i=0; i<nTabCount; i++ ) + { + if( aMark.GetTableSelect( i ) ) + { + SCTAB nScenarioCount = 0; + for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) + nScenarioCount ++; + + bSuccess &= pDoc->InsertCol( 0, i, MAXROW, i+nScenarioCount, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc ); + } + } nPaintStartY = 0; nPaintEndY = MAXROW; nPaintEndX = MAXCOL; @@ -1376,47 +1438,66 @@ BOOL ScDocFunc::InsertCells( const ScRange& rRange, InsCellCmd eCmd, if ( bSuccess ) { + SCTAB* pTabs = NULL; + SCTAB* pScenarios = NULL; + SCTAB nUndoPos = 0; if ( bRecord ) { - rDocShell.GetUndoManager()->AddUndoAction( - new ScUndoInsertCells( &rDocShell, ScRange( - nStartCol,nStartRow,nStartTab, - nEndCol,nEndRow,nEndTab ), - eCmd, pRefUndoDoc, pUndoData, bPartOfPaste ) ); + pTabs = new SCTAB[nSelCount]; + pScenarios = new SCTAB[nSelCount]; + nUndoPos = 0; + for( i=0; i<nTabCount; i++ ) + { + if( aMark.GetTableSelect( i ) ) + { + + SCTAB nCount = 0; + for( SCTAB j=i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) + nCount ++; + + pScenarios[nUndoPos] = nCount; + pTabs[nUndoPos] = i; + nUndoPos ++; + } + } + rDocShell.GetUndoManager()->AddUndoAction( new ScUndoInsertCells( + &rDocShell, ScRange( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab ), + nUndoPos, pTabs, pScenarios, eCmd, pRefUndoDoc, pUndoData, bPartOfPaste ) ); } - if (bNeedRefresh) - pDoc->ExtendMerge( nMergeTestStartX,nMergeTestStartY, - nMergeTestEndX,nMergeTestEndY, nTab, TRUE ); - else - pDoc->RefreshAutoFilter( nMergeTestStartX,nMergeTestStartY, - nMergeTestEndX,nMergeTestEndY, nTab); + for( i=0; i<nTabCount; i++ ) + { + if( aMark.GetTableSelect( i ) ) + { + if (bNeedRefresh) + pDoc->ExtendMerge( nMergeTestStartX, nMergeTestStartY, nMergeTestEndX, nMergeTestEndY, i, TRUE ); + else + pDoc->RefreshAutoFilter( nMergeTestStartX, nMergeTestStartY, nMergeTestEndX, nMergeTestEndY, i ); - if ( eCmd == INS_INSROWS || eCmd == INS_INSCOLS ) - pDoc->UpdatePageBreaks( nTab ); + if ( eCmd == INS_INSROWS || eCmd == INS_INSCOLS ) + pDoc->UpdatePageBreaks( i ); - USHORT nExtFlags = 0; - rDocShell.UpdatePaintExt( nExtFlags, nPaintStartX,nPaintStartY,nTab, nPaintEndX,nPaintEndY,nTab ); + USHORT nExtFlags = 0; + rDocShell.UpdatePaintExt( nExtFlags, nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i ); - // ganze Zeilen einfuegen: nur neue Zeilen anpassen - BOOL bAdjusted = ( eCmd == INS_INSROWS ) ? - AdjustRowHeight(ScRange(0,nStartRow,nStartTab, MAXCOL,nEndRow,nEndTab)) : - AdjustRowHeight(ScRange(0,nPaintStartY,nStartTab, MAXCOL,nPaintEndY,nEndTab)); - if (bAdjusted) - { - // paint only what is not done by AdjustRowHeight - if (nPaintFlags & PAINT_TOP) - rDocShell.PostPaint( nPaintStartX, nPaintStartY, nStartTab, - nPaintEndX, nPaintEndY, nEndTab, PAINT_TOP ); + SCTAB nScenarioCount = 0; + + for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) + nScenarioCount ++; + + BOOL bAdjusted = ( eCmd == INS_INSROWS ) ? AdjustRowHeight(ScRange(0, nStartRow, i, MAXCOL, nEndRow, i+nScenarioCount )) : + AdjustRowHeight(ScRange(0, nPaintStartY, i, MAXCOL, nPaintEndY, i+nScenarioCount )); + if (bAdjusted) + { + // paint only what is not done by AdjustRowHeight + if (nPaintFlags & PAINT_TOP) + rDocShell.PostPaint( nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i+nScenarioCount, PAINT_TOP ); + } + else + rDocShell.PostPaint( nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i+nScenarioCount, nPaintFlags, nExtFlags ); + } } - else - rDocShell.PostPaint( nPaintStartX, nPaintStartY, nStartTab, - nPaintEndX, nPaintEndY, nEndTab, - nPaintFlags, nExtFlags); aModificator.SetDocumentModified(); - -//! pDocSh->UpdateOle(GetViewData()); // muss an der View bleiben -//! CellContentChanged(); // muss an der View bleiben } else { @@ -1428,7 +1509,8 @@ BOOL ScDocFunc::InsertCells( const ScRange& rRange, InsCellCmd eCmd, return bSuccess; } -BOOL ScDocFunc::DeleteCells( const ScRange& rRange, DelCellCmd eCmd, BOOL bRecord, BOOL bApi ) +BOOL ScDocFunc::DeleteCells( const ScRange& rRange, const ScMarkData* pTabMark, DelCellCmd eCmd, + BOOL bRecord, BOOL bApi ) { ScDocShellModificator aModificator( rDocShell ); @@ -1445,7 +1527,6 @@ BOOL ScDocFunc::DeleteCells( const ScRange& rRange, DelCellCmd eCmd, BOOL bRecor return FALSE; } - SCTAB nTab = nStartTab; ScDocument* pDoc = rDocShell.GetDocument(); SCTAB nTabCount = pDoc->GetTableCount(); SCCOL nPaintStartX = nStartCol; @@ -1453,14 +1534,32 @@ BOOL ScDocFunc::DeleteCells( const ScRange& rRange, DelCellCmd eCmd, BOOL bRecor SCCOL nPaintEndX = nEndCol; SCROW nPaintEndY = nEndRow; USHORT nPaintFlags = PAINT_GRID; + SCTAB i; if (bRecord && !pDoc->IsUndoEnabled()) bRecord = FALSE; - // zugehoerige Szenarien auch anpassen - if ( !pDoc->IsScenario(nEndTab) ) - while ( nEndTab+1 < nTabCount && pDoc->IsScenario(nEndTab+1) ) - ++nEndTab; + ScMarkData aMark; + if (pTabMark) + aMark = *pTabMark; + else + { + SCTAB nCount = 0; + for( i=0; i<nTabCount; i++ ) + { + if( !pDoc->IsScenario(i) ) + { + nCount++; + if( nCount == nEndTab+1 ) + { + aMark.SelectTable( i, TRUE ); + break; + } + } + } + } + + SCTAB nSelCount = aMark.GetSelectCount(); SCCOL nUndoStartX = nStartCol; SCROW nUndoStartY = nStartRow; @@ -1481,10 +1580,12 @@ BOOL ScDocFunc::DeleteCells( const ScRange& rRange, DelCellCmd eCmd, BOOL bRecor // Test Zellschutz SCCOL nEditTestEndX = nUndoEndX; - if ( eCmd==DEL_DELCOLS || eCmd==DEL_CELLSLEFT ) nEditTestEndX = MAXCOL; + if ( eCmd==DEL_DELCOLS || eCmd==DEL_CELLSLEFT ) + nEditTestEndX = MAXCOL; SCROW nEditTestEndY = nUndoEndY; - if ( eCmd==DEL_DELROWS || eCmd==DEL_CELLSUP ) nEditTestEndY = MAXROW; - ScEditableTester aTester( pDoc, nTab, nUndoStartX,nUndoStartY,nEditTestEndX,nEditTestEndY ); + if ( eCmd==DEL_DELROWS || eCmd==DEL_CELLSUP ) + nEditTestEndY = MAXROW; + ScEditableTester aTester( pDoc, nUndoStartX, nUndoStartY, nEditTestEndX, nEditTestEndY, aMark ); if (!aTester.IsEditable()) { if (!bApi) @@ -1499,41 +1600,47 @@ BOOL ScDocFunc::DeleteCells( const ScRange& rRange, DelCellCmd eCmd, BOOL bRecor BOOL bCanDo = TRUE; BOOL bNeedRefresh = FALSE; - if (pDoc->HasAttrib( nUndoStartX,nUndoStartY,nTab, nMergeTestEndX,nMergeTestEndY,nTab, - HASATTR_MERGED | HASATTR_OVERLAPPED )) + for( i=0; i<nTabCount; i++ ) { - if ( eCmd==DEL_CELLSLEFT || eCmd==DEL_CELLSUP ) - bNeedRefresh = TRUE; + if( aMark.GetTableSelect(i) ) + { + if (pDoc->HasAttrib( nUndoStartX, nUndoStartY, i, nMergeTestEndX, nMergeTestEndY, i, + HASATTR_MERGED | HASATTR_OVERLAPPED )) + { + if ( eCmd==DEL_CELLSLEFT || eCmd==DEL_CELLSUP ) + bNeedRefresh = TRUE; - SCCOL nMergeStartX = nUndoStartX; - SCROW nMergeStartY = nUndoStartY; - SCCOL nMergeEndX = nMergeTestEndX; - SCROW nMergeEndY = nMergeTestEndY; + SCCOL nMergeStartX = nUndoStartX; + SCROW nMergeStartY = nUndoStartY; + SCCOL nMergeEndX = nMergeTestEndX; + SCROW nMergeEndY = nMergeTestEndY; - pDoc->ExtendMerge( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, nTab ); - pDoc->ExtendOverlapped( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, nTab ); - if ( nMergeStartX != nUndoStartX || nMergeStartY != nUndoStartY || - nMergeEndX != nMergeTestEndX || nMergeEndY != nMergeTestEndY ) - bCanDo = FALSE; + pDoc->ExtendMerge( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, i ); + pDoc->ExtendOverlapped( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, i ); + if ( nMergeStartX != nUndoStartX || nMergeStartY != nUndoStartY || + nMergeEndX != nMergeTestEndX || nMergeEndY != nMergeTestEndY ) + bCanDo = FALSE; - // ganze Zeilen/Spalten: Testen, ob Merge komplett geloescht werden kann + // ganze Zeilen/Spalten: Testen, ob Merge komplett geloescht werden kann - if (!bCanDo) - if ( eCmd==DEL_DELCOLS || eCmd==DEL_DELROWS ) - if ( nMergeStartX == nUndoStartX && nMergeStartY == nUndoStartY ) - { - bCanDo = TRUE; - bNeedRefresh = TRUE; - } - } + if (!bCanDo) + if ( eCmd==DEL_DELCOLS || eCmd==DEL_DELROWS ) + if ( nMergeStartX == nUndoStartX && nMergeStartY == nUndoStartY ) + { + bCanDo = TRUE; + bNeedRefresh = TRUE; + } + } - if (!bCanDo) - { - //! auf Verschieben (Drag&Drop) zurueckfuehren !!! - // "Kann nicht aus zusammengefassten Bereichen loeschen" - if (!bApi) - rDocShell.ErrorMessage(STR_MSSG_DELETECELLS_0); - return FALSE; + if (!bCanDo) + { + //! auf Verschieben (Drag&Drop) zurueckfuehren !!! + // "Kann nicht aus zusammengefassten Bereichen loeschen" + if (!bApi) + rDocShell.ErrorMessage(STR_MSSG_DELETECELLS_0); + return FALSE; + } + } } // @@ -1551,10 +1658,21 @@ BOOL ScDocFunc::DeleteCells( const ScRange& rRange, DelCellCmd eCmd, BOOL bRecor // so it's no longer necessary to copy more than the deleted range into pUndoDoc. pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); - pUndoDoc->InitUndo( pDoc, nStartTab, nEndTab, - (eCmd==DEL_DELCOLS), (eCmd==DEL_DELROWS) ); - pDoc->CopyToDocument( nUndoStartX, nUndoStartY, nStartTab, nUndoEndX, nUndoEndY, nEndTab, - IDF_ALL, FALSE, pUndoDoc ); + pUndoDoc->InitUndo( pDoc, 0, nTabCount-1, (eCmd==DEL_DELCOLS), (eCmd==DEL_DELROWS) ); + for( i=0; i<nTabCount; i++ ) + { + if( aMark.GetTableSelect( i ) ) + { + SCTAB nScenarioCount = 0; + + for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) + nScenarioCount ++; + + pDoc->CopyToDocument( nUndoStartX, nUndoStartY, i, nUndoEndX, nUndoEndY, i+nScenarioCount, + IDF_ALL, FALSE, pUndoDoc ); + } + } + pRefUndoDoc = new ScDocument( SCDOCMODE_UNDO ); pRefUndoDoc->InitUndo( pDoc, 0, nTabCount-1, FALSE, FALSE ); @@ -1564,32 +1682,76 @@ BOOL ScDocFunc::DeleteCells( const ScRange& rRange, DelCellCmd eCmd, BOOL bRecor } USHORT nExtFlags = 0; - rDocShell.UpdatePaintExt( nExtFlags, nStartCol,nStartRow,nTab, nEndCol,nEndRow,nTab ); + for( i=0; i<nTabCount; i++ ) + { + if( aMark.GetTableSelect( i ) ) + rDocShell.UpdatePaintExt( nExtFlags, nStartCol, nStartRow, i, nEndCol, nEndRow, i ); + } BOOL bUndoOutline = FALSE; switch (eCmd) { case DEL_CELLSUP: - pDoc->DeleteRow( nStartCol, nStartTab, nEndCol, nEndTab, - nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc ); + for( i=0; i<nTabCount; i++ ) + { + if( aMark.GetTableSelect( i ) ) + { + SCTAB nScenarioCount = 0; + + for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) + nScenarioCount ++; + + pDoc->DeleteRow( nStartCol, i, nEndCol, i+nScenarioCount, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc ); + } + } nPaintEndY = MAXROW; break; case DEL_DELROWS: - pDoc->DeleteRow( 0, nStartTab, MAXCOL, nEndTab, - nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc, &bUndoOutline ); + for( i=0; i<nTabCount; i++ ) + { + if( aMark.GetTableSelect( i ) ) + { + SCTAB nScenarioCount = 0; + + for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) + nScenarioCount ++; + + pDoc->DeleteRow( 0, i, MAXCOL, i+nScenarioCount, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc, &bUndoOutline ); + } + } nPaintStartX = 0; nPaintEndX = MAXCOL; nPaintEndY = MAXROW; nPaintFlags |= PAINT_LEFT; break; case DEL_CELLSLEFT: - pDoc->DeleteCol( nStartRow, nStartTab, nEndRow, nEndTab, - nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc ); + for( i=0; i<nTabCount; i++ ) + { + if( aMark.GetTableSelect( i ) ) + { + SCTAB nScenarioCount = 0; + + for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) + nScenarioCount ++; + + pDoc->DeleteCol( nStartRow, i, nEndRow, i+nScenarioCount, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc ); + } + } nPaintEndX = MAXCOL; break; case DEL_DELCOLS: - pDoc->DeleteCol( 0, nStartTab, MAXROW, nEndTab, - nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc, &bUndoOutline ); + for( i=0; i<nTabCount; i++ ) + { + if( aMark.GetTableSelect( i ) ) + { + SCTAB nScenarioCount = 0; + + for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) + nScenarioCount ++; + + pDoc->DeleteCol( 0, i, MAXROW, i+nScenarioCount, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc, &bUndoOutline ); + } + } nPaintStartY = 0; nPaintEndY = MAXROW; nPaintEndX = MAXCOL; @@ -1604,9 +1766,8 @@ BOOL ScDocFunc::DeleteCells( const ScRange& rRange, DelCellCmd eCmd, BOOL bRecor if ( bRecord ) { - for (SCTAB i=nStartTab; i<=nEndTab; i++) - pRefUndoDoc->DeleteAreaTab(nUndoStartX,nUndoStartY,nUndoEndX,nUndoEndY,i, - IDF_ALL); + for ( i=nStartTab; i<=nTabCount; i++) + pRefUndoDoc->DeleteAreaTab(nUndoStartX,nUndoStartY,nUndoEndX,nUndoEndY, i, IDF_ALL); // alle Tabellen anlegen, damit Formeln kopiert werden koennen: pUndoDoc->AddUndoTab( 0, nTabCount-1, FALSE, FALSE ); @@ -1614,11 +1775,27 @@ BOOL ScDocFunc::DeleteCells( const ScRange& rRange, DelCellCmd eCmd, BOOL bRecor // kopieren mit bColRowFlags=FALSE (#54194#) pRefUndoDoc->CopyToDocument(0,0,0,MAXCOL,MAXROW,MAXTAB,IDF_FORMULA,FALSE,pUndoDoc,NULL,FALSE); delete pRefUndoDoc; - rDocShell.GetUndoManager()->AddUndoAction( - new ScUndoDeleteCells( &rDocShell, ScRange( - nStartCol,nStartRow,nStartTab, - nEndCol,nEndRow,nEndTab ), - eCmd, pUndoDoc, pUndoData ) ); + + SCTAB* pTabs = new SCTAB[nSelCount]; + SCTAB* pScenarios = new SCTAB[nSelCount]; + SCTAB nUndoPos = 0; + + for( i=0; i<nTabCount; i++ ) + { + if( aMark.GetTableSelect( i ) ) + { + SCTAB nCount = 0; + for( SCTAB j=i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) + nCount ++; + + pScenarios[nUndoPos] = nCount; + pTabs[nUndoPos] = i; + nUndoPos ++; + } + } + rDocShell.GetUndoManager()->AddUndoAction( new ScUndoDeleteCells( + &rDocShell, ScRange( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab ),nUndoPos, pTabs, pScenarios, + eCmd, pUndoDoc, pUndoData ) ); } if (bNeedRefresh) @@ -1626,47 +1803,59 @@ BOOL ScDocFunc::DeleteCells( const ScRange& rRange, DelCellCmd eCmd, BOOL bRecor // #i51445# old merge flag attributes must be deleted also for single cells, // not only for whole columns/rows - if ( eCmd==DEL_DELCOLS || eCmd==DEL_CELLSLEFT ) nMergeTestEndX = MAXCOL; - if ( eCmd==DEL_DELROWS || eCmd==DEL_CELLSUP ) nMergeTestEndY = MAXROW; + if ( eCmd==DEL_DELCOLS || eCmd==DEL_CELLSLEFT ) + nMergeTestEndX = MAXCOL; + if ( eCmd==DEL_DELROWS || eCmd==DEL_CELLSUP ) + nMergeTestEndY = MAXROW; ScPatternAttr aPattern( pDoc->GetPool() ); aPattern.GetItemSet().Put( ScMergeFlagAttr() ); - ScMarkData aMark; // only contains the sheets - for (SCTAB i=nStartTab; i<=nEndTab; i++) - aMark.SelectTable( i, TRUE ); - pDoc->ApplyPatternArea( nUndoStartX, nUndoStartY, nMergeTestEndX, nMergeTestEndY, - aMark, aPattern ); + pDoc->ApplyPatternArea( nUndoStartX, nUndoStartY, nMergeTestEndX, nMergeTestEndY, aMark, aPattern ); - ScRange aMergedRange( nUndoStartX, nUndoStartY, nStartTab, nMergeTestEndX, nMergeTestEndY, nEndTab ); - pDoc->ExtendMerge( aMergedRange, TRUE ); - } + for( i=0; i<nTabCount; i++ ) + { + if( aMark.GetTableSelect( i ) ) + { + SCTAB nScenarioCount = 0; - if ( eCmd == DEL_DELCOLS || eCmd == DEL_DELROWS ) - pDoc->UpdatePageBreaks( nTab ); + for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) + nScenarioCount ++; - rDocShell.UpdatePaintExt( nExtFlags, nPaintStartX,nPaintStartY,nTab, nPaintEndX,nPaintEndY,nTab ); + ScRange aMergedRange( nUndoStartX, nUndoStartY, i, nMergeTestEndX, nMergeTestEndY, i+nScenarioCount ); + pDoc->ExtendMerge( aMergedRange, TRUE ); + } + } + } - // ganze Zeilen loeschen: nichts anpassen - if ( eCmd == DEL_DELROWS || - !AdjustRowHeight(ScRange(0,nPaintStartY,nStartTab, MAXCOL,nPaintEndY,nEndTab)) ) - rDocShell.PostPaint( nPaintStartX, nPaintStartY, nStartTab, - nPaintEndX, nPaintEndY, nEndTab, - nPaintFlags, nExtFlags ); - else + for( i=0; i<nTabCount; i++ ) { - // paint only what is not done by AdjustRowHeight - if (nExtFlags & SC_PF_LINES) - lcl_PaintAbove( rDocShell, ScRange( nPaintStartX, nPaintStartY, nStartTab, - nPaintEndX, nPaintEndY, nEndTab) ); - if (nPaintFlags & PAINT_TOP) - rDocShell.PostPaint( nPaintStartX, nPaintStartY, nStartTab, - nPaintEndX, nPaintEndY, nEndTab, PAINT_TOP ); + if( aMark.GetTableSelect( i ) ) + { + if ( eCmd == DEL_DELCOLS || eCmd == DEL_DELROWS ) + pDoc->UpdatePageBreaks( i ); + + rDocShell.UpdatePaintExt( nExtFlags, nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i ); + + SCTAB nScenarioCount = 0; + + for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ ) + nScenarioCount ++; + + // ganze Zeilen loeschen: nichts anpassen + if ( eCmd == DEL_DELROWS || !AdjustRowHeight(ScRange( 0, nPaintStartY, i, MAXCOL, nPaintEndY, i+nScenarioCount )) ) + rDocShell.PostPaint( nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i+nScenarioCount, nPaintFlags, nExtFlags ); + else + { + // paint only what is not done by AdjustRowHeight + if (nExtFlags & SC_PF_LINES) + lcl_PaintAbove( rDocShell, ScRange( nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i+nScenarioCount) ); + if (nPaintFlags & PAINT_TOP) + rDocShell.PostPaint( nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i+nScenarioCount, PAINT_TOP ); + } + } } aModificator.SetDocumentModified(); -//! pDocSh->UpdateOle(GetViewData()); // muss an der View bleiben -//! CellContentChanged(); // muss an der View bleiben - SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) ); return TRUE; diff --git a/sc/source/ui/docshell/docsh3.cxx b/sc/source/ui/docshell/docsh3.cxx index b0094688903d..4b1c26f0e20b 100644 --- a/sc/source/ui/docshell/docsh3.cxx +++ b/sc/source/ui/docshell/docsh3.cxx @@ -1065,10 +1065,10 @@ void ScDocShell::MergeDocument( ScDocument& rOtherDoc, bool bShared, bool bCheck } break; case SC_CAT_INSERT_ROWS: - GetDocFunc().InsertCells( aSourceRange, INS_INSROWS, TRUE, FALSE ); + GetDocFunc().InsertCells( aSourceRange, NULL, INS_INSROWS, TRUE, FALSE ); break; case SC_CAT_INSERT_COLS: - GetDocFunc().InsertCells( aSourceRange, INS_INSCOLS, TRUE, FALSE ); + GetDocFunc().InsertCells( aSourceRange, NULL, INS_INSCOLS, TRUE, FALSE ); break; case SC_CAT_DELETE_TABS : GetDocFunc().DeleteTable( aSourceRange.aStart.Tab(), TRUE, FALSE ); @@ -1079,7 +1079,7 @@ void ScDocShell::MergeDocument( ScDocument& rOtherDoc, bool bShared, bool bCheck if ( pDel->IsTopDelete() ) { aSourceRange = pDel->GetOverAllRange().MakeRange(); - GetDocFunc().DeleteCells( aSourceRange, DEL_DELROWS, TRUE, FALSE ); + GetDocFunc().DeleteCells( aSourceRange, NULL, DEL_DELROWS, TRUE, FALSE ); } } break; @@ -1089,7 +1089,7 @@ void ScDocShell::MergeDocument( ScDocument& rOtherDoc, bool bShared, bool bCheck if ( pDel->IsTopDelete() && !pDel->IsTabDeleteCol() ) { // deleted Table enthaelt deleted Cols, die nicht aSourceRange = pDel->GetOverAllRange().MakeRange(); - GetDocFunc().DeleteCells( aSourceRange, DEL_DELCOLS, TRUE, FALSE ); + GetDocFunc().DeleteCells( aSourceRange, NULL, DEL_DELCOLS, TRUE, FALSE ); } } break; |