fix problem with selection after deleting from trash or delete no trash, r=jefft 32402

This commit is contained in:
bienvenu%netscape.com 2000-03-21 01:28:59 +00:00
Родитель 879ef78e6d
Коммит 4d5e8b028a
2 изменённых файлов: 38 добавлений и 8 удалений

Просмотреть файл

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