[Libreoffice-commits] core.git: Branch 'libreoffice-4-4' - sc/source svx/source

Eike Rathke erack at redhat.com
Fri Jan 30 03:35:10 PST 2015


 sc/source/ui/sidebar/AlignmentPropertyPanel.cxx     |   32 +++++++++++++++----
 svx/source/sidebar/possize/PosSizePropertyPanel.cxx |   33 +++++++++++++-------
 2 files changed, 49 insertions(+), 16 deletions(-)

New commits:
commit 445ff9e176b3d697d5e14d8f0465fee2eff609d8
Author: Eike Rathke <erack at redhat.com>
Date:   Thu Jan 29 22:57:13 2015 +0100

    Resolves: tdf#88740 parse with locale decimal separator
    
    And use a proper string to double conversion and early bail out
    conditions.
    
    (cherry picked from commit 1884c0bbd40f0ded41d7a1656cb64fb1f6368c36)
    
    tdf#88740 fix sidebar angle rotation i18n
    
    (cherry picked from commit 9a7bf47098fe69b5c6069372708918ef94a9d597)
    
    use a less ugly string to double conversion, tdf#88740 follow-up
    
    And check string length before accessing characters..
    
    (cherry picked from commit 3ba5ac834780fc2565aff99e42dd8c3b2202fba3)
    
    30355f3aaf77b1952e21050e3593e575571d7aaa
    ac3c2bf2f67f0cc7fc106515a875512771676e01
    f97a25cd2cab0dccf2154465da7c1235ef3ca8c6
    Backport: added vcl/settings.hxx
    
    Change-Id: I6c89dd850405ad74ebd175800131cdcac19a8c86
    Reviewed-on: https://gerrit.libreoffice.org/14243
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx b/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx
index 80b103e..758863c 100644
--- a/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx
+++ b/sc/source/ui/sidebar/AlignmentPropertyPanel.cxx
@@ -26,6 +26,7 @@
 #include <svx/algitem.hxx>
 #include <svx/dlgutil.hxx>
 #include <vcl/toolbox.hxx>
+#include <vcl/settings.hxx>
 #include <svx/sidebar/SidebarDialControl.hxx>
 
 using namespace css;
@@ -113,16 +114,35 @@ void AlignmentPropertyPanel::Initialize()
 IMPL_LINK( AlignmentPropertyPanel, AngleModifiedHdl, void *, EMPTYARG )
 {
     OUString sTmp = mpMtrAngle->GetText();
+    if (sTmp.isEmpty())
+        return 0;
+    sal_Unicode nChar = sTmp[0];
+    if( nChar == '-' )
+    {
+        if (sTmp.getLength() < 2)
+            return 0;
+        nChar = sTmp[1];
+    }
+
+    if( (nChar < '0') || (nChar > '9') )
+        return 0;
 
-    sal_Unicode nChar = sTmp.isEmpty() ? 0 : sTmp[0];
-    if((sTmp.getLength()== 1 &&  nChar == '-') ||
-        (nChar != '-' && ((nChar < '0') || (nChar > '9') ) ))   ////modify
+    const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() );
+    const sal_Unicode cSep = rLocaleWrapper.getNumDecimalSep()[0];
+
+    // Do not check that the entire string was parsed up to its end, there may
+    // be a degree symbol following the number. Note that this also means that
+    // the number recognized just stops at any non-matching character.
+    /* TODO: we could check for the degree symbol stop if there are no other
+     * cases with different symbol characters in any language? */
+    rtl_math_ConversionStatus eStatus;
+    double fTmp = rtl::math::stringToDouble( sTmp, cSep, 0, &eStatus);
+    if (eStatus != rtl_math_ConversionStatus_Ok)
         return 0;
 
-    double dTmp = sTmp.toDouble();
-    FormatDegrees(dTmp);
+    FormatDegrees(fTmp);
 
-    sal_Int64 nTmp = (sal_Int64)dTmp*100;
+    sal_Int64 nTmp = (sal_Int64)fTmp*100;
     SfxInt32Item aAngleItem( SID_ATTR_ALIGN_DEGREES,(sal_uInt32) nTmp);
 
     GetBindings()->GetDispatcher()->Execute(
diff --git a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx
index 6956bf6..a2d8cbe 100644
--- a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx
+++ b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx
@@ -35,6 +35,7 @@
 #include <vcl/field.hxx>
 #include <vcl/fixed.hxx>
 #include <vcl/toolbox.hxx>
+#include <vcl/settings.hxx>
 #include <svl/aeitem.hxx>
 #include <svx/svdview.hxx>
 
@@ -488,24 +489,36 @@ IMPL_LINK( PosSizePropertyPanel, ClickAutoHdl, void *, EMPTYARG )
 IMPL_LINK( PosSizePropertyPanel, AngleModifiedHdl, void *, EMPTYARG )
 {
     OUString sTmp = mpMtrAngle->GetText();
-    bool    bNegative = false;
+    if (sTmp.isEmpty())
+        return 0;
     sal_Unicode nChar = sTmp[0];
-
     if( nChar == '-' )
     {
-        bNegative = true;
+        if (sTmp.getLength() < 2)
+            return 0;
         nChar = sTmp[1];
     }
 
     if( (nChar < '0') || (nChar > '9') )
         return 0;
-    double dTmp = sTmp.toDouble();
-    if(bNegative)
-    {
-        while(dTmp<0)
-            dTmp += 360;
-    }
-    sal_Int64 nTmp = dTmp*100;
+
+    const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() );
+    const sal_Unicode cSep = rLocaleWrapper.getNumDecimalSep()[0];
+
+    // Do not check that the entire string was parsed up to its end, there may
+    // be a degree symbol following the number. Note that this also means that
+    // the number recognized just stops at any non-matching character.
+    /* TODO: we could check for the degree symbol stop if there are no other
+     * cases with different symbol characters in any language? */
+    rtl_math_ConversionStatus eStatus;
+    double fTmp = rtl::math::stringToDouble( sTmp, cSep, 0, &eStatus);
+    if (eStatus != rtl_math_ConversionStatus_Ok)
+        return 0;
+
+    while (fTmp < 0)
+        fTmp += 360;
+
+    sal_Int64 nTmp = fTmp*100;
 
     // #i123993# Need to take UIScale into account when executing rotations
     const double fUIScale(mpView && mpView->GetModel() ? double(mpView->GetModel()->GetUIScale()) : 1.0);


More information about the Libreoffice-commits mailing list