merge the formfield patch from ooo-build
[ooovba.git] / sw / inc / calbck.hxx
blob1f44308ff4efa6e2fb10b87c64fc81b1b677d79f
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.7 $
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 ************************************************************************/
31 /*************************************************************
32 #* Service-Klassen
33 *************************************************************/
36 #* Aendert sich ein Attribut in einem Format, so muss diese
37 #* Aenderung an alle abhaengigen Formate und ueber sie an
38 #* alle betroffenen Nodes propagiert werden. Dabei muss
39 #* festgestellt werden, ob die Aenderung einen Effekt haben
40 #* kann, oder ob das geaenderte Attribut von dem abhaengigen
41 #* Format ueberdefiniert wird (so dass ohnehin der
42 #* Attributwert des abhaengigen Formates den geaenderten
43 #* Wert verdeckt). Weiterhin kann der betroffene Node
44 #* feststellen, ob er von dem geaenderten Attribut Gebrauch
45 #* macht (Beispiel: Linienabstand fuer Unterstreichung wurde
46 #* geaendert, das Attribut Unterstreichung wurde aber nicht
47 #* verwendet). So wird bei Aenderungen der minimale Aufwand
48 #* zum Reformatieren erkannt.
50 #ifndef _CALBCK_HXX
51 #define _CALBCK_HXX
53 #include <tools/rtti.hxx>
54 #include "swdllapi.h"
56 class SwModify;
57 class SwClientIter;
58 class SfxPoolItem;
59 class SvStream;
61 // ----------
62 // SwClient
63 // ----------
65 class SW_DLLPUBLIC SwClient
67 friend class SwModify;
68 friend class SwClientIter;
70 SwClient *pLeft, *pRight; // fuer die AVL-Sortierung
71 BOOL bModifyLocked : 1; // wird in SwModify::Modify benutzt,
72 // eigentlich ein Member des SwModify
73 // aber aus Platzgruenden hier.
74 BOOL bInModify : 1; // ist in einem Modify. (Debug!!!)
75 BOOL bInDocDTOR : 1; // Doc wird zerstoert, nicht "abmelden"
76 BOOL bInCache : 1; // Ist im BorderAttrCache des Layout,
77 // Traegt sich dann im Modify aus!
78 BOOL bInSwFntCache : 1; // Ist im SwFont-Cache der Formatierung
80 protected:
81 SwModify *pRegisteredIn;
83 // single argument ctors shall be explicit.
84 explicit SwClient(SwModify *pToRegisterIn);
86 public:
87 inline SwClient();
88 virtual ~SwClient();
90 virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);
91 const SwModify* GetRegisteredIn() const { return pRegisteredIn; }
93 //rtti, abgeleitete moegens gleichtun oder nicht. Wenn sie es gleichtun
94 //kann ueber die Abhaengigkeitsliste eines Modify typsicher gecastet
95 //werden.
96 TYPEINFO();
98 void LockModify() { bModifyLocked = TRUE; }
99 void UnlockModify() { bModifyLocked = FALSE; }
100 void SetInCache( BOOL bNew ) { bInCache = bNew; }
101 void SetInSwFntCache( BOOL bNew ) { bInSwFntCache = bNew; }
102 BOOL IsModifyLocked() const { return bModifyLocked; }
103 BOOL IsInDocDTOR() const { return bInDocDTOR; }
104 BOOL IsInCache() const { return bInCache; }
105 BOOL IsInSwFntCache() const { return bInSwFntCache; }
107 // erfrage vom Client Informationen
108 virtual BOOL GetInfo( SfxPoolItem& ) const;
110 private:
111 SwClient( const SwClient& );
112 SwClient &operator=( const SwClient& );
115 inline SwClient::SwClient() :
116 pLeft(0), pRight(0), pRegisteredIn(0)
117 { bModifyLocked = bInModify = bInDocDTOR = bInCache = bInSwFntCache = FALSE; }
120 // ----------
121 // SwModify
122 // ----------
124 // Klasse hat eine doppelt Verkette Liste fuer die Abhaengigen.
126 class SW_DLLPUBLIC SwModify: public SwClient
128 friend SvStream& operator<<( SvStream& aS, SwModify & );
130 friend class SwClientIter;
131 SwClient* pRoot;
133 SwClient *_Remove(SwClient *pDepend);
135 public:
136 SwModify() : pRoot(0) {}
138 // single argument ctors shall be explicit.
139 explicit SwModify(SwModify *pToRegisterIn );
140 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; }
159 private:
160 // forbidden and not implemented (see @ SwClient).
161 SwModify & operator= (const SwModify &);
163 protected:
164 // forbidden and not implemented (see @ SwClient),
165 // but GCC >= 3.4 needs an accessible "T (const T&)"
166 // to pass a "T" as a "const T&" argument
167 SwModify (const SwModify &);
170 // ----------
171 // SwDepend
172 // ----------
175 * Sehr sinnvolle Klasse, wenn ein Objekt von mehreren Objekten
176 * abhaengig ist. Diese sollte fuer jede Abhaengigkeit ein Objekt
177 * der Klasse SwDepend als Member haben.
179 class SW_DLLPUBLIC SwDepend: public SwClient
181 SwClient *pToTell;
183 public:
184 SwDepend() : pToTell(0) {}
185 SwDepend(SwClient *pTellHim, SwModify *pDepend);
187 SwClient* GetToTell() { return pToTell; }
188 virtual void Modify( SfxPoolItem *pOldValue, SfxPoolItem *pNewValue );
190 // erfrage vom Client Informationen
191 virtual BOOL GetInfo( SfxPoolItem & ) const;
193 private:
194 // forbidden and not implemented (see @ SwClient).
195 SwDepend (const SwDepend &);
196 SwDepend & operator= (const SwDepend &);
200 class SwClientIter
202 friend SwClient* SwModify::_Remove(SwClient *); // fuer Ptr-Korrektur
203 friend void SwModify::Add(SwClient *); // nur fuer ASSERT !
205 SwModify& rRoot;
206 SwClient *pAkt, *pDelNext;
207 // fuers Updaten der aller Iteratoren beim Einfuegen/Loeschen von
208 // Clients, wenn der Iterator gerade draufsteht.
209 SwClientIter *pNxtIter;
211 SwClient* mpWatchClient; // if set, SwModify::_Remove checks if this client is removed
213 TypeId aSrchId; // fuer First/Next - suche diesen Type
215 public:
216 SW_DLLPUBLIC SwClientIter( SwModify& );
217 SW_DLLPUBLIC ~SwClientIter();
219 const SwModify& GetModify() const { return rRoot; }
220 SwModify& GetModify() { return rRoot; }
222 #ifndef CFRONT
223 SwClient* operator++(int); // zum Naechsten
224 SwClient* operator--(int); // zum Vorherigen
225 #endif
226 SwClient* operator++(); // zum Naechsten
227 SwClient* operator--(); // zum Vorherigen
229 SwClient* GoStart(); // zum Anfang
230 SwClient* GoEnd(); // zum Ende
232 inline SwClient* GoRoot(); // wieder ab Root (==Start) anfangen
234 SwClient* operator()() const
235 { return pDelNext == pAkt ? pAkt : pDelNext; }
237 int IsChanged() const { return pDelNext != pAkt; }
239 SW_DLLPUBLIC SwClient* First( TypeId nType );
240 SW_DLLPUBLIC SwClient* Next();
242 const SwClient* GetWatchClient() const { return mpWatchClient; }
243 void SetWatchClient( SwClient* pWatch ) { mpWatchClient = pWatch; }
246 inline SwClient* SwClientIter::GoRoot() // wieder ab Root anfangen
248 pAkt = rRoot.pRoot;
249 return (pDelNext = pAkt);
254 #endif