diff -uNr old/sc/source/ui/docshell/docfunc.cxx new/sc/source/ui/docshell/docfunc.cxx --- old/sc/source/ui/docshell/docfunc.cxx 2008-03-07 23:10:52.000000000 +0800 +++ new/sc/source/ui/docshell/docfunc.cxx 2008-08-20 14:40:10.000000000 +0800 @@ -1229,6 +1229,9 @@ SCCOL nEndCol = rRange.aEnd.Col(); SCROW nEndRow = rRange.aEnd.Row(); SCTAB nEndTab = rRange.aEnd.Tab(); + ScMarkData& rMark = ScDocShell::GetViewData()->GetMarkData(); + SCTAB nSelCount = rMark.GetSelectCount(); + SCTAB i; if ( !ValidRow(nStartRow) || !ValidRow(nEndRow) ) { @@ -1236,7 +1239,6 @@ return FALSE; } - SCTAB nTab = nStartTab; ScDocument* pDoc = rDocShell.GetDocument(); SCTAB nTabCount = pDoc->GetTableCount(); SCCOL nPaintStartX = nStartCol; @@ -1249,12 +1251,15 @@ if (bRecord && !pDoc->IsUndoEnabled()) bRecord = FALSE; - // zugehoerige Szenarien auch anpassen - if ( !pDoc->IsScenario(nEndTab) ) - while ( nEndTab+1 < nTabCount && pDoc->IsScenario(nEndTab+1) ) - ++nEndTab; + BOOL* bIsScenario = new BOOL[nTabCount]; + + for( i=0; iIsScenario(i) ) + bIsScenario[i] = TRUE; + else + bIsScenario[i] = FALSE; - // Test zusammengefasste + // Test zusammengefasste SCCOL nMergeTestStartX = nStartCol; SCROW nMergeTestStartY = nStartRow; @@ -1281,7 +1286,7 @@ 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, rMark ); if (!aTester.IsEditable()) { if (!bApi) @@ -1289,43 +1294,46 @@ return FALSE; } - if (pDoc->HasAttrib( nMergeTestStartX,nMergeTestStartY,nTab, - nMergeTestEndX,nMergeTestEndY,nTab, - HASATTR_MERGED | HASATTR_OVERLAPPED )) - { - if (eCmd==INS_CELLSRIGHT) - bNeedRefresh = TRUE; - - 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; - - //! ? nur Start testen ? - - if (!bCanDo) - if ( eCmd==INS_INSCOLS || eCmd==INS_INSROWS ) - if ( nMergeStartX == nMergeTestStartX && nMergeStartY == nMergeTestStartY ) - { - bCanDo = TRUE; -// bNeedRefresh = TRUE; - } - } + for( i=0; iHasAttrib( nMergeTestStartX,nMergeTestStartY, i, + nMergeTestEndX,nMergeTestEndY, i, + HASATTR_MERGED | HASATTR_OVERLAPPED )) + { + if (eCmd==INS_CELLSRIGHT) + bNeedRefresh = TRUE; - if (!bCanDo) - { - //! auf Verschieben (Drag&Drop) zurueckfuehren !!! - // "Kann nicht in zusammengefasste Bereiche einfuegen" - if (!bApi) - rDocShell.ErrorMessage(STR_MSSG_INSERTCELLS_0); - return FALSE; - } + SCCOL nMergeStartX = nMergeTestStartX; + SCROW nMergeStartY = nMergeTestStartY; + SCCOL nMergeEndX = nMergeTestEndX; + SCROW nMergeEndY = nMergeTestEndY; + + 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; + + if (!bCanDo) + { + if ( eCmd==INS_INSCOLS || eCmd==INS_INSROWS ) + if ( nMergeStartX == nMergeTestStartX && nMergeStartY == nMergeTestStartY ) + { + bCanDo = TRUE; + } + } + } + + if ( !bCanDo ) + { + if (!bApi) + rDocShell.ErrorMessage(STR_MSSG_INSERTCELLS_0); + return FALSE; + } + } + } // // ausfuehren @@ -1350,26 +1358,70 @@ switch (eCmd) { case INS_CELLSDOWN: - bSuccess = pDoc->InsertRow( nStartCol,nStartTab, nEndCol,nEndTab, - nStartRow, static_cast(nEndRow-nStartRow+1), pRefUndoDoc ); + bSuccess = TRUE; + for( i=0; iInsertRow( nStartCol, i, nEndCol, i+nScenarioCount, nStartRow, static_cast(nEndRow-nStartRow+1), pRefUndoDoc ); + } + } nPaintEndY = MAXROW; break; case INS_INSROWS: - bSuccess = pDoc->InsertRow( 0,nStartTab, MAXCOL,nEndTab, - nStartRow, static_cast(nEndRow-nStartRow+1), pRefUndoDoc ); + bSuccess = TRUE; + for( i=0; iInsertRow( 0, i, MAXCOL, i+nScenarioCount, nStartRow, static_cast(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(nEndCol-nStartCol+1), pRefUndoDoc ); + bSuccess = TRUE; + for( i=0; iInsertCol( nStartRow, i, nEndRow, i+nScenarioCount, nStartCol, static_cast(nEndCol-nStartCol+1), pRefUndoDoc ); + } + } nPaintEndX = MAXCOL; break; case INS_INSCOLS: - bSuccess = pDoc->InsertCol( 0,nStartTab, MAXROW,nEndTab, - nStartCol, static_cast(nEndCol-nStartCol+1), pRefUndoDoc ); + bSuccess = TRUE; + for( i=0; iInsertCol( 0, i, MAXROW, i+nScenarioCount, nStartCol, static_cast(nEndCol-nStartCol+1), pRefUndoDoc ); + } + } nPaintStartY = 0; nPaintEndY = MAXROW; nPaintEndX = MAXCOL; @@ -1383,47 +1435,71 @@ if ( bSuccess ) { - if ( bRecord ) - { - rDocShell.GetUndoManager()->AddUndoAction( - new ScUndoInsertCells( &rDocShell, ScRange( - nStartCol,nStartRow,nStartTab, - nEndCol,nEndRow,nEndTab ), - eCmd, pRefUndoDoc, pUndoData, bPartOfPaste ) ); - } - if (bNeedRefresh) - pDoc->ExtendMerge( nMergeTestStartX,nMergeTestStartY, - nMergeTestEndX,nMergeTestEndY, nTab, TRUE ); - else - pDoc->RefreshAutoFilter( nMergeTestStartX,nMergeTestStartY, - nMergeTestEndX,nMergeTestEndY, nTab); + SCTAB* pTabs = NULL; + SCTAB* pScenarios = NULL; + SCTAB nUndoPos = 0; - if ( eCmd == INS_INSROWS || eCmd == INS_INSCOLS ) - pDoc->UpdatePageBreaks( nTab ); + if ( bRecord ) + { + pTabs = new SCTAB[nSelCount]; + pScenarios = new SCTAB[nSelCount]; + nUndoPos = 0; + for( i=0; iAddUndoAction( new ScUndoInsertCells( + &rDocShell, ScRange( nStartCol,nStartRow,nStartTab, nEndCol, nEndRow, nEndTab ), nUndoPos, pTabs, pScenarios, + eCmd, pRefUndoDoc, pUndoData, bPartOfPaste ) ); + } - // 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 ); - } - else - rDocShell.PostPaint( nPaintStartX, nPaintStartY, nStartTab, - nPaintEndX, nPaintEndY, nEndTab, - nPaintFlags, nExtFlags); - aModificator.SetDocumentModified(); + for( i=0; iExtendMerge( nMergeTestStartX, nMergeTestStartY, nMergeTestEndX, nMergeTestEndY, i, TRUE ); + else + pDoc->RefreshAutoFilter( nMergeTestStartX, nMergeTestStartY, nMergeTestEndX, nMergeTestEndY, i); + + if ( eCmd == INS_INSROWS || eCmd == INS_INSCOLS ) + pDoc->UpdatePageBreaks( i ); + + USHORT nExtFlags = 0; + rDocShell.UpdatePaintExt( nExtFlags, nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i ); + + // ganze Zeilen einfuegen: nur neue Zeilen anpassen + + SCTAB nScenarioCount = 0; + + for( SCTAB j = i+1; jUpdateOle(GetViewData()); // muss an der View bleiben -//! CellContentChanged(); // muss an der View bleiben + aModificator.SetDocumentModified(); } else { @@ -1432,6 +1508,9 @@ if (!bApi) rDocShell.ErrorMessage(STR_INSERT_FULL); // Spalte/Zeile voll } + + delete []bIsScenario; + return bSuccess; } @@ -1445,6 +1524,9 @@ SCCOL nEndCol = rRange.aEnd.Col(); SCROW nEndRow = rRange.aEnd.Row(); SCTAB nEndTab = rRange.aEnd.Tab(); + ScMarkData& rMark = ScDocShell::GetViewData()->GetMarkData(); + SCTAB nSelCount = rMark.GetSelectCount(); + SCTAB i; if ( !ValidRow(nStartRow) || !ValidRow(nEndRow) ) { @@ -1452,8 +1534,7 @@ return FALSE; } - SCTAB nTab = nStartTab; - ScDocument* pDoc = rDocShell.GetDocument(); + ScDocument* pDoc = rDocShell.GetDocument(); SCTAB nTabCount = pDoc->GetTableCount(); SCCOL nPaintStartX = nStartCol; SCROW nPaintStartY = nStartRow; @@ -1465,9 +1546,13 @@ bRecord = FALSE; // zugehoerige Szenarien auch anpassen - if ( !pDoc->IsScenario(nEndTab) ) - while ( nEndTab+1 < nTabCount && pDoc->IsScenario(nEndTab+1) ) - ++nEndTab; + BOOL* bIsScenario = new BOOL[nTabCount]; + + for( i=0; iIsScenario(i) ) + bIsScenario[i] = TRUE; + else + bIsScenario[i] = FALSE; SCCOL nUndoStartX = nStartCol; SCROW nUndoStartY = nStartRow; @@ -1488,10 +1573,14 @@ // 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, rMark ); if (!aTester.IsEditable()) { if (!bApi) @@ -1506,42 +1595,48 @@ BOOL bCanDo = TRUE; BOOL bNeedRefresh = FALSE; - if (pDoc->HasAttrib( nUndoStartX,nUndoStartY,nTab, nMergeTestEndX,nMergeTestEndY,nTab, - 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; - - 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; - - // 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) - { - //! auf Verschieben (Drag&Drop) zurueckfuehren !!! - // "Kann nicht aus zusammengefassten Bereichen loeschen" - if (!bApi) - rDocShell.ErrorMessage(STR_MSSG_DELETECELLS_0); - return FALSE; - } + for( i=0; iHasAttrib( 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; + + 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 + + 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; + } + } + } // // ausfuehren @@ -1556,12 +1651,24 @@ { // With the fix for #101329#, UpdateRef always puts cells into pRefUndoDoc at their old position, // so it's no longer necessary to copy more than the deleted range into pUndoDoc. + + pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); + pUndoDoc->InitUndo( pDoc, 0, nTabCount-1, (eCmd==DEL_DELCOLS), (eCmd==DEL_DELROWS) ); + + for( i=0; iCopyToDocument( nUndoStartX, nUndoStartY, i, nUndoEndX, nUndoEndY, i+nScenarioCount, + IDF_ALL, FALSE, 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 ); pRefUndoDoc = new ScDocument( SCDOCMODE_UNDO ); pRefUndoDoc->InitUndo( pDoc, 0, nTabCount-1, FALSE, FALSE ); @@ -1571,32 +1678,76 @@ } USHORT nExtFlags = 0; - rDocShell.UpdatePaintExt( nExtFlags, nStartCol,nStartRow,nTab, nEndCol,nEndRow,nTab ); + for( i=0; iDeleteRow( nStartCol, nStartTab, nEndCol, nEndTab, - nStartRow, static_cast(nEndRow-nStartRow+1), pRefUndoDoc ); + for( i=0; iDeleteRow( nStartCol, i, nEndCol, i+nScenarioCount, nStartRow, static_cast(nEndRow-nStartRow+1), pRefUndoDoc ); + } + } nPaintEndY = MAXROW; break; case DEL_DELROWS: - pDoc->DeleteRow( 0, nStartTab, MAXCOL, nEndTab, - nStartRow, static_cast(nEndRow-nStartRow+1), pRefUndoDoc, &bUndoOutline ); + for( i=0; iDeleteRow( 0, i, MAXCOL, i+nScenarioCount, nStartRow, static_cast(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(nEndCol-nStartCol+1), pRefUndoDoc ); + for( i=0; iDeleteCol( nStartRow, i, nEndRow, i+nScenarioCount, nStartCol, static_cast(nEndCol-nStartCol+1), pRefUndoDoc ); + } + } nPaintEndX = MAXCOL; break; case DEL_DELCOLS: - pDoc->DeleteCol( 0, nStartTab, MAXROW, nEndTab, - nStartCol, static_cast(nEndCol-nStartCol+1), pRefUndoDoc, &bUndoOutline ); + for( i=0; iDeleteCol( 0, i, MAXROW, i+nScenarioCount, nStartCol, static_cast(nEndCol-nStartCol+1), pRefUndoDoc, &bUndoOutline ); + } + } nPaintStartY = 0; nPaintEndY = MAXROW; nPaintEndX = MAXCOL; @@ -1611,9 +1762,8 @@ 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 ); @@ -1621,11 +1771,28 @@ // 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; iAddUndoAction( new ScUndoDeleteCells( + &rDocShell, ScRange( nStartCol,nStartRow,nStartTab, nEndCol,nEndRow,nEndTab ), nUndoPos, pTabs, pScenarios, + eCmd, pUndoDoc, pUndoData ) ); } if (bNeedRefresh) @@ -1633,48 +1800,68 @@ // #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++) + for ( i=nStartTab; i<=nTabCount; i++) aMark.SelectTable( i, TRUE ); pDoc->ApplyPatternArea( nUndoStartX, nUndoStartY, nMergeTestEndX, nMergeTestEndY, aMark, aPattern ); - ScRange aMergedRange( nUndoStartX, nUndoStartY, nStartTab, nMergeTestEndX, nMergeTestEndY, nEndTab ); - pDoc->ExtendMerge( aMergedRange, TRUE ); + for( i=0; iExtendMerge( aMergedRange, TRUE ); + } + } } + + for( i=0; iUpdatePageBreaks( nTab ); + if ( eCmd == DEL_DELCOLS || eCmd == DEL_DELROWS ) + pDoc->UpdatePageBreaks( i ); - rDocShell.UpdatePaintExt( nExtFlags, nPaintStartX,nPaintStartY,nTab, nPaintEndX,nPaintEndY,nTab ); + rDocShell.UpdatePaintExt( nExtFlags, nPaintStartX,nPaintStartY, i, nPaintEndX,nPaintEndY, i ); - // 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 - { - // 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 ); - } - aModificator.SetDocumentModified(); + SCTAB nScenarioCount = 0; -//! pDocSh->UpdateOle(GetViewData()); // muss an der View bleiben -//! CellContentChanged(); // muss an der View bleiben + for( SCTAB j = i+1; jBroadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) ); + + delete []bIsScenario; return TRUE; } diff -uNr old/sc/source/ui/inc/undoblk.hxx new/sc/source/ui/inc/undoblk.hxx --- old/sc/source/ui/inc/undoblk.hxx 2006-10-20 14:41:24.000000000 +0800 +++ new/sc/source/ui/inc/undoblk.hxx 2008-08-20 14:32:46.000000000 +0800 @@ -67,8 +67,8 @@ public: TYPEINFO(); ScUndoInsertCells( ScDocShell* pNewDocShell, - const ScRange& rRange, InsCellCmd eNewCmd, - ScDocument* pUndoDocument, ScRefUndoData* pRefData, + const ScRange& rRange, SCTAB nNewCount, SCTAB* pNewTabs, SCTAB* pNewScenarios, + InsCellCmd eNewCmd, ScDocument* pUndoDocument, ScRefUndoData* pRefData, BOOL bNewPartOfPaste ); virtual ~ScUndoInsertCells(); @@ -83,6 +83,9 @@ private: ScRange aEffRange; + SCTAB nCount; + SCTAB* pTabs; + SCTAB* pScenarios; ULONG nEndChangeAction; InsCellCmd eCmd; BOOL bPartOfPaste; @@ -98,8 +101,8 @@ public: TYPEINFO(); ScUndoDeleteCells( ScDocShell* pNewDocShell, - const ScRange& rRange, DelCellCmd eNewCmd, - ScDocument* pUndoDocument, ScRefUndoData* pRefData ); + const ScRange& rRange, SCTAB nNewCount, SCTAB* pNewTabs, SCTAB* pNewScenarios, + DelCellCmd eNewCmd, ScDocument* pUndoDocument, ScRefUndoData* pRefData ); virtual ~ScUndoDeleteCells(); virtual void Undo(); @@ -111,6 +114,9 @@ private: ScRange aEffRange; + SCTAB nCount; + SCTAB* pTabs; + SCTAB* pScenarios; ULONG nStartChangeAction; ULONG nEndChangeAction; DelCellCmd eCmd; diff -uNr old/sc/source/ui/undo/undoblk.cxx new/sc/source/ui/undo/undoblk.cxx --- old/sc/source/ui/undo/undoblk.cxx 2008-02-21 18:05:58.000000000 +0800 +++ new/sc/source/ui/undo/undoblk.cxx 2008-08-20 14:36:04.000000000 +0800 @@ -108,11 +108,14 @@ // ScUndoInsertCells::ScUndoInsertCells( ScDocShell* pNewDocShell, - const ScRange& rRange, InsCellCmd eNewCmd, - ScDocument* pUndoDocument, ScRefUndoData* pRefData, + const ScRange& rRange, SCTAB nNewCount, SCTAB* pNewTabs, SCTAB* pNewScenarios, + InsCellCmd eNewCmd, ScDocument* pUndoDocument, ScRefUndoData* pRefData, BOOL bNewPartOfPaste ) : ScMoveUndo( pNewDocShell, pUndoDocument, pRefData, SC_UNDO_REFLAST ), aEffRange( rRange ), + nCount( nNewCount ), + pTabs( pNewTabs ), + pScenarios( pNewScenarios ), eCmd( eNewCmd ), bPartOfPaste( bNewPartOfPaste ), pPasteUndo( NULL ) @@ -135,6 +138,8 @@ __EXPORT ScUndoInsertCells::~ScUndoInsertCells() { delete pPasteUndo; + delete []pTabs; + delete []pScenarios; } String __EXPORT ScUndoInsertCells::GetComment() const @@ -182,6 +187,7 @@ void ScUndoInsertCells::DoChange( const BOOL bUndo ) { ScDocument* pDoc = pDocShell->GetDocument(); + SCTAB i; if ( bUndo ) { @@ -198,17 +204,27 @@ { case INS_INSROWS: case INS_CELLSDOWN: - if (bUndo) - pDoc->DeleteRow( aEffRange ); - else - pDoc->InsertRow( aEffRange ); + for( i=0; iDeleteRow( aEffRange.aStart.Col(), pTabs[i], aEffRange.aEnd.Col(), pTabs[i]+pScenarios[i], + aEffRange.aStart.Row(), static_cast(aEffRange.aEnd.Row()-aEffRange.aStart.Row()+1)); + else + pDoc->InsertRow( aEffRange.aStart.Col(), pTabs[i], aEffRange.aEnd.Col(), pTabs[i]+pScenarios[i], + aEffRange.aStart.Row(), static_cast(aEffRange.aEnd.Row()-aEffRange.aStart.Row()+1)); + } break; case INS_INSCOLS: case INS_CELLSRIGHT: - if (bUndo) - pDoc->DeleteCol( aEffRange ); - else - pDoc->InsertCol( aEffRange ); + for( i=0; iDeleteCol( aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i], + aEffRange.aStart.Col(), static_cast(aEffRange.aEnd.Col()-aEffRange.aStart.Col()+1)); + else + pDoc->InsertCol( aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i], + aEffRange.aStart.Col(), static_cast(aEffRange.aEnd.Col()-aEffRange.aStart.Col()+1)); + } break; default: { @@ -219,8 +235,16 @@ ScRange aWorkRange( aEffRange ); if ( eCmd == INS_CELLSRIGHT ) // only "shift right" requires refresh of the moved area aWorkRange.aEnd.SetCol(MAXCOL); - if ( pDoc->HasAttrib( aWorkRange, HASATTR_MERGED ) ) - pDoc->ExtendMerge( aWorkRange, TRUE ); + for( i=0; iHasAttrib( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), pTabs[i], + aWorkRange.aEnd.Col(), aWorkRange.aEnd.Row(), pTabs[i], HASATTR_MERGED ) ) + { + SCCOL nEndCol = aWorkRange.aEnd.Col(); + SCROW nEndRow = aWorkRange.aEnd.Row(); + pDoc->ExtendMerge( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), nEndCol, nEndRow, pTabs[i], TRUE ); + } + } //? Undo fuer herausgeschobene Attribute ? @@ -233,38 +257,48 @@ aWorkRange.aEnd.SetRow(MAXROW); break; case INS_CELLSDOWN: - aWorkRange.aEnd.SetRow(MAXROW); // bis ganz nach unten -/*A*/ if ( (pViewShell) && pViewShell->AdjustRowHeight( - aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), FALSE ) ) - { - aWorkRange.aStart.SetCol(0); - aWorkRange.aEnd.SetCol(MAXCOL); - nPaint |= PAINT_LEFT; - } + for( i=0; iAdjustRowHeight( aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), pTabs[i] )) + { + aWorkRange.aStart.SetCol(0); + aWorkRange.aEnd.SetCol(MAXCOL); + nPaint |= PAINT_LEFT; + } + } break; case INS_INSCOLS: nPaint |= PAINT_TOP; // obere Leiste + break; case INS_CELLSRIGHT: - aWorkRange.aEnd.SetCol(MAXCOL); // bis ganz nach rechts -/*A*/ if ( (pViewShell) && pViewShell->AdjustRowHeight( - aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), FALSE ) ) - { // AdjustDraw zeichnet PAINT_TOP nicht, - aWorkRange.aStart.SetCol(0); // daher so geloest - aWorkRange.aEnd.SetRow(MAXROW); - nPaint |= PAINT_LEFT; - } - break; + for( i=0; iAdjustRowHeight( aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), pTabs[i]) ) + { // AdjustDraw zeichnet PAINT_TOP nicht, + aWorkRange.aStart.SetCol(0); // daher so geloest + aWorkRange.aEnd.SetRow(MAXROW); + nPaint |= PAINT_LEFT; + } + } + break; default: { // added to avoid warnings } } - pDocShell->PostPaint( aWorkRange, nPaint ); + + for( i=0; iPostPaint( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), pTabs[i], + aWorkRange.aEnd.Col(), aWorkRange.aEnd.Row(), pTabs[i]+pScenarios[i], nPaint ); + } + pDocShell->PostDataChanged(); if (pViewShell) pViewShell->CellContentChanged(); - ShowTable( aEffRange.aStart.Tab() ); } void __EXPORT ScUndoInsertCells::Undo() @@ -319,10 +353,13 @@ // ScUndoDeleteCells::ScUndoDeleteCells( ScDocShell* pNewDocShell, - const ScRange& rRange, DelCellCmd eNewCmd, - ScDocument* pUndoDocument, ScRefUndoData* pRefData ) : + const ScRange& rRange, SCTAB nNewCount, SCTAB* pNewTabs, SCTAB* pNewScenarios, + DelCellCmd eNewCmd, ScDocument* pUndoDocument, ScRefUndoData* pRefData ) : ScMoveUndo( pNewDocShell, pUndoDocument, pRefData, SC_UNDO_REFLAST ), aEffRange( rRange ), + nCount( nNewCount ), + pTabs( pNewTabs ), + pScenarios( pNewScenarios ), eCmd( eNewCmd ) { if (eCmd == DEL_DELROWS) // gaze Zeilen? @@ -342,6 +379,8 @@ __EXPORT ScUndoDeleteCells::~ScUndoDeleteCells() { + delete []pTabs; + delete []pScenarios; } String __EXPORT ScUndoDeleteCells::GetComment() const @@ -362,6 +401,7 @@ void ScUndoDeleteCells::DoChange( const BOOL bUndo ) { ScDocument* pDoc = pDocShell->GetDocument(); + SCTAB i; if ( bUndo ) { @@ -372,28 +412,32 @@ else SetChangeTrack(); - // are there merged cells? - ScRange aWorkRange( aEffRange ); - if ( eCmd == DEL_CELLSLEFT ) // only "shift left" requires refresh of the moved area - aWorkRange.aEnd.SetCol(MAXCOL); - BOOL bMergeBefore = pDoc->HasAttrib( aWorkRange, HASATTR_MERGED ); - // Ausfuehren switch (eCmd) { case DEL_DELROWS: case DEL_CELLSUP: - if (bUndo) - pDoc->InsertRow( aEffRange ); - else - pDoc->DeleteRow( aEffRange ); + for( i=0; iInsertRow( aEffRange.aStart.Col(), pTabs[i], aEffRange.aEnd.Col(), pTabs[i]+pScenarios[i], + aEffRange.aStart.Row(), static_cast(aEffRange.aEnd.Row()-aEffRange.aStart.Row()+1)); + else + pDoc->DeleteRow( aEffRange.aStart.Col(), pTabs[i], aEffRange.aEnd.Col(), pTabs[i]+pScenarios[i], + aEffRange.aStart.Row(), static_cast(aEffRange.aEnd.Row()-aEffRange.aStart.Row()+1)); + } break; case DEL_DELCOLS: case DEL_CELLSLEFT: - if (bUndo) - pDoc->InsertCol( aEffRange ); - else - pDoc->DeleteCol( aEffRange ); + for( i=0; iInsertCol( aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i], + aEffRange.aStart.Col(), static_cast(aEffRange.aEnd.Col()-aEffRange.aStart.Col()+1)); + else + pDoc->DeleteCol( aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i], + aEffRange.aStart.Col(), static_cast(aEffRange.aEnd.Col()-aEffRange.aStart.Col()+1)); + } break; default: { @@ -402,35 +446,48 @@ } // bei Undo Referenzen wiederherstellen - if (bUndo) - pRefUndoDoc->CopyToDocument( aEffRange, IDF_ALL, FALSE, pDoc ); - + for( i=0; iCopyToDocument( aEffRange.aStart.Col(), aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Col(), aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i], + IDF_ALL, FALSE, pDoc ); + } //? Datenbank muss vor ExtendMerge sein ????? + // are there merged cells? + ScRange aWorkRange( aEffRange ); + if ( eCmd == DEL_CELLSLEFT ) // only "shift left" requires refresh of the moved area + aWorkRange.aEnd.SetCol(MAXCOL); - if ( bMergeBefore || pDoc->HasAttrib( aWorkRange, HASATTR_MERGED ) ) + for( i=0; iHasAttrib( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), pTabs[i], + aWorkRange.aEnd.Col(), aWorkRange.aEnd.Row(), pTabs[i], HASATTR_MERGED ) ) + { + // #i51445# old merge flag attributes must be deleted also for single cells, + // not only for whole columns/rows - if ( !bUndo ) - { - if ( eCmd==DEL_DELCOLS || eCmd==DEL_CELLSLEFT ) aWorkRange.aEnd.SetCol(MAXCOL); - if ( eCmd==DEL_DELROWS || eCmd==DEL_CELLSUP ) aWorkRange.aEnd.SetRow(MAXROW); - ScMarkData aMarkData; - aMarkData.SelectOneTable( aWorkRange.aStart.Tab() ); - ScPatternAttr aPattern( pDoc->GetPool() ); - aPattern.GetItemSet().Put( ScMergeFlagAttr() ); - pDoc->ApplyPatternArea( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), - aWorkRange.aEnd.Col(), aWorkRange.aEnd.Row(), - aMarkData, aPattern ); - } + if ( !bUndo ) + { + if ( eCmd==DEL_DELCOLS || eCmd==DEL_CELLSLEFT ) + aWorkRange.aEnd.SetCol(MAXCOL); + if ( eCmd==DEL_DELROWS || eCmd==DEL_CELLSUP ) + aWorkRange.aEnd.SetRow(MAXROW); + ScMarkData aMarkData; + aMarkData.SelectOneTable( aWorkRange.aStart.Tab() ); + ScPatternAttr aPattern( pDoc->GetPool() ); + aPattern.GetItemSet().Put( ScMergeFlagAttr() ); + pDoc->ApplyPatternArea( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), + aWorkRange.aEnd.Col(), aWorkRange.aEnd.Row(), + aMarkData, aPattern ); + } - pDoc->ExtendMerge( aWorkRange, TRUE ); - } + SCCOL nEndCol = aWorkRange.aEnd.Col(); + SCROW nEndRow = aWorkRange.aEnd.Row(); + pDoc->ExtendMerge( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), nEndCol, nEndRow, pTabs[i], TRUE ); + } + } // Zeichnen USHORT nPaint = PAINT_GRID; - ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); switch (eCmd) { case DEL_DELROWS: @@ -438,39 +495,48 @@ aWorkRange.aEnd.SetRow(MAXROW); break; case DEL_CELLSUP: - aWorkRange.aEnd.SetRow(MAXROW); -/*A*/ if ( (pViewShell) && pViewShell->AdjustRowHeight( - aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), FALSE ) ) - { - aWorkRange.aStart.SetCol(0); - aWorkRange.aEnd.SetCol(MAXCOL); - nPaint |= PAINT_LEFT; - } + for( i=0; iAdjustRowHeight( aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), pTabs[i] )) + { + aWorkRange.aStart.SetCol(0); + aWorkRange.aEnd.SetCol(MAXCOL); + nPaint |= PAINT_LEFT; + } + } break; case DEL_DELCOLS: nPaint |= PAINT_TOP; // obere Leiste + break; case DEL_CELLSLEFT: - aWorkRange.aEnd.SetCol(MAXCOL); // bis ganz nach rechts -/*A*/ if ( (pViewShell) && pViewShell->AdjustRowHeight( - aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), FALSE ) ) - { - aWorkRange.aStart.SetCol(0); - aWorkRange.aEnd.SetRow(MAXROW); - nPaint |= PAINT_LEFT; - } + for( i=0; iAdjustRowHeight( aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), pTabs[i] ) ) + { + aWorkRange.aStart.SetCol(0); + aWorkRange.aEnd.SetRow(MAXROW); + nPaint |= PAINT_LEFT; + } + } + break; default: { // added to avoid warnings } } - pDocShell->PostPaint( aWorkRange, nPaint, SC_PF_LINES ); //! auf Lines testen + + for( i=0; iPostPaint( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), pTabs[i], + aWorkRange.aEnd.Col(), aWorkRange.aEnd.Row(), pTabs[i]+pScenarios[i], nPaint, SC_PF_LINES ); + } // Markierung erst nach EndUndo pDocShell->PostDataChanged(); // CellContentChanged kommt mit der Markierung - - ShowTable( aEffRange.aStart.Tab() ); } void __EXPORT ScUndoDeleteCells::Undo() @@ -484,7 +550,12 @@ // Markierung erst nach EndUndo ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); if (pViewShell) - pViewShell->MarkRange( aEffRange ); + { + for( SCTAB i=0; iMarkRange( ScRange(aEffRange.aStart.Col(), aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Col(), aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i]) ); + } + } } void __EXPORT ScUndoDeleteCells::Redo()