diff --git a/mailnews/base/public/nsIMessenger.idl b/mailnews/base/public/nsIMessenger.idl index 94177204fd9f..75f89c257c1e 100644 --- a/mailnews/base/public/nsIMessenger.idl +++ b/mailnews/base/public/nsIMessenger.idl @@ -37,6 +37,11 @@ interface nsITransactionManager; [scriptable, uuid(4f7966d0-c14f-11d2-b7f2-00805f05ffa5)] interface nsIMessenger : nsISupports { +%{C++ + enum { eUnknown=0, eDeleteMsg=1, + eMoveMsg=2, eCopyMsg=3 }; +%} + readonly attribute nsITransactionManager transactionManager; void GetNewMessages(in nsIRDFCompositeDataSource database, @@ -84,8 +89,12 @@ interface nsIMessenger : nsISupports { void EmptyTrash(in nsIRDFCompositeDataSource db, in nsIRDFResource folder); - void Undo(); - void Redo(); + boolean CanUndo(); + boolean CanRedo(); + unsigned long GetUndoTransactionType(); + unsigned long GetRedoTransactionType(); + void Undo(in nsIMsgWindow msgWindow); + void Redo(in nsIMsgWindow msgWindow); void SendUnsentMessages(in nsIMsgIdentity aIdentity); void SetDocumentCharset(in wstring characterSet); void saveAs(in string url, in boolean asFile, in nsIMsgIdentity identity); diff --git a/mailnews/base/resources/content/commandglue.js b/mailnews/base/resources/content/commandglue.js index 94dda34b6611..1cd88bb65789 100644 --- a/mailnews/base/resources/content/commandglue.js +++ b/mailnews/base/resources/content/commandglue.js @@ -731,4 +731,12 @@ function GetSelectTrashUri(folder) return null; } +function Undo() +{ + messenger.Undo(msgWindow); +} +function Redo() +{ + messenger.Redo(msgWindow); +} diff --git a/mailnews/base/resources/content/messenger.xul b/mailnews/base/resources/content/messenger.xul index 14929c69971b..b7903a951b0e 100644 --- a/mailnews/base/resources/content/messenger.xul +++ b/mailnews/base/resources/content/messenger.xul @@ -70,8 +70,16 @@ Rights Reserved. - - + + @@ -381,14 +389,10 @@ Rights Reserved. - + - - - + + diff --git a/mailnews/base/resources/content/widgetglue.js b/mailnews/base/resources/content/widgetglue.js index 3d85358ace1f..ed8fd4180e21 100644 --- a/mailnews/base/resources/content/widgetglue.js +++ b/mailnews/base/resources/content/widgetglue.js @@ -90,7 +90,11 @@ var FolderPaneController = { // on blur events set the menu item texts back to the normal values if ( event == 'blur' ) + { goSetMenuValue('cmd_delete', 'valueDefault'); + goSetMenuValue('cmd_undo', 'valueDefault'); + goSetMenuValue('cmd_redo', 'valueDefault'); + } } }; @@ -129,6 +133,54 @@ var ThreadPaneController = } }; +function SetupUndoRedoCommand(command) +{ + // dump ("--- SetupUndoRedoCommand: " + command + "\n"); + var canUndoOrRedo = false; + var txnType = 0; + + if (command == "cmd_undo") + { + canUndoOrRedo = messenger.CanUndo(); + txnType = messenger.GetUndoTransactionType(); + } + else + { + canUndoOrRedo = messenger.CanRedo(); + txnType = messenger.GetRedoTransactionType(); + } + + if (canUndoOrRedo) + { + switch (txnType) + { + default: + case 0: + goSetMenuValue(command, 'valueDefault'); + break; + case 1: + goSetMenuValue(command, 'valueDeleteMsg'); + break; + case 2: + goSetMenuValue(command, 'valueMoveMsg'); + break; + case 3: + goSetMenuValue(command, 'valueCopyMsg'); + break; + } + } + return canUndoOrRedo; +} + + +function CommandUpdate_UndoRedo() +{ + ShowMenuItem("menu_undo", true); + EnableMenuItem("menu_undo", SetupUndoRedoCommand("cmd_undo")); + ShowMenuItem("menu_redo", true); + EnableMenuItem("menu_redo", SetupUndoRedoCommand("cmd_redo")); +} + // DefaultController object (handles commands when one of the trees does not have focus) var DefaultController = { @@ -142,7 +194,7 @@ var DefaultController = case "cmd_undo": case "cmd_redo": return true; - + default: return false; } @@ -173,9 +225,7 @@ var DefaultController = case "cmd_undo": case "cmd_redo": - // FIX ME - these commands should be calling the back-end code to determine if - // they should be enabled, this hack of always enabled can then be fixed. - return true; + return SetupUndoRedoCommand(command); /* case "cmd_delete": case "button_delete": @@ -223,11 +273,11 @@ var DefaultController = break; case "cmd_undo": - messenger.Undo(); + messenger.Undo(msgWindow); break; case "cmd_redo": - messenger.Redo(); + messenger.Redo(msgWindow); break; } }, @@ -236,7 +286,12 @@ var DefaultController = { // on blur events set the menu item texts back to the normal values if ( event == 'blur' ) + { + dump("blur - setup menu value\n"); goSetMenuValue('cmd_delete', 'valueDefault'); + goSetMenuValue('cmd_undo', 'valueDefault'); + goSetMenuValue('cmd_redo', 'valueDefault'); + } } }; diff --git a/mailnews/base/resources/locale/en-US/messenger.dtd b/mailnews/base/resources/locale/en-US/messenger.dtd index 119e4b7f21f5..b45fb33759e0 100644 --- a/mailnews/base/resources/locale/en-US/messenger.dtd +++ b/mailnews/base/resources/locale/en-US/messenger.dtd @@ -77,6 +77,14 @@ Rights Reserved. + + + + + + + + diff --git a/mailnews/base/src/nsMessenger.cpp b/mailnews/base/src/nsMessenger.cpp index f17cdc118697..077680996253 100644 --- a/mailnews/base/src/nsMessenger.cpp +++ b/mailnews/base/src/nsMessenger.cpp @@ -87,6 +87,10 @@ #include "nsIMsgDraft.h" #include "nsIUrlListener.h" +// undo +#include "nsITransaction.h" +#include "nsMsgTxn.h" + static NS_DEFINE_CID(kIStreamConverterServiceCID, NS_STREAMCONVERTERSERVICE_CID); static NS_DEFINE_CID(kCMsgMailSessionCID, NS_MSGMAILSESSION_CID); static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); @@ -936,8 +940,70 @@ nsMessenger::EmptyTrash(nsIRDFCompositeDataSource* db, return rv; } +NS_IMETHODIMP nsMessenger::GetUndoTransactionType(PRUint32 *txnType) +{ + nsresult rv = NS_ERROR_NULL_POINTER; + if (!txnType || !mTxnMgr) + return rv; + *txnType = nsMessenger::eUnknown; + nsITransaction *txn = nsnull; + // ** jt -- too bad PeekUndoStack not AddRef'ing + rv = mTxnMgr->PeekUndoStack(&txn); + if (NS_SUCCEEDED(rv) && txn) + { + nsCOMPtr msgTxn = do_QueryInterface(txn, &rv); + if (NS_SUCCEEDED(rv) && msgTxn) + rv = msgTxn->GetTransactionType(txnType); + } + return rv; +} + +NS_IMETHODIMP nsMessenger::CanUndo(PRBool *bValue) +{ + nsresult rv = NS_ERROR_NULL_POINTER; + if (!bValue || !mTxnMgr) + return rv; + *bValue = PR_FALSE; + PRInt32 count = 0; + rv = mTxnMgr->GetNumberOfUndoItems(&count); + if (NS_SUCCEEDED(rv) && count > 0) + *bValue = PR_TRUE; + return rv; +} + +NS_IMETHODIMP nsMessenger::GetRedoTransactionType(PRUint32 *txnType) +{ + nsresult rv = NS_ERROR_NULL_POINTER; + if (!txnType || !mTxnMgr) + return rv; + *txnType = nsMessenger::eUnknown; + nsITransaction *txn = nsnull; + // ** jt - too bad PeekRedoStack not AddRef'ing + rv = mTxnMgr->PeekRedoStack(&txn); + if (NS_SUCCEEDED(rv) && txn) + { + nsCOMPtr msgTxn = do_QueryInterface(txn, &rv); + if (NS_SUCCEEDED(rv) && msgTxn) + rv = msgTxn->GetTransactionType(txnType); + } + return rv; +} + +NS_IMETHODIMP nsMessenger::CanRedo(PRBool *bValue) +{ + nsresult rv = NS_ERROR_NULL_POINTER; + if (!bValue || !mTxnMgr) + return rv; + *bValue = PR_FALSE; + PRInt32 count = 0; + rv = mTxnMgr->GetNumberOfRedoItems(&count); + if (NS_SUCCEEDED(rv) && count > 0) + *bValue = PR_TRUE; + return rv; +} + NS_IMETHODIMP -nsMessenger::Undo() +nsMessenger::Undo(nsIMsgWindow *msgWindow) { nsresult rv = NS_OK; if (mTxnMgr) @@ -945,13 +1011,24 @@ nsMessenger::Undo() PRInt32 numTxn = 0; rv = mTxnMgr->GetNumberOfUndoItems(&numTxn); if (NS_SUCCEEDED(rv) && numTxn > 0) - mTxnMgr->Undo(); + { + nsITransaction *txn = nsnull; + // ** jt -- PeekUndoStack not AddRef'ing + rv = mTxnMgr->PeekUndoStack(&txn); + if (NS_SUCCEEDED(rv) && txn) + { + nsCOMPtr msgTxn = do_QueryInterface(txn, &rv); + if (NS_SUCCEEDED(rv) && msgTxn) + msgTxn->SetMsgWindow(msgWindow); + } + mTxnMgr->Undo(); + } } return rv; } NS_IMETHODIMP -nsMessenger::Redo() +nsMessenger::Redo(nsIMsgWindow *msgWindow) { nsresult rv = NS_OK; if (mTxnMgr) @@ -959,7 +1036,18 @@ nsMessenger::Redo() PRInt32 numTxn = 0; rv = mTxnMgr->GetNumberOfRedoItems(&numTxn); if (NS_SUCCEEDED(rv) && numTxn > 0) - mTxnMgr->Redo(); + { + nsITransaction *txn = nsnull; + // jt -- PeekRedoStack not AddRef'ing + rv = mTxnMgr->PeekRedoStack(&txn); + if (NS_SUCCEEDED(rv) && txn) + { + nsCOMPtr msgTxn = do_QueryInterface(txn, &rv); + if (NS_SUCCEEDED(rv) && msgTxn) + msgTxn->SetMsgWindow(msgWindow); + } + mTxnMgr->Redo(); + } } return rv; } diff --git a/mailnews/base/util/nsMsgTxn.cpp b/mailnews/base/util/nsMsgTxn.cpp index 9c51317423c5..20e81c458f1c 100644 --- a/mailnews/base/util/nsMsgTxn.cpp +++ b/mailnews/base/util/nsMsgTxn.cpp @@ -28,9 +28,12 @@ NS_IMPL_ADDREF(nsMsgTxn) NS_IMPL_RELEASE(nsMsgTxn) // note that aEditor is not refcounted -nsMsgTxn::nsMsgTxn() +nsMsgTxn::nsMsgTxn() { NS_INIT_REFCNT(); + m_txnType = 0; + m_undoString = "Undo"; + m_redoString = "Redo"; } nsMsgTxn::~nsMsgTxn() @@ -61,24 +64,6 @@ NS_IMETHODIMP nsMsgTxn::Write(nsIOutputStream *aOutputStream) return NS_ERROR_NOT_IMPLEMENTED; } -NS_IMETHODIMP nsMsgTxn::GetUndoString(nsString *aString) -{ - if (nsnull!=aString) - *aString="Undo"; - else - return NS_ERROR_NULL_POINTER; - return NS_OK; -} - -NS_IMETHODIMP nsMsgTxn::GetRedoString(nsString *aString) -{ - if (nsnull!=aString) - *aString="Redo"; - else - return NS_ERROR_NULL_POINTER; - return NS_OK; -} - NS_IMETHODIMP nsMsgTxn::QueryInterface(REFNSIID aIID, void** aInstancePtr) { @@ -99,5 +84,67 @@ nsMsgTxn::QueryInterface(REFNSIID aIID, void** aInstancePtr) return NS_NOINTERFACE; } +NS_IMETHODIMP nsMsgTxn::GetMsgWindow(nsIMsgWindow **msgWindow) +{ + if (!msgWindow || !m_msgWindow) + return NS_ERROR_NULL_POINTER; + *msgWindow = m_msgWindow; + NS_ADDREF (*msgWindow); + return NS_OK; +} + +NS_IMETHODIMP nsMsgTxn::SetMsgWindow(nsIMsgWindow *msgWindow) +{ + m_msgWindow = msgWindow; + return NS_OK; +} + +NS_IMETHODIMP +nsMsgTxn::SetUndoString(nsString *aString) +{ + if (!aString) return NS_ERROR_NULL_POINTER; + m_undoString = *aString; + return NS_OK; +} + +NS_IMETHODIMP +nsMsgTxn::SetRedoString(nsString* aString) +{ + if (!aString) return NS_ERROR_NULL_POINTER; + m_redoString = *aString; + return NS_OK; +} + +NS_IMETHODIMP +nsMsgTxn::GetUndoString(nsString* aString) +{ + if (!aString) return NS_ERROR_NULL_POINTER; + *aString = m_undoString; + return NS_OK; +} + +NS_IMETHODIMP +nsMsgTxn::GetRedoString(nsString* aString) +{ + if (!aString) return NS_ERROR_NULL_POINTER; + *aString = m_redoString; + return NS_OK; +} +NS_IMETHODIMP +nsMsgTxn::GetTransactionType(PRUint32 *txnType) +{ + if (!txnType) + return NS_ERROR_NULL_POINTER; + *txnType = m_txnType; + return NS_OK; +} + +NS_IMETHODIMP +nsMsgTxn::SetTransactionType(PRUint32 txnType) +{ + m_txnType = txnType; + return NS_OK; +} + diff --git a/mailnews/base/util/nsMsgTxn.h b/mailnews/base/util/nsMsgTxn.h index 0434afdb77fa..a85c6af61d76 100644 --- a/mailnews/base/util/nsMsgTxn.h +++ b/mailnews/base/util/nsMsgTxn.h @@ -25,6 +25,8 @@ #include "nsITransaction.h" #include "msgCore.h" +#include "nsCOMPtr.h" +#include "nsIMsgWindow.h" #define NS_MESSAGETRANSACTION_IID \ { /* da621b30-1efc-11d3-abe4-00805f8ac968 */ \ @@ -53,9 +55,20 @@ class NS_MSG_BASE nsMsgTxn : public nsITransaction NS_IMETHOD Write(nsIOutputStream *aOutputStream); NS_IMETHOD GetUndoString(nsString *aString); - + NS_IMETHOD SetUndoString(nsString *aString); NS_IMETHOD GetRedoString(nsString *aString); + NS_IMETHOD SetRedoString(nsString *aString); + NS_IMETHOD GetMsgWindow(nsIMsgWindow **msgWindow); + NS_IMETHOD SetMsgWindow(nsIMsgWindow *msgWindow); + NS_IMETHOD SetTransactionType(PRUint32 txnType); + NS_IMETHOD GetTransactionType(PRUint32 *txnType); + +protected: + nsCOMPtr m_msgWindow; + nsString m_undoString; + nsString m_redoString; + PRUint32 m_txnType; }; #endif diff --git a/mailnews/imap/src/nsImapMailFolder.cpp b/mailnews/imap/src/nsImapMailFolder.cpp index 58cc502d99fb..6715708500fc 100644 --- a/mailnews/imap/src/nsImapMailFolder.cpp +++ b/mailnews/imap/src/nsImapMailFolder.cpp @@ -60,6 +60,7 @@ #include "nsSpecialSystemDirectory.h" #include "nsXPIDLString.h" #include "nsIImapFlagAndUidState.h" +#include "nsIMessenger.h" static NS_DEFINE_CID(kNetSupportDialogCID, NS_NETSUPPORTDIALOG_CID); static NS_DEFINE_CID(kMsgFilterServiceCID, NS_MSGFILTERSERVICE_CID); @@ -3470,6 +3471,19 @@ nsImapMailFolder::CopyMessagesWithStream(nsIMsgFolder* srcFolder, srcFolder, &srcKeyArray, messageIds.GetBuffer(), this, PR_TRUE, isMove, m_eventQueue, urlListener); + if (!undoMsgTxn) return NS_ERROR_OUT_OF_MEMORY; + if (isMove) + { + if (mFlags & MSG_FOLDER_FLAG_TRASH) + undoMsgTxn->SetTransactionType(nsIMessenger::eDeleteMsg); + else + undoMsgTxn->SetTransactionType(nsIMessenger::eMoveMsg); + } + else + { + undoMsgTxn->SetTransactionType(nsIMessenger::eCopyMsg); + } + rv = undoMsgTxn->QueryInterface( NS_GET_IID(nsImapMoveCopyMsgTxn), getter_AddRefs(m_copyState->m_undoMsgTxn) ); @@ -3559,6 +3573,18 @@ nsImapMailFolder::CopyMessages(nsIMsgFolder* srcFolder, nsImapMoveCopyMsgTxn* undoMsgTxn = new nsImapMoveCopyMsgTxn( srcFolder, &srcKeyArray, messageIds.GetBuffer(), this, PR_TRUE, isMove, m_eventQueue, urlListener); + if (!undoMsgTxn) return NS_ERROR_OUT_OF_MEMORY; + if (isMove) + { + if (mFlags & MSG_FOLDER_FLAG_TRASH) + undoMsgTxn->SetTransactionType(nsIMessenger::eDeleteMsg); + else + undoMsgTxn->SetTransactionType(nsIMessenger::eMoveMsg); + } + else + { + undoMsgTxn->SetTransactionType(nsIMessenger::eCopyMsg); + } rv = undoMsgTxn->QueryInterface( NS_GET_IID(nsImapMoveCopyMsgTxn), getter_AddRefs(m_copyState->m_undoMsgTxn) ); diff --git a/mailnews/imap/src/nsImapService.cpp b/mailnews/imap/src/nsImapService.cpp index 027d0daa7410..179213986449 100644 --- a/mailnews/imap/src/nsImapService.cpp +++ b/mailnews/imap/src/nsImapService.cpp @@ -346,9 +346,13 @@ nsImapService::CopyMessage(const char * aSrcMailboxURI, nsIStreamListener * msgKey, kImapMsgDeletedFlag, PR_TRUE); +#if 0 + // ** jt -- don't think this is needed // ** jt -- force to update the folder if (NS_SUCCEEDED(rv)) - rv = SelectFolder(queue, folder, aUrlListener, nsnull, nsnull); + rv = SelectFolder(queue, folder, aUrlListener, nsnull, + nsnull); +#endif } // if move message } // if we got an imap message sink } // if we decomposed the imap message diff --git a/mailnews/imap/src/nsImapUndoTxn.cpp b/mailnews/imap/src/nsImapUndoTxn.cpp index 3a3702aefb6c..a8117df09344 100644 --- a/mailnews/imap/src/nsImapUndoTxn.cpp +++ b/mailnews/imap/src/nsImapUndoTxn.cpp @@ -163,13 +163,18 @@ nsImapMoveCopyMsgTxn::Undo(void) { nsCOMPtr srcListener = do_QueryInterface(m_srcFolder, &rv); + // ** make sure we are in the selected state; use lite select + // folder so we won't hit performance hard + if (NS_SUCCEEDED(rv)) + rv = imapService->LiteSelectFolder(m_eventQueue, m_srcFolder, + srcListener, nsnull); + rv = imapService->SubtractMessageFlags( m_eventQueue, m_srcFolder, srcListener, nsnull, m_srcMsgIdString, kImapMsgDeletedFlag, m_idsAreUids); - if (NS_SUCCEEDED(rv)) - rv = imapService->SelectFolder(m_eventQueue, m_srcFolder, - srcListener, nsnull, nsnull); + if (m_msgWindow) + m_srcFolder->UpdateFolder(m_msgWindow); } } if (m_dstKeyArray.GetSize() > 0) @@ -177,14 +182,18 @@ nsImapMoveCopyMsgTxn::Undo(void) nsCOMPtr dstListener; dstListener = do_QueryInterface(m_dstFolder, &rv); + // ** make sire we are in the selected state; use lite select folder + // so we won't hit preformace hard + if (NS_SUCCEEDED(rv)) + rv = imapService->LiteSelectFolder(m_eventQueue, m_dstFolder, + dstListener, nsnull); rv = imapService->AddMessageFlags(m_eventQueue, m_dstFolder, dstListener, nsnull, m_dstMsgIdString.GetBuffer(), kImapMsgDeletedFlag, m_idsAreUids); - if (NS_SUCCEEDED(rv)) - rv = imapService->SelectFolder(m_eventQueue, m_dstFolder, - dstListener, nsnull, nsnull); + if (m_msgWindow) + m_dstFolder->UpdateFolder(m_msgWindow); } return rv; } @@ -205,14 +214,19 @@ nsImapMoveCopyMsgTxn::Redo(void) { nsCOMPtr srcListener = do_QueryInterface(m_srcFolder, &rv); + // ** make sire we are in the selected state; use lite select + // folder so we won't hit preformace hard + if (NS_SUCCEEDED(rv)) + rv = imapService->LiteSelectFolder(m_eventQueue, m_srcFolder, + srcListener, nsnull); + rv = imapService->AddMessageFlags(m_eventQueue, m_srcFolder, srcListener, nsnull, m_srcMsgIdString, kImapMsgDeletedFlag, m_idsAreUids); - if (NS_SUCCEEDED(rv)) - rv = imapService->SelectFolder(m_eventQueue, m_srcFolder, - srcListener, nsnull, nsnull); + if (m_msgWindow) + m_srcFolder->UpdateFolder(m_msgWindow); } } if (m_dstKeyArray.GetSize() > 0) @@ -220,54 +234,22 @@ nsImapMoveCopyMsgTxn::Redo(void) nsCOMPtr dstListener; dstListener = do_QueryInterface(m_dstFolder, &rv); - + // ** make sire we are in the selected state; use lite select + // folder so we won't hit preformace hard + if(NS_SUCCEEDED(rv)) + rv = imapService->LiteSelectFolder(m_eventQueue, m_dstFolder, + dstListener, nsnull); rv = imapService->SubtractMessageFlags(m_eventQueue, m_dstFolder, dstListener, nsnull, m_dstMsgIdString.GetBuffer(), kImapMsgDeletedFlag, m_idsAreUids); - if(NS_SUCCEEDED(rv)) - rv = imapService->SelectFolder(m_eventQueue, m_dstFolder, - dstListener, nsnull, nsnull); + if (m_msgWindow) + m_dstFolder->UpdateFolder(m_msgWindow); } return rv; } -NS_IMETHODIMP -nsImapMoveCopyMsgTxn::GetUndoString(nsString* aString) -{ - if (!aString) - return NS_ERROR_NULL_POINTER; - *aString = m_undoString; - return NS_OK; -} - -NS_IMETHODIMP -nsImapMoveCopyMsgTxn::GetRedoString(nsString* aString) -{ - if (!aString) - return NS_ERROR_NULL_POINTER; - *aString = m_redoString; - return NS_OK; -} - -nsresult -nsImapMoveCopyMsgTxn::SetUndoString(nsString *aString) -{ - if (!aString) - return NS_ERROR_NULL_POINTER; - m_undoString = *aString; - return NS_OK; -} - -nsresult -nsImapMoveCopyMsgTxn::SetRedoString(nsString* aString) -{ - if (!aString) return NS_ERROR_NULL_POINTER; - m_redoString = *aString; - return NS_OK; -} - nsresult nsImapMoveCopyMsgTxn::SetCopyResponseUid(nsMsgKeyArray* aKeyArray, const char* aMsgIdString) @@ -379,5 +361,3 @@ nsImapMoveCopyMsgTxn::RedoMailboxDelete() } return rv; } - - diff --git a/mailnews/imap/src/nsImapUndoTxn.h b/mailnews/imap/src/nsImapUndoTxn.h index 5bedbcf27a64..9b2e5f8f3438 100644 --- a/mailnews/imap/src/nsImapUndoTxn.h +++ b/mailnews/imap/src/nsImapUndoTxn.h @@ -54,12 +54,8 @@ public: NS_IMETHOD Undo(void); NS_IMETHOD Redo(void); - NS_IMETHOD GetUndoString(nsString *aString); - NS_IMETHOD GetRedoString(nsString *aString); // helper - nsresult SetUndoString(nsString *aString); - nsresult SetRedoString(nsString *aString); nsresult SetCopyResponseUid(nsMsgKeyArray* keyArray, const char *msgIdString); nsresult GetSrcKeyArray(nsMsgKeyArray& srcKeyArray); diff --git a/mailnews/local/src/nsLocalMailFolder.cpp b/mailnews/local/src/nsLocalMailFolder.cpp index 55d7161e1a3d..a1af55f39686 100644 --- a/mailnews/local/src/nsLocalMailFolder.cpp +++ b/mailnews/local/src/nsLocalMailFolder.cpp @@ -61,6 +61,7 @@ #include "nsLocalUndoTxn.h" #include "nsMsgTxn.h" #include "nsIFileSpec.h" +#include "nsIMessenger.h" static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); static NS_DEFINE_CID(kMailboxServiceCID, NS_MAILBOXSERVICE_CID); @@ -1289,6 +1290,17 @@ nsMsgLocalMailFolder::CopyMessages(nsIMsgFolder* srcFolder, nsISupportsArray* } else { + if (isMove) + { + if (mFlags & MSG_FOLDER_FLAG_TRASH) + msgTxn->SetTransactionType(nsIMessenger::eDeleteMsg); + else + msgTxn->SetTransactionType(nsIMessenger::eMoveMsg); + } + else + { + msgTxn->SetTransactionType(nsIMessenger::eCopyMsg); + } PRUint32 numMsgs = 0; messages->Count(&numMsgs); if (numMsgs > 1 && protocolType.EqualsIgnoreCase("imap")) diff --git a/mailnews/local/src/nsLocalUndoTxn.cpp b/mailnews/local/src/nsLocalUndoTxn.cpp index 3954dcb88913..b7e558fd4b47 100644 --- a/mailnews/local/src/nsLocalUndoTxn.cpp +++ b/mailnews/local/src/nsLocalUndoTxn.cpp @@ -137,38 +137,6 @@ nsLocalMoveCopyMsgTxn::AddDstMsgSize(PRUint32 msgSize) return NS_OK; } -nsresult -nsLocalMoveCopyMsgTxn::SetUndoString(nsString *aString) -{ - if (!aString) return NS_ERROR_NULL_POINTER; - m_undoString = *aString; - return NS_OK; -} - -nsresult -nsLocalMoveCopyMsgTxn::SetRedoString(nsString* aString) -{ - if (!aString) return NS_ERROR_NULL_POINTER; - m_redoString = *aString; - return NS_OK; -} - -NS_IMETHODIMP -nsLocalMoveCopyMsgTxn::GetUndoString(nsString* aString) -{ - if (!aString) return NS_ERROR_NULL_POINTER; - *aString = m_undoString; - return NS_OK; -} - -NS_IMETHODIMP -nsLocalMoveCopyMsgTxn::GetRedoString(nsString* aString) -{ - if (!aString) return NS_ERROR_NULL_POINTER; - *aString = m_redoString; - return NS_OK; -} - nsresult nsLocalMoveCopyMsgTxn::UndoImapDeleteFlag(nsIMsgFolder* folder, nsMsgKeyArray& keyArray, diff --git a/mailnews/local/src/nsLocalUndoTxn.h b/mailnews/local/src/nsLocalUndoTxn.h index 96353184e951..017d2ce8a630 100644 --- a/mailnews/local/src/nsLocalUndoTxn.h +++ b/mailnews/local/src/nsLocalUndoTxn.h @@ -52,12 +52,8 @@ public: // overloading nsITransaction methods NS_IMETHOD Undo(void); NS_IMETHOD Redo(void); - NS_IMETHOD GetUndoString(nsString *aString); - NS_IMETHOD GetRedoString(nsString *aString); // helper - nsresult SetUndoString(nsString *aString); - nsresult SetRedoString(nsString *aString); nsresult AddSrcKey(nsMsgKey aKey); nsresult AddDstKey(nsMsgKey aKey); nsresult AddDstMsgSize(PRUint32 msgSize); @@ -75,8 +71,6 @@ private: nsMsgKeyArray m_srcKeyArray; nsCOMPtr m_dstFolder; nsMsgKeyArray m_dstKeyArray; - nsString m_undoString; - nsString m_redoString; PRBool m_isMove; PRBool m_srcIsImap4; nsUInt32Array m_dstSizeArray;