diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2014-02-05 00:07:21 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@collabora.com> | 2014-02-05 00:29:45 -0500 |
commit | bd9db38e4525474e6a35a91748a34ce473807075 (patch) | |
tree | 1899640ad8865f5c48ed531c2db552b6f9522271 /sc | |
parent | 21ab2ba866c8bea31cf2832d1c53227963a6010a (diff) |
Remove use of GetMark*Ranges() from DeleteMulti().
Change-Id: I4a17e5f0f1c81c968c821467f326a1c9b06a85a9
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/ui/inc/undoblk.hxx | 18 | ||||
-rw-r--r-- | sc/source/ui/undo/undoblk.cxx | 72 | ||||
-rw-r--r-- | sc/source/ui/view/viewfunc.cxx | 69 |
3 files changed, 81 insertions, 78 deletions
diff --git a/sc/source/ui/inc/undoblk.hxx b/sc/source/ui/inc/undoblk.hxx index 1b10216b3ebd..6dabb13e6f67 100644 --- a/sc/source/ui/inc/undoblk.hxx +++ b/sc/source/ui/inc/undoblk.hxx @@ -25,6 +25,7 @@ #include "spellparam.hxx" #include "cellmergeoption.hxx" #include "paramisc.hxx" +#include <columnspanset.hxx> #include <boost/shared_ptr.hpp> #include <boost/scoped_ptr.hpp> @@ -110,10 +111,12 @@ class ScUndoDeleteMulti: public ScMoveUndo { public: TYPEINFO(); - ScUndoDeleteMulti( ScDocShell* pNewDocShell, - sal_Bool bNewRows, sal_Bool bNeedsRefresh, SCTAB nNewTab, - const SCCOLROW* pRng, SCCOLROW nRngCnt, - ScDocument* pUndoDocument, ScRefUndoData* pRefData ); + + ScUndoDeleteMulti( ScDocShell* pNewDocShell, + bool bNewRows, bool bNeedsRefresh, SCTAB nNewTab, + const std::vector<sc::ColRowSpan>& rSpans, + ScDocument* pUndoDocument, ScRefUndoData* pRefData ); + virtual ~ScUndoDeleteMulti(); virtual void Undo(); @@ -124,11 +127,10 @@ public: virtual OUString GetComment() const; private: - sal_Bool bRows; - sal_Bool bRefresh; + bool mbRows:1; + bool mbRefresh:1; SCTAB nTab; - SCCOLROW* pRanges; - SCCOLROW nRangeCnt; + std::vector<sc::ColRowSpan> maSpans; sal_uLong nStartChangeAction; sal_uLong nEndChangeAction; diff --git a/sc/source/ui/undo/undoblk.cxx b/sc/source/ui/undo/undoblk.cxx index 5b8643c1742b..a6222582b23f 100644 --- a/sc/source/ui/undo/undoblk.cxx +++ b/sc/source/ui/undo/undoblk.cxx @@ -554,24 +554,22 @@ bool ScUndoDeleteCells::CanRepeat(SfxRepeatTarget& rTarget) const } // delete cells in multiselection -ScUndoDeleteMulti::ScUndoDeleteMulti( ScDocShell* pNewDocShell, - sal_Bool bNewRows, sal_Bool bNeedsRefresh, SCTAB nNewTab, - const SCCOLROW* pRng, SCCOLROW nRngCnt, - ScDocument* pUndoDocument, ScRefUndoData* pRefData ) : +ScUndoDeleteMulti::ScUndoDeleteMulti( + ScDocShell* pNewDocShell, + bool bNewRows, bool bNeedsRefresh, SCTAB nNewTab, + const std::vector<sc::ColRowSpan>& rSpans, + ScDocument* pUndoDocument, ScRefUndoData* pRefData ) : ScMoveUndo( pNewDocShell, pUndoDocument, pRefData, SC_UNDO_REFLAST ), - bRows( bNewRows ), - bRefresh( bNeedsRefresh ), + mbRows(bNewRows), + mbRefresh(bNeedsRefresh), nTab( nNewTab ), - nRangeCnt( nRngCnt ) + maSpans(rSpans) { - pRanges = new SCCOLROW[ 2 * nRangeCnt ]; - memcpy(pRanges,pRng,nRangeCnt*2*sizeof(SCCOLROW)); SetChangeTrack(); } ScUndoDeleteMulti::~ScUndoDeleteMulti() { - delete [] pRanges; } OUString ScUndoDeleteMulti::GetComment() const @@ -584,20 +582,20 @@ void ScUndoDeleteMulti::DoChange() const SCCOL nStartCol; SCROW nStartRow; sal_uInt16 nPaint; - if (bRows) + if (mbRows) { nStartCol = 0; - nStartRow = static_cast<SCROW>(pRanges[0]); + nStartRow = static_cast<SCROW>(maSpans[0].mnStart); nPaint = PAINT_GRID | PAINT_LEFT; } else { - nStartCol = static_cast<SCCOL>(pRanges[0]); + nStartCol = static_cast<SCCOL>(maSpans[0].mnStart); nStartRow = 0; nPaint = PAINT_GRID | PAINT_TOP; } - if ( bRefresh ) + if (mbRefresh) { ScDocument* pDoc = pDocShell->GetDocument(); SCCOL nEndCol = MAXCOL; @@ -622,17 +620,17 @@ void ScUndoDeleteMulti::SetChangeTrack() { nStartChangeAction = pChangeTrack->GetActionMax() + 1; ScRange aRange( 0, 0, nTab, 0, 0, nTab ); - if ( bRows ) + if (mbRows) aRange.aEnd.SetCol( MAXCOL ); else aRange.aEnd.SetRow( MAXROW ); // delete in reverse - SCCOLROW* pOneRange = &pRanges[2*nRangeCnt]; - for ( SCCOLROW nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++ ) + std::vector<sc::ColRowSpan>::const_reverse_iterator ri = maSpans.rbegin(), riEnd = maSpans.rend(); + for (; ri != riEnd; ++ri) { - SCCOLROW nEnd = *(--pOneRange); - SCCOLROW nStart = *(--pOneRange); - if ( bRows ) + SCCOLROW nEnd = ri->mnEnd; + SCCOLROW nStart = ri->mnStart; + if (mbRows) { aRange.aStart.SetRow( nStart ); aRange.aEnd.SetRow( nEnd ); @@ -657,27 +655,25 @@ void ScUndoDeleteMulti::Undo() BeginUndo(); ScDocument* pDoc = pDocShell->GetDocument(); - SCCOLROW* pOneRange; - SCCOLROW nRangeNo; // reverse delete -> forward insert - pOneRange = pRanges; - for (nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++) + std::vector<sc::ColRowSpan>::const_iterator it = maSpans.begin(), itEnd = maSpans.end(); + for (; it != itEnd; ++it) { - SCCOLROW nStart = *(pOneRange++); - SCCOLROW nEnd = *(pOneRange++); - if (bRows) + SCCOLROW nStart = it->mnStart; + SCCOLROW nEnd = it->mnEnd; + if (mbRows) pDoc->InsertRow( 0,nTab, MAXCOL,nTab, nStart,static_cast<SCSIZE>(nEnd-nStart+1) ); else pDoc->InsertCol( 0,nTab, MAXROW,nTab, static_cast<SCCOL>(nStart), static_cast<SCSIZE>(nEnd-nStart+1) ); } - pOneRange = pRanges; - for (nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++) + it = maSpans.begin(); + for (; it != itEnd; ++it) { - SCCOLROW nStart = *(pOneRange++); - SCCOLROW nEnd = *(pOneRange++); - if (bRows) + SCCOLROW nStart = it->mnStart; + SCCOLROW nEnd = it->mnEnd; + if (mbRows) pRefUndoDoc->CopyToDocument( 0,nStart,nTab, MAXCOL,nEnd,nTab, IDF_ALL,false,pDoc ); else pRefUndoDoc->CopyToDocument( static_cast<SCCOL>(nStart),0,nTab, @@ -704,13 +700,13 @@ void ScUndoDeleteMulti::Redo() ScDocument* pDoc = pDocShell->GetDocument(); - // reverese delet - SCCOLROW* pOneRange = &pRanges[2*nRangeCnt]; - for (SCCOLROW nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++) + // reverese delete + std::vector<sc::ColRowSpan>::const_reverse_iterator ri = maSpans.rbegin(), riEnd = maSpans.rend(); + for (; ri != riEnd; ++ri) { - SCCOLROW nEnd = *(--pOneRange); - SCCOLROW nStart = *(--pOneRange); - if (bRows) + SCCOLROW nEnd = ri->mnEnd; + SCCOLROW nStart = ri->mnStart; + if (mbRows) pDoc->DeleteRow( 0,nTab, MAXCOL,nTab, nStart,static_cast<SCSIZE>(nEnd-nStart+1) ); else pDoc->DeleteCol( 0,nTab, MAXROW,nTab, static_cast<SCCOL>(nStart), static_cast<SCSIZE>(nEnd-nStart+1) ); diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx index 982a17c00a99..1404d5b2cf39 100644 --- a/sc/source/ui/view/viewfunc.cxx +++ b/sc/source/ui/view/viewfunc.cxx @@ -1580,27 +1580,29 @@ void ScViewFunc::DeleteMulti( bool bRows, bool bRecord ) ScMarkData aFuncMark( GetViewData()->GetMarkData() ); // local copy for UnmarkFiltered ScViewUtil::UnmarkFiltered( aFuncMark, pDoc ); - if (bRecord && !pDoc->IsUndoEnabled()) + if (!pDoc->IsUndoEnabled()) bRecord = false; - SCCOLROW* pRanges = new SCCOLROW[MAXCOLROWCOUNT]; - SCCOLROW nRangeCnt = bRows ? aFuncMark.GetMarkRowRanges( pRanges ) : - aFuncMark.GetMarkColumnRanges( pRanges ); - if (nRangeCnt == 0) + + std::vector<sc::ColRowSpan> aSpans; + if (bRows) + aSpans = aFuncMark.GetMarkedRowSpans(); + else + aSpans = aFuncMark.GetMarkedColSpans(); + + if (aSpans.empty()) { - pRanges[0] = pRanges[1] = bRows ? static_cast<SCCOLROW>(GetViewData()->GetCurY()) : static_cast<SCCOLROW>(GetViewData()->GetCurX()); - nRangeCnt = 1; + SCCOLROW nCurPos = bRows ? GetViewData()->GetCurY() : GetViewData()->GetCurX(); + aSpans.push_back(sc::ColRowSpan(nCurPos, nCurPos)); } // test if allowed - SCCOLROW* pOneRange = pRanges; sal_uInt16 nErrorId = 0; bool bNeedRefresh = false; - SCCOLROW nRangeNo; - for (nRangeNo=0; nRangeNo<nRangeCnt && !nErrorId; nRangeNo++) + for (size_t i = 0, n = aSpans.size(); i < n && !nErrorId; ++i) { - SCCOLROW nStart = *(pOneRange++); - SCCOLROW nEnd = *(pOneRange++); + SCCOLROW nStart = aSpans[i].mnStart; + SCCOLROW nEnd = aSpans[i].mnEnd; SCCOL nStartCol, nEndCol; SCROW nStartRow, nEndRow; @@ -1620,7 +1622,7 @@ void ScViewFunc::DeleteMulti( bool bRows, bool bRecord ) } // cell protection (only needed for first range, as all following cells are moved) - if ( nRangeNo == 0 ) + if (i == 0) { // test to the end of the sheet ScEditableTester aTester( pDoc, nTab, nStartCol, nStartRow, MAXCOL, MAXROW ); @@ -1654,7 +1656,6 @@ void ScViewFunc::DeleteMulti( bool bRows, bool bRecord ) if ( nErrorId ) { ErrorMessage( nErrorId ); - delete[] pRanges; return; } @@ -1669,11 +1670,10 @@ void ScViewFunc::DeleteMulti( bool bRows, bool bRecord ) pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); pUndoDoc->InitUndo( pDoc, nTab, nTab, !bRows, bRows ); // row height - pOneRange = pRanges; - for (nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++) + for (size_t i = 0, n = aSpans.size(); i < n; ++i) { - SCCOLROW nStart = *(pOneRange++); - SCCOLROW nEnd = *(pOneRange++); + SCCOLROW nStart = aSpans[i].mnStart; + SCCOLROW nEnd = aSpans[i].mnEnd; if (bRows) pDoc->CopyToDocument( 0,nStart,nTab, MAXCOL,nEnd,nTab, IDF_ALL,false,pUndoDoc ); else @@ -1692,11 +1692,11 @@ void ScViewFunc::DeleteMulti( bool bRows, bool bRecord ) pDoc->BeginDrawUndo(); } - pOneRange = &pRanges[2*nRangeCnt]; // backwards - for (nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++) + std::vector<sc::ColRowSpan>::const_reverse_iterator ri = aSpans.rbegin(), riEnd = aSpans.rend(); + for (; ri != riEnd; ++ri) { - SCCOLROW nEnd = *(--pOneRange); - SCCOLROW nStart = *(--pOneRange); + SCCOLROW nEnd = ri->mnEnd; + SCCOLROW nStart = ri->mnStart; if (bRows) pDoc->DeleteRow( 0,nTab, MAXCOL,nTab, nStart, static_cast<SCSIZE>(nEnd-nStart+1) ); @@ -1706,7 +1706,7 @@ void ScViewFunc::DeleteMulti( bool bRows, bool bRecord ) if (bNeedRefresh) { - SCCOLROW nFirstStart = pRanges[0]; + SCCOLROW nFirstStart = aSpans[0].mnStart; SCCOL nStartCol = bRows ? 0 : static_cast<SCCOL>(nFirstStart); SCROW nStartRow = bRows ? static_cast<SCROW>(nFirstStart) : 0; SCCOL nEndCol = MAXCOL; @@ -1719,17 +1719,24 @@ void ScViewFunc::DeleteMulti( bool bRows, bool bRecord ) if (bRecord) { pDocSh->GetUndoManager()->AddUndoAction( - new ScUndoDeleteMulti( pDocSh, bRows, bNeedRefresh, nTab, pRanges, nRangeCnt, - pUndoDoc, pUndoData ) ); + new ScUndoDeleteMulti( + pDocSh, bRows, bNeedRefresh, nTab, aSpans, pUndoDoc, pUndoData)); } if (!AdjustRowHeight(0, MAXROW)) { if (bRows) - pDocSh->PostPaint( 0,pRanges[0],nTab, MAXCOL,MAXROW,nTab, PAINT_GRID | PAINT_LEFT ); + { + pDocSh->PostPaint( + 0, aSpans[0].mnStart, nTab, + MAXCOL, MAXROW, nTab, (PAINT_GRID | PAINT_LEFT)); + } else - pDocSh->PostPaint( static_cast<SCCOL>(pRanges[0]),0,nTab, - MAXCOL,MAXROW,nTab, PAINT_GRID | PAINT_TOP ); + { + pDocSh->PostPaint( + static_cast<SCCOL>(aSpans[0].mnStart), 0, nTab, + MAXCOL, MAXROW, nTab, (PAINT_GRID | PAINT_TOP)); + } } ResetAutoSpell(); @@ -1741,13 +1748,11 @@ void ScViewFunc::DeleteMulti( bool bRows, bool bRecord ) SCCOL nCurX = GetViewData()->GetCurX(); SCROW nCurY = GetViewData()->GetCurY(); if ( bRows ) - nCurY = pRanges[0]; + nCurY = aSpans[0].mnStart; else - nCurX = static_cast<SCCOL>(pRanges[0]); + nCurX = static_cast<SCCOL>(aSpans[0].mnStart); SetCursor( nCurX, nCurY ); - delete[] pRanges; - SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) ); } |