summaryrefslogtreecommitdiffstats
path: root/kpovmodeler/pmmemento.h
diff options
context:
space:
mode:
Diffstat (limited to 'kpovmodeler/pmmemento.h')
-rw-r--r--kpovmodeler/pmmemento.h318
1 files changed, 318 insertions, 0 deletions
diff --git a/kpovmodeler/pmmemento.h b/kpovmodeler/pmmemento.h
new file mode 100644
index 00000000..a3ea9c98
--- /dev/null
+++ b/kpovmodeler/pmmemento.h
@@ -0,0 +1,318 @@
+//-*-C++-*-
+/*
+**************************************************************************
+ description
+ --------------------
+ copyright : (C) 2000-2002 by Andreas Zehender
+ email : zehender@kde.org
+**************************************************************************
+
+**************************************************************************
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+**************************************************************************/
+
+
+#ifndef PMOBJECTMEMENTO_H
+#define PMOBJECTMEMENTO_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "pmvariant.h"
+#include "pmcommand.h"
+#include "pmmetaobject.h"
+#include <qstring.h>
+#include <qptrlist.h>
+
+/**
+ * Class used by @ref PMObjectMemento to store one value.
+ *
+ * Each piece of data has two IDs: The type of the povray class that stored
+ * the data and a unique ID within this class.
+ *
+ * @see PMMementoDataIterator
+ */
+
+class PMMementoData : public PMVariant
+{
+public:
+ /**
+ * Stores an integer
+ */
+ PMMementoData( PMMetaObject* classType, int vID, int data );
+ /**
+ * Stores an unsigned integer
+ */
+ PMMementoData( PMMetaObject* classType, int vID, unsigned int data );
+ /**
+ * Stores double
+ */
+ PMMementoData( PMMetaObject* classType, int vID, double data );
+ /**
+ * Stores a boolean
+ */
+ PMMementoData( PMMetaObject* classType, int vID, bool data );
+ /**
+ * Stores a @ref PMThreeState
+ */
+ PMMementoData( PMMetaObject* classType, int vID, PMThreeState data );
+ /**
+ * Stores a string
+ */
+ PMMementoData( PMMetaObject* classType, int vID, const QString& data );
+ /**
+ * Stores a @ref PMVector
+ */
+ PMMementoData( PMMetaObject* classType, int vID, const PMVector& data );
+ /**
+ * Stores a @ref PMColor
+ */
+ PMMementoData( PMMetaObject* classType, int vID, const PMColor& data );
+ /**
+ * Stores a pointer to a PMObject
+ */
+ PMMementoData( PMMetaObject* classType, int vID, PMObject* obj );
+
+ /**
+ * Returns the object type of the povray class that stored the data
+ */
+ PMMetaObject* objectType( ) const { return m_objectType; }
+ /**
+ * Returns the ID of the stored value
+ */
+ int valueID( ) const { return m_valueID; }
+
+private:
+ /**
+ * Class that stored the information
+ */
+ PMMetaObject* m_objectType;
+ /**
+ * The unique ID within the m_objectType
+ */
+ int m_valueID;
+};
+
+typedef QPtrList<PMMementoData> PMMementoDataList;
+
+
+/**
+ * Helper class to store information about changed objects in @ref PMMemento
+ */
+class PMObjectChange
+{
+public:
+ /**
+ * Creates change information for the object obj.
+ *
+ * mode is a bitwise combination of @ref PMChange constants.
+ */
+ PMObjectChange( PMObject* obj, int mode )
+ {
+ m_pObject = obj;
+ m_mode = mode;
+ }
+ PMObject* object( ) const { return m_pObject; }
+ int mode( ) const { return m_mode; }
+ void addMode( int mode ) { m_mode |= mode; }
+private:
+ PMObject* m_pObject;
+ int m_mode;
+};
+
+typedef QPtrList<PMObjectChange> PMObjectChangeList;
+typedef QPtrListIterator<PMObjectChange> PMObjectChangeListIterator;
+
+/**
+ * Class that stores the data of povray objects for undo/redo information
+ *
+ * This class should provide enough functionality for most objects. If not,
+ * subclass this class.
+ *
+ * All objects have to use the memento class of its base class or an inherited
+ * one.
+ *
+ * Only the changed attributes of an object are saved.
+ *
+ * See class @ref PMMementoData to see how values are stored.
+ */
+class PMMemento
+{
+ friend class PMMementoDataIterator;
+public:
+ /**
+ * Creates a memento for the object originator
+ */
+ PMMemento( PMObject* originator );
+ /**
+ * Deletes the memento
+ */
+ virtual ~PMMemento( );
+
+ /**
+ * Returns a pointer to the originator
+ */
+ PMObject* originator( ) const { return m_pOriginator; }
+ /**
+ * Returns a pointer to the memento data or 0 if this value is not
+ * stored
+ */
+ PMMementoData* findData( PMMetaObject* classType, int vID ) const;
+ /**
+ * Adds the data object to the list of stored data. The menento may not
+ * contain this information (objType and vID).
+ *
+ * The memento becomes the owner of this object.*/
+ void addData( PMMementoData* data );
+
+ /**
+ * Adds an integer data object. Will be ignored if the memento
+ * already contains this data
+ */
+ void addData( PMMetaObject* classType, int vID, const int data );
+
+ /**
+ * Adds an unsigned data object. Will be ignored if the memento
+ * already contains this data
+ */
+ void addData( PMMetaObject* classType, int vID, const unsigned int data );
+
+ /**
+ * Adds an double data object. Will be ignored if the memento
+ * already contains this data
+ */
+ void addData( PMMetaObject* classType, int vID, const double data );
+
+ /**
+ * Adds an bool data object. Will be ignored if the memento
+ * already contains this data
+ */
+ void addData( PMMetaObject* classType, int vID, const bool data );
+
+ /**
+ * Adds an @ref PMThreeState data object. Will be ignored if the memento
+ * already contains this data
+ */
+ void addData( PMMetaObject* classType, int vID, const PMThreeState data );
+
+ /**
+ * Adds an @ref QString data object. Will be ignored if the memento
+ * already contains this data
+ */
+ void addData( PMMetaObject* classType, int vID, const QString& data );
+
+ /**
+ * Adds an @ref PMVector data object. Will be ignored if the memento
+ * already contains this data
+ */
+ void addData( PMMetaObject* classType, int vID, const PMVector& data );
+
+ /**
+ * Adds an @ref PMColor data object. Will be ignored if the memento
+ * already contains this data
+ */
+ void addData( PMMetaObject* classType, int vID, const PMColor& data );
+
+ /**
+ * Adds an PMObject pointer data object. Will be ignored if the memento
+ * already contains this data
+ */
+ void addData( PMMetaObject* classType, int vID, PMObject* obj );
+
+ /**
+ * Call this to store an id change
+ */
+ void addIDChange( PMMetaObject* classType, int vID, const QString& data );
+
+ /**
+ * Returns true if the memento contains changed data
+ */
+ bool containsChanges( ) const { return ( m_changedObjects.count( ) > 0 ); }
+
+ /**
+ * Call this function, if you stored some data that changed
+ * the view structure of the originator
+ */
+ void setViewStructureChanged( ) { addChange( PMCViewStructure ); }
+ /**
+ * Call this function, if you stored some data that changed
+ * the name or pixmap of the originator
+ */
+ void setDescriptionChanged( ) { addChange( PMCDescription ); }
+
+ /**
+ * Returns true if the id of a @ref PMDeclare was changed
+ */
+ bool idChanged( ) const { return m_pIDData != 0; }
+ /**
+ * Returns the old id
+ */
+ QString oldID( ) const;
+ /**
+ * If one object is changed, other objects can be changed as well.
+ *
+ * For example, if the linked declare of an object link is changed,
+ * the old and new declare are changed as well (Remove the old link,
+ * add the new link).
+ *
+ * This function returns an iterator to the list of all changed objects.
+ * The first object is the originator.
+ */
+ PMObjectChangeListIterator changedObjects( )
+ { return PMObjectChangeListIterator( m_changedObjects ); }
+ /**
+ * Adds the object to the list of changed objects.
+ * Note that the originator is added automatically
+ */
+ void addChangedObject( PMObject* obj, int mode );
+protected:
+ /**
+ * Adds the change to the originator change object
+ */
+ void addChange( int mode );
+private:
+ /**
+ * The stored values
+ */
+ PMMementoDataList m_data;
+ /**
+ * Additional pointer to the memento data for id changes of
+ * @ref PMDeclare objects
+ */
+ PMMementoData* m_pIDData;
+ /**
+ * List of changes
+ */
+ QPtrList<PMObjectChange> m_changedObjects;
+ PMObjectChange* m_pOriginatorChange;
+ PMObject* m_pOriginator;
+};
+
+
+/**
+ * Iterator for memento data
+ */
+class PMMementoDataIterator : public QPtrListIterator<PMMementoData>
+{
+public:
+ PMMementoDataIterator( const PMMemento& m )
+ : QPtrListIterator<PMMementoData>( m.m_data )
+ {
+ }
+ PMMementoDataIterator( const PMMemento* m )
+ : QPtrListIterator<PMMementoData>( m->m_data )
+ {
+ }
+ PMMementoDataIterator( const PMMementoDataList& l )
+ : QPtrListIterator<PMMementoData>( l )
+ {
+ }
+};
+
+#endif