1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_svl.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include <limits.h> 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir #ifndef GCC 34*cdf0e10cSrcweir #endif 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir #include <svl/itempool.hxx> 37*cdf0e10cSrcweir #include <svl/itemset.hxx> 38*cdf0e10cSrcweir #include <svl/poolcach.hxx> 39*cdf0e10cSrcweir 40*cdf0e10cSrcweir // STATIC DATA ----------------------------------------------------------- 41*cdf0e10cSrcweir 42*cdf0e10cSrcweir DBG_NAME(SfxItemPoolCache) 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir //------------------------------------------------------------------------ 45*cdf0e10cSrcweir 46*cdf0e10cSrcweir SfxItemPoolCache::SfxItemPoolCache( SfxItemPool *pItemPool, 47*cdf0e10cSrcweir const SfxPoolItem *pPutItem ): 48*cdf0e10cSrcweir pPool(pItemPool), 49*cdf0e10cSrcweir pCache(new SfxItemModifyArr_Impl), 50*cdf0e10cSrcweir pSetToPut( 0 ), 51*cdf0e10cSrcweir pItemToPut( &pItemPool->Put(*pPutItem) ) 52*cdf0e10cSrcweir { 53*cdf0e10cSrcweir DBG_CTOR(SfxItemPoolCache, 0); 54*cdf0e10cSrcweir DBG_ASSERT(pItemPool, "kein Pool angegeben"); 55*cdf0e10cSrcweir } 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir //------------------------------------------------------------------------ 58*cdf0e10cSrcweir 59*cdf0e10cSrcweir SfxItemPoolCache::SfxItemPoolCache( SfxItemPool *pItemPool, 60*cdf0e10cSrcweir const SfxItemSet *pPutSet ): 61*cdf0e10cSrcweir pPool(pItemPool), 62*cdf0e10cSrcweir pCache(new SfxItemModifyArr_Impl), 63*cdf0e10cSrcweir pSetToPut( pPutSet ), 64*cdf0e10cSrcweir pItemToPut( 0 ) 65*cdf0e10cSrcweir { 66*cdf0e10cSrcweir DBG_CTOR(SfxItemPoolCache, 0); 67*cdf0e10cSrcweir DBG_ASSERT(pItemPool, "kein Pool angegeben"); 68*cdf0e10cSrcweir } 69*cdf0e10cSrcweir 70*cdf0e10cSrcweir //------------------------------------------------------------------------ 71*cdf0e10cSrcweir 72*cdf0e10cSrcweir SfxItemPoolCache::~SfxItemPoolCache() 73*cdf0e10cSrcweir { 74*cdf0e10cSrcweir DBG_DTOR(SfxItemPoolCache, 0); 75*cdf0e10cSrcweir for ( size_t nPos = 0; nPos < pCache->size(); ++nPos ) { 76*cdf0e10cSrcweir pPool->Remove( *(*pCache)[nPos].pPoolItem ); 77*cdf0e10cSrcweir pPool->Remove( *(*pCache)[nPos].pOrigItem ); 78*cdf0e10cSrcweir } 79*cdf0e10cSrcweir delete pCache; pCache = 0; 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir if ( pItemToPut ) 82*cdf0e10cSrcweir pPool->Remove( *pItemToPut ); 83*cdf0e10cSrcweir } 84*cdf0e10cSrcweir 85*cdf0e10cSrcweir //------------------------------------------------------------------------ 86*cdf0e10cSrcweir 87*cdf0e10cSrcweir const SfxSetItem& SfxItemPoolCache::ApplyTo( const SfxSetItem &rOrigItem, sal_Bool bNew ) 88*cdf0e10cSrcweir { 89*cdf0e10cSrcweir DBG_CHKTHIS(SfxItemPoolCache, 0); 90*cdf0e10cSrcweir DBG_ASSERT( pPool == rOrigItem.GetItemSet().GetPool(), "invalid Pool" ); 91*cdf0e10cSrcweir DBG_ASSERT( IsDefaultItem( &rOrigItem ) || IsPooledItem( &rOrigItem ), 92*cdf0e10cSrcweir "original not in pool" ); 93*cdf0e10cSrcweir 94*cdf0e10cSrcweir // Find whether this Transformations ever occurred 95*cdf0e10cSrcweir for ( size_t nPos = 0; nPos < pCache->size(); ++nPos ) 96*cdf0e10cSrcweir { 97*cdf0e10cSrcweir SfxItemModifyImpl &rMapEntry = (*pCache)[nPos]; 98*cdf0e10cSrcweir if ( rMapEntry.pOrigItem == &rOrigItem ) 99*cdf0e10cSrcweir { 100*cdf0e10cSrcweir // aendert sich ueberhaupt etwas? 101*cdf0e10cSrcweir if ( rMapEntry.pPoolItem != &rOrigItem ) 102*cdf0e10cSrcweir { 103*cdf0e10cSrcweir rMapEntry.pPoolItem->AddRef(2); // einen davon fuer den Cache 104*cdf0e10cSrcweir if ( bNew ) 105*cdf0e10cSrcweir pPool->Put( rOrigItem ); //! AddRef?? 106*cdf0e10cSrcweir } 107*cdf0e10cSrcweir return *rMapEntry.pPoolItem; 108*cdf0e10cSrcweir } 109*cdf0e10cSrcweir } 110*cdf0e10cSrcweir 111*cdf0e10cSrcweir // die neue Attributierung in einem neuen Set eintragen 112*cdf0e10cSrcweir SfxSetItem *pNewItem = (SfxSetItem *)rOrigItem.Clone(); 113*cdf0e10cSrcweir if ( pItemToPut ) 114*cdf0e10cSrcweir { 115*cdf0e10cSrcweir pNewItem->GetItemSet().PutDirect( *pItemToPut ); 116*cdf0e10cSrcweir DBG_ASSERT( &pNewItem->GetItemSet().Get( pItemToPut->Which() ) == pItemToPut, 117*cdf0e10cSrcweir "wrong item in temporary set" ); 118*cdf0e10cSrcweir } 119*cdf0e10cSrcweir else 120*cdf0e10cSrcweir pNewItem->GetItemSet().Put( *pSetToPut ); 121*cdf0e10cSrcweir const SfxSetItem* pNewPoolItem = (const SfxSetItem*) &pPool->Put( *pNewItem ); 122*cdf0e10cSrcweir DBG_ASSERT( pNewPoolItem != pNewItem, "Pool: rein == raus?" ); 123*cdf0e10cSrcweir delete pNewItem; 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir // Refernzzaehler anpassen, je einen davon fuer den Cache 126*cdf0e10cSrcweir pNewPoolItem->AddRef( pNewPoolItem != &rOrigItem ? 2 : 1 ); 127*cdf0e10cSrcweir if ( bNew ) 128*cdf0e10cSrcweir pPool->Put( rOrigItem ); //! AddRef?? 129*cdf0e10cSrcweir 130*cdf0e10cSrcweir // die Transformation im Cache eintragen 131*cdf0e10cSrcweir SfxItemModifyImpl aModify; 132*cdf0e10cSrcweir aModify.pOrigItem = &rOrigItem; 133*cdf0e10cSrcweir aModify.pPoolItem = (SfxSetItem*) pNewPoolItem; 134*cdf0e10cSrcweir pCache->push_back( aModify ); 135*cdf0e10cSrcweir 136*cdf0e10cSrcweir DBG_ASSERT( !pItemToPut || 137*cdf0e10cSrcweir &pNewPoolItem->GetItemSet().Get( pItemToPut->Which() ) == pItemToPut, 138*cdf0e10cSrcweir "wrong item in resulting set" ); 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir return *pNewPoolItem; 141*cdf0e10cSrcweir } 142*cdf0e10cSrcweir 143*cdf0e10cSrcweir 144*cdf0e10cSrcweir 145