xref: /AOO41X/main/unotools/source/config/fontoptions.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/fontoptions.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_FONT                       OUString(RTL_CONSTASCII_USTRINGPARAM("Office.Common/Font"           ))
57 
58 #define PROPERTYNAME_REPLACEMENTTABLE       OUString(RTL_CONSTASCII_USTRINGPARAM("Substitution/Replacement"     ))
59 #define PROPERTYNAME_FONTHISTORY            OUString(RTL_CONSTASCII_USTRINGPARAM("View/History"                 ))
60 #define PROPERTYNAME_FONTWYSIWYG            OUString(RTL_CONSTASCII_USTRINGPARAM("View/ShowFontBoxWYSIWYG"      ))
61 
62 #define PROPERTYHANDLE_REPLACEMENTTABLE     0
63 #define PROPERTYHANDLE_FONTHISTORY          1
64 #define PROPERTYHANDLE_FONTWYSIWYG          2
65 
66 #define PROPERTYCOUNT                       3
67 
68 //_________________________________________________________________________________________________________________
69 //  private declarations!
70 //_________________________________________________________________________________________________________________
71 
72 class SvtFontOptions_Impl : public ConfigItem
73 {
74     //-------------------------------------------------------------------------------------------------------------
75     //  public methods
76     //-------------------------------------------------------------------------------------------------------------
77 
78     public:
79 
80         //---------------------------------------------------------------------------------------------------------
81         //  constructor / destructor
82         //---------------------------------------------------------------------------------------------------------
83 
84          SvtFontOptions_Impl();
85         ~SvtFontOptions_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    IsReplacementTableEnabled   (                   ) const ;
140         void        EnableReplacementTable      ( sal_Bool bState   )       ;
141 
142         sal_Bool    IsFontHistoryEnabled        (                   ) const ;
143         void        EnableFontHistory           ( sal_Bool bState   )       ;
144 
145         sal_Bool    IsFontWYSIWYGEnabled        (                   ) const ;
146         void        EnableFontWYSIWYG           ( sal_Bool bState   )       ;
147 
148     //-------------------------------------------------------------------------------------------------------------
149     //  private methods
150     //-------------------------------------------------------------------------------------------------------------
151 
152     private:
153 
154         /*-****************************************************************************************************//**
155             @short      return list of key names of ouer configuration management which represent oue module tree
156             @descr      These methods return a static const list of key names. We need it to get needed values from our
157                         configuration management.
158 
159             @seealso    -
160 
161             @param      -
162             @return     A list of needed configuration keys is returned.
163 
164             @onerror    -
165         *//*-*****************************************************************************************************/
166 
167         static Sequence< OUString > impl_GetPropertyNames();
168 
169     //-------------------------------------------------------------------------------------------------------------
170     //  private member
171     //-------------------------------------------------------------------------------------------------------------
172 
173     private:
174 
175         sal_Bool        m_bReplacementTable     ;
176         sal_Bool        m_bFontHistory          ;
177         sal_Bool        m_bFontWYSIWYG          ;
178 };
179 
180 //_________________________________________________________________________________________________________________
181 //  definitions
182 //_________________________________________________________________________________________________________________
183 
184 //*****************************************************************************************************************
185 //  constructor
186 //*****************************************************************************************************************
SvtFontOptions_Impl()187 SvtFontOptions_Impl::SvtFontOptions_Impl()
188     // Init baseclasses first
189     :   ConfigItem          ( ROOTNODE_FONT )
190     // Init member then.
191     ,   m_bReplacementTable ( sal_False     )
192     ,   m_bFontHistory      ( sal_False     )
193     ,   m_bFontWYSIWYG      ( sal_False     )
194 {
195     // Use our static list of configuration keys to get his values.
196     Sequence< OUString >    seqNames    = impl_GetPropertyNames (           );
197     Sequence< Any >         seqValues   = GetProperties         ( seqNames  );
198 
199     // Safe impossible cases.
200     // We need values from ALL configuration keys.
201     // Follow assignment use order of values in relation to our list of key names!
202     DBG_ASSERT( !(seqNames.getLength()!=seqValues.getLength()), "SvtFontOptions_Impl::SvtFontOptions_Impl()\nI miss some values of configuration keys!\n" );
203 
204     // Copy values from list in right order to ouer internal member.
205     sal_Int32 nPropertyCount = seqValues.getLength();
206     for( sal_Int32 nProperty=0; nProperty<nPropertyCount; ++nProperty )
207     {
208         // Safe impossible cases.
209         // Check any for valid value.
210         DBG_ASSERT( !(seqValues[nProperty].hasValue()==sal_False), "SvtFontOptions_Impl::SvtFontOptions_Impl()\nInvalid property value detected!\n" );
211         switch( nProperty )
212         {
213             case PROPERTYHANDLE_REPLACEMENTTABLE    :   {
214                                                             DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtFontOptions_Impl::SvtFontOptions_Impl()\nWho has changed the value type of \"Office.Common\\Font\\Substitution\\Replacement\"?" );
215                                                             seqValues[nProperty] >>= m_bReplacementTable;
216                                                         }
217                                                         break;
218             case PROPERTYHANDLE_FONTHISTORY         :   {
219                                                             DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtFontOptions_Impl::SvtFontOptions_Impl()\nWho has changed the value type of \"Office.Common\\Font\\View\\History\"?" );
220                                                             seqValues[nProperty] >>= m_bFontHistory;
221                                                         }
222                                                         break;
223             case PROPERTYHANDLE_FONTWYSIWYG         :   {
224                                                             DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtFontOptions_Impl::SvtFontOptions_Impl()\nWho has changed the value type of \"Office.Common\\Font\\View\\ShowFontBoxWYSIWYG\"?" );
225                                                             seqValues[nProperty] >>= m_bFontWYSIWYG;
226                                                         }
227                                                         break;
228         }
229     }
230 
231     // Enable notification mechanism of ouer baseclass.
232     // We need it to get information about changes outside these class on ouer used configuration keys!
233     EnableNotification( seqNames );
234 }
235 
236 //*****************************************************************************************************************
237 //  destructor
238 //*****************************************************************************************************************
~SvtFontOptions_Impl()239 SvtFontOptions_Impl::~SvtFontOptions_Impl()
240 {
241     // We must save our current values .. if user forget it!
242     if( IsModified() == sal_True )
243     {
244         Commit();
245     }
246 }
247 
248 //*****************************************************************************************************************
249 //  public method
250 //*****************************************************************************************************************
Notify(const Sequence<OUString> & seqPropertyNames)251 void SvtFontOptions_Impl::Notify( const Sequence< OUString >& seqPropertyNames )
252 {
253     // Use given list of updated properties to get his values from configuration directly!
254     Sequence< Any > seqValues = GetProperties( seqPropertyNames );
255     // Safe impossible cases.
256     // We need values from ALL notified configuration keys.
257     DBG_ASSERT( !(seqPropertyNames.getLength()!=seqValues.getLength()), "SvtFontOptions_Impl::Notify()\nI miss some values of configuration keys!\n" );
258     // Step over list of property names and get right value from coreesponding value list to set it on internal members!
259     sal_Int32 nCount = seqPropertyNames.getLength();
260     for( sal_Int32 nProperty=0; nProperty<nCount; ++nProperty )
261     {
262         if( seqPropertyNames[nProperty] == PROPERTYNAME_REPLACEMENTTABLE )
263         {
264             DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtFontOptions_Impl::Notify()\nWho has changed the value type of \"Office.Common\\Font\\Substitution\\Replacement\"?" );
265             seqValues[nProperty] >>= m_bReplacementTable;
266         }
267         else
268         if( seqPropertyNames[nProperty] == PROPERTYNAME_FONTHISTORY )
269         {
270             DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtFontOptions_Impl::Notify()\nWho has changed the value type of \"Office.Common\\Font\\View\\History\"?" );
271             seqValues[nProperty] >>= m_bFontHistory;
272         }
273         else
274         if( seqPropertyNames[nProperty] == PROPERTYNAME_FONTWYSIWYG )
275         {
276             DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtFontOptions_Impl::Notify()\nWho has changed the value type of \"Office.Common\\Font\\View\\ShowFontBoxWYSIWYG\"?" );
277             seqValues[nProperty] >>= m_bFontWYSIWYG;
278         }
279         #if OSL_DEBUG_LEVEL > 1
280         else DBG_ASSERT( sal_False, "SvtFontOptions_Impl::Notify()\nUnkown property detected ... I can't handle these!\n" );
281         #endif
282     }
283 }
284 
285 //*****************************************************************************************************************
286 //  public method
287 //*****************************************************************************************************************
Commit()288 void SvtFontOptions_Impl::Commit()
289 {
290     // Get names of supported properties, create a list for values and copy current values to it.
291     Sequence< OUString >    seqNames    = impl_GetPropertyNames();
292     sal_Int32               nCount      = seqNames.getLength();
293     Sequence< Any >         seqValues   ( nCount );
294     for( sal_Int32 nProperty=0; nProperty<nCount; ++nProperty )
295     {
296         switch( nProperty )
297         {
298             case PROPERTYHANDLE_REPLACEMENTTABLE    :   {
299                                                             seqValues[nProperty] <<= m_bReplacementTable;
300                                                         }
301                                                         break;
302             case PROPERTYHANDLE_FONTHISTORY         :   {
303                                                             seqValues[nProperty] <<= m_bFontHistory;
304                                                         }
305                                                         break;
306             case PROPERTYHANDLE_FONTWYSIWYG         :   {
307                                                             seqValues[nProperty] <<= m_bFontWYSIWYG;
308                                                         }
309                                                         break;
310         }
311     }
312     // Set properties in configuration.
313     PutProperties( seqNames, seqValues );
314 }
315 
316 //*****************************************************************************************************************
317 //  public method
318 //*****************************************************************************************************************
IsReplacementTableEnabled() const319 sal_Bool SvtFontOptions_Impl::IsReplacementTableEnabled() const
320 {
321     return m_bReplacementTable;
322 }
323 
324 //*****************************************************************************************************************
325 //  public method
326 //*****************************************************************************************************************
EnableReplacementTable(sal_Bool bState)327 void SvtFontOptions_Impl::EnableReplacementTable( sal_Bool bState )
328 {
329     m_bReplacementTable = bState;
330     SetModified();
331 }
332 
333 //*****************************************************************************************************************
334 //  public method
335 //*****************************************************************************************************************
IsFontHistoryEnabled() const336 sal_Bool SvtFontOptions_Impl::IsFontHistoryEnabled() const
337 {
338     return m_bFontHistory;
339 }
340 
341 //*****************************************************************************************************************
342 //  public method
343 //*****************************************************************************************************************
EnableFontHistory(sal_Bool bState)344 void SvtFontOptions_Impl::EnableFontHistory( sal_Bool bState )
345 {
346     m_bFontHistory = bState;
347     SetModified();
348 }
349 
350 //*****************************************************************************************************************
351 //  public method
352 //*****************************************************************************************************************
IsFontWYSIWYGEnabled() const353 sal_Bool SvtFontOptions_Impl::IsFontWYSIWYGEnabled() const
354 {
355     return m_bFontWYSIWYG;
356 }
357 
358 //*****************************************************************************************************************
359 //  public method
360 //*****************************************************************************************************************
EnableFontWYSIWYG(sal_Bool bState)361 void SvtFontOptions_Impl::EnableFontWYSIWYG( sal_Bool bState )
362 {
363     m_bFontWYSIWYG = bState;
364     SetModified();
365 }
366 
367 //*****************************************************************************************************************
368 //  private method
369 //*****************************************************************************************************************
impl_GetPropertyNames()370 Sequence< OUString > SvtFontOptions_Impl::impl_GetPropertyNames()
371 {
372     // Build static list of configuration key names.
373     static const OUString pProperties[] =
374     {
375         PROPERTYNAME_REPLACEMENTTABLE   ,
376         PROPERTYNAME_FONTHISTORY        ,
377         PROPERTYNAME_FONTWYSIWYG        ,
378     };
379     // Initialize return sequence with these list ...
380     static const Sequence< OUString > seqPropertyNames( pProperties, PROPERTYCOUNT );
381     // ... and return it.
382     return seqPropertyNames;
383 }
384 
385 //*****************************************************************************************************************
386 //  initialize static member
387 //  DON'T DO IT IN YOUR HEADER!
388 //  see definition for further informations
389 //*****************************************************************************************************************
390 SvtFontOptions_Impl*    SvtFontOptions::m_pDataContainer    = NULL  ;
391 sal_Int32               SvtFontOptions::m_nRefCount         = 0     ;
392 
393 //*****************************************************************************************************************
394 //  constructor
395 //*****************************************************************************************************************
SvtFontOptions()396 SvtFontOptions::SvtFontOptions()
397 {
398     // Global access, must be guarded (multithreading!).
399     MutexGuard aGuard( impl_GetOwnStaticMutex() );
400     // Increase ouer refcount ...
401     ++m_nRefCount;
402     // ... and initialize ouer data container only if it not already exist!
403     if( m_pDataContainer == NULL )
404     {
405         RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtFontOptions_Impl::ctor()");
406         m_pDataContainer = new SvtFontOptions_Impl;
407 
408         ItemHolder1::holdConfigItem(E_FONTOPTIONS);
409     }
410 }
411 
412 //*****************************************************************************************************************
413 //  destructor
414 //*****************************************************************************************************************
~SvtFontOptions()415 SvtFontOptions::~SvtFontOptions()
416 {
417     // Global access, must be guarded (multithreading!)
418     MutexGuard aGuard( impl_GetOwnStaticMutex() );
419     // Decrease ouer refcount.
420     --m_nRefCount;
421     // If last instance was deleted ...
422     // we must destroy ouer static data container!
423     if( m_nRefCount <= 0 )
424     {
425         delete m_pDataContainer;
426         m_pDataContainer = NULL;
427     }
428 }
429 
430 //*****************************************************************************************************************
431 //  public method
432 //*****************************************************************************************************************
IsReplacementTableEnabled() const433 sal_Bool SvtFontOptions::IsReplacementTableEnabled() const
434 {
435     MutexGuard aGuard( impl_GetOwnStaticMutex() );
436     return m_pDataContainer->IsReplacementTableEnabled();
437 }
438 
439 //*****************************************************************************************************************
440 //  public method
441 //*****************************************************************************************************************
EnableReplacementTable(sal_Bool bState)442 void SvtFontOptions::EnableReplacementTable( sal_Bool bState )
443 {
444     MutexGuard aGuard( impl_GetOwnStaticMutex() );
445     m_pDataContainer->EnableReplacementTable( bState );
446 }
447 
448 //*****************************************************************************************************************
449 //  public method
450 //*****************************************************************************************************************
IsFontHistoryEnabled() const451 sal_Bool SvtFontOptions::IsFontHistoryEnabled() const
452 {
453     MutexGuard aGuard( impl_GetOwnStaticMutex() );
454     return m_pDataContainer->IsFontHistoryEnabled();
455 }
456 
457 //*****************************************************************************************************************
458 //  public method
459 //*****************************************************************************************************************
EnableFontHistory(sal_Bool bState)460 void SvtFontOptions::EnableFontHistory( sal_Bool bState )
461 {
462     MutexGuard aGuard( impl_GetOwnStaticMutex() );
463     m_pDataContainer->EnableFontHistory( bState );
464 }
465 
466 //*****************************************************************************************************************
467 //  public method
468 //*****************************************************************************************************************
IsFontWYSIWYGEnabled() const469 sal_Bool SvtFontOptions::IsFontWYSIWYGEnabled() const
470 {
471     MutexGuard aGuard( impl_GetOwnStaticMutex() );
472     return m_pDataContainer->IsFontWYSIWYGEnabled();
473 }
474 
475 //*****************************************************************************************************************
476 //  public method
477 //*****************************************************************************************************************
EnableFontWYSIWYG(sal_Bool bState)478 void SvtFontOptions::EnableFontWYSIWYG( sal_Bool bState )
479 {
480     MutexGuard aGuard( impl_GetOwnStaticMutex() );
481     m_pDataContainer->EnableFontWYSIWYG( bState );
482 }
483 
484 //*****************************************************************************************************************
485 //  private method
486 //*****************************************************************************************************************
impl_GetOwnStaticMutex()487 Mutex& SvtFontOptions::impl_GetOwnStaticMutex()
488 {
489     // Initialize static mutex only for one time!
490     static Mutex* pMutex = NULL;
491     // If these method first called (Mutex not already exist!) ...
492     if( pMutex == NULL )
493     {
494         // ... we must create a new one. Protect follow code with the global mutex -
495         // It must be - we create a static variable!
496         MutexGuard aGuard( Mutex::getGlobalMutex() );
497         // We must check our pointer again - because it can be that another instance of ouer class will be fastr then these!
498         if( pMutex == NULL )
499         {
500             // Create the new mutex and set it for return on static variable.
501             static Mutex aMutex;
502             pMutex = &aMutex;
503         }
504     }
505     // Return new created or already existing mutex object.
506     return *pMutex;
507 }
508