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-25 17:18:52.000000000 +0800 @@ -1218,7 +1218,7 @@ //------------------------------------------------------------------------ -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 ); @@ -1236,7 +1236,6 @@ return FALSE; } - SCTAB nTab = nStartTab; ScDocument* pDoc = rDocShell.GetDocument(); SCTAB nTabCount = pDoc->GetTableCount(); SCCOL nPaintStartX = nStartCol; @@ -1249,12 +1248,20 @@ 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 + { + for(SCTAB nTab=nStartTab; nTab<=nTabCount; nTab++) + aMark.SelectTable( nTab, TRUE ); + } - // Test zusammengefasste + SCTAB nSelCount = aMark.GetSelectCount(); + SCTAB i; + + // zugehoerige Szenarien auch anpassen + // Test zusammengefasste SCCOL nMergeTestStartX = nStartCol; SCROW nMergeTestStartY = nStartRow; @@ -1281,7 +1288,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, aMark ); if (!aTester.IsEditable()) { if (!bApi) @@ -1289,43 +1296,47 @@ 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; - } - } - - if (!bCanDo) - { - //! auf Verschieben (Drag&Drop) zurueckfuehren !!! - // "Kann nicht in zusammengefasste Bereiche einfuegen" - if (!bApi) - rDocShell.ErrorMessage(STR_MSSG_INSERTCELLS_0); - return FALSE; - } + for( i=0; iHasAttrib( 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; + + 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 ? + + 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; + } + } + } // // ausfuehren @@ -1350,26 +1361,66 @@ 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 +1434,66 @@ 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 ) ); - } - - if (bNeedRefresh) - pDoc->ExtendMerge( nMergeTestStartX,nMergeTestStartY, - nMergeTestEndX,nMergeTestEndY, nTab, TRUE ); - else - pDoc->RefreshAutoFilter( nMergeTestStartX,nMergeTestStartY, - nMergeTestEndX,nMergeTestEndY, nTab); - - if ( eCmd == INS_INSROWS || eCmd == INS_INSCOLS ) - pDoc->UpdatePageBreaks( nTab ); - - USHORT nExtFlags = 0; - rDocShell.UpdatePaintExt( nExtFlags, nPaintStartX,nPaintStartY,nTab, nPaintEndX,nPaintEndY,nTab ); + 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 ) ); } - 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 + 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 ); + + SCTAB nScenarioCount = 0; + + for( SCTAB j = i+1; jGetTableCount(); SCCOL nPaintStartX = nStartCol; @@ -1464,10 +1534,17 @@ 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 + { + for(SCTAB nTab=nStartTab; nTab<=nTabCount; nTab++) + aMark.SelectTable( nTab, TRUE ); + } + + SCTAB nSelCount = aMark.GetSelectCount(); + SCTAB i; SCCOL nUndoStartX = nStartCol; SCROW nUndoStartY = nStartRow; @@ -1488,10 +1565,12 @@ // 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) @@ -1506,42 +1585,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 @@ -1558,10 +1643,21 @@ // 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; iCopyToDocument( nUndoStartX, nUndoStartY, i, nUndoEndX, nUndoEndY, i+nScenarioCount, + IDF_ALL, FALSE, pUndoDoc ); + } + } + pRefUndoDoc = new ScDocument( SCDOCMODE_UNDO ); pRefUndoDoc->InitUndo( pDoc, 0, nTabCount-1, FALSE, FALSE ); @@ -1571,32 +1667,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 +1751,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 +1760,27 @@ // 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,46 +1788,58 @@ // #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 ); - - ScRange aMergedRange( nUndoStartX, nUndoStartY, nStartTab, nMergeTestEndX, nMergeTestEndY, nEndTab ); - pDoc->ExtendMerge( aMergedRange, TRUE ); - } - - if ( eCmd == DEL_DELCOLS || eCmd == DEL_DELROWS ) - pDoc->UpdatePageBreaks( nTab ); - - rDocShell.UpdatePaintExt( nExtFlags, nPaintStartX,nPaintStartY,nTab, nPaintEndX,nPaintEndY,nTab ); - - // 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 ); + pDoc->ApplyPatternArea( nUndoStartX, nUndoStartY, nMergeTestEndX, nMergeTestEndY, aMark, aPattern ); + + for( i=0; iExtendMerge( aMergedRange, TRUE ); + } + } } - aModificator.SetDocumentModified(); -//! pDocSh->UpdateOle(GetViewData()); // muss an der View bleiben -//! CellContentChanged(); // muss an der View bleiben + for( i=0; iUpdatePageBreaks( i ); + + rDocShell.UpdatePaintExt( nExtFlags, nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i ); + + SCTAB nScenarioCount = 0; + + for( SCTAB j = i+1; jBroadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) ); diff -uNr old/sc/source/ui/docshell/docsh3.cxx new/sc/source/ui/docshell/docsh3.cxx --- old/sc/source/ui/docshell/docsh3.cxx 2008-02-15 16:55:56.000000000 +0800 +++ new/sc/source/ui/docshell/docsh3.cxx 2008-08-25 17:19:18.000000000 +0800 @@ -979,10 +979,10 @@ } 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 ); @@ -993,7 +993,7 @@ if ( pDel->IsTopDelete() ) { aSourceRange = pDel->GetOverAllRange().MakeRange(); - GetDocFunc().DeleteCells( aSourceRange, DEL_DELROWS, TRUE, FALSE ); + GetDocFunc().DeleteCells( aSourceRange, NULL, DEL_DELROWS, TRUE, FALSE ); } } break; @@ -1003,7 +1003,7 @@ 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; diff -uNr old/sc/source/ui/inc/docfunc.hxx new/sc/source/ui/inc/docfunc.hxx --- old/sc/source/ui/inc/docfunc.hxx 2008-02-15 16:55:58.000000000 +0800 +++ new/sc/source/ui/inc/docfunc.hxx 2008-08-25 17:19:56.000000000 +0800 @@ -113,9 +113,11 @@ BOOL ApplyStyle( const ScMarkData& rMark, const String& rStyleName, BOOL bRecord, BOOL bApi ); - BOOL InsertCells( const ScRange& rRange, InsCellCmd eCmd, BOOL bRecord, BOOL bApi, + BOOL InsertCells( const ScRange& rRange,const ScMarkData* pTabMark, + InsCellCmd eCmd, BOOL bRecord, BOOL bApi, BOOL bPartOfPaste = FALSE ); - BOOL DeleteCells( const ScRange& rRange, DelCellCmd eCmd, BOOL bRecord, BOOL bApi ); + BOOL DeleteCells( const ScRange& rRange, const ScMarkData* pTabMark, + DelCellCmd eCmd, BOOL bRecord, BOOL bApi ); BOOL MoveBlock( const ScRange& rSource, const ScAddress& rDestPos, BOOL bCut, BOOL bRecord, BOOL bPaint, BOOL bApi ); 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-25 17:20:20.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-25 17:22:00.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,18 +204,28 @@ { case INS_INSROWS: case INS_CELLSDOWN: - if (bUndo) - pDoc->DeleteRow( aEffRange ); - else - pDoc->InsertRow( aEffRange ); - break; + 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 ); - break; + 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: { // added to avoid warnings @@ -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,45 @@ 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; - } - break; + 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 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 +350,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 +376,8 @@ __EXPORT ScUndoDeleteCells::~ScUndoDeleteCells() { + delete []pTabs; + delete []pScenarios; } String __EXPORT ScUndoDeleteCells::GetComment() const @@ -362,6 +398,7 @@ void ScUndoDeleteCells::DoChange( const BOOL bUndo ) { ScDocument* pDoc = pDocShell->GetDocument(); + SCTAB i; if ( bUndo ) { @@ -372,29 +409,33 @@ 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 ); - break; + 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 ); - break; + 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: { // added to avoid warnings @@ -402,35 +443,47 @@ } // 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 ????? + 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 +491,46 @@ 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; - } - break; + 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 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() @@ -482,9 +542,14 @@ SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) ); // Markierung erst nach EndUndo - ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); - if (pViewShell) - pViewShell->MarkRange( aEffRange ); + ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); + if (pViewShell) + { + 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() diff -uNr old/sc/source/ui/unoobj/cellsuno.cxx new/sc/source/ui/unoobj/cellsuno.cxx --- old/sc/source/ui/unoobj/cellsuno.cxx 2008-02-15 16:56:04.000000000 +0800 +++ new/sc/source/ui/unoobj/cellsuno.cxx 2008-08-25 17:22:36.000000000 +0800 @@ -7237,7 +7237,7 @@ ScRange aScRange; ScUnoConversion::FillScRange( aScRange, rRangeAddress ); ScDocFunc aFunc(*pDocSh); - aFunc.InsertCells( aScRange, eCmd, TRUE, TRUE ); + aFunc.InsertCells( aScRange, NULL, eCmd, TRUE, TRUE ); } } } @@ -7269,7 +7269,7 @@ ScRange aScRange; ScUnoConversion::FillScRange( aScRange, rRangeAddress ); ScDocFunc aFunc(*pDocSh); - aFunc.DeleteCells( aScRange, eCmd, TRUE, TRUE ); + aFunc.DeleteCells( aScRange, NULL, eCmd, TRUE, TRUE ); } } } diff -uNr old/sc/source/ui/unoobj/docuno.cxx new/sc/source/ui/unoobj/docuno.cxx --- old/sc/source/ui/unoobj/docuno.cxx 2008-02-15 16:56:04.000000000 +0800 +++ new/sc/source/ui/unoobj/docuno.cxx 2008-08-25 17:22:56.000000000 +0800 @@ -2334,7 +2334,7 @@ ScDocFunc aFunc(*pDocShell); ScRange aRange( (SCCOL)(nStartCol+nPosition), 0, nTab, (SCCOL)(nStartCol+nPosition+nCount-1), MAXROW, nTab ); - bDone = aFunc.InsertCells( aRange, INS_INSCOLS, TRUE, TRUE ); + bDone = aFunc.InsertCells( aRange, NULL, INS_INSCOLS, TRUE, TRUE ); } if (!bDone) throw uno::RuntimeException(); // no other exceptions specified @@ -2351,7 +2351,7 @@ ScDocFunc aFunc(*pDocShell); ScRange aRange( (SCCOL)(nStartCol+nIndex), 0, nTab, (SCCOL)(nStartCol+nIndex+nCount-1), MAXROW, nTab ); - bDone = aFunc.DeleteCells( aRange, DEL_DELCOLS, TRUE, TRUE ); + bDone = aFunc.DeleteCells( aRange, NULL, DEL_DELCOLS, TRUE, TRUE ); } if (!bDone) throw uno::RuntimeException(); // no other exceptions specified @@ -2599,7 +2599,7 @@ ScDocFunc aFunc(*pDocShell); ScRange aRange( 0, (SCROW)(nStartRow+nPosition), nTab, MAXCOL, (SCROW)(nStartRow+nPosition+nCount-1), nTab ); - bDone = aFunc.InsertCells( aRange, INS_INSROWS, TRUE, TRUE ); + bDone = aFunc.InsertCells( aRange, NULL, INS_INSROWS, TRUE, TRUE ); } if (!bDone) throw uno::RuntimeException(); // no other exceptions specified @@ -2616,7 +2616,7 @@ ScDocFunc aFunc(*pDocShell); ScRange aRange( 0, (SCROW)(nStartRow+nIndex), nTab, MAXCOL, (SCROW)(nStartRow+nIndex+nCount-1), nTab ); - bDone = aFunc.DeleteCells( aRange, DEL_DELROWS, TRUE, TRUE ); + bDone = aFunc.DeleteCells( aRange, NULL, DEL_DELROWS, TRUE, TRUE ); } if (!bDone) throw uno::RuntimeException(); // no other exceptions specified diff -uNr old/sc/source/ui/view/gridwin.cxx new/sc/source/ui/view/gridwin.cxx --- old/sc/source/ui/view/gridwin.cxx 2008-02-15 16:56:06.000000000 +0800 +++ new/sc/source/ui/view/gridwin.cxx 2008-08-25 17:23:20.000000000 +0800 @@ -3744,7 +3744,7 @@ if ( meDragInsertMode != INS_NONE ) { // call with bApi = TRUE to avoid error messages in drop handler - bDone = pDocSh->GetDocFunc().InsertCells( aDest, meDragInsertMode, TRUE /*bRecord*/, TRUE /*bApi*/, TRUE /*bPartOfPaste*/ ); + bDone = pDocSh->GetDocFunc().InsertCells( aDest, NULL, meDragInsertMode, TRUE /*bRecord*/, TRUE /*bApi*/, TRUE /*bPartOfPaste*/ ); if ( bDone ) { if ( nThisTab == nSourceTab ) @@ -3795,7 +3795,7 @@ ( eCmd == DEL_CELLSLEFT && nDestPosY == aSource.aStart.Row() ) ) { // call with bApi = TRUE to avoid error messages in drop handler - bDone = pDocSh->GetDocFunc().DeleteCells( aSource, eCmd, TRUE /*bRecord*/, TRUE /*bApi*/ ); + bDone = pDocSh->GetDocFunc().DeleteCells( aSource, NULL, eCmd, TRUE /*bRecord*/, TRUE /*bApi*/ ); if ( bDone ) { if ( eCmd == DEL_CELLSUP && nDestPosY > aSource.aEnd.Row() ) @@ -3881,7 +3881,7 @@ if ( meDragInsertMode != INS_NONE ) { // call with bApi = TRUE to avoid error messages in drop handler - bDone = pDocSh->GetDocFunc().InsertCells( aDest, meDragInsertMode, TRUE /*bRecord*/, TRUE /*bApi*/, TRUE /*bPartOfPaste*/ ); + bDone = pDocSh->GetDocFunc().InsertCells( aDest, NULL, meDragInsertMode, TRUE /*bRecord*/, TRUE /*bApi*/, TRUE /*bPartOfPaste*/ ); if ( bDone ) { pDocSh->UpdateOle( pViewData ); @@ -3933,7 +3933,7 @@ if ( meDragInsertMode != INS_NONE ) { // call with bApi = TRUE to avoid error messages in drop handler - bDone = pDocSh->GetDocFunc().InsertCells( aDest, meDragInsertMode, TRUE /*bRecord*/, TRUE /*bApi*/, TRUE /*bPartOfPaste*/ ); + bDone = pDocSh->GetDocFunc().InsertCells( aDest, NULL, meDragInsertMode, TRUE /*bRecord*/, TRUE /*bApi*/, TRUE /*bPartOfPaste*/ ); if ( bDone ) { pDocSh->UpdateOle( pViewData ); diff -uNr old/sc/source/ui/view/viewfunc.cxx new/sc/source/ui/view/viewfunc.cxx --- old/sc/source/ui/view/viewfunc.cxx 2008-02-15 16:56:04.000000000 +0800 +++ new/sc/source/ui/view/viewfunc.cxx 2008-08-25 17:23:40.000000000 +0800 @@ -1556,7 +1556,8 @@ if (GetViewData()->GetSimpleArea(aRange)) { ScDocShell* pDocSh = GetViewData()->GetDocShell(); - BOOL bSuccess = pDocSh->GetDocFunc().InsertCells( aRange, eCmd, bRecord, FALSE, bPartOfPaste ); + const ScMarkData& rMark = GetViewData()->GetMarkData(); + BOOL bSuccess = pDocSh->GetDocFunc().InsertCells( aRange, &rMark, eCmd, bRecord, FALSE, bPartOfPaste ); if (bSuccess) { pDocSh->UpdateOle(GetViewData()); @@ -1580,7 +1581,8 @@ !ScViewUtil::HasFiltered( aRange, GetViewData()->GetDocument() ) ) { ScDocShell* pDocSh = GetViewData()->GetDocShell(); - pDocSh->GetDocFunc().DeleteCells( aRange, eCmd, bRecord, FALSE ); + const ScMarkData& rMark = GetViewData()->GetMarkData(); + pDocSh->GetDocFunc().DeleteCells( aRange, &rMark, eCmd, bRecord, FALSE ); pDocSh->UpdateOle(GetViewData()); CellContentChanged();