? Doxyfile Index: source/ui/docshell/docfunc.cxx =================================================================== RCS file: /cvs/sc/sc/source/ui/docshell/docfunc.cxx,v retrieving revision 1.64 diff -u -p -r1.64 docfunc.cxx --- source/ui/docshell/docfunc.cxx 27 Feb 2007 13:06:47 -0000 1.64 +++ source/ui/docshell/docfunc.cxx 20 May 2007 12:54:48 -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,11 +1283,11 @@ 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 (pDoc->HasAttrib( nMergeTestStartX,nMergeTestStartY,nTab, + nMergeTestEndX,nMergeTestEndY,nTab, + HASATTR_MERGED | HASATTR_OVERLAPPED )) + { if (eCmd==INS_CELLSRIGHT) bNeedRefresh = TRUE; @@ -1302,25 +1302,26 @@ BOOL ScDocFunc::InsertCells( const ScRan 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; + // bNeedRefresh = TRUE; } - } + } - if (!bCanDo) - { - //! auf Verschieben (Drag&Drop) zurueckfuehren !!! - // "Kann nicht in zusammengefasste Bereiche einfuegen" + if (!bCanDo && (eCmd==INS_INSROWS || eCmd==INS_INSCOLS) ) + { + //! auf Verschieben (Drag&Drop) zurueckfuehren !!! + // "Kann nicht in zusammengefasste Bereiche einfuegen" if (!bApi) rDocShell.ErrorMessage(STR_MSSG_INSERTCELLS_0); return FALSE; - } + } + // // ausfuehren @@ -1342,6 +1343,25 @@ BOOL ScDocFunc::InsertCells( const ScRan pDoc->BeginDrawUndo(); } + // #i8302 : we unmerge overwhelming ranges, before insertion + std::queue qRange; + for (SCCOL i = nStartCol; i <= nEndCol; i++) + for (SCCOL j = nStartRow; j <= nEndRow; j++) + { + ScRange rRange (i, j, nTab); + pDoc->ExtendOverlapped(rRange); + pDoc->ExtendMerge(rRange); + // we can have merged range in the selection, + // so we take only those which are in the way + if (rRange.aStart.Col() < nStartCol || rRange.aEnd.Col() > nEndCol || + rRange.aStart.Row() < nStartRow || rRange.aEnd.Row() > nEndRow) + { + qRange.push(rRange); + UnmergeCells(rRange, TRUE, TRUE); + } + } + + switch (eCmd) { case INS_CELLSDOWN: @@ -1378,6 +1398,25 @@ BOOL ScDocFunc::InsertCells( const ScRan if ( bSuccess ) { + // #i8302 : we remerge overwhelming ranges, with the new part inserted + while( !qRange.empty() ) + { + ScRange rRange = qRange.front(); + switch (eCmd) + { + case INS_CELLSDOWN: + case INS_INSROWS: + rRange.aEnd.IncRow(static_cast(nEndRow-nStartRow+1)); + break; + case INS_CELLSRIGHT: + case INS_INSCOLS: + rRange.aEnd.IncCol(static_cast(nEndCol-nStartCol+1)); + break; + } + MergeCells(rRange, FALSE, TRUE, TRUE); + qRange.pop(); + } + if ( bRecord ) { rDocShell.GetUndoManager()->AddUndoAction( Index: source/ui/view/dbfunc3.cxx =================================================================== RCS file: /cvs/sc/sc/source/ui/view/dbfunc3.cxx,v retrieving revision 1.13 diff -u -p -r1.13 dbfunc3.cxx --- source/ui/view/dbfunc3.cxx 27 Feb 2007 13:49:45 -0000 1.13 +++ source/ui/view/dbfunc3.cxx 20 May 2007 12:54:48 -0000 @@ -405,7 +405,7 @@ void ScDBFunc::DoSubTotals( const ScSubT if (pDoc->HasAttrib( rParam.nCol1, rParam.nRow1+1, nTab, rParam.nCol2, rParam.nRow2, nTab, HASATTR_MERGED | HASATTR_OVERLAPPED )) - { + { ErrorMessage(STR_MSSG_INSERTCELLS_0); // nicht in zusammengefasste einfuegen return; }