Bug 101640 - if necessary, update selection in three pane after an account is removed

ported by jeff.qiu@sun.com, a=jdunn@netscape.com


git-svn-id: svn://10.0.0.236/branches/SUN_6_2_1_BRANCH@113841 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
margaret.chan%sun.com
2002-02-06 23:15:47 +00:00
parent 07d6df354f
commit 1ddbfb8dd7
6 changed files with 101 additions and 8 deletions

View File

@@ -21,11 +21,11 @@
[scriptable, uuid(E6B64B86-90CB-11d3-8B02-0060B0FC04D2)]
interface nsIIncomingServerListener : nsISupports {
/* Notification sent when a server is first loaded into the account manager */
void OnServerLoaded(in nsIMsgIncomingServer server);
void onServerLoaded(in nsIMsgIncomingServer server);
/* Notification sent when a server is unloaded from the account manager*/
void OnServerUnloaded(in nsIMsgIncomingServer server);
void onServerUnloaded(in nsIMsgIncomingServer server);
/* Notification sent when a server hostname or username changes */
void onServerChanged(in nsIMsgIncomingServer server);
};

View File

@@ -151,12 +151,13 @@ interface nsIMsgAccountManager : nsISupports {
void removeRootFolderListener(in nsIFolderListener listener);
// these are going away in favor of add/removeRootFolderListener
void AddIncomingServerListener(in nsIIncomingServerListener serverListener);
void RemoveIncomingServerListener(in nsIIncomingServerListener serverListener);
void addIncomingServerListener(in nsIIncomingServerListener serverListener);
void removeIncomingServerListener(in nsIIncomingServerListener serverListener);
// these are going away in favor of nsIFolder::NotifyEvent(in nsIAtom event);
void NotifyServerLoaded(in nsIMsgIncomingServer server);
void NotifyServerUnloaded(in nsIMsgIncomingServer server);
void notifyServerLoaded(in nsIMsgIncomingServer server);
void notifyServerUnloaded(in nsIMsgIncomingServer server);
void notifyServerChanged(in nsIMsgIncomingServer server);
// force account info out to prefs file
void saveAccountInfo();

View File

@@ -349,6 +349,65 @@ function IsCurrentLoadedFolder(folder)
return false;
}
function ServerContainsFolder(server, folder)
{
if (!folder || !server)
return false;
return server.equals(folder.server);
}
function SelectServer(server)
{
SelectFolder(server.RootFolder.URI);
}
// we have this incoming server listener in case we need to
// alter the folder pane selection when a server is removed
// or changed (currently, when the real username or real hostname change)
var gThreePaneIncomingServerListener = {
onServerLoaded: function(server) {},
onServerUnloaded: function(server) {
var selectedFolders = GetSelectedMsgFolders();
for (var i = 0; i < selectedFolders.length; i++) {
if (ServerContainsFolder(server, selectedFolders[i])) {
SelectServer(accountManager.defaultAccount.incomingServer);
// we've made a new selection, we're done
return;
}
}
// if nothing is selected at this point, better go select the default
// this could happen if nothing was selected when the server was removed
selectedFolders = GetSelectedMsgFolders();
if (selectedFolders.length == 0) {
SelectServer(accountManager.defaultAccount.incomingServer);
}
},
onServerChanged: function(server) {
// if the current selected folder is on the server that changed
// and that server is an imap or news server,
// we need to update the selection.
// on those server types, we'll be reconnecting to the server
// and our currently selected folder will need to be reloaded
// or worse, be invalid.
if (server.type != "imap" && server.type !="nntp")
return;
var selectedFolders = GetSelectedMsgFolders();
for (var i = 0; i < selectedFolders.length; i++) {
// if the selected item is a server, we don't have to update
// the selection
if (!(selectedFolders[i].isServer) && ServerContainsFolder(server, selectedFolders[i])) {
SelectServer(server);
// we've made a new selection, we're done
return;
}
}
}
}
/* Functions related to startup */
function OnLoadMessenger()
{
@@ -373,6 +432,7 @@ function OnLoadMessenger()
InitPanes();
accountManager.SetSpecialFoldersForIdentities();
accountManager.addIncomingServerListener(gThreePaneIncomingServerListener);
AddToSession();
//need to add to session before trying to load start folder otherwise listeners aren't
@@ -444,6 +504,7 @@ function OnLoadMessenger()
function OnUnloadMessenger()
{
accountManager.removeIncomingServerListener(gThreePaneIncomingServerListener);
OnMailWindowUnload();
}

View File

@@ -1625,6 +1625,24 @@ NS_IMETHODIMP nsMsgAccountManager::NotifyServerUnloaded(nsIMsgIncomingServer *se
return NS_OK;
}
NS_IMETHODIMP nsMsgAccountManager::NotifyServerChanged(nsIMsgIncomingServer *server)
{
nsresult rv;
PRUint32 count;
rv = m_incomingServerListeners->Count(&count);
if (NS_FAILED(rv)) return rv;
for(PRUint32 i = 0; i < count; i++)
{
nsCOMPtr<nsIIncomingServerListener> listener =
getter_AddRefs((nsIIncomingServerListener*)m_incomingServerListeners->ElementAt(i));
listener->OnServerChanged(server);
}
return NS_OK;
}
NS_IMETHODIMP
nsMsgAccountManager::FindServer(const char* username,
const char* hostname,

View File

@@ -1015,6 +1015,12 @@ nsMsgAccountManagerDataSource::OnServerUnloaded(nsIMsgIncomingServer* aServer)
return NS_OK;
}
NS_IMETHODIMP
nsMsgAccountManagerDataSource::OnServerChanged(nsIMsgIncomingServer *server)
{
return NS_OK;
}
nsresult
nsMsgAccountManagerDataSource::OnItemPropertyChanged(nsISupports *, nsIAtom *, char const *, char const *)
{

View File

@@ -211,6 +211,13 @@ NS_IMETHODIMP nsMsgBiffManager::OnServerUnloaded(nsIMsgIncomingServer *server)
return rv;
}
NS_IMETHODIMP nsMsgBiffManager::OnServerChanged(nsIMsgIncomingServer *server)
{
// nothing required. If the hostname or username changed
// the next time biff fires, we'll ping the right server
return NS_OK;
}
NS_IMETHODIMP nsMsgBiffManager::Observe(nsISupports *aSubject, const PRUnichar *aTopic, const PRUnichar *someData)
{
nsAutoString topicString(aTopic);