summaryrefslogtreecommitdiff
path: root/sc/source
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2013-12-18 16:19:05 -0500
committerKohei Yoshida <kohei.yoshida@collabora.com>2013-12-18 18:15:33 -0500
commitdf57f73ff7cfa8a23537d9aa9f50aca1ca7664de (patch)
tree9976bad0a357b3aabefed09de577151f49074ef4 /sc/source
parentb8e85af1eddb58ff60d93f64e157b31a904683b2 (diff)
Handle "refresh on empty line" setting from the UI.
With this set, when we detect an empty line, we'll trigger refresh and discard the line. If not set, we'll import an empty line. Change-Id: Ic3ccb1adbd0c7273c3affff82a2d111c378f2af3
Diffstat (limited to 'sc/source')
-rw-r--r--sc/source/ui/docshell/datastream.cxx121
-rw-r--r--sc/source/ui/inc/datastream.hxx3
-rw-r--r--sc/source/ui/inc/datastreamdlg.hxx1
-rw-r--r--sc/source/ui/miscdlgs/datastreamdlg.cxx3
4 files changed, 79 insertions, 49 deletions
diff --git a/sc/source/ui/docshell/datastream.cxx b/sc/source/ui/docshell/datastream.cxx
index f9686ae61edb..e9b49d80f0c4 100644
--- a/sc/source/ui/docshell/datastream.cxx
+++ b/sc/source/ui/docshell/datastream.cxx
@@ -251,6 +251,8 @@ DataStream::DataStream(ScDocShell *pShell, const OUString& rURL, const ScRange&
maDocAccess(*mpDoc),
meMove(NO_MOVE),
mbRunning(false),
+ mbValuesInLine(false),
+ mbRefreshOnEmptyLine(false),
mpLines(0),
mnLinesCount(0),
mnLinesSinceRefresh(0),
@@ -381,6 +383,11 @@ void DataStream::StopImport()
Refresh();
}
+void DataStream::SetRefreshOnEmptyLine( bool bVal )
+{
+ mbRefreshOnEmptyLine = bVal;
+}
+
void DataStream::Refresh()
{
// Hard recalc will repaint the grid area.
@@ -437,18 +444,38 @@ IMPL_LINK_NOARG(DataStream, RefreshHdl)
namespace {
+struct StrVal
+{
+ ScAddress maPos;
+ OUString maStr;
+
+ StrVal( const ScAddress& rPos, const OUString& rStr ) : maPos(rPos), maStr(rStr) {}
+};
+
+struct NumVal
+{
+ ScAddress maPos;
+ double mfVal;
+
+ NumVal( const ScAddress& rPos, double fVal ) : maPos(rPos), mfVal(fVal) {}
+};
+
+typedef std::vector<StrVal> StrValArray;
+typedef std::vector<NumVal> NumValArray;
+
/**
* This handler handles a single line CSV input.
*/
class CSVHandler
{
- DocumentStreamAccess& mrDoc;
ScAddress maPos;
SCCOL mnEndCol;
+ StrValArray maStrs;
+ NumValArray maNums;
+
public:
- CSVHandler( DocumentStreamAccess& rDoc, const ScAddress& rPos, SCCOL nEndCol ) :
- mrDoc(rDoc), maPos(rPos), mnEndCol(nEndCol) {}
+ CSVHandler( const ScAddress& rPos, SCCOL nEndCol ) : maPos(rPos), mnEndCol(nEndCol) {}
void begin_parse() {}
void end_parse() {}
@@ -462,12 +489,15 @@ public:
OUString aStr(p, n, RTL_TEXTENCODING_UTF8);
double fVal;
if (ScStringUtil::parseSimpleNumber(aStr, '.', ',', fVal))
- mrDoc.setNumericCell(maPos, fVal);
+ maNums.push_back(NumVal(maPos, fVal));
else
- mrDoc.setStringCell(maPos, aStr);
+ maStrs.push_back(StrVal(maPos, aStr));
}
maPos.IncCol();
}
+
+ const StrValArray& getStrs() const { return maStrs; }
+ const NumValArray& getNums() const { return maNums; }
};
}
@@ -478,61 +508,34 @@ void DataStream::Text2Doc()
orcus::csv_parser_config aConfig;
aConfig.delimiters.push_back(',');
aConfig.text_qualifier = '"';
- CSVHandler aHdl(maDocAccess, ScAddress(maStartRange.aStart.Col(), mnCurRow, maStartRange.aStart.Tab()), maStartRange.aEnd.Col());
+ CSVHandler aHdl(ScAddress(maStartRange.aStart.Col(), mnCurRow, maStartRange.aStart.Tab()), maStartRange.aEnd.Col());
orcus::csv_parser<CSVHandler> parser(aLine.getStr(), aLine.getLength(), aHdl, aConfig);
parser.parse();
- ++mnLinesSinceRefresh;
-}
-
-#else
-
-void DataStream::Text2Doc() {}
-
-#endif
-
-bool DataStream::ImportData()
-{
- SolarMutexGuard aGuard;
- if (ScDocShell::GetViewData()->GetViewShell()->NeedsRepaint())
- return mbRunning;
+ const StrValArray& rStrs = aHdl.getStrs();
+ const NumValArray& rNums = aHdl.getNums();
+ if (rStrs.empty() && rNums.empty() && mbRefreshOnEmptyLine)
+ {
+ // Empty line detected. Trigger refresh and discard it.
+ Refresh();
+ return;
+ }
MoveData();
- if (mbValuesInLine)
{
- // do CSV import
- Text2Doc();
+ StrValArray::const_iterator it = rStrs.begin(), itEnd = rStrs.end();
+ for (; it != itEnd; ++it)
+ maDocAccess.setStringCell(it->maPos, it->maStr);
}
- else
- {
-#if 0 // TODO : temporarily disable this code.
- ScDocumentImport aDocImport(*mpDoc);
- // read more lines at once but not too much
- for (int i = 0; i < 10; ++i)
- {
- OUString sLine( OStringToOUString(ConsumeLine(), RTL_TEXTENCODING_UTF8) );
- if (sLine.indexOf(',') <= 0)
- continue;
-
- OUString sAddress( sLine.copy(0, sLine.indexOf(',')) );
- OUString sValue( sLine.copy(sLine.indexOf(',') + 1) );
- ScAddress aAddress;
- aAddress.Parse(sAddress, mpDoc);
- if (!aAddress.IsValid())
- continue;
- if (sValue == "0" || ( sValue.indexOf(':') == -1 && sValue.toDouble() ))
- aDocImport.setNumericCell(aAddress, sValue.toDouble());
- else
- aDocImport.setStringCell(aAddress, sValue);
- maBroadcastRanges.Join(aAddress);
- }
- aDocImport.finalize();
-#endif
+ {
+ NumValArray::const_iterator it = rNums.begin(), itEnd = rNums.end();
+ for (; it != itEnd; ++it)
+ maDocAccess.setNumericCell(it->maPos, it->mfVal);
}
if (meMove == NO_MOVE)
- return mbRunning;
+ return;
if (meMove == RANGE_DOWN)
{
@@ -546,6 +549,26 @@ bool DataStream::ImportData()
// least we have processed 200 lines.
Refresh();
+ ++mnLinesSinceRefresh;
+}
+
+#else
+
+void DataStream::Text2Doc() {}
+
+#endif
+
+bool DataStream::ImportData()
+{
+ SolarMutexGuard aGuard;
+ if (!mbValuesInLine)
+ // We no longer support this mode. To be deleted later.
+ return false;
+
+ if (ScDocShell::GetViewData()->GetViewShell()->NeedsRepaint())
+ return mbRunning;
+
+ Text2Doc();
return mbRunning;
}
diff --git a/sc/source/ui/inc/datastream.hxx b/sc/source/ui/inc/datastream.hxx
index a593aad5f370..1cde20e69b9a 100644
--- a/sc/source/ui/inc/datastream.hxx
+++ b/sc/source/ui/inc/datastream.hxx
@@ -78,6 +78,8 @@ public:
void StartImport();
void StopImport();
+ void SetRefreshOnEmptyLine( bool bVal );
+
private:
void Refresh();
@@ -91,6 +93,7 @@ private:
MoveType meMove;
bool mbRunning;
bool mbValuesInLine;
+ bool mbRefreshOnEmptyLine;
LinesList* mpLines;
size_t mnLinesCount;
size_t mnLinesSinceRefresh;
diff --git a/sc/source/ui/inc/datastreamdlg.hxx b/sc/source/ui/inc/datastreamdlg.hxx
index d817743128e8..0a7f1673a474 100644
--- a/sc/source/ui/inc/datastreamdlg.hxx
+++ b/sc/source/ui/inc/datastreamdlg.hxx
@@ -30,6 +30,7 @@ class DataStreamDlg : public ModalDialog
RadioButton* m_pRBScriptData;
RadioButton* m_pRBValuesInLine;
RadioButton* m_pRBAddressValue;
+ CheckBox* m_pCBRefreshOnEmpty;
RadioButton* m_pRBDataDown;
RadioButton* m_pRBRangeDown;
RadioButton* m_pRBNoMove;
diff --git a/sc/source/ui/miscdlgs/datastreamdlg.cxx b/sc/source/ui/miscdlgs/datastreamdlg.cxx
index c004fbc6549d..fa21dd98d103 100644
--- a/sc/source/ui/miscdlgs/datastreamdlg.cxx
+++ b/sc/source/ui/miscdlgs/datastreamdlg.cxx
@@ -26,6 +26,7 @@ DataStreamDlg::DataStreamDlg(ScDocShell *pDocShell, Window* pParent)
get(m_pRBScriptData, "scriptdata");
get(m_pRBValuesInLine, "valuesinline");
get(m_pRBAddressValue, "addressvalue");
+ get(m_pCBRefreshOnEmpty, "refresh_ui");
get(m_pRBDataDown, "datadown");
get(m_pRBRangeDown, "rangedown");
get(m_pRBNoMove, "nomove");
@@ -166,10 +167,12 @@ void DataStreamDlg::StartStream(DataStream *pStream)
if (pStream)
{
pStream->Decode(rURL, aStartRange, nLimit, eMove, nSettings);
+ pStream->SetRefreshOnEmptyLine(m_pCBRefreshOnEmpty->IsChecked());
return;
}
pStream = DataStream::Set(mpDocShell, rURL, aStartRange, nLimit, eMove, nSettings);
+ pStream->SetRefreshOnEmptyLine(m_pCBRefreshOnEmpty->IsChecked());
DataStream::MakeToolbarVisible();
pStream->StartImport();
}