xref: /aoo4110/main/sw/source/core/attr/calbck.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sw.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <hintids.hxx>		    // contains RES_.. IDs
28*b1cdbd2cSJim Jagielski #include <frame.hxx>
29*b1cdbd2cSJim Jagielski #include <hints.hxx>
30*b1cdbd2cSJim Jagielski #include <swcache.hxx>          // mba: get rid of that dependency
31*b1cdbd2cSJim Jagielski #include <swfntcch.hxx>         // mba: get rid of that dependency
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski static SwClientIter* pClientIters = 0;
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski TYPEINIT0(SwClient);
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski /*************************************************************************/
SwClient(SwModify * pToRegisterIn)38*b1cdbd2cSJim Jagielski SwClient::SwClient(SwModify *pToRegisterIn)
39*b1cdbd2cSJim Jagielski 	: pLeft( 0 ), pRight( 0 ), pRegisteredIn( 0 ), mbIsAllowedToBeRemovedInModifyCall(false)
40*b1cdbd2cSJim Jagielski {
41*b1cdbd2cSJim Jagielski 	if(pToRegisterIn)
42*b1cdbd2cSJim Jagielski         // connect to SwModify
43*b1cdbd2cSJim Jagielski 		pToRegisterIn->Add(this);
44*b1cdbd2cSJim Jagielski }
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski /*************************************************************************/
CheckRegistration(const SfxPoolItem * pOld,const SfxPoolItem *)47*b1cdbd2cSJim Jagielski void SwClient::CheckRegistration( const SfxPoolItem* pOld, const SfxPoolItem * )
48*b1cdbd2cSJim Jagielski {
49*b1cdbd2cSJim Jagielski     // this method only handles notification about dying SwModify objects
50*b1cdbd2cSJim Jagielski 	if( (!pOld || pOld->Which() != RES_OBJECTDYING) )
51*b1cdbd2cSJim Jagielski 		return;
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski 	const SwPtrMsgPoolItem *pDead = static_cast<const SwPtrMsgPoolItem*>(pOld);
54*b1cdbd2cSJim Jagielski 	if(pDead && pDead->pObject == pRegisteredIn)
55*b1cdbd2cSJim Jagielski 	{
56*b1cdbd2cSJim Jagielski         // I've got a notification from the object I know
57*b1cdbd2cSJim Jagielski 		SwModify *pAbove = const_cast<SwModify*>(pRegisteredIn->GetRegisteredIn());
58*b1cdbd2cSJim Jagielski 		if(pAbove)
59*b1cdbd2cSJim Jagielski 		{
60*b1cdbd2cSJim Jagielski             // if the dying object itself was listening at an SwModify, I take over
61*b1cdbd2cSJim Jagielski             // adding myself to pAbove will automatically remove me from my current pRegisteredIn
62*b1cdbd2cSJim Jagielski 			pAbove->Add(this);
63*b1cdbd2cSJim Jagielski 			return;
64*b1cdbd2cSJim Jagielski 		}
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski         // destroy connection
67*b1cdbd2cSJim Jagielski 		pRegisteredIn->Remove(this);
68*b1cdbd2cSJim Jagielski 	}
69*b1cdbd2cSJim Jagielski }
70*b1cdbd2cSJim Jagielski 
Modify(const SfxPoolItem * pOldValue,const SfxPoolItem * pNewValue)71*b1cdbd2cSJim Jagielski void SwClient::Modify( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue )
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski     CheckRegistration( pOldValue, pNewValue );
74*b1cdbd2cSJim Jagielski }
75*b1cdbd2cSJim Jagielski 
SwClientNotify(const SwModify &,const SfxHint &)76*b1cdbd2cSJim Jagielski void SwClient::SwClientNotify( const SwModify&, const SfxHint& )
77*b1cdbd2cSJim Jagielski {
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski }
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski //*************************************************************************
~SwClient()82*b1cdbd2cSJim Jagielski SwClient::~SwClient()
83*b1cdbd2cSJim Jagielski {
84*b1cdbd2cSJim Jagielski     DBG_ASSERT( !pRegisteredIn || pRegisteredIn->GetDepends(),"SwModify still known, but Client already disconnected!" );
85*b1cdbd2cSJim Jagielski 	if( pRegisteredIn && pRegisteredIn->GetDepends() )
86*b1cdbd2cSJim Jagielski         // still connected
87*b1cdbd2cSJim Jagielski 		pRegisteredIn->Remove( this );
88*b1cdbd2cSJim Jagielski }
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski 
GetInfo(SfxPoolItem &) const91*b1cdbd2cSJim Jagielski sal_Bool SwClient::GetInfo( SfxPoolItem& ) const
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski 	return sal_True;		// und weiter
94*b1cdbd2cSJim Jagielski }
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski /*************************************************************************/
SwModify()98*b1cdbd2cSJim Jagielski SwModify::SwModify()
99*b1cdbd2cSJim Jagielski     : SwClient(0), pRoot(0)
100*b1cdbd2cSJim Jagielski {
101*b1cdbd2cSJim Jagielski     bModifyLocked = sal_False;
102*b1cdbd2cSJim Jagielski     bLockClientList = sal_False;
103*b1cdbd2cSJim Jagielski 	bInDocDTOR = sal_False;
104*b1cdbd2cSJim Jagielski 	bInCache = sal_False;
105*b1cdbd2cSJim Jagielski 	bInSwFntCache = sal_False;
106*b1cdbd2cSJim Jagielski }
107*b1cdbd2cSJim Jagielski 
SwModify(SwModify * pToRegisterIn)108*b1cdbd2cSJim Jagielski SwModify::SwModify( SwModify *pToRegisterIn )
109*b1cdbd2cSJim Jagielski 	: SwClient(pToRegisterIn), pRoot( 0 )
110*b1cdbd2cSJim Jagielski {
111*b1cdbd2cSJim Jagielski     bModifyLocked = sal_False;
112*b1cdbd2cSJim Jagielski     bLockClientList = sal_False;
113*b1cdbd2cSJim Jagielski 	bInDocDTOR = sal_False;
114*b1cdbd2cSJim Jagielski 	bInCache = sal_False;
115*b1cdbd2cSJim Jagielski 	bInSwFntCache = sal_False;
116*b1cdbd2cSJim Jagielski }
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski /*************************************************************************/
~SwModify()119*b1cdbd2cSJim Jagielski SwModify::~SwModify()
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski 	ASSERT( !IsModifyLocked(), "Modify destroyed but locked." );
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski 	if ( IsInCache() )
124*b1cdbd2cSJim Jagielski 		SwFrm::GetCache().Delete( this );
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski 	if ( IsInSwFntCache() )
127*b1cdbd2cSJim Jagielski 		pSwFontCache->Delete( this );
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski 	if( pRoot )
130*b1cdbd2cSJim Jagielski 	{
131*b1cdbd2cSJim Jagielski         // there are depending objects
132*b1cdbd2cSJim Jagielski 		if( IsInDocDTOR() )
133*b1cdbd2cSJim Jagielski 		{
134*b1cdbd2cSJim Jagielski 			// if document gets destroyed anyway, just tell clients to forget me
135*b1cdbd2cSJim Jagielski             // so that they don't try to get removed from my list later when they also get destroyed
136*b1cdbd2cSJim Jagielski 			SwClientIter aIter( *this );
137*b1cdbd2cSJim Jagielski 			SwClient* p = aIter.GoStart();
138*b1cdbd2cSJim Jagielski 			while ( p )
139*b1cdbd2cSJim Jagielski             {
140*b1cdbd2cSJim Jagielski 				p->pRegisteredIn = 0;
141*b1cdbd2cSJim Jagielski                 p = ++aIter;
142*b1cdbd2cSJim Jagielski             }
143*b1cdbd2cSJim Jagielski 		}
144*b1cdbd2cSJim Jagielski 		else
145*b1cdbd2cSJim Jagielski 		{
146*b1cdbd2cSJim Jagielski 			// notify all clients that they shall remove themselves
147*b1cdbd2cSJim Jagielski 			SwPtrMsgPoolItem aDyObject( RES_OBJECTDYING, this );
148*b1cdbd2cSJim Jagielski 			NotifyClients( &aDyObject, &aDyObject );
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski             // remove all clients that have not done themselves
151*b1cdbd2cSJim Jagielski             // mba: possibly a hotfix for forgotten base class calls?!
152*b1cdbd2cSJim Jagielski 			while( pRoot )
153*b1cdbd2cSJim Jagielski 				pRoot->CheckRegistration(&aDyObject, &aDyObject);
154*b1cdbd2cSJim Jagielski 		}
155*b1cdbd2cSJim Jagielski 	}
156*b1cdbd2cSJim Jagielski }
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski /*************************************************************************/
Modify(const SfxPoolItem * pOldValue,const SfxPoolItem * pNewValue)159*b1cdbd2cSJim Jagielski void SwModify::Modify( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue )
160*b1cdbd2cSJim Jagielski {
161*b1cdbd2cSJim Jagielski     NotifyClients( pOldValue, pNewValue );
162*b1cdbd2cSJim Jagielski }
163*b1cdbd2cSJim Jagielski 
NotifyClients(const SfxPoolItem * pOldValue,const SfxPoolItem * pNewValue)164*b1cdbd2cSJim Jagielski void SwModify::NotifyClients( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue )
165*b1cdbd2cSJim Jagielski {
166*b1cdbd2cSJim Jagielski 	if (IsInCache() || IsInSwFntCache())
167*b1cdbd2cSJim Jagielski 	{
168*b1cdbd2cSJim Jagielski 		const sal_uInt16 nWhich = pOldValue ? pOldValue->Which() :
169*b1cdbd2cSJim Jagielski 										pNewValue ? pNewValue->Which() : 0;
170*b1cdbd2cSJim Jagielski 		CheckCaching( nWhich );
171*b1cdbd2cSJim Jagielski 	}
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski   	if (!pRoot || IsModifyLocked())
174*b1cdbd2cSJim Jagielski 		return;
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski 	LockModify();
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski     // mba: WTF?!
179*b1cdbd2cSJim Jagielski 	if( !pOldValue )
180*b1cdbd2cSJim Jagielski 		bLockClientList = sal_True;
181*b1cdbd2cSJim Jagielski 	else
182*b1cdbd2cSJim Jagielski     {
183*b1cdbd2cSJim Jagielski 		// following Modifies shouldn't call an ASSERT
184*b1cdbd2cSJim Jagielski 		switch( pOldValue->Which() )
185*b1cdbd2cSJim Jagielski 		{
186*b1cdbd2cSJim Jagielski 		case RES_OBJECTDYING:
187*b1cdbd2cSJim Jagielski  		case RES_REMOVE_UNO_OBJECT:
188*b1cdbd2cSJim Jagielski 			bLockClientList = ((SwPtrMsgPoolItem *)pOldValue)->pObject != this;
189*b1cdbd2cSJim Jagielski 			break;
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski 		case RES_FOOTNOTE_DELETED:
192*b1cdbd2cSJim Jagielski 		case RES_REFMARK_DELETED:
193*b1cdbd2cSJim Jagielski 		case RES_TOXMARK_DELETED:
194*b1cdbd2cSJim Jagielski 		case RES_FIELD_DELETED:
195*b1cdbd2cSJim Jagielski 			bLockClientList = sal_False;
196*b1cdbd2cSJim Jagielski 			break;
197*b1cdbd2cSJim Jagielski 		default:
198*b1cdbd2cSJim Jagielski 			bLockClientList = sal_True;
199*b1cdbd2cSJim Jagielski 		}
200*b1cdbd2cSJim Jagielski     }
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski     ModifyBroadcast( pOldValue, pNewValue );
203*b1cdbd2cSJim Jagielski 	bLockClientList = sal_False;
204*b1cdbd2cSJim Jagielski 	UnlockModify();
205*b1cdbd2cSJim Jagielski }
206*b1cdbd2cSJim Jagielski 
GetInfo(SfxPoolItem & rInfo) const207*b1cdbd2cSJim Jagielski sal_Bool SwModify::GetInfo( SfxPoolItem& rInfo ) const
208*b1cdbd2cSJim Jagielski {
209*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_True;		// bedeutet weiter zum naechsten
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski 	if( pRoot )
212*b1cdbd2cSJim Jagielski 	{
213*b1cdbd2cSJim Jagielski 		SwClientIter aIter( *(SwModify*)this );
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 		SwClient* pLast = aIter.GoStart();
216*b1cdbd2cSJim Jagielski 		if( pLast )
217*b1cdbd2cSJim Jagielski 			while( 0 != ( bRet = pLast->GetInfo( rInfo )) &&
218*b1cdbd2cSJim Jagielski 					0 != ( pLast = ++aIter ) )
219*b1cdbd2cSJim Jagielski 				;
220*b1cdbd2cSJim Jagielski 	}
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski 	return bRet;
223*b1cdbd2cSJim Jagielski }
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski /*************************************************************************/
Add(SwClient * pDepend)226*b1cdbd2cSJim Jagielski void SwModify::Add(SwClient *pDepend)
227*b1cdbd2cSJim Jagielski {
228*b1cdbd2cSJim Jagielski 	ASSERT( !bLockClientList, "Client inserted while in Modify" );
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski 	if(pDepend->pRegisteredIn != this )
231*b1cdbd2cSJim Jagielski 	{
232*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
233*b1cdbd2cSJim Jagielski 		SwClientIter* pTmp = pClientIters;
234*b1cdbd2cSJim Jagielski 		while( pTmp )
235*b1cdbd2cSJim Jagielski 		{
236*b1cdbd2cSJim Jagielski 			ASSERT( &pTmp->GetModify() != pRoot, "Client added to active ClientIter" );
237*b1cdbd2cSJim Jagielski 			pTmp = pTmp->pNxtIter;
238*b1cdbd2cSJim Jagielski 		}
239*b1cdbd2cSJim Jagielski #endif
240*b1cdbd2cSJim Jagielski 		// deregister new client in case it is already registered elsewhere
241*b1cdbd2cSJim Jagielski 		if( pDepend->pRegisteredIn != 0 )
242*b1cdbd2cSJim Jagielski 			pDepend->pRegisteredIn->Remove( pDepend );
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski 		if( !pRoot )
245*b1cdbd2cSJim Jagielski 		{
246*b1cdbd2cSJim Jagielski             // first client added
247*b1cdbd2cSJim Jagielski 			pRoot = pDepend;
248*b1cdbd2cSJim Jagielski 			pRoot->pLeft = 0;
249*b1cdbd2cSJim Jagielski 			pRoot->pRight = 0;
250*b1cdbd2cSJim Jagielski 		}
251*b1cdbd2cSJim Jagielski 		else
252*b1cdbd2cSJim Jagielski 		{
253*b1cdbd2cSJim Jagielski 			// append client
254*b1cdbd2cSJim Jagielski 			pDepend->pRight = pRoot->pRight;
255*b1cdbd2cSJim Jagielski 			pRoot->pRight = pDepend;
256*b1cdbd2cSJim Jagielski 			pDepend->pLeft = pRoot;
257*b1cdbd2cSJim Jagielski 			if( pDepend->pRight )
258*b1cdbd2cSJim Jagielski 				pDepend->pRight->pLeft = pDepend;
259*b1cdbd2cSJim Jagielski 		}
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski         // connect client to me
262*b1cdbd2cSJim Jagielski 		pDepend->pRegisteredIn = this;
263*b1cdbd2cSJim Jagielski 	}
264*b1cdbd2cSJim Jagielski }
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski /*************************************************************************/
267*b1cdbd2cSJim Jagielski 
Remove(SwClient * pDepend)268*b1cdbd2cSJim Jagielski SwClient* SwModify::Remove(SwClient * pDepend)
269*b1cdbd2cSJim Jagielski {
270*b1cdbd2cSJim Jagielski 	if ( bInDocDTOR )
271*b1cdbd2cSJim Jagielski         return 0;
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski     ASSERT( !bLockClientList || pDepend->mbIsAllowedToBeRemovedInModifyCall, "SwClient shall be removed in Modify call!" );
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski 	if( pDepend->pRegisteredIn == this )
276*b1cdbd2cSJim Jagielski 	{
277*b1cdbd2cSJim Jagielski         // SwClient is my listener
278*b1cdbd2cSJim Jagielski         // remove it from my list
279*b1cdbd2cSJim Jagielski 		SwClient* pR = pDepend->pRight;
280*b1cdbd2cSJim Jagielski 		SwClient* pL = pDepend->pLeft;
281*b1cdbd2cSJim Jagielski 		if( pRoot == pDepend )
282*b1cdbd2cSJim Jagielski 			pRoot = pL ? pL : pR;
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski 		if( pL )
285*b1cdbd2cSJim Jagielski 			pL->pRight = pR;
286*b1cdbd2cSJim Jagielski 		if( pR )
287*b1cdbd2cSJim Jagielski 			pR->pLeft = pL;
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski 		// update ClientIters
290*b1cdbd2cSJim Jagielski 		SwClientIter* pTmp = pClientIters;
291*b1cdbd2cSJim Jagielski 		while( pTmp )
292*b1cdbd2cSJim Jagielski 		{
293*b1cdbd2cSJim Jagielski 			if( pTmp->pAct == pDepend || pTmp->pDelNext == pDepend )
294*b1cdbd2cSJim Jagielski                 // if object being removed is the current or next object in an iterator, advance this iterator
295*b1cdbd2cSJim Jagielski 				pTmp->pDelNext = pR;
296*b1cdbd2cSJim Jagielski 			pTmp = pTmp->pNxtIter;
297*b1cdbd2cSJim Jagielski 		}
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski 		pDepend->pLeft = 0;
300*b1cdbd2cSJim Jagielski 		pDepend->pRight = 0;
301*b1cdbd2cSJim Jagielski 	}
302*b1cdbd2cSJim Jagielski 	else
303*b1cdbd2cSJim Jagielski     {
304*b1cdbd2cSJim Jagielski 		ASSERT( false, "SwModify::Remove(): pDepend nicht gefunden" );
305*b1cdbd2cSJim Jagielski     }
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski     // disconnect client from me
308*b1cdbd2cSJim Jagielski 	pDepend->pRegisteredIn = 0;
309*b1cdbd2cSJim Jagielski 	return pDepend;
310*b1cdbd2cSJim Jagielski }
311*b1cdbd2cSJim Jagielski 
GetClientCount() const312*b1cdbd2cSJim Jagielski int SwModify::GetClientCount() const
313*b1cdbd2cSJim Jagielski {
314*b1cdbd2cSJim Jagielski     int nRet=0;
315*b1cdbd2cSJim Jagielski     SwClientIter aIter( *this );
316*b1cdbd2cSJim Jagielski     SwClient *pLast = aIter.GoStart();
317*b1cdbd2cSJim Jagielski     if( pLast )
318*b1cdbd2cSJim Jagielski         do
319*b1cdbd2cSJim Jagielski         {
320*b1cdbd2cSJim Jagielski             ++nRet;
321*b1cdbd2cSJim Jagielski         } while( 0 != ( pLast = ++aIter ));
322*b1cdbd2cSJim Jagielski     return nRet;
323*b1cdbd2cSJim Jagielski }
324*b1cdbd2cSJim Jagielski 
CheckCaching(const sal_uInt16 nWhich)325*b1cdbd2cSJim Jagielski void SwModify::CheckCaching( const sal_uInt16 nWhich )
326*b1cdbd2cSJim Jagielski {
327*b1cdbd2cSJim Jagielski     if (isCHRATR(nWhich))
328*b1cdbd2cSJim Jagielski     {
329*b1cdbd2cSJim Jagielski         SetInSwFntCache( sal_False );
330*b1cdbd2cSJim Jagielski     }
331*b1cdbd2cSJim Jagielski 	else
332*b1cdbd2cSJim Jagielski 		switch ( nWhich )
333*b1cdbd2cSJim Jagielski 		{
334*b1cdbd2cSJim Jagielski 		case RES_OBJECTDYING:
335*b1cdbd2cSJim Jagielski 		case RES_FMT_CHG:
336*b1cdbd2cSJim Jagielski 		case RES_ATTRSET_CHG:
337*b1cdbd2cSJim Jagielski 			SetInSwFntCache( sal_False );
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski 		case RES_UL_SPACE:
340*b1cdbd2cSJim Jagielski 		case RES_LR_SPACE:
341*b1cdbd2cSJim Jagielski 		case RES_BOX:
342*b1cdbd2cSJim Jagielski 		case RES_SHADOW:
343*b1cdbd2cSJim Jagielski 		case RES_FRM_SIZE:
344*b1cdbd2cSJim Jagielski 		case RES_KEEP:
345*b1cdbd2cSJim Jagielski 		case RES_BREAK:
346*b1cdbd2cSJim Jagielski 			if ( IsInCache() )
347*b1cdbd2cSJim Jagielski 			{
348*b1cdbd2cSJim Jagielski 				SwFrm::GetCache().Delete( this );
349*b1cdbd2cSJim Jagielski 				SetInCache( sal_False );
350*b1cdbd2cSJim Jagielski 			}
351*b1cdbd2cSJim Jagielski 			break;
352*b1cdbd2cSJim Jagielski 		}
353*b1cdbd2cSJim Jagielski }
354*b1cdbd2cSJim Jagielski 
CallSwClientNotify(const SfxHint & rHint) const355*b1cdbd2cSJim Jagielski void SwModify::CallSwClientNotify( const SfxHint& rHint ) const
356*b1cdbd2cSJim Jagielski {
357*b1cdbd2cSJim Jagielski     SwClientIter aIter(*this);
358*b1cdbd2cSJim Jagielski     SwClient * pClient = aIter.GoStart();
359*b1cdbd2cSJim Jagielski     while (pClient)
360*b1cdbd2cSJim Jagielski     {
361*b1cdbd2cSJim Jagielski         pClient->SwClientNotify( *this, rHint );
362*b1cdbd2cSJim Jagielski         pClient = ++aIter;
363*b1cdbd2cSJim Jagielski     }
364*b1cdbd2cSJim Jagielski }
365*b1cdbd2cSJim Jagielski 
ModifyBroadcast(const SfxPoolItem * pOldValue,const SfxPoolItem * pNewValue,TypeId nType)366*b1cdbd2cSJim Jagielski void SwModify::ModifyBroadcast( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue, TypeId nType )
367*b1cdbd2cSJim Jagielski {
368*b1cdbd2cSJim Jagielski     SwClientIter aIter(*this);
369*b1cdbd2cSJim Jagielski     SwClient * pClient = aIter.First( nType );
370*b1cdbd2cSJim Jagielski     while (pClient)
371*b1cdbd2cSJim Jagielski     {
372*b1cdbd2cSJim Jagielski         pClient->Modify( pOldValue, pNewValue );
373*b1cdbd2cSJim Jagielski         pClient = aIter.Next();
374*b1cdbd2cSJim Jagielski     }
375*b1cdbd2cSJim Jagielski }
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski // ----------
378*b1cdbd2cSJim Jagielski // SwDepend
379*b1cdbd2cSJim Jagielski // ----------
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski /*************************************************************************/
382*b1cdbd2cSJim Jagielski 
SwDepend(SwClient * pTellHim,SwModify * pDepend)383*b1cdbd2cSJim Jagielski SwDepend::SwDepend(SwClient *pTellHim, SwModify *pDepend)
384*b1cdbd2cSJim Jagielski 	: SwClient(pDepend)
385*b1cdbd2cSJim Jagielski {
386*b1cdbd2cSJim Jagielski 	pToTell  = pTellHim;
387*b1cdbd2cSJim Jagielski }
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski /*************************************************************************/
390*b1cdbd2cSJim Jagielski 
Modify(const SfxPoolItem * pOldValue,const SfxPoolItem * pNewValue)391*b1cdbd2cSJim Jagielski void SwDepend::Modify( const SfxPoolItem* pOldValue, const SfxPoolItem *pNewValue )
392*b1cdbd2cSJim Jagielski {
393*b1cdbd2cSJim Jagielski 	if(pNewValue && pNewValue->Which() == RES_OBJECTDYING)
394*b1cdbd2cSJim Jagielski 		CheckRegistration(pOldValue,pNewValue);
395*b1cdbd2cSJim Jagielski 	else if(pToTell)
396*b1cdbd2cSJim Jagielski 		pToTell->ModifyNotification(pOldValue, pNewValue);
397*b1cdbd2cSJim Jagielski }
398*b1cdbd2cSJim Jagielski 
SwClientNotify(const SwModify & rMod,const SfxHint & rHint)399*b1cdbd2cSJim Jagielski void SwDepend::SwClientNotify( const SwModify& rMod, const SfxHint& rHint )
400*b1cdbd2cSJim Jagielski {
401*b1cdbd2cSJim Jagielski     if ( pToTell )
402*b1cdbd2cSJim Jagielski         pToTell->SwClientNotifyCall( rMod, rHint );
403*b1cdbd2cSJim Jagielski }
404*b1cdbd2cSJim Jagielski 
GetInfo(SfxPoolItem & rInfo) const405*b1cdbd2cSJim Jagielski sal_Bool SwDepend::GetInfo( SfxPoolItem& rInfo ) const
406*b1cdbd2cSJim Jagielski {
407*b1cdbd2cSJim Jagielski 	return pToTell ? pToTell->GetInfo( rInfo ) : sal_True;
408*b1cdbd2cSJim Jagielski }
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski /********************************************************************/
411*b1cdbd2cSJim Jagielski 
SwClientIter(const SwModify & rModify)412*b1cdbd2cSJim Jagielski SwClientIter::SwClientIter( const SwModify& rModify )
413*b1cdbd2cSJim Jagielski 	: rRoot( rModify )
414*b1cdbd2cSJim Jagielski {
415*b1cdbd2cSJim Jagielski 	pNxtIter = 0;
416*b1cdbd2cSJim Jagielski 	if( pClientIters )
417*b1cdbd2cSJim Jagielski 	{
418*b1cdbd2cSJim Jagielski         // append to list of ClientIters
419*b1cdbd2cSJim Jagielski 		SwClientIter* pTmp = pClientIters;
420*b1cdbd2cSJim Jagielski 		while( pTmp->pNxtIter )
421*b1cdbd2cSJim Jagielski 			pTmp = pTmp->pNxtIter;
422*b1cdbd2cSJim Jagielski 		pTmp->pNxtIter = this;
423*b1cdbd2cSJim Jagielski 	}
424*b1cdbd2cSJim Jagielski 	else
425*b1cdbd2cSJim Jagielski 		pClientIters = this;
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski 	pAct = const_cast<SwClient*>(rRoot.GetDepends());
428*b1cdbd2cSJim Jagielski 	pDelNext = pAct;
429*b1cdbd2cSJim Jagielski }
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski 
~SwClientIter()433*b1cdbd2cSJim Jagielski SwClientIter::~SwClientIter()
434*b1cdbd2cSJim Jagielski {
435*b1cdbd2cSJim Jagielski 	if( pClientIters )
436*b1cdbd2cSJim Jagielski 	{
437*b1cdbd2cSJim Jagielski         // reorganize list of ClientIters
438*b1cdbd2cSJim Jagielski 		if( pClientIters == this )
439*b1cdbd2cSJim Jagielski 			pClientIters = pNxtIter;
440*b1cdbd2cSJim Jagielski 		else
441*b1cdbd2cSJim Jagielski 		{
442*b1cdbd2cSJim Jagielski 			SwClientIter* pTmp = pClientIters;
443*b1cdbd2cSJim Jagielski 			while( pTmp->pNxtIter != this )
444*b1cdbd2cSJim Jagielski 				if( 0 == ( pTmp = pTmp->pNxtIter ) )
445*b1cdbd2cSJim Jagielski 				{
446*b1cdbd2cSJim Jagielski 					ASSERT( this, "wo ist mein Pointer" );
447*b1cdbd2cSJim Jagielski 					return ;
448*b1cdbd2cSJim Jagielski 				}
449*b1cdbd2cSJim Jagielski 			pTmp->pNxtIter = pNxtIter;
450*b1cdbd2cSJim Jagielski 		}
451*b1cdbd2cSJim Jagielski 	}
452*b1cdbd2cSJim Jagielski }
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski 
operator ++()455*b1cdbd2cSJim Jagielski SwClient* SwClientIter::operator++()
456*b1cdbd2cSJim Jagielski {
457*b1cdbd2cSJim Jagielski 	if( pDelNext == pAct )
458*b1cdbd2cSJim Jagielski 	{
459*b1cdbd2cSJim Jagielski 		pAct = pAct->pRight;
460*b1cdbd2cSJim Jagielski 		pDelNext = pAct;
461*b1cdbd2cSJim Jagielski 	}
462*b1cdbd2cSJim Jagielski 	else
463*b1cdbd2cSJim Jagielski 		pAct = pDelNext;
464*b1cdbd2cSJim Jagielski 	return pAct;
465*b1cdbd2cSJim Jagielski }
466*b1cdbd2cSJim Jagielski 
GoStart()467*b1cdbd2cSJim Jagielski SwClient* SwClientIter::GoStart()
468*b1cdbd2cSJim Jagielski {
469*b1cdbd2cSJim Jagielski 	pAct = const_cast<SwClient*>(rRoot.GetDepends());
470*b1cdbd2cSJim Jagielski 	if( pAct )
471*b1cdbd2cSJim Jagielski 		while( pAct->pLeft )
472*b1cdbd2cSJim Jagielski 			pAct = pAct->pLeft;
473*b1cdbd2cSJim Jagielski 	pDelNext = pAct;
474*b1cdbd2cSJim Jagielski 	return pAct;
475*b1cdbd2cSJim Jagielski }
476*b1cdbd2cSJim Jagielski 
GoEnd()477*b1cdbd2cSJim Jagielski SwClient* SwClientIter::GoEnd()
478*b1cdbd2cSJim Jagielski {
479*b1cdbd2cSJim Jagielski 	pAct = pDelNext;
480*b1cdbd2cSJim Jagielski 	if( !pAct )
481*b1cdbd2cSJim Jagielski     	pAct = const_cast<SwClient*>(rRoot.GetDepends());
482*b1cdbd2cSJim Jagielski 	if( pAct )
483*b1cdbd2cSJim Jagielski 		while( pAct->pRight )
484*b1cdbd2cSJim Jagielski 			pAct = pAct->pRight;
485*b1cdbd2cSJim Jagielski 	pDelNext = pAct;
486*b1cdbd2cSJim Jagielski 	return pAct;
487*b1cdbd2cSJim Jagielski }
488*b1cdbd2cSJim Jagielski 
First(TypeId nType)489*b1cdbd2cSJim Jagielski SwClient* SwClientIter::First( TypeId nType )
490*b1cdbd2cSJim Jagielski {
491*b1cdbd2cSJim Jagielski 	aSrchId = nType;
492*b1cdbd2cSJim Jagielski 	GoStart();
493*b1cdbd2cSJim Jagielski 	if( pAct )
494*b1cdbd2cSJim Jagielski 		do {
495*b1cdbd2cSJim Jagielski 			if( pAct->IsA( aSrchId ) )
496*b1cdbd2cSJim Jagielski 				break;
497*b1cdbd2cSJim Jagielski 
498*b1cdbd2cSJim Jagielski 			if( pDelNext == pAct )
499*b1cdbd2cSJim Jagielski 			{
500*b1cdbd2cSJim Jagielski 				pAct = pAct->pRight;
501*b1cdbd2cSJim Jagielski 				pDelNext = pAct;
502*b1cdbd2cSJim Jagielski 			}
503*b1cdbd2cSJim Jagielski 			else
504*b1cdbd2cSJim Jagielski 				pAct = pDelNext;
505*b1cdbd2cSJim Jagielski 
506*b1cdbd2cSJim Jagielski 		} while( pAct );
507*b1cdbd2cSJim Jagielski 	return pAct;
508*b1cdbd2cSJim Jagielski }
509*b1cdbd2cSJim Jagielski 
Next()510*b1cdbd2cSJim Jagielski SwClient* SwClientIter::Next()
511*b1cdbd2cSJim Jagielski {
512*b1cdbd2cSJim Jagielski 	do {
513*b1cdbd2cSJim Jagielski 		if( pDelNext == pAct )
514*b1cdbd2cSJim Jagielski 		{
515*b1cdbd2cSJim Jagielski 			pAct = pAct->pRight;
516*b1cdbd2cSJim Jagielski 			pDelNext = pAct;
517*b1cdbd2cSJim Jagielski 		}
518*b1cdbd2cSJim Jagielski 		else
519*b1cdbd2cSJim Jagielski 			pAct = pDelNext;
520*b1cdbd2cSJim Jagielski 
521*b1cdbd2cSJim Jagielski 		if( pAct && pAct->IsA( aSrchId ) )
522*b1cdbd2cSJim Jagielski 			break;
523*b1cdbd2cSJim Jagielski 	} while( pAct );
524*b1cdbd2cSJim Jagielski 	return pAct;
525*b1cdbd2cSJim Jagielski }
526*b1cdbd2cSJim Jagielski 
Last(TypeId nType)527*b1cdbd2cSJim Jagielski SwClient* SwClientIter::Last( TypeId nType )
528*b1cdbd2cSJim Jagielski {
529*b1cdbd2cSJim Jagielski 	aSrchId = nType;
530*b1cdbd2cSJim Jagielski 	GoEnd();
531*b1cdbd2cSJim Jagielski 	if( pAct )
532*b1cdbd2cSJim Jagielski 		do {
533*b1cdbd2cSJim Jagielski 			if( pAct->IsA( aSrchId ) )
534*b1cdbd2cSJim Jagielski 				break;
535*b1cdbd2cSJim Jagielski 
536*b1cdbd2cSJim Jagielski 	        if( pDelNext == pAct )
537*b1cdbd2cSJim Jagielski 		        pAct = pAct->pLeft;
538*b1cdbd2cSJim Jagielski 	        else
539*b1cdbd2cSJim Jagielski 		        pAct = pDelNext->pLeft;
540*b1cdbd2cSJim Jagielski 	        pDelNext = pAct;
541*b1cdbd2cSJim Jagielski 
542*b1cdbd2cSJim Jagielski 		} while( pAct );
543*b1cdbd2cSJim Jagielski 	return pAct;
544*b1cdbd2cSJim Jagielski }
545*b1cdbd2cSJim Jagielski 
Previous()546*b1cdbd2cSJim Jagielski SwClient* SwClientIter::Previous()
547*b1cdbd2cSJim Jagielski {
548*b1cdbd2cSJim Jagielski 	do {
549*b1cdbd2cSJim Jagielski 	    if( pDelNext == pAct )
550*b1cdbd2cSJim Jagielski 		    pAct = pAct->pLeft;
551*b1cdbd2cSJim Jagielski 	    else
552*b1cdbd2cSJim Jagielski 		    pAct = pDelNext->pLeft;
553*b1cdbd2cSJim Jagielski 	    pDelNext = pAct;
554*b1cdbd2cSJim Jagielski 
555*b1cdbd2cSJim Jagielski 		if( pAct && pAct->IsA( aSrchId ) )
556*b1cdbd2cSJim Jagielski 			break;
557*b1cdbd2cSJim Jagielski 	} while( pAct );
558*b1cdbd2cSJim Jagielski 	return pAct;
559*b1cdbd2cSJim Jagielski }
560*b1cdbd2cSJim Jagielski 
561