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