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

Eike Rathke erack at redhat.com
Mon Aug 26 09:16:55 PDT 2013


 sc/source/ui/dbgui/asciiopt.cxx |   61 ++++++++++++++++++++++++++++------------
 sc/source/ui/dbgui/imoptdlg.cxx |    3 +
 sc/source/ui/docshell/impex.cxx |    2 -
 sc/source/ui/inc/asciiopt.hxx   |   13 ++++++++
 4 files changed, 60 insertions(+), 19 deletions(-)

New commits:
commit 5af6437f6b602773fb76dca76be1fc079d93c922
Author: Eike Rathke <erack at redhat.com>
Date:   Mon Aug 26 18:10:53 2013 +0200

    resolved fdo#53449 weight given separators to pick one for output
    
    Change-Id: Iaef3ed270d870f7c26062cdbbc9bf243bc5b5a78

diff --git a/sc/source/ui/dbgui/asciiopt.cxx b/sc/source/ui/dbgui/asciiopt.cxx
index 0f514ce..2170a04 100644
--- a/sc/source/ui/dbgui/asciiopt.cxx
+++ b/sc/source/ui/dbgui/asciiopt.cxx
@@ -179,6 +179,25 @@ bool ScAsciiOptions::operator==( const ScAsciiOptions& rCmp ) const
     return false;
 }
 
+String lcl_decodeSepString( const String & rSepNums, bool & o_bMergeFieldSeps )
+{
+    String aFieldSeps;
+    xub_StrLen nSub = comphelper::string::getTokenCount( rSepNums, '/');
+    for (xub_StrLen i=0; i<nSub; ++i)
+    {
+        String aCode = rSepNums.GetToken( i, '/' );
+        if ( aCode.EqualsAscii(pStrMrg) )
+            o_bMergeFieldSeps = true;
+        else
+        {
+            sal_Int32 nVal = aCode.ToInt32();
+            if ( nVal )
+                aFieldSeps += (sal_Unicode) nVal;
+        }
+    }
+    return aFieldSeps;
+}
+
 // The options string must not contain semicolons (because of the pick list),
 // use comma as separator.
 
