LCOV - code coverage report
Current view: top level - svl/source/items - style.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 278 414 67.1 %
Date: 2014-11-03 Functions: 61 104 58.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <com/sun/star/lang/XComponent.hpp>
      21             : 
      22             : #include <tools/tenccvt.hxx>
      23             : #include <comphelper/processfactory.hxx>
      24             : #include <unotools/intlwrapper.hxx>
      25             : #include <svl/smplhint.hxx>
      26             : #include <svl/poolitem.hxx>
      27             : #include <svl/itemset.hxx>
      28             : #include <svl/itempool.hxx>
      29             : #include <svl/IndexedStyleSheets.hxx>
      30             : #include <svl/itemiter.hxx>
      31             : #include <svl/style.hxx>
      32             : #include <unotools/syslocale.hxx>
      33             : #include <algorithm>
      34             : #include <comphelper/servicehelper.hxx>
      35             : 
      36             : #include <boost/numeric/conversion/cast.hpp>
      37             : 
      38             : #include <string.h>
      39             : 
      40             : #ifdef DBG_UTIL
      41             : class DbgStyleSheetReferences
      42             : {
      43             : public:
      44             :     DbgStyleSheetReferences() : mnStyles(0), mnPools(0) {}
      45             :     ~DbgStyleSheetReferences()
      46             :     {
      47             :         OSL_TRACE("DbgStyleSheetReferences\nSfxStyleSheetBase left %ld\nSfxStyleSheetBasePool left %ld", mnStyles, mnPools );
      48             :     }
      49             : 
      50             :     sal_uInt32 mnStyles;
      51             :     sal_uInt32 mnPools;
      52             : }
      53             : aDbgStyleSheetReferences;
      54             : 
      55             : #endif
      56             : 
      57           0 : TYPEINIT0(SfxStyleSheetBase)
      58             : 
      59      462246 : TYPEINIT3(SfxStyleSheet, SfxStyleSheetBase, SfxListener, SfxBroadcaster)
      60             : 
      61        1674 : SfxStyleSheetHintExtended::SfxStyleSheetHintExtended
      62             : (
      63             :     sal_uInt16          nAction,        // SFX_STYLESHEET_... (see above)
      64             :     const OUString&     rOldName,
      65             :     SfxStyleSheetBase&  rStyleSheet     // Remains with the caller
      66             : )
      67             : :   SfxStyleSheetHint( nAction, rStyleSheet ),
      68        1674 :     aName( rOldName )
      69        1674 : {}
      70             : 
      71             : 
      72      278158 : SfxStyleSheetHint::SfxStyleSheetHint
      73             : (
      74             :     sal_uInt16              nAction,    // SFX_STYLESHEET_... (see above)
      75             :     SfxStyleSheetBase&  rStyleSheet     // Remains with the caller
      76             : )
      77             : :   pStyleSh( &rStyleSheet ),
      78      278158 :     nHint( nAction )
      79      278158 : {}
      80             : 
      81             : 
      82       15435 : class SfxStyleSheetBasePool_Impl
      83             : {
      84             : public:
      85             :     SfxStyleSheetIteratorPtr pIter;
      86             : };
      87             : 
      88             : 
      89       98682 : SfxStyleSheetBase::SfxStyleSheetBase( const OUString& rName, SfxStyleSheetBasePool* p, SfxStyleFamily eFam, sal_uInt16 mask )
      90             :     : pPool( p )
      91             :     , nFamily( eFam )
      92             :     , aName( rName )
      93             :     , aParent()
      94             :     , aFollow( rName )
      95             :     , pSet( NULL )
      96             :     , nMask(mask)
      97             :     , nHelpId( 0 )
      98             :     , bMySet( false )
      99       98682 :     , bHidden( false )
     100             : {
     101             : #ifdef DBG_UTIL
     102             :     aDbgStyleSheetReferences.mnStyles++;
     103             : #endif
     104       98682 : }
     105             : 
     106      860776 : SfxStyleSheetBase::SfxStyleSheetBase( const SfxStyleSheetBase& r )
     107             :     : comphelper::OWeakTypeObject()
     108             :     , pPool( r.pPool )
     109             :     , nFamily( r.nFamily )
     110             :     , aName( r.aName )
     111             :     , aParent( r.aParent )
     112             :     , aFollow( r.aFollow )
     113             :     , aHelpFile( r.aHelpFile )
     114             :     , nMask( r.nMask )
     115             :     , nHelpId( r.nHelpId )
     116             :     , bMySet( r.bMySet )
     117      860776 :     , bHidden( r.bHidden )
     118             : {
     119             : #ifdef DBG_UTIL
     120             :     aDbgStyleSheetReferences.mnStyles++;
     121             : #endif
     122      860776 :     if( r.pSet )
     123           0 :         pSet = bMySet ? new SfxItemSet( *r.pSet ) : r.pSet;
     124             :     else
     125      860776 :         pSet = NULL;
     126      860776 : }
     127             : 
     128     1918874 : SfxStyleSheetBase::~SfxStyleSheetBase()
     129             : {
     130             : #ifdef DBG_UTIL
     131             :     --aDbgStyleSheetReferences.mnStyles;
     132             : #endif
     133             : 
     134      959437 :     if( bMySet )
     135             :     {
     136        9040 :         delete pSet;
     137        9040 :         pSet = 0;
     138             :     }
     139      959437 : }
     140             : 
     141           0 : sal_uInt16 SfxStyleSheetBase::GetVersion() const
     142             : {
     143           0 :     return 0x0000;
     144             : }
     145             : 
     146             : // Change name
     147             : 
     148     2457761 : const OUString& SfxStyleSheetBase::GetName() const
     149             : {
     150     2457761 :     return aName;
     151             : }
     152             : 
     153        1674 : bool SfxStyleSheetBase::SetName(const OUString& rName, bool bReIndexNow)
     154             : {
     155        1674 :     if(rName.isEmpty())
     156           0 :         return false;
     157             : 
     158        1674 :     if( aName != rName )
     159             :     {
     160        1674 :         OUString aOldName = aName;
     161        1674 :         SfxStyleSheetBase *pOther = pPool->Find( rName, nFamily ) ;
     162        1674 :         if ( pOther && pOther != this )
     163           0 :             return false;
     164             : 
     165        1674 :         SfxStyleFamily eTmpFam = pPool->GetSearchFamily();
     166        1674 :         sal_uInt16 nTmpMask = pPool->GetSearchMask();
     167             : 
     168        1674 :         pPool->SetSearchMask(nFamily);
     169             : 
     170        1674 :         if ( !aName.isEmpty() )
     171        1674 :             pPool->ChangeParent( aName, rName, false );
     172             : 
     173        1674 :         if ( aFollow == aName )
     174        1658 :             aFollow = rName;
     175        1674 :         aName = rName;
     176        1674 :         if (bReIndexNow)
     177        1674 :             pPool->Reindex();
     178        1674 :         pPool->SetSearchMask(eTmpFam, nTmpMask);
     179             :         pPool->Broadcast( SfxStyleSheetHintExtended(
     180        1674 :             SFX_STYLESHEET_MODIFIED, aOldName, *this ) );
     181             :     }
     182        1674 :     return true;
     183             : }
     184             : 
     185        5964 : OUString SfxStyleSheetBase::GetDisplayName() const
     186             : {
     187        5964 :     if( maDisplayName.isEmpty() )
     188             :     {
     189        5964 :         return aName;
     190             :     }
     191             :     else
     192             :     {
     193           0 :         return maDisplayName;
     194             :     }
     195             : }
     196             : 
     197           0 : void SfxStyleSheetBase::SetDisplayName( const OUString& rDisplayName )
     198             : {
     199           0 :     maDisplayName = rDisplayName;
     200           0 : }
     201             : 
     202             : // Change Parent
     203             : 
     204       82792 : const OUString& SfxStyleSheetBase::GetParent() const
     205             : {
     206       82792 :     return aParent;
     207             : }
     208             : 
     209       31760 : bool SfxStyleSheetBase::SetParent( const OUString& rName )
     210             : {
     211       31760 :     if ( rName == aName )
     212           0 :         return false;
     213             : 
     214       31760 :     if( aParent != rName )
     215             :     {
     216       31760 :         SfxStyleSheetBase* pIter = pPool->Find(rName, nFamily);
     217       31760 :         if( !rName.isEmpty() && !pIter )
     218             :         {
     219             :             OSL_FAIL( "StyleSheet-Parent not found" );
     220           0 :             return false;
     221             :         }
     222             :         // prevent recursive linkages
     223       31760 :         if( !aName.isEmpty() )
     224             :         {
     225      118828 :             while(pIter)
     226             :             {
     227       55308 :                 if(pIter->GetName() == aName)
     228           0 :                     return false;
     229       55308 :                 pIter = pPool->Find(pIter->GetParent(), nFamily);
     230             :             }
     231             :         }
     232       31760 :         aParent = rName;
     233             :     }
     234       31760 :     pPool->Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, *this ) );
     235       31760 :     return true;
     236             : }
     237             : 
     238        2240 : void SfxStyleSheetBase::SetHidden( bool hidden )
     239             : {
     240        2240 :     bHidden = hidden;
     241        2240 :     pPool->Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, *this ) );
     242        2240 : }
     243             : 
     244             : /**
     245             :  * Change follow
     246             :  */
     247        5788 : const OUString& SfxStyleSheetBase::GetFollow() const
     248             : {
     249        5788 :     return aFollow;
     250             : }
     251             : 
     252       10248 : bool SfxStyleSheetBase::SetFollow( const OUString& rName )
     253             : {
     254       10248 :     if( aFollow != rName )
     255             :     {
     256       10232 :         if( !pPool->Find( rName, nFamily ) )
     257             :         {
     258             :             SAL_WARN( "svl", "StyleSheet-Follow not found" );
     259        2192 :             return false;
     260             :         }
     261        8040 :         aFollow = rName;
     262             :     }
     263        8056 :     pPool->Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, *this ) );
     264        8056 :     return true;
     265             : }
     266             : 
     267             : /**
     268             :  * Set Itemset
     269             :  * The default implementation creates a new set
     270             :  */
     271           0 : SfxItemSet& SfxStyleSheetBase::GetItemSet()
     272             : {
     273           0 :     if( !pSet )
     274             :     {
     275           0 :         pSet = new SfxItemSet( pPool->GetPool() );
     276           0 :         bMySet = true;
     277             :     }
     278           0 :     return *pSet;
     279             : }
     280             : 
     281             : /**
     282             :  * Set help file and ID and return it
     283             :  */
     284        1810 : sal_uLong SfxStyleSheetBase::GetHelpId( OUString& rFile )
     285             : {
     286        1810 :     rFile = aHelpFile;
     287        1810 :     return nHelpId;
     288             : }
     289             : 
     290       23464 : void SfxStyleSheetBase::SetHelpId( const OUString& rFile, sal_uLong nId )
     291             : {
     292       23464 :     aHelpFile = rFile;
     293       23464 :     nHelpId = nId;
     294       23464 : }
     295             : 
     296             : /**
     297             :  * Next style possible?
     298             :  * Default: Yes
     299             :  */
     300           0 : bool SfxStyleSheetBase::HasFollowSupport() const
     301             : {
     302           0 :     return true;
     303             : }
     304             : 
     305             : /**
     306             :  * Base template possible?
     307             :  * Default: Yes
     308             :  */
     309           0 : bool SfxStyleSheetBase::HasParentSupport() const
     310             : {
     311           0 :     return true;
     312             : }
     313             : 
     314             : /**
     315             :  * Setting base template to NULL possible?
     316             :  * Default: No
     317             :  */
     318           0 : bool SfxStyleSheetBase::HasClearParentSupport() const
     319             : {
     320           0 :     return false;
     321             : }
     322             : 
     323             : /**
     324             :  * By default all stylesheets are set to used
     325             :  */
     326           0 : bool SfxStyleSheetBase::IsUsed() const
     327             : {
     328           0 :     return true;
     329             : }
     330             : 
     331             : /**
     332             :  * Return set attributes
     333             :  */
     334           0 : OUString SfxStyleSheetBase::GetDescription()
     335             : {
     336           0 :     return GetDescription( SFX_MAPUNIT_CM );
     337             : }
     338             : 
     339             : /**
     340             :  * Return set attributes
     341             :  */
     342           0 : OUString SfxStyleSheetBase::GetDescription( SfxMapUnit eMetric )
     343             : {
     344           0 :     SfxItemIter aIter( GetItemSet() );
     345           0 :     OUString aDesc;
     346           0 :     const SfxPoolItem* pItem = aIter.FirstItem();
     347             : 
     348           0 :     IntlWrapper aIntlWrapper( SvtSysLocale().GetLanguageTag() );
     349           0 :     while ( pItem )
     350             :     {
     351           0 :         OUString aItemPresentation;
     352             : 
     353           0 :         if ( !IsInvalidItem( pItem ) &&
     354           0 :              pPool->GetPool().GetPresentation(
     355           0 :                 *pItem, eMetric, aItemPresentation, &aIntlWrapper ) )
     356             :         {
     357           0 :             if ( !aDesc.isEmpty() && !aItemPresentation.isEmpty() )
     358           0 :                 aDesc += " + ";
     359           0 :             if ( !aItemPresentation.isEmpty() )
     360           0 :                 aDesc += aItemPresentation;
     361             :         }
     362           0 :         pItem = aIter.NextItem();
     363           0 :     }
     364           0 :     return aDesc;
     365             : }
     366             : 
     367     1032877 : SfxStyleFamily SfxStyleSheetIterator::GetSearchFamily() const
     368             : {
     369     1032877 :     return nSearchFamily;
     370             : }
     371             : 
     372       90032 : inline bool SfxStyleSheetIterator::IsTrivialSearch()
     373             : {
     374      180064 :     return (( nMask & SFXSTYLEBIT_ALL_VISIBLE ) == SFXSTYLEBIT_ALL_VISIBLE) &&
     375      180064 :         (GetSearchFamily() == SFX_STYLE_FAMILY_ALL);
     376             : }
     377             : 
     378             : namespace {
     379             : 
     380      458534 : struct DoesStyleMatchStyleSheetPredicate SAL_FINAL : public svl::StyleSheetPredicate
     381             : {
     382      458534 :     DoesStyleMatchStyleSheetPredicate(SfxStyleSheetIterator *it)
     383      458534 :             : mIterator(it) {;}
     384             : 
     385             :     bool
     386      401990 :     Check(const SfxStyleSheetBase& styleSheet) SAL_OVERRIDE
     387             :     {
     388      803980 :         bool bMatchFamily = ((mIterator->GetSearchFamily() == SFX_STYLE_FAMILY_ALL) ||
     389      803980 :                 ( styleSheet.GetFamily() == mIterator->GetSearchFamily() ));
     390             : 
     391      401990 :         bool bUsed = mIterator->SearchUsed() && styleSheet.IsUsed( );
     392             : 
     393      401990 :         bool bSearchHidden = ( mIterator->GetSearchMask() & SFXSTYLEBIT_HIDDEN );
     394      401990 :         bool bMatchVisibility = !( !bSearchHidden && styleSheet.IsHidden() && !bUsed );
     395      401990 :         bool bOnlyHidden = mIterator->GetSearchMask( ) == SFXSTYLEBIT_HIDDEN && styleSheet.IsHidden( );
     396             : 
     397      348880 :         bool bMatches = bMatchFamily && bMatchVisibility
     398     1094966 :             && (( styleSheet.GetMask() & ( mIterator->GetSearchMask() & ~SFXSTYLEBIT_USED )) ||
     399      206012 :                 bUsed || bOnlyHidden ||
     400      504996 :                 ( mIterator->GetSearchMask() & SFXSTYLEBIT_ALL_VISIBLE ) == SFXSTYLEBIT_ALL_VISIBLE );
     401      401990 :         return bMatches;
     402             :     }
     403             : 
     404             :     SfxStyleSheetIterator *mIterator;
     405             : };
     406             : 
     407             : }
     408             : 
     409      498267 : SfxStyleSheetIterator::SfxStyleSheetIterator(SfxStyleSheetBasePool *pBase,
     410             :                                              SfxStyleFamily eFam, sal_uInt16 n)
     411             :     : pAktStyle(NULL)
     412      498267 :     , nAktPosition(0)
     413             : {
     414      498267 :     pBasePool=pBase;
     415      498267 :     nSearchFamily=eFam;
     416      498267 :     bSearchUsed=false;
     417      498267 :         if( (( n & SFXSTYLEBIT_ALL_VISIBLE ) != SFXSTYLEBIT_ALL_VISIBLE )
     418       40389 :                 && ((n & SFXSTYLEBIT_USED) == SFXSTYLEBIT_USED))
     419             :     {
     420       13135 :         bSearchUsed = true;
     421       13135 :         n &= ~SFXSTYLEBIT_USED;
     422             :     }
     423      498267 :     nMask=n;
     424      498267 : }
     425             : 
     426      500391 : SfxStyleSheetIterator::~SfxStyleSheetIterator()
     427             : {
     428      500391 : }
     429             : 
     430       13548 : sal_uInt16 SfxStyleSheetIterator::Count()
     431             : {
     432       13548 :     sal_uInt16 n = 0;
     433       13548 :     if( IsTrivialSearch())
     434             :     {
     435          28 :         n = (sal_uInt16) pBasePool->mIndexedStyleSheets->GetNumberOfStyleSheets();
     436             :     }
     437       13520 :     else if(nMask == SFXSTYLEBIT_ALL)
     438             :     {
     439       13520 :         n = static_cast<sal_uInt16>(pBasePool->mIndexedStyleSheets->GetStyleSheetPositionsByFamily(nSearchFamily).size());
     440             :     }
     441             :     else
     442             :     {
     443           0 :         DoesStyleMatchStyleSheetPredicate predicate(this);
     444           0 :         n = pBasePool->mIndexedStyleSheets->GetNumberOfStyleSheetsWithPredicate(predicate);
     445             :     }
     446       13548 :     return n;
     447             : }
     448             : 
     449       13170 : SfxStyleSheetBase* SfxStyleSheetIterator::operator[](sal_uInt16 nIdx)
     450             : {
     451       13170 :     SfxStyleSheetBase* retval = NULL;
     452       13170 :     if( IsTrivialSearch())
     453             :     {
     454          24 :         retval = pBasePool->mIndexedStyleSheets->GetStyleSheetByPosition(nIdx).get();
     455          24 :         nAktPosition = nIdx;
     456             :     }
     457       13146 :     else if(nMask == SFXSTYLEBIT_ALL)
     458             :     {
     459             :         rtl::Reference< SfxStyleSheetBase > ref =
     460             :         pBasePool->mIndexedStyleSheets->GetStyleSheetByPosition(
     461       13146 :                 pBasePool->mIndexedStyleSheets->GetStyleSheetPositionsByFamily(nSearchFamily).at(nIdx))
     462             :                 ;
     463       13146 :         retval = ref.get();
     464       13146 :         nAktPosition = nIdx;
     465             :     }
     466             :     else
     467             :     {
     468           0 :         DoesStyleMatchStyleSheetPredicate predicate(this);
     469             :         rtl::Reference< SfxStyleSheetBase > ref =
     470           0 :                 pBasePool->mIndexedStyleSheets->GetNthStyleSheetThatMatchesPredicate(nIdx, predicate);
     471           0 :         if (ref.get() != NULL)
     472             :         {
     473           0 :             nAktPosition = pBasePool->mIndexedStyleSheets->FindStyleSheetPosition(*ref);
     474           0 :             retval = ref.get();
     475           0 :         }
     476             :     }
     477             : 
     478             :     if (retval == NULL)
     479             :     {
     480             :         OSL_FAIL("Incorrect index");
     481             :     }
     482             : 
     483       13170 :     return retval;
     484             : }
     485             : 
     486       12284 : SfxStyleSheetBase* SfxStyleSheetIterator::First()
     487             : {
     488       12284 :     if (Count() != 0) {
     489       12250 :         return operator[](0);
     490             :     }
     491             :     else {
     492          34 :         return NULL;
     493             :     }
     494             : }
     495             : 
     496             : 
     497       63314 : SfxStyleSheetBase* SfxStyleSheetIterator::Next()
     498             : {
     499       63314 :     SfxStyleSheetBase* retval = NULL;
     500             : 
     501       63314 :     if ( IsTrivialSearch() )
     502             :     {
     503        1592 :         unsigned nStyleSheets = pBasePool->mIndexedStyleSheets->GetNumberOfStyleSheets();
     504        1592 :         unsigned newPosition = nAktPosition +1;
     505        1592 :         if (nStyleSheets > newPosition)
     506             :         {
     507        1568 :             nAktPosition = newPosition;
     508        1568 :             retval = pBasePool->mIndexedStyleSheets->GetStyleSheetByPosition(nAktPosition).get();
     509             :         }
     510             :     }
     511       61722 :     else if(nMask == SFXSTYLEBIT_ALL)
     512             :     {
     513       61722 :         unsigned newPosition = nAktPosition +1;
     514       61722 :         const std::vector<unsigned>& familyVector = pBasePool->mIndexedStyleSheets->GetStyleSheetPositionsByFamily(nSearchFamily);
     515       61722 :         if (familyVector.size() > newPosition)
     516             :         {
     517       59272 :             nAktPosition = newPosition;
     518       59272 :             unsigned stylePosition = familyVector.at(newPosition);
     519       59272 :             retval = pBasePool->mIndexedStyleSheets->GetStyleSheetByPosition(stylePosition).get();
     520             :         }
     521             :     }
     522             :     else
     523             :     {
     524           0 :         DoesStyleMatchStyleSheetPredicate predicate(this);
     525             :         rtl::Reference< SfxStyleSheetBase > ref =
     526             :                 pBasePool->mIndexedStyleSheets->GetNthStyleSheetThatMatchesPredicate(
     527           0 :                         0, predicate, nAktPosition+1);
     528           0 :         retval = ref.get();
     529           0 :         if (retval != NULL) {
     530           0 :             nAktPosition = pBasePool->mIndexedStyleSheets->FindStyleSheetPosition(*ref);
     531           0 :         }
     532             :     }
     533       63314 :     pAktStyle = retval;
     534       63314 :     return retval;
     535             : }
     536             : 
     537      458534 : SfxStyleSheetBase* SfxStyleSheetIterator::Find(const OUString& rStr)
     538             : {
     539      458534 :     DoesStyleMatchStyleSheetPredicate predicate(this);
     540             : 
     541             :     std::vector<unsigned> positions =
     542             :             pBasePool->mIndexedStyleSheets->FindPositionsByNameAndPredicate(rStr, predicate,
     543      917068 :                     svl::IndexedStyleSheets::RETURN_FIRST);
     544      458534 :     if (positions.empty()) {
     545      114438 :         return NULL;
     546             :     }
     547             : 
     548      344096 :     unsigned pos = positions.front();
     549      344096 :     SfxStyleSheetBase* pStyle = pBasePool->mIndexedStyleSheets->GetStyleSheetByPosition(pos).get();
     550      344096 :     nAktPosition = pos;
     551      344096 :     pAktStyle = pStyle;
     552      802630 :     return pAktStyle;
     553             : }
     554             : 
     555     1397445 : sal_uInt16 SfxStyleSheetIterator::GetSearchMask() const
     556             : {
     557     1397445 :     sal_uInt16 mask = nMask;
     558             : 
     559     1397445 :     if ( bSearchUsed )
     560       49087 :         mask |= SFXSTYLEBIT_USED;
     561     1397445 :     return mask;
     562             : }
     563             : 
     564             : 
     565           0 : void SfxStyleSheetBasePool::Replace( SfxStyleSheetBase& rSource, SfxStyleSheetBase& rTarget )
     566             : {
     567           0 :     rTarget.SetFollow( rSource.GetFollow() );
     568           0 :     rTarget.SetParent( rSource.GetParent() );
     569           0 :     SfxItemSet& rSourceSet = rSource.GetItemSet();
     570           0 :     SfxItemSet& rTargetSet = rTarget.GetItemSet();
     571           0 :     rTargetSet.Intersect( rSourceSet );
     572           0 :     rTargetSet.Put( rSourceSet );
     573           0 : }
     574             : 
     575      145517 : SfxStyleSheetIterator& SfxStyleSheetBasePool::GetIterator_Impl()
     576             : {
     577      145517 :     if( !pImp->pIter || (pImp->pIter->GetSearchMask() != nMask) || (pImp->pIter->GetSearchFamily() != nSearchFamily) )
     578             :     {
     579       25925 :         pImp->pIter = CreateIterator( nSearchFamily, nMask );
     580             :     }
     581             : 
     582      145517 :     return *pImp->pIter;
     583             : }
     584             : 
     585        7744 : SfxStyleSheetBasePool::SfxStyleSheetBasePool( SfxItemPool& r )
     586        7744 :     : aAppName(r.GetName())
     587             :     , rPool(r)
     588             :     , nSearchFamily(SFX_STYLE_FAMILY_PARA)
     589             :     , nMask(SFXSTYLEBIT_ALL)
     590       15488 :     , mIndexedStyleSheets(new svl::IndexedStyleSheets)
     591             : {
     592             : #ifdef DBG_UTIL
     593             :     aDbgStyleSheetReferences.mnPools++;
     594             : #endif
     595             : 
     596        7744 :     pImp = new SfxStyleSheetBasePool_Impl;
     597        7744 : }
     598             : 
     599           0 : SfxStyleSheetBasePool::SfxStyleSheetBasePool( const SfxStyleSheetBasePool& r )
     600             :     : SfxBroadcaster( r )
     601             :     , comphelper::OWeakTypeObject()
     602             :     , aAppName(r.aAppName)
     603             :     , rPool(r.rPool)
     604             :     , nSearchFamily(r.nSearchFamily)
     605             :     , nMask( r.nMask )
     606           0 :     , mIndexedStyleSheets(new svl::IndexedStyleSheets)
     607             : {
     608             : #ifdef DBG_UTIL
     609             :     aDbgStyleSheetReferences.mnPools++;
     610             : #endif
     611             : 
     612           0 :     pImp = new SfxStyleSheetBasePool_Impl;
     613           0 :     *this += r;
     614           0 : }
     615             : 
     616       15382 : SfxStyleSheetBasePool::~SfxStyleSheetBasePool()
     617             : {
     618             : #ifdef DBG_UTIL
     619             :     aDbgStyleSheetReferences.mnPools--;
     620             : #endif
     621             : 
     622        7691 :     Broadcast( SfxSimpleHint(SFX_HINT_DYING) );
     623        7691 :     Clear();
     624        7691 :     delete pImp;
     625        7691 : }
     626             : 
     627           0 : bool SfxStyleSheetBasePool::SetParent(SfxStyleFamily eFam, const OUString& rStyle, const OUString& rParent)
     628             : {
     629           0 :     SfxStyleSheetIterator aIter(this,eFam,SFXSTYLEBIT_ALL);
     630           0 :     SfxStyleSheetBase *pStyle = aIter.Find(rStyle);
     631             :     OSL_ENSURE(pStyle, "Template not found. Writer with solar <2541?");
     632           0 :     if(pStyle)
     633           0 :         return pStyle->SetParent(rParent);
     634             :     else
     635           0 :         return false;
     636             : }
     637             : 
     638             : 
     639     2010930 : void SfxStyleSheetBasePool::SetSearchMask(SfxStyleFamily eFam, sal_uInt16 n)
     640             : {
     641     2010930 :     nSearchFamily = eFam; nMask = n;
     642     2010930 : }
     643             : 
     644             : 
     645        2126 : SfxStyleSheetIteratorPtr SfxStyleSheetBasePool::CreateIterator
     646             : (
     647             :  SfxStyleFamily eFam,
     648             :  sal_uInt16 mask
     649             : )
     650             : {
     651        2126 :     return SfxStyleSheetIteratorPtr(new SfxStyleSheetIterator(this,eFam,mask));
     652             : }
     653             : 
     654           0 : SfxStyleSheetBase* SfxStyleSheetBasePool::Create
     655             : (
     656             :     const OUString& rName,
     657             :     SfxStyleFamily eFam,
     658             :     sal_uInt16 mask
     659             : )
     660             : {
     661           0 :     return new SfxStyleSheetBase( rName, this, eFam, mask );
     662             : }
     663             : 
     664           0 : SfxStyleSheetBase* SfxStyleSheetBasePool::Create( const SfxStyleSheetBase& r )
     665             : {
     666           0 :     return new SfxStyleSheetBase( r );
     667             : }
     668             : 
     669       37810 : SfxStyleSheetBase& SfxStyleSheetBasePool::Make( const OUString& rName, SfxStyleFamily eFam, sal_uInt16 mask)
     670             : {
     671             :     OSL_ENSURE( eFam != SFX_STYLE_FAMILY_ALL, "svl::SfxStyleSheetBasePool::Make(), FamilyAll is not a allowed Familie" );
     672             : 
     673       37810 :     SfxStyleSheetIterator aIter(this, eFam, mask);
     674       75620 :     rtl::Reference< SfxStyleSheetBase > xStyle( aIter.Find( rName ) );
     675             :     OSL_ENSURE( !xStyle.is(), "svl::SfxStyleSheetBasePool::Make(), StyleSheet already exists" );
     676             : 
     677       37810 :     if( !xStyle.is() )
     678             :     {
     679       37810 :         xStyle = Create( rName, eFam, mask );
     680       37810 :         StoreStyleSheet(xStyle);
     681       37810 :         Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, *xStyle.get() ) );
     682             :     }
     683       75620 :     return *xStyle.get();
     684             : }
     685             : 
     686             : /**
     687             :  * Helper function: If a template with this name exists it is created
     688             :  * anew. All templates that have this template as a parent are reconnected.
     689             :  */
     690           0 : SfxStyleSheetBase& SfxStyleSheetBasePool::Add( const SfxStyleSheetBase& rSheet )
     691             : {
     692           0 :     SfxStyleSheetIterator aIter(this, rSheet.GetFamily(), nMask);
     693           0 :     SfxStyleSheetBase* pOld = aIter.Find( rSheet.GetName() );
     694           0 :     if (pOld) {
     695           0 :         Remove( pOld );
     696             :     }
     697           0 :     rtl::Reference< SfxStyleSheetBase > xNew( Create( rSheet ) );
     698           0 :     mIndexedStyleSheets->AddStyleSheet(xNew);
     699           0 :     Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CHANGED, *xNew.get() ) );
     700           0 :     return *xNew.get();
     701             : }
     702             : 
     703           0 : SfxStyleSheetBasePool& SfxStyleSheetBasePool::operator=( const SfxStyleSheetBasePool& r )
     704             : {
     705           0 :     if( &r != this )
     706             :     {
     707           0 :         Clear();
     708           0 :         *this += r;
     709             :     }
     710           0 :     return *this;
     711             : }
     712             : 
     713             : namespace {
     714           0 : struct AddStyleSheetCallback : svl::StyleSheetCallback
     715             : {
     716           0 :     AddStyleSheetCallback(SfxStyleSheetBasePool *pool)
     717           0 :     : mPool(pool) {;}
     718             : 
     719           0 :     void DoIt(const SfxStyleSheetBase& ssheet) SAL_OVERRIDE
     720             :     {
     721           0 :         mPool->Add(ssheet);
     722           0 :     }
     723             : 
     724             :     SfxStyleSheetBasePool *mPool;
     725             : };
     726             : }
     727             : 
     728           0 : SfxStyleSheetBasePool& SfxStyleSheetBasePool::operator+=( const SfxStyleSheetBasePool& r )
     729             : {
     730           0 :     if( &r != this )
     731             :     {
     732           0 :         AddStyleSheetCallback callback(this);
     733           0 :         mIndexedStyleSheets->ApplyToAllStyleSheets(callback);
     734             :     }
     735           0 :     return *this;
     736             : }
     737             : 
     738        8926 : sal_uInt16 SfxStyleSheetBasePool::Count()
     739             : {
     740        8926 :     return GetIterator_Impl().Count();
     741             : }
     742             : 
     743           0 : SfxStyleSheetBase *SfxStyleSheetBasePool::operator[](sal_uInt16 nIdx)
     744             : {
     745           0 :     return GetIterator_Impl()[nIdx];
     746             : }
     747             : 
     748      420724 : SfxStyleSheetBase* SfxStyleSheetBasePool::Find(const OUString& rName,
     749             :                                                SfxStyleFamily eFam,
     750             :                                                sal_uInt16 mask)
     751             : {
     752      420724 :     SfxStyleSheetIterator aIter(this,eFam,mask);
     753      420724 :     return aIter.Find(rName);
     754             : }
     755             : 
     756       20396 : SfxStyleSheetBase* SfxStyleSheetBasePool::First()
     757             : {
     758       20396 :     return GetIterator_Impl().First();
     759             : }
     760             : 
     761       34983 : SfxStyleSheetBase* SfxStyleSheetBasePool::Next()
     762             : {
     763       34983 :     return GetIterator_Impl().Next();
     764             : }
     765             : 
     766           2 : void SfxStyleSheetBasePool::Remove( SfxStyleSheetBase* p )
     767             : {
     768           2 :     if( p )
     769             :     {
     770             :         // Reference to keep p alive until after Broadcast call!
     771           2 :         rtl::Reference<SfxStyleSheetBase> xP(p);
     772           2 :         bool bWasRemoved = mIndexedStyleSheets->RemoveStyleSheet(xP);
     773           2 :         if( bWasRemoved )
     774             :         {
     775             :             // Adapt all styles which have this style as parant
     776           2 :             ChangeParent( p->GetName(), p->GetParent() );
     777             : 
     778             :             // #120015# Do not dispose, the removed StyleSheet may still be used in
     779             :             // existing SdrUndoAttrObj incarnations. Rely on refcounting for disposal,
     780             :             // this works well under normal conditions (checked breaking and counting
     781             :             // on SfxStyleSheetBase constructors and destructors)
     782             : 
     783             :             // com::sun::star::uno::Reference< com::sun::star::lang::XComponent > xComp( static_cast< ::cppu::OWeakObject* >((*aIter).get()), com::sun::star::uno::UNO_QUERY );
     784             :             // if( xComp.is() ) try
     785             :             // {
     786             :             //  xComp->dispose();
     787             :             // }
     788             :             // catch( com::sun::star::uno::Exception& )
     789             :             // {
     790             :             // }
     791           2 :             Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_ERASED, *p ) );
     792           2 :         }
     793             :     }
     794           2 : }
     795             : 
     796           6 : void SfxStyleSheetBasePool::Insert( SfxStyleSheetBase* p )
     797             : {
     798             : #if OSL_DEBUG_LEVEL > 0
     799             :     OSL_ENSURE( p, "svl::SfxStyleSheetBasePool::Insert(), no stylesheet?" );
     800             : 
     801             :     SfxStyleSheetIterator aIter(this, p->GetFamily(), p->GetMask());
     802             :     SfxStyleSheetBase* pOld = aIter.Find( p->GetName() );
     803             :     OSL_ENSURE( !pOld, "svl::SfxStyleSheetBasePool::Insert(), StyleSheet already inserted" );
     804             :     if( !p->GetParent().isEmpty() )
     805             :     {
     806             :         pOld = aIter.Find( p->GetParent() );
     807             :         OSL_ENSURE( pOld, "svl::SfxStyleSheetBasePool::Insert(), Parent not found!" );
     808             :     }
     809             : #endif
     810           6 :     StoreStyleSheet(rtl::Reference< SfxStyleSheetBase >( p ) );
     811           6 :     Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, *p ) );
     812           6 : }
     813             : 
     814             : namespace
     815             : {
     816             : 
     817        8133 : struct StyleSheetDisposerFunctor SAL_FINAL : public svl::StyleSheetDisposer
     818             : {
     819        8133 :     StyleSheetDisposerFunctor(SfxStyleSheetBasePool* pool)
     820        8133 :             : mPool(pool) {;}
     821             : 
     822             :     void
     823       37800 :     Dispose(rtl::Reference<SfxStyleSheetBase> styleSheet) SAL_OVERRIDE
     824             :     {
     825       37800 :         cppu::OWeakObject* weakObject = static_cast< ::cppu::OWeakObject* >(styleSheet.get());
     826             :         com::sun::star::uno::Reference< com::sun::star::lang::XComponent >
     827       37800 :             xComp( weakObject, com::sun::star::uno::UNO_QUERY );
     828       37800 :         if( xComp.is() ) try
     829             :         {
     830       28762 :             xComp->dispose();
     831             :         }
     832           0 :         catch( com::sun::star::uno::Exception& )
     833             :         {
     834             :         }
     835       37800 :         mPool->Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_ERASED, *styleSheet.get() ) );
     836       37800 :     }
     837             : 
     838             :     SfxStyleSheetBasePool* mPool;
     839             : };
     840             : 
     841             : }
     842             : 
     843        8133 : void SfxStyleSheetBasePool::Clear()
     844             : {
     845        8133 :     StyleSheetDisposerFunctor cleanup(this);
     846        8133 :     mIndexedStyleSheets->Clear(cleanup);
     847        8133 : }
     848             : 
     849        1676 : void SfxStyleSheetBasePool::ChangeParent(const OUString& rOld,
     850             :                                          const OUString& rNew,
     851             :                                          bool bVirtual)
     852             : {
     853        1676 :     const sal_uInt16 nTmpMask = GetSearchMask();
     854        1676 :     SetSearchMask(GetSearchFamily(), SFXSTYLEBIT_ALL);
     855       27622 :     for( SfxStyleSheetBase* p = First(); p; p = Next() )
     856             :     {
     857       25946 :         if( p->GetParent() == rOld )
     858             :         {
     859         944 :             if(bVirtual)
     860           0 :                 p->SetParent( rNew );
     861             :             else
     862         944 :                 p->aParent = rNew;
     863             :         }
     864             :     }
     865        1676 :     SetSearchMask(GetSearchFamily(), nTmpMask);
     866        1676 : }
     867             : 
     868           0 : void SfxStyleSheetBase::Load( SvStream&, sal_uInt16 )
     869             : {
     870           0 : }
     871             : 
     872           0 : void SfxStyleSheetBase::Store( SvStream& )
     873             : {
     874           0 : }
     875             : 
     876             : 
     877             : 
     878             : 
     879       37816 : SfxStyleSheet::SfxStyleSheet(const OUString &rName,
     880             :                              const SfxStyleSheetBasePool& r_Pool,
     881             :                              SfxStyleFamily eFam,
     882             :                              sal_uInt16 mask )
     883       37816 :     : SfxStyleSheetBase(rName, const_cast< SfxStyleSheetBasePool* >( &r_Pool ), eFam, mask)
     884             : {
     885       37816 : }
     886             : 
     887           0 : SfxStyleSheet::SfxStyleSheet(const SfxStyleSheet& rStyle)
     888             :     : SfxStyleSheetBase(rStyle)
     889             :     , SfxListener( rStyle )
     890             :     , SfxBroadcaster( rStyle )
     891           0 :     , svl::StyleSheetUser()
     892             : {
     893           0 : }
     894             : 
     895       75604 : SfxStyleSheet::~SfxStyleSheet()
     896             : {
     897       37802 :     Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_INDESTRUCTION, *this ) );
     898       37802 : }
     899             : 
     900             : 
     901       42922 : bool SfxStyleSheet::SetParent( const OUString& rName )
     902             : {
     903       42922 :     if(aParent == rName)
     904       11162 :         return true;
     905       31760 :     const OUString aOldParent(aParent);
     906       31760 :     if(SfxStyleSheetBase::SetParent(rName))
     907             :     {
     908             :         // Remove from notification chain of the old parent if applicable
     909       31760 :         if(!aOldParent.isEmpty())
     910             :         {
     911        2968 :             SfxStyleSheet *pParent = static_cast<SfxStyleSheet *>(pPool->Find(aOldParent, nFamily, SFXSTYLEBIT_ALL));
     912        2968 :             if(pParent)
     913        2968 :                 EndListening(*pParent);
     914             :         }
     915             :         // Add to the notification chain of the new parent
     916       31760 :         if(!aParent.isEmpty())
     917             :         {
     918       31760 :             SfxStyleSheet *pParent = static_cast<SfxStyleSheet *>(pPool->Find(aParent, nFamily, SFXSTYLEBIT_ALL));
     919       31760 :             if(pParent)
     920       31760 :                 StartListening(*pParent);
     921             :         }
     922       31760 :         return true;
     923             :     }
     924           0 :     return false;
     925             : }
     926             : 
     927             : /**
     928             :  * Notify all listeners
     929             :  */
     930     2126878 : void SfxStyleSheet::Notify(SfxBroadcaster& rBC, const SfxHint& rHint )
     931             : {
     932     2126878 :     Forward(rBC, rHint);
     933     2126878 : }
     934             : 
     935        9726 : bool SfxStyleSheet::isUsedByModel() const
     936             : {
     937        9726 :     return IsUsed();
     938             : }
     939             : 
     940             : 
     941        2700 : SfxStyleSheetPool::SfxStyleSheetPool( SfxItemPool const& rSet)
     942        2700 : : SfxStyleSheetBasePool( const_cast< SfxItemPool& >( rSet ) )
     943             : {
     944        2700 : }
     945             : 
     946           0 : SfxStyleSheetBase* SfxStyleSheetPool::Create( const OUString& rName,
     947             :                                               SfxStyleFamily eFam, sal_uInt16 mask )
     948             : {
     949           0 :     return new SfxStyleSheet( rName, *this, eFam, mask );
     950             : }
     951             : 
     952           0 : SfxStyleSheetBase* SfxStyleSheetPool::Create( const SfxStyleSheet& r )
     953             : {
     954           0 :     return new SfxStyleSheet( r );
     955             : }
     956             : 
     957       28762 : SfxUnoStyleSheet::SfxUnoStyleSheet( const OUString& _rName, const SfxStyleSheetBasePool& _rPool, SfxStyleFamily _eFamily, sal_uInt16 _nMaske )
     958       28762 : : ::cppu::ImplInheritanceHelper2< SfxStyleSheet, ::com::sun::star::style::XStyle, ::com::sun::star::lang::XUnoTunnel >( _rName, _rPool, _eFamily, _nMaske )
     959             : {
     960       28762 : }
     961             : 
     962        2934 : SfxUnoStyleSheet* SfxUnoStyleSheet::getUnoStyleSheet( const ::com::sun::star::uno::Reference< ::com::sun::star::style::XStyle >& xStyle )
     963             : {
     964        2934 :     SfxUnoStyleSheet* pRet = dynamic_cast< SfxUnoStyleSheet* >( xStyle.get() );
     965        2934 :     if( !pRet )
     966             :     {
     967           0 :         ::com::sun::star::uno::Reference< ::com::sun::star::lang::XUnoTunnel > xUT( xStyle, ::com::sun::star::uno::UNO_QUERY );
     968           0 :         if( xUT.is() )
     969           0 :             pRet = reinterpret_cast<SfxUnoStyleSheet*>(sal::static_int_cast<sal_uIntPtr>(xUT->getSomething( SfxUnoStyleSheet::getIdentifier())));
     970             :     }
     971        2934 :     return pRet;
     972             : }
     973             : 
     974             : /**
     975             :  * XUnoTunnel
     976             :  */
     977           0 : ::sal_Int64 SAL_CALL SfxUnoStyleSheet::getSomething( const ::com::sun::star::uno::Sequence< ::sal_Int8 >& rId ) throw (::com::sun::star::uno::RuntimeException, std::exception)
     978             : {
     979           0 :     if( rId.getLength() == 16 && 0 == memcmp( getIdentifier().getConstArray(), rId.getConstArray(), 16 ) )
     980             :     {
     981           0 :         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_uIntPtr>(this));
     982             :     }
     983             :     else
     984             :     {
     985           0 :         return 0;
     986             :     }
     987             : }
     988             : 
     989             : void
     990       37816 : SfxStyleSheetBasePool::StoreStyleSheet(rtl::Reference< SfxStyleSheetBase > xStyle)
     991             : {
     992       37816 :     mIndexedStyleSheets->AddStyleSheet(xStyle);
     993       37816 : }
     994             : 
     995             : namespace
     996             : {
     997             :     class theSfxUnoStyleSheetIdentifier : public rtl::Static< UnoTunnelIdInit, theSfxUnoStyleSheetIdentifier > {};
     998             : }
     999             : 
    1000           0 : const ::com::sun::star::uno::Sequence< ::sal_Int8 >& SfxUnoStyleSheet::getIdentifier()
    1001             : {
    1002           0 :     return theSfxUnoStyleSheetIdentifier::get().getSeq();
    1003             : }
    1004             : 
    1005             : void
    1006        1674 : SfxStyleSheetBasePool::Reindex()
    1007             : {
    1008        1674 :     mIndexedStyleSheets->Reindex();
    1009        1674 : }
    1010             : 
    1011             : const svl::IndexedStyleSheets&
    1012           0 : SfxStyleSheetBasePool::GetIndexedStyleSheets() const
    1013             : {
    1014           0 :     return *mIndexedStyleSheets;
    1015             : }
    1016             : 
    1017             : rtl::Reference<SfxStyleSheetBase>
    1018           0 : SfxStyleSheetBasePool::GetStyleSheetByPositionInIndex(unsigned pos)
    1019             : {
    1020           0 :     return mIndexedStyleSheets->GetStyleSheetByPosition(pos);
    1021             : }
    1022             : 
    1023             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10