diff options
author | Eike Rathke <erack@redhat.com> | 2013-08-26 18:10:53 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2013-08-26 18:16:30 +0200 |
commit | 5af6437f6b602773fb76dca76be1fc079d93c922 (patch) | |
tree | d37a6a9c73009b379ac0474e983b8f5b33590877 | |
parent | d198d2fb1b3d1d65450f9be30a94b00631d3c9b8 (diff) |
resolved fdo#53449 weight given separators to pick one for output
Change-Id: Iaef3ed270d870f7c26062cdbbc9bf243bc5b5a78
-rw-r--r-- | sc/source/ui/dbgui/asciiopt.cxx | 61 | ||||
-rw-r--r-- | sc/source/ui/dbgui/imoptdlg.cxx | 3 | ||||
-rw-r--r-- | sc/source/ui/docshell/impex.cxx | 2 | ||||
-rw-r--r-- | sc/source/ui/inc/asciiopt.hxx | 13 |
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 |