sc/source/ui/docshell/arealink.cxx | 79 +++++++++++++++++++++---------------- sc/source/ui/miscdlgs/linkarea.cxx | 7 +++ 2 files changed, 52 insertions(+), 34 deletions(-)
New commits: commit 40530d0ce4883ac999d53f86c0483e1a47c9fd74 Author: Eike Rathke <er...@redhat.com> Date: Fri Feb 16 22:47:02 2018 +0100 Resolves: tdf#114995 support CSV as Link to External Data ... with one CSV_all range for all data. Change-Id: Ibe7a8f5141394eb4592e83a69e620e4b1a6b5221 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; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits