[Libreoffice-commits] .: svl/inc svl/source
Eike Rathke
erack at kemper.freedesktop.org
Thu Dec 22 10:04:39 PST 2011
svl/inc/svl/zforlist.hxx | 3 +
svl/inc/svl/zformat.hxx | 20 +++++++++--
svl/source/numbers/zforlist.cxx | 8 ++--
svl/source/numbers/zformat.cxx | 68 ++++++++++++++++++++++++++++++++++++++++
4 files changed, 91 insertions(+), 8 deletions(-)
New commits:
commit b0aaaeb7bda525b154bf643e8fa19ead9d22b95d
Author: Eike Rathke <erack at redhat.com>
Date: Thu Dec 22 18:59:41 2011 +0100
recognize arbitrary y-m-d format for editing as ISO 8601 yyyy-mm-dd
diff --git a/svl/inc/svl/zforlist.hxx b/svl/inc/svl/zforlist.hxx
index ffae629..627284a 100644
--- a/svl/inc/svl/zforlist.hxx
+++ b/svl/inc/svl/zforlist.hxx
@@ -596,7 +596,8 @@ public:
bool IsSpecialStandardFormat( sal_uInt32 nFIndex, LanguageType eLnge );
/** Return the corresponding edit format of a format. */
- sal_uInt32 GetEditFormat( double fNumber, sal_uInt32 nFIndex, short eType, LanguageType eLnge );
+ sal_uInt32 GetEditFormat( double fNumber, sal_uInt32 nFIndex, short eType,
+ LanguageType eLnge, SvNumberformat* pFormat );
/// Return the reference date
Date* GetNullDate();
diff --git a/svl/inc/svl/zformat.hxx b/svl/inc/svl/zformat.hxx
index 659b930..2633128 100644
--- a/svl/inc/svl/zformat.hxx
+++ b/svl/inc/svl/zformat.hxx
@@ -456,6 +456,15 @@ public:
return false;
}
#endif
+
+ /// Whether it's a (YY)YY-M(M)-D(D) format.
+ bool IsIso8601( sal_uInt16 nNumFor )
+ {
+ if ( nNumFor < 4 )
+ return ImpIsIso8601( NumFor[nNumFor]);
+ return false;
+ }
+
private:
ImpSvNumFor NumFor[4]; // Array for the 4 subformats
String sFormatstring; // The format code string
@@ -476,6 +485,11 @@ private:
SVL_DLLPRIVATE bool ImpIsOtherCalendar( const ImpSvNumFor& rNumFor ) const;
+#ifdef THE_FUTURE
+ SVL_DLLPRIVATE bool ImpSwitchToSpecifiedCalendar( String& rOrgCalendar,
+ double& fOrgDateTime, const ImpSvNumFor& rNumFor ) const;
+#endif
+
/** Whether to use possessive genitive case month name, or partitive case
month name, instead of nominative name (noun).
@@ -496,10 +510,8 @@ private:
*/
SVL_DLLPRIVATE sal_Int32 ImpUseMonthCase( int & io_nState, const ImpSvNumFor& rNumFor, NfKeywordIndex eCodeType ) const;
-#ifdef THE_FUTURE
- SVL_DLLPRIVATE bool ImpSwitchToSpecifiedCalendar( String& rOrgCalendar,
- double& fOrgDateTime, const ImpSvNumFor& rNumFor ) const;
-#endif
+ /// Whether it's a (YY)YY-M(M)-D(D) format.
+ SVL_DLLPRIVATE bool ImpIsIso8601( const ImpSvNumFor& rNumFor );
#ifdef _ZFORMAT_CXX // ----- private implementation methods -----
diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx
index 295a618..b248413 100644
--- a/svl/source/numbers/zforlist.cxx
+++ b/svl/source/numbers/zforlist.cxx
@@ -1437,7 +1437,8 @@ sal_uInt32 SvNumberFormatter::GetStandardFormat( double fNumber, sal_uInt32 nFIn
}
}
-sal_uInt32 SvNumberFormatter::GetEditFormat( double fNumber, sal_uInt32 nFIndex, short eType, LanguageType eLang )
+sal_uInt32 SvNumberFormatter::GetEditFormat( double fNumber, sal_uInt32 nFIndex,
+ short eType, LanguageType eLang, SvNumberformat* pFormat )
{
sal_uInt32 nKey = nFIndex;
switch ( eType )
@@ -1456,7 +1457,8 @@ sal_uInt32 SvNumberFormatter::GetEditFormat( double fNumber, sal_uInt32 nFIndex,
// Preserve ISO 8601 format.
if ( nFIndex == GetFormatIndex( NF_DATE_DIN_YYYYMMDD, eLang) ||
nFIndex == GetFormatIndex( NF_DATE_DIN_YYMMDD, eLang) ||
- nFIndex == GetFormatIndex( NF_DATE_DIN_MMDD, eLang))
+ nFIndex == GetFormatIndex( NF_DATE_DIN_MMDD, eLang) ||
+ (pFormat && pFormat->IsIso8601( 0 )))
nKey = GetFormatIndex( NF_DATE_DIN_YYYYMMDD, eLang);
else
nKey = GetFormatIndex( NF_DATE_SYS_DDMMYYYY, eLang );
@@ -1517,7 +1519,7 @@ void SvNumberFormatter::GetInputLineString(const double& fOutNumber,
ChangeStandardPrec(INPUTSTRING_PRECISION);
bPrecChanged = true;
}
- sal_uInt32 nKey = GetEditFormat( fOutNumber, nFIndex, eType, eLang);
+ sal_uInt32 nKey = GetEditFormat( fOutNumber, nFIndex, eType, eLang, pFormat);
if ( nKey != nFIndex )
pFormat = (SvNumberformat*) aFTable.Get( nKey );
if (pFormat)
diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx
index 0414185..9252df0 100644
--- a/svl/source/numbers/zformat.cxx
+++ b/svl/source/numbers/zformat.cxx
@@ -3195,6 +3195,74 @@ void SvNumberformat::ImpAppendEraG( String& OutString,
OutString += rCal.getDisplayString( CalendarDisplayCode::SHORT_ERA, nNatNum );
}
+bool SvNumberformat::ImpIsIso8601( const ImpSvNumFor& rNumFor )
+{
+ bool bIsIso = false;
+ if ((eType & NUMBERFORMAT_DATE) == NUMBERFORMAT_DATE)
+ {
+ enum State
+ {
+ eNone,
+ eAtYear,
+ eAtSep1,
+ eAtMonth,
+ eAtSep2,
+ eNotIso
+ };
+ State eState = eNone;
+ short const * const pType = rNumFor.Info().nTypeArray;
+ sal_uInt16 nAnz = rNumFor.GetCount();
+ for (sal_uInt16 i=0; i < nAnz && !bIsIso && eState != eNotIso; ++i)
+ {
+ switch ( pType[i] )
+ {
+ case NF_KEY_YY: // two digits not strictly ISO 8601
+ case NF_KEY_YYYY:
+ if (eState != eNone)
+ eState = eNotIso;
+ else
+ eState = eAtYear;
+ break;
+ case NF_KEY_M: // single digit not strictly ISO 8601
+ case NF_KEY_MM:
+ if (eState != eAtSep1)
+ eState = eNotIso;
+ else
+ eState = eAtMonth;
+ break;
+ case NF_KEY_D: // single digit not strictly ISO 8601
+ case NF_KEY_DD:
+ if (eState != eAtSep2)
+ eState = eNotIso;
+ else
+ bIsIso = true;
+ break;
+ case NF_SYMBOLTYPE_STRING:
+ case NF_SYMBOLTYPE_DATESEP:
+ if (rNumFor.Info().sStrArray[i] == '-')
+ {
+ if (eState == eAtYear)
+ eState = eAtSep1;
+ else if (eState == eAtMonth)
+ eState = eAtSep2;
+ else
+ eState = eNotIso;
+ }
+ else
+ eState = eNotIso;
+ break;
+ default:
+ eState = eNotIso;
+ }
+ }
+ }
+ else
+ {
+ OSL_FAIL( "SvNumberformat::ImpIsIso8601: no date" );
+ }
+ return bIsIso;
+}
+
bool SvNumberformat::ImpGetDateOutput(double fNumber,
sal_uInt16 nIx,
String& OutString)
More information about the Libreoffice-commits
mailing list