svl/source/numbers/zforfind.cxx | 63 +++++++++++++++++++++++++++++++++++----- svl/source/numbers/zforfind.hxx | 7 ++++ 2 files changed, 63 insertions(+), 7 deletions(-)
New commits: commit d818c341206895a6dda1c19fc8b32f04b5b7c520 Author: Eike Rathke <er...@redhat.com> AuthorDate: Wed Jul 13 14:54:55 2022 +0200 Commit: Eike Rathke <er...@redhat.com> CommitDate: Wed Jul 13 17:46:58 2022 +0200 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 <er...@redhat.com> Tested-by: Jenkins diff --git a/svl/source/numbers/zforfind.cxx b/svl/source/numbers/zforfind.cxx index ac9fe7a9851a..081b3079a2bf 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 9c1e9e967ff6..7e6ddeb597af 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