summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2016-09-13 12:43:05 +0200
committerEike Rathke <erack@redhat.com>2016-09-13 12:54:41 +0200
commitc22f9f0e00f26015f8019193c0db2fbb895b2cdc (patch)
tree9e08c7727255f8c9dcf63d139ad9f6fc22287249
parent1e0b7b7e4b95e896e32d49a2fed7a5760e509f36 (diff)
introduce LocaleDataWrapper::doesSecondaryCalendarUseEC()
Preparing to replace the number format import hack of 95c91f098e8974c41c8d403a351fe53db6822165 and generalizing for known locales. Change-Id: I0413987e302eaa84ef6a7dde2ecb365144313e81
-rw-r--r--include/unotools/localedatawrapper.hxx7
-rw-r--r--unotools/source/i18n/localedatawrapper.cxx61
2 files changed, 66 insertions, 2 deletions
diff --git a/include/unotools/localedatawrapper.hxx b/include/unotools/localedatawrapper.hxx
index 642cd82c0a17..0ea75efcd8d2 100644
--- a/include/unotools/localedatawrapper.hxx
+++ b/include/unotools/localedatawrapper.hxx
@@ -58,6 +58,7 @@ class UNOTOOLS_DLLPUBLIC LocaleDataWrapper
css::uno::Reference< css::i18n::XLocaleData4 > xLD;
LanguageTag maLanguageTag;
std::shared_ptr< css::i18n::Calendar2 > xDefaultCalendar;
+ std::shared_ptr< css::i18n::Calendar2 > xSecondaryCalendar;
css::i18n::LocaleDataItem aLocaleDataItem;
css::uno::Sequence< OUString > aReservedWordSeq;
css::uno::Sequence< OUString > aDateAcceptancePatterns;
@@ -74,6 +75,7 @@ class UNOTOOLS_DLLPUBLIC LocaleDataWrapper
sal_uInt16 nCurrDigits;
bool bLocaleDataItemValid;
bool bReservedWordValid;
+ bool bSecondaryCalendarValid;
mutable ::utl::ReadWriteMutex aMutex;
struct Locale_Compare
{
@@ -105,6 +107,7 @@ class UNOTOOLS_DLLPUBLIC LocaleDataWrapper
DateFormat scanDateFormatImpl( const OUString& rCode );
void getDefaultCalendarImpl();
+ void getSecondaryCalendarImpl();
sal_Unicode* ImplAddFormatNum( sal_Unicode* pBuf,
sal_Int64 nNumber, sal_uInt16 nDecimals,
@@ -183,6 +186,10 @@ public:
/// Convenience method to obtain the month names of the default calendar.
const css::uno::Sequence< css::i18n::CalendarItem2 > getDefaultCalendarMonths() const;
+ /** If the secondary calendar, if any, is of the name passed AND number
+ formats using it usually use the E or EE keyword (EC|EEC). */
+ bool doesSecondaryCalendarUseEC( const OUString& rName ) const;
+
/** Obtain digit grouping. The usually known grouping by thousands (#,###)
is actually only one of possible groupings. Another one, for example,
used in India is group by 3 and then by 2 indefinitely (#,##,###). The
diff --git a/unotools/source/i18n/localedatawrapper.cxx b/unotools/source/i18n/localedatawrapper.cxx
index 1a31ba56755e..1c996c54f9b6 100644
--- a/unotools/source/i18n/localedatawrapper.cxx
+++ b/unotools/source/i18n/localedatawrapper.cxx
@@ -89,7 +89,8 @@ LocaleDataWrapper::LocaleDataWrapper(
xLD( LocaleData::create(rxContext) ),
maLanguageTag( rLanguageTag ),
bLocaleDataItemValid( false ),
- bReservedWordValid( false )
+ bReservedWordValid( false ),
+ bSecondaryCalendarValid( false )
{
invalidateData();
}
@@ -102,7 +103,8 @@ LocaleDataWrapper::LocaleDataWrapper(
xLD( LocaleData::create(m_xContext) ),
maLanguageTag( rLanguageTag ),
bLocaleDataItemValid( false ),
- bReservedWordValid( false )
+ bReservedWordValid( false ),
+ bSecondaryCalendarValid( false )
{
invalidateData();
}
@@ -149,6 +151,8 @@ void LocaleDataWrapper::invalidateData()
bReservedWordValid = false;
}
xDefaultCalendar.reset();
+ xSecondaryCalendar.reset();
+ bSecondaryCalendarValid = false;
if (aGrouping.getLength())
aGrouping[0] = 0;
if (aDateAcceptancePatterns.getLength())
@@ -475,6 +479,59 @@ MeasurementSystem LocaleDataWrapper::mapMeasurementStringToEnum( const OUString&
return MEASURE_US;
}
+void LocaleDataWrapper::getSecondaryCalendarImpl()
+{
+ if (!xSecondaryCalendar && !bSecondaryCalendarValid)
+ {
+ Sequence< Calendar2 > xCals = getAllCalendars();
+ sal_Int32 nCount = xCals.getLength();
+ if (nCount > 1)
+ {
+ sal_Int32 nNonDef = -1;
+ const Calendar2* pArr = xCals.getArray();
+ for (sal_Int32 i=0; i<nCount; ++i)
+ {
+ if (!pArr[i].Default)
+ {
+ nNonDef = i;
+ break;
+ }
+ }
+ if (nNonDef >= 0)
+ xSecondaryCalendar.reset( new Calendar2( xCals[nNonDef]));
+ }
+ bSecondaryCalendarValid = true;
+ }
+}
+
+bool LocaleDataWrapper::doesSecondaryCalendarUseEC( const OUString& rName ) const
+{
+ if (rName.isEmpty())
+ return false;
+
+ ::utl::ReadWriteGuard aGuard( aMutex );
+
+ if (!bSecondaryCalendarValid)
+ { // no cached content
+ aGuard.changeReadToWrite();
+ const_cast<LocaleDataWrapper*>(this)->getSecondaryCalendarImpl();
+ }
+ if (!xSecondaryCalendar)
+ return false;
+ if (!xSecondaryCalendar->Name.equalsIgnoreAsciiCase( rName))
+ return false;
+
+ LanguageTag aLoaded( getLoadedLanguageTag());
+ OUString aBcp47( aLoaded.getBcp47());
+ // So far determine only by locale, we know for a few.
+ /* TODO: check date format codes? or add to locale data? */
+ return
+ aBcp47 == "ja-JP" ||
+ aBcp47 == "lo-LA" ||
+ aBcp47 == "zh-TW"
+ ;
+}
+
void LocaleDataWrapper::getDefaultCalendarImpl()
{
if (!xDefaultCalendar)