diff options
Diffstat (limited to 'unotools/inc/unotools/localedatawrapper.hxx')
-rw-r--r-- | unotools/inc/unotools/localedatawrapper.hxx | 363 |
1 files changed, 363 insertions, 0 deletions
diff --git a/unotools/inc/unotools/localedatawrapper.hxx b/unotools/inc/unotools/localedatawrapper.hxx new file mode 100644 index 000000000000..fd09b07e58cb --- /dev/null +++ b/unotools/inc/unotools/localedatawrapper.hxx @@ -0,0 +1,363 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _UNOTOOLS_LOCALEDATAWRAPPER_HXX +#define _UNOTOOLS_LOCALEDATAWRAPPER_HXX + +#include <tools/string.hxx> +#include <com/sun/star/i18n/XLocaleData2.hpp> +#include <com/sun/star/i18n/LocaleItem.hpp> +#include <com/sun/star/i18n/reservedWords.hpp> +#include <unotools/readwritemutexguard.hxx> +#include "unotools/unotoolsdllapi.h" + +#ifndef BOOST_SHARED_PTR_HPP_INCLUDED +#include <boost/shared_ptr.hpp> +#endif + + +namespace com { namespace sun { namespace star { + namespace lang { + class XMultiServiceFactory; + } +}}} +class Date; +class Time; +class CalendarWrapper; + + +enum DateFormat { + MDY, + DMY, + YMD +}; + + +enum MeasurementSystem { + MEASURE_METRIC, + MEASURE_US +}; + + +class UNOTOOLS_DLLPUBLIC LocaleDataWrapper +{ + static BYTE nLocaleDataChecking; // 0:=dontknow, 1:=yes, 2:=no + + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xSMgr; + ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XLocaleData2 > xLD; + ::com::sun::star::lang::Locale aLocale; + ::boost::shared_ptr< ::com::sun::star::i18n::Calendar > xDefaultCalendar; + ::com::sun::star::i18n::LocaleDataItem aLocaleDataItem; + ::com::sun::star::uno::Sequence< ::rtl::OUString > aReservedWordSeq; + ::com::sun::star::uno::Sequence< sal_Int32 > aGrouping; + // cached items + String aLocaleItem[::com::sun::star::i18n::LocaleItem::COUNT]; + String aReservedWord[::com::sun::star::i18n::reservedWords::COUNT]; + String aCurrSymbol; + String aCurrBankSymbol; + int nDateFormat; + int nLongDateFormat; + USHORT nCurrPositiveFormat; + USHORT nCurrNegativeFormat; + USHORT nCurrDigits; + BOOL bLocaleDataItemValid; + BOOL bReservedWordValid; + mutable ::utl::ReadWriteMutex aMutex; + + // dummies, to be implemented or provided by XML locale data + sal_Unicode cCurrZeroChar; + + + // not implemented, prevent usage + LocaleDataWrapper( const LocaleDataWrapper& ); + LocaleDataWrapper& operator=( const LocaleDataWrapper& ); + + // whenever Locale changes + void invalidateData(); + + void getOneLocaleItemImpl( sal_Int16 nItem ); + const String& getOneLocaleItem( sal_Int16 nItem ) const; + + void getOneReservedWordImpl( sal_Int16 nWord ); + const String& getOneReservedWord( sal_Int16 nWord ) const; + + void getCurrSymbolsImpl(); + void getCurrFormatsImpl(); + + void scanCurrFormatImpl( const String& rCode, + xub_StrLen nStart, xub_StrLen& nSign, + xub_StrLen& nPar, xub_StrLen& nNum, + xub_StrLen& nBlank, xub_StrLen& nSym ); + + void getDateFormatsImpl(); + DateFormat scanDateFormatImpl( const String& rCode ); + + void getDefaultCalendarImpl(); + + sal_Unicode* ImplAddFormatNum( sal_Unicode* pBuf, + sal_Int64 nNumber, USHORT nDecimals, + BOOL bUseThousandSep, BOOL bTrailingZeros ) const; + + void getDigitGroupingImpl(); + +public: + LocaleDataWrapper( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & xSF, + const ::com::sun::star::lang::Locale& rLocale + ); + ~LocaleDataWrapper(); + + /** Get the service factory, meant to be able to create a CalendarWrapper + from a LocaleDataWrapper. Note that the service factory may be + non-existent if this LocaleDataWrapper was created without one and + lives "on the grassland". The CalendarWrapper ctor can handle that + though. */ + const ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XMultiServiceFactory > & getServiceFactory() + const { return xSMgr; } + + /// set a new Locale to request + void setLocale( const ::com::sun::star::lang::Locale& rLocale ); + + /// get current requested Locale + const ::com::sun::star::lang::Locale& getLocale() const; + + /// get current loaded Locale, which might differ from the requested Locale + ::com::sun::star::lang::Locale getLoadedLocale() const; + + + // Wrapper implementations of service LocaleData + + ::com::sun::star::i18n::LanguageCountryInfo getLanguageCountryInfo() const; + ::com::sun::star::i18n::LocaleDataItem getLocaleItem() const; + ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::Calendar > getAllCalendars() const; + /// NOTE: this wraps XLocaleData2::getAllCurrencies2() in fact. + ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::Currency2 > getAllCurrencies() const; + ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::FormatElement > getAllFormats() const; + ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::Implementation > getCollatorImplementations() const; + ::com::sun::star::uno::Sequence< ::rtl::OUString > getTransliterations() const; + ::com::sun::star::i18n::ForbiddenCharacters getForbiddenCharacters() const; + ::com::sun::star::uno::Sequence< ::rtl::OUString > getReservedWord() const; + ::com::sun::star::uno::Sequence< ::com::sun::star::lang::Locale > getAllInstalledLocaleNames() const; + + /// same as the wrapper implementation but static + static ::com::sun::star::uno::Sequence< ::com::sun::star::lang::Locale > getInstalledLocaleNames(); + + /** Get LanguageTypes for all installed locales which are unambiguous + convertible back and forth between locale ISO strings and MS-LCID + LanguageType. Upon the first time the function is called when + locale data checking is enabled, messages are shown for locales not + matching, excluding already known problems. + (e.g. used in number formatter dialog init) + */ + static ::com::sun::star::uno::Sequence< sal_uInt16 > getInstalledLanguageTypes(); + + /// maps the LocaleData string to the International enum + MeasurementSystem mapMeasurementStringToEnum( const String& rMS ) const; + + /// Convenience method to obtain the default calendar. + const ::boost::shared_ptr< ::com::sun::star::i18n::Calendar > getDefaultCalendar() const; + + /// Convenience method to obtain the day names of the default calendar. + const ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::CalendarItem > getDefaultCalendarDays() const; + + /// Convenience method to obtain the month names of the default calendar. + const ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::CalendarItem > getDefaultCalendarMonths() 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 + integer sequence returned here specifies grouping from right to left + (!), with a 0 entry designating the end of rules and the previous value + to be repeated indefinitely. Hence the sequence {3,0} specifies the + usual grouping by thousands, whereas the sequence {3,2,0} specifies + Indian grouping. The sal_Int32* getConstArray() can be passed directly + to the ::rtl::math::doubleToString() methods as argument for the + pGroups parameter. */ + const ::com::sun::star::uno::Sequence< sal_Int32 > getDigitGrouping() const; + + // Functionality of class International methods, LocaleItem + + inline const String& getDateSep() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::DATE_SEPARATOR ); } + inline const String& getNumThousandSep() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::THOUSAND_SEPARATOR ); } + inline const String& getNumDecimalSep() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::DECIMAL_SEPARATOR ); } + inline const String& getTimeSep() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::TIME_SEPARATOR ); } + inline const String& getTime100SecSep() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::TIME_100SEC_SEPARATOR ); } + inline const String& getListSep() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::LIST_SEPARATOR ); } + inline const String& getQuotationMarkStart() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::SINGLE_QUOTATION_START ); } + inline const String& getQuotationMarkEnd() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::SINGLE_QUOTATION_END ); } + inline const String& getDoubleQuotationMarkStart() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::DOUBLE_QUOTATION_START ); } + inline const String& getDoubleQuotationMarkEnd() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::DOUBLE_QUOTATION_END ); } + inline const String& getMeasurementSystem() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::MEASUREMENT_SYSTEM ); } + inline MeasurementSystem getMeasurementSystemEnum() const + { return mapMeasurementStringToEnum( getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::MEASUREMENT_SYSTEM ) ); } + inline const String& getTimeAM() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::TIME_AM ); } + inline const String& getTimePM() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::TIME_PM ); } + inline const String& getLongDateDayOfWeekSep() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::LONG_DATE_DAY_OF_WEEK_SEPARATOR ); } + inline const String& getLongDateDaySep() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::LONG_DATE_DAY_SEPARATOR ); } + inline const String& getLongDateMonthSep() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::LONG_DATE_MONTH_SEPARATOR ); } + inline const String& getLongDateYearSep() const + { return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::LONG_DATE_YEAR_SEPARATOR ); } + + // currency + const String& getCurrSymbol() const; + const String& getCurrBankSymbol() const; + USHORT getCurrPositiveFormat() const; + USHORT getCurrNegativeFormat() const; + USHORT getCurrDigits() const; + + // simple date and time formatting + DateFormat getDateFormat() const; + DateFormat getLongDateFormat() const; + /// only numerical values of Gregorian calendar + String getDate( const Date& rDate ) const; + String getTime( const Time& rTime, BOOL bSec = TRUE, + BOOL b100Sec = FALSE ) const; + String getDuration( const Time& rTime, + BOOL bSec = TRUE, BOOL b100Sec = FALSE ) const; + + /** The CalendarWrapper already <b>MUST</b> + have loaded a calendar. + @param nDisplayDayOfWeek + 0 := abbreviated name + 1 := full name + @param bDayOfMonthWithLeadingZero + <FALSE/> := without leading zero + <TRUE/> := with leading zero if <10 + @param nDisplayMonth + 0 := abbreviated name + 1 := full name + @param bTwoDigitYear + <FALSE/> := full year + <TRUE/> := year % 100 + */ + String getLongDate( const Date& rDate, + CalendarWrapper& rCal, + sal_Int16 nDisplayDayOfWeek = 1, + sal_Bool bDayOfMonthWithLeadingZero = sal_False, + sal_Int16 nDisplayMonth = 1, + sal_Bool bTwoDigitYear = sal_False + ) const; + + /** Simple number formatting + @param nNumber + value * 10**nDecimals + @param bTrailingZeros + </TRUE> := always display trailing zeros in + decimal places, even if integer value. + </FALSE> := trailing zeros are only displayed + if the value is not an integer value. + */ + String getNum( sal_Int64 nNumber, USHORT nDecimals, + BOOL bUseThousandSep = TRUE, + BOOL bTrailingZeros = TRUE ) const; + + /// "Secure" currency formatted string. + String getCurr( sal_Int64 nNumber, USHORT nDecimals, + const String& rCurrencySymbol, + BOOL bUseThousandSep = TRUE ) const; + /** Default currency formatted string, use with + care as default currency may change in any + locale, for example, DEM -> EUR */ + String getCurr( sal_Int64 nNumber, USHORT nDecimals, + BOOL bUseThousandSep = TRUE ) const + { return getCurr( nNumber, nDecimals, + getCurrSymbol(), bUseThousandSep ); } + + // dummy returns, to be implemented + inline sal_Unicode getCurrZeroChar() const + { return cCurrZeroChar; } + inline BOOL isNumLeadingZero() const + { return TRUE; } + /// standard decimal places + inline USHORT getNumDigits() const + { return 2; } + inline BOOL isNumTrailingZeros() const + { return TRUE; } + + + // reserved words + + inline const String& getTrueWord() const + { return getOneReservedWord( ::com::sun::star::i18n::reservedWords::TRUE_WORD ); } + inline const String& getFalseWord() const + { return getOneReservedWord( ::com::sun::star::i18n::reservedWords::FALSE_WORD ); } + /// return a quarter string matching nQuarter (0..3) => "1st quarter" .. "4th quarter" + inline const String& getQuarterWord( sal_Int16 nQuarter ) const + { return getOneReservedWord( ::com::sun::star::i18n::reservedWords::QUARTER1_WORD + nQuarter ); } + inline const String& getAboveWord() const + { return getOneReservedWord( ::com::sun::star::i18n::reservedWords::ABOVE_WORD ); } + inline const String& getBelowWord() const + { return getOneReservedWord( ::com::sun::star::i18n::reservedWords::BELOW_WORD ); } + /// return a quarter abbreviation string matching nQuarter (0..3) => "Q1" .. "Q2" + inline const String& getQuarterAbbreviation( sal_Int16 nQuarter ) const + { return getOneReservedWord( ::com::sun::star::i18n::reservedWords::QUARTER1_ABBREVIATION + nQuarter ); } + + /** Return whether locale data checks are enabled. + Checks are enabled if the environment variable + OOO_ENABLE_LOCALE_DATA_CHECKS is set to 'Y' or 'Yes' (or any other + string starting with 'Y') or '1'. + Also used in conjunction with the number formatter. */ + static inline bool areChecksEnabled() + { + if (nLocaleDataChecking == 0) + evaluateLocaleDataChecking(); + return nLocaleDataChecking == 1; + } + + /** Append locale info to string, used with locale data checking. + A string similar to "de_DE requested\n en_US loaded" is appended. */ + String& appendLocaleInfo( String& rDebugMsg ) const; + + /** Ouput a message during locale data checking. The (UTF-8) string is + written to stderr and in a non-product build or if DBG_UTIL is enabled + also raised as an assertion message box. */ + static void outputCheckMessage( const String& rMsg ); + static void outputCheckMessage( const char* pStr); + +private: + static void evaluateLocaleDataChecking(); +}; + + +#endif // _UNOTOOLS_LOCALEDATAWRAPPER_HXX |