зеркало из https://github.com/mozilla/gecko-dev.git
fix problem with selection after deleting from trash or delete no trash, r=jefft 32402
This commit is contained in:
Родитель
879ef78e6d
Коммит
4d5e8b028a
|
@ -30,6 +30,16 @@ interface nsIImapProtocol;
|
|||
interface nsISupportsArray;
|
||||
interface nsIMsgFolder;
|
||||
|
||||
typedef long nsMsgImapDeleteModel;
|
||||
|
||||
[scriptable, uuid(bbfc33de-fe89-11d3-a564-0060b0fc04b7)]
|
||||
interface nsMsgImapDeleteModels
|
||||
{
|
||||
const long IMAPDelete = 0; /* delete with a big red x */
|
||||
const long MoveToTrash = 1; /* delete moves message to the trash */
|
||||
const long DeleteNoTrash = 2; /* delete is shift delete - don't create or use trash */
|
||||
};
|
||||
|
||||
[scriptable, uuid(3d2e7e38-f9d8-11d2-af8f-001083002da8)]
|
||||
interface nsIImapIncomingServer : nsISupports {
|
||||
|
||||
|
@ -39,7 +49,7 @@ interface nsIImapIncomingServer : nsISupports {
|
|||
attribute string serverDirectory;
|
||||
attribute long capabilityPref;
|
||||
attribute boolean cleanupInboxOnExit;
|
||||
attribute long deleteModel;
|
||||
attribute nsMsgImapDeleteModel deleteModel;
|
||||
attribute boolean dualUseFolders;
|
||||
attribute boolean emptyTrashOnExit;
|
||||
attribute long emptyTrashThreshhold;
|
||||
|
|
|
@ -1372,19 +1372,34 @@ NS_IMETHODIMP nsImapMailFolder::DeleteMessages(nsISupportsArray *messages,
|
|||
nsCOMPtr<nsIEnumerator> aEnumerator;
|
||||
nsCOMPtr<nsIRDFResource> res;
|
||||
nsCString uri;
|
||||
PRBool isTrashFolder = PR_FALSE;
|
||||
PRBool deleteImmediatelyNoTrash = PR_FALSE;
|
||||
nsCString messageIds;
|
||||
nsMsgKeyArray srcKeyArray;
|
||||
|
||||
nsMsgImapDeleteModel deleteModel = nsMsgImapDeleteModels::MoveToTrash;
|
||||
|
||||
nsCOMPtr<nsIImapIncomingServer> imapServer;
|
||||
nsCOMPtr<nsIMsgIncomingServer> server;
|
||||
|
||||
rv = GetFlag(MSG_FOLDER_FLAG_TRASH, &deleteImmediatelyNoTrash);
|
||||
|
||||
if (NS_SUCCEEDED(GetServer(getter_AddRefs(server))) && server)
|
||||
{
|
||||
imapServer = do_QueryInterface(server);
|
||||
if (imapServer)
|
||||
imapServer->GetDeleteModel(&deleteModel);
|
||||
if (deleteModel != nsMsgImapDeleteModels::MoveToTrash)
|
||||
deleteImmediatelyNoTrash = PR_TRUE;
|
||||
}
|
||||
|
||||
rv = BuildIdsAndKeyArray(messages, messageIds, srcKeyArray);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = GetFlag(MSG_FOLDER_FLAG_TRASH, &isTrashFolder);
|
||||
|
||||
nsCOMPtr<nsIMsgFolder> rootFolder;
|
||||
nsCOMPtr<nsIMsgFolder> trashFolder;
|
||||
|
||||
if (!isTrashFolder)
|
||||
if (!deleteImmediatelyNoTrash)
|
||||
{
|
||||
rv = GetRootFolder(getter_AddRefs(rootFolder));
|
||||
if (NS_SUCCEEDED(rv) && rootFolder)
|
||||
|
@ -1395,10 +1410,10 @@ NS_IMETHODIMP nsImapMailFolder::DeleteMessages(nsISupportsArray *messages,
|
|||
getter_AddRefs(trashFolder));
|
||||
// if we can't find the trash, we'll just have to do an imap delete and pretend this is the trash
|
||||
if (NS_FAILED(rv) || !trashFolder)
|
||||
isTrashFolder = PR_TRUE;
|
||||
deleteImmediatelyNoTrash = PR_TRUE;
|
||||
}
|
||||
}
|
||||
if (NS_SUCCEEDED(rv) && isTrashFolder)
|
||||
if (NS_SUCCEEDED(rv) && deleteImmediatelyNoTrash)
|
||||
{
|
||||
rv = StoreImapFlags(kImapMsgDeletedFlag, PR_TRUE, srcKeyArray);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
|
@ -2897,7 +2912,6 @@ nsImapMailFolder::NotifyMessageDeleted(const char *onlineFolderName,PRBool delet
|
|||
PRBool nsImapMailFolder::ShowDeletedMessages()
|
||||
{
|
||||
nsresult err;
|
||||
// return (m_host->GetIMAPDeleteModel() == MSG_IMAPDeleteIsIMAPDelete);
|
||||
NS_WITH_SERVICE(nsIImapHostSessionList, hostSession,
|
||||
kCImapHostSessionList, &err);
|
||||
PRBool rv = PR_FALSE;
|
||||
|
@ -2915,7 +2929,6 @@ PRBool nsImapMailFolder::ShowDeletedMessages()
|
|||
|
||||
PRBool nsImapMailFolder::DeleteIsMoveToTrash()
|
||||
{
|
||||
// return (m_host->GetIMAPDeleteModel() == MSG_IMAPDeleteIsIMAPDelete);
|
||||
nsresult err;
|
||||
NS_WITH_SERVICE(nsIImapHostSessionList, hostSession,
|
||||
kCImapHostSessionList, &err);
|
||||
|
@ -3078,6 +3091,13 @@ nsImapMailFolder::OnStopRunningUrl(nsIURI *aUrl, nsresult aExitCode)
|
|||
ClearCopyState(aExitCode);
|
||||
}
|
||||
break;
|
||||
case nsIImapUrl::nsImapAddMsgFlags:
|
||||
// this isn't really right - we'd like to know we were
|
||||
// deleting a message to start with, but it probably
|
||||
// won't do any harm.
|
||||
NotifyDeleteOrMoveMessagesCompleted(this);
|
||||
|
||||
break;
|
||||
case nsIImapUrl::nsImapAppendMsgFromFile:
|
||||
case nsIImapUrl::nsImapAppendDraftFromFile:
|
||||
if (m_copyState)
|
||||
|
|
Загрузка…
Ссылка в новой задаче