Update ooo320-m1
[ooovba.git] / binfilter / inc / bf_sw / calbck.hxx
blob6379c3709ca48e44e0a820e9e088ea4e9a7ad263
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: calbck.hxx,v $
10 * $Revision: 1.5 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
32 /*************************************************************
33 #* Service-Klassen
34 *************************************************************/
37 #* Aendert sich ein Attribut in einem Format, so muss diese
38 #* Aenderung an alle abhaengigen Formate und ueber sie an
39 #* alle betroffenen Nodes propagiert werden. Dabei muss
40 #* festgestellt werden, ob die Aenderung einen Effekt haben
41 #* kann, oder ob das geaenderte Attribut von dem abhaengigen
42 #* Format ueberdefiniert wird (so dass ohnehin der
43 #* Attributwert des abhaengigen Formates den geaenderten
44 #* Wert verdeckt). Weiterhin kann der betroffene Node
45 #* feststellen, ob er von dem geaenderten Attribut Gebrauch
46 #* macht (Beispiel: Linienabstand fuer Unterstreichung wurde
47 #* geaendert, das Attribut Unterstreichung wurde aber nicht
48 #* verwendet). So wird bei Aenderungen der minimale Aufwand
49 #* zum Reformatieren erkannt.
51 #ifndef _CALBCK_HXX
52 #define _CALBCK_HXX
54 #ifndef _SOLAR_H
55 #include <tools/solar.h>
56 #endif
58 #ifndef _RTTI_HXX
59 #include <tools/rtti.hxx>
60 #endif
61 class SvStream;
63 namespace binfilter {
64 class SfxPoolItem;
65 class SwModify;
66 class SwClientIter;
68 // ----------
69 // SwClient
70 // ----------
72 class SwClient
74 friend class SwModify;
75 friend class SwClientIter;
77 SwClient *pLeft, *pRight; // fuer die AVL-Sortierung
78 BOOL bModifyLocked : 1; // wird in SwModify::Modify benutzt,
79 // eigentlich ein Member des SwModify
80 // aber aus Platzgruenden hier.
81 BOOL bInModify : 1; // ist in einem Modify. (Debug!!!)
82 BOOL bInDocDTOR : 1; // Doc wird zerstoert, nicht "abmelden"
83 BOOL bInCache : 1; // Ist im BorderAttrCache des Layout,
84 // Traegt sich dann im Modify aus!
85 BOOL bInSwFntCache : 1; // Ist im SwFont-Cache der Formatierung
87 protected:
88 SwModify *pRegisteredIn;
89 SwClient(SwModify *pToRegisterIn);
91 public:
92 inline SwClient();
93 virtual ~SwClient();
94 virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);
95 const SwModify* GetRegisteredIn() const { return pRegisteredIn; }
97 //rtti, abgeleitete moegens gleichtun oder nicht. Wenn sie es gleichtun
98 //kann ueber die Abhaengigkeitsliste eines Modify typsicher gecastet
99 //werden.
100 TYPEINFO();
102 void LockModify() { bModifyLocked = TRUE; }
103 void UnlockModify() { bModifyLocked = FALSE; }
104 void SetInCache( BOOL bNew ) { bInCache = bNew; }
105 void SetInSwFntCache( BOOL bNew ) { bInSwFntCache = bNew; }
106 int IsModifyLocked() const { return bModifyLocked; }
107 int IsInDocDTOR() const { return bInDocDTOR; }
108 int IsInCache() const { return bInCache; }
109 int IsInSwFntCache() const { return bInSwFntCache; }
111 // erfrage vom Client Informationen
112 virtual BOOL GetInfo( SfxPoolItem& ) const;
114 private:
115 SwClient( const SwClient& );
116 SwClient &operator=( const SwClient& );
119 inline SwClient::SwClient() :
120 pLeft(0), pRight(0), pRegisteredIn(0)
121 { bModifyLocked = bInModify = bInDocDTOR = bInCache = bInSwFntCache = FALSE; }
124 // ----------
125 // SwModify
126 // ----------
128 // Klasse hat eine doppelt Verkette Liste fuer die Abhaengigen.
130 class SwModify: public SwClient
132 friend SvStream& operator<<( SvStream& aS, SwModify & );
134 friend class SwClientIter;
135 SwClient* pRoot;
137 SwClient *_Remove(SwClient *pDepend);
139 public:
140 SwModify(SwModify *pToRegisterIn );
141 virtual ~SwModify();
142 virtual void Modify( SfxPoolItem *pOldValue, SfxPoolItem *pNewValue );
143 void Add(SwClient *pDepend);
144 SwClient *Remove(SwClient *pDepend)
145 { return bInDocDTOR ? 0 : _Remove( pDepend ); }
147 const SwClient* GetDepends() const { return pRoot; }
149 // erfrage vom Client Informationen
150 virtual BOOL GetInfo( SfxPoolItem& ) const;
152 void SetInDocDTOR() { bInDocDTOR = TRUE; }
154 void CheckCaching( const USHORT nWhich );
156 BOOL IsLastDepend() const
157 { return pRoot && !pRoot->pLeft && !pRoot->pRight; }
160 // ----------
161 // SwDepend
162 // ----------
165 * Sehr sinnvolle Klasse, wenn ein Objekt von mehreren Objekten
166 * abhaengig ist. Diese sollte fuer jede Abhaengigkeit ein Objekt
167 * der Klasse SwDepend als Member haben.
169 class SwDepend: public SwClient
171 private:
172 SwClient *pToTell;
173 public:
174 SwClient* GetToTell() { return pToTell; }
175 virtual void Modify( SfxPoolItem *pOldValue, SfxPoolItem *pNewValue );
176 SwDepend(SwClient *pTellHim, SwModify *pDepend);
178 // erfrage vom Client Informationen
179 virtual BOOL GetInfo( SfxPoolItem & ) const;
183 class SwClientIter
185 friend SwClient* SwModify::_Remove(SwClient *); // fuer Ptr-Korrektur
186 friend void SwModify::Add(SwClient *); // nur fuer ASSERT !
188 SwModify& rRoot;
189 SwClient *pAkt, *pDelNext;
190 // fuers Updaten der aller Iteratoren beim Einfuegen/Loeschen von
191 // Clients, wenn der Iterator gerade draufsteht.
192 SwClientIter *pNxtIter;
193 TypeId aSrchId; // fuer First/Next - suche diesen Type
195 public:
196 SwClientIter( SwModify& );
197 ~SwClientIter();
199 const SwModify& GetModify() const { return rRoot; }
200 SwModify& GetModify() { return rRoot; }
202 #ifndef CFRONT
203 SwClient* operator++(int); // zum Naechsten
204 SwClient* operator--(int); // zum Vorherigen
205 #endif
206 SwClient* operator++(); // zum Naechsten
207 SwClient* operator--(); // zum Vorherigen
209 SwClient* GoStart(); // zum Anfang
210 SwClient* GoEnd(); // zum Ende
212 inline SwClient* GoRoot(); // wieder ab Root (==Start) anfangen
214 SwClient* operator()() const
215 { return pDelNext == pAkt ? pAkt : pDelNext; }
217 int IsChanged() const { return pDelNext != pAkt; }
219 SwClient* First( TypeId nType );
220 SwClient* Next();
223 inline SwClient* SwClientIter::GoRoot() // wieder ab Root anfangen
225 pAkt = rRoot.pRoot;
226 return (pDelNext = pAkt);
231 } //namespace binfilter
232 #endif