diff options
author | Eike Rathke <erack@redhat.com> | 2018-05-03 13:59:31 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2018-05-04 00:29:20 +0200 |
commit | a5e0fda3c1375f312ba8d3f0f5ce80d16649c4f5 (patch) | |
tree | 94d552daa4271fb184a694396baebcf55b433412 | |
parent | 657668c378a9405c9978c553be52346b250e8d99 (diff) |
Revert "Revert "Resolves: tdf#116579 consider both work locale and format...""
This reverts commit f5a56c367fba1c42b4f9719b10ff3e86ad5e2ab1.
Now that Basic is fixed to set the proper NfEvalDateFormat ...
Change-Id: I448edd733b0370b22ff5d8c27fe2c993597c9f8f
Reviewed-on: https://gerrit.libreoffice.org/53788
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Eike Rathke <erack@redhat.com>
-rw-r--r-- | include/svl/zforlist.hxx | 4 | ||||
-rw-r--r-- | svl/source/numbers/zforfind.cxx | 164 | ||||
-rw-r--r-- | svl/source/numbers/zforfind.hxx | 19 |
3 files changed, 111 insertions, 76 deletions
diff --git a/include/svl/zforlist.hxx b/include/svl/zforlist.hxx index 536d6bdf1645..14aaf6a40940 100644 --- a/include/svl/zforlist.hxx +++ b/include/svl/zforlist.hxx @@ -882,6 +882,10 @@ public: /** Access for unit tests. */ size_t GetMaxDefaultColors() const; + struct InputScannerPrivateAccess { friend class ImpSvNumberInputScan; private: InputScannerPrivateAccess() {} }; + /** Access for input scanner to temporarily (!) switch locales. */ + OnDemandLocaleDataWrapper& GetOnDemandLocaleDataWrapper( const InputScannerPrivateAccess& ) { return xLocaleData; } + private: mutable ::osl::Mutex m_aMutex; css::uno::Reference< css::uno::XComponentContext > m_xContext; diff --git a/svl/source/numbers/zforfind.cxx b/svl/source/numbers/zforfind.cxx index 85b27797d204..e55786ea9d17 100644 --- a/svl/source/numbers/zforfind.cxx +++ b/svl/source/numbers/zforfind.cxx @@ -30,6 +30,7 @@ #include <com/sun/star/i18n/CalendarFieldIndex.hpp> #include <com/sun/star/i18n/LocaleCalendar2.hpp> #include <unotools/digitgroupingiterator.hxx> +#include <comphelper/sequence.hxx> #include <svl/zforlist.hxx> #include "zforscan.hxx" @@ -98,6 +99,7 @@ ImpSvNumberInputScan::~ImpSvNumberInputScan() void ImpSvNumberInputScan::Reset() { + mpFormat = nullptr; nMonth = 0; nMonthPos = 0; nDayOfWeek = 0; @@ -702,14 +704,13 @@ int ImpSvNumberInputScan::GetDayOfWeek( const OUString& rString, sal_Int32& nPos * '$' => true * else => false */ -bool ImpSvNumberInputScan::GetCurrency( const OUString& rString, sal_Int32& nPos, - const SvNumberformat* pFormat ) +bool ImpSvNumberInputScan::GetCurrency( const OUString& rString, sal_Int32& nPos ) { if ( rString.getLength() > nPos ) { if ( !aUpperCurrSymbol.getLength() ) { // if no format specified the currency of the initialized formatter - LanguageType eLang = (pFormat ? pFormat->GetLanguage() : pFormatter->GetLanguage()); + LanguageType eLang = (mpFormat ? mpFormat->GetLanguage() : pFormatter->GetLanguage()); aUpperCurrSymbol = pFormatter->GetCharClass()->uppercase( SvNumberFormatter::GetCurrencyEntry( eLang ).GetSymbol() ); } @@ -718,10 +719,10 @@ bool ImpSvNumberInputScan::GetCurrency( const OUString& rString, sal_Int32& nPos nPos = nPos + aUpperCurrSymbol.getLength(); return true; } - if ( pFormat ) + if ( mpFormat ) { OUString aSymbol, aExtension; - if ( pFormat->GetNewCurrencySymbol( aSymbol, aExtension ) ) + if ( mpFormat->GetNewCurrencySymbol( aSymbol, aExtension ) ) { if ( aSymbol.getLength() <= rString.getLength() - nPos ) { @@ -1100,18 +1101,18 @@ bool ImpSvNumberInputScan::CanForceToIso8601( DateOrder eDateOrder ) } -bool ImpSvNumberInputScan::IsAcceptableIso8601( const SvNumberformat* pFormat ) +bool ImpSvNumberInputScan::IsAcceptableIso8601() { - if (pFormat && (pFormat->GetType() & SvNumFormatType::DATE)) + if (mpFormat && (mpFormat->GetType() & SvNumFormatType::DATE)) { switch (pFormatter->GetEvalDateFormat()) { case NF_EVALDATEFORMAT_INTL: return CanForceToIso8601( GetDateOrder()); case NF_EVALDATEFORMAT_FORMAT: - return CanForceToIso8601( pFormat->GetDateOrder()); + return CanForceToIso8601( mpFormat->GetDateOrder()); default: - return CanForceToIso8601( GetDateOrder()) || CanForceToIso8601( pFormat->GetDateOrder()); + return CanForceToIso8601( GetDateOrder()) || CanForceToIso8601( mpFormat->GetDateOrder()); } } return CanForceToIso8601( GetDateOrder()); @@ -1191,7 +1192,46 @@ bool ImpSvNumberInputScan::IsAcceptedDatePattern( sal_uInt16 nStartPatternAt ) } else if (!sDateAcceptancePatterns.getLength()) { - sDateAcceptancePatterns = pFormatter->GetLocaleData()->getDateAcceptancePatterns(); + // The current locale is the format's locale, if a format is present. + const NfEvalDateFormat eEDF = pFormatter->GetEvalDateFormat(); + if (!mpFormat || eEDF == NF_EVALDATEFORMAT_FORMAT || mpFormat->GetLanguage() == pFormatter->GetLanguage()) + { + sDateAcceptancePatterns = pFormatter->GetLocaleData()->getDateAcceptancePatterns(); + } + else + { + OnDemandLocaleDataWrapper& xLocaleData = pFormatter->GetOnDemandLocaleDataWrapper( + SvNumberFormatter::InputScannerPrivateAccess()); + const LanguageTag aSaveLocale( xLocaleData->getLanguageTag() ); + assert(mpFormat->GetLanguage() == aSaveLocale.getLanguageType()); // prerequisite + // Obtain formatter's locale's (e.g. system) patterns. + xLocaleData.changeLocale( LanguageTag( pFormatter->GetLanguage())); + const css::uno::Sequence<OUString> aLocalePatterns( xLocaleData->getDateAcceptancePatterns()); + // Reset to format's locale. + xLocaleData.changeLocale( aSaveLocale); + // When concatenating don't care about duplicates, combining + // weeding those out reallocs yet another time and probably doesn't + // take less time than looping over two additional patterns below.. + switch (eEDF) + { + case NF_EVALDATEFORMAT_FORMAT: + assert(!"shouldn't reach here"); + break; + case NF_EVALDATEFORMAT_INTL: + sDateAcceptancePatterns = aLocalePatterns; + break; + case NF_EVALDATEFORMAT_INTL_FORMAT: + sDateAcceptancePatterns = comphelper::concatSequences( + aLocalePatterns, + xLocaleData->getDateAcceptancePatterns()); + break; + case NF_EVALDATEFORMAT_FORMAT_INTL: + sDateAcceptancePatterns = comphelper::concatSequences( + xLocaleData->getDateAcceptancePatterns(), + aLocalePatterns); + break; + } + } SAL_WARN_IF( !sDateAcceptancePatterns.getLength(), "svl.numbers", "ImpSvNumberInputScan::IsAcceptedDatePattern: no date acceptance patterns"); nAcceptedDatePattern = (sDateAcceptancePatterns.getLength() ? -2 : -1); } @@ -1546,13 +1586,12 @@ DateOrder ImpSvNumberInputScan::GetDateOrder() return pFormatter->GetLocaleData()->getDateOrder(); } -bool ImpSvNumberInputScan::GetDateRef( double& fDays, sal_uInt16& nCounter, - const SvNumberformat* pFormat ) +bool ImpSvNumberInputScan::GetDateRef( double& fDays, sal_uInt16& nCounter ) { using namespace ::com::sun::star::i18n; NfEvalDateFormat eEDF; int nFormatOrder; - if ( pFormat && (pFormat->GetType() & SvNumFormatType::DATE) ) + if ( mpFormat && (mpFormat->GetType() & SvNumFormatType::DATE) ) { eEDF = pFormatter->GetEvalDateFormat(); switch ( eEDF ) @@ -1593,7 +1632,7 @@ bool ImpSvNumberInputScan::GetDateRef( double& fDays, sal_uInt16& nCounter, break; case NF_EVALDATEFORMAT_FORMAT : bFormatTurn = true; - DateFmt = pFormat->GetDateOrder(); + DateFmt = mpFormat->GetDateOrder(); break; case NF_EVALDATEFORMAT_INTL_FORMAT : if ( nTryOrder == 1 ) @@ -1604,7 +1643,7 @@ bool ImpSvNumberInputScan::GetDateRef( double& fDays, sal_uInt16& nCounter, else { bFormatTurn = true; - DateFmt = pFormat->GetDateOrder(); + DateFmt = mpFormat->GetDateOrder(); } break; case NF_EVALDATEFORMAT_FORMAT_INTL : @@ -1616,7 +1655,7 @@ bool ImpSvNumberInputScan::GetDateRef( double& fDays, sal_uInt16& nCounter, else { bFormatTurn = true; - DateFmt = pFormat->GetDateOrder(); + DateFmt = mpFormat->GetDateOrder(); } break; default: @@ -1653,13 +1692,13 @@ input for the following reasons: */ #ifdef THE_FUTURE - if ( pFormat->IsOtherCalendar( nStringScanNumFor ) ) + if ( mpFormat->IsOtherCalendar( nStringScanNumFor ) ) { - pFormat->SwitchToOtherCalendar( aOrgCalendar, fOrgDateTime ); + mpFormat->SwitchToOtherCalendar( aOrgCalendar, fOrgDateTime ); } else { - pFormat->SwitchToSpecifiedCalendar( aOrgCalendar, fOrgDateTime, + mpFormat->SwitchToSpecifiedCalendar( aOrgCalendar, fOrgDateTime, nStringScanNumFor ); } #endif @@ -1695,7 +1734,7 @@ input for the following reasons: // 'D-', 'M-' or 'Y-'. If input did not match a // pattern assume the usual day of current month. sal_uInt32 nDateOrder = (bFormatTurn ? - pFormat->GetExactDateOrder() : + mpFormat->GetExactDateOrder() : GetDatePatternOrder()); switch (nDateOrder) { @@ -1767,7 +1806,7 @@ input for the following reasons: case 0: // not found { sal_uInt32 nExactDateOrder = (bFormatTurn ? - pFormat->GetExactDateOrder() : + mpFormat->GetExactDateOrder() : GetDatePatternOrder()); bool bIsExact = (0xff < nExactDateOrder && nExactDateOrder <= 0xffff); if (!bIsExact && bFormatTurn && IsAcceptedDatePattern( nNums[0])) @@ -1876,7 +1915,7 @@ input for the following reasons: // constellation, there is no date order (M)YD except if // set in a format applied. pCal->setValue( CalendarFieldIndex::MONTH, std::abs(nMonth)-1 ); - sal_uInt32 nExactDateOrder = (bFormatTurn ? pFormat->GetExactDateOrder() : 0); + sal_uInt32 nExactDateOrder = (bFormatTurn ? mpFormat->GetExactDateOrder() : 0); if ((((nExactDateOrder >> 8) & 0xff) == 'Y') && ((nExactDateOrder & 0xff) == 'D')) { pCal->setValue( CalendarFieldIndex::DAY_OF_MONTH, ImplGetDay(1) ); @@ -2108,8 +2147,7 @@ input for the following reasons: * All gone => true * else => false */ -bool ImpSvNumberInputScan::ScanStartString( const OUString& rString, - const SvNumberformat* pFormat ) +bool ImpSvNumberInputScan::ScanStartString( const OUString& rString ) { sal_Int32 nPos = 0; @@ -2128,7 +2166,7 @@ bool ImpSvNumberInputScan::ScanStartString( const OUString& rString, // Match against format in any case, so later on for a "x1-2-3" input // we may distinguish between a xy-m-d (or similar) date and a x0-0-0 // format. No sign detection here! - if ( ScanStringNumFor( rString, nPos, pFormat, 0, true ) ) + if ( ScanStringNumFor( rString, nPos, 0, true ) ) { nMatchedAllStrings |= nMatchedStartString; } @@ -2147,7 +2185,7 @@ bool ImpSvNumberInputScan::ScanStartString( const OUString& rString, nDecPos = 1; SkipBlanks(rString, nPos); } - else if ( GetCurrency(rString, nPos, pFormat) ) // currency (DM 1)? + else if ( GetCurrency(rString, nPos) ) // currency (DM 1)? { eScannedType = SvNumFormatType::CURRENCY; // !!! it IS currency !!! SkipBlanks(rString, nPos); @@ -2280,7 +2318,7 @@ bool ImpSvNumberInputScan::ScanStartString( const OUString& rString, { // Does input StartString equal StartString of format? // This time with sign detection! - if ( !ScanStringNumFor( rString, nPos, pFormat, 0 ) ) + if ( !ScanStringNumFor( rString, nPos, 0 ) ) { return MatchedReturn(); } @@ -2295,8 +2333,7 @@ bool ImpSvNumberInputScan::ScanStartString( const OUString& rString, * All gone => true * else => false */ -bool ImpSvNumberInputScan::ScanMidString( const OUString& rString, - sal_uInt16 nStringPos, const SvNumberformat* pFormat ) +bool ImpSvNumberInputScan::ScanMidString( const OUString& rString, sal_uInt16 nStringPos ) { sal_Int32 nPos = 0; SvNumFormatType eOldScannedType = eScannedType; @@ -2305,7 +2342,7 @@ bool ImpSvNumberInputScan::ScanMidString( const OUString& rString, { // Match against format in any case, so later on for a "1-2-3-4" input // we may distinguish between a y-m-d (or similar) date and a 0-0-0-0 // format. - if ( ScanStringNumFor( rString, 0, pFormat, nStringPos ) ) + if ( ScanStringNumFor( rString, 0, nStringPos ) ) { nMatchedAllStrings |= nMatchedMidString; } @@ -2653,8 +2690,7 @@ bool ImpSvNumberInputScan::ScanMidString( const OUString& rString, * All gone => true * else => false */ -bool ImpSvNumberInputScan::ScanEndString( const OUString& rString, - const SvNumberformat* pFormat ) +bool ImpSvNumberInputScan::ScanEndString( const OUString& rString ) { sal_Int32 nPos = 0; @@ -2662,7 +2698,7 @@ bool ImpSvNumberInputScan::ScanEndString( const OUString& rString, { // Match against format in any case, so later on for a "1-2-3-4" input // we may distinguish between a y-m-d (or similar) date and a 0-0-0-0 // format. - if ( ScanStringNumFor( rString, 0, pFormat, 0xFFFF ) ) + if ( ScanStringNumFor( rString, 0, 0xFFFF ) ) { nMatchedAllStrings |= nMatchedEndString; } @@ -2732,7 +2768,7 @@ bool ImpSvNumberInputScan::ScanEndString( const OUString& rString, SkipBlanks(rString, nPos); } - if ( GetCurrency(rString, nPos, pFormat) ) // currency symbol? + if ( GetCurrency(rString, nPos) ) // currency symbol? { if (eScannedType != SvNumFormatType::UNDEFINED) // currency dup { @@ -2956,7 +2992,7 @@ bool ImpSvNumberInputScan::ScanEndString( const OUString& rString, if (nPos < rString.getLength()) // everything consumed? { // does input EndString equal EndString in Format? - if ( !ScanStringNumFor( rString, nPos, pFormat, 0xFFFF ) ) + if ( !ScanStringNumFor( rString, nPos, 0xFFFF ) ) { return false; } @@ -2968,11 +3004,10 @@ bool ImpSvNumberInputScan::ScanEndString( const OUString& rString, bool ImpSvNumberInputScan::ScanStringNumFor( const OUString& rString, // String to scan sal_Int32 nPos, // Position until which was consumed - const SvNumberformat* pFormat, // The format to match sal_uInt16 nString, // Substring of format, 0xFFFF => last bool bDontDetectNegation) // Suppress sign detection { - if ( !pFormat ) + if ( !mpFormat ) { return false; } @@ -2991,7 +3026,7 @@ bool ImpSvNumberInputScan::ScanStringNumFor( const OUString& rString, // S do { // Step through subformats, first positive, then negative, then // other, but not the last (text) subformat. - pStr = pFormat->GetNumForString( nSub, nString, true ); + pStr = mpFormat->GetNumForString( nSub, nString, true ); if ( pStr && pTransliteration->isEqual( aString, *pStr ) ) { bFound = true; @@ -3020,7 +3055,7 @@ bool ImpSvNumberInputScan::ScanStringNumFor( const OUString& rString, // S if ( !bFound ) { if ( !bDontDetectNegation && (nString == 0) && - !bFirst && (nSign < 0) && pFormat->IsSecondSubformatRealNegative() ) + !bFirst && (nSign < 0) && mpFormat->IsSecondSubformatRealNegative() ) { // simply negated twice? --1 aString = aString.replaceAll(" ", ""); @@ -3037,7 +3072,7 @@ bool ImpSvNumberInputScan::ScanStringNumFor( const OUString& rString, // S } } else if ( !bDontDetectNegation && (nSub == 1) && - pFormat->IsSecondSubformatRealNegative() ) + mpFormat->IsSecondSubformatRealNegative() ) { // negative if ( nStringScanSign < 0 ) @@ -3057,7 +3092,7 @@ bool ImpSvNumberInputScan::ScanStringNumFor( const OUString& rString, // S { nStringScanSign = -1; // direct double negation } - else if ( pFormat->IsNegativeWithoutSign() ) + else if ( mpFormat->IsNegativeWithoutSign() ) { nStringScanSign = -1; // indirect double negation } @@ -3085,6 +3120,7 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, / const SvNumberformat* pFormat ) // maybe number format set to match against { Reset(); + mpFormat = pFormat; NumberStringDivision( rString ); // breakdown into strings and numbers if (nStringsCnt >= SV_MAX_COUNT_INPUT_STRINGS) // too many elements { @@ -3138,7 +3174,7 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, / } else { // Analyze start string - if (!ScanStartString( sStrArray[i], pFormat )) // i=0 + if (!ScanStartString( sStrArray[i] )) // i=0 { return false; // already an error } @@ -3159,7 +3195,7 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, / return true; } } - if (i < nStringsCnt && !ScanEndString( sStrArray[i], pFormat )) + if (i < nStringsCnt && !ScanEndString( sStrArray[i] )) { return false; } @@ -3168,18 +3204,18 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, / // nStringsCnt >= 3 if (!GetNextNumber(i,j)) // i=1,0 { // Analyze start string - if (!ScanStartString( sStrArray[i], pFormat )) + if (!ScanStartString( sStrArray[i] )) return false; // already an error i++; // i=1 } GetNextNumber(i,j); // i=1,2 - if ( !ScanMidString( sStrArray[i], i, pFormat ) ) + if ( !ScanMidString( sStrArray[i], i ) ) { return false; } i++; // next symbol, i=2,3 GetNextNumber(i,j); // i=3,4 - if (i < nStringsCnt && !ScanEndString( sStrArray[i], pFormat )) + if (i < nStringsCnt && !ScanEndString( sStrArray[i] )) { return false; } @@ -3200,7 +3236,7 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, / // nStringsCnt >= 5 if (!GetNextNumber(i,j)) // i=1,0 { // Analyze start string - if (!ScanStartString( sStrArray[i], pFormat )) + if (!ScanStartString( sStrArray[i] )) { return false; // already an error } @@ -3211,7 +3247,7 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, / } } GetNextNumber(i,j); // i=1,2 - if ( !ScanMidString( sStrArray[i], i, pFormat ) ) + if ( !ScanMidString( sStrArray[i], i ) ) { return false; } @@ -3221,13 +3257,13 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, / return false; } GetNextNumber(i,j); // i=3,4 - if ( !ScanMidString( sStrArray[i], i, pFormat ) ) + if ( !ScanMidString( sStrArray[i], i ) ) { return false; } i++; // i=4,5 GetNextNumber(i,j); // i=5,6 - if (i < nStringsCnt && !ScanEndString( sStrArray[i], pFormat )) + if (i < nStringsCnt && !ScanEndString( sStrArray[i] )) { return false; } @@ -3252,14 +3288,14 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, / // nStringsCnt >= 7 if (!GetNextNumber(i,j)) // i=1,0 { // Analyze startstring - if (!ScanStartString( sStrArray[i], pFormat )) + if (!ScanStartString( sStrArray[i] )) return false; // already an error i++; // i=1 if (nDecPos == 1) // decimal separator at start => error return false; } GetNextNumber(i,j); // i=1,2 - if ( !ScanMidString( sStrArray[i], i, pFormat ) ) + if ( !ScanMidString( sStrArray[i], i ) ) { return false; } @@ -3275,7 +3311,7 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, / return false; } GetNextNumber(i,j); - if ( i < nStringsCnt && !ScanMidString( sStrArray[i], i, pFormat ) ) + if ( i < nStringsCnt && !ScanMidString( sStrArray[i], i ) ) { return false; } @@ -3293,7 +3329,7 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, / return false; } GetNextNumber(i,j); - if ( i < nStringsCnt && !ScanMidString( sStrArray[i], i, pFormat ) ) + if ( i < nStringsCnt && !ScanMidString( sStrArray[i], i ) ) { return false; } @@ -3301,7 +3337,7 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, / } } GetNextNumber(i,j); - if (i < nStringsCnt && !ScanEndString( sStrArray[i], pFormat )) + if (i < nStringsCnt && !ScanEndString( sStrArray[i] )) { return false; } @@ -3331,7 +3367,7 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, / bool bDidMatch = (nMatchedAllStrings != 0); if ( nMatchedAllStrings ) { - bool bMatch = pFormat && pFormat->IsNumForStringElementCountEqual( + bool bMatch = mpFormat && mpFormat->IsNumForStringElementCountEqual( nStringScanNumFor, nStringsCnt, nNumericsCnt ); if ( !bMatch ) { @@ -3344,8 +3380,8 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, / // overall format because of mixed type subformats. Use the scan // matched subformat's type if any. SvNumFormatType eForType = eSetType; - if ((eForType == SvNumFormatType::UNDEFINED || eForType == SvNumFormatType::DEFINED) && pFormat) - eForType = pFormat->GetNumForInfoScannedType( nStringScanNumFor); + if ((eForType == SvNumFormatType::UNDEFINED || eForType == SvNumFormatType::DEFINED) && mpFormat) + eForType = mpFormat->GetNumForInfoScannedType( nStringScanNumFor); if (eForType != SvNumFormatType::UNDEFINED && eForType != SvNumFormatType::DEFINED) eScannedType = eForType; else @@ -3368,7 +3404,7 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, / bool bWasReturn = ((nMatchedAllStrings & nMatchedUsedAsReturn) != 0); if ( nMatchedAllStrings ) { - bool bMatch = pFormat && pFormat->IsNumForStringElementCountEqual( + bool bMatch = mpFormat && mpFormat->IsNumForStringElementCountEqual( nStringScanNumFor, nStringsCnt, nNumericsCnt ); if ( !bMatch ) { @@ -3382,8 +3418,8 @@ bool ImpSvNumberInputScan::IsNumberFormatMain( const OUString& rString, / // the scanned type in this case. Otherwise in IsNumberFormat() the // first numeric particle would be accepted as number. SvNumFormatType eForType = eSetType; - if ((eForType == SvNumFormatType::UNDEFINED || eForType == SvNumFormatType::DEFINED) && pFormat) - eForType = pFormat->GetNumForInfoScannedType( nStringScanNumFor); + if ((eForType == SvNumFormatType::UNDEFINED || eForType == SvNumFormatType::DEFINED) && mpFormat) + eForType = mpFormat->GetNumForInfoScannedType( nStringScanNumFor); if (eForType != SvNumFormatType::UNDEFINED && eForType != SvNumFormatType::DEFINED) eScannedType = eForType; } @@ -3691,7 +3727,7 @@ bool ImpSvNumberInputScan::IsNumberFormat( const OUString& rString, // s // not. The count of numbers in pattern must match the // count of numbers in input. res = (GetDatePatternNumbers() == nNumericsCnt) - || IsAcceptableIso8601( pFormat) || nMatchedAllStrings; + || IsAcceptableIso8601() || nMatchedAllStrings; } } break; @@ -3947,11 +3983,11 @@ bool ImpSvNumberInputScan::IsNumberFormat( const OUString& rString, // s break; case SvNumFormatType::DATE: - res = GetDateRef( fOutNumber, k, pFormat ); + res = GetDateRef( fOutNumber, k ); break; case SvNumFormatType::DATETIME: - res = GetDateRef( fOutNumber, k, pFormat ); + res = GetDateRef( fOutNumber, k ); if ( res ) { double fTime; diff --git a/svl/source/numbers/zforfind.hxx b/svl/source/numbers/zforfind.hxx index 17b14edb4c2d..e7ddb7e6f1d9 100644 --- a/svl/source/numbers/zforfind.hxx +++ b/svl/source/numbers/zforfind.hxx @@ -70,6 +70,7 @@ public: private: SvNumberFormatter* pFormatter; + const SvNumberformat* mpFormat; //* The format to compare against, if any std::unique_ptr<OUString[]> pUpperMonthText; //* Array of month names, uppercase std::unique_ptr<OUString[]> pUpperAbbrevMonthText; //* Array of month names, abbreviated, uppercase std::unique_ptr<OUString[]> pUpperGenitiveMonthText; //* Array of genitive month names, uppercase @@ -283,8 +284,7 @@ private: // Get currency symbol and advance string position bool GetCurrency( const OUString& rString, - sal_Int32& nPos, - const SvNumberformat* pFormat ); // number format to match against + sal_Int32& nPos ); // Get symbol AM or PM and advance string position bool GetTimeAmPm( const OUString& rString, @@ -324,28 +324,23 @@ private: // Conversion of date to number bool GetDateRef( double& fDays, // OUT: days diff to null date - sal_uInt16& nCounter, // Count of date substrings - const SvNumberformat* pFormat ); // number format to match against + sal_uInt16& nCounter ); // Count of date substrings // Analyze start of string - bool ScanStartString( const OUString& rString, - const SvNumberformat* pFormat ); + bool ScanStartString( const OUString& rString ); // Analyze middle substring bool ScanMidString( const OUString& rString, - sal_uInt16 nStringPos, - const SvNumberformat* pFormat ); + sal_uInt16 nStringPos ); // Analyze end of string - bool ScanEndString( const OUString& rString, - const SvNumberformat* pFormat ); + bool ScanEndString( const OUString& rString ); // Compare rString to substring of array indexed by nString // nString == 0xFFFF => last substring bool ScanStringNumFor( const OUString& rString, sal_Int32 nPos, - const SvNumberformat* pFormat, sal_uInt16 nString, bool bDontDetectNegation = false ); @@ -420,7 +415,7 @@ private: /** Whether input is acceptable as ISO 8601 date format in the current NfEvalDateFormat setting. */ - bool IsAcceptableIso8601( const SvNumberformat* pFormat ); + bool IsAcceptableIso8601(); }; #endif // INCLUDED_SVL_SOURCE_NUMBERS_ZFORFIND_HXX |