mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-21 09:49:14 +00:00
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:
parent
bbff46ffb3
commit
015ed59aa6
@ -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);
|
||||
|
@ -731,4 +731,12 @@ function GetSelectTrashUri(folder)
|
||||
return null;
|
||||
}
|
||||
|
||||
function Undo()
|
||||
{
|
||||
messenger.Undo(msgWindow);
|
||||
}
|
||||
|
||||
function Redo()
|
||||
{
|
||||
messenger.Redo(msgWindow);
|
||||
}
|
||||
|
@ -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"/>
|
||||
|
@ -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');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -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. -->
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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) );
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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"))
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user