[ooo-build-commit] Branch 'ooo-build-3-1' - 2 commits - patches/dev300
Kohei Yoshida
kohei at kemper.freedesktop.org
Wed Jul 29 12:44:28 PDT 2009
patches/dev300/apply | 7
patches/dev300/calc-csv-import-custom-lang-officecfg.diff | 27
patches/dev300/calc-csv-import-custom-lang-sc.diff | 1071 ++++++++++++++
patches/dev300/calc-formula-externref-countif-fix.diff | 6
patches/dev300/calc-html-csv-import-force-text-cell.diff | 381 ++++
patches/dev300/calc-html-import-custom-lang-sc.diff | 725 +++++++--
6 files changed, 2101 insertions(+), 116 deletions(-)
New commits:
commit 06c55885fa77c1a7cf58e408bb70fc04f7638ad7
Author: Kohei Yoshida <kyoshida at novell.com>
Date: Wed Jul 29 15:41:14 2009 -0400
Ported several patches from master to satisfy patch dependency.
* patches/dev300/calc-html-csv-import-force-text-cell.diff: this patch
(in CalcExperimental) turns out to depend on a lot of other patches.
* patches/dev300/apply:
* patches/dev300/calc-csv-import-custom-lang-officecfg.diff:
* patches/dev300/calc-csv-import-custom-lang-sc.diff: ported these two
patches into CalcExperimental.
* patches/dev300/calc-formula-externref-countif-fix.diff: adjusted to
apply.
* patches/dev300/calc-html-import-custom-lang-sc.diff: ported from
master, which contains a fix for a number parsing bug.
diff --git a/patches/dev300/apply b/patches/dev300/apply
index 5558cf6..6168046 100644
--- a/patches/dev300/apply
+++ b/patches/dev300/apply
@@ -3027,6 +3027,10 @@ calc-delete-note-cell-crasher.diff, n#517566, kohei
[ CalcExperimental ]
+# support alternative language & number options for csv import.
+calc-csv-import-custom-lang-sc.diff, n#510168, i#97416, kohei
+calc-csv-import-custom-lang-officecfg.diff, n#510168, i#97416, kohei
+
calc-formula-externref-countif-fix.diff, n#521624, i#102750, kohei
calc-xls-import-shared-formula-refwrap.diff, n#522833, i#103861, kohei
diff --git a/patches/dev300/calc-csv-import-custom-lang-officecfg.diff b/patches/dev300/calc-csv-import-custom-lang-officecfg.diff
new file mode 100644
index 0000000..4a42f00
--- /dev/null
+++ b/patches/dev300/calc-csv-import-custom-lang-officecfg.diff
@@ -0,0 +1,27 @@
+diff --git officecfg/registry/schema/org/openoffice/Office/Calc.xcs officecfg/registry/schema/org/openoffice/Office/Calc.xcs
+index ef0bd3d..2f811b6 100644
+--- officecfg/registry/schema/org/openoffice/Office/Calc.xcs
++++ officecfg/registry/schema/org/openoffice/Office/Calc.xcs
+@@ -1044,6 +1044,22 @@
+ </info>
+ <value>true</value>
+ </prop>
++ <prop oor:name="DetectSpecialNumbers" oor:type="xs:boolean">
++ <info>
++ <author>kyoshida</author>
++ <desc>If true, Calc tries to detect special number format, such as date and scientific notation.</desc>
++ <label>DetectSpecialNumbers</label>
++ </info>
++ <value>false</value>
++ </prop>
++ <prop oor:name="Language" oor:type="xs:int">
++ <info>
++ <author>kyoshida</author>
++ <desc>Language to use for CSV import. This determines how the numbers are parsed.</desc>
++ <label>Language</label>
++ </info>
++ <value>0</value>
++ </prop>
+ <prop oor:name="Separators" oor:type="xs:string">
+ <info>
+ <author>muthusuba</author>
diff --git a/patches/dev300/calc-csv-import-custom-lang-sc.diff b/patches/dev300/calc-csv-import-custom-lang-sc.diff
new file mode 100644
index 0000000..cb3ef2a
--- /dev/null
+++ b/patches/dev300/calc-csv-import-custom-lang-sc.diff
@@ -0,0 +1,1071 @@
+diff --git sc/source/core/tool/stringutil.cxx sc/source/core/tool/stringutil.cxx
+index eaf756e..ae6247f 100644
+--- sc/source/core/tool/stringutil.cxx
++++ sc/source/core/tool/stringutil.cxx
+@@ -35,6 +35,7 @@
+
+ #include "stringutil.hxx"
+ #include "rtl/ustrbuf.hxx"
++#include "rtl/math.hxx"
+
+ using ::rtl::OUString;
+ using ::rtl::OUStringBuffer;
+@@ -42,17 +43,28 @@ using ::rtl::OUStringBuffer;
+ bool ScStringUtil::parseSimpleNumber(
+ const OUString& rStr, sal_Unicode dsep, sal_Unicode gsep, double& rVal)
+ {
++ if (gsep == 0x00A0)
++ // unicode space to ascii space
++ gsep = 0x0020;
++
+ OUStringBuffer aBuf;
+ sal_Int32 n = rStr.getLength();
+ const sal_Unicode* p = rStr.getStr();
+ sal_Int32 nPosDSep = -1, nPosGSep = -1;
++ sal_uInt32 nDigitCount = 0;
++
+ for (sal_Int32 i = 0; i < n; ++i)
+ {
+ sal_Unicode c = p[i];
++ if (c == 0x00A0)
++ // unicode space to ascii space
++ c = 0x0020;
++
+ if (sal_Unicode('0') <= c && c <= sal_Unicode('9'))
+ {
+ // this is a digit.
+ aBuf.append(c);
++ ++nDigitCount;
+ }
+ else if (c == dsep)
+ {
+@@ -61,28 +73,35 @@ bool ScStringUtil::parseSimpleNumber(
+ if (nPosDSep >= 0)
+ // a second decimal separator -> not a valid number.
+ return false;
++
+ if (nPosGSep >= 0 && i - nPosGSep != 4)
+ // the number has a group separator and the decimal sep is not
+ // positioned correctly.
+ return false;
+
+ nPosDSep = i;
++ nPosGSep = -1;
+ aBuf.append(c);
++ nDigitCount = 0;
+ }
+ else if (c == gsep)
+ {
+ // this is a group (thousand) separator.
++
+ if (i == 0)
++ // not allowed as the first character.
+ return false;
+
+- if (nPosGSep >= 0 && i - nPosGSep != 4)
+- {
+- // this group separator is not positioned correctly relative
+- // to the last group separator.
++ if (nPosDSep >= 0)
++ // not allowed after the decimal separator.
++ return false;
++
++ if (nPosGSep >= 0 && nDigitCount != 3)
++ // must be exactly 3 digits since the last group separator.
+ return false;
+- }
+
+ nPosGSep = i;
++ nDigitCount = 0;
+ }
+ else if (c == sal_Unicode('-') || c == sal_Unicode('+'))
+ {
+@@ -96,6 +115,17 @@ bool ScStringUtil::parseSimpleNumber(
+ return false;
+ }
+
+- rVal = aBuf.makeStringAndClear().toDouble();
++ // finished parsing the number.
++
++ if (nPosGSep >= 0 && nDigitCount != 3)
++ // must be exactly 3 digits since the last group separator.
++ return false;
++
++ rtl_math_ConversionStatus eStatus = rtl_math_ConversionStatus_Ok;
++ sal_Int32 nParseEnd = 0;
++ rVal = ::rtl::math::stringToDouble(aBuf.makeStringAndClear(), dsep, gsep, &eStatus, &nParseEnd);
++ if (eStatus != rtl_math_ConversionStatus_Ok)
++ return false;
++
+ return true;
+ }
+diff --git sc/source/ui/dbgui/asciiopt.cxx sc/source/ui/dbgui/asciiopt.cxx
+index 1e439d6..6b26dee 100644
+--- sc/source/ui/dbgui/asciiopt.cxx
++++ sc/source/ui/dbgui/asciiopt.cxx
+@@ -57,8 +57,10 @@ ScAsciiOptions::ScAsciiOptions() :
+ aFieldSeps ( ';' ),
+ bMergeFieldSeps ( FALSE ),
+ bQuotedFieldAsText(false),
++ bDetectSpecialNumber(false),
+ cTextSep ( cDefaultTextSep ),
+ eCharSet ( gsl_getSystemTextEncoding() ),
++ eLang ( LANGUAGE_SYSTEM ),
+ bCharSetSystem ( FALSE ),
+ nStartRow ( 1 ),
+ nInfoCount ( 0 ),
+@@ -73,8 +75,10 @@ ScAsciiOptions::ScAsciiOptions(const ScAsciiOptions& rOpt) :
+ aFieldSeps ( rOpt.aFieldSeps ),
+ bMergeFieldSeps ( rOpt.bMergeFieldSeps ),
+ bQuotedFieldAsText(rOpt.bQuotedFieldAsText),
++ bDetectSpecialNumber(rOpt.bDetectSpecialNumber),
+ cTextSep ( rOpt.cTextSep ),
+ eCharSet ( rOpt.eCharSet ),
++ eLang ( rOpt.eLang ),
+ bCharSetSystem ( rOpt.bCharSetSystem ),
+ nStartRow ( rOpt.nStartRow ),
+ nInfoCount ( rOpt.nInfoCount )
+@@ -252,13 +256,20 @@ void ScAsciiOptions::ReadFromString( const String& rString )
+ eCharSet = ScGlobal::GetCharsetValue( aToken );
+ }
+
++ // Language
++ if (nCount >= 4)
++ {
++ aToken = rString.GetToken(3, ',');
++ eLang = static_cast<LanguageType>(aToken.ToInt32());
++ }
++
+ //
+ // Startzeile
+ //
+
+- if ( nCount >= 4 )
++ if ( nCount >= 5 )
+ {
+- aToken = rString.GetToken(3,',');
++ aToken = rString.GetToken(4,',');
+ nStartRow = aToken.ToInt32();
+ }
+
+@@ -266,12 +277,12 @@ void ScAsciiOptions::ReadFromString( const String& rString )
+ // Spalten-Infos
+ //
+
+- if ( nCount >= 5 )
++ if ( nCount >= 6 )
+ {
+ delete[] pColStart;
+ delete[] pColFormat;
+
+- aToken = rString.GetToken(4,',');
++ aToken = rString.GetToken(5,',');
+ nSub = aToken.GetTokenCount('/');
+ nInfoCount = nSub / 2;
+ if (nInfoCount)
+@@ -292,11 +303,18 @@ void ScAsciiOptions::ReadFromString( const String& rString )
+ }
+
+ // Import quoted field as text.
+- if (nCount >= 6)
++ if (nCount >= 7)
+ {
+- aToken = rString.GetToken(5, ',');
++ aToken = rString.GetToken(6, ',');
+ bQuotedFieldAsText = aToken.EqualsAscii("true") ? true : false;
+ }
++
++ // Detect special nubmers.
++ if (nCount >= 8)
++ {
++ aToken = rString.GetToken(7, ',');
++ bDetectSpecialNumber = aToken.EqualsAscii("true") ? true : false;
++ }
+ }
+
+
+@@ -347,6 +365,10 @@ String ScAsciiOptions::WriteToString() const
+ aOutStr += ScGlobal::GetCharsetString( eCharSet );
+ aOutStr += ','; // Token-Ende
+
++ // Language
++ aOutStr += String::CreateFromInt32(eLang);
++ aOutStr += ',';
++
+ //
+ // Startzeile
+ //
+@@ -372,6 +394,10 @@ String ScAsciiOptions::WriteToString() const
+
+ // Import quoted field as text.
+ aOutStr += String::CreateFromAscii(bQuotedFieldAsText ? "true" : "false");
++ aOutStr += ',';
++
++ // Detect special nubmers.
++ aOutStr += String::CreateFromAscii(bDetectSpecialNumber ? "true" : "false");
+
+ return aOutStr;
+ }
+diff --git sc/source/ui/dbgui/asciiopt.hrc sc/source/ui/dbgui/asciiopt.hrc
+index 60c8500..6fde4ee 100644
+--- sc/source/ui/dbgui/asciiopt.hrc
++++ sc/source/ui/dbgui/asciiopt.hrc
+@@ -29,32 +29,46 @@
+ ************************************************************************/
+ #include "sc.hrc"
+ //#define RID_SCDLG_ASCII 256
+-#define RB_SEPARATED 1
+-#define RB_FIXED 2
+-#define FT_CHARSET 3
+-#define LB_CHARSET 4
+-#define FL_SEPOPT 5
+-#define FT_FIELDSEP 6
+-#define CB_FIELDSEP 7
+-#define FT_TEXTSEP 8
+-#define CB_TEXTSEP 9
+-#define FL_FIELDOPT 10
+-#define FT_TYPE 12
+-#define FT_PREVIEW 13
+-#define LB_TYPE1 23
+-#define FL_WIDTH 30
+-#define BTN_OK 31
+-#define BTN_CANCEL 32
+-#define BTN_HELP 33
+-#define CTR_TABLEBOX 41
+-#define CKB_TAB 51
+-#define CKB_SPACE 52
+-#define CKB_SEMICOLON 53
+-#define CKB_COMMA 54
+-#define CKB_OTHER 55
+-#define ED_OTHER 56
+-#define FT_AT_ROW 59
+-#define NF_AT_ROW 60
+-#define CB_ASONCE 90
+-#define CB_QUOTED_AS_TEXT 91
+-#define STR_TEXTTOCOLUMNS 100
++#define BTN_OK 1
++#define BTN_CANCEL 2
++#define BTN_HELP 3
++
++#define FL_FIELDOPT 4
++#define FT_CHARSET 5
++#define LB_CHARSET 6
++#define FT_CUSTOMLANG 7
++#define LB_CUSTOMLANG 8
++#define FT_AT_ROW 9
++#define NF_AT_ROW 10
++
++#define FL_SEPOPT 11
++#define RB_FIXED 12
++#define RB_SEPARATED 13
++#define CKB_TAB 14
++#define CKB_COMMA 15
++#define CKB_OTHER 16
++#define ED_OTHER 17
++#define CKB_SEMICOLON 18
++#define CKB_SPACE 19
++#define CB_ASONCE 20
++#define CB_TEXTSEP 21
++#define FT_TEXTSEP 22
++
++#define FL_OTHER_OPTIONS 23
++#define CB_QUOTED_AS_TEXT 24
++#define CB_DETECT_SPECIAL_NUMBER 25
++
++#define FL_WIDTH 26
++#define FT_TYPE 27
++#define LB_TYPE1 28
++#define CTR_TABLEBOX 29
++#define STR_TEXTTOCOLUMNS 30
++
++
++
++
++
++
++
++
++
+diff --git sc/source/ui/dbgui/asciiopt.src sc/source/ui/dbgui/asciiopt.src
+index 5e9ba11..d08eedf 100644
+--- sc/source/ui/dbgui/asciiopt.src
++++ sc/source/ui/dbgui/asciiopt.src
+@@ -34,55 +34,44 @@ ModalDialog RID_SCDLG_ASCII
+ {
+ OutputSize = TRUE ;
+ SVLook = TRUE ;
+- Size = MAP_APPFONT ( 320 , 264 ) ;
++ Size = MAP_APPFONT ( 320 , 305 ) ;
+ Text [ en-US ] = "Text Import" ;
+ Moveable = TRUE ;
+- FixedLine FL_WIDTH
+- {
+- Pos = MAP_APPFONT ( 6 , 147 ) ;
+- Size = MAP_APPFONT ( 252 , 8 ) ;
+- Text [ en-US ] = "Fields" ;
+- };
+- FixedText FT_TYPE
+- {
+- Pos = MAP_APPFONT ( 12 , 160 ) ;
+- Size = MAP_APPFONT ( 60 , 8 ) ;
+- Text [ en-US ] = "Column t~ype";
+- };
+- ListBox LB_TYPE1
++
++ OKButton BTN_OK
+ {
+- Pos = MAP_APPFONT ( 76 , 158 ) ;
+- Size = MAP_APPFONT ( 60 , 68 ) ;
++ Pos = MAP_APPFONT ( 264 , 6 ) ;
++ Size = MAP_APPFONT ( 50 , 14 ) ;
+ TabStop = TRUE ;
+- DropDown = TRUE ;
++ DefButton = TRUE ;
+ };
+- FixedLine FL_SEPOPT
++ CancelButton BTN_CANCEL
+ {
+- Pos = MAP_APPFONT ( 6 , 48 ) ;
+- Size = MAP_APPFONT ( 252 , 8 ) ;
+- Text [ en-US ] = "Separator options" ;
++ Pos = MAP_APPFONT ( 264 , 23 ) ;
++ Size = MAP_APPFONT ( 50 , 14 ) ;
++ TabStop = TRUE ;
+ };
+- RadioButton RB_FIXED
++ HelpButton BTN_HELP
+ {
+- Pos = MAP_APPFONT ( 12 , 59 ) ;
+- Size = MAP_APPFONT ( 243 , 10 ) ;
+- Text [ en-US ] = "~Fixed width" ;
++ Pos = MAP_APPFONT ( 264 , 43 ) ;
++ Size = MAP_APPFONT ( 50 , 14 ) ;
+ TabStop = TRUE ;
+ };
+- RadioButton RB_SEPARATED
++
++ FixedLine FL_FIELDOPT
+ {
+- Pos = MAP_APPFONT ( 12 , 73 ) ;
+- Size = MAP_APPFONT ( 243 , 10 ) ;
+- Text [ en-US ] = "~Separated by" ;
+- TabStop = TRUE ;
+- Check = TRUE ;
++ Pos = MAP_APPFONT ( 6 , 3 ) ;
++ Size = MAP_APPFONT ( 252 , 8 ) ;
++ Text [ en-US ] = "Import" ;
+ };
++
+ FixedText FT_CHARSET
+ {
+ Pos = MAP_APPFONT ( 12 , 16 ) ;
+ Size = MAP_APPFONT ( 60 , 8 ) ;
+ Text [ en-US ] = "Ch~aracter set" ;
+ };
++
+ ListBox LB_CHARSET
+ {
+ Pos = MAP_APPFONT ( 76 , 14 ) ;
+@@ -91,75 +80,81 @@ ModalDialog RID_SCDLG_ASCII
+ DropDown = TRUE ;
+ Sort = TRUE;
+ };
+- FixedLine FL_FIELDOPT
+- {
+- Pos = MAP_APPFONT ( 6 , 3 ) ;
+- Size = MAP_APPFONT ( 252 , 8 ) ;
+- Text [ en-US ] = "Import" ;
+- };
+- FixedText FT_TEXTSEP
++
++ FixedText FT_CUSTOMLANG
+ {
+- Pos = MAP_APPFONT ( 156 , 114 ) ;
++ Pos = MAP_APPFONT ( 12 , 32 ) ;
+ Size = MAP_APPFONT ( 60 , 8 ) ;
+- Text [ en-US ] = "Te~xt delimiter" ;
++ Text [ en-US ] = "Language" ;
+ };
+- ComboBox CB_TEXTSEP
++
++ ListBox LB_CUSTOMLANG
+ {
+- Pos = MAP_APPFONT ( 218 , 112 ) ;
+- Size = MAP_APPFONT ( 37 , 94 ) ;
++ Pos = MAP_APPFONT ( 76 , 30 ) ;
++ Size = MAP_APPFONT ( 130 , 61 ) ;
+ TabStop = TRUE ;
+ DropDown = TRUE ;
++ Sort = TRUE;
+ };
+- OKButton BTN_OK
++
++ FixedText FT_AT_ROW
+ {
+- Pos = MAP_APPFONT ( 264 , 6 ) ;
+- Size = MAP_APPFONT ( 50 , 14 ) ;
+- TabStop = TRUE ;
+- DefButton = TRUE ;
++ Pos = MAP_APPFONT ( 12 , 48 ) ;
++ Size = MAP_APPFONT ( 60 , 8 ) ;
++ Text [ en-US ] = "From ro~w" ;
+ };
+- CancelButton BTN_CANCEL
++
++ NumericField NF_AT_ROW
+ {
+- Pos = MAP_APPFONT ( 264 , 23 ) ;
+- Size = MAP_APPFONT ( 50 , 14 ) ;
++ Border = TRUE ;
++ SVLook = TRUE ;
++ Pos = MAP_APPFONT ( 76 , 46 ) ;
++ Size = MAP_APPFONT ( 30 , 12 ) ;
+ TabStop = TRUE ;
++ Spin = TRUE ;
++ Repeat = TRUE ;
++ Minimum = 1 ;
+ };
+- HelpButton BTN_HELP
++
++ FixedLine FL_SEPOPT
+ {
+- Pos = MAP_APPFONT ( 264 , 43 ) ;
+- Size = MAP_APPFONT ( 50 , 14 ) ;
+- TabStop = TRUE ;
++ Pos = MAP_APPFONT ( 6 , 63 ) ;
++ Size = MAP_APPFONT ( 252 , 8 ) ;
++ Text [ en-US ] = "Separator options" ;
+ };
+- CheckBox CKB_TAB
++ RadioButton RB_FIXED
+ {
+- Pos = MAP_APPFONT ( 20 , 86 ) ;
+- Size = MAP_APPFONT ( 68 , 10 ) ;
++ Pos = MAP_APPFONT ( 12 , 75 ) ;
++ Size = MAP_APPFONT ( 243 , 10 ) ;
++ Text [ en-US ] = "~Fixed width" ;
+ TabStop = TRUE ;
+- Text [ en-US ] = "~Tab" ;
+ };
+- CheckBox CKB_SEMICOLON
++ RadioButton RB_SEPARATED
+ {
+- Pos = MAP_APPFONT ( 20 , 99 ) ;
+- Size = MAP_APPFONT ( 68 , 10 ) ;
++ Pos = MAP_APPFONT ( 12 , 89 ) ;
++ Size = MAP_APPFONT ( 243 , 10 ) ;
++ Text [ en-US ] = "~Separated by" ;
+ TabStop = TRUE ;
+- Text [ en-US ] = "S~emicolon" ;
++ Check = TRUE ;
+ };
+- CheckBox CKB_COMMA
++
++ CheckBox CKB_TAB
+ {
+- Pos = MAP_APPFONT ( 92 , 86 ) ;
++ Pos = MAP_APPFONT ( 20 , 102 ) ;
+ Size = MAP_APPFONT ( 68 , 10 ) ;
+ TabStop = TRUE ;
+- Text [ en-US ] = "~Comma" ;
++ Text [ en-US ] = "~Tab" ;
+ };
+- CheckBox CKB_SPACE
++ CheckBox CKB_COMMA
+ {
+- Pos = MAP_APPFONT ( 92 , 99 ) ;
++ Pos = MAP_APPFONT ( 92 , 102 ) ;
+ Size = MAP_APPFONT ( 68 , 10 ) ;
+ TabStop = TRUE ;
+- Text [ en-US ] = "S~pace" ;
++ Text [ en-US ] = "~Comma" ;
+ };
+ CheckBox CKB_OTHER
+ {
+- Pos = MAP_APPFONT ( 164 , 86 ) ;
++ Pos = MAP_APPFONT ( 164 , 102 ) ;
+ Size = MAP_APPFONT ( 50 , 10 ) ;
+ TabStop = TRUE ;
+ Text [ en-US ] = "~Other" ;
+@@ -167,50 +162,100 @@ ModalDialog RID_SCDLG_ASCII
+ Edit ED_OTHER
+ {
+ Border = TRUE ;
+- Pos = MAP_APPFONT ( 218 , 84 ) ;
++ Pos = MAP_APPFONT ( 218 , 100 ) ;
+ Size = MAP_APPFONT ( 37 , 12 ) ;
+ TabStop = TRUE ;
+ MaxTextLength = 10 ;
+ };
+- FixedText FT_AT_ROW
+- {
+- Pos = MAP_APPFONT ( 12 , 32 ) ;
+- Size = MAP_APPFONT ( 60 , 8 ) ;
+- Text [ en-US ] = "From ro~w" ;
+- };
+- NumericField NF_AT_ROW
++
++ CheckBox CKB_SEMICOLON
+ {
+- Border = TRUE ;
+- SVLook = TRUE ;
+- Pos = MAP_APPFONT ( 76 , 30 ) ;
+- Size = MAP_APPFONT ( 30 , 12 ) ;
++ Pos = MAP_APPFONT ( 20 , 115 ) ;
++ Size = MAP_APPFONT ( 68 , 10 ) ;
+ TabStop = TRUE ;
+- Spin = TRUE ;
+- Repeat = TRUE ;
+- Minimum = 1 ;
++ Text [ en-US ] = "S~emicolon" ;
+ };
+- Control CTR_TABLEBOX
++ CheckBox CKB_SPACE
+ {
+- HelpId = HID_SC_ASCII_TABCTR ;
+- Border = TRUE ;
+- DialogControl = TRUE ;
+- Pos = MAP_APPFONT ( 12 , 176 ) ;
+- Size = MAP_APPFONT ( 243 , 82 ) ;
++ Pos = MAP_APPFONT ( 92 , 115 ) ;
++ Size = MAP_APPFONT ( 68 , 10 ) ;
++ TabStop = TRUE ;
++ Text [ en-US ] = "S~pace" ;
+ };
++
+ CheckBox CB_ASONCE
+ {
+- Pos = MAP_APPFONT ( 20 , 114 ) ;
++ Pos = MAP_APPFONT ( 20 , 130 ) ;
+ Size = MAP_APPFONT ( 130 , 10 ) ;
+ TabStop = TRUE ;
+ Text [ en-US ] = "Merge ~delimiters" ;
+ };
++
++ ComboBox CB_TEXTSEP
++ {
++ Pos = MAP_APPFONT ( 218 , 128 ) ;
++ Size = MAP_APPFONT ( 37 , 94 ) ;
++ TabStop = TRUE ;
++ DropDown = TRUE ;
++ };
++ FixedText FT_TEXTSEP
++ {
++ Pos = MAP_APPFONT ( 156 , 130 ) ;
++ Size = MAP_APPFONT ( 60 , 8 ) ;
++ Text [ en-US ] = "Te~xt delimiter" ;
++ };
++
++ FixedLine FL_OTHER_OPTIONS
++ {
++ Pos = MAP_APPFONT ( 6 , 146 ) ;
++ Size = MAP_APPFONT ( 252 , 8 ) ;
++ Text [ en-US ] = "Other options" ;
++ };
++
+ CheckBox CB_QUOTED_AS_TEXT
+ {
+- Pos = MAP_APPFONT ( 20 , 129 ) ;
++ Pos = MAP_APPFONT ( 20 , 158 ) ;
+ Size = MAP_APPFONT ( 130 , 10 ) ;
+ TabStop = TRUE ;
+ Text [ en-US ] = "~Quoted field as text" ;
+ };
++
++ CheckBox CB_DETECT_SPECIAL_NUMBER
++ {
++ Pos = MAP_APPFONT ( 20 , 171 ) ;
++ Size = MAP_APPFONT ( 130 , 10 ) ;
++ TabStop = TRUE ;
++ Text [ en-US ] = "Detect special numbers" ;
++ };
++
++ FixedLine FL_WIDTH
++ {
++ Pos = MAP_APPFONT ( 6 , 187 ) ;
++ Size = MAP_APPFONT ( 252 , 8 ) ;
++ Text [ en-US ] = "Fields" ;
++ };
++ FixedText FT_TYPE
++ {
++ Pos = MAP_APPFONT ( 12 , 200 ) ;
++ Size = MAP_APPFONT ( 60 , 8 ) ;
++ Text [ en-US ] = "Column t~ype";
++ };
++ ListBox LB_TYPE1
++ {
++ Pos = MAP_APPFONT ( 76 , 198 ) ;
++ Size = MAP_APPFONT ( 60 , 68 ) ;
++ TabStop = TRUE ;
++ DropDown = TRUE ;
++ };
++ Control CTR_TABLEBOX
++ {
++ HelpId = HID_SC_ASCII_TABCTR ;
++ Border = TRUE ;
++ DialogControl = TRUE ;
++ Pos = MAP_APPFONT ( 12 , 216 ) ;
++ Size = MAP_APPFONT ( 243 , 82 ) ;
++ };
++
+ String STR_TEXTTOCOLUMNS
+ {
+ Text [ en-US ] = "Text to Columns" ;
+diff --git sc/source/ui/dbgui/scuiasciiopt.cxx sc/source/ui/dbgui/scuiasciiopt.cxx
+index 83f051d..c2a75b2 100644
+--- sc/source/ui/dbgui/scuiasciiopt.cxx
++++ sc/source/ui/dbgui/scuiasciiopt.cxx
+@@ -69,6 +69,8 @@ using namespace com::sun::star::uno;
+ #define TEXT_SEPARATORS "TextSeparators"
+ #define MERGE_DELIMITERS "MergeDelimiters"
+ #define QUOTED_AS_TEXT "QuotedFieldAsText"
++#define DETECT_SPECIAL_NUM "DetectSpecialNumbers"
++#define LANGUAGE "Language"
+ #define SEP_PATH "Office.Calc/Dialogs/CSVImport"
+
+ // ============================================================================
+@@ -119,12 +121,13 @@ sal_Unicode lcl_CharFromCombo( ComboBox& rCombo, const String& rList )
+ }
+
+ static void load_Separators( OUString &sFieldSeparators, OUString &sTextSeparators,
+- bool &bMergeDelimiters, bool& bQuotedAsText, bool &bFixedWidth,
+- sal_Int32 &nFromRow, sal_Int32 &nCharSet )
++ bool &bMergeDelimiters, bool& bQuotedAsText, bool& bDetectSpecialNum,
++ bool &bFixedWidth, sal_Int32 &nFromRow, sal_Int32 &nCharSet,
++ sal_Int32& nLanguage )
+ {
+ Sequence<Any>aValues;
+ const Any *pProperties;
+- Sequence<OUString> aNames(7);
++ Sequence<OUString> aNames(9);
+ OUString* pNames = aNames.getArray();
+ ScLinkConfigItem aItem( OUString::createFromAscii( SEP_PATH ) );
+
+@@ -135,6 +138,8 @@ static void load_Separators( OUString &sFieldSeparators, OUString &sTextSeparato
+ pNames[4] = OUString::createFromAscii( FROM_ROW );
+ pNames[5] = OUString::createFromAscii( CHAR_SET );
+ pNames[6] = OUString::createFromAscii( QUOTED_AS_TEXT );
++ pNames[7] = OUString::createFromAscii( DETECT_SPECIAL_NUM );
++ pNames[8] = OUString::createFromAscii( LANGUAGE );
+ aValues = aItem.GetProperties( aNames );
+ pProperties = aValues.getConstArray();
+ if( pProperties[1].hasValue() )
+@@ -157,16 +162,23 @@ static void load_Separators( OUString &sFieldSeparators, OUString &sTextSeparato
+
+ if ( pProperties[6].hasValue() )
+ pProperties[6] >>= bQuotedAsText;
++
++ if ( pProperties[7].hasValue() )
++ pProperties[7] >>= bDetectSpecialNum;
++
++ if ( pProperties[8].hasValue() )
++ pProperties[8] >>= nLanguage;
+ }
+
+-static void save_Separators( String maSeparators, String maTxtSep, bool bMergeDelimiters, bool bQuotedAsText,
+- bool bFixedWidth, sal_Int32 nFromRow, sal_Int32 nCharSet )
++static void save_Separators(
++ String maSeparators, String maTxtSep, bool bMergeDelimiters, bool bQuotedAsText,
++ bool bDetectSpecialNum, bool bFixedWidth, sal_Int32 nFromRow, sal_Int32 nCharSet, sal_Int32 nLanguage )
+ {
+ OUString sFieldSeparators = OUString( maSeparators );
+ OUString sTextSeparators = OUString( maTxtSep );
+ Sequence<Any> aValues;
+ Any *pProperties;
+- Sequence<OUString> aNames(7);
++ Sequence<OUString> aNames(9);
+ OUString* pNames = aNames.getArray();
+ ScLinkConfigItem aItem( OUString::createFromAscii( SEP_PATH ) );
+
+@@ -177,6 +189,8 @@ static void save_Separators( String maSeparators, String maTxtSep, bool bMergeDe
+ pNames[4] = OUString::createFromAscii( FROM_ROW );
+ pNames[5] = OUString::createFromAscii( CHAR_SET );
+ pNames[6] = OUString::createFromAscii( QUOTED_AS_TEXT );
++ pNames[7] = OUString::createFromAscii( DETECT_SPECIAL_NUM );
++ pNames[8] = OUString::createFromAscii( LANGUAGE );
+ aValues = aItem.GetProperties( aNames );
+ pProperties = aValues.getArray();
+ pProperties[1] <<= sFieldSeparators;
+@@ -186,6 +200,8 @@ static void save_Separators( String maSeparators, String maTxtSep, bool bMergeDe
+ pProperties[4] <<= nFromRow;
+ pProperties[5] <<= nCharSet;
+ pProperties[6] <<= static_cast<sal_Bool>(bQuotedAsText);
++ pProperties[7] <<= static_cast<sal_Bool>(bDetectSpecialNum);
++ pProperties[8] <<= nLanguage;
+
+ aItem.PutProperties(aNames, aValues);
+ }
+@@ -204,6 +220,8 @@ ScImportAsciiDlg::ScImportAsciiDlg( Window* pParent,String aDatName,
+ aFlFieldOpt ( this, ScResId( FL_FIELDOPT ) ),
+ aFtCharSet ( this, ScResId( FT_CHARSET ) ),
+ aLbCharSet ( this, ScResId( LB_CHARSET ) ),
++ aFtCustomLang( this, ScResId( FT_CUSTOMLANG ) ),
++ aLbCustomLang( this, ScResId( LB_CUSTOMLANG ) ),
+
+ aFtRow ( this, ScResId( FT_AT_ROW ) ),
+ aNfRow ( this, ScResId( NF_AT_ROW ) ),
+@@ -219,7 +237,10 @@ ScImportAsciiDlg::ScImportAsciiDlg( Window* pParent,String aDatName,
+ aCkbOther ( this, ScResId( CKB_OTHER ) ),
+ aEdOther ( this, ScResId( ED_OTHER ) ),
+ aCkbAsOnce ( this, ScResId( CB_ASONCE) ),
++ aFlOtherOpt ( this, ScResId( FL_OTHER_OPTIONS ) ),
++
+ aCkbQuotedAsText( this, ScResId(CB_QUOTED_AS_TEXT) ),
++ aCkbDetectNumber( this, ScResId(CB_DETECT_SPECIAL_NUMBER) ),
+ aFtTextSep ( this, ScResId( FT_TEXTSEP ) ),
+ aCbTextSep ( this, ScResId( CB_TEXTSEP ) ),
+
+@@ -260,18 +281,22 @@ ScImportAsciiDlg::ScImportAsciiDlg( Window* pParent,String aDatName,
+ bool bMergeDelimiters = false;
+ bool bFixedWidth = false;
+ bool bQuotedFieldAsText = true;
++ bool bDetectSpecialNum = false;
+ sal_Int32 nFromRow = 1;
+ sal_Int32 nCharSet = -1;
++ sal_Int32 nLanguage = 0;
+ if (mbFileImport)
+ // load separators only when importing csv files.
+ load_Separators (sFieldSeparators, sTextSeparators, bMergeDelimiters,
+- bQuotedFieldAsText, bFixedWidth, nFromRow, nCharSet);
++ bQuotedFieldAsText, bDetectSpecialNum, bFixedWidth, nFromRow, nCharSet, nLanguage);
+ maFieldSeparators = String(sFieldSeparators);
+
+ if( bMergeDelimiters )
+ aCkbAsOnce.Check();
+ if (bQuotedFieldAsText)
+ aCkbQuotedAsText.Check();
++ if (bDetectSpecialNum)
++ aCkbDetectNumber.Check();
+ if( bFixedWidth )
+ aRbFixed.Check();
+ if( nFromRow != 1 )
+@@ -344,6 +369,7 @@ ScImportAsciiDlg::ScImportAsciiDlg( Window* pParent,String aDatName,
+ aCkbComma.SetClickHdl( aSeparatorHdl );
+ aCkbAsOnce.SetClickHdl( aSeparatorHdl );
+ aCkbQuotedAsText.SetClickHdl( aSeparatorHdl );
++ aCkbDetectNumber.SetClickHdl( aSeparatorHdl );
+ aCkbSpace.SetClickHdl( aSeparatorHdl );
+ aCkbOther.SetClickHdl( aSeparatorHdl );
+ aEdOther.SetModifyHdl( aSeparatorHdl );
+@@ -363,6 +389,11 @@ ScImportAsciiDlg::ScImportAsciiDlg( Window* pParent,String aDatName,
+ SetSelectedCharSet();
+ aLbCharSet.SetSelectHdl( LINK( this, ScImportAsciiDlg, CharSetHdl ) );
+
++ aLbCustomLang.SetLanguageList(
++ LANG_LIST_ALL | LANG_LIST_ONLY_KNOWN, false, false);
++ aLbCustomLang.InsertLanguage(LANGUAGE_SYSTEM);
++ aLbCustomLang.SelectLanguage(static_cast<LanguageType>(nLanguage), true);
++
+ // *** column type ListBox ***
+ xub_StrLen nCount = aColumnUser.GetTokenCount();
+ for (xub_StrLen i=0; i<nCount; i++)
+@@ -393,8 +424,9 @@ ScImportAsciiDlg::~ScImportAsciiDlg()
+ {
+ if (mbFileImport)
+ save_Separators( maFieldSeparators, aCbTextSep.GetText(), aCkbAsOnce.IsChecked(),
+- aCkbQuotedAsText.IsChecked(), aRbFixed.IsChecked(),
+- aNfRow.GetValue(), aLbCharSet.GetSelectEntryPos());
++ aCkbQuotedAsText.IsChecked(), aCkbDetectNumber.IsChecked(),
++ aRbFixed.IsChecked(), aNfRow.GetValue(), aLbCharSet.GetSelectEntryPos(),
++ static_cast<sal_Int32>(aLbCustomLang.GetSelectLanguage()) );
+ delete[] mpRowPosArray;
+ }
+
+@@ -473,6 +505,7 @@ void ScImportAsciiDlg::GetOptions( ScAsciiOptions& rOpt )
+ {
+ rOpt.SetCharSet( meCharSet );
+ rOpt.SetCharSetSystem( mbCharSetSystem );
++ rOpt.SetLanguage(aLbCustomLang.GetSelectLanguage());
+ rOpt.SetFixedLen( aRbFixed.IsChecked() );
+ rOpt.SetStartRow( (long)aNfRow.GetValue() );
+ maTableBox.FillColumnData( rOpt );
+@@ -480,9 +513,11 @@ void ScImportAsciiDlg::GetOptions( ScAsciiOptions& rOpt )
+ {
+ rOpt.SetFieldSeps( GetSeparators() );
+ rOpt.SetMergeSeps( aCkbAsOnce.IsChecked() );
+- rOpt.SetQuotedAsText(aCkbQuotedAsText.IsChecked());
+ rOpt.SetTextSep( lcl_CharFromCombo( aCbTextSep, aTextSepList ) );
+ }
++
++ rOpt.SetQuotedAsText(aCkbQuotedAsText.IsChecked());
++ rOpt.SetDetectSpecialNumber(aCkbDetectNumber.IsChecked());
+ }
+
+ void ScImportAsciiDlg::SetTextToColumnsMode()
+@@ -490,12 +525,19 @@ void ScImportAsciiDlg::SetTextToColumnsMode()
+ SetText( maStrTextToColumns );
+ aFtCharSet.Disable();
+ aLbCharSet.Disable();
++ aFtCustomLang.Disable();
++ aLbCustomLang.SelectLanguage(LANGUAGE_SYSTEM);
++ aLbCustomLang.Disable();
+ aFtRow.Disable();
+ aNfRow.Disable();
+
+- // Quoted field as text option is not used for text to columns mode.
++ // Quoted field as text option is not used for text-to-columns mode.
+ aCkbQuotedAsText.Check(false);
+ aCkbQuotedAsText.Disable();
++
++ // Always detect special numbers for text-to-columns mode.
++ aCkbDetectNumber.Check();
++ aCkbDetectNumber.Disable();
+ }
+
+ void ScImportAsciiDlg::SetSelectedCharSet()
+@@ -532,7 +574,6 @@ void ScImportAsciiDlg::SetupSeparatorCtrls()
+ aCkbOther.Enable( bEnable );
+ aEdOther.Enable( bEnable );
+ aCkbAsOnce.Enable( bEnable );
+- aCkbQuotedAsText.Enable( bEnable );
+ aFtTextSep.Enable( bEnable );
+ aCbTextSep.Enable( bEnable );
+ }
+diff --git sc/source/ui/docshell/impex.cxx sc/source/ui/docshell/impex.cxx
+index 15894a3..612ec41 100644
+--- sc/source/ui/docshell/impex.cxx
++++ sc/source/ui/docshell/impex.cxx
+@@ -794,6 +794,7 @@ BOOL ScImportExport::Text2Doc( SvStream& rStrm )
+
+ static bool lcl_PutString(
+ ScDocument* pDoc, SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rStr, BYTE nColFormat,
++ SvNumberFormatter* pFormatter, bool bDetectNumFormat,
+ ::utl::TransliterationWrapper& rTransliteration, CalendarWrapper& rCalendar,
+ ::utl::TransliterationWrapper* pSecondTransliteration, CalendarWrapper* pSecondCalendar )
+ {
+@@ -811,10 +812,10 @@ static bool lcl_PutString(
+ {
+ //! SetString mit Extra-Flag ???
+
+- SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
+- sal_uInt32 nEnglish = pFormatter->GetStandardIndex(LANGUAGE_ENGLISH_US);
++ SvNumberFormatter* pDocFormatter = pDoc->GetFormatTable();
++ sal_uInt32 nEnglish = pDocFormatter->GetStandardIndex(LANGUAGE_ENGLISH_US);
+ double fVal;
+- if ( pFormatter->IsNumberFormat( rStr, nEnglish, fVal ) )
++ if ( pDocFormatter->IsNumberFormat( rStr, nEnglish, fVal ) )
+ {
+ // Zahlformat wird nicht auf englisch gesetzt
+ pDoc->SetValue( nCol, nRow, nTab, fVal );
+@@ -950,9 +951,9 @@ static bool lcl_PutString(
+ }
+ }
+
+- SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
++ SvNumberFormatter* pDocFormatter = pDoc->GetFormatTable();
+ if ( nYear < 100 )
+- nYear = pFormatter->ExpandTwoDigitYear( nYear );
++ nYear = pDocFormatter->ExpandTwoDigitYear( nYear );
+
+ CalendarWrapper* pCalendar = (bSecondCal ? pSecondCalendar : &rCalendar);
+ sal_Int16 nNumMonths = pCalendar->getNumberOfMonthsInYear();
+@@ -988,7 +989,7 @@ static bool lcl_PutString(
+ pCalendar->setValue( i18n::CalendarFieldIndex::MILLISECOND, nMilli );
+ if ( pCalendar->isValid() )
+ {
+- double fDiff = DateTime(*pFormatter->GetNullDate()) -
++ double fDiff = DateTime(*pDocFormatter->GetNullDate()) -
+ pCalendar->getEpochStart();
+ // #i14974# must use getLocalDateTime to get the same
+ // date values as set above
+@@ -1000,10 +1001,10 @@ static bool lcl_PutString(
+ LanguageType eDocLang = eLatin; //! which language for date formats?
+
+ short nType = (nFound > 3 ? NUMBERFORMAT_DATETIME : NUMBERFORMAT_DATE);
+- ULONG nFormat = pFormatter->GetStandardFormat( nType, eDocLang );
++ ULONG nFormat = pDocFormatter->GetStandardFormat( nType, eDocLang );
+ // maybe there is a special format including seconds or milliseconds
+ if (nFound > 5)
+- nFormat = pFormatter->GetStandardFormat( fDays, nFormat, nType, eDocLang);
++ nFormat = pDocFormatter->GetStandardFormat( fDays, nFormat, nType, eDocLang);
+
+ pDoc->PutCell( nCol, nRow, nTab, new ScValueCell(fDays), nFormat, FALSE );
+
+@@ -1015,7 +1016,7 @@ static bool lcl_PutString(
+
+ // Standard or date not determined -> SetString / EditCell
+ if( rStr.Search( _LF ) == STRING_NOTFOUND )
+- pDoc->SetString( nCol, nRow, nTab, rStr );
++ pDoc->SetString( nCol, nRow, nTab, rStr, pFormatter, bDetectNumFormat );
+ else
+ {
+ bMultiLine = true;
+@@ -1025,7 +1026,7 @@ static bool lcl_PutString(
+ }
+
+
+-String lcl_GetFixed( const String& rLine, xub_StrLen nStart, xub_StrLen nNext )
++String lcl_GetFixed( const String& rLine, xub_StrLen nStart, xub_StrLen nNext, bool& rbIsQuoted )
+ {
+ xub_StrLen nLen = rLine.Len();
+ if (nNext > nLen)
+@@ -1039,7 +1040,11 @@ String lcl_GetFixed( const String& rLine, xub_StrLen nStart, xub_StrLen nNext )
+ while ( nSpace > nStart && pStr[nSpace-1] == ' ' )
+ --nSpace;
+
+- return rLine.Copy( nStart, nSpace-nStart );
++ rbIsQuoted = (pStr[nStart] == sal_Unicode('"') && pStr[nSpace-1] == sal_Unicode('"'));
++ if (rbIsQuoted)
++ return rLine.Copy(nStart+1, nSpace-nStart-2);
++ else
++ return rLine.Copy(nStart, nSpace-nStart);
+ }
+
+ BOOL ScImportExport::ExtText2Doc( SvStream& rStrm )
+@@ -1072,9 +1082,9 @@ BOOL ScImportExport::ExtText2Doc( SvStream& rStrm )
+ const BYTE* pColFormat = pExtOptions->GetColFormat();
+ long nSkipLines = pExtOptions->GetStartRow();
+
+- LanguageType eLatin, eCjk, eCtl;
+- pDoc->GetLanguage( eLatin, eCjk, eCtl );
+- LanguageType eDocLang = eLatin; //! which language for date formats?
++ LanguageType eDocLang = pExtOptions->GetLanguage();
++ SvNumberFormatter aNumFormatter(pDoc->GetServiceManager(), eDocLang);
++ bool bDetectNumFormat = pExtOptions->IsDetectSpecialNumber();
+
+ // For date recognition
+ ::utl::TransliterationWrapper aTransliteration(
+@@ -1116,6 +1126,8 @@ BOOL ScImportExport::ExtText2Doc( SvStream& rStrm )
+ // survives the toggle of bDetermineRange down at the end of the do{} loop.
+ bool bRangeIsDetermined = bDetermineRange;
+
++ bool bQuotedAsText = pExtOptions && pExtOptions->IsQuotedAsText();
++
+ ULONG nOriginalStreamPos = rStrm.Tell();
+
+ do
+@@ -1137,7 +1149,8 @@ BOOL ScImportExport::ExtText2Doc( SvStream& rStrm )
+ // SC_COL_SKIP.
+ for ( i=0; i<nInfoCount && nCol <= MAXCOL+1; i++ )
+ {
+- if ( pColFormat[i] != SC_COL_SKIP ) // sonst auch nCol nicht hochzaehlen
++ BYTE nFmt = pColFormat[i];
++ if (nFmt != SC_COL_SKIP) // sonst auch nCol nicht hochzaehlen
+ {
+ if (nCol > MAXCOL)
+ bOverflow = TRUE; // display warning on import
+@@ -1145,11 +1158,15 @@ BOOL ScImportExport::ExtText2Doc( SvStream& rStrm )
+ {
+ xub_StrLen nStart = pColStart[i];
+ xub_StrLen nNext = ( i+1 < nInfoCount ) ? pColStart[i+1] : nLineLen;
+- aCell = lcl_GetFixed( aLine, nStart, nNext );
+- bMultiLine |= lcl_PutString( pDoc, nCol, nRow,
+- nTab, aCell, pColFormat[i],
+- aTransliteration, aCalendar,
+- pEnglishTransliteration, pEnglishCalendar);
++ bool bIsQuoted = false;
++ aCell = lcl_GetFixed( aLine, nStart, nNext, bIsQuoted );
++ if (bIsQuoted && bQuotedAsText)
++ nFmt = SC_COL_TEXT;
++
++ bMultiLine |= lcl_PutString(
++ pDoc, nCol, nRow, nTab, aCell, nFmt,
++ &aNumFormatter, bDetectNumFormat, aTransliteration, aCalendar,
++ pEnglishTransliteration, pEnglishCalendar);
+ }
+ ++nCol;
+ }
+@@ -1185,13 +1202,13 @@ BOOL ScImportExport::ExtText2Doc( SvStream& rStrm )
+ bOverflow = TRUE; // display warning on import
+ else if (!bDetermineRange)
+ {
+- if (bIsQuoted && pExtOptions && pExtOptions->IsQuotedAsText())
++ if (bIsQuoted && bQuotedAsText)
+ nFmt = SC_COL_TEXT;
+
+- bMultiLine |= lcl_PutString( pDoc, nCol, nRow,
+- nTab, aCell, nFmt, aTransliteration,
+- aCalendar, pEnglishTransliteration,
+- pEnglishCalendar);
++ bMultiLine |= lcl_PutString(
++ pDoc, nCol, nRow, nTab, aCell, nFmt,
++ &aNumFormatter, bDetectNumFormat, aTransliteration,
++ aCalendar, pEnglishTransliteration, pEnglishCalendar);
+ }
+ ++nCol;
+ }
+diff --git sc/source/ui/inc/asciiopt.hxx sc/source/ui/inc/asciiopt.hxx
+index 8edd920..d3f9ba4 100644
+--- sc/source/ui/inc/asciiopt.hxx
++++ sc/source/ui/inc/asciiopt.hxx
+@@ -55,7 +55,7 @@
+ #include <tools/stream.hxx>
+ #include <svx/txencbox.hxx>
+ #include "csvtablebox.hxx"
+-
++#include "i18npool/lang.h"
+
+ // ============================================================================
+
+@@ -66,8 +66,10 @@ private:
+ String aFieldSeps;
+ BOOL bMergeFieldSeps;
+ bool bQuotedFieldAsText;
++ bool bDetectSpecialNumber;
+ sal_Unicode cTextSep;
+ CharSet eCharSet;
++ LanguageType eLang;
+ BOOL bCharSetSystem;
+ long nStartRow;
+ USHORT nInfoCount;
+@@ -95,12 +97,14 @@ public:
+ const String& GetFieldSeps() const { return aFieldSeps; }
+ BOOL IsMergeSeps() const { return bMergeFieldSeps; }
+ bool IsQuotedAsText() const { return bQuotedFieldAsText; }
++ bool IsDetectSpecialNumber() const { return bDetectSpecialNumber; }
+ sal_Unicode GetTextSep() const { return cTextSep; }
+ BOOL IsFixedLen() const { return bFixedLen; }
+ USHORT GetInfoCount() const { return nInfoCount; }
+ const xub_StrLen* GetColStart() const { return pColStart; }
+ const BYTE* GetColFormat() const { return pColFormat; }
+ long GetStartRow() const { return nStartRow; }
++ LanguageType GetLanguage() const { return eLang; }
+
+ void SetCharSet( CharSet eNew ) { eCharSet = eNew; }
+ void SetCharSetSystem( BOOL bSet ) { bCharSetSystem = bSet; }
+@@ -108,8 +112,10 @@ public:
+ void SetFieldSeps( const String& rStr ) { aFieldSeps = rStr; }
+ void SetMergeSeps( BOOL bSet ) { bMergeFieldSeps = bSet; }
+ void SetQuotedAsText(bool bSet) { bQuotedFieldAsText = bSet; }
++ void SetDetectSpecialNumber(bool bSet) { bDetectSpecialNumber = bSet; }
+ void SetTextSep( sal_Unicode c ) { cTextSep = c; }
+ void SetStartRow( long nRow) { nStartRow= nRow; }
++ void SetLanguage(LanguageType e) { eLang = e; }
+
+ void SetColInfo( USHORT nCount, const xub_StrLen* pStart, const BYTE* pFormat );
+ void SetColumnInfo( const ScCsvExpDataVec& rDataVec );
+diff --git sc/source/ui/inc/scuiasciiopt.hxx sc/source/ui/inc/scuiasciiopt.hxx
+index 7097838..4515a86 100644
+--- sc/source/ui/inc/scuiasciiopt.hxx
++++ sc/source/ui/inc/scuiasciiopt.hxx
+@@ -35,6 +35,8 @@
+
+
+ #include "asciiopt.hxx"
++#include "svx/langbox.hxx"
++
+ // ============================================================================
+
+ class ScImportAsciiDlg : public ModalDialog
+@@ -49,6 +51,8 @@ class ScImportAsciiDlg : public ModalDialog
+ FixedLine aFlFieldOpt;
+ FixedText aFtCharSet;
+ SvxTextEncodingBox aLbCharSet;
++ FixedText aFtCustomLang;
++ SvxLanguageBox aLbCustomLang;
+
+ FixedText aFtRow;
+ NumericField aNfRow;
+@@ -64,7 +68,12 @@ class ScImportAsciiDlg : public ModalDialog
+ CheckBox aCkbOther;
+ Edit aEdOther;
+ CheckBox aCkbAsOnce;
++
++ FixedLine aFlOtherOpt;
++
+ CheckBox aCkbQuotedAsText;
++ CheckBox aCkbDetectNumber;
++
+ FixedText aFtTextSep;
+ ComboBox aCbTextSep;
+
diff --git a/patches/dev300/calc-formula-externref-countif-fix.diff b/patches/dev300/calc-formula-externref-countif-fix.diff
index 2be4194..d5b5d5b 100644
--- a/patches/dev300/calc-formula-externref-countif-fix.diff
+++ b/patches/dev300/calc-formula-externref-countif-fix.diff
@@ -711,18 +711,20 @@ diff --git sc/source/core/tool/makefile.mk sc/source/core/tool/makefile.mk
index 898c2ef..85065d9 100644
--- sc/source/core/tool/makefile.mk
+++ sc/source/core/tool/makefile.mk
-@@ -107,6 +107,7 @@ SLOFILES = \
+@@ -107,7 +107,8 @@ SLOFILES = \
$(SLO)$/refupdat.obj \
$(SLO)$/scmatrix.obj \
$(SLO)$/sctictac.obj \
+ $(SLO)$/funcqueryhandler.obj \
+ $(SLO)$/stringutil.obj \
$(SLO)$/subtotal.obj \
$(SLO)$/token.obj \
$(SLO)$/unitconv.obj \
-@@ -131,5 +132,6 @@ EXCEPTIONSFILES= \
+@@ -131,6 +132,7 @@ EXCEPTIONSFILES= \
$(SLO)$/lookupcache.obj \
$(SLO)$/prnsave.obj \
$(SLO)$/reftokenhelper.obj \
+ $(SLO)$/funcqueryhandler.obj \
+ $(SLO)$/stringutil.obj \
$(SLO)$/token.obj
diff --git a/patches/dev300/calc-html-csv-import-force-text-cell.diff b/patches/dev300/calc-html-csv-import-force-text-cell.diff
index 6ddcfc2..7e0fdff 100644
--- a/patches/dev300/calc-html-csv-import-force-text-cell.diff
+++ b/patches/dev300/calc-html-csv-import-force-text-cell.diff
@@ -93,9 +93,9 @@ index 43163c4..7f8d968 100644
--- sc/inc/table.hxx
+++ sc/inc/table.hxx
@@ -85,7 +85,7 @@ struct ScLineFlags;
+ struct ScFunctionData;
+ struct ScLineFlags;
class CollatorWrapper;
- class ScFlatBoolRowSegments;
- class ScFlatBoolColSegments;
-
+struct ScSetStringParam;
diff --git a/patches/dev300/calc-html-import-custom-lang-sc.diff b/patches/dev300/calc-html-import-custom-lang-sc.diff
index a86d97c..b2a4733 100644
--- a/patches/dev300/calc-html-import-custom-lang-sc.diff
+++ b/patches/dev300/calc-html-import-custom-lang-sc.diff
@@ -1,28 +1,37 @@
---- sc/inc/column.hxx.old 2009-04-06 16:41:50.000000000 +0000
-+++ sc/inc/column.hxx 2009-04-06 16:42:07.000000000 +0000
-@@ -243,7 +243,8 @@ public:
+diff --git sc/inc/column.hxx sc/inc/column.hxx
+index 7d297e1..babda9e 100644
+--- sc/inc/column.hxx
++++ sc/inc/column.hxx
+@@ -243,7 +243,9 @@ public:
// TRUE = Zahlformat gesetzt
BOOL SetString( SCROW nRow, SCTAB nTab, const String& rString,
- formula::FormulaGrammar::AddressConvention conv = formula::FormulaGrammar::CONV_OOO );
+ formula::FormulaGrammar::AddressConvention conv = formula::FormulaGrammar::CONV_OOO,
-+ SvNumberFormatter* pFormatter = NULL );
++ SvNumberFormatter* pFormatter = NULL,
++ bool bDetectNumberFormat = true );
void SetValue( SCROW nRow, const double& rVal);
void SetError( SCROW nRow, const USHORT nError);
---- sc/inc/document.hxx.old 2009-04-06 16:42:05.000000000 +0000
-+++ sc/inc/document.hxx 2009-04-06 16:42:07.000000000 +0000
-@@ -733,7 +733,7 @@ public:
+diff --git sc/inc/document.hxx sc/inc/document.hxx
+index 528ef96..0da5a7a 100644
+--- sc/inc/document.hxx
++++ sc/inc/document.hxx
+@@ -736,7 +736,9 @@ public:
SC_DLLPUBLIC void PutCell(SCCOL nCol, SCROW nRow, SCTAB nTab, ScBaseCell* pCell,
ULONG nFormatIndex, BOOL bForceTab = FALSE);
// return TRUE = Zahlformat gesetzt
- SC_DLLPUBLIC BOOL SetString( SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString );
-+ SC_DLLPUBLIC BOOL SetString( SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString, SvNumberFormatter* pFormatter = NULL );
++ SC_DLLPUBLIC BOOL SetString(
++ SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString,
++ SvNumberFormatter* pFormatter = NULL, bool bDetectNumberFormat = true );
SC_DLLPUBLIC void SetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, const double& rVal );
void SetError( SCCOL nCol, SCROW nRow, SCTAB nTab, const USHORT nError);
---- sc/inc/filter.hxx.old 2009-04-02 10:45:43.000000000 +0000
-+++ sc/inc/filter.hxx 2009-04-06 16:42:07.000000000 +0000
+diff --git sc/inc/filter.hxx sc/inc/filter.hxx
+index 82a2b84..63c9ec6 100644
+--- sc/inc/filter.hxx
++++ sc/inc/filter.hxx
@@ -42,6 +42,7 @@ class SvStream;
class ScAddress;
class ScDocument;
@@ -31,27 +40,31 @@
// Return-Werte Im-/Exportfilter (ULONG)
-@@ -92,7 +93,7 @@ class ScEEAbsImport {
+@@ -92,7 +93,9 @@ class ScEEAbsImport {
virtual ~ScEEAbsImport() {}
virtual ULONG Read( SvStream& rStream, const String& rBaseURL ) = 0;
virtual ScRange GetRange() = 0;
- virtual void WriteToDocument( BOOL bSizeColsRows = FALSE, double nOutputFactor = 1.0 ) = 0;
-+ virtual void WriteToDocument( BOOL bSizeColsRows = FALSE, double nOutputFactor = 1.0, SvNumberFormatter* pFormatter = NULL ) = 0;
++ virtual void WriteToDocument(
++ BOOL bSizeColsRows = FALSE, double nOutputFactor = 1.0,
++ SvNumberFormatter* pFormatter = NULL, bool bConvertDate = true ) = 0;
};
class ScFormatFilterPlugin {
-@@ -109,7 +110,8 @@ class ScFormatFilterPlugin {
+@@ -109,7 +112,8 @@ class ScFormatFilterPlugin {
virtual FltError ScImportDif( SvStream&, ScDocument*, const ScAddress& rInsPos,
const CharSet eSrc = RTL_TEXTENCODING_DONTKNOW, UINT32 nDifOption = SC_DIFOPT_EXCEL ) = 0;
virtual FltError ScImportRTF( SvStream&, const String& rBaseURL, ScDocument*, ScRange& rRange ) = 0;
- virtual FltError ScImportHTML( SvStream&, const String& rBaseURL, ScDocument*, ScRange& rRange, double nOutputFactor = 1.0, BOOL bCalcWidthHeight = TRUE ) = 0;
+ virtual FltError ScImportHTML( SvStream&, const String& rBaseURL, ScDocument*, ScRange& rRange, double nOutputFactor = 1.0,
-+ BOOL bCalcWidthHeight = TRUE, SvNumberFormatter* pFormatter = NULL ) = 0;
++ BOOL bCalcWidthHeight = TRUE, SvNumberFormatter* pFormatter = NULL, bool bConvertDate = true ) = 0;
// various import helpers
virtual ScEEAbsImport *CreateRTFImport( ScDocument* pDoc, const ScRange& rRange ) = 0;
---- sc/inc/sc.hrc.old 2009-04-06 16:42:06.000000000 +0000
-+++ sc/inc/sc.hrc 2009-04-06 16:42:07.000000000 +0000
+diff --git sc/inc/sc.hrc sc/inc/sc.hrc
+index 2c7ad7b..cf99a55 100644
+--- sc/inc/sc.hrc
++++ sc/inc/sc.hrc
@@ -1673,6 +1673,9 @@
#define RID_SCDLG_TAB_BG_COLOR (SC_OOO_BUILD_START + 11)
@@ -62,8 +75,10 @@
#endif
---- sc/inc/scabstdlg.hxx.old 2009-04-06 16:42:06.000000000 +0000
-+++ sc/inc/scabstdlg.hxx 2009-04-06 16:42:07.000000000 +0000
+diff --git sc/inc/scabstdlg.hxx sc/inc/scabstdlg.hxx
+index 637682d..1c9f587 100644
+--- sc/inc/scabstdlg.hxx
++++ sc/inc/scabstdlg.hxx
@@ -41,6 +41,7 @@
#include "sc.hrc"
#include "global.hxx"
@@ -72,7 +87,7 @@
#include <tabvwsh.hxx>
-@@ -303,6 +304,13 @@ class AbstractScImportOptionsDlg : publi
+@@ -303,6 +304,14 @@ class AbstractScImportOptionsDlg : public VclAbstractDialog //add for ScImportO
public:
virtual void GetImportOptions( ScImportOptions& rOptions ) const = 0;
};
@@ -81,12 +96,13 @@
+{
+public:
+ virtual LanguageType GetLanguageType() const = 0;
++ virtual bool IsDateConversionSet() const = 0;
+};
+
//-------Scabstract fractory ---------------------------
class ScAbstractDialogFactory
{
-@@ -313,6 +321,8 @@ public:
+@@ -313,6 +322,8 @@ public:
SvStream* pInStream, int nId,
sal_Unicode cSep = '\t') = 0;
@@ -95,30 +111,111 @@
virtual AbstractScAutoFormatDlg * CreateScAutoFormatDlg( Window* pParent, //add for ScAutoFormatDlg
ScAutoFormat* pAutoFormat,
const ScAutoFormatData* pSelFormatData,
---- sc/inc/table.hxx.old 2009-04-06 16:42:06.000000000 +0000
-+++ sc/inc/table.hxx 2009-04-06 16:42:07.000000000 +0000
-@@ -253,7 +253,7 @@ public:
+diff --git sc/inc/stringutil.hxx sc/inc/stringutil.hxx
+new file mode 100644
+index 0000000..4ca8629
+--- /dev/null
++++ sc/inc/stringutil.hxx
+@@ -0,0 +1,56 @@
++/*************************************************************************
++ *
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * Copyright 2008 by Sun Microsystems, Inc.
++ *
++ * OpenOffice.org - a multi-platform office productivity suite
++ *
++ * $RCSfile: table.hxx,v $
++ * $Revision: 1.35 $
++ *
++ * This file is part of OpenOffice.org.
++ *
++ * OpenOffice.org is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU Lesser General Public License version 3
++ * only, as published by the Free Software Foundation.
++ *
++ * OpenOffice.org is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU Lesser General Public License version 3 for more details
++ * (a copy is included in the LICENSE file that accompanied this code).
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * version 3 along with OpenOffice.org. If not, see
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef SC_STRINGUTIL_HXX
++#define SC_STRINGUTIL_HXX
++
++#include "rtl/ustring.hxx"
++
++class ScStringUtil
++{
++public:
++ /**
++ * Check if a given string is a simple decimal number (e.g. 12.345). We
++ * don't do any elaborate parsing here; we only check for the simplest
++ * case of decimal number format.
++ *
++ * @param rStr string to parse
++ * @param dsep decimal separator
++ * @param gsep group separator (aka thousands separator)
++ * @param rVal value of successfully parsed number
++ *
++ * @return true if the string is a valid number, false otherwise.
++ */
++ static bool parseSimpleNumber(
++ const ::rtl::OUString& rStr, sal_Unicode dsep, sal_Unicode gsep, double& rVal);
++};
++
++
++#endif
+diff --git sc/inc/table.hxx sc/inc/table.hxx
+index b95c40c..ea24628 100644
+--- sc/inc/table.hxx
++++ sc/inc/table.hxx
+@@ -253,7 +253,8 @@ public:
void PutCell( SCCOL nCol, SCROW nRow, ScBaseCell* pCell );
void PutCell(SCCOL nCol, SCROW nRow, ULONG nFormatIndex, ScBaseCell* pCell);
// TRUE = Zahlformat gesetzt
- BOOL SetString( SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString );
-+ BOOL SetString( SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString, SvNumberFormatter* pFormatter = NULL );
++ BOOL SetString( SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString,
++ SvNumberFormatter* pFormatter = NULL, bool bDetectNumberFormat = true );
void SetValue( SCCOL nCol, SCROW nRow, const double& rVal );
void SetError( SCCOL nCol, SCROW nRow, USHORT nError);
---- sc/source/core/data/column3.cxx.old 2009-04-06 16:42:07.000000000 +0000
-+++ sc/source/core/data/column3.cxx 2009-04-06 16:42:07.000000000 +0000
-@@ -1218,7 +1218,8 @@ void ScColumn::StartListeningInArea( SCR
+diff --git sc/source/core/data/column3.cxx sc/source/core/data/column3.cxx
+index b1fac42..40f6370 100644
+--- sc/source/core/data/column3.cxx
++++ sc/source/core/data/column3.cxx
+@@ -54,6 +54,13 @@
+ #include "markdata.hxx"
+ #include "detfunc.hxx" // fuer Notizen bei DeleteRange
+ #include "postit.hxx"
++#include "stringutil.hxx"
++
++#include <com/sun/star/i18n/LocaleDataItem.hpp>
++
++using ::com::sun::star::i18n::LocaleDataItem;
++using ::rtl::OUString;
++using ::rtl::OUStringBuffer;
+
+ // Err527 Workaround
+ extern const ScFormulaCell* pLastFormulaTreeTop; // in cellform.cxx
+@@ -1218,7 +1225,8 @@ void ScColumn::StartListeningInArea( SCROW nRow1, SCROW nRow2 )
// TRUE = Zahlformat gesetzt
BOOL ScColumn::SetString( SCROW nRow, SCTAB nTabP, const String& rString,
- formula::FormulaGrammar::AddressConvention eConv )
+ formula::FormulaGrammar::AddressConvention eConv,
-+ SvNumberFormatter* pFormatter )
++ SvNumberFormatter* pFormatter, bool bDetectNumberFormat )
{
BOOL bNumFmtSet = FALSE;
if (VALIDROW(nRow))
-@@ -1230,7 +1231,8 @@ BOOL ScColumn::SetString( SCROW nRow, SC
+@@ -1230,7 +1238,8 @@ BOOL ScColumn::SetString( SCROW nRow, SCTAB nTabP, const String& rString,
double nVal;
sal_uInt32 nIndex, nOldIndex = 0;
sal_Unicode cFirstChar;
@@ -128,114 +225,377 @@
SfxObjectShell* pDocSh = pDocument->GetDocumentShell();
if ( pDocSh )
bIsLoading = pDocSh->IsLoading();
---- sc/source/core/data/document.cxx.old 2009-04-06 16:41:59.000000000 +0000
-+++ sc/source/core/data/document.cxx 2009-04-06 16:42:07.000000000 +0000
-@@ -2447,10 +2447,10 @@ void ScDocument::PutCell( const ScAddres
+@@ -1297,48 +1306,80 @@ BOOL ScColumn::SetString( SCROW nRow, SCTAB nTabP, const String& rString,
+ if ( !bIsText )
+ nIndex = nOldIndex = pFormatter->GetStandardIndex();
+ }
+- if ( !bIsText &&
+- pFormatter->IsNumberFormat(rString, nIndex, nVal) )
+- { // Zahl
+- pNewCell = new ScValueCell( nVal );
+- if ( nIndex != nOldIndex)
+- {
+- // #i22345# New behavior: Apply the detected number format only if
+- // the old one was the default number, date, time or boolean format.
+- // Exception: If the new format is boolean, always apply it.
+
+- BOOL bOverwrite = FALSE;
+- const SvNumberformat* pOldFormat = pFormatter->GetEntry( nOldIndex );
+- if ( pOldFormat )
++ do
++ {
++ if (bIsText)
++ break;
++
++ if (bDetectNumberFormat)
++ {
++ if (!pFormatter->IsNumberFormat(rString, nIndex, nVal))
++ break;
++
++ pNewCell = new ScValueCell( nVal );
++ if ( nIndex != nOldIndex)
+ {
+- short nOldType = pOldFormat->GetType() & ~NUMBERFORMAT_DEFINED;
+- if ( nOldType == NUMBERFORMAT_NUMBER || nOldType == NUMBERFORMAT_DATE ||
+- nOldType == NUMBERFORMAT_TIME || nOldType == NUMBERFORMAT_LOGICAL )
++ // #i22345# New behavior: Apply the detected number format only if
++ // the old one was the default number, date, time or boolean format.
++ // Exception: If the new format is boolean, always apply it.
++
++ BOOL bOverwrite = FALSE;
++ const SvNumberformat* pOldFormat = pFormatter->GetEntry( nOldIndex );
++ if ( pOldFormat )
+ {
+- if ( nOldIndex == pFormatter->GetStandardFormat(
+- nOldType, pOldFormat->GetLanguage() ) )
++ short nOldType = pOldFormat->GetType() & ~NUMBERFORMAT_DEFINED;
++ if ( nOldType == NUMBERFORMAT_NUMBER || nOldType == NUMBERFORMAT_DATE ||
++ nOldType == NUMBERFORMAT_TIME || nOldType == NUMBERFORMAT_LOGICAL )
+ {
+- bOverwrite = TRUE; // default of these types can be overwritten
++ if ( nOldIndex == pFormatter->GetStandardFormat(
++ nOldType, pOldFormat->GetLanguage() ) )
++ {
++ bOverwrite = TRUE; // default of these types can be overwritten
++ }
+ }
+ }
+- }
+- if ( !bOverwrite && pFormatter->GetType( nIndex ) == NUMBERFORMAT_LOGICAL )
+- {
+- bOverwrite = TRUE; // overwrite anything if boolean was detected
+- }
++ if ( !bOverwrite && pFormatter->GetType( nIndex ) == NUMBERFORMAT_LOGICAL )
++ {
++ bOverwrite = TRUE; // overwrite anything if boolean was detected
++ }
+
+- if ( bOverwrite )
+- {
+- ApplyAttr( nRow, SfxUInt32Item( ATTR_VALUE_FORMAT,
+- (UINT32) nIndex) );
+- bNumFmtSet = TRUE;
++ if ( bOverwrite )
++ {
++ ApplyAttr( nRow, SfxUInt32Item( ATTR_VALUE_FORMAT,
++ (UINT32) nIndex) );
++ bNumFmtSet = TRUE;
++ }
+ }
+- }
+- }
+- else // Text
+- pNewCell = new ScStringCell( rString );
+- }
+- }
++ }
++ else
++ {
++ // Only check if the string is a regular number.
++ const LocaleDataWrapper* pLocale = pFormatter->GetLocaleData();
++ if (!pLocale)
++ break;
++
++ LocaleDataItem aLocaleItem = pLocale->getLocaleItem();
++ const OUString& rDecSep = aLocaleItem.decimalSeparator;
++ const OUString& rGroupSep = aLocaleItem.thousandSeparator;
++ if (rDecSep.getLength() != 1 || rGroupSep.getLength() != 1)
++ break;
++
++ sal_Unicode dsep = rDecSep.getStr()[0];
++ sal_Unicode gsep = rGroupSep.getStr()[0];
++
++ if (!ScStringUtil::parseSimpleNumber(rString, dsep, gsep, nVal))
++ break;
++
++ pNewCell = new ScValueCell(nVal);
++ }
++ }
++ while (false);
++
++ if (!pNewCell)
++ pNewCell = new ScStringCell(rString);
++ }
++ }
+
+ if ( bIsLoading && (!nCount || nRow > pItems[nCount-1].nRow) )
+ { // Search einsparen und ohne Umweg ueber Insert, Listener aufbauen
+diff --git sc/source/core/data/document.cxx sc/source/core/data/document.cxx
+index 6c96215..a3b7e49 100644
+--- sc/source/core/data/document.cxx
++++ sc/source/core/data/document.cxx
+@@ -2451,10 +2451,11 @@ void ScDocument::PutCell( const ScAddress& rPos, ScBaseCell* pCell, BOOL bForceT
}
-BOOL ScDocument::SetString( SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString )
-+BOOL ScDocument::SetString( SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString, SvNumberFormatter* pFormatter )
++BOOL ScDocument::SetString( SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString,
++ SvNumberFormatter* pFormatter, bool bDetectNumberFormat )
{
if ( ValidTab(nTab) && pTab[nTab] )
- return pTab[nTab]->SetString( nCol, nRow, nTab, rString );
-+ return pTab[nTab]->SetString( nCol, nRow, nTab, rString, pFormatter );
++ return pTab[nTab]->SetString( nCol, nRow, nTab, rString, pFormatter, bDetectNumberFormat );
else
return FALSE;
}
---- sc/source/core/data/table2.cxx.old 2009-04-06 16:42:06.000000000 +0000
-+++ sc/source/core/data/table2.cxx 2009-04-06 16:42:07.000000000 +0000
-@@ -841,10 +841,10 @@ void ScTable::PutCell( const ScAddress&
+diff --git sc/source/core/data/table2.cxx sc/source/core/data/table2.cxx
+index d2f8710..8cb6f7a 100644
+--- sc/source/core/data/table2.cxx
++++ sc/source/core/data/table2.cxx
+@@ -841,10 +841,12 @@ void ScTable::PutCell( const ScAddress& rPos, ULONG nFormatIndex, ScBaseCell* pC
}
-BOOL ScTable::SetString( SCCOL nCol, SCROW nRow, SCTAB nTabP, const String& rString )
-+BOOL ScTable::SetString( SCCOL nCol, SCROW nRow, SCTAB nTabP, const String& rString, SvNumberFormatter* pFormatter )
++BOOL ScTable::SetString( SCCOL nCol, SCROW nRow, SCTAB nTabP, const String& rString,
++ SvNumberFormatter* pFormatter, bool bDetectNumberFormat )
{
if (ValidColRow(nCol,nRow))
- return aCol[nCol].SetString( nRow, nTabP, rString );
-+ return aCol[nCol].SetString( nRow, nTabP, rString, pDocument->GetAddressConvention(), pFormatter );
++ return aCol[nCol].SetString(
++ nRow, nTabP, rString, pDocument->GetAddressConvention(), pFormatter, bDetectNumberFormat );
else
return FALSE;
}
---- sc/source/filter/html/htmlimp.cxx.old 2009-04-02 10:44:57.000000000 +0000
-+++ sc/source/filter/html/htmlimp.cxx 2009-04-06 16:42:07.000000000 +0000
-@@ -63,13 +63,13 @@
+diff --git sc/source/core/tool/makefile.mk sc/source/core/tool/makefile.mk
+index 1bf94ea..b54c041 100644
+--- sc/source/core/tool/makefile.mk
++++ sc/source/core/tool/makefile.mk
+@@ -107,6 +107,7 @@ SLOFILES = \
+ $(SLO)$/refupdat.obj \
+ $(SLO)$/scmatrix.obj \
+ $(SLO)$/sctictac.obj \
++ $(SLO)$/stringutil.obj \
+ $(SLO)$/subtotal.obj \
+ $(SLO)$/token.obj \
+ $(SLO)$/unitconv.obj \
+@@ -130,6 +131,7 @@ EXCEPTIONSFILES= \
+ $(SLO)$/lookupcache.obj \
+ $(SLO)$/prnsave.obj \
+ $(SLO)$/reftokenhelper.obj \
++ $(SLO)$/stringutil.obj \
+ $(SLO)$/token.obj
+
+ # [kh] POWERPC compiler problem
+diff --git sc/source/core/tool/stringutil.cxx sc/source/core/tool/stringutil.cxx
+new file mode 100644
+index 0000000..eaf756e
+--- /dev/null
++++ sc/source/core/tool/stringutil.cxx
+@@ -0,0 +1,101 @@
++/*************************************************************************
++ *
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * Copyright 2008 by Sun Microsystems, Inc.
++ *
++ * OpenOffice.org - a multi-platform office productivity suite
++ *
++ * $RCSfile: table.hxx,v $
++ * $Revision: 1.35 $
++ *
++ * This file is part of OpenOffice.org.
++ *
++ * OpenOffice.org is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU Lesser General Public License version 3
++ * only, as published by the Free Software Foundation.
++ *
++ * OpenOffice.org is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU Lesser General Public License version 3 for more details
++ * (a copy is included in the LICENSE file that accompanied this code).
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * version 3 along with OpenOffice.org. If not, see
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_sc.hxx"
++
++// System - Includes -----------------------------------------------------
++
++#include "stringutil.hxx"
++#include "rtl/ustrbuf.hxx"
++
++using ::rtl::OUString;
++using ::rtl::OUStringBuffer;
++
++bool ScStringUtil::parseSimpleNumber(
++ const OUString& rStr, sal_Unicode dsep, sal_Unicode gsep, double& rVal)
++{
++ OUStringBuffer aBuf;
++ sal_Int32 n = rStr.getLength();
++ const sal_Unicode* p = rStr.getStr();
++ sal_Int32 nPosDSep = -1, nPosGSep = -1;
++ for (sal_Int32 i = 0; i < n; ++i)
++ {
++ sal_Unicode c = p[i];
++ if (sal_Unicode('0') <= c && c <= sal_Unicode('9'))
++ {
++ // this is a digit.
++ aBuf.append(c);
++ }
++ else if (c == dsep)
++ {
++ // this is a decimal separator.
++
++ if (nPosDSep >= 0)
++ // a second decimal separator -> not a valid number.
++ return false;
++ if (nPosGSep >= 0 && i - nPosGSep != 4)
++ // the number has a group separator and the decimal sep is not
++ // positioned correctly.
++ return false;
++
++ nPosDSep = i;
++ aBuf.append(c);
++ }
++ else if (c == gsep)
++ {
++ // this is a group (thousand) separator.
++ if (i == 0)
++ return false;
++
++ if (nPosGSep >= 0 && i - nPosGSep != 4)
++ {
++ // this group separator is not positioned correctly relative
++ // to the last group separator.
++ return false;
++ }
++
++ nPosGSep = i;
++ }
++ else if (c == sal_Unicode('-') || c == sal_Unicode('+'))
++ {
++ // A sign must be the first character if it's given.
++ if (i == 0)
++ aBuf.append(c);
++ else
++ return false;
++ }
++ else
++ return false;
++ }
++
++ rVal = aBuf.makeStringAndClear().toDouble();
++ return true;
++}
+diff --git sc/source/filter/html/htmlimp.cxx sc/source/filter/html/htmlimp.cxx
+index 8c92f3d..8fbd9aa 100644
+--- sc/source/filter/html/htmlimp.cxx
++++ sc/source/filter/html/htmlimp.cxx
+@@ -63,13 +63,14 @@
//------------------------------------------------------------------------
FltError ScFormatFilterPluginImpl::ScImportHTML( SvStream &rStream, const String& rBaseURL, ScDocument *pDoc,
- ScRange& rRange, double nOutputFactor, BOOL bCalcWidthHeight )
-+ ScRange& rRange, double nOutputFactor, BOOL bCalcWidthHeight, SvNumberFormatter* pFormatter )
++ ScRange& rRange, double nOutputFactor, BOOL bCalcWidthHeight, SvNumberFormatter* pFormatter,
++ bool bConvertDate )
{
ScHTMLImport aImp( pDoc, rBaseURL, rRange, bCalcWidthHeight );
FltError nErr = (FltError) aImp.Read( rStream, rBaseURL );
ScRange aR = aImp.GetRange();
rRange.aEnd = aR.aEnd;
- aImp.WriteToDocument( TRUE, nOutputFactor );
-+ aImp.WriteToDocument( TRUE, nOutputFactor, pFormatter );
++ aImp.WriteToDocument( TRUE, nOutputFactor, pFormatter, bConvertDate );
return nErr;
}
-@@ -137,9 +137,9 @@ void ScHTMLImport::InsertRangeName( ScDo
+@@ -137,9 +138,10 @@ void ScHTMLImport::InsertRangeName( ScDocument* pDoc, const String& rName, const
delete pRangeData;
}
-void ScHTMLImport::WriteToDocument( BOOL bSizeColsRows, double nOutputFactor )
-+void ScHTMLImport::WriteToDocument( BOOL bSizeColsRows, double nOutputFactor, SvNumberFormatter* pFormatter )
++void ScHTMLImport::WriteToDocument(
++ BOOL bSizeColsRows, double nOutputFactor, SvNumberFormatter* pFormatter, bool bConvertDate )
{
- ScEEImport::WriteToDocument( bSizeColsRows, nOutputFactor );
-+ ScEEImport::WriteToDocument( bSizeColsRows, nOutputFactor, pFormatter );
++ ScEEImport::WriteToDocument( bSizeColsRows, nOutputFactor, pFormatter, bConvertDate );
const ScHTMLParser* pParser = GetParser();
const ScHTMLTable* pGlobTable = pParser->GetGlobalTable();
---- sc/source/filter/inc/eeimport.hxx.old 2009-04-02 10:44:58.000000000 +0000
-+++ sc/source/filter/inc/eeimport.hxx 2009-04-06 16:42:07.000000000 +0000
-@@ -63,7 +63,8 @@ public:
+diff --git sc/source/filter/inc/eeimport.hxx sc/source/filter/inc/eeimport.hxx
+index fef4486..32d7d0a 100644
+--- sc/source/filter/inc/eeimport.hxx
++++ sc/source/filter/inc/eeimport.hxx
+@@ -63,7 +63,9 @@ public:
virtual ULONG Read( SvStream& rStream, const String& rBaseURL );
virtual ScRange GetRange() { return maRange; }
virtual void WriteToDocument( BOOL bSizeColsRows = FALSE,
- double nOutputFactor = 1.0 );
+ double nOutputFactor = 1.0,
-+ SvNumberFormatter* pFormatter = NULL );
++ SvNumberFormatter* pFormatter = NULL,
++ bool bConvertDate = true );
};
#endif
---- sc/source/filter/inc/ftools.hxx.old 2009-04-02 10:44:58.000000000 +0000
-+++ sc/source/filter/inc/ftools.hxx 2009-04-06 16:42:07.000000000 +0000
-@@ -522,7 +522,9 @@ class ScFormatFilterPluginImpl : public
+diff --git sc/source/filter/inc/ftools.hxx sc/source/filter/inc/ftools.hxx
+index b670900..79c698e 100644
+--- sc/source/filter/inc/ftools.hxx
++++ sc/source/filter/inc/ftools.hxx
+@@ -522,7 +522,9 @@ class ScFormatFilterPluginImpl : public ScFormatFilterPlugin {
virtual FltError ScImportDif( SvStream&, ScDocument*, const ScAddress& rInsPos,
const CharSet eSrc = RTL_TEXTENCODING_DONTKNOW, UINT32 nDifOption = SC_DIFOPT_EXCEL );
virtual FltError ScImportRTF( SvStream&, const String& rBaseURL, ScDocument*, ScRange& rRange );
- virtual FltError ScImportHTML( SvStream&, const String& rBaseURL, ScDocument*, ScRange& rRange, double nOutputFactor = 1.0, BOOL bCalcWidthHeight = TRUE );
+ virtual FltError ScImportHTML( SvStream&, const String& rBaseURL, ScDocument*, ScRange& rRange,
+ double nOutputFactor = 1.0, BOOL bCalcWidthHeight = TRUE,
-+ SvNumberFormatter* pFormatter = NULL );
++ SvNumberFormatter* pFormatter = NULL, bool bConvertDate = true );
virtual ScEEAbsImport *CreateRTFImport( ScDocument* pDoc, const ScRange& rRange );
virtual ScEEAbsImport *CreateHTMLImport( ScDocument* pDocP, const String& rBaseURL, const ScRange& rRange, BOOL bCalcWidthHeight );
---- sc/source/filter/inc/htmlimp.hxx.old 2009-04-02 10:44:58.000000000 +0000
-+++ sc/source/filter/inc/htmlimp.hxx 2009-04-06 16:42:07.000000000 +0000
-@@ -45,7 +45,7 @@ public:
+diff --git sc/source/filter/inc/htmlimp.hxx sc/source/filter/inc/htmlimp.hxx
+index 96ce225..aafe91b 100644
+--- sc/source/filter/inc/htmlimp.hxx
++++ sc/source/filter/inc/htmlimp.hxx
+@@ -45,7 +45,8 @@ public:
virtual ~ScHTMLImport();
const ScHTMLParser* GetParser() const { return (ScHTMLParser*)mpParser; }
- virtual void WriteToDocument( BOOL bSizeColsRows = FALSE, double nOutputFactor = 1.0 );
-+ virtual void WriteToDocument( BOOL bSizeColsRows = FALSE, double nOutputFactor = 1.0, SvNumberFormatter* pFormatter = NULL );
++ virtual void WriteToDocument( BOOL bSizeColsRows = FALSE, double nOutputFactor = 1.0,
++ SvNumberFormatter* pFormatter = NULL, bool bConvertDate = true );
static String GetHTMLRangeNameList( ScDocument* pDoc, const String& rOrigName );
};
---- sc/source/filter/rtf/eeimpars.cxx.old 2009-04-02 10:44:58.000000000 +0000
-+++ sc/source/filter/rtf/eeimpars.cxx 2009-04-06 16:42:07.000000000 +0000
-@@ -129,7 +129,7 @@ ULONG ScEEImport::Read( SvStream& rStrea
+diff --git sc/source/filter/rtf/eeimpars.cxx sc/source/filter/rtf/eeimpars.cxx
+index 3f813a1..e4b28a7 100644
+--- sc/source/filter/rtf/eeimpars.cxx
++++ sc/source/filter/rtf/eeimpars.cxx
+@@ -129,7 +129,7 @@ ULONG ScEEImport::Read( SvStream& rStream, const String& rBaseURL )
}
-void ScEEImport::WriteToDocument( BOOL bSizeColsRows, double nOutputFactor )
-+void ScEEImport::WriteToDocument( BOOL bSizeColsRows, double nOutputFactor, SvNumberFormatter* pFormatter )
++void ScEEImport::WriteToDocument( BOOL bSizeColsRows, double nOutputFactor, SvNumberFormatter* pFormatter, bool bConvertDate )
{
ScProgress* pProgress = new ScProgress( mpDoc->GetDocumentShell(),
ScGlobal::GetRscString( STR_LOAD_DOC ), mpParser->Count() );
-@@ -150,7 +150,8 @@ void ScEEImport::WriteToDocument( BOOL b
+@@ -150,7 +150,8 @@ void ScEEImport::WriteToDocument( BOOL bSizeColsRows, double nOutputFactor )
nLastMergedRow = SCROW_MAX;
BOOL bHasGraphics = FALSE;
ScEEParseEntry* pE;
@@ -245,7 +605,7 @@
bool bNumbersEnglishUS = (pFormatter->GetLanguage() != LANGUAGE_ENGLISH_US);
if (bNumbersEnglishUS)
{
-@@ -335,7 +336,7 @@ void ScEEImport::WriteToDocument( BOOL b
+@@ -335,7 +336,7 @@ void ScEEImport::WriteToDocument( BOOL bSizeColsRows, double nOutputFactor )
else if ( !pE->aSel.HasRange() )
{
// maybe ALT text of IMG or similar
@@ -254,17 +614,19 @@
// wenn SelRange komplett leer kann nachfolgender Text im gleichen Absatz liegen!
}
else
-@@ -380,7 +381,7 @@ void ScEEImport::WriteToDocument( BOOL b
+@@ -380,7 +381,7 @@ void ScEEImport::WriteToDocument( BOOL bSizeColsRows, double nOutputFactor )
if (bNumbersEnglishUS && !bEnUsRecognized)
mpDoc->PutCell( nCol, nRow, nTab, new ScStringCell( aStr));
else
- mpDoc->SetString( nCol, nRow, nTab, aStr );
-+ mpDoc->SetString( nCol, nRow, nTab, aStr, pFormatter );
++ mpDoc->SetString( nCol, nRow, nTab, aStr, pFormatter, bConvertDate );
}
}
else
---- sc/source/ui/attrdlg/scdlgfact.cxx.old 2009-04-06 16:42:06.000000000 +0000
-+++ sc/source/ui/attrdlg/scdlgfact.cxx 2009-04-06 16:42:07.000000000 +0000
+diff --git sc/source/ui/attrdlg/scdlgfact.cxx sc/source/ui/attrdlg/scdlgfact.cxx
+index fe6cf52..0d1330e 100644
+--- sc/source/ui/attrdlg/scdlgfact.cxx
++++ sc/source/ui/attrdlg/scdlgfact.cxx
@@ -71,6 +71,7 @@
#include "validate.hxx" //add for ScValidationDlg
#include "validate.hrc" //add for ScValidationDlg
@@ -273,7 +635,7 @@
#include "opredlin.hxx" //add for ScRedlineOptionsTabPage
#include "tpcalc.hxx" //add for ScTpCalcOptions
#include "tpprint.hxx" //add for ScTpPrintOptions
-@@ -117,6 +118,7 @@ IMPL_ABSTDLG_BASE(AbstractScShowTabDlg_I
+@@ -117,6 +118,7 @@ IMPL_ABSTDLG_BASE(AbstractScShowTabDlg_Impl); //add for ScShowTabDlg
IMPL_ABSTDLG_BASE(AbstractScStringInputDlg_Impl); //add for ScStringInputDlg
IMPL_ABSTDLG_BASE(AbstractScTabBgColorDlg_Impl); //add for ScTabBgColorDlg
IMPL_ABSTDLG_BASE(AbstractScImportOptionsDlg_Impl); //add for ScImportOptionsDlg
@@ -281,7 +643,7 @@
IMPL_ABSTDLG_BASE(AbstractTabDialog_Impl); //add for ScAttrDlg, ScHFEditDlg, ScStyleDlg, ScSubTotalDlg,ScCharDlg, ScParagraphDlg, ScValidationDlg, ScSortDlg
-@@ -594,6 +596,14 @@ void AbstractScImportOptionsDlg_Impl::Ge
+@@ -594,6 +596,20 @@ void AbstractScImportOptionsDlg_Impl::GetImportOptions( ScImportOptions& rOption
pDlg->GetImportOptions(rOptions);
}
// add for AbstractScImportOptionsDlg_Impl end
@@ -291,12 +653,18 @@
+{
+ return pDlg->getLanguageType();
+}
++
++bool AbstractScLangChooserDlg_Impl::IsDateConversionSet() const
++{
++ return pDlg->isDateConversionSet();
++}
++
+//add for AbstractScLangChooserDlg_Impl end
+
// =========================Factories for createdialog ===================
//add for ScImportAsciiDlg begin
-@@ -616,6 +626,21 @@ AbstractScImportAsciiDlg * ScAbstractDia
+@@ -616,6 +632,21 @@ AbstractScImportAsciiDlg * ScAbstractDialogFactory_Impl::CreateScImportAsciiDlg
}
// ScImportAsciiDlg end
@@ -318,8 +686,10 @@
//add for ScAutoFormatDlg begin
AbstractScAutoFormatDlg * ScAbstractDialogFactory_Impl::CreateScAutoFormatDlg( Window* pParent, //add for ScAutoFormatDlg
---- sc/source/ui/attrdlg/scdlgfact.hxx.old 2009-04-06 16:42:06.000000000 +0000
-+++ sc/source/ui/attrdlg/scdlgfact.hxx 2009-04-06 16:42:07.000000000 +0000
+diff --git sc/source/ui/attrdlg/scdlgfact.hxx sc/source/ui/attrdlg/scdlgfact.hxx
+index 4391001..4724771 100644
+--- sc/source/ui/attrdlg/scdlgfact.hxx
++++ sc/source/ui/attrdlg/scdlgfact.hxx
@@ -65,6 +65,7 @@ class ScStringInputDlg;
class ScTabBgColorDlg;
class ScImportOptionsDlg;
@@ -328,7 +698,7 @@
#define DECL_ABSTDLG_BASE(Class,DialogClass) \
DialogClass* pDlg; \
-@@ -356,6 +357,12 @@ class AbstractScImportOptionsDlg_Impl :
+@@ -356,6 +357,13 @@ class AbstractScImportOptionsDlg_Impl : public AbstractScImportOptionsDlg //add
virtual void GetImportOptions( ScImportOptions& rOptions ) const;
};
@@ -336,12 +706,13 @@
+{
+ DECL_ABSTDLG_BASE( AbstractScLangChooserDlg_Impl, ScLangChooserDlg)
+ virtual LanguageType GetLanguageType() const;
++ virtual bool IsDateConversionSet() const;
+};
+
//add for ScAttrDlg , ScHFEditDlg, ScStyleDlg, ScSubTotalDlg, ScCharDlg, ScParagraphDlg, ScValidationDlg, ScSortDlg
class AbstractTabDialog_Impl : public SfxAbstractTabDialog
{
-@@ -380,6 +387,8 @@ public:
+@@ -380,6 +388,8 @@ public:
SvStream* pInStream, int nId,
sal_Unicode cSep = '\t');
@@ -350,9 +721,12 @@
virtual AbstractScAutoFormatDlg * CreateScAutoFormatDlg( Window* pParent, //add for ScAutoFormatDlg
ScAutoFormat* pAutoFormat,
const ScAutoFormatData* pSelFormatData,
---- sc/source/ui/dbgui/langchooser.cxx.old 1970-01-01 00:00:00.000000000 +0000
-+++ sc/source/ui/dbgui/langchooser.cxx 2009-04-06 16:42:07.000000000 +0000
-@@ -0,0 +1,113 @@
+diff --git sc/source/ui/dbgui/langchooser.cxx sc/source/ui/dbgui/langchooser.cxx
+new file mode 100644
+index 0000000..d5fd72b
+--- /dev/null
++++ sc/source/ui/dbgui/langchooser.cxx
+@@ -0,0 +1,120 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -407,7 +781,9 @@
+ maFlChooseLang(this, ScResId(FL_CHOOSE_LANG)),
+ maRbAutomatic(this, ScResId(RB_AUTOMATIC)),
+ maRbCustom(this, ScResId(RB_CUSTOM)),
-+ maLbCustomLang(this, ScResId(LB_CUSTOM_LANG))
++ maLbCustomLang(this, ScResId(LB_CUSTOM_LANG)),
++ maFlOption(this, ScResId(FL_OPTION)),
++ maBtnConvertDate(this, ScResId(BTN_CONVERT_DATE))
+{
+ init();
+}
@@ -429,6 +805,11 @@
+ return maLbCustomLang.GetSelectLanguage();
+}
+
++bool ScLangChooserDlg::isDateConversionSet() const
++{
++ return maBtnConvertDate.IsChecked();
++}
++
+void ScLangChooserDlg::init()
+{
+ Link aLink = LINK( this, ScLangChooserDlg, OKHdl );
@@ -466,9 +847,12 @@
+ return 0;
+}
+
---- sc/source/ui/dbgui/langchooser.src.old 1970-01-01 00:00:00.000000000 +0000
-+++ sc/source/ui/dbgui/langchooser.src 2009-04-06 16:42:07.000000000 +0000
-@@ -0,0 +1,95 @@
+diff --git sc/source/ui/dbgui/langchooser.src sc/source/ui/dbgui/langchooser.src
+new file mode 100644
+index 0000000..1e121de
+--- /dev/null
++++ sc/source/ui/dbgui/langchooser.src
+@@ -0,0 +1,112 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -504,7 +888,7 @@
+ModalDialog RID_SCDLG_LANG_CHOOSER
+{
+ Text [ en-US ] = "Select Language" ;
-+ Size = MAP_APPFONT ( 190 , 70 ) ;
++ Size = MAP_APPFONT ( 190 , 101 ) ;
+ Moveable = TRUE ;
+ Closeable = TRUE ;
+ OutputSize = TRUE ;
@@ -562,10 +946,29 @@
+ DropDown = TRUE ;
+ Sort = TRUE ;
+ };
++
++ FixedLine FL_OPTION
++ {
++ Pos = MAP_APPFONT( 6, 70 );
++ Size = MAP_APPFONT( 125, 14 );
++
++ Text [ en-US ] = "Options" ;
++ };
++
++ CheckBox BTN_CONVERT_DATE
++ {
++ Pos = MAP_APPFONT( 12, 86 );
++ Size = MAP_APPFONT( 125, 10 );
++ TabStop = TRUE ;
++
++ Text [ en-US ] = "Detect special numbers (such as dates)." ;
++ };
+};
+
---- sc/source/ui/dbgui/makefile.mk.old 2009-04-02 10:45:25.000000000 +0000
-+++ sc/source/ui/dbgui/makefile.mk 2009-04-06 16:42:07.000000000 +0000
+diff --git sc/source/ui/dbgui/makefile.mk sc/source/ui/dbgui/makefile.mk
+index 0a95138..8df758d 100644
+--- sc/source/ui/dbgui/makefile.mk
++++ sc/source/ui/dbgui/makefile.mk
@@ -53,6 +53,7 @@ SLOFILES = \
$(SLO)$/pfiltdlg.obj \
$(SLO)$/dbnamdlg.obj \
@@ -592,20 +995,67 @@
# --- Tagets -------------------------------------------------------
---- sc/source/ui/docshell/docsh.cxx.old 2009-04-06 16:42:01.000000000 +0000
-+++ sc/source/ui/docshell/docsh.cxx 2009-04-06 16:42:07.000000000 +0000
-@@ -1273,12 +1273,23 @@ BOOL __EXPORT ScDocShell::ConvertFrom( S
+diff --git sc/source/ui/docshell/docsh.cxx sc/source/ui/docshell/docsh.cxx
+index 3dfbf19..66a91b8 100644
+--- sc/source/ui/docshell/docsh.cxx
++++ sc/source/ui/docshell/docsh.cxx
+@@ -137,6 +137,8 @@ using namespace com::sun::star;
+ using namespace com::sun::star::document::VbaEventId;
+
+ using namespace com::sun::star;
++using ::rtl::OUString;
++using ::rtl::OUStringBuffer;
+
+ // STATIC DATA -----------------------------------------------------------
+
+@@ -899,6 +901,34 @@ BOOL __EXPORT ScDocShell::LoadFrom( SfxMedium& rMedium )
+ return bRet;
+ }
+
++static void lcl_parseHtmlFilterOption(const OUString& rOption, LanguageType& rLang, bool& rDateConvert)
++{
++ OUStringBuffer aBuf;
++ OUString aTokens[2];
++ sal_Int32 n = rOption.getLength();
++ const sal_Unicode* p = rOption.getStr();
++ sal_Int32 nTokenId = 0;
++ for (sal_Int32 i = 0; i < n; ++i)
++ {
++ const sal_Unicode c = p[i];
++ if (c == sal_Unicode(' '))
++ {
++ if (aBuf.getLength())
++ aTokens[nTokenId++] = aBuf.makeStringAndClear();
++ }
++ else
++ aBuf.append(c);
++
++ if (nTokenId >= 2)
++ break;
++ }
++
++ if (aBuf.getLength())
++ aTokens[nTokenId] = aBuf.makeStringAndClear();
++
++ rLang = static_cast<LanguageType>(aTokens[0].toInt32());
++ rDateConvert = static_cast<bool>(aTokens[1].toInt32());
++}
+
+ BOOL __EXPORT ScDocShell::ConvertFrom( SfxMedium& rMedium )
+ {
+@@ -1273,12 +1303,24 @@ BOOL __EXPORT ScDocShell::ConvertFrom( SfxMedium& rMedium )
SvStream* pInStream = rMedium.GetInStream();
if (pInStream)
{
+ LanguageType eLang = LANGUAGE_SYSTEM;
++ bool bDateConvert = false;
+ SfxItemSet* pSet = rMedium.GetItemSet();
+ const SfxPoolItem* pItem;
+ if ( pSet && SFX_ITEM_SET ==
+ pSet->GetItemState( SID_FILE_FILTEROPTIONS, TRUE, &pItem ) )
+ {
+ String aFilterOption = (static_cast<const SfxStringItem*>(pItem))->GetValue();
-+ eLang = static_cast<LanguageType>(aFilterOption.ToInt32());
++ lcl_parseHtmlFilterOption(aFilterOption, eLang, bDateConvert);
+ }
+
pInStream->Seek( 0 );
@@ -615,24 +1065,53 @@
+ SvNumberFormatter aNumFormatter(aDocument.GetServiceManager(), eLang);
eError = ScFormatFilter::Get().ScImportHTML( *pInStream, rMedium.GetBaseURL(), &aDocument, aRange,
- GetOutputFactor(), !bWebQuery );
-+ GetOutputFactor(), !bWebQuery, &aNumFormatter );
++ GetOutputFactor(), !bWebQuery, &aNumFormatter, bDateConvert );
if (eError != eERR_OK)
{
if (!GetError())
---- sc/source/ui/docshell/impex.cxx.old 2009-04-06 16:41:50.000000000 +0000
-+++ sc/source/ui/docshell/impex.cxx 2009-04-06 16:42:07.000000000 +0000
-@@ -1943,7 +1943,7 @@ class ScFormatFilterMissing : public ScF
+@@ -2266,6 +2308,11 @@ String ScDocShell::GetOwnFilterName() // static
+ return String::CreateFromAscii(pFilterSc50);
+ }
+
++String ScDocShell::GetHtmlFilterName()
++{
++ return String::CreateFromAscii(pFilterHtml);
++}
++
+ String ScDocShell::GetWebQueryFilterName() // static
+ {
+ return String::CreateFromAscii(pFilterHtmlWebQ);
+diff --git sc/source/ui/docshell/impex.cxx sc/source/ui/docshell/impex.cxx
+index cc51d67..e2ccdf5 100644
+--- sc/source/ui/docshell/impex.cxx
++++ sc/source/ui/docshell/impex.cxx
+@@ -1943,7 +1943,7 @@ class ScFormatFilterMissing : public ScFormatFilterPlugin {
virtual FltError ScImportDif( SvStream&, ScDocument*, const ScAddress&,
const CharSet, UINT32 ) RETURN_ERROR
virtual FltError ScImportRTF( SvStream&, const String&, ScDocument*, ScRange& ) RETURN_ERROR
- virtual FltError ScImportHTML( SvStream&, const String&, ScDocument*, ScRange&, double, BOOL ) RETURN_ERROR
-+ virtual FltError ScImportHTML( SvStream&, const String&, ScDocument*, ScRange&, double, BOOL, SvNumberFormatter* ) RETURN_ERROR
++ virtual FltError ScImportHTML( SvStream&, const String&, ScDocument*, ScRange&, double, BOOL, SvNumberFormatter*, bool ) RETURN_ERROR
virtual ScEEAbsImport *CreateRTFImport( ScDocument*, const ScRange& ) { return NULL; }
virtual ScEEAbsImport *CreateHTMLImport( ScDocument*, const String&, const ScRange&, BOOL ) { return NULL; }
---- sc/source/ui/inc/langchooser.hrc.old 1970-01-01 00:00:00.000000000 +0000
-+++ sc/source/ui/inc/langchooser.hrc 2009-04-06 16:42:07.000000000 +0000
-@@ -0,0 +1,41 @@
+diff --git sc/source/ui/inc/docsh.hxx sc/source/ui/inc/docsh.hxx
+index 1126a95..7620368 100644
+--- sc/source/ui/inc/docsh.hxx
++++ sc/source/ui/inc/docsh.hxx
+@@ -409,6 +409,7 @@ public:
+
+ static ScDocShell* GetShellByNum( USHORT nDocNo );
+ static String GetOwnFilterName();
++ static String GetHtmlFilterName();
+ static String GetWebQueryFilterName();
+ static String GetAsciiFilterName();
+ static String GetLotusFilterName();
+diff --git sc/source/ui/inc/langchooser.hrc sc/source/ui/inc/langchooser.hrc
+new file mode 100644
+index 0000000..eb981c1
+--- /dev/null
++++ sc/source/ui/inc/langchooser.hrc
+@@ -0,0 +1,42 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -673,10 +1152,14 @@
+#define RB_AUTOMATIC 5
+#define RB_CUSTOM 6
+#define LB_CUSTOM_LANG 7
-+
---- sc/source/ui/inc/langchooser.hxx.old 1970-01-01 00:00:00.000000000 +0000
-+++ sc/source/ui/inc/langchooser.hxx 2009-04-06 16:42:07.000000000 +0000
-@@ -0,0 +1,73 @@
++#define FL_OPTION 8
++#define BTN_CONVERT_DATE 9
+diff --git sc/source/ui/inc/langchooser.hxx sc/source/ui/inc/langchooser.hxx
+new file mode 100644
+index 0000000..7106ab2
+--- /dev/null
++++ sc/source/ui/inc/langchooser.hxx
+@@ -0,0 +1,76 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -725,6 +1208,7 @@
+ virtual short Execute();
+
+ LanguageType getLanguageType() const;
++ bool isDateConversionSet() const;
+
+private:
+ void init();
@@ -741,7 +1225,9 @@
+
+ SvxLanguageBox maLbCustomLang;
+
-+ String maString;
++ FixedLine maFlOption;
++
++ CheckBox maBtnConvertDate;
+
+ DECL_LINK( OKHdl, OKButton* );
+
@@ -750,9 +1236,11 @@
+
+
+#endif
---- sc/source/ui/unoobj/filtuno.cxx.old 2009-04-02 10:45:26.000000000 +0000
-+++ sc/source/ui/unoobj/filtuno.cxx 2009-04-06 16:42:07.000000000 +0000
-@@ -51,6 +51,10 @@
+diff --git sc/source/ui/unoobj/filtuno.cxx sc/source/ui/unoobj/filtuno.cxx
+index 81efc76..406255e 100644
+--- sc/source/ui/unoobj/filtuno.cxx
++++ sc/source/ui/unoobj/filtuno.cxx
+@@ -51,7 +51,12 @@
#include "sc.hrc" //CHINA001
#include "scabstdlg.hxx" //CHINA001
@@ -761,9 +1249,11 @@
+#include <memory>
+
using namespace ::com::sun::star;
++using ::rtl::OUStringBuffer;
//------------------------------------------------------------------------
-@@ -146,6 +150,10 @@ sal_Int16 SAL_CALL ScFilterOptionsObj::e
+
+@@ -146,6 +151,10 @@ sal_Int16 SAL_CALL ScFilterOptionsObj::execute() throw(uno::RuntimeException)
sal_Int16 nRet = ui::dialogs::ExecutableDialogResults::CANCEL;
String aFilterString( aFilterName );
@@ -774,7 +1264,7 @@
if ( !bExport && aFilterString == ScDocShell::GetAsciiFilterName() )
{
// ascii import is special...
-@@ -164,8 +172,6 @@ sal_Int16 SAL_CALL ScFilterOptionsObj::e
+@@ -164,8 +173,6 @@ sal_Int16 SAL_CALL ScFilterOptionsObj::execute() throw(uno::RuntimeException)
pInStream = utl::UcbStreamHelper::CreateStream( xInputStream );
//CHINA001 ScImportAsciiDlg* pDlg = new ScImportAsciiDlg( NULL, aPrivDatName, pInStream, cAsciiDel );
@@ -783,11 +1273,11 @@
AbstractScImportAsciiDlg* pDlg = pFact->CreateScImportAsciiDlg( NULL, aPrivDatName, pInStream, RID_SCDLG_ASCII, cAsciiDel);
DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
if ( pDlg->Execute() == RET_OK )
-@@ -178,6 +184,19 @@ sal_Int16 SAL_CALL ScFilterOptionsObj::e
+@@ -178,6 +185,24 @@ sal_Int16 SAL_CALL ScFilterOptionsObj::execute() throw(uno::RuntimeException)
delete pDlg;
delete pInStream;
}
-+ else if ( aFilterString == ScDocShell::GetWebQueryFilterName() )
++ else if ( aFilterString == ScDocShell::GetWebQueryFilterName() || aFilterString == ScDocShell::GetHtmlFilterName() )
+ {
+ // HTML import.
+ ::std::auto_ptr<AbstractScLangChooserDlg> pDlg(
@@ -796,14 +1286,19 @@
+ if (pDlg->Execute() == RET_OK)
+ {
+ LanguageType eLang = pDlg->GetLanguageType();
-+ aFilterOptions = String::CreateFromInt32(static_cast<sal_Int32>(eLang));
++ OUStringBuffer aBuf;
++
++ aBuf.append(String::CreateFromInt32(static_cast<sal_Int32>(eLang)));
++ aBuf.append(sal_Unicode(' '));
++ aBuf.append(pDlg->IsDateConversionSet() ? sal_Unicode('1') : sal_Unicode('0'));
++ aFilterOptions = aBuf.makeStringAndClear();
+ nRet = ui::dialogs::ExecutableDialogResults::OK;
+ }
+ }
else
{
sal_Bool bMultiByte = sal_True;
-@@ -249,8 +268,6 @@ sal_Int16 SAL_CALL ScFilterOptionsObj::e
+@@ -249,8 +274,6 @@ sal_Int16 SAL_CALL ScFilterOptionsObj::execute() throw(uno::RuntimeException)
//CHINA001 &aOptions, &aTitle, bMultiByte, bDBEnc,
//CHINA001 !bExport );
//CHINA001
@@ -812,8 +1307,10 @@
AbstractScImportOptionsDlg* pDlg = pFact->CreateScImportOptionsDlg( NULL, RID_SCDLG_IMPORTOPT,
bAscii, &aOptions, &aTitle, bMultiByte, bDBEnc,
---- sc/util/makefile.mk.old 2009-04-06 16:42:06.000000000 +0000
-+++ sc/util/makefile.mk 2009-04-06 16:42:07.000000000 +0000
+diff --git sc/util/makefile.mk sc/util/makefile.mk
+index 855d560..0da917b 100644
+--- sc/util/makefile.mk
++++ sc/util/makefile.mk
@@ -281,6 +281,7 @@ LIB8OBJFILES = \
$(SLO)$/dapidata.obj \
$(SLO)$/crdlg.obj \
commit def7a4d99b878745d4251eb37b72bc08098f5d09
Author: Kohei Yoshida <kyoshida at novell.com>
Date: Wed Jul 29 14:37:49 2009 -0400
Set cell format to Text for string value during text file import.
* patches/dev300/apply: apply the new patch.
* patches/dev300/calc-html-csv-import-force-text-cell.diff: set cell
format to Text when a string value is requested & the value itself
would be interpreted as a number otherwise. With this change, those
string number values don't need to display ' in front of them which
some users found confusing. (n#523414)
diff --git a/patches/dev300/apply b/patches/dev300/apply
index ef3aca8..5558cf6 100644
--- a/patches/dev300/apply
+++ b/patches/dev300/apply
@@ -3035,6 +3035,9 @@ calc-xls-import-shared-formula-refwrap.diff, n#522833, i#103861, kohei
# line even if matching quotes are on separate lines.
stream-read-csv-always-single-line.diff, n#523517, kohei
+# set cell format to Text when a string format is requested, and don't
+# prepend ' in front of the value.
+calc-html-csv-import-force-text-cell.diff, n#523414, kohei
[ UbuntuHardyOnly ]
# Add patch to only show local files needed when gnome-vfs/gio is disabled
diff --git a/patches/dev300/calc-html-csv-import-force-text-cell.diff b/patches/dev300/calc-html-csv-import-force-text-cell.diff
new file mode 100644
index 0000000..6ddcfc2
--- /dev/null
+++ b/patches/dev300/calc-html-csv-import-force-text-cell.diff
@@ -0,0 +1,381 @@
+diff --git sc/inc/column.hxx sc/inc/column.hxx
+index 606602c..a39a958 100644
+--- sc/inc/column.hxx
++++ sc/inc/column.hxx
+@@ -72,6 +72,7 @@ struct ScFunctionData;
+ struct ScLineFlags;
+ struct ScMergePatternState;
+ class ScFlatBoolRowSegments;
++struct ScSetStringParam;
+
+ #define COLUMN_DELTA 4
+
+@@ -244,8 +245,7 @@ public:
+ // TRUE = Zahlformat gesetzt
+ BOOL SetString( SCROW nRow, SCTAB nTab, const String& rString,
+ formula::FormulaGrammar::AddressConvention conv = formula::FormulaGrammar::CONV_OOO,
+- SvNumberFormatter* pFormatter = NULL,
+- bool bDetectNumberFormat = true );
++ ScSetStringParam* pParam = NULL );
+ void SetValue( SCROW nRow, const double& rVal);
+ void SetError( SCROW nRow, const USHORT nError);
+
+diff --git sc/inc/document.hxx sc/inc/document.hxx
+index 862682c..8d28d82 100644
+--- sc/inc/document.hxx
++++ sc/inc/document.hxx
+@@ -142,6 +142,7 @@ class ScLookupCache;
+ struct ScLookupCacheMapImpl;
+ struct ScClipParam;
+ struct ScClipRangeNameData;
++struct ScSetStringParam;
+
+ namespace com { namespace sun { namespace star {
+ namespace lang {
+@@ -736,8 +737,7 @@ public:
+ ULONG nFormatIndex, BOOL bForceTab = FALSE);
+ // return TRUE = Zahlformat gesetzt
+ SC_DLLPUBLIC BOOL SetString(
+- SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString,
+- SvNumberFormatter* pFormatter = NULL, bool bDetectNumberFormat = true );
++ SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString, ScSetStringParam* pParam = NULL );
+ SC_DLLPUBLIC void SetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, const double& rVal );
+ void SetError( SCCOL nCol, SCROW nRow, SCTAB nTab, const USHORT nError);
+
+diff --git sc/inc/stringutil.hxx sc/inc/stringutil.hxx
+index 4ca8629..fd2d7c3 100644
+--- sc/inc/stringutil.hxx
++++ sc/inc/stringutil.hxx
+@@ -32,6 +32,41 @@
+ #define SC_STRINGUTIL_HXX
+
+ #include "rtl/ustring.hxx"
++#include "scdllapi.h"
++
++class SvNumberFormatter;
++
++/**
++ * Store parameters used in the ScDocument::SetString() method. Various
++ * options for string-setting operation are specified herein.
++ */
++struct SC_DLLPUBLIC ScSetStringParam
++{
++ /**
++ * Stores the pointer to the number formatter instance to be used during
++ * number format detection. The caller must manage the life cycle of the
++ * instance.
++ */
++ SvNumberFormatter* mpNumFormatter;
++
++ /**
++ * When true, we try to detect special number format (dates etc) from the
++ * input string, when false, we only try to detect a basic decimal number
++ * format.
++ */
++ bool mbDetectNumberFormat;
++
++ /**
++ * When true, set the format of the cell to Text when a string cell is
++ * requested for a number input. We may want to do this during text file
++ * import (csv, html etc).
++ */
++ bool mbSetTextCellFormat;
++
++ ScSetStringParam();
++};
++
++// ============================================================================
+
+ class ScStringUtil
+ {
+diff --git sc/inc/table.hxx sc/inc/table.hxx
+index 43163c4..7f8d968 100644
+--- sc/inc/table.hxx
++++ sc/inc/table.hxx
+@@ -85,7 +85,7 @@ struct ScLineFlags;
+ class CollatorWrapper;
+ class ScFlatBoolRowSegments;
+ class ScFlatBoolColSegments;
+-
++struct ScSetStringParam;
+
+ class ScTable
+ {
+@@ -274,7 +274,7 @@ public:
+ void PutCell(SCCOL nCol, SCROW nRow, ULONG nFormatIndex, ScBaseCell* pCell);
+ // TRUE = Zahlformat gesetzt
+ BOOL SetString( SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString,
+- SvNumberFormatter* pFormatter = NULL, bool bDetectNumberFormat = true );
++ ScSetStringParam* pParam = NULL );
+ void SetValue( SCCOL nCol, SCROW nRow, const double& rVal );
+ void SetError( SCCOL nCol, SCROW nRow, USHORT nError);
+
+diff --git sc/source/core/data/column3.cxx sc/source/core/data/column3.cxx
+index 56e7c1a..a37a53e 100644
+--- sc/source/core/data/column3.cxx
++++ sc/source/core/data/column3.cxx
+@@ -55,6 +55,7 @@
+ #include "detfunc.hxx" // fuer Notizen bei DeleteRange
+ #include "postit.hxx"
+ #include "stringutil.hxx"
++#include "docpool.hxx"
+
+ #include <com/sun/star/i18n/LocaleDataItem.hpp>
+
+@@ -1263,7 +1264,7 @@ void ScColumn::StartListeningInArea( SCROW nRow1, SCROW nRow2 )
+ // TRUE = Zahlformat gesetzt
+ BOOL ScColumn::SetString( SCROW nRow, SCTAB nTabP, const String& rString,
+ formula::FormulaGrammar::AddressConvention eConv,
+- SvNumberFormatter* pFormatter, bool bDetectNumberFormat )
++ ScSetStringParam* pParam )
+ {
+ BOOL bNumFmtSet = FALSE;
+ if (VALIDROW(nRow))
+@@ -1272,11 +1273,15 @@ BOOL ScColumn::SetString( SCROW nRow, SCTAB nTabP, const String& rString,
+ BOOL bIsLoading = FALSE;
+ if (rString.Len() > 0)
+ {
++ ScSetStringParam aParam;
++ if (pParam)
++ aParam = *pParam;
++
+ double nVal;
+ sal_uInt32 nIndex, nOldIndex = 0;
+ sal_Unicode cFirstChar;
+- if (!pFormatter)
+- pFormatter = pDocument->GetFormatTable();
++ if (!aParam.mpNumFormatter)
++ aParam.mpNumFormatter = pDocument->GetFormatTable();
+ SfxObjectShell* pDocSh = pDocument->GetDocumentShell();
+ if ( pDocSh )
+ bIsLoading = pDocSh->IsLoading();
+@@ -1285,7 +1290,7 @@ BOOL ScColumn::SetString( SCROW nRow, SCTAB nTabP, const String& rString,
+ {
+ nIndex = nOldIndex = GetNumberFormat( nRow );
+ if ( rString.Len() > 1
+- && pFormatter->GetType(nIndex) != NUMBERFORMAT_TEXT )
++ && aParam.mpNumFormatter->GetType(nIndex) != NUMBERFORMAT_TEXT )
+ cFirstChar = rString.GetChar(0);
+ else
+ cFirstChar = 0; // Text
+@@ -1341,7 +1346,7 @@ BOOL ScColumn::SetString( SCROW nRow, SCTAB nTabP, const String& rString,
+ }
+ // nIndex fuer IsNumberFormat vorbelegen
+ if ( !bIsText )
+- nIndex = nOldIndex = pFormatter->GetStandardIndex();
++ nIndex = nOldIndex = aParam.mpNumFormatter->GetStandardIndex();
+ }
+
+ do
+@@ -1349,9 +1354,9 @@ BOOL ScColumn::SetString( SCROW nRow, SCTAB nTabP, const String& rString,
+ if (bIsText)
+ break;
+
+- if (bDetectNumberFormat)
++ if (aParam.mbDetectNumberFormat)
+ {
+- if (!pFormatter->IsNumberFormat(rString, nIndex, nVal))
++ if (!aParam.mpNumFormatter->IsNumberFormat(rString, nIndex, nVal))
+ break;
+
+ pNewCell = new ScValueCell( nVal );
+@@ -1362,21 +1367,21 @@ BOOL ScColumn::SetString( SCROW nRow, SCTAB nTabP, const String& rString,
+ // Exception: If the new format is boolean, always apply it.
+
+ BOOL bOverwrite = FALSE;
+- const SvNumberformat* pOldFormat = pFormatter->GetEntry( nOldIndex );
++ const SvNumberformat* pOldFormat = aParam.mpNumFormatter->GetEntry( nOldIndex );
+ if ( pOldFormat )
+ {
+ short nOldType = pOldFormat->GetType() & ~NUMBERFORMAT_DEFINED;
+ if ( nOldType == NUMBERFORMAT_NUMBER || nOldType == NUMBERFORMAT_DATE ||
+ nOldType == NUMBERFORMAT_TIME || nOldType == NUMBERFORMAT_LOGICAL )
+ {
+- if ( nOldIndex == pFormatter->GetStandardFormat(
++ if ( nOldIndex == aParam.mpNumFormatter->GetStandardFormat(
+ nOldType, pOldFormat->GetLanguage() ) )
+ {
+ bOverwrite = TRUE; // default of these types can be overwritten
+ }
+ }
+ }
+- if ( !bOverwrite && pFormatter->GetType( nIndex ) == NUMBERFORMAT_LOGICAL )
++ if ( !bOverwrite && aParam.mpNumFormatter->GetType( nIndex ) == NUMBERFORMAT_LOGICAL )
+ {
+ bOverwrite = TRUE; // overwrite anything if boolean was detected
+ }
+@@ -1392,7 +1397,7 @@ BOOL ScColumn::SetString( SCROW nRow, SCTAB nTabP, const String& rString,
+ else
+ {
+ // Only check if the string is a regular number.
+- const LocaleDataWrapper* pLocale = pFormatter->GetLocaleData();
++ const LocaleDataWrapper* pLocale = aParam.mpNumFormatter->GetLocaleData();
+ if (!pLocale)
+ break;
+
+@@ -1414,7 +1419,19 @@ BOOL ScColumn::SetString( SCROW nRow, SCTAB nTabP, const String& rString,
+ while (false);
+
+ if (!pNewCell)
++ {
++ if (aParam.mbSetTextCellFormat && aParam.mpNumFormatter->IsNumberFormat(rString, nIndex, nVal))
++ {
++ // Set the cell format type to Text.
++ sal_uInt32 nFormat = aParam.mpNumFormatter->GetStandardFormat(NUMBERFORMAT_TEXT);
++ ScPatternAttr aNewAttrs(pDocument->GetPool());
++ SfxItemSet& rSet = aNewAttrs.GetItemSet();
++ rSet.Put( SfxUInt32Item(ATTR_VALUE_FORMAT, nFormat) );
++ ApplyPattern(nRow, aNewAttrs);
++ }
++
+ pNewCell = new ScStringCell(rString);
++ }
+ }
+ }
+
+diff --git sc/source/core/data/document.cxx sc/source/core/data/document.cxx
+index 3c50c24..56f2158 100644
+--- sc/source/core/data/document.cxx
++++ sc/source/core/data/document.cxx
+@@ -2512,10 +2512,10 @@ void ScDocument::PutCell( const ScAddress& rPos, ScBaseCell* pCell, BOOL bForceT
+
+
+ BOOL ScDocument::SetString( SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString,
+- SvNumberFormatter* pFormatter, bool bDetectNumberFormat )
++ ScSetStringParam* pParam )
+ {
+ if ( ValidTab(nTab) && pTab[nTab] )
+- return pTab[nTab]->SetString( nCol, nRow, nTab, rString, pFormatter, bDetectNumberFormat );
++ return pTab[nTab]->SetString( nCol, nRow, nTab, rString, pParam );
+ else
+ return FALSE;
+ }
+diff --git sc/source/core/data/table2.cxx sc/source/core/data/table2.cxx
+index 9505877..6a373e9 100644
+--- sc/source/core/data/table2.cxx
++++ sc/source/core/data/table2.cxx
+@@ -904,11 +904,11 @@ void ScTable::PutCell( const ScAddress& rPos, ULONG nFormatIndex, ScBaseCell* pC
+
+
+ BOOL ScTable::SetString( SCCOL nCol, SCROW nRow, SCTAB nTabP, const String& rString,
+- SvNumberFormatter* pFormatter, bool bDetectNumberFormat )
++ ScSetStringParam* pParam )
+ {
+ if (ValidColRow(nCol,nRow))
+ return aCol[nCol].SetString(
+- nRow, nTabP, rString, pDocument->GetAddressConvention(), pFormatter, bDetectNumberFormat );
++ nRow, nTabP, rString, pDocument->GetAddressConvention(), pParam );
+ else
+ return FALSE;
+ }
+diff --git sc/source/core/tool/stringutil.cxx sc/source/core/tool/stringutil.cxx
+index ae6247f..d5e09a6 100644
+--- sc/source/core/tool/stringutil.cxx
++++ sc/source/core/tool/stringutil.cxx
+@@ -40,6 +40,15 @@
+ using ::rtl::OUString;
+ using ::rtl::OUStringBuffer;
+
++ScSetStringParam::ScSetStringParam() :
++ mpNumFormatter(NULL),
++ mbDetectNumberFormat(true),
++ mbSetTextCellFormat(false)
++{
++}
++
++// ============================================================================-
++
+ bool ScStringUtil::parseSimpleNumber(
+ const OUString& rStr, sal_Unicode dsep, sal_Unicode gsep, double& rVal)
+ {
+diff --git sc/source/filter/rtf/eeimpars.cxx sc/source/filter/rtf/eeimpars.cxx
+index e78e371..b25ad37 100644
+--- sc/source/filter/rtf/eeimpars.cxx
++++ sc/source/filter/rtf/eeimpars.cxx
+@@ -69,6 +69,7 @@
+ #include "drwlayer.hxx"
+ #include "rangenam.hxx"
+ #include "progress.hxx"
++#include "stringutil.hxx"
+
+ #include "globstr.hrc"
+
+@@ -331,12 +332,17 @@ void ScEEImport::WriteToDocument( BOOL bSizeColsRows, double nOutputFactor, SvNu
+ // Daten eintragen
+ if (bSimple)
+ {
++ ScSetStringParam aParam;
++ aParam.mpNumFormatter = pFormatter;
++ aParam.mbDetectNumberFormat = true;
++ aParam.mbSetTextCellFormat = true;
++
+ if ( aValStr.Len() )
+ mpDoc->SetValue( nCol, nRow, nTab, fVal );
+ else if ( !pE->aSel.HasRange() )
+ {
+ // maybe ALT text of IMG or similar
+- mpDoc->SetString( nCol, nRow, nTab, pE->aAltText, pFormatter );
++ mpDoc->SetString( nCol, nRow, nTab, pE->aAltText, &aParam );
+ // wenn SelRange komplett leer kann nachfolgender Text im gleichen Absatz liegen!
+ }
+ else
+@@ -381,7 +387,10 @@ void ScEEImport::WriteToDocument( BOOL bSizeColsRows, double nOutputFactor, SvNu
+ if (bNumbersEnglishUS && !bEnUsRecognized)
+ mpDoc->PutCell( nCol, nRow, nTab, new ScStringCell( aStr));
+ else
+- mpDoc->SetString( nCol, nRow, nTab, aStr, pFormatter, bConvertDate );
++ {
++ aParam.mbDetectNumberFormat = bConvertDate;
++ mpDoc->SetString( nCol, nRow, nTab, aStr, &aParam );
++ }
+ }
+ }
+ else
+diff --git sc/source/ui/docshell/impex.cxx sc/source/ui/docshell/impex.cxx
+index d388887..573443d 100644
+--- sc/source/ui/docshell/impex.cxx
++++ sc/source/ui/docshell/impex.cxx
+@@ -85,6 +85,9 @@ class StarBASIC;
+
+ // ause
+ #include "editutil.hxx"
++#include "patattr.hxx"
++#include "docpool.hxx"
++#include "stringutil.hxx"
+
+ #include "globstr.hrc"
+ #include <vcl/msgbox.hxx>
+@@ -804,6 +807,18 @@ static bool lcl_PutString(
+
+ if ( nColFormat == SC_COL_TEXT )
+ {
++ double fDummy;
++ sal_uInt32 nIndex;
++ if (pFormatter->IsNumberFormat(rStr, nIndex, fDummy))
++ {
++ // Set the format of this cell to Text.
++ sal_uInt32 nFormat = pFormatter->GetStandardFormat(NUMBERFORMAT_TEXT);
++ ScPatternAttr aNewAttrs(pDoc->GetPool());
++ SfxItemSet& rSet = aNewAttrs.GetItemSet();
++ rSet.Put( SfxUInt32Item(ATTR_VALUE_FORMAT, nFormat) );
++ pDoc->ApplyPattern(nCol, nRow, nTab, aNewAttrs);
++
++ }
+ pDoc->PutCell( nCol, nRow, nTab, ScBaseCell::CreateTextCell( rStr, pDoc ) );
+ return bMultiLine;
+ }
+@@ -1016,7 +1031,13 @@ static bool lcl_PutString(
+
+ // Standard or date not determined -> SetString / EditCell
+ if( rStr.Search( _LF ) == STRING_NOTFOUND )
+- pDoc->SetString( nCol, nRow, nTab, rStr, pFormatter, bDetectNumFormat );
++ {
++ ScSetStringParam aParam;
++ aParam.mpNumFormatter = pFormatter;
++ aParam.mbDetectNumberFormat = bDetectNumFormat;
++ aParam.mbSetTextCellFormat = true;
++ pDoc->SetString( nCol, nRow, nTab, rStr, &aParam );
++ }
+ else
+ {
+ bMultiLine = true;
More information about the ooo-build-commit
mailing list