summaryrefslogtreecommitdiff
path: root/xmloff/source/style/xmlnumfi.cxx
diff options
context:
space:
mode:
authorLaurent Balland-Poirier <laurent.balland-poirier@laposte.net>2016-07-17 11:06:41 +0200
committerEike Rathke <erack@redhat.com>2016-07-27 11:04:04 +0000
commitaab21302fa7ec76772456ad0cd8729a16e2a11e0 (patch)
treee13aa4a462b95728fbaf014b0aad74e46ae2c0b7 /xmloff/source/style/xmlnumfi.cxx
parent7c84a219e3cc8d623826343f547ba8adacca6d56 (diff)
tdf#100755 Extend ODF to allow 0 in fraction
As '0' is now allowed in numerator/denominator this commit extend ODF to save/load this format Change-Id: I3bc897dcce5393453acd7a434a21ae305feeb919 Reviewed-on: https://gerrit.libreoffice.org/27263 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Eike Rathke <erack@redhat.com>
Diffstat (limited to 'xmloff/source/style/xmlnumfi.cxx')
-rw-r--r--xmloff/source/style/xmlnumfi.cxx42
1 files changed, 38 insertions, 4 deletions
diff --git a/xmloff/source/style/xmlnumfi.cxx b/xmloff/source/style/xmlnumfi.cxx
index 7e9c501ce0fb..c9da66addd1f 100644
--- a/xmloff/source/style/xmlnumfi.cxx
+++ b/xmloff/source/style/xmlnumfi.cxx
@@ -101,6 +101,8 @@ struct SvXMLNumberInfo
sal_Int32 nMaxDenomDigits;
sal_Int32 nFracDenominator;
sal_Int32 nMinDecimalDigits;
+ sal_Int32 nZerosNumerDigits;
+ sal_Int32 nZerosDenomDigits;
bool bGrouping;
bool bDecReplace;
bool bExpSign;
@@ -111,7 +113,7 @@ struct SvXMLNumberInfo
SvXMLNumberInfo()
{
nDecimals = nInteger = nExpDigits = nExpInterval = nMinNumerDigits = nMinDenomDigits = nMaxNumerDigits = nMaxDenomDigits =
- nFracDenominator = nMinDecimalDigits = -1;
+ nFracDenominator = nMinDecimalDigits = nZerosNumerDigits = nZerosDenomDigits = -1;
bGrouping = bDecReplace = bDecAlign = false;
bExpSign = true;
fDisplayFactor = 1.0;
@@ -266,6 +268,8 @@ enum SvXMLStyleElemAttrTokens
XML_TOK_ELEM_ATTR_MIN_DENOMINATOR_DIGITS,
XML_TOK_ELEM_ATTR_MAX_NUMERATOR_DIGITS,
XML_TOK_ELEM_ATTR_MAX_DENOMINATOR_VALUE,
+ XML_TOK_ELEM_ATTR_ZEROS_NUMERATOR_DIGITS,
+ XML_TOK_ELEM_ATTR_ZEROS_DENOMINATOR_DIGITS,
XML_TOK_ELEM_ATTR_RFC_LANGUAGE_TAG,
XML_TOK_ELEM_ATTR_LANGUAGE,
XML_TOK_ELEM_ATTR_SCRIPT,
@@ -569,6 +573,10 @@ const SvXMLTokenMap& SvXMLNumImpData::GetStyleElemAttrTokenMap()
{ XML_NAMESPACE_LO_EXT, XML_MAX_NUMERATOR_DIGITS, XML_TOK_ELEM_ATTR_MAX_NUMERATOR_DIGITS },
{ XML_NAMESPACE_LO_EXT, XML_MAX_DENOMINATOR_VALUE, XML_TOK_ELEM_ATTR_MAX_DENOMINATOR_VALUE },
{ XML_NAMESPACE_NUMBER, XML_MAX_DENOMINATOR_VALUE, XML_TOK_ELEM_ATTR_MAX_DENOMINATOR_VALUE },
+ { XML_NAMESPACE_LO_EXT, XML_ZEROS_NUMERATOR_DIGITS, XML_TOK_ELEM_ATTR_ZEROS_NUMERATOR_DIGITS },
+ { XML_NAMESPACE_NUMBER, XML_ZEROS_NUMERATOR_DIGITS, XML_TOK_ELEM_ATTR_ZEROS_NUMERATOR_DIGITS },
+ { XML_NAMESPACE_LO_EXT, XML_ZEROS_DENOMINATOR_DIGITS,XML_TOK_ELEM_ATTR_ZEROS_DENOMINATOR_DIGITS },
+ { XML_NAMESPACE_NUMBER, XML_ZEROS_DENOMINATOR_DIGITS,XML_TOK_ELEM_ATTR_ZEROS_DENOMINATOR_DIGITS },
{ XML_NAMESPACE_NUMBER, XML_RFC_LANGUAGE_TAG, XML_TOK_ELEM_ATTR_RFC_LANGUAGE_TAG },
{ XML_NAMESPACE_NUMBER, XML_LANGUAGE, XML_TOK_ELEM_ATTR_LANGUAGE },
{ XML_NAMESPACE_NUMBER, XML_SCRIPT, XML_TOK_ELEM_ATTR_SCRIPT },
@@ -1003,7 +1011,15 @@ SvXMLNumFmtElementContext::SvXMLNumFmtElementContext( SvXMLImport& rImport,
aNumInfo.nFracDenominator = nAttrVal;
bIsMaxDenominator = true;
}
- break;
+ break;
+ case XML_TOK_ELEM_ATTR_ZEROS_NUMERATOR_DIGITS:
+ if (::sax::Converter::convertNumber( nAttrVal, sValue, 0 ))
+ aNumInfo.nZerosNumerDigits = nAttrVal;
+ break;
+ case XML_TOK_ELEM_ATTR_ZEROS_DENOMINATOR_DIGITS:
+ if (::sax::Converter::convertNumber( nAttrVal, sValue, 0 ))
+ aNumInfo.nZerosDenomDigits = nAttrVal;
+ break;
case XML_TOK_ELEM_ATTR_RFC_LANGUAGE_TAG:
aLanguageTagODF.maRfcLanguageTag = sValue;
break;
@@ -1036,9 +1052,23 @@ SvXMLNumFmtElementContext::SvXMLNumFmtElementContext( SvXMLImport& rImport,
else
aNumInfo.nMinDecimalDigits = aNumInfo.nDecimals;
}
+ if ( aNumInfo.nZerosDenomDigits > 0 )
+ { // nMin = count of '0' and '?'
+ if ( aNumInfo.nMinDenomDigits < aNumInfo.nZerosDenomDigits )
+ aNumInfo.nMinDenomDigits = aNumInfo.nZerosDenomDigits;
+ }
+ else
+ aNumInfo.nZerosDenomDigits = 0;
if ( aNumInfo.nMinDenomDigits >= 0 )
if ( aNumInfo.nMaxDenomDigits < aNumInfo.nMinDenomDigits )
aNumInfo.nMaxDenomDigits = ( aNumInfo.nMinDenomDigits ? aNumInfo.nMinDenomDigits : 1 );
+ if ( aNumInfo.nZerosNumerDigits > 0 )
+ {
+ if ( aNumInfo.nMinNumerDigits < aNumInfo.nZerosNumerDigits )
+ aNumInfo.nMinNumerDigits = aNumInfo.nZerosNumerDigits;
+ }
+ else
+ aNumInfo.nZerosNumerDigits = 0;
if ( aNumInfo.nMinNumerDigits >= 0 )
if ( aNumInfo.nMaxNumerDigits < aNumInfo.nMinNumerDigits )
aNumInfo.nMaxNumerDigits = ( aNumInfo.nMinNumerDigits ? aNumInfo.nMinNumerDigits : 1 );
@@ -1254,8 +1284,10 @@ void SvXMLNumFmtElementContext::EndElement()
{
if ( i > aNumInfo.nMinNumerDigits )
rParent.AddToCode( '#' );
- else
+ else if ( i > aNumInfo.nZerosNumerDigits )
rParent.AddToCode( '?' );
+ else
+ rParent.AddToCode( '0' );
}
rParent.AddToCode( '/' );
if ( aNumInfo.nFracDenominator > 0 )
@@ -1268,8 +1300,10 @@ void SvXMLNumFmtElementContext::EndElement()
{
if ( i > aNumInfo.nMinDenomDigits )
rParent.AddToCode( '#' );
- else
+ else if ( i > aNumInfo.nZerosDenomDigits )
rParent.AddToCode( '?' );
+ else
+ rParent.AddToCode( '0' );
}
}
}