Index: source/ui/docshell/docfunc.cxx =================================================================== RCS file: /cvs/sc/sc/source/ui/docshell/docfunc.cxx,v retrieving revision 1.66 diff -u -p -r1.66 docfunc.cxx --- source/ui/docshell/docfunc.cxx 27 Jun 2007 12:45:25 -0000 1.66 +++ source/ui/docshell/docfunc.cxx 14 Jul 2007 13:52:17 -0000 @@ -1212,7 +1212,7 @@ BOOL ScDocFunc::ApplyStyle( const ScMark } //------------------------------------------------------------------------ - +#include BOOL ScDocFunc::InsertCells( const ScRange& rRange, InsCellCmd eCmd, BOOL bRecord, BOOL bApi, BOOL bPartOfPaste ) { @@ -1283,44 +1283,8 @@ BOOL ScDocFunc::InsertCells( const ScRan rDocShell.ErrorMessage(aTester.GetMessageId()); 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; - } // // ausfuehren @@ -1342,6 +1306,30 @@ BOOL ScDocFunc::InsertCells( const ScRan pDoc->BeginDrawUndo(); } + // #i8302 : we unmerge overwhelming ranges, before insertion + // all the actions are put in the same ListAction + String aUndo = ScGlobal::GetRscString( STR_UNDO_RESIZEMATRIX ); + if (bRecord) + rDocShell.GetUndoManager()->EnterListAction( aUndo, aUndo ); + + std::queue qRange; + for (SCCOL i = nStartCol; i <= nEndCol; i++) + for (SCCOL j = nStartRow; j <= nEndRow; j++) + { + ScRange rrRange (i, j, nTab); + pDoc->ExtendOverlapped(rrRange); + pDoc->ExtendMerge(rrRange); + // we can have merged range in the selection, + // so we take only those which are in the way + if (rrRange.aStart.Col() < nStartCol || rrRange.aEnd.Col() > nEndCol || + rrRange.aStart.Row() < nStartRow || rrRange.aEnd.Row() > nEndRow) + { + qRange.push(rrRange); + UnmergeCells(rrRange, TRUE, TRUE); + } + } + + switch (eCmd) { case INS_CELLSDOWN: @@ -1370,6 +1358,7 @@ BOOL ScDocFunc::InsertCells( const ScRan nPaintEndX = MAXCOL; nPaintFlags |= PAINT_TOP; break; + case INS_NONE: default: DBG_ERROR("Falscher Code beim Einfuegen"); bSuccess = FALSE; @@ -1378,13 +1367,32 @@ BOOL ScDocFunc::InsertCells( const ScRan if ( bSuccess ) { + // #i8302 : we remerge overwhelming ranges, with the new part inserted + while( !qRange.empty() ) + { + ScRange rrRange = qRange.front(); + switch (eCmd) + { + case INS_CELLSDOWN: + case INS_INSROWS: + rrRange.aEnd.IncRow(static_cast(nEndRow-nStartRow+1)); + break; + case INS_CELLSRIGHT: + case INS_INSCOLS: + rrRange.aEnd.IncCol(static_cast(nEndCol-nStartCol+1)); + break; + } + MergeCells(rrRange, FALSE, TRUE, TRUE); + qRange.pop(); + } + if ( bRecord ) { rDocShell.GetUndoManager()->AddUndoAction( - new ScUndoInsertCells( &rDocShell, ScRange( - nStartCol,nStartRow,nStartTab, - nEndCol,nEndRow,nEndTab ), - eCmd, pRefUndoDoc, pUndoData, bPartOfPaste ) ); + new ScUndoInsertCells( &rDocShell, + ScRange(nStartCol, nStartRow, nStartTab, + nEndCol, nEndRow, nEndTab ), + eCmd, pRefUndoDoc, pUndoData, bPartOfPaste ) ); } if (bNeedRefresh) @@ -1416,6 +1424,10 @@ BOOL ScDocFunc::InsertCells( const ScRan nPaintEndX, nPaintEndY, nEndTab, nPaintFlags, nExtFlags); aModificator.SetDocumentModified(); + if (bRecord) + rDocShell.GetUndoManager()->LeaveListAction(); + + //! pDocSh->UpdateOle(GetViewData()); // muss an der View bleiben //! CellContentChanged(); // muss an der View bleiben