Resolves: tdf#149950 Handle LongDateOrder vs DateOrder for middle month name
Change-Id: I30598f7081cea73fa368374084c03b0df108be84
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137026
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins
diff --git a/svl/source/numbers/zforfind.cxx b/svl/source/numbers/zforfind.cxx
index ac9fe7a..081b307 100644
--- a/svl/source/numbers/zforfind.cxx
+++ b/svl/source/numbers/zforfind.cxx
@@ -1704,6 +1704,52 @@ DateOrder ImpSvNumberInputScan::GetDateOrder( bool bFromFormatIfNoPattern )
return pFormatter->GetLocaleData()->getDateOrder();
}
LongDateOrder ImpSvNumberInputScan::GetMiddleMonthLongDateOrder( bool bFormatTurn,
const LocaleDataWrapper* pLoc,
DateOrder eDateOrder )
{
if (MayBeMonthDate())
return (nMayBeMonthDate == 2) ? LongDateOrder::DMY : LongDateOrder::YMD;
LongDateOrder eLDO;
const sal_uInt32 nExactDateOrder = (bFormatTurn ? mpFormat->GetExactDateOrder() : 0);
if (!nExactDateOrder)
eLDO = pLoc->getLongDateOrder();
else if ((((nExactDateOrder >> 16) & 0xff) == 'Y') && ((nExactDateOrder & 0xff) == 'D'))
eLDO = LongDateOrder::YMD;
else if ((((nExactDateOrder >> 16) & 0xff) == 'D') && ((nExactDateOrder & 0xff) == 'Y'))
eLDO = LongDateOrder::DMY;
else
eLDO = pLoc->getLongDateOrder();
if (eLDO != LongDateOrder::YMD && eLDO != LongDateOrder::DMY)
{
switch (eDateOrder)
{
case DateOrder::YMD:
eLDO = LongDateOrder::YMD;
break;
case DateOrder::DMY:
eLDO = LongDateOrder::DMY;
break;
default:
; // nothing, not a date
}
}
else if (eLDO == LongDateOrder::DMY && eDateOrder == DateOrder::YMD)
{
// Check possible order and maybe switch.
if (!ImplGetDay(0) && ImplGetDay(1))
eLDO = LongDateOrder::YMD;
}
else if (eLDO == LongDateOrder::YMD && eDateOrder == DateOrder::DMY)
{
// Check possible order and maybe switch.
if (!ImplGetDay(1) && ImplGetDay(0))
eLDO = LongDateOrder::DMY;
}
return eLDO;
}
bool ImpSvNumberInputScan::GetDateRef( double& fDays, sal_uInt16& nCounter )
{
using namespace ::com::sun::star::i18n;
@@ -2060,14 +2106,14 @@ input for the following reasons:
case 2: // month in the middle (10 Jan 94)
{
pCal->setValue( CalendarFieldIndex::MONTH, std::abs(nMonth)-1 );
DateOrder eDF = (MayBeMonthDate() ? (nMayBeMonthDate == 2 ? DateOrder::DMY : DateOrder::YMD) : DateFmt);
switch (eDF)
const LongDateOrder eLDO = GetMiddleMonthLongDateOrder( bFormatTurn, pLoc, DateFmt);
switch (eLDO)
{
case DateOrder::DMY:
case LongDateOrder::DMY:
pCal->setValue( CalendarFieldIndex::DAY_OF_MONTH, ImplGetDay(0) );
pCal->setValue( CalendarFieldIndex::YEAR, ImplGetYear(1) );
break;
case DateOrder::YMD:
case LongDateOrder::YMD:
pCal->setValue( CalendarFieldIndex::DAY_OF_MONTH, ImplGetDay(1) );
pCal->setValue( CalendarFieldIndex::YEAR, ImplGetYear(0) );
break;
@@ -2143,15 +2189,17 @@ input for the following reasons:
}
break;
case 2: // month in the middle (10 Jan 94 8:23)
{
nCounter = 2;
pCal->setValue( CalendarFieldIndex::MONTH, std::abs(nMonth)-1 );
switch (DateFmt)
const LongDateOrder eLDO = GetMiddleMonthLongDateOrder( bFormatTurn, pLoc, DateFmt);
switch (eLDO)
{
case DateOrder::DMY:
case LongDateOrder::DMY:
pCal->setValue( CalendarFieldIndex::DAY_OF_MONTH, ImplGetDay(0) );
pCal->setValue( CalendarFieldIndex::YEAR, ImplGetYear(1) );
break;
case DateOrder::YMD:
case LongDateOrder::YMD:
pCal->setValue( CalendarFieldIndex::DAY_OF_MONTH, ImplGetDay(1) );
pCal->setValue( CalendarFieldIndex::YEAR, ImplGetYear(0) );
break;
@@ -2160,6 +2208,7 @@ input for the following reasons:
break;
}
break;
}
default: // else, e.g. month at the end (94 10 Jan 8:23)
nCounter = 2;
res = false;
diff --git a/svl/source/numbers/zforfind.hxx b/svl/source/numbers/zforfind.hxx
index 9c1e9e9..7e6ddeb 100644
--- a/svl/source/numbers/zforfind.hxx
+++ b/svl/source/numbers/zforfind.hxx
@@ -427,6 +427,13 @@ private:
NfEvalDateFormat setting.
*/
bool IsAcceptableIso8601();
/** If month name in the middle was parsed, get the corresponding
LongDateOrder in GetDateRef().
*/
LongDateOrder GetMiddleMonthLongDateOrder( bool bFormatTurn,
const LocaleDataWrapper* pLoc,
DateOrder eDateOrder );
};
#endif // INCLUDED_SVL_SOURCE_NUMBERS_ZFORFIND_HXX