/* This file is part of KOrganizer. Copyright (c) 2003 Cornelius Schumacher Copyright (C) 2003-2004 Reinhold Kainhofer 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. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. As a special exception, permission is given to link this program with any edition of Qt, and distribute the resulting executable, without including the source code for Qt in the source distribution. */ #include "history.h" #include #include #include #include using namespace KCal; using namespace KOrg; History::History( KCal::Calendar *calendar ) : mCalendar( calendar ), mCurrentMultiEntry( 0 ), mUndoEntry( mEntries ), mRedoEntry( mEntries ) { mEntries.setAutoDelete( true ); } void History::undo() { if ( mCurrentMultiEntry ) mCurrentMultiEntry = 0; Entry *entry = mUndoEntry.current(); if ( !entry ) return; entry->undo(); emit undone(); emit redoAvailable( entry->text() ); mRedoEntry = mUndoEntry; --mUndoEntry; entry = mUndoEntry.current(); if ( entry ) emit undoAvailable( entry->text() ); else emit undoAvailable( TQString::null ); } void History::redo() { if ( mCurrentMultiEntry ) mCurrentMultiEntry = 0; Entry *entry = mRedoEntry.current(); if ( !entry ) return; emit undoAvailable( entry->text() ); entry->redo(); emit redone(); mUndoEntry = mRedoEntry; ++mRedoEntry; entry = mRedoEntry.current(); if ( entry ) emit redoAvailable( entry->text() ); else emit redoAvailable( TQString::null ); } void History::truncate() { while ( mUndoEntry.current() != mEntries.last() ) { mEntries.removeLast(); } mRedoEntry = TQPtrList( mEntries ); emit redoAvailable( TQString::null ); } void History::recordDelete( Incidence *incidence ) { Entry *entry = new EntryDelete( mCalendar, incidence ); if (mCurrentMultiEntry) { mCurrentMultiEntry->appendEntry( entry ); } else { truncate(); mEntries.append( entry ); mUndoEntry.toLast(); mRedoEntry = TQPtrList( mEntries ); emit undoAvailable( entry->text() ); } } void History::recordAdd( Incidence *incidence ) { Entry *entry = new EntryAdd( mCalendar, incidence ); if (mCurrentMultiEntry) { mCurrentMultiEntry->appendEntry( entry ); } else { truncate(); mEntries.append( entry ); mUndoEntry.toLast(); mRedoEntry = TQPtrList( mEntries ); emit undoAvailable( entry->text() ); } } void History::recordEdit( Incidence *oldIncidence, Incidence *newIncidence ) { Entry *entry = new EntryEdit( mCalendar, oldIncidence, newIncidence ); if (mCurrentMultiEntry) { mCurrentMultiEntry->appendEntry( entry ); } else { truncate(); mEntries.append( entry ); mUndoEntry.toLast(); mRedoEntry = TQPtrList( mEntries ); emit undoAvailable( entry->text() ); } } void History::startMultiModify( const TQString &description ) { if ( mCurrentMultiEntry ) { endMultiModify(); } mCurrentMultiEntry = new MultiEntry( mCalendar, description ); truncate(); mEntries.append( mCurrentMultiEntry ); mUndoEntry.toLast(); mRedoEntry = TQPtrList( mEntries ); emit undoAvailable( mCurrentMultiEntry->text() ); } void History::endMultiModify() { mCurrentMultiEntry = 0; } History::Entry::Entry( KCal::Calendar *calendar ) : mCalendar( calendar ) { } History::Entry::~Entry() { } History::EntryDelete::EntryDelete( Calendar *calendar, Incidence *incidence ) : Entry( calendar ), mIncidence( incidence->clone() ) { } History::EntryDelete::~EntryDelete() { delete mIncidence; } void History::EntryDelete::undo() { // TODO: Use the proper resource instead of asking! mCalendar->addIncidence( mIncidence->clone() ); } void History::EntryDelete::redo() { Incidence *incidence = mCalendar->incidence( mIncidence->uid() ); mCalendar->deleteIncidence( incidence ); } TQString History::EntryDelete::text() { return i18n("Delete %1").arg(mIncidence->type()); } History::EntryAdd::EntryAdd( Calendar *calendar, Incidence *incidence ) : Entry( calendar ), mIncidence( incidence->clone() ) { } History::EntryAdd::~EntryAdd() { delete mIncidence; } void History::EntryAdd::undo() { Incidence *incidence = mCalendar->incidence( mIncidence->uid() ); if ( incidence ) mCalendar->deleteIncidence( incidence ); } void History::EntryAdd::redo() { // TODO: User the proper resource instead of asking again mCalendar->addIncidence( mIncidence->clone() ); } TQString History::EntryAdd::text() { return i18n("Add %1").arg(mIncidence->type()); } History::EntryEdit::EntryEdit( Calendar *calendar, Incidence *oldIncidence, Incidence *newIncidence ) : Entry( calendar ), mOldIncidence( oldIncidence->clone() ), mNewIncidence( newIncidence->clone() ) { } History::EntryEdit::~EntryEdit() { delete mOldIncidence; delete mNewIncidence; } void History::EntryEdit::undo() { Incidence *incidence = mCalendar->incidence( mNewIncidence->uid() ); if ( incidence ) mCalendar->deleteIncidence( incidence ); // TODO: Use the proper resource instead of asking again mCalendar->addIncidence( mOldIncidence->clone() ); } void History::EntryEdit::redo() { Incidence *incidence = mCalendar->incidence( mOldIncidence->uid() ); if ( incidence ) mCalendar->deleteIncidence( incidence ); // TODO: Use the proper resource instead of asking again mCalendar->addIncidence( mNewIncidence->clone() ); } TQString History::EntryEdit::text() { return i18n("Edit %1").arg(mNewIncidence->type()); } History::MultiEntry::MultiEntry( Calendar *calendar, const TQString &text ) : Entry( calendar ), mText( text ) { mEntries.setAutoDelete( true ); } History::MultiEntry::~MultiEntry() { } void History::MultiEntry::appendEntry( Entry* entry ) { mEntries.append( entry ); } void History::MultiEntry::undo() { TQPtrListIterator it( mEntries ); it.toLast(); Entry *entry; while ( (entry = it.current()) != 0 ) { --it; entry->undo(); } } void History::MultiEntry::redo() { TQPtrListIterator it( mEntries ); Entry *entry; while ( (entry = it.current()) != 0 ) { ++it; entry->redo(); } } TQString History::MultiEntry::text() { return mText; } #include "history.moc"