@@ -186,31 +205,16 @@ void ScAsciiOptions::ReadFromString( const String& rString )
 {
     xub_StrLen nCount = comphelper::string::getTokenCount(rString, ',');
     String aToken;
-    xub_StrLen nSub;
-    xub_StrLen i;
 
     // Field separator.
     if ( nCount >= 1 )
     {
         bFixedLen = bMergeFieldSeps = false;
-        aFieldSeps.Erase();
 
         aToken = rString.GetToken(0,',');
         if ( aToken.EqualsAscii(pStrFix) )
             bFixedLen = true;
-        nSub = comphelper::string::getTokenCount(aToken, '/');
-        for ( i=0; i<nSub; i++ )
-        {
-            String aCode = aToken.GetToken( i, '/' );
-            if ( aCode.EqualsAscii(pStrMrg) )
-                bMergeFieldSeps = true;
-            else
-            {
-                sal_Int32 nVal = aCode.ToInt32();
-                if ( nVal )
-                    aFieldSeps += (sal_Unicode) nVal;
-            }
-        }
+        aFieldSeps = lcl_decodeSepString( aToken, bMergeFieldSeps);
     }
 
     // Text separator.
@@ -242,7 +246,7 @@ void ScAsciiOptions::ReadFromString( const String& rString )
         delete[] pColFormat;
 
         aToken = rString.GetToken(4,',');
-        nSub = comphelper::string::getTokenCount(aToken, '/');
+        xub_StrLen nSub = comphelper::string::getTokenCount(aToken, '/');
         nInfoCount = nSub / 2;
         if (nInfoCount)
         {
@@ -354,4 +358,27 @@ String ScAsciiOptions::WriteToString() const
     return aOutStr;
 }
 
+// static
+sal_Unicode ScAsciiOptions::GetWeightedFieldSep( const String & rFieldSeps, bool bDecodeNumbers )
+{
+    bool bMergeFieldSeps = false;
+    String aFieldSeps( bDecodeNumbers ? lcl_decodeSepString( rFieldSeps, bMergeFieldSeps) : rFieldSeps);
+    if (aFieldSeps.Len() <= 1)
+        return aFieldSeps.GetChar(0);
+    else
+    {
+        // There can be only one separator for output. See also fdo#53449
+        if (aFieldSeps.Search(',') != STRING_NOTFOUND)
+            return ',';
+        else if (aFieldSeps.Search('\t') != STRING_NOTFOUND)
+            return '\t';
+        else if (aFieldSeps.Search(';') != STRING_NOTFOUND)
+            return ';';
+        else if (aFieldSeps.Search(' ') != STRING_NOTFOUND)
+            return ' ';
+        else
+            return aFieldSeps.GetChar(0);
+    }
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/dbgui/imoptdlg.cxx b/sc/source/ui/dbgui/imoptdlg.cxx
index f1dc8de..be8c9f6 100644
--- a/sc/source/ui/dbgui/imoptdlg.cxx
+++ b/sc/source/ui/dbgui/imoptdlg.cxx
@@ -18,6 +18,7 @@
  */
 
 #include "imoptdlg.hxx"
+#include "asciiopt.hxx"
 #include "scresid.hxx"
 #include "imoptdlg.hrc"
 #include <comphelper/string.hxx>
@@ -51,7 +52,7 @@ ScImportOptions::ScImportOptions( const String& rStr )
         if( aToken.EqualsIgnoreCaseAscii( pStrFix ) )
             bFixedWidth = sal_True;
         else
-            nFieldSepCode = (sal_Unicode) aToken.ToInt32();
+            nFieldSepCode = ScAsciiOptions::GetWeightedFieldSep( aToken, true);
         nTextSepCode  = (sal_Unicode) rStr.GetToken(1,',').ToInt32();
         aStrFont      = rStr.GetToken(2,',');
         eCharSet      = ScGlobal::GetCharsetValue(aStrFont);
diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx
index e2c67fa..aae1b47 100644
--- a/sc/source/ui/docshell/impex.cxx
+++ b/sc/source/ui/docshell/impex.cxx
@@ -187,7 +187,7 @@ void ScImportExport::SetExtOptions( const ScAsciiOptions& rOpt )
 
     //  "normale" Optionen uebernehmen
 
-    cSep = rOpt.GetFieldSeps().GetChar(0);
+    cSep = ScAsciiOptions::GetWeightedFieldSep( rOpt.GetFieldSeps(), false);
     cStr = rOpt.GetTextSep();
 }
 
diff --git a/sc/source/ui/inc/asciiopt.hxx b/sc/source/ui/inc/asciiopt.hxx
index 3d779bf..bc1a41d 100644
--- a/sc/source/ui/inc/asciiopt.hxx
+++ b/sc/source/ui/inc/asciiopt.hxx
@@ -96,6 +96,19 @@ public:
 
     void    SetColInfo( sal_uInt16 nCount, const sal_Int32* pStart, const sal_uInt8* pFormat );
     void    SetColumnInfo( const ScCsvExpDataVec& rDataVec );
+
+    /** From the import field separators obtain the one most likely to be used
+        for export, if multiple separators weighted comma, tab, semicolon,
+        space and other.
+
+        @param  bDecodeNumbers
+                If TRUE, the separators are encoded as numbers and need to be
+                decoded before characters can be extracted, for example "59/44"
+                to ";,".
+                If FALSE, the string is taken as is and each character is
+                expected to be one separator.
+     */
+    static sal_Unicode  GetWeightedFieldSep( const String & rFieldSeps, bool bDecodeNumbers );
 };
 
 /// How ScImportAsciiDlg is called


More information about the Libreoffice-commits mailing list