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:
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 *)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user