1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #ifndef _UNOTOOLS_LOCALEDATAWRAPPER_HXX
25*b1cdbd2cSJim Jagielski #define _UNOTOOLS_LOCALEDATAWRAPPER_HXX
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <tools/string.hxx>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/XLocaleData2.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/LocaleItem.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/reservedWords.hpp>
31*b1cdbd2cSJim Jagielski #include <unotools/readwritemutexguard.hxx>
32*b1cdbd2cSJim Jagielski #include "unotools/unotoolsdllapi.h"
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #ifndef BOOST_SHARED_PTR_HPP_INCLUDED
35*b1cdbd2cSJim Jagielski #include <boost/shared_ptr.hpp>
36*b1cdbd2cSJim Jagielski #endif
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski namespace com { namespace sun { namespace star {
40*b1cdbd2cSJim Jagielski 	namespace lang {
41*b1cdbd2cSJim Jagielski 		class XMultiServiceFactory;
42*b1cdbd2cSJim Jagielski 	}
43*b1cdbd2cSJim Jagielski }}}
44*b1cdbd2cSJim Jagielski class Date;
45*b1cdbd2cSJim Jagielski class Time;
46*b1cdbd2cSJim Jagielski class CalendarWrapper;
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski enum DateFormat {
50*b1cdbd2cSJim Jagielski     MDY,
51*b1cdbd2cSJim Jagielski     DMY,
52*b1cdbd2cSJim Jagielski     YMD
53*b1cdbd2cSJim Jagielski };
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski enum MeasurementSystem {
57*b1cdbd2cSJim Jagielski     MEASURE_METRIC,
58*b1cdbd2cSJim Jagielski     MEASURE_US
59*b1cdbd2cSJim Jagielski };
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski class UNOTOOLS_DLLPUBLIC LocaleDataWrapper
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski     static  sal_uInt8                nLocaleDataChecking;    // 0:=dontknow, 1:=yes, 2:=no
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >    xSMgr;
67*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XLocaleData2 >            xLD;
68*b1cdbd2cSJim Jagielski     ::com::sun::star::lang::Locale                                                      aLocale;
69*b1cdbd2cSJim Jagielski     ::boost::shared_ptr< ::com::sun::star::i18n::Calendar >                             xDefaultCalendar;
70*b1cdbd2cSJim Jagielski     ::com::sun::star::i18n::LocaleDataItem                                              aLocaleDataItem;
71*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Sequence< ::rtl::OUString >                                  aReservedWordSeq;
72*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Sequence< sal_Int32 >                                        aGrouping;
73*b1cdbd2cSJim Jagielski 	// cached items
74*b1cdbd2cSJim Jagielski 	String						aLocaleItem[::com::sun::star::i18n::LocaleItem::COUNT];
75*b1cdbd2cSJim Jagielski 	String						aReservedWord[::com::sun::star::i18n::reservedWords::COUNT];
76*b1cdbd2cSJim Jagielski 	String						aCurrSymbol;
77*b1cdbd2cSJim Jagielski 	String						aCurrBankSymbol;
78*b1cdbd2cSJim Jagielski 	int							nDateFormat;
79*b1cdbd2cSJim Jagielski 	int							nLongDateFormat;
80*b1cdbd2cSJim Jagielski 	sal_uInt16						nCurrPositiveFormat;
81*b1cdbd2cSJim Jagielski 	sal_uInt16						nCurrNegativeFormat;
82*b1cdbd2cSJim Jagielski 	sal_uInt16						nCurrDigits;
83*b1cdbd2cSJim Jagielski 	sal_Bool						bLocaleDataItemValid;
84*b1cdbd2cSJim Jagielski 	sal_Bool						bReservedWordValid;
85*b1cdbd2cSJim Jagielski     mutable ::utl::ReadWriteMutex   aMutex;
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski 	// dummies, to be implemented or provided by XML locale data
88*b1cdbd2cSJim Jagielski 	sal_Unicode					cCurrZeroChar;
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski 								// not implemented, prevent usage
92*b1cdbd2cSJim Jagielski 								LocaleDataWrapper( const LocaleDataWrapper& );
93*b1cdbd2cSJim Jagielski 			LocaleDataWrapper&	operator=( const LocaleDataWrapper& );
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski 								// whenever Locale changes
96*b1cdbd2cSJim Jagielski 			void				invalidateData();
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski 			void				getOneLocaleItemImpl( sal_Int16 nItem );
99*b1cdbd2cSJim Jagielski 			const String&		getOneLocaleItem( sal_Int16 nItem ) const;
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski 			void				getOneReservedWordImpl( sal_Int16 nWord );
102*b1cdbd2cSJim Jagielski 			const String&		getOneReservedWord( sal_Int16 nWord ) const;
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski 			void				getCurrSymbolsImpl();
105*b1cdbd2cSJim Jagielski 			void				getCurrFormatsImpl();
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski             void                scanCurrFormatImpl( const String& rCode,
108*b1cdbd2cSJim Jagielski 									xub_StrLen nStart, xub_StrLen& nSign,
109*b1cdbd2cSJim Jagielski 									xub_StrLen& nPar, xub_StrLen& nNum,
110*b1cdbd2cSJim Jagielski 									xub_StrLen& nBlank, xub_StrLen& nSym );
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski 			void				getDateFormatsImpl();
113*b1cdbd2cSJim Jagielski             DateFormat          scanDateFormatImpl( const String& rCode );
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski             void                getDefaultCalendarImpl();
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 			sal_Unicode*		ImplAddFormatNum( sal_Unicode* pBuf,
118*b1cdbd2cSJim Jagielski                                     sal_Int64 nNumber, sal_uInt16 nDecimals,
119*b1cdbd2cSJim Jagielski                                     sal_Bool bUseThousandSep, sal_Bool bTrailingZeros ) const;
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski             void                getDigitGroupingImpl();
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski public:
124*b1cdbd2cSJim Jagielski 								LocaleDataWrapper(
125*b1cdbd2cSJim Jagielski 									const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & xSF,
126*b1cdbd2cSJim Jagielski 									const ::com::sun::star::lang::Locale& rLocale
127*b1cdbd2cSJim Jagielski 									);
128*b1cdbd2cSJim Jagielski 								~LocaleDataWrapper();
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski     /** Get the service factory, meant to be able to create a CalendarWrapper
131*b1cdbd2cSJim Jagielski         from a LocaleDataWrapper. Note that the service factory may be
132*b1cdbd2cSJim Jagielski         non-existent if this LocaleDataWrapper was created without one and
133*b1cdbd2cSJim Jagielski         lives "on the grassland". The CalendarWrapper ctor can handle that
134*b1cdbd2cSJim Jagielski         though. */
135*b1cdbd2cSJim Jagielski     const ::com::sun::star::uno::Reference<
getServiceFactory() const136*b1cdbd2cSJim Jagielski         ::com::sun::star::lang::XMultiServiceFactory > & getServiceFactory()
137*b1cdbd2cSJim Jagielski         const { return xSMgr; }
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 	/// set a new Locale to request
140*b1cdbd2cSJim Jagielski 			void				setLocale( const ::com::sun::star::lang::Locale& rLocale );
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski 	/// get current requested Locale
143*b1cdbd2cSJim Jagielski     const ::com::sun::star::lang::Locale& getLocale() const;
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski 	/// get current loaded Locale, which might differ from the requested Locale
146*b1cdbd2cSJim Jagielski 	::com::sun::star::lang::Locale getLoadedLocale() const;
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski 	// Wrapper implementations of service LocaleData
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski     ::com::sun::star::i18n::LanguageCountryInfo getLanguageCountryInfo() const;
152*b1cdbd2cSJim Jagielski     ::com::sun::star::i18n::LocaleDataItem getLocaleItem() const;
153*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::Calendar > getAllCalendars() const;
154*b1cdbd2cSJim Jagielski     /// NOTE: this wraps XLocaleData2::getAllCurrencies2() in fact.
155*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::Currency2 > getAllCurrencies() const;
156*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::FormatElement > getAllFormats() const;
157*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::Implementation > getCollatorImplementations() const;
158*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Sequence< ::rtl::OUString > getTransliterations() const;
159*b1cdbd2cSJim Jagielski 	::com::sun::star::i18n::ForbiddenCharacters getForbiddenCharacters() const;
160*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Sequence< ::rtl::OUString > getReservedWord() const;
161*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Sequence< ::com::sun::star::lang::Locale > getAllInstalledLocaleNames() const;
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski 	/// same as the wrapper implementation but static
164*b1cdbd2cSJim Jagielski 	static ::com::sun::star::uno::Sequence< ::com::sun::star::lang::Locale > getInstalledLocaleNames();
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski 	/** Get LanguageTypes for all installed locales which are unambiguous
167*b1cdbd2cSJim Jagielski 		convertible back and forth between locale ISO strings and MS-LCID
168*b1cdbd2cSJim Jagielski 		LanguageType. Upon the first time the function is called when
169*b1cdbd2cSJim Jagielski         locale data checking is enabled, messages are shown for locales not
170*b1cdbd2cSJim Jagielski         matching, excluding already known problems.
171*b1cdbd2cSJim Jagielski 		(e.g. used in number formatter dialog init)
172*b1cdbd2cSJim Jagielski 	 */
173*b1cdbd2cSJim Jagielski 	static ::com::sun::star::uno::Sequence< sal_uInt16 > getInstalledLanguageTypes();
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 	/// maps the LocaleData string to the International enum
176*b1cdbd2cSJim Jagielski 			MeasurementSystem	mapMeasurementStringToEnum( const String& rMS ) const;
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski     /// Convenience method to obtain the default calendar.
179*b1cdbd2cSJim Jagielski     const ::boost::shared_ptr< ::com::sun::star::i18n::Calendar > getDefaultCalendar() const;
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski     /// Convenience method to obtain the day names of the default calendar.
182*b1cdbd2cSJim Jagielski     const ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::CalendarItem > getDefaultCalendarDays() const;
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski     /// Convenience method to obtain the month names of the default calendar.
185*b1cdbd2cSJim Jagielski     const ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::CalendarItem > getDefaultCalendarMonths() const;
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski     /** Obtain digit grouping. The usually known grouping by thousands (#,###)
188*b1cdbd2cSJim Jagielski         is actually only one of possible groupings. Another one, for example,
189*b1cdbd2cSJim Jagielski         used in India is group by 3 and then by 2 indefinitely (#,##,###). The
190*b1cdbd2cSJim Jagielski         integer sequence returned here specifies grouping from right to left
191*b1cdbd2cSJim Jagielski         (!), with a 0 entry designating the end of rules and the previous value
192*b1cdbd2cSJim Jagielski         to be repeated indefinitely. Hence the sequence {3,0} specifies the
193*b1cdbd2cSJim Jagielski         usual grouping by thousands, whereas the sequence {3,2,0} specifies
194*b1cdbd2cSJim Jagielski         Indian grouping. The sal_Int32* getConstArray() can be passed directly
195*b1cdbd2cSJim Jagielski         to the ::rtl::math::doubleToString() methods as argument for the
196*b1cdbd2cSJim Jagielski         pGroups parameter. */
197*b1cdbd2cSJim Jagielski     const ::com::sun::star::uno::Sequence< sal_Int32 > getDigitGrouping() const;
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski 	// Functionality of class International methods, LocaleItem
200*b1cdbd2cSJim Jagielski 
getDateSep() const201*b1cdbd2cSJim Jagielski 	inline	const String&		getDateSep() const
202*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::DATE_SEPARATOR ); }
getNumThousandSep() const203*b1cdbd2cSJim Jagielski 	inline	const String&		getNumThousandSep() const
204*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::THOUSAND_SEPARATOR ); }
getNumDecimalSep() const205*b1cdbd2cSJim Jagielski 	inline	const String&		getNumDecimalSep() const
206*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::DECIMAL_SEPARATOR ); }
getTimeSep() const207*b1cdbd2cSJim Jagielski 	inline	const String&		getTimeSep() const
208*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::TIME_SEPARATOR ); }
getTime100SecSep() const209*b1cdbd2cSJim Jagielski 	inline	const String&		getTime100SecSep() const
210*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::TIME_100SEC_SEPARATOR ); }
getListSep() const211*b1cdbd2cSJim Jagielski 	inline	const String&		getListSep() const
212*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::LIST_SEPARATOR ); }
getQuotationMarkStart() const213*b1cdbd2cSJim Jagielski 	inline	const String&		getQuotationMarkStart() const
214*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::SINGLE_QUOTATION_START ); }
getQuotationMarkEnd() const215*b1cdbd2cSJim Jagielski 	inline	const String&		getQuotationMarkEnd() const
216*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::SINGLE_QUOTATION_END ); }
getDoubleQuotationMarkStart() const217*b1cdbd2cSJim Jagielski 	inline	const String&		getDoubleQuotationMarkStart() const
218*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::DOUBLE_QUOTATION_START ); }
getDoubleQuotationMarkEnd() const219*b1cdbd2cSJim Jagielski 	inline	const String&		getDoubleQuotationMarkEnd() const
220*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::DOUBLE_QUOTATION_END ); }
getMeasurementSystem() const221*b1cdbd2cSJim Jagielski 	inline	const String&		getMeasurementSystem() const
222*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::MEASUREMENT_SYSTEM ); }
getMeasurementSystemEnum() const223*b1cdbd2cSJim Jagielski 	inline	MeasurementSystem	getMeasurementSystemEnum() const
224*b1cdbd2cSJim Jagielski 									{ return mapMeasurementStringToEnum( getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::MEASUREMENT_SYSTEM ) ); }
getTimeAM() const225*b1cdbd2cSJim Jagielski 	inline	const String&		getTimeAM() const
226*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::TIME_AM ); }
getTimePM() const227*b1cdbd2cSJim Jagielski 	inline	const String&		getTimePM() const
228*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::TIME_PM ); }
getLongDateDayOfWeekSep() const229*b1cdbd2cSJim Jagielski 	inline	const String&		getLongDateDayOfWeekSep() const
230*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::LONG_DATE_DAY_OF_WEEK_SEPARATOR ); }
getLongDateDaySep() const231*b1cdbd2cSJim Jagielski 	inline	const String&		getLongDateDaySep() const
232*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::LONG_DATE_DAY_SEPARATOR ); }
getLongDateMonthSep() const233*b1cdbd2cSJim Jagielski 	inline	const String&		getLongDateMonthSep() const
234*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::LONG_DATE_MONTH_SEPARATOR ); }
getLongDateYearSep() const235*b1cdbd2cSJim Jagielski 	inline	const String&		getLongDateYearSep() const
236*b1cdbd2cSJim Jagielski 									{ return getOneLocaleItem( ::com::sun::star::i18n::LocaleItem::LONG_DATE_YEAR_SEPARATOR ); }
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski 	// currency
239*b1cdbd2cSJim Jagielski 			const String&		getCurrSymbol() const;
240*b1cdbd2cSJim Jagielski 			const String&		getCurrBankSymbol() const;
241*b1cdbd2cSJim Jagielski 			sal_uInt16				getCurrPositiveFormat() const;
242*b1cdbd2cSJim Jagielski 			sal_uInt16				getCurrNegativeFormat() const;
243*b1cdbd2cSJim Jagielski 			sal_uInt16				getCurrDigits() const;
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski     // simple date and time formatting
246*b1cdbd2cSJim Jagielski 			DateFormat			getDateFormat() const;
247*b1cdbd2cSJim Jagielski 			DateFormat			getLongDateFormat() const;
248*b1cdbd2cSJim Jagielski                                 /// only numerical values of Gregorian calendar
249*b1cdbd2cSJim Jagielski 			String				getDate( const Date& rDate ) const;
250*b1cdbd2cSJim Jagielski 			String				getTime( const Time& rTime, sal_Bool bSec = sal_True,
251*b1cdbd2cSJim Jagielski 									sal_Bool b100Sec = sal_False ) const;
252*b1cdbd2cSJim Jagielski             String              getDuration( const Time& rTime,
253*b1cdbd2cSJim Jagielski                                     sal_Bool bSec = sal_True, sal_Bool b100Sec = sal_False ) const;
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski                                 /** The CalendarWrapper already <b>MUST</b>
256*b1cdbd2cSJim Jagielski                                     have loaded a calendar.
257*b1cdbd2cSJim Jagielski                                     @param nDisplayDayOfWeek
258*b1cdbd2cSJim Jagielski                                         0 := abbreviated name
259*b1cdbd2cSJim Jagielski                                         1 := full name
260*b1cdbd2cSJim Jagielski                                     @param bDayOfMonthWithLeadingZero
261*b1cdbd2cSJim Jagielski                                         <FALSE/> := without leading zero
262*b1cdbd2cSJim Jagielski                                         <TRUE/>  := with leading zero if <10
263*b1cdbd2cSJim Jagielski                                     @param nDisplayMonth
264*b1cdbd2cSJim Jagielski                                         0 := abbreviated name
265*b1cdbd2cSJim Jagielski                                         1 := full name
266*b1cdbd2cSJim Jagielski                                     @param bTwoDigitYear
267*b1cdbd2cSJim Jagielski                                         <FALSE/> := full year
268*b1cdbd2cSJim Jagielski                                         <TRUE/>  := year % 100
269*b1cdbd2cSJim Jagielski                                  */
270*b1cdbd2cSJim Jagielski             String              getLongDate( const Date& rDate,
271*b1cdbd2cSJim Jagielski                                     CalendarWrapper& rCal,
272*b1cdbd2cSJim Jagielski                                     sal_Int16 nDisplayDayOfWeek = 1,
273*b1cdbd2cSJim Jagielski                                     sal_Bool bDayOfMonthWithLeadingZero = sal_False,
274*b1cdbd2cSJim Jagielski                                     sal_Int16 nDisplayMonth = 1,
275*b1cdbd2cSJim Jagielski                                     sal_Bool bTwoDigitYear = sal_False
276*b1cdbd2cSJim Jagielski                                     ) const;
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski                                 /** Simple number formatting
279*b1cdbd2cSJim Jagielski                                     @param nNumber
280*b1cdbd2cSJim Jagielski                                         value * 10**nDecimals
281*b1cdbd2cSJim Jagielski                                     @param bTrailingZeros
282*b1cdbd2cSJim Jagielski                                     </sal_True>  := always display trailing zeros in
283*b1cdbd2cSJim Jagielski                                         decimal places, even if integer value.
284*b1cdbd2cSJim Jagielski                                     </sal_False> := trailing zeros are only displayed
285*b1cdbd2cSJim Jagielski                                         if the value is not an integer value.
286*b1cdbd2cSJim Jagielski                                  */
287*b1cdbd2cSJim Jagielski             String              getNum( sal_Int64 nNumber, sal_uInt16 nDecimals,
288*b1cdbd2cSJim Jagielski                                     sal_Bool bUseThousandSep = sal_True,
289*b1cdbd2cSJim Jagielski                                     sal_Bool bTrailingZeros = sal_True ) const;
290*b1cdbd2cSJim Jagielski 
291*b1cdbd2cSJim Jagielski                                 /// "Secure" currency formatted string.
292*b1cdbd2cSJim Jagielski             String              getCurr( sal_Int64 nNumber, sal_uInt16 nDecimals,
293*b1cdbd2cSJim Jagielski                                     const String& rCurrencySymbol,
294*b1cdbd2cSJim Jagielski                                     sal_Bool bUseThousandSep = sal_True ) const;
295*b1cdbd2cSJim Jagielski                                 /** Default currency formatted string, use with
296*b1cdbd2cSJim Jagielski                                     care as default currency may change in any
297*b1cdbd2cSJim Jagielski                                     locale, for example, DEM -> EUR */
getCurr(sal_Int64 nNumber,sal_uInt16 nDecimals,sal_Bool bUseThousandSep=sal_True) const298*b1cdbd2cSJim Jagielski             String              getCurr( sal_Int64 nNumber, sal_uInt16 nDecimals,
299*b1cdbd2cSJim Jagielski                                         sal_Bool bUseThousandSep = sal_True ) const
300*b1cdbd2cSJim Jagielski                                     { return getCurr( nNumber, nDecimals,
301*b1cdbd2cSJim Jagielski                                         getCurrSymbol(), bUseThousandSep ); }
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski     // dummy returns, to be implemented
getCurrZeroChar() const304*b1cdbd2cSJim Jagielski 	inline	sal_Unicode			getCurrZeroChar() const
305*b1cdbd2cSJim Jagielski 									{ return cCurrZeroChar; }
isNumLeadingZero() const306*b1cdbd2cSJim Jagielski     inline  sal_Bool                isNumLeadingZero() const
307*b1cdbd2cSJim Jagielski                                     { return sal_True; }
308*b1cdbd2cSJim Jagielski                                 /// standard decimal places
getNumDigits() const309*b1cdbd2cSJim Jagielski     inline  sal_uInt16              getNumDigits() const
310*b1cdbd2cSJim Jagielski                                     { return 2; }
isNumTrailingZeros() const311*b1cdbd2cSJim Jagielski     inline  sal_Bool                isNumTrailingZeros() const
312*b1cdbd2cSJim Jagielski                                     { return sal_True; }
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski 	// reserved words
316*b1cdbd2cSJim Jagielski 
getTrueWord() const317*b1cdbd2cSJim Jagielski 	inline	const String&		getTrueWord() const
318*b1cdbd2cSJim Jagielski 									{ return getOneReservedWord( ::com::sun::star::i18n::reservedWords::TRUE_WORD ); }
getFalseWord() const319*b1cdbd2cSJim Jagielski 	inline	const String&		getFalseWord() const
320*b1cdbd2cSJim Jagielski 									{ return getOneReservedWord( ::com::sun::star::i18n::reservedWords::FALSE_WORD ); }
321*b1cdbd2cSJim Jagielski     /// return a quarter string matching nQuarter (0..3) => "1st quarter" .. "4th quarter"
getQuarterWord(sal_Int16 nQuarter) const322*b1cdbd2cSJim Jagielski     inline  const String&       getQuarterWord( sal_Int16 nQuarter ) const
323*b1cdbd2cSJim Jagielski                                     { return getOneReservedWord( ::com::sun::star::i18n::reservedWords::QUARTER1_WORD + nQuarter ); }
getAboveWord() const324*b1cdbd2cSJim Jagielski 	inline	const String&		getAboveWord() const
325*b1cdbd2cSJim Jagielski 									{ return getOneReservedWord( ::com::sun::star::i18n::reservedWords::ABOVE_WORD ); }
getBelowWord() const326*b1cdbd2cSJim Jagielski 	inline	const String&		getBelowWord() const
327*b1cdbd2cSJim Jagielski 									{ return getOneReservedWord( ::com::sun::star::i18n::reservedWords::BELOW_WORD ); }
328*b1cdbd2cSJim Jagielski     /// return a quarter abbreviation string matching nQuarter (0..3) => "Q1" .. "Q2"
getQuarterAbbreviation(sal_Int16 nQuarter) const329*b1cdbd2cSJim Jagielski     inline  const String&       getQuarterAbbreviation( sal_Int16 nQuarter ) const
330*b1cdbd2cSJim Jagielski                                     { return getOneReservedWord( ::com::sun::star::i18n::reservedWords::QUARTER1_ABBREVIATION + nQuarter ); }
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski     /** Return whether locale data checks are enabled.
333*b1cdbd2cSJim Jagielski         Checks are enabled if the environment variable
334*b1cdbd2cSJim Jagielski         OOO_ENABLE_LOCALE_DATA_CHECKS is set to 'Y' or 'Yes' (or any other
335*b1cdbd2cSJim Jagielski         string starting with 'Y') or '1'.
336*b1cdbd2cSJim Jagielski         Also used in conjunction with the number formatter. */
areChecksEnabled()337*b1cdbd2cSJim Jagielski     static  inline  bool        areChecksEnabled()
338*b1cdbd2cSJim Jagielski                                     {
339*b1cdbd2cSJim Jagielski                                         if (nLocaleDataChecking == 0)
340*b1cdbd2cSJim Jagielski                                             evaluateLocaleDataChecking();
341*b1cdbd2cSJim Jagielski                                         return nLocaleDataChecking == 1;
342*b1cdbd2cSJim Jagielski                                     }
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski     /** Append locale info to string, used with locale data checking.
345*b1cdbd2cSJim Jagielski         A string similar to "de_DE requested\n en_US loaded" is appended. */
346*b1cdbd2cSJim Jagielski 			String&			    appendLocaleInfo( String& rDebugMsg ) const;
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski     /** Ouput a message during locale data checking. The (UTF-8) string is
349*b1cdbd2cSJim Jagielski         written to stderr and in a non-product build or if DBG_UTIL is enabled
350*b1cdbd2cSJim Jagielski         also raised as an assertion message box. */
351*b1cdbd2cSJim Jagielski     static  void                outputCheckMessage( const String& rMsg );
352*b1cdbd2cSJim Jagielski     static  void                outputCheckMessage( const char* pStr);
353*b1cdbd2cSJim Jagielski 
354*b1cdbd2cSJim Jagielski private:
355*b1cdbd2cSJim Jagielski     static  void                evaluateLocaleDataChecking();
356*b1cdbd2cSJim Jagielski };
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski #endif // _UNOTOOLS_LOCALEDATAWRAPPER_HXX
360