summaryrefslogtreecommitdiff
path: root/svl
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2022-07-13 14:54:55 +0200
committerAdolfo Jayme Barrientos <fitojb@ubuntu.com>2022-07-14 10:33:54 +0200
commit90c4d2fe555a52b7bcbda063684ae712207e9b4d (patch)
treeefb552562857a984d682d9eacfd1afab6120ba71 /svl
parenta1ee991d655d18c0e0e7f0c093ac50cb1e6d5825 (diff)
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 (cherry picked from commit 017241cebd8722499716e3ca2dfc61b2a4fd2c64) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136990 Reviewed-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
Diffstat (limited to 'svl')
-rw-r--r--svl/source/numbers/zforfind.cxx63
-rw-r--r--svl/source/numbers/zforfind.hxx7
2 files changed, 63 insertions, 7 deletions
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