diff options
author | Laurent Balland-Poirier <laurent.balland-poirier@laposte.net> | 2016-07-16 22:39:32 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2016-07-27 13:12:34 +0000 |
commit | f06a3503b69819e1d018ee4f587655173dff503e (patch) | |
tree | 77e6c699e349bd518f87c824388c6e3dfecb122d /xmloff | |
parent | 5bd8b05f9b0adb93aec4d6ad7b67c7003092b873 (diff) |
tdf#100834 Extend ODF for integer/fraction delimiter
Any string can be used as delimiter between integer and fraction.
It is now saved/loaded to/from ODF, as it was from XLS.
Change-Id: Ie6364d1cdefc020ea615c18099118135c619f96b
Reviewed-on: https://gerrit.libreoffice.org/27262
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Eike Rathke <erack@redhat.com>
Diffstat (limited to 'xmloff')
-rw-r--r-- | xmloff/source/core/xmltoken.cxx | 1 | ||||
-rw-r--r-- | xmloff/source/style/xmlnumfe.cxx | 17 | ||||
-rw-r--r-- | xmloff/source/style/xmlnumfi.cxx | 14 |
3 files changed, 28 insertions, 4 deletions
diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx index 6f7caaa76226..f6924bb0a918 100644 --- a/xmloff/source/core/xmltoken.cxx +++ b/xmloff/source/core/xmltoken.cxx @@ -3267,6 +3267,7 @@ namespace xmloff { namespace token { TOKEN( "max-numerator-digits", XML_MAX_NUMERATOR_DIGITS ), TOKEN( "zeros-numerator-digits", XML_ZEROS_NUMERATOR_DIGITS ), TOKEN( "zeros-denominator-digits", XML_ZEROS_DENOMINATOR_DIGITS ), + TOKEN( "integer-fraction-delimiter", XML_INTEGER_FRACTION_DELIMITER ), #if OSL_DEBUG_LEVEL > 0 { 0, nullptr, nullptr, XML_TOKEN_END } diff --git a/xmloff/source/style/xmlnumfe.cxx b/xmloff/source/style/xmlnumfe.cxx index 20b416cf75da..f449331333c4 100644 --- a/xmloff/source/style/xmlnumfe.cxx +++ b/xmloff/source/style/xmlnumfe.cxx @@ -727,9 +727,12 @@ void SvXMLNumFmtExport::WriteScientificElement_Impl( void SvXMLNumFmtExport::WriteFractionElement_Impl( sal_Int32 nInteger, bool bGrouping, - const OUString& aNumeratorString , const OUString& aDenominatorString ) + const SvNumberformat& rFormat, sal_uInt16 nPart ) { FinishTextElement_Impl(); + const OUString aNumeratorString = rFormat.GetNumeratorString( nPart ); + const OUString aDenominatorString = rFormat.GetDenominatorString( nPart ); + const OUString aIntegerFractionDelimiterString = rFormat.GetIntegerFractionDelimiterString( nPart ); sal_Int32 nMaxNumeratorDigits = aNumeratorString.getLength(); // Count '0' as '?' sal_Int32 nMinNumeratorDigits = aNumeratorString.replaceAll("0","?").indexOf('?'); @@ -768,13 +771,21 @@ void SvXMLNumFmtExport::WriteFractionElement_Impl( rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_GROUPING, XML_TRUE ); } + // integer/fraction delimiter + SvtSaveOptions::ODFSaneDefaultVersion eVersion = rExport.getSaneDefaultVersion(); + if ( !aIntegerFractionDelimiterString.isEmpty() && aIntegerFractionDelimiterString != " " + && ((eVersion & SvtSaveOptions::ODFSVER_EXTENDED) != 0) ) + { // Export only for 1.2 with extensions or 1.3 and later. + rExport.AddAttribute( XML_NAMESPACE_LO_EXT, XML_INTEGER_FRACTION_DELIMITER, + aIntegerFractionDelimiterString ); + } + // numerator digits if ( nMinNumeratorDigits == 0 ) // at least one digit to keep compatibility with previous versions nMinNumeratorDigits++; rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_MIN_NUMERATOR_DIGITS, OUString::number( nMinNumeratorDigits ) ); // Export only for 1.2 with extensions or 1.3 and later. - SvtSaveOptions::ODFSaneDefaultVersion eVersion = rExport.getSaneDefaultVersion(); if ((eVersion & SvtSaveOptions::ODFSVER_EXTENDED) != 0) { // For extended ODF use loext namespace @@ -1540,7 +1551,7 @@ void SvXMLNumFmtExport::ExportPart_Impl( const SvNumberformat& rFormat, sal_uInt // min-integer-digits attribute must be written. nInteger = -1; } - WriteFractionElement_Impl( nInteger, bThousand, rFormat.GetNumeratorString( nPart ), rFormat.GetDenominatorString( nPart ) ); + WriteFractionElement_Impl( nInteger, bThousand, rFormat, nPart ); bAnyContent = true; } break; diff --git a/xmloff/source/style/xmlnumfi.cxx b/xmloff/source/style/xmlnumfi.cxx index c9da66addd1f..7dc053f33f9c 100644 --- a/xmloff/source/style/xmlnumfi.cxx +++ b/xmloff/source/style/xmlnumfi.cxx @@ -108,6 +108,7 @@ struct SvXMLNumberInfo bool bExpSign; bool bDecAlign; double fDisplayFactor; + OUString aIntegerFractionDelimiter; std::map<sal_Int32, OUString> m_EmbeddedElements; SvXMLNumberInfo() @@ -270,6 +271,7 @@ enum SvXMLStyleElemAttrTokens 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_INTEGER_FRACTION_DELIMITER, XML_TOK_ELEM_ATTR_RFC_LANGUAGE_TAG, XML_TOK_ELEM_ATTR_LANGUAGE, XML_TOK_ELEM_ATTR_SCRIPT, @@ -577,6 +579,8 @@ const SvXMLTokenMap& SvXMLNumImpData::GetStyleElemAttrTokenMap() { 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_LO_EXT, XML_INTEGER_FRACTION_DELIMITER, XML_TOK_ELEM_ATTR_INTEGER_FRACTION_DELIMITER }, + { XML_NAMESPACE_NUMBER, XML_INTEGER_FRACTION_DELIMITER, XML_TOK_ELEM_ATTR_INTEGER_FRACTION_DELIMITER }, { 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 }, @@ -1019,6 +1023,9 @@ SvXMLNumFmtElementContext::SvXMLNumFmtElementContext( SvXMLImport& rImport, case XML_TOK_ELEM_ATTR_ZEROS_DENOMINATOR_DIGITS: if (::sax::Converter::convertNumber( nAttrVal, sValue, 0 )) aNumInfo.nZerosDenomDigits = nAttrVal; + break; + case XML_TOK_ELEM_ATTR_INTEGER_FRACTION_DELIMITER: + aNumInfo.aIntegerFractionDelimiter = sValue; break; case XML_TOK_ELEM_ATTR_RFC_LANGUAGE_TAG: aLanguageTagODF.maRfcLanguageTag = sValue; @@ -1091,6 +1098,9 @@ SvXMLNumFmtElementContext::SvXMLNumFmtElementContext( SvXMLImport& rImport, if ( nElementLang == LANGUAGE_DONTKNOW ) nElementLang = LANGUAGE_SYSTEM; //! error handling for unknown locales? } + + if ( aNumInfo.aIntegerFractionDelimiter.isEmpty() ) + aNumInfo.aIntegerFractionDelimiter = " "; } SvXMLNumFmtElementContext::~SvXMLNumFmtElementContext() @@ -1274,7 +1284,9 @@ void SvXMLNumFmtElementContext::EndElement() // add integer part only if min-integer-digits attribute is there aNumInfo.nDecimals = 0; rParent.AddNumber( aNumInfo ); // number without decimals - rParent.AddToCode( ' ' ); + OUStringBuffer sIntegerFractionDelimiter = aNumInfo.aIntegerFractionDelimiter; + lcl_EnquoteIfNecessary( sIntegerFractionDelimiter, rParent ); + rParent.AddToCode( sIntegerFractionDelimiter.makeStringAndClear() ); // default is ' ' } //! build string and add at once |