summaryrefslogtreecommitdiff
path: root/sc/source/ui/docshell
diff options
context:
space:
mode:
authorRüdiger Timm <rt@openoffice.org>2008-12-11 08:36:38 +0000
committerRüdiger Timm <rt@openoffice.org>2008-12-11 08:36:38 +0000
commita190965485508c4493ee33228dae68e12cd858f9 (patch)
treeb76399df5762f152857b7e0a7ba21069073c0430 /sc/source/ui/docshell
parent37d9508882a6783c66adebf9fde0645a3d055b02 (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.cxx523
-rw-r--r--sc/source/ui/docshell/docsh3.cxx8
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;