summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2014-02-05 00:07:21 -0500
committerKohei Yoshida <kohei.yoshida@collabora.com>2014-02-05 00:29:45 -0500
commitbd9db38e4525474e6a35a91748a34ce473807075 (patch)
tree1899640ad8865f5c48ed531c2db552b6f9522271
parent21ab2ba866c8bea31cf2832d1c53227963a6010a (diff)
Remove use of GetMark*Ranges() from DeleteMulti().
Change-Id: I4a17e5f0f1c81c968c821467f326a1c9b06a85a9
-rw-r--r--sc/source/ui/inc/undoblk.hxx18
-rw-r--r--sc/source/ui/undo/undoblk.cxx72
-rw-r--r--sc/source/ui/view/viewfunc.cxx69
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 ) );
}