Kaydet (Commit) c22f9f0e authored tarafından Eike Rathke's avatar Eike Rathke

introduce LocaleDataWrapper::doesSecondaryCalendarUseEC()

Preparing to replace the number format import hack of
95c91f09 and generalizing for known locales.

Change-Id: I0413987e302eaa84ef6a7dde2ecb365144313e81
üst 1e0b7b7e
......@@ -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
......
......@@ -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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment