bump product version to 4.1.6.2
[LibreOffice.git] / include / svl / ondemand.hxx
blobb3a2c42e11e698ec7c7da65db85e7095eef6745f
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_SVTOOLS_ONDEMAND_HXX
21 #define INCLUDED_SVTOOLS_ONDEMAND_HXX
23 #include <unotools/syslocale.hxx>
24 #include <i18nlangtag/lang.h>
25 #include <unotools/localedatawrapper.hxx>
26 #include <unotools/calendarwrapper.hxx>
27 #include <unotools/collatorwrapper.hxx>
28 #include <com/sun/star/i18n/CollatorOptions.hpp>
29 #include <unotools/transliterationwrapper.hxx>
30 #include <com/sun/star/i18n/TransliterationModules.hpp>
31 #include <unotools/nativenumberwrapper.hxx>
32 #include <com/sun/star/uno/Reference.hxx>
33 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
34 #include <comphelper/processfactory.hxx>
37 On demand instanciation and initialization of several i18n wrappers,
38 helping the number formatter to not perform worse than it already does.
41 /** @short
42 Switch between LANGUAGE_SYSTEM and LANGUAGE_ENGLISH_US and any other
43 LocaleDataWrapper.
44 SvNumberformatter uses it upon switching locales.
46 @descr
47 Avoids reloading and analysing of locale data again and again.
49 @ATTENTION
50 If the default ctor is used the init() method MUST be called before
51 accessing any locale data. The passed parameters Locale and LanguageType
52 must match each other.
55 class OnDemandLocaleDataWrapper
57 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > m_xContext;
58 SvtSysLocale aSysLocale;
59 LanguageType eCurrentLanguage;
60 LanguageType eLastAnyLanguage;
61 const LocaleDataWrapper* pSystem;
62 const LocaleDataWrapper* pEnglish;
63 LocaleDataWrapper* pAny;
64 const LocaleDataWrapper* pCurrent;
65 bool bInitialized;
67 public:
68 OnDemandLocaleDataWrapper()
69 : eLastAnyLanguage( LANGUAGE_DONTKNOW )
70 , pEnglish(0)
71 , pAny(0)
72 , bInitialized(false)
74 pCurrent = pSystem = aSysLocale.GetLocaleDataPtr();
75 eCurrentLanguage = LANGUAGE_SYSTEM;
77 OnDemandLocaleDataWrapper(
78 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext,
79 const LanguageTag& rLanguageTag
81 : pEnglish(0)
82 , pAny(0)
83 , pCurrent(0)
84 , bInitialized(false)
86 pSystem = aSysLocale.GetLocaleDataPtr();
87 init( rxContext, rLanguageTag );
89 ~OnDemandLocaleDataWrapper()
91 delete pEnglish;
92 delete pAny;
95 bool isInitialized() const { return bInitialized; }
97 bool is() const { return pCurrent != NULL; }
99 void init(
100 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext,
101 const LanguageTag& rLanguageTag
104 m_xContext = rxContext;
105 changeLocale( rLanguageTag );
106 bInitialized = true;
109 void changeLocale( const LanguageTag& rLanguageTag )
111 LanguageType eLang = rLanguageTag.getLanguageType( false);
112 switch ( eLang )
114 case LANGUAGE_SYSTEM :
115 pCurrent = pSystem;
116 break;
117 case LANGUAGE_ENGLISH_US :
118 if ( !pEnglish )
119 pEnglish = new LocaleDataWrapper( m_xContext, rLanguageTag );
120 pCurrent = pEnglish;
121 break;
122 default:
123 if ( !pAny )
125 pAny = new LocaleDataWrapper( m_xContext, rLanguageTag );
126 eLastAnyLanguage = eLang;
128 else if ( eLastAnyLanguage != eLang )
130 pAny->setLanguageTag( rLanguageTag );
131 eLastAnyLanguage = eLang;
133 pCurrent = pAny;
135 eCurrentLanguage = eLang;
138 LanguageType getCurrentLanguage() const
139 { return eCurrentLanguage; }
141 LocaleDataWrapper* getAnyLocale()
143 if ( !pAny )
145 pAny = new LocaleDataWrapper( m_xContext, pCurrent->getLanguageTag() );
146 eLastAnyLanguage = eCurrentLanguage;
148 else if ( pCurrent != pAny )
150 pAny->setLanguageTag( pCurrent->getLanguageTag() );
151 eLastAnyLanguage = eCurrentLanguage;
153 return pAny;
156 const LocaleDataWrapper* get() const { return pCurrent; }
157 const LocaleDataWrapper* operator->() const { return get(); }
158 const LocaleDataWrapper& operator*() const { return *get(); }
161 /** Load a calendar only if it's needed.
162 SvNumberformatter uses it upon switching locales.
163 @ATTENTION If the default ctor is used the init() method MUST be called
164 before accessing the calendar.
166 class OnDemandCalendarWrapper
168 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > m_xContext;
169 ::com::sun::star::lang::Locale aLocale;
170 mutable CalendarWrapper* pPtr;
171 mutable bool bValid;
172 bool bInitialized;
174 public:
175 OnDemandCalendarWrapper()
176 : pPtr(0)
177 , bValid(false)
178 , bInitialized(false)
180 OnDemandCalendarWrapper(
181 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext,
182 ::com::sun::star::lang::Locale& rLocale
184 : bValid(false)
185 , bInitialized(false)
187 init( rxContext, rLocale );
189 ~OnDemandCalendarWrapper()
191 delete pPtr;
194 bool isInitialized() const { return bInitialized; }
196 bool is() const { return pPtr != NULL; }
198 void init(
199 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext,
200 const ::com::sun::star::lang::Locale& rLocale
203 m_xContext = rxContext;
204 changeLocale( rLocale );
205 if ( pPtr )
207 delete pPtr;
208 pPtr = NULL;
210 bInitialized = true;
213 void changeLocale( const ::com::sun::star::lang::Locale& rLocale )
215 bValid = false;
216 aLocale = rLocale;
219 CalendarWrapper* get() const
221 if ( !bValid )
223 if ( !pPtr )
224 pPtr = new CalendarWrapper( m_xContext );
225 pPtr->loadDefaultCalendar( aLocale );
226 bValid = true;
228 return pPtr;
231 CalendarWrapper* operator->() { return get(); }
232 CalendarWrapper& operator*() { return *get(); }
235 /** Load a transliteration only if it's needed.
236 SvNumberformatter uses it upon switching locales.
237 @ATTENTION If the default ctor is used the init() method MUST be called
238 before accessing the transliteration.
240 class OnDemandTransliterationWrapper
242 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > m_xContext;
243 LanguageType eLanguage;
244 ::com::sun::star::i18n::TransliterationModules nType;
245 mutable ::utl::TransliterationWrapper* pPtr;
246 mutable bool bValid;
247 bool bInitialized;
249 public:
250 OnDemandTransliterationWrapper()
251 : eLanguage( LANGUAGE_SYSTEM )
252 , pPtr(0)
253 , bValid(false)
254 , bInitialized(false)
256 OnDemandTransliterationWrapper(
257 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext,
258 LanguageType eLang,
259 ::com::sun::star::i18n::TransliterationModules nTypeP
261 : bValid(false)
262 , bInitialized(false)
264 init( rxContext, eLang, nTypeP );
266 ~OnDemandTransliterationWrapper()
268 delete pPtr;
271 bool isInitialized() const { return bInitialized; }
273 bool is() const { return pPtr != NULL; }
275 void init(
276 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext,
277 LanguageType eLang,
278 ::com::sun::star::i18n::TransliterationModules nTypeP
281 m_xContext = rxContext;
282 nType = nTypeP;
283 changeLocale( eLang );
284 if ( pPtr )
286 delete pPtr;
287 pPtr = NULL;
289 bInitialized = true;
292 void changeLocale( LanguageType eLang )
294 bValid = false;
295 eLanguage = eLang;
298 const ::utl::TransliterationWrapper* get() const
300 if ( !bValid )
302 if ( !pPtr )
303 pPtr = new ::utl::TransliterationWrapper( m_xContext, nType );
304 pPtr->loadModuleIfNeeded( eLanguage );
305 bValid = true;
307 return pPtr;
310 const ::utl::TransliterationWrapper* getForModule( const String& rModule, LanguageType eLang ) const
312 if ( !pPtr )
313 pPtr = new ::utl::TransliterationWrapper( m_xContext, nType );
314 pPtr->loadModuleByImplName( rModule, eLang );
315 bValid = false; // reforce settings change in get()
316 return pPtr;
319 const ::utl::TransliterationWrapper* operator->() const { return get(); }
320 const ::utl::TransliterationWrapper& operator*() const { return *get(); }
323 /** Load a native number service wrapper only if it's needed.
324 SvNumberformatter uses it.
326 @ATTENTION
327 If the default ctor is used the init() method MUST be called
328 before accessing the native number supplier.
330 class OnDemandNativeNumberWrapper
332 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > m_xContext;
333 mutable NativeNumberWrapper* pPtr;
334 bool bInitialized;
336 public:
337 OnDemandNativeNumberWrapper()
338 : pPtr(0)
339 , bInitialized(false)
341 OnDemandNativeNumberWrapper(
342 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext
344 : pPtr(0)
345 , bInitialized(false)
347 init( rxContext );
349 ~OnDemandNativeNumberWrapper()
351 delete pPtr;
354 bool isInitialized() const { return bInitialized; }
356 void init(
357 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext
360 m_xContext = rxContext;
361 if ( pPtr )
363 delete pPtr;
364 pPtr = NULL;
366 bInitialized = true;
369 bool is() const { return pPtr != NULL; }
371 NativeNumberWrapper* get() const
373 if ( !pPtr )
374 pPtr = new NativeNumberWrapper( m_xContext );
375 return pPtr;
378 NativeNumberWrapper* operator->() { return get(); }
379 NativeNumberWrapper& operator*() { return *get(); }
382 #endif // INCLUDED_SVTOOLS_ONDEMAND_HXX
384 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */