sc/source/ui/inc/datastreams.hxx | 5 + sc/source/ui/miscdlgs/datastreams.cxx | 72 +++++++++++++++++++++------- sc/source/ui/miscdlgs/datastreamsdlg.cxx | 41 +++++++++++----- sc/uiconfig/scalc/ui/datastreams.ui | 79 +++++++++++++++++++++++++++++-- 4 files changed, 164 insertions(+), 33 deletions(-)
New commits: commit 3d7d66258373c1d4df20cce6a993b3fe013a7910 Author: Matúš Kukan <matus.ku...@collabora.com> Date: Tue Nov 19 13:57:58 2013 +0100 datastreams: implement address mode for input In this mode, we read lines as "<address>,<value>". Moving is disabled then, because we update each cell individually (and also, for some reason, it was not working). Change-Id: I55f73e5a6a26f3e962a12662deeea657ce41acd4 diff --git a/sc/source/ui/inc/datastreams.hxx b/sc/source/ui/inc/datastreams.hxx index 8233be1..80f9cd6 100644 --- a/sc/source/ui/inc/datastreams.hxx +++ b/sc/source/ui/inc/datastreams.hxx @@ -30,8 +30,8 @@ public: ~DataStreams(); bool ImportData(); void MoveData(); - void Set(const OUString& rUrl, bool bIsScript, const OUString& rRange, - sal_Int32 nLimit, MoveEnum eMove); + void Set(const OUString& rUrl, bool bIsScript, bool bValuesInLine, + const OUString& rRange, sal_Int32 nLimit, MoveEnum eMove); void ShowDialog(Window *pParent); void Start(); void Stop(); @@ -42,6 +42,7 @@ private: MoveEnum meMove; bool mbRunning; bool mbIsUndoEnabled; + bool mbValuesInLine; boost::scoped_ptr<ScRange> mpRange; boost::scoped_ptr<ScRange> mpStartRange; boost::scoped_ptr<ScRange> mpEndRange; diff --git a/sc/source/ui/miscdlgs/datastreams.cxx b/sc/source/ui/miscdlgs/datastreams.cxx index dd5a821..b938513 100644 --- a/sc/source/ui/miscdlgs/datastreams.cxx +++ b/sc/source/ui/miscdlgs/datastreams.cxx @@ -18,7 +18,9 @@ #include <asciiopt.hxx> #include <dbfunc.hxx> #include <docsh.hxx> +#include <documentimport.hxx> #include <impex.hxx> +#include <rangelst.hxx> #include <tabvwsh.hxx> #include <viewdata.hxx> @@ -115,18 +117,25 @@ void DataStreams::Stop() mpScDocument->EnableUndo(mbIsUndoEnabled); } -void DataStreams::Set(const OUString& rUrl, bool bIsScript, +void DataStreams::Set(const OUString& rUrl, bool bIsScript, bool bValuesInLine, const OUString& rRange, sal_Int32 nLimit, MoveEnum eMove) { - mpRange.reset ( new ScRange() ); - mpRange->Parse(rRange, mpScDocument); - mpStartRange.reset( new ScRange(*mpRange.get()) ); if (bIsScript) mpStream.reset( new SvScriptStream(rUrl) ); else mpStream.reset( new SvFileStream(rUrl, STREAM_READ) ); mpEndRange.reset( NULL ); + mpRange.reset ( new ScRange() ); + mbValuesInLine = bValuesInLine; + if (!mbValuesInLine) + { + meMove = NO_MOVE; + return; + } + + mpRange->Parse(rRange, mpScDocument); + mpStartRange.reset( new ScRange(*mpRange.get()) ); meMove = eMove; sal_Int32 nHeight = mpRange->aEnd.Row() - mpRange->aStart.Row() + 1; nLimit = nHeight * (nLimit / nHeight); @@ -168,21 +177,52 @@ bool DataStreams::ImportData() return mbRunning; } - SCROW nHeight = mpRange->aEnd.Row() - mpRange->aStart.Row() + 1; - OStringBuffer aBuf; OString sTmp; - while (nHeight--) - { - mpStream->ReadLine(sTmp); - aBuf.append(sTmp); - aBuf.append('\n'); - } SolarMutexGuard aGuard; MoveData(); - SvMemoryStream aMemoryStream((void *)aBuf.getStr(), aBuf.getLength(), STREAM_READ); - ScImportExport aImport(mpScDocument, *mpRange); - aImport.SetSeparator(','); - aImport.ImportStream(aMemoryStream, OUString(), FORMAT_STRING); + if (mbValuesInLine) + { + SCROW nHeight = mpRange->aEnd.Row() - mpRange->aStart.Row() + 1; + OStringBuffer aBuf; + while (nHeight--) + { + mpStream->ReadLine(sTmp); + aBuf.append(sTmp); + aBuf.append('\n'); + } + SvMemoryStream aMemoryStream((void *)aBuf.getStr(), aBuf.getLength(), STREAM_READ); + ScImportExport aImport(mpScDocument, *mpRange); + aImport.SetSeparator(','); + aImport.ImportStream(aMemoryStream, OUString(), FORMAT_STRING); + } + else + { + ScRangeList aRangeList; + ScDocumentImport aDocImport(*mpScDocument); + // read more lines at once but not too much + for (int i = 0; i < 10; ++i) + { + mpStream->ReadLine(sTmp); + OUString sLine(OStringToOUString(sTmp, 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, mpScDocument); + if (!aAddress.IsValid()) + continue; + + if (sValue == "0" || ( sValue.indexOf(':') == -1 && sValue.toDouble() )) + aDocImport.setNumericCell(aAddress, sValue.toDouble()); + else + aDocImport.setStringCell(aAddress, sValue); + aRangeList.Join(aAddress); + } + aDocImport.finalize(); + mpScDocShell->PostPaint( aRangeList, PAINT_GRID ); + } // ImportStream calls PostPaint for relevant area, // we need to call it explicitly only when moving rows. if (meMove == NO_MOVE) diff --git a/sc/source/ui/miscdlgs/datastreamsdlg.cxx b/sc/source/ui/miscdlgs/datastreamsdlg.cxx index 1fa07af..cbe19a3 100644 --- a/sc/source/ui/miscdlgs/datastreamsdlg.cxx +++ b/sc/source/ui/miscdlgs/datastreamsdlg.cxx @@ -10,6 +10,7 @@ #include <sfx2/filedlghelper.hxx> #include <svtools/inettbc.hxx> #include <vcl/dialog.hxx> +#include <vcl/layout.hxx> #include <datastreams.hxx> namespace { @@ -20,16 +21,18 @@ class DataStreamsDlg : public ModalDialog SvtURLBox* m_pCbUrl; PushButton* m_pBtnBrowse; - RadioButton* m_pRBDirectData; RadioButton* m_pRBScriptData; - RadioButton* m_pRBDataDown; + RadioButton* m_pRBValuesInLine; + RadioButton* m_pRBAddressValue; RadioButton* m_pRBRangeDown; RadioButton* m_pRBNoMove; RadioButton* m_pRBMaxLimit; - RadioButton* m_pRBUnlimited; Edit* m_pEdRange; Edit* m_pEdLimit; OKButton* m_pBtnOk; + VclFrame* m_pVclFrameLimit; + VclFrame* m_pVclFrameMove; + VclFrame* m_pVclFrameRange; DECL_LINK(UpdateHdl, void *); DECL_LINK(BrowseHdl, void *); @@ -48,18 +51,22 @@ DataStreamsDlg::DataStreamsDlg(DataStreams *pDataStreams, Window* pParent) { get(m_pCbUrl, "url"); get(m_pBtnBrowse, "browse"); - get(m_pRBDirectData, "directdata"); get(m_pRBScriptData, "scriptdata"); - get(m_pRBDataDown, "datadown"); + get(m_pRBValuesInLine, "valuesinline"); + get(m_pRBAddressValue, "addressvalue"); get(m_pRBRangeDown, "rangedown"); get(m_pRBNoMove, "nomove"); get(m_pRBMaxLimit, "maxlimit"); - get(m_pRBUnlimited, "unlimited"); get(m_pEdRange, "range"); get(m_pEdLimit, "limit"); get(m_pBtnOk, "ok"); + get(m_pVclFrameLimit, "framelimit"); + get(m_pVclFrameMove, "framemove"); + get(m_pVclFrameRange, "framerange"); m_pCbUrl->SetSelectHdl( LINK( this, DataStreamsDlg, UpdateHdl ) ); + m_pRBAddressValue->SetClickHdl( LINK( this, DataStreamsDlg, UpdateHdl ) ); + m_pRBValuesInLine->SetClickHdl( LINK( this, DataStreamsDlg, UpdateHdl ) ); m_pEdRange->SetModifyHdl( LINK( this, DataStreamsDlg, UpdateHdl ) ); m_pBtnBrowse->SetClickHdl( LINK( this, DataStreamsDlg, BrowseHdl ) ); UpdateEnable(); @@ -71,9 +78,9 @@ void DataStreamsDlg::Start() sal_Int32 nLimit = 0; if (m_pRBMaxLimit->IsChecked()) nLimit = m_pEdLimit->GetText().toInt32(); - mpDataStreams->Set(m_pCbUrl->GetText(), bIsScript, m_pEdRange->GetText(), - nLimit, m_pRBNoMove->IsChecked() ? DataStreams::NO_MOVE : - m_pRBRangeDown->IsChecked() ? DataStreams::RANGE_DOWN : DataStreams::MOVE_DOWN); + mpDataStreams->Set( m_pCbUrl->GetText(), bIsScript, m_pRBValuesInLine->IsChecked(), + m_pEdRange->GetText(), nLimit, (m_pRBNoMove->IsChecked() ? DataStreams::NO_MOVE : + m_pRBRangeDown->IsChecked() ? DataStreams::RANGE_DOWN : DataStreams::MOVE_DOWN) ); mpDataStreams->Start(); } @@ -96,8 +103,20 @@ IMPL_LINK_NOARG(DataStreamsDlg, UpdateHdl) void DataStreamsDlg::UpdateEnable() { - bool bOk = !m_pEdRange->GetText().isEmpty(); - bOk = bOk && !m_pCbUrl->GetURL().isEmpty(); + bool bOk = !m_pCbUrl->GetURL().isEmpty(); + if (m_pRBAddressValue->IsChecked()) + { + m_pVclFrameLimit->Hide(); + m_pVclFrameMove->Hide(); + m_pVclFrameRange->Hide(); + } + else + { + m_pVclFrameLimit->Show(true); + m_pVclFrameMove->Show(); + m_pVclFrameRange->Show(); + bOk = bOk && !m_pEdRange->GetText().isEmpty(); + } m_pBtnOk->Enable(bOk); } diff --git a/sc/uiconfig/scalc/ui/datastreams.ui b/sc/uiconfig/scalc/ui/datastreams.ui index 12282f8..853840a 100644 --- a/sc/uiconfig/scalc/ui/datastreams.ui +++ b/sc/uiconfig/scalc/ui/datastreams.ui @@ -144,7 +144,78 @@ </packing> </child> <child> - <object class="GtkFrame" id="frame1"> + <object class="GtkFrame" id="frame4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkAlignment" id="alignment5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="top_padding">6</property> + <property name="left_padding">12</property> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkRadioButton" id="valuesinline"> + <property name="label" translatable="yes">value1,value2,...</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="xalign">0</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <property name="group">addressvalue</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="addressvalue"> + <property name="label" translatable="yes">address,value</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + <property name="group">valuesinline</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Interpret stream data as</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">6</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="framerange"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="label_xalign">0</property> @@ -176,7 +247,7 @@ <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">2</property> + <property name="position">3</property> </packing> </child> </object> @@ -202,7 +273,7 @@ </packing> </child> <child> - <object class="GtkFrame" id="frame2"> + <object class="GtkFrame" id="framemove"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="label_xalign">0</property> @@ -293,7 +364,7 @@ </packing> </child> <child> - <object class="GtkFrame" id="frame3"> + <object class="GtkFrame" id="framelimit"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="label_xalign">0</property>
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits