xref: /trunk/main/svtools/source/misc/itemdel.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*5900e8ecSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*5900e8ecSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*5900e8ecSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*5900e8ecSAndrew Rist  * distributed with this work for additional information
6*5900e8ecSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*5900e8ecSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*5900e8ecSAndrew Rist  * "License"); you may not use this file except in compliance
9*5900e8ecSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*5900e8ecSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*5900e8ecSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*5900e8ecSAndrew Rist  * software distributed under the License is distributed on an
15*5900e8ecSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*5900e8ecSAndrew Rist  * KIND, either express or implied.  See the License for the
17*5900e8ecSAndrew Rist  * specific language governing permissions and limitations
18*5900e8ecSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*5900e8ecSAndrew Rist  *************************************************************/
21*5900e8ecSAndrew Rist 
22*5900e8ecSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svtools.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <svtools/itemdel.hxx>
28cdf0e10cSrcweir #include <vcl/svapp.hxx>
29cdf0e10cSrcweir #include <tools/errcode.hxx>
30cdf0e10cSrcweir #include <limits.h>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include <svtools/svtdata.hxx>
33cdf0e10cSrcweir #include <svl/svarray.hxx>
34cdf0e10cSrcweir #include <svl/itempool.hxx>
35cdf0e10cSrcweir 
36cdf0e10cSrcweir // STATIC DATA -----------------------------------------------------------
37cdf0e10cSrcweir 
38cdf0e10cSrcweir DBG_NAME(SfxItemDesruptor_Impl);
39cdf0e10cSrcweir 
40cdf0e10cSrcweir // -----------------------------------------------------------------------
41cdf0e10cSrcweir 
42cdf0e10cSrcweir class SfxItemDesruptor_Impl
43cdf0e10cSrcweir {
44cdf0e10cSrcweir     SfxPoolItem *pItem;
45cdf0e10cSrcweir     Link         aLink;
46cdf0e10cSrcweir 
47cdf0e10cSrcweir private:
48cdf0e10cSrcweir                  DECL_LINK( Delete, void * );
49cdf0e10cSrcweir                  SfxItemDesruptor_Impl( const SfxItemDesruptor_Impl& ); // n.i.
50cdf0e10cSrcweir 
51cdf0e10cSrcweir public:
52cdf0e10cSrcweir                  SfxItemDesruptor_Impl( SfxPoolItem *pItemToDesrupt );
53cdf0e10cSrcweir                  ~SfxItemDesruptor_Impl();
54cdf0e10cSrcweir };
55cdf0e10cSrcweir 
56cdf0e10cSrcweir SV_DECL_PTRARR( SfxItemDesruptorList_Impl, SfxItemDesruptor_Impl*, 4, 4 )
57cdf0e10cSrcweir 
58cdf0e10cSrcweir // ------------------------------------------------------------------------
SfxItemDesruptor_Impl(SfxPoolItem * pItemToDesrupt)59cdf0e10cSrcweir SfxItemDesruptor_Impl::SfxItemDesruptor_Impl( SfxPoolItem *pItemToDesrupt ):
60cdf0e10cSrcweir     pItem(pItemToDesrupt),
61cdf0e10cSrcweir     aLink( LINK(this, SfxItemDesruptor_Impl, Delete) )
62cdf0e10cSrcweir {
63cdf0e10cSrcweir     DBG_CTOR(SfxItemDesruptor_Impl, 0);
64cdf0e10cSrcweir 
65cdf0e10cSrcweir     DBG_ASSERT( 0 == pItem->GetRefCount(), "desrupting pooled item" );
66cdf0e10cSrcweir     pItem->SetKind( SFX_ITEMS_DELETEONIDLE );
67cdf0e10cSrcweir 
68cdf0e10cSrcweir     // im Idle abarbeiten
69cdf0e10cSrcweir     GetpApp()->InsertIdleHdl( aLink, 1 );
70cdf0e10cSrcweir 
71cdf0e10cSrcweir     // und in Liste eintragen (damit geflusht werden kann)
72cdf0e10cSrcweir     SfxItemDesruptorList_Impl* &rpList = ImpSvtData::GetSvtData().pItemDesruptList;
73cdf0e10cSrcweir     if ( !rpList )
74cdf0e10cSrcweir         rpList = new SfxItemDesruptorList_Impl;
75cdf0e10cSrcweir     const SfxItemDesruptor_Impl *pThis = this;
76cdf0e10cSrcweir     rpList->Insert( pThis, rpList->Count() );
77cdf0e10cSrcweir }
78cdf0e10cSrcweir 
79cdf0e10cSrcweir // ------------------------------------------------------------------------
~SfxItemDesruptor_Impl()80cdf0e10cSrcweir SfxItemDesruptor_Impl::~SfxItemDesruptor_Impl()
81cdf0e10cSrcweir {
82cdf0e10cSrcweir     DBG_DTOR(SfxItemDesruptor_Impl, 0);
83cdf0e10cSrcweir 
84cdf0e10cSrcweir     // aus Idle-Handler austragen
85cdf0e10cSrcweir     GetpApp()->RemoveIdleHdl( aLink );
86cdf0e10cSrcweir 
87cdf0e10cSrcweir     // und aus Liste austragen
88cdf0e10cSrcweir     SfxItemDesruptorList_Impl* &rpList = ImpSvtData::GetSvtData().pItemDesruptList;
89cdf0e10cSrcweir     DBG_ASSERT( rpList, "no DesruptorList" );
90cdf0e10cSrcweir     const SfxItemDesruptor_Impl *pThis = this;
91cdf0e10cSrcweir     if ( rpList ) HACK(warum?)
92cdf0e10cSrcweir         rpList->Remove( rpList->GetPos(pThis) );
93cdf0e10cSrcweir 
94cdf0e10cSrcweir     // reset RefCount (was set to SFX_ITEMS_SPECIAL before!)
95cdf0e10cSrcweir     pItem->SetRefCount( 0 );
96cdf0e10cSrcweir     //DBG_CHKOBJ( pItem, SfxPoolItem, 0 );
97cdf0e10cSrcweir     delete pItem;
98cdf0e10cSrcweir }
99cdf0e10cSrcweir 
100cdf0e10cSrcweir // ------------------------------------------------------------------------
IMPL_LINK(SfxItemDesruptor_Impl,Delete,void *,EMPTYARG)101cdf0e10cSrcweir IMPL_LINK( SfxItemDesruptor_Impl, Delete, void *, EMPTYARG )
102cdf0e10cSrcweir {
103cdf0e10cSrcweir     {DBG_CHKTHIS(SfxItemDesruptor_Impl, 0);}
104cdf0e10cSrcweir     delete this;
105cdf0e10cSrcweir     return 0;
106cdf0e10cSrcweir }
107cdf0e10cSrcweir 
108cdf0e10cSrcweir // ------------------------------------------------------------------------
DeleteItemOnIdle(SfxPoolItem * pItem)109cdf0e10cSrcweir SfxPoolItem* DeleteItemOnIdle( SfxPoolItem* pItem )
110cdf0e10cSrcweir {
111cdf0e10cSrcweir     DBG_ASSERT( 0 == pItem->GetRefCount(), "deleting item in use" );
112cdf0e10cSrcweir     new SfxItemDesruptor_Impl( pItem );
113cdf0e10cSrcweir     return pItem;
114cdf0e10cSrcweir }
115cdf0e10cSrcweir 
116cdf0e10cSrcweir // ------------------------------------------------------------------------
DeleteOnIdleItems()117cdf0e10cSrcweir void DeleteOnIdleItems()
118cdf0e10cSrcweir {
119cdf0e10cSrcweir     SfxItemDesruptorList_Impl* &rpList
120cdf0e10cSrcweir      = ImpSvtData::GetSvtData().pItemDesruptList;
121cdf0e10cSrcweir     if ( rpList )
122cdf0e10cSrcweir     {
123cdf0e10cSrcweir         sal_uInt16 n;
124cdf0e10cSrcweir         while ( 0 != ( n = rpList->Count() ) )
125cdf0e10cSrcweir             // Remove ist implizit im Dtor
126cdf0e10cSrcweir             delete rpList->GetObject( n-1 );
127cdf0e10cSrcweir         DELETEZ(rpList);
128cdf0e10cSrcweir     }
129cdf0e10cSrcweir }
130