xref: /AOO41X/main/unotools/source/config/localisationoptions.cxx (revision b5088357f810cb81479bbbd0e021cd3c9835ca0d)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_unotools.hxx"
26 #ifndef GCC
27 #endif
28 
29 //_________________________________________________________________________________________________________________
30 //  includes
31 //_________________________________________________________________________________________________________________
32 
33 #include <unotools/localisationoptions.hxx>
34 #include <unotools/configmgr.hxx>
35 #include <unotools/configitem.hxx>
36 #include <tools/debug.hxx>
37 #include <com/sun/star/uno/Any.hxx>
38 #include <com/sun/star/uno/Sequence.hxx>
39 
40 #include <rtl/logfile.hxx>
41 #include "itemholder1.hxx"
42 
43 //_________________________________________________________________________________________________________________
44 //  namespaces
45 //_________________________________________________________________________________________________________________
46 
47 using namespace ::utl                   ;
48 using namespace ::rtl                   ;
49 using namespace ::osl                   ;
50 using namespace ::com::sun::star::uno   ;
51 
52 //_________________________________________________________________________________________________________________
53 //  const
54 //_________________________________________________________________________________________________________________
55 
56 #define ROOTNODE_LOCALISATION           OUString(RTL_CONSTASCII_USTRINGPARAM("Office.Common/View/Localisation"))
57 #define DEFAULT_AUTOMNEMONIC            sal_False
58 #define DEFAULT_DIALOGSCALE             0
59 
60 #define PROPERTYNAME_AUTOMNEMONIC       OUString(RTL_CONSTASCII_USTRINGPARAM("AutoMnemonic" ))
61 #define PROPERTYNAME_DIALOGSCALE        OUString(RTL_CONSTASCII_USTRINGPARAM("DialogScale"  ))
62 
63 #define PROPERTYHANDLE_AUTOMNEMONIC     0
64 #define PROPERTYHANDLE_DIALOGSCALE      1
65 
66 #define PROPERTYCOUNT                   2
67 
68 //_________________________________________________________________________________________________________________
69 //  private declarations!
70 //_________________________________________________________________________________________________________________
71 
72 class SvtLocalisationOptions_Impl : public ConfigItem
73 {
74     //-------------------------------------------------------------------------------------------------------------
75     //  public methods
76     //-------------------------------------------------------------------------------------------------------------
77 
78     public:
79 
80         //---------------------------------------------------------------------------------------------------------
81         //  constructor / destructor
82         //---------------------------------------------------------------------------------------------------------
83 
84          SvtLocalisationOptions_Impl();
85         ~SvtLocalisationOptions_Impl();
86 
87         //---------------------------------------------------------------------------------------------------------
88         //  overloaded methods of baseclass
89         //---------------------------------------------------------------------------------------------------------
90 
91         /*-****************************************************************************************************//**
92             @short      called for notify of configmanager
93             @descr      These method is called from the ConfigManager before application ends or from the
94                         PropertyChangeListener if the sub tree broadcasts changes. You must update your
95                         internal values.
96 
97             @seealso    baseclass ConfigItem
98 
99             @param      "seqPropertyNames" is the list of properties which should be updated.
100             @return     -
101 
102             @onerror    -
103         *//*-*****************************************************************************************************/
104 
105         virtual void Notify( const Sequence< OUString >& seqPropertyNames );
106 
107         /*-****************************************************************************************************//**
108             @short      write changes to configuration
109             @descr      These method writes the changed values into the sub tree
110                         and should always called in our destructor to guarantee consistency of config data.
111 
112             @seealso    baseclass ConfigItem
113 
114             @param      -
115             @return     -
116 
117             @onerror    -
118         *//*-*****************************************************************************************************/
119 
120         virtual void Commit();
121 
122         //---------------------------------------------------------------------------------------------------------
123         //  public interface
124         //---------------------------------------------------------------------------------------------------------
125 
126         /*-****************************************************************************************************//**
127             @short      access method to get internal values
128             @descr      These method give us a chance to regulate acces to ouer internal values.
129                         It's not used in the moment - but it's possible for the feature!
130 
131             @seealso    -
132 
133             @param      -
134             @return     -
135 
136             @onerror    -
137         *//*-*****************************************************************************************************/
138 
139         sal_Bool    IsAutoMnemonic  (                   ) const ;
140         void        SetAutoMnemonic ( sal_Bool  bState  )       ;
141         sal_Int32   GetDialogScale  (                   ) const ;
142         void        SetDialogScale  ( sal_Int32 nScale  )       ;
143 
144     //-------------------------------------------------------------------------------------------------------------
145     //  private methods
146     //-------------------------------------------------------------------------------------------------------------
147 
148     private:
149 
150         /*-****************************************************************************************************//**
151             @short      return list of key names of ouer configuration management which represent oue module tree
152             @descr      These methods return a static const list of key names. We need it to get needed values from our
153                         configuration management.
154 
155             @seealso    -
156 
157             @param      -
158             @return     A list of needed configuration keys is returned.
159 
160             @onerror    -
161         *//*-*****************************************************************************************************/
162 
163         static Sequence< OUString > GetPropertyNames();
164 
165     //-------------------------------------------------------------------------------------------------------------
166     //  private member
167     //-------------------------------------------------------------------------------------------------------------
168 
169     private:
170 
171         sal_Bool    m_bAutoMnemonic     ;
172         sal_Int32   m_nDialogScale      ;
173 };
174 
175 //_________________________________________________________________________________________________________________
176 //  definitions
177 //_________________________________________________________________________________________________________________
178 
179 //*****************************************************************************************************************
180 //  constructor
181 //*****************************************************************************************************************
SvtLocalisationOptions_Impl()182 SvtLocalisationOptions_Impl::SvtLocalisationOptions_Impl()
183     // Init baseclasses first
184     :   ConfigItem          ( ROOTNODE_LOCALISATION )
185     // Init member then.
186     ,   m_bAutoMnemonic     ( DEFAULT_AUTOMNEMONIC  )
187     ,   m_nDialogScale      ( DEFAULT_DIALOGSCALE   )
188 {
189     // Use our static list of configuration keys to get his values.
190     Sequence< OUString >    seqNames    = GetPropertyNames  (           );
191     Sequence< Any >         seqValues   = GetProperties     ( seqNames  );
192 
193     // Safe impossible cases.
194     // We need values from ALL configuration keys.
195     // Follow assignment use order of values in relation to our list of key names!
196     DBG_ASSERT( !(seqNames.getLength()!=seqValues.getLength()), "SvtLocalisationOptions_Impl::SvtLocalisationOptions_Impl()\nI miss some values of configuration keys!\n" );
197 
198     // Copy values from list in right order to ouer internal member.
199     sal_Int32 nPropertyCount = seqValues.getLength();
200     for( sal_Int32 nProperty=0; nProperty<nPropertyCount; ++nProperty )
201     {
202         // Safe impossible cases.
203         // Check any for valid value.
204         DBG_ASSERT( !(seqValues[nProperty].hasValue()==sal_False), "SvtLocalisationOptions_Impl::SvtLocalisationOptions_Impl()\nInvalid property value detected!\n" );
205         switch( nProperty )
206         {
207             case PROPERTYHANDLE_AUTOMNEMONIC    :   {
208                                                         DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtLocalisationOptions_Impl::SvtLocalisationOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Localisation\\AutoMnemonic\"?" );
209                                                         seqValues[nProperty] >>= m_bAutoMnemonic;
210                                                     }
211                                                     break;
212 
213             case PROPERTYHANDLE_DIALOGSCALE     :   {
214                                                         DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtLocalisationOptions_Impl::SvtLocalisationOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Localisation\\DialogScale\"?" );
215                                                         seqValues[nProperty] >>= m_nDialogScale;
216                                                     }
217                                                     break;
218         }
219     }
220 
221     // Enable notification mechanism of ouer baseclass.
222     // We need it to get information about changes outside these class on ouer used configuration keys!
223     EnableNotification( seqNames );
224 }
225 
226 //*****************************************************************************************************************
227 //  destructor
228 //*****************************************************************************************************************
~SvtLocalisationOptions_Impl()229 SvtLocalisationOptions_Impl::~SvtLocalisationOptions_Impl()
230 {
231     // We must save our current values .. if user forget it!
232     if( IsModified() == sal_True )
233     {
234         Commit();
235     }
236 }
237 
238 //*****************************************************************************************************************
239 //  public method
240 //*****************************************************************************************************************
Notify(const Sequence<OUString> & seqPropertyNames)241 void SvtLocalisationOptions_Impl::Notify( const Sequence< OUString >& seqPropertyNames )
242 {
243     // Use given list of updated properties to get his values from configuration directly!
244     Sequence< Any > seqValues = GetProperties( seqPropertyNames );
245     // Safe impossible cases.
246     // We need values from ALL notified configuration keys.
247     DBG_ASSERT( !(seqPropertyNames.getLength()!=seqValues.getLength()), "SvtLocalisationOptions_Impl::Notify()\nI miss some values of configuration keys!\n" );
248     // Step over list of property names and get right value from coreesponding value list to set it on internal members!
249     sal_Int32 nCount = seqPropertyNames.getLength();
250     for( sal_Int32 nProperty=0; nProperty<nCount; ++nProperty )
251     {
252         if( seqPropertyNames[nProperty] == PROPERTYNAME_AUTOMNEMONIC )
253         {
254             DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtLocalisationOptions_Impl::SvtLocalisationOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Localisation\\AutoMnemonic\"?" );
255             seqValues[nProperty] >>= m_bAutoMnemonic;
256         }
257         else
258         if( seqPropertyNames[nProperty] == PROPERTYNAME_DIALOGSCALE )
259         {
260             DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtLocalisationOptions_Impl::SvtLocalisationOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Localisation\\DialogScale\"?" );
261             seqValues[nProperty] >>= m_nDialogScale;
262         }
263         #if OSL_DEBUG_LEVEL > 1
264         else DBG_ASSERT( sal_False, "SvtLocalisationOptions_Impl::Notify()\nUnkown property detected ... I can't handle these!\n" );
265         #endif
266     }
267 
268     NotifyListeners(0);
269 }
270 
271 //*****************************************************************************************************************
272 //  public method
273 //*****************************************************************************************************************
Commit()274 void SvtLocalisationOptions_Impl::Commit()
275 {
276     // Get names of supported properties, create a list for values and copy current values to it.
277     Sequence< OUString >    seqNames    = GetPropertyNames  ();
278     sal_Int32               nCount      = seqNames.getLength();
279     Sequence< Any >         seqValues   ( nCount );
280     for( sal_Int32 nProperty=0; nProperty<nCount; ++nProperty )
281     {
282         switch( nProperty )
283         {
284             case PROPERTYHANDLE_AUTOMNEMONIC    :   {
285                                                         seqValues[nProperty] <<= m_bAutoMnemonic;
286                                                     }
287                                                     break;
288 
289             case PROPERTYHANDLE_DIALOGSCALE     :   {
290                                                         seqValues[nProperty] <<= m_nDialogScale;
291                                                     }
292                                                     break;
293         }
294     }
295     // Set properties in configuration.
296     PutProperties( seqNames, seqValues );
297 }
298 
299 //*****************************************************************************************************************
300 //  public method
301 //*****************************************************************************************************************
IsAutoMnemonic() const302 sal_Bool SvtLocalisationOptions_Impl::IsAutoMnemonic() const
303 {
304     return m_bAutoMnemonic;
305 }
306 
307 //*****************************************************************************************************************
308 //  public method
309 //*****************************************************************************************************************
SetAutoMnemonic(sal_Bool bState)310 void SvtLocalisationOptions_Impl::SetAutoMnemonic( sal_Bool bState )
311 {
312     m_bAutoMnemonic = bState;
313     SetModified();
314 }
315 
316 //*****************************************************************************************************************
317 //  public method
318 //*****************************************************************************************************************
GetDialogScale() const319 sal_Int32 SvtLocalisationOptions_Impl::GetDialogScale() const
320 {
321     return m_nDialogScale;
322 }
323 
324 //*****************************************************************************************************************
325 //  public method
326 //*****************************************************************************************************************
SetDialogScale(sal_Int32 nScale)327 void SvtLocalisationOptions_Impl::SetDialogScale( sal_Int32 nScale )
328 {
329     m_nDialogScale = nScale;
330     SetModified();
331 }
332 
333 //*****************************************************************************************************************
334 //  private method
335 //*****************************************************************************************************************
GetPropertyNames()336 Sequence< OUString > SvtLocalisationOptions_Impl::GetPropertyNames()
337 {
338     // Build static list of configuration key names.
339     static const OUString pProperties[] =
340     {
341         PROPERTYNAME_AUTOMNEMONIC   ,
342         PROPERTYNAME_DIALOGSCALE    ,
343     };
344     // Initialize return sequence with these list ...
345     static const Sequence< OUString > seqPropertyNames( pProperties, PROPERTYCOUNT );
346     // ... and return it.
347     return seqPropertyNames;
348 }
349 
350 //*****************************************************************************************************************
351 //  initialize static member
352 //  DON'T DO IT IN YOUR HEADER!
353 //  see definition for further informations
354 //*****************************************************************************************************************
355 SvtLocalisationOptions_Impl*    SvtLocalisationOptions::m_pDataContainer    = NULL  ;
356 sal_Int32                       SvtLocalisationOptions::m_nRefCount         = 0     ;
357 
358 //*****************************************************************************************************************
359 //  constructor
360 //*****************************************************************************************************************
SvtLocalisationOptions()361 SvtLocalisationOptions::SvtLocalisationOptions()
362 {
363     // Global access, must be guarded (multithreading!).
364     MutexGuard aGuard( GetOwnStaticMutex() );
365     // Increase ouer refcount ...
366     ++m_nRefCount;
367     // ... and initialize ouer data container only if it not already exist!
368     if( m_pDataContainer == NULL )
369     {
370         RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtLocalisationOptions_Impl::ctor()");
371         m_pDataContainer = new SvtLocalisationOptions_Impl;
372 
373         ItemHolder1::holdConfigItem(E_LOCALISATIONOPTIONS);
374     }
375 }
376 
377 //*****************************************************************************************************************
378 //  destructor
379 //*****************************************************************************************************************
~SvtLocalisationOptions()380 SvtLocalisationOptions::~SvtLocalisationOptions()
381 {
382     // Global access, must be guarded (multithreading!)
383     MutexGuard aGuard( GetOwnStaticMutex() );
384     // Decrease ouer refcount.
385     --m_nRefCount;
386     // If last instance was deleted ...
387     // we must destroy ouer static data container!
388     if( m_nRefCount <= 0 )
389     {
390         delete m_pDataContainer;
391         m_pDataContainer = NULL;
392     }
393 }
394 
395 //*****************************************************************************************************************
396 //  public method
397 //*****************************************************************************************************************
IsAutoMnemonic() const398 sal_Bool SvtLocalisationOptions::IsAutoMnemonic() const
399 {
400     MutexGuard aGuard( GetOwnStaticMutex() );
401     return m_pDataContainer->IsAutoMnemonic();
402 }
403 
404 //*****************************************************************************************************************
405 //  public method
406 //*****************************************************************************************************************
SetAutoMnemonic(sal_Bool bState)407 void SvtLocalisationOptions::SetAutoMnemonic( sal_Bool bState )
408 {
409     MutexGuard aGuard( GetOwnStaticMutex() );
410     m_pDataContainer->SetAutoMnemonic( bState );
411 }
412 
413 //*****************************************************************************************************************
414 //  public method
415 //*****************************************************************************************************************
GetDialogScale() const416 sal_Int32 SvtLocalisationOptions::GetDialogScale() const
417 {
418     MutexGuard aGuard( GetOwnStaticMutex() );
419     return m_pDataContainer->GetDialogScale();
420 }
421 
422 //*****************************************************************************************************************
423 //  public method
424 //*****************************************************************************************************************
SetDialogScale(sal_Int32 nScale)425 void SvtLocalisationOptions::SetDialogScale( sal_Int32 nScale )
426 {
427     MutexGuard aGuard( GetOwnStaticMutex() );
428     m_pDataContainer->SetDialogScale( nScale );
429 }
430 
431 //*****************************************************************************************************************
432 //  private method
433 //*****************************************************************************************************************
GetOwnStaticMutex()434 Mutex& SvtLocalisationOptions::GetOwnStaticMutex()
435 {
436     // Initialize static mutex only for one time!
437     static Mutex* pMutex = NULL;
438     // If these method first called (Mutex not already exist!) ...
439     if( pMutex == NULL )
440     {
441         // ... we must create a new one. Protect follow code with the global mutex -
442         // It must be - we create a static variable!
443         MutexGuard aGuard( Mutex::getGlobalMutex() );
444         // We must check our pointer again - because it can be that another instance of ouer class will be fastr then these!
445         if( pMutex == NULL )
446         {
447             // Create the new mutex and set it for return on static variable.
448             static Mutex aMutex;
449             pMutex = &aMutex;
450         }
451     }
452     // Return new created or already existing mutex object.
453     return *pMutex;
454 }
455