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"