diff options
Diffstat (limited to 'korganizer/history.cpp')
-rw-r--r-- | korganizer/history.cpp | 295 |
1 files changed, 295 insertions, 0 deletions
diff --git a/korganizer/history.cpp b/korganizer/history.cpp new file mode 100644 index 000000000..5afc325e7 --- /dev/null +++ b/korganizer/history.cpp @@ -0,0 +1,295 @@ +/* + This file is part of KOrganizer. + + Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org> + Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com> + + 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 <libkcal/calendar.h> +#include <libkcal/incidence.h> + +#include <klocale.h> +#include <kdebug.h> + +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( QString::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( QString::null ); +} + +void History::truncate() +{ + while ( mUndoEntry.current() != mEntries.last() ) { + mEntries.removeLast(); + } + mRedoEntry = QPtrList<Entry>( mEntries ); + emit redoAvailable( QString::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 = QPtrList<Entry>( 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 = QPtrList<Entry>( 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 = QPtrList<Entry>( mEntries ); + emit undoAvailable( entry->text() ); + } +} + +void History::startMultiModify( const QString &description ) +{ + if ( mCurrentMultiEntry ) { + endMultiModify(); + } + mCurrentMultiEntry = new MultiEntry( mCalendar, description ); + truncate(); + mEntries.append( mCurrentMultiEntry ); + mUndoEntry.toLast(); + mRedoEntry = QPtrList<Entry>( 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 ); +} + +QString 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() ); +} + +QString 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() ); +} + +QString History::EntryEdit::text() +{ + return i18n("Edit %1").arg(mNewIncidence->type()); +} + +History::MultiEntry::MultiEntry( Calendar *calendar, const QString &text ) + : Entry( calendar ), mText( text ) +{ + mEntries.setAutoDelete( true ); +} + +History::MultiEntry::~MultiEntry() +{ +} + +void History::MultiEntry::appendEntry( Entry* entry ) +{ + mEntries.append( entry ); +} + +void History::MultiEntry::undo() +{ + QPtrListIterator<Entry> it( mEntries ); + it.toLast(); + Entry *entry; + while ( (entry = it.current()) != 0 ) { + --it; + entry->undo(); + } +} + +void History::MultiEntry::redo() +{ + QPtrListIterator<Entry> it( mEntries ); + Entry *entry; + while ( (entry = it.current()) != 0 ) { + ++it; + entry->redo(); + } +} + +QString History::MultiEntry::text() +{ + return mText; +} + +#include "history.moc" |