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

Reply via email to