[Libreoffice-commits] core.git: include/xmloff xmloff/source

Laurent Balland-Poirier laurent.balland-poirier at laposte.net
Sun Mar 22 08:45:24 PDT 2015


 include/xmloff/xmlnumfe.hxx      |    2 -
 include/xmloff/xmltoken.hxx      |    2 +
 xmloff/source/core/xmltoken.cxx  |    2 +
 xmloff/source/style/xmlnumfe.cxx |   13 ++++++++---
 xmloff/source/style/xmlnumfi.cxx |   46 +++++++++++++++++++++++++++++++++++++--
 5 files changed, 59 insertions(+), 6 deletions(-)

New commits:
commit fdf8e5aaee49304df7f2f04fcdd932c3dd427703
Author: Laurent Balland-Poirier <laurent.balland-poirier at laposte.net>
Date:   Sun Mar 15 19:22:56 2015 +0100

    tdf#30716 start Engineering notation: implement exponent-interval
    
    ODF1.3 implement a new attribute for engineering notation
    https://issues.oasis-open.org/browse/OFFICE-1828
    This commit only add this attribute to ODF import/export.
    Engineering notation is not yet available.
    
    Treat also thousand separator with exponent-interval
    Change XML_NAMESPACE_NUMBER to XML_NAMESPACE_LO_EXT for
    exponent-interval
    
    Change-Id: Ia18f9e150ca32aa9bbe133c082c3f9330e949f11
    Reviewed-on: https://gerrit.libreoffice.org/14875
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/include/xmloff/xmlnumfe.hxx b/include/xmloff/xmlnumfe.hxx
index c07da9c..ceffa35 100644
--- a/include/xmloff/xmlnumfe.hxx
+++ b/include/xmloff/xmlnumfe.hxx
@@ -67,7 +67,7 @@ private:
                                         bool bGrouping, sal_Int32 nTrailingThousands,
                                         const SvXMLEmbeddedTextEntryArr& rEmbeddedEntries );
     SAL_DLLPRIVATE void WriteScientificElement_Impl( sal_Int32 nDecimals, sal_Int32 nInteger,
-                                        bool bGrouping, sal_Int32 nExp );
+                                        bool bGrouping, sal_Int32 nExp, sal_Int32 nExpInterval );
     SAL_DLLPRIVATE void WriteFractionElement_Impl( sal_Int32 nInteger, bool bGrouping,
                                         sal_Int32 nNumeratorDigits, sal_Int32 nDenominatorDigits, sal_Int32 nDenominator );
     SAL_DLLPRIVATE void WriteCurrencyElement_Impl( const OUString& rString,
diff --git a/include/xmloff/xmltoken.hxx b/include/xmloff/xmltoken.hxx
index ef40853..d1d39a7 100644
--- a/include/xmloff/xmltoken.hxx
+++ b/include/xmloff/xmltoken.hxx
@@ -3244,6 +3244,8 @@ namespace xmloff { namespace token {
         XML_CHART_DUNITS_BUILTINUNIT,
         XML_EXTERNALDATA,
 
+        XML_EXPONENT_INTERVAL,
+
         XML_TOKEN_END
     };
 
diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx
index e651e1b..0a1835b 100644
--- a/xmloff/source/core/xmltoken.cxx
+++ b/xmloff/source/core/xmltoken.cxx
@@ -3242,6 +3242,8 @@ namespace xmloff { namespace token {
         TOKEN( "display-units-built-in-unit",     XML_CHART_DUNITS_BUILTINUNIT ),
         TOKEN( "external-data", XML_EXTERNALDATA),
 
+        TOKEN( "exponent-interval",               XML_EXPONENT_INTERVAL ),
+
 #if OSL_DEBUG_LEVEL > 0
         { 0, NULL, NULL,                       XML_TOKEN_END }
 #else
diff --git a/xmloff/source/style/xmlnumfe.cxx b/xmloff/source/style/xmlnumfe.cxx
index 4689e51..f9402d2 100644
--- a/xmloff/source/style/xmlnumfe.cxx
+++ b/xmloff/source/style/xmlnumfe.cxx
@@ -634,7 +634,7 @@ void SvXMLNumFmtExport::WriteNumberElement_Impl(
 
 void SvXMLNumFmtExport::WriteScientificElement_Impl(
                             sal_Int32 nDecimals, sal_Int32 nInteger,
-                            bool bGrouping, sal_Int32 nExp )
+                            bool bGrouping, sal_Int32 nExp, sal_Int32 nExpInterval )
 {
     FinishTextElement_Impl();
 
@@ -665,6 +665,13 @@ void SvXMLNumFmtExport::WriteScientificElement_Impl(
                               OUString::number( nExp ) );
     }
 
+    //  exponent interval for engineering notation
+    if ( nExpInterval >= 0 )
+    {        // when exponent-interval will be part of ODF 1.3, change to XML_NAMESPACE_NUMBER
+         rExport.AddAttribute(XML_NAMESPACE_LO_EXT, XML_EXPONENT_INTERVAL,
+                              OUString::number( nExpInterval ) );
+    }
+
     SvXMLElementExport aElem( rExport,
                               XML_NAMESPACE_NUMBER, XML_SCIENTIFIC_NUMBER,
                               true, false );
@@ -1400,8 +1407,8 @@ void SvXMLNumFmtExport::ExportPart_Impl( const SvNumberformat& rFormat, sal_uInt
                             case css::util::NumberFormat::SCIENTIFIC:
                                 // #i43959# for scientific numbers, count all integer symbols ("0" and "#")
                                 // as integer digits: use nIntegerSymbols instead of nLeading
-                                // (use of '#' to select multiples in exponent might be added later)
-                                WriteScientificElement_Impl( nPrecision, nIntegerSymbols, bThousand, nExpDigits );
+                                // nIntegerSymbols represents exponent interval (for engineering notation)
+                                WriteScientificElement_Impl( nPrecision, nLeading, bThousand, nExpDigits, nIntegerSymbols );
                                 bAnyContent = true;
                                 break;
                             case css::util::NumberFormat::FRACTION:
diff --git a/xmloff/source/style/xmlnumfi.cxx b/xmloff/source/style/xmlnumfi.cxx
index 14d8bf3..c1e458a 100644
--- a/xmloff/source/style/xmlnumfi.cxx
+++ b/xmloff/source/style/xmlnumfi.cxx
@@ -110,6 +110,7 @@ struct SvXMLNumberInfo
     sal_Int32   nDecimals;
     sal_Int32   nInteger;
     sal_Int32   nExpDigits;
+    sal_Int32   nExpInterval;
     sal_Int32   nNumerDigits;
     sal_Int32   nDenomDigits;
     sal_Int32   nFracDenominator;
@@ -121,7 +122,7 @@ struct SvXMLNumberInfo
 
     SvXMLNumberInfo()
     {
-        nDecimals = nInteger = nExpDigits = nNumerDigits = nDenomDigits = nFracDenominator = -1;
+        nDecimals = nInteger = nExpDigits = nExpInterval = nNumerDigits = nDenomDigits = nFracDenominator = -1;
         bGrouping = bDecReplace = bVarDecimals = false;
         fDisplayFactor = 1.0;
     }
@@ -203,7 +204,7 @@ public:
 class SvXMLNumFmtPropContext : public SvXMLImportContext
 {
     SvXMLNumFormatContext&  rParent;
-	sal_Int32				m_nColor;
+    sal_Int32               m_nColor;
     bool                    bColSet;
 
 public:
@@ -276,6 +277,7 @@ enum SvXMLStyleElemAttrTokens
     XML_TOK_ELEM_ATTR_DECIMAL_REPLACEMENT,
     XML_TOK_ELEM_ATTR_DENOMINATOR_VALUE,
     XML_TOK_ELEM_ATTR_MIN_EXPONENT_DIGITS,
+    XML_TOK_ELEM_ATTR_EXPONENT_INTERVAL,
     XML_TOK_ELEM_ATTR_MIN_NUMERATOR_DIGITS,
     XML_TOK_ELEM_ATTR_MIN_DENOMINATOR_DIGITS,
     XML_TOK_ELEM_ATTR_RFC_LANGUAGE_TAG,
@@ -571,6 +573,8 @@ const SvXMLTokenMap& SvXMLNumImpData::GetStyleElemAttrTokenMap()
             { XML_NAMESPACE_NUMBER, XML_DECIMAL_REPLACEMENT,     XML_TOK_ELEM_ATTR_DECIMAL_REPLACEMENT  },
             { XML_NAMESPACE_NUMBER, XML_DENOMINATOR_VALUE,       XML_TOK_ELEM_ATTR_DENOMINATOR_VALUE  },
             { XML_NAMESPACE_NUMBER, XML_MIN_EXPONENT_DIGITS,     XML_TOK_ELEM_ATTR_MIN_EXPONENT_DIGITS  },
+            // number:exponent-interval will be supported in ODF 1.3
+            { XML_NAMESPACE_LO_EXT, XML_EXPONENT_INTERVAL,       XML_TOK_ELEM_ATTR_EXPONENT_INTERVAL    },
             { XML_NAMESPACE_NUMBER, XML_MIN_NUMERATOR_DIGITS,    XML_TOK_ELEM_ATTR_MIN_NUMERATOR_DIGITS },
             { XML_NAMESPACE_NUMBER, XML_MIN_DENOMINATOR_DIGITS,  XML_TOK_ELEM_ATTR_MIN_DENOMINATOR_DIGITS },
             { XML_NAMESPACE_NUMBER, XML_RFC_LANGUAGE_TAG,        XML_TOK_ELEM_ATTR_RFC_LANGUAGE_TAG     },
@@ -958,6 +962,10 @@ SvXMLNumFmtElementContext::SvXMLNumFmtElementContext( SvXMLImport& rImport,
                 if (::sax::Converter::convertNumber( nAttrVal, sValue, 0 ))
                     aNumInfo.nExpDigits = nAttrVal;
                 break;
+            case XML_TOK_ELEM_ATTR_EXPONENT_INTERVAL:
+                if (::sax::Converter::convertNumber( nAttrVal, sValue, 0 ))
+                    aNumInfo.nExpInterval = nAttrVal;
+                break;
             case XML_TOK_ELEM_ATTR_MIN_NUMERATOR_DIGITS:
                 if (::sax::Converter::convertNumber( nAttrVal, sValue, 0 ))
                     aNumInfo.nNumerDigits = nAttrVal;
@@ -1219,6 +1227,14 @@ void SvXMLNumFmtElementContext::EndElement()
 
         case XML_TOK_STYLE_SCIENTIFIC_NUMBER:
             {
+                // exponential interval for engineering notation
+                if( !aNumInfo.bGrouping && aNumInfo.nExpInterval > aNumInfo.nInteger )
+                {
+                    for (sal_Int32 i=0; i<aNumInfo.nExpInterval-aNumInfo.nInteger; i++)
+                    {
+                        rParent.AddToCode( '#' );
+                    }
+                }
                 rParent.AddNumber( aNumInfo );      // simple number
 
                 rParent.AddToCode( OUString("E+") );
@@ -1792,6 +1808,32 @@ void SvXMLNumFormatContext::AddNumber( const SvXMLNumberInfo& rInfo )
         aNumStr.stripStart('#');
     }
 
+    if ( bGrouping && rInfo.nExpInterval > rInfo.nInteger )
+    {
+        sal_Int32 nIndex = 0;
+        sal_Int32 nDigits = rInfo.nInteger;
+        sal_Int32 nIntegerEnd = aNumStr.indexOf( pFormatter->GetNumDecimalSep() );
+        if ( nIntegerEnd < 0 )
+            nIntegerEnd = aNumStr.getLength();
+        while ( nIndex >= 0 && nIndex < nIntegerEnd )
+        {
+            if ( ( nIndex = aNumStr.indexOf( '#', nIndex ) ) >= 0 )
+            {
+                nDigits ++;
+                nIndex ++;
+            }
+            else
+                nIndex = -1;
+        }
+        if( rInfo.nExpInterval > nDigits )
+        {
+            for (sal_Int32 i=0; i<rInfo.nExpInterval-nDigits; i++)
+            {
+                aNumStr.insert( 0, '#' );
+            }
+        }
+    }
+
     if ( nEmbeddedCount )
     {
         //  insert embedded strings into number string


More information about the Libreoffice-commits mailing list