undostack.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifdef HAVE_CONFIG_H
00023 #include <config.h>
00024 #endif
00025
00026 #include "undostack.h"
00027
00028 #include "kmmainwin.h"
00029 #include "kmkernel.h"
00030 #include "kmfolder.h"
00031 #include "kmmessage.h"
00032 #include "kmmsgdict.h"
00033
00034 #include <kmessagebox.h>
00035 #include <klocale.h>
00036 #include <kdebug.h>
00037
00038 namespace KMail {
00039
00040 UndoStack::UndoStack(int size)
00041 : QObject(0, "undostack"), mSize(size), mLastId(0),
00042 mCachedInfo(0)
00043 {
00044 mStack.setAutoDelete(true);
00045 }
00046
00047 void UndoStack::clear()
00048 {
00049 mStack.clear();
00050 }
00051
00052 int UndoStack::newUndoAction( KMFolder *srcFolder, KMFolder *destFolder )
00053 {
00054 UndoInfo *info = new UndoInfo;
00055 info->id = ++mLastId;
00056 info->srcFolder = srcFolder;
00057 info->destFolder = destFolder;
00058 if ((int) mStack.count() == mSize)
00059 mStack.removeLast();
00060 mStack.prepend( info );
00061 emit undoStackChanged();
00062 return info->id;
00063 }
00064
00065 void UndoStack::addMsgToAction( int undoId, ulong serNum )
00066 {
00067 if ( !mCachedInfo || mCachedInfo->id != undoId ) {
00068 QPtrListIterator<UndoInfo> itr( mStack );
00069 while ( itr.current() ) {
00070 if ( itr.current()->id == undoId ) {
00071 mCachedInfo = itr.current();
00072 break;
00073 }
00074 ++itr;
00075 }
00076 }
00077
00078 Q_ASSERT( mCachedInfo );
00079 mCachedInfo->serNums.append( serNum );
00080 }
00081
00082 void UndoStack::undo()
00083 {
00084 KMMessage *msg;
00085 ulong serNum;
00086 int idx = -1;
00087 KMFolder *curFolder;
00088 if ( mStack.count() > 0 )
00089 {
00090 UndoInfo *info = mStack.take(0);
00091 emit undoStackChanged();
00092 QValueList<ulong>::iterator itr;
00093 info->destFolder->open();
00094 for( itr = info->serNums.begin(); itr != info->serNums.end(); ++itr ) {
00095 serNum = *itr;
00096 kmkernel->msgDict()->getLocation(serNum, &curFolder, &idx);
00097 if ( idx == -1 || curFolder != info->destFolder ) {
00098 kdDebug(5006)<<"Serious undo error!"<<endl;
00099 delete info;
00100 return;
00101 }
00102 msg = curFolder->getMsg( idx );
00103 info->srcFolder->moveMsg( msg );
00104 if ( info->srcFolder->count() > 1 )
00105 info->srcFolder->unGetMsg( info->srcFolder->count() - 1 );
00106 }
00107 info->destFolder->close();
00108 delete info;
00109 }
00110 else
00111 {
00112
00113 KMessageBox::sorry( kmkernel->mainWin(), i18n("There is nothing to undo!"));
00114 }
00115 }
00116
00117 void
00118 UndoStack::pushSingleAction(ulong serNum, KMFolder *folder, KMFolder *destFolder)
00119 {
00120 int id = newUndoAction( folder, destFolder );
00121 addMsgToAction( id, serNum );
00122 }
00123
00124 void
00125 UndoStack::msgDestroyed( KMMsgBase* )
00126 {
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 }
00140
00141 void
00142 UndoStack::folderDestroyed( KMFolder *folder)
00143 {
00144 for( UndoInfo *info = mStack.first(); info; )
00145 {
00146 if ( (info->srcFolder == folder) ||
00147 (info->destFolder == folder) )
00148 {
00149 mStack.removeRef( info );
00150 info = mStack.current();
00151 }
00152 else
00153 info = mStack.next();
00154 }
00155 emit undoStackChanged();
00156 }
00157
00158 }
00159
00160 #include "undostack.moc"
This file is part of the documentation for kmail Library Version 3.2.2.