summaryrefslogtreecommitdiffstats
path: root/kpovmodeler/pmmemento.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kpovmodeler/pmmemento.cpp')
-rw-r--r--kpovmodeler/pmmemento.cpp220
1 files changed, 220 insertions, 0 deletions
diff --git a/kpovmodeler/pmmemento.cpp b/kpovmodeler/pmmemento.cpp
new file mode 100644
index 00000000..84f52a6e
--- /dev/null
+++ b/kpovmodeler/pmmemento.cpp
@@ -0,0 +1,220 @@
+/*
+**************************************************************************
+ description
+ --------------------
+ copyright : (C) 2000-2002 by Andreas Zehender
+**************************************************************************
+
+**************************************************************************
+* *
+* 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. *
+* *
+**************************************************************************/
+
+#include "pmmemento.h"
+#include "pmdebug.h"
+
+
+PMMementoData::PMMementoData( PMMetaObject* classType, int vID, int data )
+ : PMVariant( data )
+{
+ m_objectType = classType;
+ m_valueID = vID;
+}
+
+PMMementoData::PMMementoData( PMMetaObject* classType, int vID, unsigned int data )
+ : PMVariant( data )
+{
+ m_objectType = classType;
+ m_valueID = vID;
+}
+
+PMMementoData::PMMementoData( PMMetaObject* classType, int vID, double data )
+ : PMVariant( data )
+{
+ m_objectType = classType;
+ m_valueID = vID;
+}
+
+
+PMMementoData::PMMementoData( PMMetaObject* classType, int vID, bool data )
+ : PMVariant( data )
+{
+ m_objectType = classType;
+ m_valueID = vID;
+}
+
+PMMementoData::PMMementoData( PMMetaObject* classType, int vID, PMThreeState data )
+ : PMVariant( data )
+{
+ m_objectType = classType;
+ m_valueID = vID;
+}
+
+
+PMMementoData::PMMementoData( PMMetaObject* classType, int vID, const QString& data )
+ : PMVariant( data )
+{
+ m_objectType = classType;
+ m_valueID = vID;
+}
+
+PMMementoData::PMMementoData( PMMetaObject* classType, int vID, const PMVector& data )
+ : PMVariant( data )
+{
+ m_objectType = classType;
+ m_valueID = vID;
+}
+
+PMMementoData::PMMementoData( PMMetaObject* classType, int vID, const PMColor& data )
+ : PMVariant( data )
+{
+ m_objectType = classType;
+ m_valueID = vID;
+}
+
+PMMementoData::PMMementoData( PMMetaObject* classType, int vID, PMObject* obj )
+ : PMVariant( obj )
+{
+ m_objectType = classType;
+ m_valueID = vID;
+}
+
+PMMemento::PMMemento( PMObject* originator )
+{
+ m_data.setAutoDelete( true );
+ m_changedObjects.setAutoDelete( true );
+ m_pIDData = 0;
+ m_pOriginatorChange = 0;
+ m_pOriginator = originator;
+}
+
+PMMemento::~PMMemento( )
+{
+ m_data.clear( );
+ m_changedObjects.clear( );
+ // m_pOriginatorChange is in m_changedObjects and is already deleted!
+}
+
+PMMementoData* PMMemento::findData( PMMetaObject* classType, int vID ) const
+{
+ PMMementoDataIterator it( m_data );
+
+ for( ; it.current( ); ++it )
+ {
+ if( ( it.current( )->objectType( ) == classType ) &&
+ ( it.current( )->valueID( ) == vID ) )
+ return it.current( );
+ }
+ return 0;
+}
+
+void PMMemento::addData( PMMementoData* data )
+{
+ m_data.append( data );
+ addChange( PMCData );
+}
+
+void PMMemento::addData( PMMetaObject* classType, int vID, const int data )
+{
+ if( !findData( classType, vID ) )
+ addData( new PMMementoData( classType, vID, data ) );
+}
+
+void PMMemento::addData( PMMetaObject* classType, int vID, const unsigned int data )
+{
+ if( !findData( classType, vID ) )
+ addData( new PMMementoData( classType, vID, data ) );
+}
+
+void PMMemento::addData( PMMetaObject* classType, int vID, const double data )
+{
+ if( !findData( classType, vID ) )
+ addData( new PMMementoData( classType, vID, data ) );
+}
+
+void PMMemento::addData( PMMetaObject* classType, int vID, const bool data )
+{
+ if( !findData( classType, vID ) )
+ addData( new PMMementoData( classType, vID, data ) );
+}
+
+void PMMemento::addData( PMMetaObject* classType, int vID, const PMThreeState data )
+{
+ if( !findData( classType, vID ) )
+ addData( new PMMementoData( classType, vID, data ) );
+}
+
+void PMMemento::addData( PMMetaObject* classType, int vID, const QString& data )
+{
+ if( !findData( classType, vID ) )
+ addData( new PMMementoData( classType, vID, data ) );
+}
+
+void PMMemento::addIDChange( PMMetaObject* classType, int vID, const QString& data )
+{
+ if( !findData( classType, vID ) )
+ {
+ PMMementoData* d = new PMMementoData( classType, vID, data );
+ addData( d );
+ m_pIDData = d;
+ }
+}
+
+void PMMemento::addData( PMMetaObject* classType, int vID, const PMVector& data )
+{
+ if( !findData( classType, vID ) )
+ addData( new PMMementoData( classType, vID, data ) );
+}
+
+void PMMemento::addData( PMMetaObject* classType, int vID, const PMColor& data )
+{
+ if( !findData( classType, vID ) )
+ addData( new PMMementoData( classType, vID, data ) );
+}
+
+void PMMemento::addData( PMMetaObject* classType, int vID, PMObject* obj )
+{
+ if( !findData( classType, vID ) )
+ addData( new PMMementoData( classType, vID, obj ) );
+}
+
+QString PMMemento::oldID( ) const
+{
+ if( m_pIDData )
+ return m_pIDData->stringData( );
+ return QString::null;
+}
+
+void PMMemento::addChangedObject( PMObject* obj, int mode )
+{
+ PMObjectChangeListIterator it( m_changedObjects );
+ PMObjectChange* change = 0;
+
+ while( it.current( ) && !change )
+ {
+ if( it.current( )->object( ) == obj )
+ change = it.current( );
+ else
+ ++it;
+ }
+
+ if( change )
+ change->addMode( mode );
+ else
+ m_changedObjects.append( new PMObjectChange( obj, mode ) );
+}
+
+void PMMemento::addChange( int mode )
+{
+ if( !m_pOriginatorChange )
+ {
+ m_pOriginatorChange = new PMObjectChange( m_pOriginator, PMCData );
+ m_changedObjects.append( m_pOriginatorChange );
+ }
+ m_pOriginatorChange->addMode( mode );
+}