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 //_________________________________________________________________________________________________________________ 27 // includes 28 //_________________________________________________________________________________________________________________ 29 30 #include <unotools/viewoptions.hxx> 31 #include <com/sun/star/uno/Any.hxx> 32 33 #include <hash_map> 34 #include <com/sun/star/beans/PropertyValue.hpp> 35 #include <com/sun/star/container/XNameContainer.hpp> 36 #include <com/sun/star/container/XNameAccess.hpp> 37 #include <com/sun/star/beans/XPropertySet.hpp> 38 #include <rtl/ustrbuf.hxx> 39 #include <unotools/configpathes.hxx> 40 #include <comphelper/configurationhelper.hxx> 41 #include <unotools/processfactory.hxx> 42 43 #include <itemholder1.hxx> 44 45 //_________________________________________________________________________________________________________________ 46 // namespaces 47 //_________________________________________________________________________________________________________________ 48 49 namespace css = ::com::sun::star; 50 51 //_________________________________________________________________________________________________________________ 52 // const 53 //_________________________________________________________________________________________________________________ 54 55 #ifdef CONST_ASCII 56 #error "Who define CONST_ASCII before! I use it to create const ascii strings ..." 57 #else 58 #define CONST_ASCII(SASCIIVALUE) ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SASCIIVALUE)) 59 #endif 60 61 #define PATHSEPERATOR CONST_ASCII("/") 62 63 #define PACKAGE_VIEWS CONST_ASCII("org.openoffice.Office.Views") 64 65 #define LIST_DIALOGS CONST_ASCII("Dialogs" ) 66 #define LIST_TABDIALOGS CONST_ASCII("TabDialogs") 67 #define LIST_TABPAGES CONST_ASCII("TabPages" ) 68 #define LIST_WINDOWS CONST_ASCII("Windows" ) 69 70 #define PROPERTY_WINDOWSTATE CONST_ASCII("WindowState") 71 #define PROPERTY_PAGEID CONST_ASCII("PageID" ) 72 #define PROPERTY_VISIBLE CONST_ASCII("Visible" ) 73 #define PROPERTY_USERDATA CONST_ASCII("UserData" ) 74 75 #define PROPCOUNT_DIALOGS 1 76 #define PROPCOUNT_TABDIALOGS 2 77 #define PROPCOUNT_TABPAGES 1 78 #define PROPCOUNT_WINDOWS 2 79 80 #define DEFAULT_WINDOWSTATE ::rtl::OUString() 81 #define DEFAULT_USERDATA css::uno::Sequence< css::beans::NamedValue >() 82 #define DEFAULT_PAGEID 0 83 #define DEFAULT_VISIBLE sal_False 84 85 //#define DEBUG_VIEWOPTIONS 86 87 #ifdef DEBUG_VIEWOPTIONS 88 #define _LOG_COUNTER_( _SVIEW_, _NREAD_, _NWRITE_ ) \ 89 { \ 90 FILE* pFile = fopen( "viewdbg.txt", "a" ); \ 91 fprintf( pFile, "%s[%d, %d]\n", ::rtl::OUStringToOString(_SVIEW_, RTL_TEXTENCODING_UTF8).getStr(), _NREAD_, _NWRITE_ ); \ 92 fclose( pFile ); \ 93 } 94 #endif // DEBUG_VIEWOPTIONS 95 96 #define SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION(SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION_PARAM_EXCEPTION) \ 97 { \ 98 ::rtl::OUStringBuffer sMsg(256); \ 99 sMsg.appendAscii("Unexpected exception catched. Original message was:\n\"" ); \ 100 sMsg.append (SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION_PARAM_EXCEPTION.Message); \ 101 sMsg.appendAscii("\"" ); \ 102 OSL_ENSURE(sal_False, ::rtl::OUStringToOString(sMsg.makeStringAndClear(), RTL_TEXTENCODING_UTF8).getStr()); \ 103 } 104 105 //_________________________________________________________________________________________________________________ 106 // initialization! 107 //_________________________________________________________________________________________________________________ 108 109 SvtViewOptionsBase_Impl* SvtViewOptions::m_pDataContainer_Dialogs = NULL ; 110 sal_Int32 SvtViewOptions::m_nRefCount_Dialogs = 0 ; 111 SvtViewOptionsBase_Impl* SvtViewOptions::m_pDataContainer_TabDialogs = NULL ; 112 sal_Int32 SvtViewOptions::m_nRefCount_TabDialogs = 0 ; 113 SvtViewOptionsBase_Impl* SvtViewOptions::m_pDataContainer_TabPages = NULL ; 114 sal_Int32 SvtViewOptions::m_nRefCount_TabPages = 0 ; 115 SvtViewOptionsBase_Impl* SvtViewOptions::m_pDataContainer_Windows = NULL ; 116 sal_Int32 SvtViewOptions::m_nRefCount_Windows = 0 ; 117 118 //_________________________________________________________________________________________________________________ 119 // private declarations! 120 //_________________________________________________________________________________________________________________ 121 122 /*-************************************************************************************************************//** 123 @descr declare one configuration item 124 These struct hold information about one view item. But not all member are used for all entries! 125 User must decide which information are usefull and which not. We are a container iztem only and doesnt 126 know anything about the context. 127 But; we support a feature: 128 decision between items with default values (should not realy exist in configuration!) 129 and items with real values - changed by user. So user can suppress saving of realy unused items 130 to disk - because; defaulted items could be restored on runtime without reading from disk!!! 131 And if only items with valid information was written to cfg - we mustn't read so much and save time. 132 So we start with an member m_bDefault=True and reset it to False after first set-call. 133 Deficiencies of these solution - we cant allow direct read/write access to our member. We must 134 support it by set/get-methods ... 135 *//*-*************************************************************************************************************/ 136 class IMPL_TViewData 137 { 138 public: 139 //--------------------------------------------------------------------------------------------------------- 140 // create "default" item 141 IMPL_TViewData() 142 { 143 m_sWindowState = DEFAULT_WINDOWSTATE ; 144 m_lUserData = DEFAULT_USERDATA ; 145 m_nPageID = DEFAULT_PAGEID ; 146 m_bVisible = DEFAULT_VISIBLE ; 147 148 m_bDefault = sal_True ; 149 } 150 151 //--------------------------------------------------------------------------------------------------------- 152 // write access - with reseting of default state 153 void setWindowState( const ::rtl::OUString& sValue ) 154 { 155 m_bDefault = ( 156 ( m_bDefault == sal_True ) && 157 ( sValue == DEFAULT_WINDOWSTATE ) 158 ); 159 m_sWindowState = sValue; 160 } 161 162 //--------------------------------------------------------------------------------------------------------- 163 void setUserData( const css::uno::Sequence< css::beans::NamedValue >& lValue ) 164 { 165 m_bDefault = ( 166 ( m_bDefault == sal_True ) && 167 ( lValue == DEFAULT_USERDATA ) 168 ); 169 m_lUserData = lValue; 170 } 171 172 //--------------------------------------------------------------------------------------------------------- 173 void setPageID( sal_Int32 nValue ) 174 { 175 m_bDefault = ( 176 ( m_bDefault == sal_True ) && 177 ( nValue == DEFAULT_PAGEID ) 178 ); 179 m_nPageID = nValue; 180 } 181 182 //--------------------------------------------------------------------------------------------------------- 183 void setVisible( sal_Bool bValue ) 184 { 185 m_bDefault = ( 186 ( m_bDefault == sal_True ) && 187 ( bValue == DEFAULT_VISIBLE ) 188 ); 189 m_bVisible = bValue; 190 } 191 192 //--------------------------------------------------------------------------------------------------------- 193 // read access 194 ::rtl::OUString getWindowState() { return m_sWindowState; } 195 css::uno::Sequence< css::beans::NamedValue > getUserData () { return m_lUserData ; } 196 sal_Int32 getPageID () { return m_nPageID ; } 197 sal_Bool getVisible () { return m_bVisible ; } 198 199 //--------------------------------------------------------------------------------------------------------- 200 // special operation for easy access on user data 201 void setUserItem( const ::rtl::OUString& sName , 202 const css::uno::Any& aValue ) 203 { 204 // we change UserData in every case! 205 // a) we change already existing item 206 // or b) we add a new one 207 m_bDefault = sal_False; 208 209 sal_Bool bExist = sal_False; 210 sal_Int32 nCount = m_lUserData.getLength(); 211 212 // change it, if it already exist ... 213 for( sal_Int32 nStep=0; nStep<nCount; ++nStep ) 214 { 215 if( m_lUserData[nStep].Name == sName ) 216 { 217 m_lUserData[nStep].Value = aValue ; 218 bExist = sal_True; 219 break; 220 } 221 } 222 223 // ... or create new list item 224 if( bExist == sal_False ) 225 { 226 m_lUserData.realloc( nCount+1 ); 227 m_lUserData[nCount].Name = sName ; 228 m_lUserData[nCount].Value = aValue ; 229 } 230 } 231 232 //--------------------------------------------------------------------------------------------------------- 233 css::uno::Any getUserItem( const ::rtl::OUString& sName ) 234 { 235 // default value - if item not exist! 236 css::uno::Any aValue; 237 238 sal_Int32 nCount = m_lUserData.getLength(); 239 for( sal_Int32 nStep=0; nStep<nCount; ++nStep ) 240 { 241 if( m_lUserData[nStep].Name == sName ) 242 { 243 aValue = m_lUserData[nStep].Value; 244 break; 245 } 246 } 247 return aValue; 248 } 249 250 //--------------------------------------------------------------------------------------------------------- 251 // check for default items 252 sal_Bool isDefault() { return m_bDefault; } 253 254 private: 255 ::rtl::OUString m_sWindowState ; 256 css::uno::Sequence< css::beans::NamedValue > m_lUserData ; 257 sal_Int32 m_nPageID ; 258 sal_Bool m_bVisible ; 259 260 sal_Bool m_bDefault ; 261 }; 262 263 struct IMPL_TStringHashCode 264 { 265 size_t operator()(const ::rtl::OUString& sString) const 266 { 267 return sString.hashCode(); 268 } 269 }; 270 271 typedef ::std::hash_map< ::rtl::OUString , 272 IMPL_TViewData , 273 IMPL_TStringHashCode , 274 ::std::equal_to< ::rtl::OUString > > IMPL_TViewHash; 275 276 /*-************************************************************************************************************//** 277 @descr Implement base data container for view options elements. 278 Every item support ALL possible configuration informations. 279 But not every superclass should use them! Because some view types don't 280 have it realy. 281 282 @attention We implement a write-througt-cache! We use it for reading - but write all changes directly to 283 configuration. (changes are made on internal cache too!). So it's easier to distinguish 284 between added/changed/removed elements without any complex mask or bool flag informations. 285 Caches from configuration and our own one are synchronized every time - if we do so. 286 *//*-*************************************************************************************************************/ 287 class SvtViewOptionsBase_Impl 288 { 289 //------------------------------------------------------------------------------------------------------------- 290 public: 291 SvtViewOptionsBase_Impl ( const ::rtl::OUString& sList ); 292 virtual ~SvtViewOptionsBase_Impl ( ); 293 sal_Bool Exists ( const ::rtl::OUString& sName ); 294 sal_Bool Delete ( const ::rtl::OUString& sName ); 295 ::rtl::OUString GetWindowState ( const ::rtl::OUString& sName ); 296 void SetWindowState ( const ::rtl::OUString& sName , 297 const ::rtl::OUString& sState ); 298 css::uno::Sequence< css::beans::NamedValue > GetUserData ( const ::rtl::OUString& sName ); 299 void SetUserData ( const ::rtl::OUString& sName , 300 const css::uno::Sequence< css::beans::NamedValue >& lData ); 301 sal_Int32 GetPageID ( const ::rtl::OUString& sName ); 302 void SetPageID ( const ::rtl::OUString& sName , 303 sal_Int32 nID ); 304 sal_Bool GetVisible ( const ::rtl::OUString& sName ); 305 void SetVisible ( const ::rtl::OUString& sName , 306 sal_Bool bVisible ); 307 css::uno::Any GetUserItem ( const ::rtl::OUString& sName , 308 const ::rtl::OUString& sItem ); 309 void SetUserItem ( const ::rtl::OUString& sName , 310 const ::rtl::OUString& sItem , 311 const css::uno::Any& aValue ); 312 313 //------------------------------------------------------------------------------------------------------------- 314 private: 315 css::uno::Reference< css::uno::XInterface > impl_getSetNode( const ::rtl::OUString& sNode , 316 sal_Bool bCreateIfMissing); 317 318 //------------------------------------------------------------------------------------------------------------- 319 private: 320 ::rtl::OUString m_sListName; 321 css::uno::Reference< css::container::XNameAccess > m_xRoot; 322 css::uno::Reference< css::container::XNameAccess > m_xSet; 323 324 #ifdef DEBUG_VIEWOPTIONS 325 sal_Int32 m_nReadCount ; 326 sal_Int32 m_nWriteCount ; 327 #endif 328 }; 329 330 /*-************************************************************************************************************//** 331 @descr Implement the base data container. 332 *//*-*************************************************************************************************************/ 333 334 /*-************************************************************************************************************//** 335 @short ctor 336 @descr We use it to open right configuration file and let configuration objects fill her caches. 337 Then we read all existing entries from right list and cached it inside our object too. 338 Normaly we should enable notifications for changes on these values too ... but these feature 339 isn't full implemented in the moment. 340 341 @seealso baseclass ::utl::ConfigItem 342 @seealso method Notify() 343 344 @param - 345 @return - 346 347 @last change 19.10.2001 07:54 348 *//*-*************************************************************************************************************/ 349 SvtViewOptionsBase_Impl::SvtViewOptionsBase_Impl( const ::rtl::OUString& sList ) 350 : m_sListName ( sList ) // we must know, which view type we must support 351 #ifdef DEBUG_VIEWOPTIONS 352 , m_nReadCount ( 0 ) 353 , m_nWriteCount( 0 ) 354 #endif 355 { 356 try 357 { 358 m_xRoot = css::uno::Reference< css::container::XNameAccess >( 359 ::comphelper::ConfigurationHelper::openConfig( 360 ::utl::getProcessServiceFactory(), 361 PACKAGE_VIEWS, 362 ::comphelper::ConfigurationHelper::E_STANDARD), 363 css::uno::UNO_QUERY); 364 if (m_xRoot.is()) 365 m_xRoot->getByName(sList) >>= m_xSet; 366 } 367 catch(const css::uno::Exception& ex) 368 { 369 m_xRoot.clear(); 370 m_xSet.clear(); 371 372 SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION(ex) 373 } 374 } 375 376 /*-************************************************************************************************************//** 377 @short dtor 378 @descr clean up something 379 380 @attention We implement a write through cache! So we mustn't do it realy. All changes was written to cfg directly. 381 Commit isn't neccessary then. 382 383 @seealso baseclass ::utl::ConfigItem 384 @seealso method IsModified() 385 @seealso method SetModified() 386 @seealso method Commit() 387 388 @param - 389 @return - 390 391 @last change 19.10.2001 08:02 392 *//*-*************************************************************************************************************/ 393 SvtViewOptionsBase_Impl::~SvtViewOptionsBase_Impl() 394 { 395 // dont flush configuration changes here to m_xRoot. 396 // That must be done inside every SetXXX() method already ! 397 // Here its to late - DisposedExceptions from used configuration access can occure otherwise. 398 399 m_xRoot.clear(); 400 m_xSet.clear(); 401 402 #ifdef DEBUG_VIEWOPTIONS 403 _LOG_COUNTER_( m_sListName, m_nReadCount, m_nWriteCount ) 404 #endif // DEBUG_VIEWOPTIONS 405 } 406 407 /*-************************************************************************************************************//** 408 @short checks for already existing entries 409 @descr If user don't know, if an entry already exist - he can get this information by calling this method. 410 411 @seealso member m_aList 412 413 @param "sName", name of entry to check exist state 414 @return true , if item exist 415 false, otherwise 416 *//*-*************************************************************************************************************/ 417 sal_Bool SvtViewOptionsBase_Impl::Exists( const ::rtl::OUString& sName ) 418 { 419 sal_Bool bExists = sal_False; 420 421 try 422 { 423 if (m_xSet.is()) 424 bExists = m_xSet->hasByName(sName); 425 } 426 catch(const css::uno::Exception& ex) 427 { 428 bExists = sal_False; 429 SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION(ex) 430 } 431 432 return bExists; 433 } 434 435 /*-************************************************************************************************************//** 436 @short delete entry 437 @descr Use it to delete set entry by given name. 438 439 @seealso member m_aList 440 441 @param "sName", name of entry to delete it 442 @return true , if item not exist(!) or could be deleted (should be the same!) 443 false, otherwise 444 *//*-*************************************************************************************************************/ 445 sal_Bool SvtViewOptionsBase_Impl::Delete( const ::rtl::OUString& sName ) 446 { 447 #ifdef DEBUG_VIEWOPTIONS 448 ++m_nWriteCount; 449 #endif 450 451 sal_Bool bDeleted = sal_False; 452 try 453 { 454 css::uno::Reference< css::container::XNameContainer > xSet(m_xSet, css::uno::UNO_QUERY_THROW); 455 xSet->removeByName(sName); 456 bDeleted = sal_True; 457 ::comphelper::ConfigurationHelper::flush(m_xRoot); 458 } 459 catch(const css::container::NoSuchElementException&) 460 { bDeleted = sal_True; } 461 catch(const css::uno::Exception& ex) 462 { 463 bDeleted = sal_False; 464 SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION(ex) 465 } 466 467 return bDeleted; 468 } 469 470 /*-************************************************************************************************************//** 471 @short read/write access to cache view items and her properties 472 @descr Follow methods support read/write access to all cache view items. 473 474 @seealso member m_sList 475 476 @param - 477 @return - 478 *//*-*************************************************************************************************************/ 479 ::rtl::OUString SvtViewOptionsBase_Impl::GetWindowState( const ::rtl::OUString& sName ) 480 { 481 #ifdef DEBUG_VIEWOPTIONS 482 ++m_nReadCount; 483 #endif 484 485 ::rtl::OUString sWindowState; 486 try 487 { 488 css::uno::Reference< css::beans::XPropertySet > xNode( 489 impl_getSetNode(sName, sal_False), 490 css::uno::UNO_QUERY); 491 if (xNode.is()) 492 xNode->getPropertyValue(PROPERTY_WINDOWSTATE) >>= sWindowState; 493 } 494 catch(const css::uno::Exception& ex) 495 { 496 sWindowState = ::rtl::OUString(); 497 SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION(ex) 498 } 499 500 return sWindowState; 501 } 502 503 //***************************************************************************************************************** 504 void SvtViewOptionsBase_Impl::SetWindowState( const ::rtl::OUString& sName , 505 const ::rtl::OUString& sState ) 506 { 507 #ifdef DEBUG_VIEWOPTIONS 508 ++m_nWriteCount; 509 #endif 510 511 try 512 { 513 css::uno::Reference< css::beans::XPropertySet > xNode( 514 impl_getSetNode(sName, sal_True), 515 css::uno::UNO_QUERY_THROW); 516 xNode->setPropertyValue(PROPERTY_WINDOWSTATE, css::uno::makeAny(sState)); 517 ::comphelper::ConfigurationHelper::flush(m_xRoot); 518 } 519 catch(const css::uno::Exception& ex) 520 { 521 SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION(ex) 522 } 523 } 524 525 //***************************************************************************************************************** 526 css::uno::Sequence< css::beans::NamedValue > SvtViewOptionsBase_Impl::GetUserData( const ::rtl::OUString& sName ) 527 { 528 #ifdef DEBUG_VIEWOPTIONS 529 ++m_nReadCount; 530 #endif 531 532 try 533 { 534 css::uno::Reference< css::container::XNameAccess > xNode( 535 impl_getSetNode(sName, sal_False), 536 css::uno::UNO_QUERY); // no _THROW ! because we dont create missing items here. So we have to live with zero references .-) 537 css::uno::Reference< css::container::XNameAccess > xUserData; 538 if (xNode.is()) 539 xNode->getByName(PROPERTY_USERDATA) >>= xUserData; 540 if (xUserData.is()) 541 { 542 const css::uno::Sequence< ::rtl::OUString > lNames = xUserData->getElementNames(); 543 const ::rtl::OUString* pNames = lNames.getConstArray(); 544 sal_Int32 c = lNames.getLength(); 545 sal_Int32 i = 0; 546 css::uno::Sequence< css::beans::NamedValue > lUserData(c); 547 548 for (i=0; i<c; ++i) 549 { 550 lUserData[i].Name = pNames[i]; 551 lUserData[i].Value = xUserData->getByName(pNames[i]); 552 } 553 554 return lUserData; 555 } 556 } 557 catch(const css::uno::Exception& ex) 558 { 559 SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION(ex) 560 } 561 562 return css::uno::Sequence< css::beans::NamedValue >(); 563 } 564 565 //***************************************************************************************************************** 566 void SvtViewOptionsBase_Impl::SetUserData( const ::rtl::OUString& sName , 567 const css::uno::Sequence< css::beans::NamedValue >& lData ) 568 { 569 #ifdef DEBUG_VIEWOPTIONS 570 ++m_nWriteCount; 571 #endif 572 573 try 574 { 575 css::uno::Reference< css::container::XNameAccess > xNode( 576 impl_getSetNode(sName, sal_True), 577 css::uno::UNO_QUERY_THROW); 578 css::uno::Reference< css::container::XNameContainer > xUserData; 579 xNode->getByName(PROPERTY_USERDATA) >>= xUserData; 580 if (xUserData.is()) 581 { 582 const css::beans::NamedValue* pData = lData.getConstArray(); 583 sal_Int32 c = lData.getLength(); 584 sal_Int32 i = 0; 585 for (i=0; i<c; ++i) 586 { 587 if (xUserData->hasByName(pData[i].Name)) 588 xUserData->replaceByName(pData[i].Name, pData[i].Value); 589 else 590 xUserData->insertByName(pData[i].Name, pData[i].Value); 591 } 592 } 593 ::comphelper::ConfigurationHelper::flush(m_xRoot); 594 } 595 catch(const css::uno::Exception& ex) 596 { 597 SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION(ex) 598 } 599 } 600 601 //***************************************************************************************************************** 602 css::uno::Any SvtViewOptionsBase_Impl::GetUserItem( const ::rtl::OUString& sName , 603 const ::rtl::OUString& sItem ) 604 { 605 #ifdef DEBUG_VIEWOPTIONS 606 ++m_nReadCount; 607 #endif 608 609 css::uno::Any aItem; 610 try 611 { 612 css::uno::Reference< css::container::XNameAccess > xNode( 613 impl_getSetNode(sName, sal_False), 614 css::uno::UNO_QUERY); 615 css::uno::Reference< css::container::XNameAccess > xUserData; 616 if (xNode.is()) 617 xNode->getByName(PROPERTY_USERDATA) >>= xUserData; 618 if (xUserData.is()) 619 aItem = xUserData->getByName(sItem); 620 } 621 catch(const css::container::NoSuchElementException&) 622 { aItem.clear(); } 623 catch(const css::uno::Exception& ex) 624 { 625 aItem.clear(); 626 SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION(ex) 627 } 628 629 return aItem; 630 } 631 632 //***************************************************************************************************************** 633 void SvtViewOptionsBase_Impl::SetUserItem( const ::rtl::OUString& sName , 634 const ::rtl::OUString& sItem , 635 const css::uno::Any& aValue ) 636 { 637 #ifdef DEBUG_VIEWOPTIONS 638 ++m_nWriteCount; 639 #endif 640 641 try 642 { 643 css::uno::Reference< css::container::XNameAccess > xNode( 644 impl_getSetNode(sName, sal_True), 645 css::uno::UNO_QUERY_THROW); 646 css::uno::Reference< css::container::XNameContainer > xUserData; 647 xNode->getByName(PROPERTY_USERDATA) >>= xUserData; 648 if (xUserData.is()) 649 { 650 if (xUserData->hasByName(sItem)) 651 xUserData->replaceByName(sItem, aValue); 652 else 653 xUserData->insertByName(sItem, aValue); 654 } 655 ::comphelper::ConfigurationHelper::flush(m_xRoot); 656 } 657 catch(const css::uno::Exception& ex) 658 { 659 SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION(ex) 660 } 661 } 662 663 //***************************************************************************************************************** 664 sal_Int32 SvtViewOptionsBase_Impl::GetPageID( const ::rtl::OUString& sName ) 665 { 666 #ifdef DEBUG_VIEWOPTIONS 667 ++m_nReadCount; 668 #endif 669 670 sal_Int32 nID = 0; 671 try 672 { 673 css::uno::Reference< css::beans::XPropertySet > xNode( 674 impl_getSetNode(sName, sal_False), 675 css::uno::UNO_QUERY); 676 if (xNode.is()) 677 xNode->getPropertyValue(PROPERTY_PAGEID) >>= nID; 678 } 679 catch(const css::uno::Exception& ex) 680 { 681 nID = 0; 682 SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION(ex) 683 } 684 685 return nID; 686 } 687 688 //***************************************************************************************************************** 689 void SvtViewOptionsBase_Impl::SetPageID( const ::rtl::OUString& sName , 690 sal_Int32 nID ) 691 { 692 #ifdef DEBUG_VIEWOPTIONS 693 ++m_nWriteCount; 694 #endif 695 696 try 697 { 698 css::uno::Reference< css::beans::XPropertySet > xNode( 699 impl_getSetNode(sName, sal_True), 700 css::uno::UNO_QUERY_THROW); 701 xNode->setPropertyValue(PROPERTY_PAGEID, css::uno::makeAny(nID)); 702 ::comphelper::ConfigurationHelper::flush(m_xRoot); 703 } 704 catch(const css::uno::Exception& ex) 705 { 706 SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION(ex) 707 } 708 } 709 710 //***************************************************************************************************************** 711 sal_Bool SvtViewOptionsBase_Impl::GetVisible( const ::rtl::OUString& sName ) 712 { 713 #ifdef DEBUG_VIEWOPTIONS 714 ++m_nReadCount; 715 #endif 716 717 sal_Bool bVisible = sal_False; 718 try 719 { 720 css::uno::Reference< css::beans::XPropertySet > xNode( 721 impl_getSetNode(sName, sal_False), 722 css::uno::UNO_QUERY); 723 if (xNode.is()) 724 xNode->getPropertyValue(PROPERTY_VISIBLE) >>= bVisible; 725 } 726 catch(const css::uno::Exception& ex) 727 { 728 bVisible = sal_False; 729 SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION(ex) 730 } 731 732 return bVisible; 733 } 734 735 //***************************************************************************************************************** 736 void SvtViewOptionsBase_Impl::SetVisible( const ::rtl::OUString& sName , 737 sal_Bool bVisible ) 738 { 739 #ifdef DEBUG_VIEWOPTIONS 740 ++m_nWriteCount; 741 #endif 742 743 try 744 { 745 css::uno::Reference< css::beans::XPropertySet > xNode( 746 impl_getSetNode(sName, sal_True), 747 css::uno::UNO_QUERY_THROW); 748 xNode->setPropertyValue(PROPERTY_VISIBLE, css::uno::makeAny(bVisible)); 749 ::comphelper::ConfigurationHelper::flush(m_xRoot); 750 } 751 catch(const css::uno::Exception& ex) 752 { 753 SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION(ex) 754 } 755 } 756 757 /*-************************************************************************************************************//** 758 @short create new set node with default values on disk 759 @descr To create a new UserData item - the super node of these property must already exist! 760 You can call this method to create these new entry with default values and change UserData then. 761 762 @seealso method impl_writeDirectProp() 763 764 @param "sNode", name of new entry 765 @return - 766 767 @last change 19.10.2001 08:42 768 *//*-*************************************************************************************************************/ 769 css::uno::Reference< css::uno::XInterface > SvtViewOptionsBase_Impl::impl_getSetNode( const ::rtl::OUString& sNode , 770 sal_Bool bCreateIfMissing) 771 { 772 css::uno::Reference< css::uno::XInterface > xNode; 773 774 try 775 { 776 if (bCreateIfMissing) 777 xNode = ::comphelper::ConfigurationHelper::makeSureSetNodeExists(m_xRoot, m_sListName, sNode); 778 else 779 { 780 if (m_xSet.is() && m_xSet->hasByName(sNode) ) 781 m_xSet->getByName(sNode) >>= xNode; 782 } 783 } 784 catch(const css::container::NoSuchElementException&) 785 { xNode.clear(); } 786 catch(const css::uno::Exception& ex) 787 { 788 xNode.clear(); 789 SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION(ex) 790 } 791 792 return xNode; 793 } 794 795 //_________________________________________________________________________________________________________________ 796 // definitions 797 //_________________________________________________________________________________________________________________ 798 799 //***************************************************************************************************************** 800 // constructor 801 //***************************************************************************************************************** 802 SvtViewOptions::SvtViewOptions( EViewType eType , 803 const ::rtl::OUString& sViewName ) 804 : m_eViewType ( eType ) 805 , m_sViewName ( sViewName ) 806 { 807 // Global access, must be guarded (multithreading!) 808 ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); 809 810 // Search for right dat container for this view type and initialize right data container or set right ref count! 811 switch( eType ) 812 { 813 case E_DIALOG : { 814 // Increase ref count for dialog data container first. 815 ++m_nRefCount_Dialogs; 816 // If these instance the first user of the dialog data container - create these impl static container! 817 if( m_nRefCount_Dialogs == 1 ) 818 { 819 //m_pDataContainer_Dialogs = new SvtViewDialogOptions_Impl( LIST_DIALOGS ); 820 m_pDataContainer_Dialogs = new SvtViewOptionsBase_Impl( LIST_DIALOGS ); 821 ItemHolder1::holdConfigItem(E_VIEWOPTIONS_DIALOG); 822 } 823 } 824 break; 825 case E_TABDIALOG : { 826 // Increase ref count for tab-dialog data container first. 827 ++m_nRefCount_TabDialogs; 828 // If these instance the first user of the tab-dialog data container - create these impl static container! 829 if( m_nRefCount_TabDialogs == 1 ) 830 { 831 m_pDataContainer_TabDialogs = new SvtViewOptionsBase_Impl( LIST_TABDIALOGS ); 832 ItemHolder1::holdConfigItem(E_VIEWOPTIONS_TABDIALOG); 833 } 834 } 835 break; 836 case E_TABPAGE : { 837 // Increase ref count for tab-page data container first. 838 ++m_nRefCount_TabPages; 839 // If these instance the first user of the tab-page data container - create these impl static container! 840 if( m_nRefCount_TabPages == 1 ) 841 { 842 m_pDataContainer_TabPages = new SvtViewOptionsBase_Impl( LIST_TABPAGES ); 843 ItemHolder1::holdConfigItem(E_VIEWOPTIONS_TABPAGE); 844 } 845 } 846 break; 847 case E_WINDOW : { 848 // Increase ref count for window data container first. 849 ++m_nRefCount_Windows; 850 // If these instance the first user of the window data container - create these impl static container! 851 if( m_nRefCount_Windows == 1 ) 852 { 853 m_pDataContainer_Windows = new SvtViewOptionsBase_Impl( LIST_WINDOWS ); 854 ItemHolder1::holdConfigItem(E_VIEWOPTIONS_WINDOW); 855 } 856 } 857 break; 858 default : OSL_ENSURE( sal_False, "SvtViewOptions::SvtViewOptions()\nThese view type is unknown! All following calls at these instance will do nothing!\n" ); 859 } 860 } 861 862 //***************************************************************************************************************** 863 // destructor 864 //***************************************************************************************************************** 865 SvtViewOptions::~SvtViewOptions() 866 { 867 // Global access, must be guarded (multithreading!) 868 ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); 869 870 // Search for right dat container for this view type and deinitialize right data container or set right ref count! 871 switch( m_eViewType ) 872 { 873 case E_DIALOG : { 874 // Decrease ref count for dialog data container first. 875 --m_nRefCount_Dialogs; 876 // If these instance the last user of the dialog data container - delete these impl static container! 877 if( m_nRefCount_Dialogs == 0 ) 878 { 879 delete m_pDataContainer_Dialogs; 880 m_pDataContainer_Dialogs = NULL; 881 } 882 } 883 break; 884 case E_TABDIALOG : { 885 // Decrease ref count for tab-dialog data container first. 886 --m_nRefCount_TabDialogs; 887 // If these instance the last user of the tab-dialog data container - delete these impl static container! 888 if( m_nRefCount_TabDialogs == 0 ) 889 { 890 delete m_pDataContainer_TabDialogs; 891 m_pDataContainer_TabDialogs = NULL; 892 } 893 } 894 break; 895 case E_TABPAGE : { 896 // Decrease ref count for tab-page data container first. 897 --m_nRefCount_TabPages; 898 // If these instance the last user of the tab-page data container - delete these impl static container! 899 if( m_nRefCount_TabPages == 0 ) 900 { 901 delete m_pDataContainer_TabPages; 902 m_pDataContainer_TabPages = NULL; 903 } 904 } 905 break; 906 case E_WINDOW : { 907 // Decrease ref count for window data container first. 908 --m_nRefCount_Windows; 909 // If these instance the last user of the window data container - delete these impl static container! 910 if( m_nRefCount_Windows == 0 ) 911 { 912 delete m_pDataContainer_Windows; 913 m_pDataContainer_Windows = NULL; 914 } 915 } 916 break; 917 } 918 } 919 920 //***************************************************************************************************************** 921 // public method 922 //***************************************************************************************************************** 923 sal_Bool SvtViewOptions::Exists() const 924 { 925 // Ready for multithreading 926 ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); 927 928 sal_Bool bExists = sal_False; 929 switch( m_eViewType ) 930 { 931 case E_DIALOG : { 932 bExists = m_pDataContainer_Dialogs->Exists( m_sViewName ); 933 } 934 break; 935 case E_TABDIALOG : { 936 bExists = m_pDataContainer_TabDialogs->Exists( m_sViewName ); 937 } 938 break; 939 case E_TABPAGE : { 940 bExists = m_pDataContainer_TabPages->Exists( m_sViewName ); 941 } 942 break; 943 case E_WINDOW : { 944 bExists = m_pDataContainer_Windows->Exists( m_sViewName ); 945 } 946 break; 947 } 948 return bExists; 949 } 950 951 //***************************************************************************************************************** 952 // public method 953 //***************************************************************************************************************** 954 sal_Bool SvtViewOptions::Delete() 955 { 956 // Ready for multithreading 957 ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); 958 959 sal_Bool bState = sal_False; 960 switch( m_eViewType ) 961 { 962 case E_DIALOG : { 963 bState = m_pDataContainer_Dialogs->Delete( m_sViewName ); 964 } 965 break; 966 case E_TABDIALOG : { 967 bState = m_pDataContainer_TabDialogs->Delete( m_sViewName ); 968 } 969 break; 970 case E_TABPAGE : { 971 bState = m_pDataContainer_TabPages->Delete( m_sViewName ); 972 } 973 break; 974 case E_WINDOW : { 975 bState = m_pDataContainer_Windows->Delete( m_sViewName ); 976 } 977 break; 978 } 979 return bState; 980 } 981 982 //***************************************************************************************************************** 983 // public method 984 //***************************************************************************************************************** 985 ::rtl::OUString SvtViewOptions::GetWindowState() const 986 { 987 // Ready for multithreading 988 ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); 989 990 ::rtl::OUString sState; 991 switch( m_eViewType ) 992 { 993 case E_DIALOG : { 994 sState = m_pDataContainer_Dialogs->GetWindowState( m_sViewName ); 995 } 996 break; 997 case E_TABDIALOG : { 998 sState = m_pDataContainer_TabDialogs->GetWindowState( m_sViewName ); 999 } 1000 break; 1001 case E_TABPAGE : { 1002 sState = m_pDataContainer_TabPages->GetWindowState( m_sViewName ); 1003 } 1004 break; 1005 case E_WINDOW : { 1006 sState = m_pDataContainer_Windows->GetWindowState( m_sViewName ); 1007 } 1008 break; 1009 } 1010 return sState; 1011 } 1012 1013 //***************************************************************************************************************** 1014 // public method 1015 //***************************************************************************************************************** 1016 void SvtViewOptions::SetWindowState( const ::rtl::OUString& sState ) 1017 { 1018 // Ready for multithreading 1019 ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); 1020 1021 switch( m_eViewType ) 1022 { 1023 case E_DIALOG : { 1024 m_pDataContainer_Dialogs->SetWindowState( m_sViewName, sState ); 1025 } 1026 break; 1027 case E_TABDIALOG : { 1028 m_pDataContainer_TabDialogs->SetWindowState( m_sViewName, sState ); 1029 } 1030 break; 1031 case E_TABPAGE : { 1032 m_pDataContainer_TabPages->SetWindowState( m_sViewName, sState ); 1033 } 1034 break; 1035 case E_WINDOW : { 1036 m_pDataContainer_Windows->SetWindowState( m_sViewName, sState ); 1037 } 1038 break; 1039 } 1040 } 1041 1042 //***************************************************************************************************************** 1043 // public method 1044 //***************************************************************************************************************** 1045 sal_Int32 SvtViewOptions::GetPageID() const 1046 { 1047 // Ready for multithreading 1048 ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); 1049 1050 // Safe impossible cases. 1051 // These call isn't allowed for dialogs, tab-pages or windows! 1052 OSL_ENSURE( !(m_eViewType==E_DIALOG||m_eViewType==E_TABPAGE||m_eViewType==E_WINDOW), "SvtViewOptions::GetPageID()\nCall not allowed for Dialogs, TabPages or Windows! I do nothing!\n" ); 1053 1054 sal_Int32 nID = 0; 1055 if( m_eViewType == E_TABDIALOG ) 1056 nID = m_pDataContainer_TabDialogs->GetPageID( m_sViewName ); 1057 return nID; 1058 } 1059 1060 //***************************************************************************************************************** 1061 // public method 1062 //***************************************************************************************************************** 1063 void SvtViewOptions::SetPageID( sal_Int32 nID ) 1064 { 1065 // Ready for multithreading 1066 ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); 1067 1068 // Safe impossible cases. 1069 // These call isn't allowed for dialogs, tab-pages or windows! 1070 OSL_ENSURE( !(m_eViewType==E_DIALOG||m_eViewType==E_TABPAGE||m_eViewType==E_WINDOW), "SvtViewOptions::SetPageID()\nCall not allowed for Dialogs, TabPages or Windows! I do nothing!\n" ); 1071 1072 if( m_eViewType == E_TABDIALOG ) 1073 m_pDataContainer_TabDialogs->SetPageID( m_sViewName, nID ); 1074 } 1075 1076 //***************************************************************************************************************** 1077 // public method 1078 //***************************************************************************************************************** 1079 sal_Bool SvtViewOptions::IsVisible() const 1080 { 1081 // Ready for multithreading 1082 ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); 1083 1084 // Safe impossible cases. 1085 // These call isn't allowed for dialogs, tab-dialogs or tab-pages! 1086 OSL_ENSURE( !(m_eViewType==E_DIALOG||m_eViewType==E_TABDIALOG||m_eViewType==E_TABPAGE), "SvtViewOptions::IsVisible()\nCall not allowed for Dialogs, TabDialogs or TabPages! I do nothing!\n" ); 1087 1088 sal_Bool bState = sal_False; 1089 if( m_eViewType == E_WINDOW ) 1090 bState = m_pDataContainer_Windows->GetVisible( m_sViewName ); 1091 1092 return bState; 1093 } 1094 1095 //***************************************************************************************************************** 1096 // public method 1097 //***************************************************************************************************************** 1098 void SvtViewOptions::SetVisible( sal_Bool bState ) 1099 { 1100 // Ready for multithreading 1101 ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); 1102 1103 // Safe impossible cases. 1104 // These call isn't allowed for dialogs, tab-dialogs or tab-pages! 1105 OSL_ENSURE( !(m_eViewType==E_DIALOG||m_eViewType==E_TABDIALOG||m_eViewType==E_TABPAGE), "SvtViewOptions::SetVisible()\nCall not allowed for Dialogs, TabDialogs or TabPages! I do nothing!\n" ); 1106 1107 if( m_eViewType == E_WINDOW ) 1108 m_pDataContainer_Windows->SetVisible( m_sViewName, bState ); 1109 } 1110 1111 //***************************************************************************************************************** 1112 css::uno::Sequence< css::beans::NamedValue > SvtViewOptions::GetUserData() const 1113 { 1114 // Ready for multithreading 1115 ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); 1116 1117 css::uno::Sequence< css::beans::NamedValue > lData; 1118 switch( m_eViewType ) 1119 { 1120 case E_DIALOG : { 1121 lData = m_pDataContainer_Dialogs->GetUserData( m_sViewName ); 1122 } 1123 break; 1124 case E_TABDIALOG : { 1125 lData = m_pDataContainer_TabDialogs->GetUserData( m_sViewName ); 1126 } 1127 break; 1128 case E_TABPAGE : { 1129 lData = m_pDataContainer_TabPages->GetUserData( m_sViewName ); 1130 } 1131 break; 1132 case E_WINDOW : { 1133 lData = m_pDataContainer_Windows->GetUserData( m_sViewName ); 1134 } 1135 break; 1136 } 1137 return lData; 1138 } 1139 1140 //***************************************************************************************************************** 1141 void SvtViewOptions::SetUserData( const css::uno::Sequence< css::beans::NamedValue >& lData ) 1142 { 1143 // Ready for multithreading 1144 ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); 1145 1146 switch( m_eViewType ) 1147 { 1148 case E_DIALOG : { 1149 m_pDataContainer_Dialogs->SetUserData( m_sViewName, lData ); 1150 } 1151 break; 1152 case E_TABDIALOG : { 1153 m_pDataContainer_TabDialogs->SetUserData( m_sViewName, lData ); 1154 } 1155 break; 1156 case E_TABPAGE : { 1157 m_pDataContainer_TabPages->SetUserData( m_sViewName, lData ); 1158 } 1159 break; 1160 case E_WINDOW : { 1161 m_pDataContainer_Windows->SetUserData( m_sViewName, lData ); 1162 } 1163 break; 1164 } 1165 } 1166 1167 //***************************************************************************************************************** 1168 css::uno::Any SvtViewOptions::GetUserItem( const ::rtl::OUString& sName ) const 1169 { 1170 // Ready for multithreading 1171 ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); 1172 1173 css::uno::Any aItem; 1174 switch( m_eViewType ) 1175 { 1176 case E_DIALOG : { 1177 aItem = m_pDataContainer_Dialogs->GetUserItem( m_sViewName, sName ); 1178 } 1179 break; 1180 case E_TABDIALOG : { 1181 aItem = m_pDataContainer_TabDialogs->GetUserItem( m_sViewName, sName ); 1182 } 1183 break; 1184 case E_TABPAGE : { 1185 aItem = m_pDataContainer_TabPages->GetUserItem( m_sViewName, sName ); 1186 } 1187 break; 1188 case E_WINDOW : { 1189 aItem = m_pDataContainer_Windows->GetUserItem( m_sViewName, sName ); 1190 } 1191 break; 1192 } 1193 return aItem; 1194 } 1195 1196 //***************************************************************************************************************** 1197 void SvtViewOptions::SetUserItem( const ::rtl::OUString& sName , 1198 const css::uno::Any& aValue ) 1199 { 1200 // Ready for multithreading 1201 ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); 1202 1203 switch( m_eViewType ) 1204 { 1205 case E_DIALOG : { 1206 m_pDataContainer_Dialogs->SetUserItem( m_sViewName, sName, aValue ); 1207 } 1208 break; 1209 case E_TABDIALOG : { 1210 m_pDataContainer_TabDialogs->SetUserItem( m_sViewName, sName, aValue ); 1211 } 1212 break; 1213 case E_TABPAGE : { 1214 m_pDataContainer_TabPages->SetUserItem( m_sViewName, sName, aValue ); 1215 } 1216 break; 1217 case E_WINDOW : { 1218 m_pDataContainer_Windows->SetUserItem( m_sViewName, sName, aValue ); 1219 } 1220 break; 1221 } 1222 } 1223 1224 //***************************************************************************************************************** 1225 // private method 1226 //***************************************************************************************************************** 1227 ::osl::Mutex& SvtViewOptions::GetOwnStaticMutex() 1228 { 1229 // Initialize static mutex only for one time! 1230 static ::osl::Mutex* pMutex = NULL; 1231 // If these method first called (Mutex not already exist!) ... 1232 if( pMutex == NULL ) 1233 { 1234 // ... we must create a new one. Protect follow code with the global mutex - 1235 // It must be - we create a static variable! 1236 ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 1237 // We must check our pointer again - because it can be that another instance of ouer class will be fastr then these! 1238 if( pMutex == NULL ) 1239 { 1240 // Create the new mutex and set it for return on static variable. 1241 static ::osl::Mutex aMutex; 1242 pMutex = &aMutex; 1243 } 1244 } 1245 // Return new created or already existing mutex object. 1246 return *pMutex; 1247 } 1248 1249 void SvtViewOptions::AcquireOptions() 1250 { 1251 ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); 1252 if( ++m_nRefCount_Dialogs == 1 ) 1253 { 1254 m_pDataContainer_Dialogs = new SvtViewOptionsBase_Impl( LIST_DIALOGS ); 1255 ItemHolder1::holdConfigItem(E_VIEWOPTIONS_DIALOG); 1256 } 1257 if( ++m_nRefCount_TabDialogs == 1 ) 1258 { 1259 m_pDataContainer_TabDialogs = new SvtViewOptionsBase_Impl( LIST_TABDIALOGS ); 1260 ItemHolder1::holdConfigItem(E_VIEWOPTIONS_TABDIALOG); 1261 } 1262 if( ++m_nRefCount_TabPages == 1 ) 1263 { 1264 m_pDataContainer_TabPages = new SvtViewOptionsBase_Impl( LIST_TABPAGES ); 1265 ItemHolder1::holdConfigItem(E_VIEWOPTIONS_TABPAGE); 1266 } 1267 if( ++m_nRefCount_Windows == 1 ) 1268 { 1269 m_pDataContainer_Windows = new SvtViewOptionsBase_Impl( LIST_WINDOWS ); 1270 ItemHolder1::holdConfigItem(E_VIEWOPTIONS_WINDOW); 1271 } 1272 } 1273 1274 void SvtViewOptions::ReleaseOptions() 1275 { 1276 ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); 1277 if( --m_nRefCount_Dialogs == 0 ) 1278 { 1279 delete m_pDataContainer_Dialogs; 1280 m_pDataContainer_Dialogs = NULL; 1281 } 1282 if( --m_nRefCount_TabDialogs == 0 ) 1283 { 1284 delete m_pDataContainer_TabDialogs; 1285 m_pDataContainer_TabDialogs = NULL; 1286 } 1287 if( --m_nRefCount_TabPages == 0 ) 1288 { 1289 delete m_pDataContainer_TabPages; 1290 m_pDataContainer_TabPages = NULL; 1291 } 1292 if( --m_nRefCount_Windows == 0 ) 1293 { 1294 delete m_pDataContainer_Windows; 1295 m_pDataContainer_Windows = NULL; 1296 } 1297 } 1298