summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--svl/source/numbers/zforscan.cxx42
-rw-r--r--svl/source/numbers/zforscan.hxx11
2 files changed, 41 insertions, 12 deletions
diff --git a/svl/source/numbers/zforscan.cxx b/svl/source/numbers/zforscan.cxx
index da88794a40cf..0b2fe7ecca28 100644
--- a/svl/source/numbers/zforscan.cxx
+++ b/svl/source/numbers/zforscan.cxx
@@ -680,17 +680,21 @@ Color* ImpSvNumberformatScan::GetColor(OUString& sStr)
return pResult;
}
-short ImpSvNumberformatScan::GetKeyWord( const OUString& sSymbol, sal_Int32 nPos ) const
+short ImpSvNumberformatScan::GetKeyWord( const OUString& sSymbol, sal_Int32 nPos, bool& rbFoundEnglish ) const
{
OUString sString = pFormatter->GetCharClass()->uppercase( sSymbol, nPos, sSymbol.getLength() - nPos );
const NfKeywordTable & rKeyword = GetKeywords();
// #77026# for the Xcl perverts: the GENERAL keyword is recognized anywhere
- if ( sString.startsWith( rKeyword[NF_KEY_GENERAL] ) ||
- ((meKeywordLocalization == KeywordLocalization::AllowEnglish) &&
- sString.startsWith( sEnglishKeyword[NF_KEY_GENERAL])))
+ if (sString.startsWith( rKeyword[NF_KEY_GENERAL] ))
{
return NF_KEY_GENERAL;
}
+ if ((meKeywordLocalization == KeywordLocalization::AllowEnglish) &&
+ sString.startsWith( sEnglishKeyword[NF_KEY_GENERAL]))
+ {
+ rbFoundEnglish = true;
+ return NF_KEY_GENERAL;
+ }
//! MUST be a reverse search to find longer strings first
short i = NF_KEYWORD_ENTRIES_COUNT-1;
bool bFound = false;
@@ -746,6 +750,7 @@ short ImpSvNumberformatScan::GetKeyWord( const OUString& sSymbol, sal_Int32 nPos
}
if ( j && sEnglishKeyword[j].getLength() > sEnglishKeyword[i].getLength() )
{
+ rbFoundEnglish = true;
return j;
}
}
@@ -911,7 +916,8 @@ short ImpSvNumberformatScan::Next_Symbol( const OUString& rStr,
}
else if ( pChrCls->isLetter( rStr, nPos-1 ) )
{
- short nTmpType = GetKeyWord( rStr, nPos-1 );
+ bool bFoundEnglish = false;
+ short nTmpType = GetKeyWord( rStr, nPos-1, bFoundEnglish);
if ( nTmpType )
{
bool bCurrency = false;
@@ -919,7 +925,7 @@ short ImpSvNumberformatScan::Next_Symbol( const OUString& rStr,
// like "R" (Rand) and 'R' (era)
if ( nCurrPos >= 0 &&
nPos-1 + sCurString.getLength() <= rStr.getLength() &&
- sCurString.startsWith( sKeyword[nTmpType] ) )
+ sCurString.startsWith( bFoundEnglish ? sEnglishKeyword[nTmpType] : sKeyword[nTmpType]))
{
OUString aTest = pChrCls->uppercase( rStr.copy( nPos-1, sCurString.getLength() ) );
if ( aTest == sCurString )
@@ -935,8 +941,22 @@ short ImpSvNumberformatScan::Next_Symbol( const OUString& rStr,
else
{
eType = nTmpType;
- sal_Int32 nLen = sKeyword[eType].getLength();
- sSymbol = rStr.copy( nPos-1, nLen );
+ // The code to be advanced is the detected keyword,
+ // not necessarily the locale's keyword, but the
+ // symbol is to be the locale's keyword.
+ sal_Int32 nLen;
+ if (bFoundEnglish)
+ {
+ nLen = sEnglishKeyword[eType].getLength();
+ // Use the locale's General keyword name, not uppercase.
+ sSymbol = (eType == NF_KEY_GENERAL ? sNameStandardFormat : sKeyword[eType]);
+ }
+ else
+ {
+ nLen = sKeyword[eType].getLength();
+ // Preserve a locale's keyword's case as entered.
+ sSymbol = rStr.copy( nPos-1, nLen);
+ }
if ((eType == NF_KEY_E || IsAmbiguousE(eType)) && nPos < rStr.getLength())
{
sal_Unicode cNext = rStr[nPos];
@@ -988,7 +1008,8 @@ short ImpSvNumberformatScan::Next_Symbol( const OUString& rStr,
case SsGetWord:
if ( pChrCls->isLetter( rStr, nPos-1 ) )
{
- short nTmpType = GetKeyWord( rStr, nPos-1 );
+ bool bFoundEnglish = false;
+ short nTmpType = GetKeyWord( rStr, nPos-1, bFoundEnglish);
if ( nTmpType )
{
// beginning of keyword, stop scan and put back
@@ -3083,7 +3104,8 @@ sal_Int32 ImpSvNumberformatScan::FinalScan( OUString& rString )
sal_Int32 nLen = rStr.getLength();
for ( sal_Int32 j = 0; j < nLen; j++ )
{
- if ( (j == 0 || rStr[j - 1] != '\\') && GetKeyWord( rStr, j ) )
+ bool bFoundEnglish = false;
+ if ( (j == 0 || rStr[j - 1] != '\\') && GetKeyWord( rStr, j, bFoundEnglish) )
{
rStr = "\"" + rStr + "\"";
break; // for
diff --git a/svl/source/numbers/zforscan.hxx b/svl/source/numbers/zforscan.hxx
index 79bc6e7512d1..8ef0e0a7c80f 100644
--- a/svl/source/numbers/zforscan.hxx
+++ b/svl/source/numbers/zforscan.hxx
@@ -245,8 +245,15 @@ private: // Private section
short PreviousType( sal_uInt16 i ) const; // Returns type before position skips EMPTY
bool IsLastBlankBeforeFrac(sal_uInt16 i) const; // True <=> there won't be a ' ' until the '/'
void Reset(); // Reset all variables before starting the analysis
- short GetKeyWord( const OUString& sSymbol, // Determine keyword at nPos
- sal_Int32 nPos ) const; // Return 0 <=> not found
+
+ /** Determine keyword at nPos.
+ @param rbFoundEnglish set if English instead of locale's keyword
+ found, never cleared, thus init with false.
+ @return 0 if not found, else keyword enumeration.
+ */
+ short GetKeyWord( const OUString& sSymbol,
+ sal_Int32 nPos,
+ bool& rbFoundEnglish ) const;
bool IsAmbiguousE( short nKey ) const // whether nKey is ambiguous E of NF_KEY_E/NF_KEY_EC
{