summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2013-12-17 16:11:52 -0500
committerKohei Yoshida <kohei.yoshida@collabora.com>2013-12-18 10:13:31 -0500
commitdf63ec609f361108bc1e531e1454734f6c03258e (patch)
treeeb8118e316ed7c285014fb725cdb8df08fedb65e
parentd76bc6b5c719e525cd262ade54c3e99a7644acf2 (diff)
Only keep track of current row position, not a whole range.
Change-Id: I8ad56284b9c5422d102c7e8688e5b1e4c37ae877
-rw-r--r--sc/source/ui/docshell/datastream.cxx118
-rw-r--r--sc/source/ui/inc/datastream.hxx4
2 files changed, 62 insertions, 60 deletions
diff --git a/sc/source/ui/docshell/datastream.cxx b/sc/source/ui/docshell/datastream.cxx
index 423ce0740ad8..f053371a2c1c 100644
--- a/sc/source/ui/docshell/datastream.cxx
+++ b/sc/source/ui/docshell/datastream.cxx
@@ -188,9 +188,9 @@ DataStream* DataStream::Set(ScDocShell *pShell, const OUString& rURL, const OUSt
sfx2::SvBaseLink* pBase = *pLinkManager->GetLinks()[nLinkPos];
if (rRange.isEmpty())
{
- if ( (pBase->ISA(ScAreaLink) && dynamic_cast<ScAreaLink*>
+ if ( (pBase->ISA(ScAreaLink) && static_cast<ScAreaLink*>
(&(*pBase))->GetDestArea().aStart == aDestArea.aStart)
- || (pBase->ISA(DataStream) && dynamic_cast<DataStream*>
+ || (pBase->ISA(DataStream) && static_cast<DataStream*>
(&(*pBase))->GetRange().aStart == aDestArea.aStart) )
{
aDestArea.Move(0, 1, 0);
@@ -200,9 +200,9 @@ DataStream* DataStream::Set(ScDocShell *pShell, const OUString& rURL, const OUSt
else
++nLinkPos;
}
- else if ( (pBase->ISA(ScAreaLink) && dynamic_cast<ScAreaLink*>
+ else if ( (pBase->ISA(ScAreaLink) && static_cast<ScAreaLink*>
(&(*pBase))->GetDestArea().aStart == aDestArea.aStart)
- || (pBase->ISA(DataStream) && dynamic_cast<DataStream*>
+ || (pBase->ISA(DataStream) && static_cast<DataStream*>
(&(*pBase))->GetRange().aStart == aDestArea.aStart) )
{
pLinkManager->Remove( pBase );
@@ -225,7 +225,8 @@ DataStream::DataStream(ScDocShell *pShell, const OUString& rURL, const ScRange&
mbRunning(false),
mpLines(0),
mnLinesCount(0),
- mnRepaintCounter(0)
+ mnRepaintCounter(0),
+ mnCurRow(0)
{
mxThread = new datastreams::CallerThread( this );
mxThread->launch();
@@ -270,6 +271,14 @@ OString DataStream::ConsumeLine()
return mpLines->at(mnLinesCount++);
}
+ScRange DataStream::GetRange() const
+{
+ ScRange aRange = maStartRange;
+ if (mpEndRange)
+ aRange.aEnd = mpEndRange->aEnd;
+ return aRange;
+}
+
void DataStream::Decode(const OUString& rURL, const ScRange& rRange,
sal_Int32 nLimit, const OUString& rMove, const sal_uInt32 nSettings)
{
@@ -288,15 +297,17 @@ void DataStream::Decode(const OUString& rURL, const ScRange& rRange,
else if (msMove == "MOVE_DOWN")
meMove = MOVE_DOWN;
- maRange = rRange;
- if (maRange.aStart.Row() != maRange.aEnd.Row())
+ mnCurRow = rRange.aStart.Row();
+
+ ScRange aRange = rRange;
+ if (aRange.aStart.Row() != aRange.aEnd.Row())
// We only allow this range to be one row tall.
- maRange.aEnd.SetRow(maRange.aStart.Row());
+ aRange.aEnd.SetRow(aRange.aStart.Row());
- maStartRange = maRange;
- if (nLimit && maRange.aStart.Row() + nLimit - 1 < MAXROW)
+ maStartRange = aRange;
+ if (nLimit && aRange.aStart.Row() + nLimit - 1 < MAXROW)
{
- mpEndRange.reset( new ScRange(maRange) );
+ mpEndRange.reset(new ScRange(aRange));
mpEndRange->Move(0, nLimit-1, 0);
}
}
@@ -331,7 +342,7 @@ void DataStream::Repaint()
{
SCROW nEndRow = mpEndRange ? mpEndRange->aEnd.Row() : MAXROW;
ScRange aRange(maStartRange.aStart);
- aRange.aEnd = ScAddress(maRange.aEnd.Col(), nEndRow, maRange.aStart.Tab());
+ aRange.aEnd = ScAddress(maStartRange.aEnd.Col(), nEndRow, maStartRange.aStart.Tab());
mpDocShell->PostPaint(aRange, PAINT_GRID);
mnRepaintCounter = 0;
@@ -345,25 +356,22 @@ void DataStream::Broadcast()
void DataStream::MoveData()
{
+ if (!mpEndRange)
+ return;
+
switch (meMove)
{
case RANGE_DOWN:
- if (maRange.aStart == mpEndRange->aStart)
+ if (mnCurRow == mpEndRange->aStart.Row())
meMove = MOVE_UP;
break;
case MOVE_UP:
- if (!mpEndRange)
- break;
-
// Remove the top row and shift the remaining rows upward. Then
// insert a new row at the end row position.
mpDoc->DeleteRow(maStartRange);
mpDoc->InsertRow(*mpEndRange);
break;
case MOVE_DOWN:
- if (!mpEndRange)
- break;
-
// Remove the end row and shift the remaining rows downward by
// inserting a new row at the top row.
mpDoc->DeleteRow(*mpEndRange);
@@ -408,53 +416,47 @@ void DataStream::Text2Doc()
{
sal_Unicode cSep(',');
sal_Unicode cStr('"');
- SCCOL nStartCol = maRange.aStart.Col();
- SCROW nStartRow = maRange.aStart.Row();
- SCCOL nEndCol = maRange.aEnd.Col();
- SCROW nEndRow = maRange.aEnd.Row();
+ SCCOL nStartCol = maStartRange.aStart.Col();
+ SCCOL nEndCol = maStartRange.aEnd.Col();
OUString aCell;
- SCROW nRow = nStartRow;
ScDocumentImport aDocImport(*mpDoc);
- while (nRow <= nEndRow)
+
+ SCCOL nCol = nStartCol;
+ OUString sLine( OStringToOUString(ConsumeLine(), RTL_TEXTENCODING_UTF8) );
+ const sal_Unicode* p = sLine.getStr();
+ while (*p)
{
- SCCOL nCol = nStartCol;
- OUString sLine( OStringToOUString(ConsumeLine(), RTL_TEXTENCODING_UTF8) );
- const sal_Unicode* p = sLine.getStr();
- while (*p)
+ aCell = "";
+ const sal_Unicode* q = p;
+ while (*p && *p != cSep)
{
- aCell = "";
- const sal_Unicode* q = p;
- while (*p && *p != cSep)
- {
- // Always look for a pairing quote and ignore separator in between.
- while (*p && *p == cStr)
- q = p = lcl_ScanString(p, aCell, cStr);
- // All until next separator or quote.
- while (*p && *p != cSep && *p != cStr)
- ++p;
- if (aCell.getLength() + (p - q) <= STRING_MAXLEN)
- aCell += OUString( q, sal::static_int_cast<sal_Int32>( p - q ) );
- q = p;
- }
- if (*p)
+ // Always look for a pairing quote and ignore separator in between.
+ while (*p && *p == cStr)
+ q = p = lcl_ScanString(p, aCell, cStr);
+ // All until next separator or quote.
+ while (*p && *p != cSep && *p != cStr)
++p;
- if (nCol <= nEndCol && nRow <= nEndRow)
- {
- ScAddress aAddress(nCol, nRow, maRange.aStart.Tab());
- if (aCell == "0" || ( aCell.indexOf(':') == -1 && aCell.toDouble() ))
- aDocImport.setNumericCell(aAddress, aCell.toDouble());
- else
- aDocImport.setStringCell(aAddress, aCell);
- }
- ++nCol;
+ if (aCell.getLength() + (p - q) <= STRING_MAXLEN)
+ aCell += OUString( q, sal::static_int_cast<sal_Int32>( p - q ) );
+ q = p;
+ }
+ if (*p)
+ ++p;
+ if (nCol <= nEndCol)
+ {
+ ScAddress aAddress(nCol, mnCurRow, maStartRange.aStart.Tab());
+ if (aCell == "0" || ( aCell.indexOf(':') == -1 && aCell.toDouble() ))
+ aDocImport.setNumericCell(aAddress, aCell.toDouble());
+ else
+ aDocImport.setStringCell(aAddress, aCell);
}
- ++nRow;
- ++mnRepaintCounter;
+ ++nCol;
}
+ ++mnRepaintCounter;
aDocImport.finalize();
- ScRange aBCRange(nStartCol, nStartRow, maRange.aStart.Tab(), nEndCol, nEndRow, maRange.aStart.Tab());
+ ScRange aBCRange(nStartCol, mnCurRow, maStartRange.aStart.Tab(), nEndCol, mnCurRow, maStartRange.aStart.Tab());
maBroadcastRanges.Join(aBCRange);
}
@@ -501,9 +503,9 @@ bool DataStream::ImportData()
if (meMove == RANGE_DOWN)
{
- maRange.Move(0, maRange.aEnd.Row() - maRange.aStart.Row() + 1, 0);
+ ++mnCurRow;
mpDocShell->GetViewData()->GetView()->AlignToCursor(
- maRange.aStart.Col(), maRange.aStart.Row(), SC_FOLLOW_JUMP);
+ maStartRange.aStart.Col(), mnCurRow, SC_FOLLOW_JUMP);
}
if (mnRepaintCounter > 100)
diff --git a/sc/source/ui/inc/datastream.hxx b/sc/source/ui/inc/datastream.hxx
index 8b7a510f45ba..70857dcd00eb 100644
--- a/sc/source/ui/inc/datastream.hxx
+++ b/sc/source/ui/inc/datastream.hxx
@@ -59,7 +59,7 @@ public:
const OUString& , const css::uno::Any& ) SAL_OVERRIDE;
virtual void Edit(Window* , const Link& ) SAL_OVERRIDE;
- const ScRange& GetRange() const { return maRange; }
+ ScRange GetRange() const;
const OUString& GetURL() const { return msURL; }
const sal_Int32& GetLimit() const { return mnLimit; }
const OUString& GetMove() const { return msMove; }
@@ -91,7 +91,7 @@ private:
LinesList *mpLines;
size_t mnLinesCount;
size_t mnRepaintCounter;
- ScRange maRange;
+ SCROW mnCurRow;
ScRange maStartRange;
ScRangeList maBroadcastRanges;
boost::scoped_ptr<ScRange> mpEndRange;