xref: /trunk/main/svl/inc/svl/ondemand.hxx (revision 86e1cf34)
139a19a47SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
339a19a47SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
439a19a47SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
539a19a47SAndrew Rist  * distributed with this work for additional information
639a19a47SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
739a19a47SAndrew Rist  * to you under the Apache License, Version 2.0 (the
839a19a47SAndrew Rist  * "License"); you may not use this file except in compliance
939a19a47SAndrew Rist  * with the License.  You may obtain a copy of the License at
1039a19a47SAndrew Rist  *
1139a19a47SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
1239a19a47SAndrew Rist  *
1339a19a47SAndrew Rist  * Unless required by applicable law or agreed to in writing,
1439a19a47SAndrew Rist  * software distributed under the License is distributed on an
1539a19a47SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1639a19a47SAndrew Rist  * KIND, either express or implied.  See the License for the
1739a19a47SAndrew Rist  * specific language governing permissions and limitations
1839a19a47SAndrew Rist  * under the License.
1939a19a47SAndrew Rist  *
2039a19a47SAndrew Rist  *************************************************************/
2139a19a47SAndrew Rist 
2239a19a47SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef INCLUDED_SVTOOLS_ONDEMAND_HXX
25cdf0e10cSrcweir #define INCLUDED_SVTOOLS_ONDEMAND_HXX
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <unotools/syslocale.hxx>
28cdf0e10cSrcweir #include <i18npool/lang.h>
29cdf0e10cSrcweir #include <unotools/localedatawrapper.hxx>
30cdf0e10cSrcweir #include <unotools/calendarwrapper.hxx>
31cdf0e10cSrcweir #include <unotools/collatorwrapper.hxx>
32cdf0e10cSrcweir #include <com/sun/star/i18n/CollatorOptions.hpp>
33cdf0e10cSrcweir #include <unotools/transliterationwrapper.hxx>
34cdf0e10cSrcweir #include <com/sun/star/i18n/TransliterationModules.hpp>
35cdf0e10cSrcweir #include <unotools/nativenumberwrapper.hxx>
36cdf0e10cSrcweir #include <com/sun/star/uno/Reference.hxx>
37cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir /*
40*86e1cf34SPedro Giffuni     On demand instantiation and initialization of several i18n wrappers,
41cdf0e10cSrcweir     helping the number formatter to not perform worse than it already does.
42cdf0e10cSrcweir  */
43cdf0e10cSrcweir 
44cdf0e10cSrcweir /** @short
45cdf0e10cSrcweir     Switch between LANGUAGE_SYSTEM and LANGUAGE_ENGLISH_US and any other
46cdf0e10cSrcweir     LocaleDataWrapper.
47cdf0e10cSrcweir     SvNumberformatter uses it upon switching locales.
48cdf0e10cSrcweir 
49cdf0e10cSrcweir     @descr
50cdf0e10cSrcweir     Avoids reloading and analysing of locale data again and again.
51cdf0e10cSrcweir 
52cdf0e10cSrcweir     @ATTENTION
53cdf0e10cSrcweir     If the default ctor is used the init() method MUST be called before
54cdf0e10cSrcweir     accessing any locale data. The passed parameters Locale and LanguageType
55cdf0e10cSrcweir     must match each other.
56cdf0e10cSrcweir  */
57cdf0e10cSrcweir 
58cdf0e10cSrcweir class OnDemandLocaleDataWrapper
59cdf0e10cSrcweir {
60cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xSMgr;
61cdf0e10cSrcweir             SvtSysLocale        aSysLocale;
62cdf0e10cSrcweir             LanguageType        eCurrentLanguage;
63cdf0e10cSrcweir             LanguageType        eLastAnyLanguage;
64cdf0e10cSrcweir     const   LocaleDataWrapper*  pSystem;
65cdf0e10cSrcweir     const   LocaleDataWrapper*  pEnglish;
66cdf0e10cSrcweir             LocaleDataWrapper*  pAny;
67cdf0e10cSrcweir     const   LocaleDataWrapper*  pCurrent;
68cdf0e10cSrcweir             bool                bInitialized;
69cdf0e10cSrcweir 
70cdf0e10cSrcweir public:
OnDemandLocaleDataWrapper()71cdf0e10cSrcweir                                 OnDemandLocaleDataWrapper()
72cdf0e10cSrcweir                                     : eLastAnyLanguage( LANGUAGE_DONTKNOW )
73cdf0e10cSrcweir                                     , pEnglish(0)
74cdf0e10cSrcweir                                     , pAny(0)
75cdf0e10cSrcweir                                     , bInitialized(false)
76cdf0e10cSrcweir                                     {
77cdf0e10cSrcweir                                         pCurrent = pSystem = aSysLocale.GetLocaleDataPtr();
78cdf0e10cSrcweir                                         eCurrentLanguage = LANGUAGE_SYSTEM;
79cdf0e10cSrcweir                                     }
OnDemandLocaleDataWrapper(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & rxSMgr,::com::sun::star::lang::Locale & rLocale,LanguageType eLang)80cdf0e10cSrcweir                                 OnDemandLocaleDataWrapper(
81cdf0e10cSrcweir                                     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr,
82cdf0e10cSrcweir                                     ::com::sun::star::lang::Locale& rLocale,
83cdf0e10cSrcweir                                     LanguageType eLang
84cdf0e10cSrcweir                                     )
85cdf0e10cSrcweir                                     : pEnglish(0)
86cdf0e10cSrcweir                                     , pAny(0)
87cdf0e10cSrcweir                                     , pCurrent(0)
88cdf0e10cSrcweir                                     , bInitialized(false)
89cdf0e10cSrcweir                                     {
90cdf0e10cSrcweir                                         pSystem = aSysLocale.GetLocaleDataPtr();
91cdf0e10cSrcweir                                         init( rxSMgr, rLocale, eLang );
92cdf0e10cSrcweir                                     }
~OnDemandLocaleDataWrapper()93cdf0e10cSrcweir                                 ~OnDemandLocaleDataWrapper()
94cdf0e10cSrcweir                                     {
95cdf0e10cSrcweir                                         delete pEnglish;
96cdf0e10cSrcweir                                         delete pAny;
97cdf0e10cSrcweir                                     }
98cdf0e10cSrcweir 
isInitialized() const99cdf0e10cSrcweir             bool                isInitialized() const   { return bInitialized; }
100cdf0e10cSrcweir 
is() const101cdf0e10cSrcweir             bool                is() const      { return pCurrent != NULL; }
102cdf0e10cSrcweir 
init(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & rxSMgr,::com::sun::star::lang::Locale & rLocale,LanguageType eLang)103cdf0e10cSrcweir             void                init(
104cdf0e10cSrcweir                                     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr,
105cdf0e10cSrcweir                                     ::com::sun::star::lang::Locale& rLocale,
106cdf0e10cSrcweir                                     LanguageType eLang
107cdf0e10cSrcweir                                     )
108cdf0e10cSrcweir                                     {
109cdf0e10cSrcweir                                         xSMgr = rxSMgr;
110cdf0e10cSrcweir                                         changeLocale( rLocale, eLang );
111cdf0e10cSrcweir                                         bInitialized = true;
112cdf0e10cSrcweir                                     }
113cdf0e10cSrcweir 
changeLocale(::com::sun::star::lang::Locale & rLocale,LanguageType eLang)114cdf0e10cSrcweir             void                changeLocale( ::com::sun::star::lang::Locale& rLocale, LanguageType eLang )
115cdf0e10cSrcweir                                     {
116cdf0e10cSrcweir                                         switch ( eLang )
117cdf0e10cSrcweir                                         {
118cdf0e10cSrcweir                                             case LANGUAGE_SYSTEM :
119cdf0e10cSrcweir                                                 pCurrent = pSystem;
120cdf0e10cSrcweir                                             break;
121cdf0e10cSrcweir                                             case LANGUAGE_ENGLISH_US :
122cdf0e10cSrcweir                                                 if ( !pEnglish )
123cdf0e10cSrcweir                                                     pEnglish = new LocaleDataWrapper( xSMgr, rLocale );
124cdf0e10cSrcweir                                                 pCurrent = pEnglish;
125cdf0e10cSrcweir                                             break;
126cdf0e10cSrcweir                                             default:
127cdf0e10cSrcweir                                                 if ( !pAny )
128cdf0e10cSrcweir                                                 {
129cdf0e10cSrcweir                                                     pAny = new LocaleDataWrapper( xSMgr, rLocale );
130cdf0e10cSrcweir                                                     eLastAnyLanguage = eLang;
131cdf0e10cSrcweir                                                 }
132cdf0e10cSrcweir                                                 else if ( eLastAnyLanguage != eLang )
133cdf0e10cSrcweir                                                 {
134cdf0e10cSrcweir                                                     pAny->setLocale( rLocale );
135cdf0e10cSrcweir                                                     eLastAnyLanguage = eLang;
136cdf0e10cSrcweir                                                 }
137cdf0e10cSrcweir                                                 pCurrent = pAny;
138cdf0e10cSrcweir                                         }
139cdf0e10cSrcweir                                         eCurrentLanguage = eLang;
140cdf0e10cSrcweir                                     }
141cdf0e10cSrcweir 
getCurrentLanguage() const142cdf0e10cSrcweir             LanguageType        getCurrentLanguage() const
143cdf0e10cSrcweir                                     { return eCurrentLanguage; }
144cdf0e10cSrcweir 
getAnyLocale()145cdf0e10cSrcweir             LocaleDataWrapper*  getAnyLocale()
146cdf0e10cSrcweir                                     {
147cdf0e10cSrcweir                                         if ( !pAny )
148cdf0e10cSrcweir                                         {
149cdf0e10cSrcweir                                             pAny = new LocaleDataWrapper( xSMgr, pCurrent->getLocale() );
150cdf0e10cSrcweir                                             eLastAnyLanguage = eCurrentLanguage;
151cdf0e10cSrcweir                                         }
152cdf0e10cSrcweir                                         else if ( pCurrent != pAny )
153cdf0e10cSrcweir                                         {
154cdf0e10cSrcweir                                             pAny->setLocale( pCurrent->getLocale() );
155cdf0e10cSrcweir                                             eLastAnyLanguage = eCurrentLanguage;
156cdf0e10cSrcweir                                         }
157cdf0e10cSrcweir                                         return pAny;
158cdf0e10cSrcweir                                     }
159cdf0e10cSrcweir 
get() const160cdf0e10cSrcweir     const   LocaleDataWrapper*  get() const         { return pCurrent; }
operator ->() const161cdf0e10cSrcweir     const   LocaleDataWrapper*  operator->() const  { return get(); }
operator *() const162cdf0e10cSrcweir     const   LocaleDataWrapper&  operator*() const   { return *get(); }
163cdf0e10cSrcweir };
164cdf0e10cSrcweir 
165cdf0e10cSrcweir /** Load a calendar only if it's needed.
166cdf0e10cSrcweir     SvNumberformatter uses it upon switching locales.
167cdf0e10cSrcweir     @ATTENTION If the default ctor is used the init() method MUST be called
168cdf0e10cSrcweir     before accessing the calendar.
169cdf0e10cSrcweir  */
170cdf0e10cSrcweir class OnDemandCalendarWrapper
171cdf0e10cSrcweir {
172cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xSMgr;
173cdf0e10cSrcweir             ::com::sun::star::lang::Locale  aLocale;
174cdf0e10cSrcweir     mutable CalendarWrapper*    pPtr;
175cdf0e10cSrcweir     mutable bool                bValid;
176cdf0e10cSrcweir             bool                bInitialized;
177cdf0e10cSrcweir 
178cdf0e10cSrcweir public:
OnDemandCalendarWrapper()179cdf0e10cSrcweir                                 OnDemandCalendarWrapper()
180cdf0e10cSrcweir                                     : pPtr(0)
181cdf0e10cSrcweir                                     , bValid(false)
182cdf0e10cSrcweir                                     , bInitialized(false)
183cdf0e10cSrcweir                                     {}
OnDemandCalendarWrapper(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & rxSMgr,::com::sun::star::lang::Locale & rLocale)184cdf0e10cSrcweir                                 OnDemandCalendarWrapper(
185cdf0e10cSrcweir                                     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr,
186cdf0e10cSrcweir                                     ::com::sun::star::lang::Locale& rLocale
187cdf0e10cSrcweir                                     )
188cdf0e10cSrcweir                                     : bValid(false)
189cdf0e10cSrcweir                                     , bInitialized(false)
190cdf0e10cSrcweir                                     {
191cdf0e10cSrcweir                                         init( rxSMgr, rLocale );
192cdf0e10cSrcweir                                     }
~OnDemandCalendarWrapper()193cdf0e10cSrcweir                                 ~OnDemandCalendarWrapper()
194cdf0e10cSrcweir                                     {
195cdf0e10cSrcweir                                         delete pPtr;
196cdf0e10cSrcweir                                     }
197cdf0e10cSrcweir 
isInitialized() const198cdf0e10cSrcweir             bool                isInitialized() const   { return bInitialized; }
199cdf0e10cSrcweir 
is() const200cdf0e10cSrcweir             bool                is() const      { return pPtr != NULL; }
201cdf0e10cSrcweir 
init(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & rxSMgr,::com::sun::star::lang::Locale & rLocale)202cdf0e10cSrcweir             void                init(
203cdf0e10cSrcweir                                     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr,
204cdf0e10cSrcweir                                     ::com::sun::star::lang::Locale& rLocale
205cdf0e10cSrcweir                                     )
206cdf0e10cSrcweir                                     {
207cdf0e10cSrcweir                                         xSMgr = rxSMgr;
208cdf0e10cSrcweir                                         changeLocale( rLocale );
209cdf0e10cSrcweir                                         if ( pPtr )
210cdf0e10cSrcweir                                         {
211cdf0e10cSrcweir                                             delete pPtr;
212cdf0e10cSrcweir                                             pPtr = NULL;
213cdf0e10cSrcweir                                         }
214cdf0e10cSrcweir                                         bInitialized = true;
215cdf0e10cSrcweir                                     }
216cdf0e10cSrcweir 
changeLocale(::com::sun::star::lang::Locale & rLocale)217cdf0e10cSrcweir             void                changeLocale( ::com::sun::star::lang::Locale& rLocale )
218cdf0e10cSrcweir                                     {
219cdf0e10cSrcweir                                         bValid = false;
220cdf0e10cSrcweir                                         aLocale = rLocale;
221cdf0e10cSrcweir                                     }
222cdf0e10cSrcweir 
get() const223cdf0e10cSrcweir             CalendarWrapper*    get() const
224cdf0e10cSrcweir                                     {
225cdf0e10cSrcweir                                         if ( !bValid )
226cdf0e10cSrcweir                                         {
227cdf0e10cSrcweir                                             if ( !pPtr )
228cdf0e10cSrcweir                                                 pPtr = new CalendarWrapper( xSMgr );
229cdf0e10cSrcweir                                             pPtr->loadDefaultCalendar( aLocale );
230cdf0e10cSrcweir                                             bValid = true;
231cdf0e10cSrcweir                                         }
232cdf0e10cSrcweir                                         return pPtr;
233cdf0e10cSrcweir                                     }
234cdf0e10cSrcweir 
operator ->()235cdf0e10cSrcweir             CalendarWrapper*    operator->()    { return get(); }
operator *()236cdf0e10cSrcweir             CalendarWrapper&    operator*()     { return *get(); }
237cdf0e10cSrcweir };
238cdf0e10cSrcweir 
239cdf0e10cSrcweir /** Load a collator only if it's needed.
240cdf0e10cSrcweir     SvNumberformatter uses it upon switching locales.
241cdf0e10cSrcweir     @ATTENTION If the default ctor is used the init() method MUST be called
242cdf0e10cSrcweir     before accessing the collator.
243cdf0e10cSrcweir  */
244cdf0e10cSrcweir class OnDemandCollatorWrapper
245cdf0e10cSrcweir {
246cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xSMgr;
247cdf0e10cSrcweir             ::com::sun::star::lang::Locale  aLocale;
248cdf0e10cSrcweir     mutable CollatorWrapper*    pPtr;
249cdf0e10cSrcweir     mutable bool                bValid;
250cdf0e10cSrcweir             bool                bInitialized;
251cdf0e10cSrcweir 
252cdf0e10cSrcweir public:
OnDemandCollatorWrapper()253cdf0e10cSrcweir                                 OnDemandCollatorWrapper()
254cdf0e10cSrcweir                                     : pPtr(0)
255cdf0e10cSrcweir                                     , bValid(false)
256cdf0e10cSrcweir                                     , bInitialized(false)
257cdf0e10cSrcweir                                     {}
OnDemandCollatorWrapper(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & rxSMgr,::com::sun::star::lang::Locale & rLocale)258cdf0e10cSrcweir                                 OnDemandCollatorWrapper(
259cdf0e10cSrcweir                                     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr,
260cdf0e10cSrcweir                                     ::com::sun::star::lang::Locale& rLocale
261cdf0e10cSrcweir                                     )
262cdf0e10cSrcweir                                     : bValid(false)
263cdf0e10cSrcweir                                     , bInitialized(false)
264cdf0e10cSrcweir                                     {
265cdf0e10cSrcweir                                         init( rxSMgr, rLocale );
266cdf0e10cSrcweir                                     }
~OnDemandCollatorWrapper()267cdf0e10cSrcweir                                 ~OnDemandCollatorWrapper()
268cdf0e10cSrcweir                                     {
269cdf0e10cSrcweir                                         delete pPtr;
270cdf0e10cSrcweir                                     }
271cdf0e10cSrcweir 
isInitialized() const272cdf0e10cSrcweir             bool                isInitialized() const   { return bInitialized; }
273cdf0e10cSrcweir 
is() const274cdf0e10cSrcweir             bool                is() const      { return pPtr != NULL; }
275cdf0e10cSrcweir 
init(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & rxSMgr,::com::sun::star::lang::Locale & rLocale)276cdf0e10cSrcweir             void                init(
277cdf0e10cSrcweir                                     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr,
278cdf0e10cSrcweir                                     ::com::sun::star::lang::Locale& rLocale
279cdf0e10cSrcweir                                     )
280cdf0e10cSrcweir                                     {
281cdf0e10cSrcweir                                         xSMgr = rxSMgr;
282cdf0e10cSrcweir                                         changeLocale( rLocale );
283cdf0e10cSrcweir                                         if ( pPtr )
284cdf0e10cSrcweir                                         {
285cdf0e10cSrcweir                                             delete pPtr;
286cdf0e10cSrcweir                                             pPtr = NULL;
287cdf0e10cSrcweir                                         }
288cdf0e10cSrcweir                                         bInitialized = true;
289cdf0e10cSrcweir                                     }
290cdf0e10cSrcweir 
changeLocale(::com::sun::star::lang::Locale & rLocale)291cdf0e10cSrcweir             void                changeLocale( ::com::sun::star::lang::Locale& rLocale )
292cdf0e10cSrcweir                                     {
293cdf0e10cSrcweir                                         bValid = false;
294cdf0e10cSrcweir                                         aLocale = rLocale;
295cdf0e10cSrcweir                                     }
296cdf0e10cSrcweir 
get() const297cdf0e10cSrcweir     const   CollatorWrapper*    get() const
298cdf0e10cSrcweir                                     {
299cdf0e10cSrcweir                                         if ( !bValid )
300cdf0e10cSrcweir                                         {
301cdf0e10cSrcweir                                             if ( !pPtr )
302cdf0e10cSrcweir                                                 pPtr = new CollatorWrapper( xSMgr );
303cdf0e10cSrcweir                                             pPtr->loadDefaultCollator( aLocale, ::com::sun::star::i18n::CollatorOptions::CollatorOptions_IGNORE_CASE );
304cdf0e10cSrcweir                                             bValid = true;
305cdf0e10cSrcweir                                         }
306cdf0e10cSrcweir                                         return pPtr;
307cdf0e10cSrcweir                                     }
308cdf0e10cSrcweir 
operator ->() const309cdf0e10cSrcweir     const   CollatorWrapper*    operator->() const  { return get(); }
operator *() const310cdf0e10cSrcweir     const   CollatorWrapper&    operator*() const   { return *get(); }
311cdf0e10cSrcweir };
312cdf0e10cSrcweir 
313cdf0e10cSrcweir /** Load a transliteration only if it's needed.
314cdf0e10cSrcweir     SvNumberformatter uses it upon switching locales.
315cdf0e10cSrcweir     @ATTENTION If the default ctor is used the init() method MUST be called
316cdf0e10cSrcweir     before accessing the transliteration.
317cdf0e10cSrcweir  */
318cdf0e10cSrcweir class OnDemandTransliterationWrapper
319cdf0e10cSrcweir {
320cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xSMgr;
321cdf0e10cSrcweir             LanguageType        eLanguage;
322cdf0e10cSrcweir             ::com::sun::star::i18n::TransliterationModules  nType;
323cdf0e10cSrcweir     mutable ::utl::TransliterationWrapper*  pPtr;
324cdf0e10cSrcweir     mutable bool                bValid;
325cdf0e10cSrcweir             bool                bInitialized;
326cdf0e10cSrcweir 
327cdf0e10cSrcweir public:
OnDemandTransliterationWrapper()328cdf0e10cSrcweir                                 OnDemandTransliterationWrapper()
329cdf0e10cSrcweir                                     : eLanguage( LANGUAGE_SYSTEM )
330cdf0e10cSrcweir                                     , pPtr(0)
331cdf0e10cSrcweir                                     , bValid(false)
332cdf0e10cSrcweir                                     , bInitialized(false)
333cdf0e10cSrcweir                                     {}
OnDemandTransliterationWrapper(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & rxSMgr,LanguageType eLang,::com::sun::star::i18n::TransliterationModules nTypeP)334cdf0e10cSrcweir                                 OnDemandTransliterationWrapper(
335cdf0e10cSrcweir                                     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr,
336cdf0e10cSrcweir                                     LanguageType eLang,
337cdf0e10cSrcweir                                     ::com::sun::star::i18n::TransliterationModules nTypeP
338cdf0e10cSrcweir                                     )
339cdf0e10cSrcweir                                     : bValid(false)
340cdf0e10cSrcweir                                     , bInitialized(false)
341cdf0e10cSrcweir                                     {
342cdf0e10cSrcweir                                         init( rxSMgr, eLang, nTypeP );
343cdf0e10cSrcweir                                     }
~OnDemandTransliterationWrapper()344cdf0e10cSrcweir                                 ~OnDemandTransliterationWrapper()
345cdf0e10cSrcweir                                     {
346cdf0e10cSrcweir                                         delete pPtr;
347cdf0e10cSrcweir                                     }
348cdf0e10cSrcweir 
isInitialized() const349cdf0e10cSrcweir             bool                isInitialized() const   { return bInitialized; }
350cdf0e10cSrcweir 
is() const351cdf0e10cSrcweir             bool                is() const      { return pPtr != NULL; }
352cdf0e10cSrcweir 
init(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & rxSMgr,LanguageType eLang,::com::sun::star::i18n::TransliterationModules nTypeP)353cdf0e10cSrcweir             void                init(
354cdf0e10cSrcweir                                     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr,
355cdf0e10cSrcweir                                     LanguageType eLang,
356cdf0e10cSrcweir                                     ::com::sun::star::i18n::TransliterationModules nTypeP
357cdf0e10cSrcweir                                     )
358cdf0e10cSrcweir                                     {
359cdf0e10cSrcweir                                         xSMgr = rxSMgr;
360cdf0e10cSrcweir                                         nType = nTypeP;
361cdf0e10cSrcweir                                         changeLocale( eLang );
362cdf0e10cSrcweir                                         if ( pPtr )
363cdf0e10cSrcweir                                         {
364cdf0e10cSrcweir                                             delete pPtr;
365cdf0e10cSrcweir                                             pPtr = NULL;
366cdf0e10cSrcweir                                         }
367cdf0e10cSrcweir                                         bInitialized = true;
368cdf0e10cSrcweir                                     }
369cdf0e10cSrcweir 
changeLocale(LanguageType eLang)370cdf0e10cSrcweir             void                changeLocale( LanguageType eLang )
371cdf0e10cSrcweir                                     {
372cdf0e10cSrcweir                                         bValid = false;
373cdf0e10cSrcweir                                         eLanguage = eLang;
374cdf0e10cSrcweir                                     }
375cdf0e10cSrcweir 
get() const376cdf0e10cSrcweir     const   ::utl::TransliterationWrapper*  get() const
377cdf0e10cSrcweir                                     {
378cdf0e10cSrcweir                                         if ( !bValid )
379cdf0e10cSrcweir                                         {
380cdf0e10cSrcweir                                             if ( !pPtr )
381cdf0e10cSrcweir                                                 pPtr = new ::utl::TransliterationWrapper( xSMgr, nType );
382cdf0e10cSrcweir                                             pPtr->loadModuleIfNeeded( eLanguage );
383cdf0e10cSrcweir                                             bValid = true;
384cdf0e10cSrcweir                                         }
385cdf0e10cSrcweir                                         return pPtr;
386cdf0e10cSrcweir                                     }
387cdf0e10cSrcweir 
getForModule(const String & rModule,LanguageType eLang) const388cdf0e10cSrcweir     const   ::utl::TransliterationWrapper*  getForModule( const String& rModule, LanguageType eLang ) const
389cdf0e10cSrcweir                                     {
390cdf0e10cSrcweir                                         if ( !pPtr )
391cdf0e10cSrcweir                                             pPtr = new ::utl::TransliterationWrapper( xSMgr, nType );
392cdf0e10cSrcweir                                         pPtr->loadModuleByImplName( rModule, eLang );
393cdf0e10cSrcweir                                         bValid = false; // reforce settings change in get()
394cdf0e10cSrcweir                                         return pPtr;
395cdf0e10cSrcweir                                     }
396cdf0e10cSrcweir 
operator ->() const397cdf0e10cSrcweir     const   ::utl::TransliterationWrapper*  operator->() const  { return get(); }
operator *() const398cdf0e10cSrcweir     const   ::utl::TransliterationWrapper&  operator*() const   { return *get(); }
399cdf0e10cSrcweir };
400cdf0e10cSrcweir 
401cdf0e10cSrcweir /** Load a native number service wrapper only if it's needed.
402cdf0e10cSrcweir     SvNumberformatter uses it.
403cdf0e10cSrcweir 
404cdf0e10cSrcweir     @ATTENTION
405cdf0e10cSrcweir     If the default ctor is used the init() method MUST be called
406cdf0e10cSrcweir     before accessing the native number supplier.
407cdf0e10cSrcweir  */
408cdf0e10cSrcweir class OnDemandNativeNumberWrapper
409cdf0e10cSrcweir {
410cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xSMgr;
411cdf0e10cSrcweir     mutable NativeNumberWrapper*    pPtr;
412cdf0e10cSrcweir             bool                bInitialized;
413cdf0e10cSrcweir 
414cdf0e10cSrcweir public:
OnDemandNativeNumberWrapper()415cdf0e10cSrcweir                                 OnDemandNativeNumberWrapper()
416cdf0e10cSrcweir                                     : pPtr(0)
417cdf0e10cSrcweir                                     , bInitialized(false)
418cdf0e10cSrcweir                                     {}
OnDemandNativeNumberWrapper(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & rxSMgr)419cdf0e10cSrcweir                                 OnDemandNativeNumberWrapper(
420cdf0e10cSrcweir                                     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr
421cdf0e10cSrcweir                                     )
422cdf0e10cSrcweir                                     : pPtr(0)
423cdf0e10cSrcweir                                     , bInitialized(false)
424cdf0e10cSrcweir                                     {
425cdf0e10cSrcweir                                         init( rxSMgr );
426cdf0e10cSrcweir                                     }
~OnDemandNativeNumberWrapper()427cdf0e10cSrcweir                                 ~OnDemandNativeNumberWrapper()
428cdf0e10cSrcweir                                     {
429cdf0e10cSrcweir                                         delete pPtr;
430cdf0e10cSrcweir                                     }
431cdf0e10cSrcweir 
isInitialized() const432cdf0e10cSrcweir             bool                isInitialized() const   { return bInitialized; }
433cdf0e10cSrcweir 
init(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & rxSMgr)434cdf0e10cSrcweir             void                init(
435cdf0e10cSrcweir                                     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr
436cdf0e10cSrcweir                                     )
437cdf0e10cSrcweir                                     {
438cdf0e10cSrcweir                                         xSMgr = rxSMgr;
439cdf0e10cSrcweir                                         if ( pPtr )
440cdf0e10cSrcweir                                         {
441cdf0e10cSrcweir                                             delete pPtr;
442cdf0e10cSrcweir                                             pPtr = NULL;
443cdf0e10cSrcweir                                         }
444cdf0e10cSrcweir                                         bInitialized = true;
445cdf0e10cSrcweir                                     }
446cdf0e10cSrcweir 
is() const447cdf0e10cSrcweir             bool                is() const      { return pPtr != NULL; }
448cdf0e10cSrcweir 
get() const449cdf0e10cSrcweir             NativeNumberWrapper*    get() const
450cdf0e10cSrcweir                                     {
451cdf0e10cSrcweir                                         if ( !pPtr )
452cdf0e10cSrcweir                                             pPtr = new NativeNumberWrapper( xSMgr );
453cdf0e10cSrcweir                                         return pPtr;
454cdf0e10cSrcweir                                     }
455cdf0e10cSrcweir 
operator ->()456cdf0e10cSrcweir             NativeNumberWrapper*    operator->()    { return get(); }
operator *()457cdf0e10cSrcweir             NativeNumberWrapper&    operator*()     { return *get(); }
458cdf0e10cSrcweir };
459cdf0e10cSrcweir 
460cdf0e10cSrcweir #endif // INCLUDED_SVTOOLS_ONDEMAND_HXX
461cdf0e10cSrcweir 
462