fixed bug 14893 - undo/redo should enable only when it is available; bug 23089 - selecting undo after delete cause trash folder to load; r=rhp

This commit is contained in:
jefft%netscape.com 2000-02-07 15:15:14 +00:00
parent bbff46ffb3
commit 015ed59aa6
15 changed files with 346 additions and 134 deletions

View File

@ -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);

View File

@ -731,4 +731,12 @@ function GetSelectTrashUri(folder)
return null;
}
function Undo()
{
messenger.Undo(msgWindow);
}
function Redo()
{
messenger.Redo(msgWindow);
}

View File

@ -70,8 +70,16 @@ Rights Reserved.
<broadcaster id="cmd_close" oncommand="CloseMessenger()"/>
<broadcaster id="cmd_quit"/>
<!-- Edit Menu -->
<broadcaster id="cmd_undo"/>
<broadcaster id="cmd_redo"/>
<broadcaster id="cmd_undo"
valueDeleteMsg="&undoDeleteMsgCmd.label;"
valueMoveMsg="&undoMoveMsgCmd.label;"
valueCopyMsg="&undoCopyMsgCmd.label;"
valueDefault="&undoDefaultCmd.label;"/>
<broadcaster id="cmd_redo"
valueDeleteMsg="&redoDeleteMsgCmd.label;"
valueMoveMsg="&redoMoveMsgCmd.label;"
valueCopyMsg="&redoCopyMsgCmd.label;"
valueDefault="&redoDefaultCmd.label;"/>
<broadcaster id="cmd_cut"/>
<broadcaster id="cmd_copy"/>
<broadcaster id="cmd_paste"/>
@ -381,14 +389,10 @@ Rights Reserved.
</menupopup>
</menu>
<menu id="menu_Edit">
<menu id="menu_Edit" onclick="CommandUpdate_UndoRedo();">
<menupopup>
<menuitem value="Undo" key="key_undo" oncommand="messenger.Undo()"/>
<menuitem value="Redo" key="key_redo" oncommand="messenger.Redo()"/>
<!-- FIX ME - put these back when focus fix is in...
<menuitem id="menu_undo"/>
<menuitem id="menu_redo"/>
-->
<menuitem id="menu_undo" value="&undoDefaultCmd.label;" key="key_undo" oncommand="Undo()"/>
<menuitem id="menu_redo" value="&redoDefaultCmd.label;" key="key_redo" oncommand="Redo()"/>
<menuseparator/>
<menuitem id="menu_cut"/>
<menuitem id="menu_copy"/>

View File

@ -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');
}
}
};

View File

@ -77,6 +77,14 @@ Rights Reserved.
<!ENTITY folderPropsCmd.label ".Folder Properties">
<!ENTITY accountManagerCmd.label "Account Setup...">
<!ENTITY accountWizardCmd.label "New Account Wizard...">
<!ENTITY undoDeleteMsgCmd.label "Undo Delete Message">
<!ENTITY redoDeleteMsgCmd.label "Redo Delete Message">
<!ENTITY undoMoveMsgCmd.label "Undo Move Message">
<!ENTITY redoMoveMsgCmd.label "Redo Move Message">
<!ENTITY undoCopyMsgCmd.label "Undo Copy Message">
<!ENTITY redoCopyMsgCmd.label "Redo Copy Message">
<!ENTITY undoDefaultCmd.label "Undo">
<!ENTITY redoDefaultCmd.label "Redo">
<!-- View Menu -->
<!-- LOCALIZATION NOTE (showSidebarMenu) : Do not translate below line. -->

View File

@ -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<nsMsgTxn> 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<nsMsgTxn> 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<nsMsgTxn> 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<nsMsgTxn> msgTxn = do_QueryInterface(txn, &rv);
if (NS_SUCCEEDED(rv) && msgTxn)
msgTxn->SetMsgWindow(msgWindow);
}
mTxnMgr->Redo();
}
}
return rv;
}

View File

@ -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;
}

View File

@ -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<nsIMsgWindow> m_msgWindow;
nsString m_undoString;
nsString m_redoString;
PRUint32 m_txnType;
};
#endif

View File

@ -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) );

View File

@ -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

View File

@ -163,13 +163,18 @@ nsImapMoveCopyMsgTxn::Undo(void)
{
nsCOMPtr<nsIUrlListener> 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<nsIUrlListener> 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<nsIUrlListener> 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<nsIUrlListener> 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;
}

View File

@ -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);

View File

@ -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"))

View File

@ -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,

View File

@ -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<nsIMsgFolder> m_dstFolder;
nsMsgKeyArray m_dstKeyArray;
nsString m_undoString;
nsString m_redoString;
PRBool m_isMove;
PRBool m_srcIsImap4;
nsUInt32Array m_dstSizeArray;