[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