[Libreoffice-commits] core.git: sc/source

Eike Rathke erack at redhat.com
Fri Feb 16 21:49:23 UTC 2018


 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 <erack at 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;


More information about the Libreoffice-commits mailing list