summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2013-08-26 18:10:53 +0200
committerEike Rathke <erack@redhat.com>2013-08-26 18:16:30 +0200
commit5af6437f6b602773fb76dca76be1fc079d93c922 (patch)
treed37a6a9c73009b379ac0474e983b8f5b33590877
parentd198d2fb1b3d1d65450f9be30a94b00631d3c9b8 (diff)
resolved fdo#53449 weight given separators to pick one for output
Change-Id: Iaef3ed270d870f7c26062cdbbc9bf243bc5b5a78
-rw-r--r--sc/source/ui/dbgui/asciiopt.cxx61
-rw-r--r--sc/source/ui/dbgui/imoptdlg.cxx3
-rw-r--r--sc/source/ui/docshell/impex.cxx2
-rw-r--r--sc/source/ui/inc/asciiopt.hxx13
4 files changed, 60 insertions, 19 deletions
diff --git a/sc/source/ui/dbgui/asciiopt.cxx b/sc/source/ui/dbgui/asciiopt.cxx
index 0f514ce9bcc4..2170a042ee38 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 f1dc8de134c2..be8c9f64922f 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 e2c67fad0363..aae1b47719a0 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 3d779bf7f613..bc1a41d612ba 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