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 //***************************************************************************************************************** 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 //***************************************************************************************************************** 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 //***************************************************************************************************************** 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 //***************************************************************************************************************** 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 //***************************************************************************************************************** 319 sal_Bool SvtFontOptions_Impl::IsReplacementTableEnabled() const 320 { 321 return m_bReplacementTable; 322 } 323 324 //***************************************************************************************************************** 325 // public method 326 //***************************************************************************************************************** 327 void SvtFontOptions_Impl::EnableReplacementTable( sal_Bool bState ) 328 { 329 m_bReplacementTable = bState; 330 SetModified(); 331 } 332 333 //***************************************************************************************************************** 334 // public method 335 //***************************************************************************************************************** 336 sal_Bool SvtFontOptions_Impl::IsFontHistoryEnabled() const 337 { 338 return m_bFontHistory; 339 } 340 341 //***************************************************************************************************************** 342 // public method 343 //***************************************************************************************************************** 344 void SvtFontOptions_Impl::EnableFontHistory( sal_Bool bState ) 345 { 346 m_bFontHistory = bState; 347 SetModified(); 348 } 349 350 //***************************************************************************************************************** 351 // public method 352 //***************************************************************************************************************** 353 sal_Bool SvtFontOptions_Impl::IsFontWYSIWYGEnabled() const 354 { 355 return m_bFontWYSIWYG; 356 } 357 358 //***************************************************************************************************************** 359 // public method 360 //***************************************************************************************************************** 361 void SvtFontOptions_Impl::EnableFontWYSIWYG( sal_Bool bState ) 362 { 363 m_bFontWYSIWYG = bState; 364 SetModified(); 365 } 366 367 //***************************************************************************************************************** 368 // private method 369 //***************************************************************************************************************** 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 //***************************************************************************************************************** 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 //***************************************************************************************************************** 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 //***************************************************************************************************************** 433 sal_Bool SvtFontOptions::IsReplacementTableEnabled() const 434 { 435 MutexGuard aGuard( impl_GetOwnStaticMutex() ); 436 return m_pDataContainer->IsReplacementTableEnabled(); 437 } 438 439 //***************************************************************************************************************** 440 // public method 441 //***************************************************************************************************************** 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 //***************************************************************************************************************** 451 sal_Bool SvtFontOptions::IsFontHistoryEnabled() const 452 { 453 MutexGuard aGuard( impl_GetOwnStaticMutex() ); 454 return m_pDataContainer->IsFontHistoryEnabled(); 455 } 456 457 //***************************************************************************************************************** 458 // public method 459 //***************************************************************************************************************** 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 //***************************************************************************************************************** 469 sal_Bool SvtFontOptions::IsFontWYSIWYGEnabled() const 470 { 471 MutexGuard aGuard( impl_GetOwnStaticMutex() ); 472 return m_pDataContainer->IsFontWYSIWYGEnabled(); 473 } 474 475 //***************************************************************************************************************** 476 // public method 477 //***************************************************************************************************************** 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 //***************************************************************************************************************** 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