Move implementation of CELL("format";...) to SvNumberFormatter, tdf#132106 prep
In preparation of further detailed handling.
Change-Id: I9e4d916de031b742d0af1025b945b7608fed8266
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92462
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins
diff --git a/include/svl/zforlist.hxx b/include/svl/zforlist.hxx
index 70371d5..664ddbc 100644
--- a/include/svl/zforlist.hxx
+++ b/include/svl/zforlist.hxx
@@ -616,6 +616,9 @@ public:
sal_uInt16& nPrecision, sal_uInt16& nLeadingCnt,
LanguageType eLnge = LANGUAGE_DONTKNOW );
/// Get return string for Calc CELL() function, "G", "D1", ...
OUString GetCalcCellReturn( sal_uInt32 nFormat ) const;
/// Check if format code string may be deleted by user
bool IsUserDefined( const OUString& sStr, LanguageType eLnge = LANGUAGE_DONTKNOW );
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 8f54c25..03a8f46 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -2202,60 +2202,7 @@ namespace {
void getFormatString(SvNumberFormatter* pFormatter, sal_uLong nFormat, OUString& rFmtStr)
{
bool bAppendPrec = true;
sal_uInt16 nPrec, nLeading;
bool bThousand, bIsRed;
pFormatter->GetFormatSpecialInfo( nFormat, bThousand, bIsRed, nPrec, nLeading );
switch( pFormatter->GetType( nFormat ) )
{
case SvNumFormatType::NUMBER:
if(bThousand) rFmtStr = ","; else rFmtStr = "F";
break;
case SvNumFormatType::CURRENCY:
rFmtStr = "C";
break;
case SvNumFormatType::SCIENTIFIC:
rFmtStr = "S";
break;
case SvNumFormatType::PERCENT:
rFmtStr = "P";
break;
default:
{
bAppendPrec = false;
switch( pFormatter->GetIndexTableOffset( nFormat ) )
{
case NF_DATE_SYSTEM_SHORT:
case NF_DATE_SYS_DMMMYY:
case NF_DATE_SYS_DDMMYY:
case NF_DATE_SYS_DDMMYYYY:
case NF_DATE_SYS_DMMMYYYY:
case NF_DATE_DIN_DMMMYYYY:
case NF_DATE_SYS_DMMMMYYYY:
case NF_DATE_DIN_DMMMMYYYY: rFmtStr = "D1"; break;
case NF_DATE_SYS_DDMMM: rFmtStr = "D2"; break;
case NF_DATE_SYS_MMYY: rFmtStr = "D3"; break;
case NF_DATETIME_SYSTEM_SHORT_HHMM:
case NF_DATETIME_SYS_DDMMYYYY_HHMM:
case NF_DATETIME_SYS_DDMMYYYY_HHMMSS:
rFmtStr = "D4"; break;
case NF_DATE_DIN_MMDD: rFmtStr = "D5"; break;
case NF_TIME_HHMMSSAMPM: rFmtStr = "D6"; break;
case NF_TIME_HHMMAMPM: rFmtStr = "D7"; break;
case NF_TIME_HHMMSS: rFmtStr = "D8"; break;
case NF_TIME_HHMM: rFmtStr = "D9"; break;
default: rFmtStr = "G";
}
}
}
if( bAppendPrec )
rFmtStr += OUString::number(nPrec);
const SvNumberformat* pFormat = pFormatter->GetEntry( nFormat );
if( lcl_FormatHasNegColor( pFormat ) )
rFmtStr += "-";
if( lcl_FormatHasOpenPar( pFormat ) )
rFmtStr += "()";
rFmtStr = pFormatter->GetCalcCellReturn( nFormat);
}
}
diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx
index 21886b2..4edf069 100644
--- a/svl/source/numbers/zforlist.cxx
+++ b/svl/source/numbers/zforlist.cxx
@@ -2179,6 +2179,80 @@ sal_uInt32 SvNumberFormatter::GetFormatSpecialInfo( const OUString& rFormatStrin
return nCheckPos;
}
OUString SvNumberFormatter::GetCalcCellReturn( sal_uInt32 nFormat ) const
{
::osl::MutexGuard aGuard( GetInstanceMutex() );
const SvNumberformat* pFormat = GetFormatEntry( nFormat );
if (!pFormat)
return "G";
OUString aStr;
bool bAppendPrec = true;
sal_uInt16 nPrec, nLeading;
bool bThousand, bIsRed;
pFormat->GetFormatSpecialInfo( bThousand, bIsRed, nPrec, nLeading );
switch (pFormat->GetMaskedType())
{
case SvNumFormatType::NUMBER:
if (bThousand)
aStr = ",";
else
aStr = "F";
break;
case SvNumFormatType::CURRENCY:
aStr = "C";
break;
case SvNumFormatType::SCIENTIFIC:
aStr = "S";
break;
case SvNumFormatType::PERCENT:
aStr = "P";
break;
default:
{
bAppendPrec = false;
switch (GetIndexTableOffset( nFormat ))
{
case NF_DATE_SYSTEM_SHORT:
case NF_DATE_SYS_DMMMYY:
case NF_DATE_SYS_DDMMYY:
case NF_DATE_SYS_DDMMYYYY:
case NF_DATE_SYS_DMMMYYYY:
case NF_DATE_DIN_DMMMYYYY:
case NF_DATE_SYS_DMMMMYYYY:
case NF_DATE_DIN_DMMMMYYYY: aStr = "D1"; break;
case NF_DATE_SYS_DDMMM: aStr = "D2"; break;
case NF_DATE_SYS_MMYY: aStr = "D3"; break;
case NF_DATETIME_SYSTEM_SHORT_HHMM:
case NF_DATETIME_SYS_DDMMYYYY_HHMM:
case NF_DATETIME_SYS_DDMMYYYY_HHMMSS:
aStr = "D4"; break;
case NF_DATE_DIN_MMDD: aStr = "D5"; break;
case NF_TIME_HHMMSSAMPM: aStr = "D6"; break;
case NF_TIME_HHMMAMPM: aStr = "D7"; break;
case NF_TIME_HHMMSS: aStr = "D8"; break;
case NF_TIME_HHMM: aStr = "D9"; break;
default: aStr = "G";
}
}
}
if (bAppendPrec)
aStr += OUString::number(nPrec);
if (pFormat->GetColor( 1 ))
aStr += "-"; // negative color
/* FIXME: this probably should not match on literal strings and only be
* performed on number or currency formats, but it is what Calc originally
* implemented. */
if (pFormat->GetFormatstring().indexOf('(') != -1)
aStr += "()";
return aStr;
}
sal_Int32 SvNumberFormatter::ImpGetFormatCodeIndex(
css::uno::Sequence< css::i18n::NumberFormatCode >& rSeq,
const NfIndexTableOffset nTabOff )