summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2018-02-16 22:47:02 +0100
committerEike Rathke <erack@redhat.com>2018-02-16 22:48:58 +0100
commit40530d0ce4883ac999d53f86c0483e1a47c9fd74 (patch)
tree70a195877c43699acc1c13daf9502f257a45e66e
parent608272840a799e783fd15197c78bfa2b58145cf4 (diff)
Resolves: tdf#114995 support CSV as Link to External Data
... with one CSV_all range for all data. Change-Id: Ibe7a8f5141394eb4592e83a69e620e4b1a6b5221
-rw-r--r--sc/source/ui/docshell/arealink.cxx79
-rw-r--r--sc/source/ui/miscdlgs/linkarea.cxx7
2 files changed, 52 insertions, 34 deletions
diff --git a/sc/source/ui/docshell/arealink.cxx b/sc/source/ui/docshell/arealink.cxx
index cc98d0744adc..81e2c7cf5b0d 100644
--- a/sc/source/ui/docshell/arealink.cxx
+++ b/sc/source/ui/docshell/arealink.cxx
@@ -270,16 +270,32 @@ bool ScAreaLink::Refresh( const OUString& rNewFile, const OUString& rNewFilter,
// find total size of source area
SCCOL nWidth = 0;
SCROW nHeight = 0;
+ ScRangeList aSourceRanges;
+
+ if (rNewFilter == "Text - txt - csv (StarCalc)" && aTempArea == "CSV_all")
+ {
+ // The dummy All range. All data, including top/left empty
+ // rows/columns.
+ aTempArea.clear();
+ SCCOL nEndCol = 0;
+ SCROW nEndRow = 0;
+ if (rSrcDoc.GetCellArea( 0, nEndCol, nEndRow))
+ {
+ aSourceRanges.Append( ScRange( 0,0,0, nEndCol, nEndRow, 0));
+ nWidth = nEndCol + 1;
+ nHeight = nEndRow + 2;
+ }
+ }
+
sal_Int32 nTokenCnt = comphelper::string::getTokenCount(aTempArea, ';');
sal_Int32 nStringIx = 0;
- sal_Int32 nToken;
-
- for( nToken = 0; nToken < nTokenCnt; nToken++ )
+ for (sal_Int32 nToken = 0; nToken < nTokenCnt; ++nToken)
{
OUString aToken( aTempArea.getToken( 0, ';', nStringIx ) );
ScRange aTokenRange;
if( FindExtRange( aTokenRange, &rSrcDoc, aToken ) )
{
+ aSourceRanges.Append( aTokenRange);
// columns: find maximum
nWidth = std::max( nWidth, static_cast<SCCOL>(aTokenRange.aEnd.Col() - aTokenRange.aStart.Col() + 1) );
// rows: add row range + 1 empty row
@@ -355,40 +371,35 @@ bool ScAreaLink::Refresh( const OUString& rNewFile, const OUString& rNewFilter,
{
ScDocument aClipDoc( SCDOCMODE_CLIP );
ScRange aNewTokenRange( aNewRange.aStart );
- nStringIx = 0;
- for( nToken = 0; nToken < nTokenCnt; nToken++ )
+ for (size_t nRange = 0; nRange < aSourceRanges.size(); ++nRange)
{
- OUString aToken( aTempArea.getToken( 0, ';', nStringIx ) );
- ScRange aTokenRange;
- if( FindExtRange( aTokenRange, &rSrcDoc, aToken ) )
+ ScRange aTokenRange( *aSourceRanges[nRange]);
+ SCTAB nSrcTab = aTokenRange.aStart.Tab();
+ ScMarkData aSourceMark;
+ aSourceMark.SelectOneTable( nSrcTab ); // selecting for CopyToClip
+ aSourceMark.SetMarkArea( aTokenRange );
+
+ ScClipParam aClipParam(aTokenRange, false);
+ rSrcDoc.CopyToClip(aClipParam, &aClipDoc, &aSourceMark, false, false);
+
+ if ( aClipDoc.HasAttrib( 0,0,nSrcTab, MAXCOL,MAXROW,nSrcTab,
+ HasAttrFlags::Merged | HasAttrFlags::Overlapped ) )
{
- SCTAB nSrcTab = aTokenRange.aStart.Tab();
- ScMarkData aSourceMark;
- aSourceMark.SelectOneTable( nSrcTab ); // selecting for CopyToClip
- aSourceMark.SetMarkArea( aTokenRange );
-
- ScClipParam aClipParam(aTokenRange, false);
- rSrcDoc.CopyToClip(aClipParam, &aClipDoc, &aSourceMark, false, false);
-
- if ( aClipDoc.HasAttrib( 0,0,nSrcTab, MAXCOL,MAXROW,nSrcTab,
- HasAttrFlags::Merged | HasAttrFlags::Overlapped ) )
- {
- //! ResetAttrib at document !!!
-
- ScPatternAttr aPattern( rSrcDoc.GetPool() );
- aPattern.GetItemSet().Put( ScMergeAttr() ); // Defaults
- aPattern.GetItemSet().Put( ScMergeFlagAttr() );
- aClipDoc.ApplyPatternAreaTab( 0,0, MAXCOL,MAXROW, nSrcTab, aPattern );
- }
-
- aNewTokenRange.aEnd.SetCol( aNewTokenRange.aStart.Col() + (aTokenRange.aEnd.Col() - aTokenRange.aStart.Col()) );
- aNewTokenRange.aEnd.SetRow( aNewTokenRange.aStart.Row() + (aTokenRange.aEnd.Row() - aTokenRange.aStart.Row()) );
- ScMarkData aDestMark;
- aDestMark.SelectOneTable( nDestTab );
- aDestMark.SetMarkArea( aNewTokenRange );
- rDoc.CopyFromClip( aNewTokenRange, aDestMark, InsertDeleteFlags::ALL, nullptr, &aClipDoc, false );
- aNewTokenRange.aStart.SetRow( aNewTokenRange.aEnd.Row() + 2 );
+ //! ResetAttrib at document !!!
+
+ ScPatternAttr aPattern( rSrcDoc.GetPool() );
+ aPattern.GetItemSet().Put( ScMergeAttr() ); // Defaults
+ aPattern.GetItemSet().Put( ScMergeFlagAttr() );
+ aClipDoc.ApplyPatternAreaTab( 0,0, MAXCOL,MAXROW, nSrcTab, aPattern );
}
+
+ aNewTokenRange.aEnd.SetCol( aNewTokenRange.aStart.Col() + (aTokenRange.aEnd.Col() - aTokenRange.aStart.Col()) );
+ aNewTokenRange.aEnd.SetRow( aNewTokenRange.aStart.Row() + (aTokenRange.aEnd.Row() - aTokenRange.aStart.Row()) );
+ ScMarkData aDestMark;
+ aDestMark.SelectOneTable( nDestTab );
+ aDestMark.SetMarkArea( aNewTokenRange );
+ rDoc.CopyFromClip( aNewTokenRange, aDestMark, InsertDeleteFlags::ALL, nullptr, &aClipDoc, false );
+ aNewTokenRange.aStart.SetRow( aNewTokenRange.aEnd.Row() + 2 );
}
}
else
diff --git a/sc/source/ui/miscdlgs/linkarea.cxx b/sc/source/ui/miscdlgs/linkarea.cxx
index 430af73633f2..96f613ffa7a1 100644
--- a/sc/source/ui/miscdlgs/linkarea.cxx
+++ b/sc/source/ui/miscdlgs/linkarea.cxx
@@ -257,6 +257,13 @@ void ScLinkedAreaDlg::UpdateSourceRanges()
m_pLbRanges->Clear();
if ( pSourceShell )
{
+ std::shared_ptr<const SfxFilter> pFilter = pSourceShell->GetMedium()->GetFilter();
+ if (pFilter && pFilter->GetFilterName() == "Text - txt - csv (StarCalc)")
+ {
+ // Insert dummy All range to have something selectable.
+ m_pLbRanges->InsertEntry("CSV_all");
+ }
+
ScAreaNameIterator aIter( &pSourceShell->GetDocument() );
ScRange aDummy;
OUString aName;