summaryrefslogtreecommitdiff
path: root/sw/inc/calbck.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/inc/calbck.hxx')
-rw-r--r--sw/inc/calbck.hxx250
1 files changed, 250 insertions, 0 deletions
diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx
new file mode 100644
index 000000000000..6ce5e181947a
--- /dev/null
+++ b/sw/inc/calbck.hxx
@@ -0,0 +1,250 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/*************************************************************
+#* Service-Klassen
+ *************************************************************/
+
+/*
+#* Aendert sich ein Attribut in einem Format, so muss diese
+#* Aenderung an alle abhaengigen Formate und ueber sie an
+#* alle betroffenen Nodes propagiert werden. Dabei muss
+#* festgestellt werden, ob die Aenderung einen Effekt haben
+#* kann, oder ob das geaenderte Attribut von dem abhaengigen
+#* Format ueberdefiniert wird (so dass ohnehin der
+#* Attributwert des abhaengigen Formates den geaenderten
+#* Wert verdeckt). Weiterhin kann der betroffene Node
+#* feststellen, ob er von dem geaenderten Attribut Gebrauch
+#* macht (Beispiel: Linienabstand fuer Unterstreichung wurde
+#* geaendert, das Attribut Unterstreichung wurde aber nicht
+#* verwendet). So wird bei Aenderungen der minimale Aufwand
+#* zum Reformatieren erkannt.
+ */
+#ifndef _CALBCK_HXX
+#define _CALBCK_HXX
+
+#include <tools/rtti.hxx>
+#include "swdllapi.h"
+
+class SwModify;
+class SwClientIter;
+class SfxPoolItem;
+class SvStream;
+
+// ----------
+// SwClient
+// ----------
+
+class SW_DLLPUBLIC SwClient
+{
+ friend class SwModify;
+ friend class SwClientIter;
+
+ SwClient *pLeft, *pRight; // fuer die AVL-Sortierung
+ BOOL bModifyLocked : 1; // wird in SwModify::Modify benutzt,
+ // eigentlich ein Member des SwModify
+ // aber aus Platzgruenden hier.
+ BOOL bInModify : 1; // ist in einem Modify. (Debug!!!)
+ BOOL bInDocDTOR : 1; // Doc wird zerstoert, nicht "abmelden"
+ BOOL bInCache : 1; // Ist im BorderAttrCache des Layout,
+ // Traegt sich dann im Modify aus!
+ BOOL bInSwFntCache : 1; // Ist im SwFont-Cache der Formatierung
+
+protected:
+ SwModify *pRegisteredIn;
+
+ // single argument ctors shall be explicit.
+ explicit SwClient(SwModify *pToRegisterIn);
+
+public:
+ inline SwClient();
+ virtual ~SwClient();
+
+ virtual void Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);
+ const SwModify* GetRegisteredIn() const { return pRegisteredIn; }
+
+ //rtti, abgeleitete moegens gleichtun oder nicht. Wenn sie es gleichtun
+ //kann ueber die Abhaengigkeitsliste eines Modify typsicher gecastet
+ //werden.
+ TYPEINFO();
+
+ void LockModify() { bModifyLocked = TRUE; }
+ void UnlockModify() { bModifyLocked = FALSE; }
+ void SetInCache( BOOL bNew ) { bInCache = bNew; }
+ void SetInSwFntCache( BOOL bNew ) { bInSwFntCache = bNew; }
+ BOOL IsModifyLocked() const { return bModifyLocked; }
+ BOOL IsInDocDTOR() const { return bInDocDTOR; }
+ BOOL IsInCache() const { return bInCache; }
+ BOOL IsInSwFntCache() const { return bInSwFntCache; }
+
+ // erfrage vom Client Informationen
+ virtual BOOL GetInfo( SfxPoolItem& ) const;
+
+private:
+ SwClient( const SwClient& );
+ SwClient &operator=( const SwClient& );
+};
+
+inline SwClient::SwClient() :
+ pLeft(0), pRight(0), pRegisteredIn(0)
+{ bModifyLocked = bInModify = bInDocDTOR = bInCache = bInSwFntCache = FALSE; }
+
+
+// ----------
+// SwModify
+// ----------
+
+// Klasse hat eine doppelt Verkette Liste fuer die Abhaengigen.
+
+class SW_DLLPUBLIC SwModify: public SwClient
+{
+ friend SvStream& operator<<( SvStream& aS, SwModify & );
+
+ friend class SwClientIter;
+ SwClient* pRoot;
+
+ SwClient *_Remove(SwClient *pDepend);
+
+public:
+ SwModify() : pRoot(0) {}
+
+ // single argument ctors shall be explicit.
+ explicit SwModify(SwModify *pToRegisterIn );
+ virtual ~SwModify();
+
+ virtual void Modify( SfxPoolItem *pOldValue, SfxPoolItem *pNewValue );
+ void Add(SwClient *pDepend);
+ SwClient *Remove(SwClient *pDepend)
+ { return bInDocDTOR ? 0 : _Remove( pDepend ); }
+
+ const SwClient* GetDepends() const { return pRoot; }
+
+ // erfrage vom Client Informationen
+ virtual BOOL GetInfo( SfxPoolItem& ) const;
+
+ void SetInDocDTOR() { bInDocDTOR = TRUE; }
+
+ void CheckCaching( const USHORT nWhich );
+
+ BOOL IsLastDepend() const
+ { return pRoot && !pRoot->pLeft && !pRoot->pRight; }
+
+private:
+ // forbidden and not implemented (see @ SwClient).
+ SwModify & operator= (const SwModify &);
+
+protected:
+ // forbidden and not implemented (see @ SwClient),
+ // but GCC >= 3.4 needs an accessible "T (const T&)"
+ // to pass a "T" as a "const T&" argument
+ SwModify (const SwModify &);
+};
+
+// ----------
+// SwDepend
+// ----------
+
+/*
+ * Sehr sinnvolle Klasse, wenn ein Objekt von mehreren Objekten
+ * abhaengig ist. Diese sollte fuer jede Abhaengigkeit ein Objekt
+ * der Klasse SwDepend als Member haben.
+ */
+class SW_DLLPUBLIC SwDepend: public SwClient
+{
+ SwClient *pToTell;
+
+public:
+ SwDepend() : pToTell(0) {}
+ SwDepend(SwClient *pTellHim, SwModify *pDepend);
+
+ SwClient* GetToTell() { return pToTell; }
+ virtual void Modify( SfxPoolItem *pOldValue, SfxPoolItem *pNewValue );
+
+ // erfrage vom Client Informationen
+ virtual BOOL GetInfo( SfxPoolItem & ) const;
+
+private:
+ // forbidden and not implemented (see @ SwClient).
+ SwDepend (const SwDepend &);
+ SwDepend & operator= (const SwDepend &);
+};
+
+
+class SwClientIter
+{
+ friend SwClient* SwModify::_Remove(SwClient *); // fuer Ptr-Korrektur
+ friend void SwModify::Add(SwClient *); // nur fuer ASSERT !
+
+ SwModify const& rRoot;
+ SwClient *pAkt, *pDelNext;
+ // fuers Updaten der aller Iteratoren beim Einfuegen/Loeschen von
+ // Clients, wenn der Iterator gerade draufsteht.
+ SwClientIter *pNxtIter;
+
+ SwClient* mpWatchClient; // if set, SwModify::_Remove checks if this client is removed
+
+ TypeId aSrchId; // fuer First/Next - suche diesen Type
+
+public:
+ SW_DLLPUBLIC SwClientIter( SwModify const& );
+ SW_DLLPUBLIC ~SwClientIter();
+
+ const SwModify& GetModify() const { return rRoot; }
+
+#ifndef CFRONT
+ SwClient* operator++(int); // zum Naechsten
+ SwClient* operator--(int); // zum Vorherigen
+#endif
+ SwClient* operator++(); // zum Naechsten
+ SwClient* operator--(); // zum Vorherigen
+
+ SwClient* GoStart(); // zum Anfang
+ SwClient* GoEnd(); // zum Ende
+
+ inline SwClient* GoRoot(); // wieder ab Root (==Start) anfangen
+
+ SwClient* operator()() const
+ { return pDelNext == pAkt ? pAkt : pDelNext; }
+
+ int IsChanged() const { return pDelNext != pAkt; }
+
+ SW_DLLPUBLIC SwClient* First( TypeId nType );
+ SW_DLLPUBLIC SwClient* Next();
+
+ const SwClient* GetWatchClient() const { return mpWatchClient; }
+ void SetWatchClient( SwClient* pWatch ) { mpWatchClient = pWatch; }
+};
+
+inline SwClient* SwClientIter::GoRoot() // wieder ab Root anfangen
+{
+ pAkt = rRoot.pRoot;
+ return (pDelNext = pAkt);
+}
+
+
+
+#endif