summaryrefslogtreecommitdiffstats
path: root/xmloff
diff options
context:
space:
mode:
authorLaurent Balland-Poirier <laurent.balland-poirier@laposte.net>2016-07-16 22:39:32 +0200
committerEike Rathke <erack@redhat.com>2016-07-27 13:12:34 +0000
commitf06a3503b69819e1d018ee4f587655173dff503e (patch)
tree77e6c699e349bd518f87c824388c6e3dfecb122d /xmloff
parentSimplify dynamic_cast followed by a static_cast. (diff)
downloadcore-f06a3503b69819e1d018ee4f587655173dff503e.tar.gz
core-f06a3503b69819e1d018ee4f587655173dff503e.zip
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.cxx1
-rw-r--r--xmloff/source/style/xmlnumfe.cxx17
-rw-r--r--xmloff/source/style/xmlnumfi.cxx14
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