fix for #96499, account central not being shown on start up, "read messages" not working if server collapsed

fix for #95358, folder pane sorting should be case insensitive
fix for #18343, newsgroups in the folder pane should be in newsrc order, not alphabetical order.

plus, some clean up.

r=racham, sr=bienvenu, a=asa
This commit is contained in:
sspitzer%netscape.com 2001-08-23 01:10:05 +00:00
parent ce0f999657
commit 9867c7fd8e
14 changed files with 118 additions and 137 deletions

View File

@ -371,4 +371,9 @@ const nsMsgBiffState nsMsgBiffState_Unknown = 2; // We dunno whether there is ne
attribute nsIMsgRetentionSettings retentionSettings;
attribute nsIMsgDownloadSettings downloadSettings;
/**
* used for order in the folder pane, folder pickers, etc.
*/
attribute long sortOrder;
};

View File

@ -57,9 +57,6 @@
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#FolderTreeSimpleName"
object="?folderTreeSimpleName" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#FolderTreeSimpleName?sort=true"
object="?folderTreeSimpleNameSort" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#SpecialFolder"
object="?specialFolder" />

View File

@ -523,12 +523,8 @@ function OpenInboxForServer(server)
{
try {
HideAccountCentral();
OpenTwistyForServer(server);
var inboxFolder = GetInboxFolder(server);
var folderResource = RDF.GetResource(inboxFolder.URI)
var folderOutliner = GetFolderOutliner();
var folderIndex = GetFolderIndex(folderOutliner, folderResource);
ChangeSelection(folderOutliner, folderIndex);
SelectFolder(inboxFolder.URI);
if(CheckOnline())
GetMessagesForInboxOnServer(server);

View File

@ -523,6 +523,12 @@ function loadStartFolder(initialUri)
startFolderResource = inboxFolder.QueryInterface(Components.interfaces.nsIRDFResource);
}
else
{
// set the startFolderResource to the server, so we select it
// so we'll get account central
startFolderResource = RDF.GetResource(defaultServer.serverURI);
}
}
var startFolder = startFolderResource.QueryInterface(Components.interfaces.nsIFolder);
@ -563,32 +569,6 @@ function loadStartFolder(initialUri)
}
}
function OpenTwistyForServer(folderOutliner, server)
{
var folderIndex = GetFolderIndexForServerURI(folderOutliner, server.serverURI);
if (folderIndex >= 0)
{
var isContainerOpen = folderOutliner.outlinerBoxObject.view.isContainerOpen(folderIndex);
if (!isContainerOpen)
folderOutliner.outlinerBoxObject.view.toggleOpenState(folderIndex);
}
}
function GetFolderIndexForServerURI(folderOutliner, serverURI)
{
var folderResource = RDF.GetResource(serverURI);
var isServer = GetFolderAttribute(folderOutliner, folderResource, "IsServer");
if (isServer == "true")
{
var folderIndex = GetFolderIndex(folderOutliner, folderResource);
return folderIndex;
}
else
return -1;
}
function TriggerGetMessages(server)
{
// downloadMessagesAtStartup for a given server type indicates whether
@ -631,16 +611,13 @@ function OnFolderUnreadColAttrModified(event)
if (event.attrName == "hidden")
{
var folderNameCell = document.getElementById("folderNameCell");
var folderNameCol = document.getElementById("folderNameCol");
if (event.newValue == "true")
{
folderNameCell.setAttribute("label", "?folderTreeName");
folderNameCol.setAttribute("sort", "?folderTreeNameSort");
}
else if (event.attrChange == Components.interfaces.nsIDOMMutationEvent.REMOVAL)
{
folderNameCell.setAttribute("label", "?folderTreeSimpleName");
folderNameCol.setAttribute("sort", "?folderTreeSimpleNameSort");
}
}
}
@ -652,9 +629,7 @@ function OnLoadFolderPane()
if (!hidden)
{
var folderNameCell = document.getElementById("folderNameCell");
var folderNameCol = document.getElementById("folderNameCol");
folderNameCell.setAttribute("label", "?folderTreeSimpleName");
folderNameCol.setAttribute("sort", "?folderTreeSimpleNameSort");
}
folderUnreadCol.addEventListener("DOMAttrModified", OnFolderUnreadColAttrModified, false);
@ -1023,6 +998,12 @@ function EnsureAllAncestorsAreExpanded(outliner, resource)
// get the parent of the desired folder, and then try to get
// the index of the parent in the outliner
var folder = resource.QueryInterface(Components.interfaces.nsIFolder);
// if this is a server, there are no ancestors, so stop.
var msgFolder = folder.QueryInterface(Components.interfaces.nsIMsgFolder);
if (msgFolder.isServer)
return;
var parentFolderResource = RDF.GetResource(folder.parent.URI);
var folderIndex = GetFolderIndex(outliner, parentFolderResource);

View File

@ -3,15 +3,15 @@
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
*
* The Original Code is Mozilla Communicator client code, released
* March 31, 1998.
*
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998-1999 Netscape Communications Corporation. All

View File

@ -79,7 +79,6 @@ nsIRDFResource* nsMsgAccountManagerDataSource::kNC_FolderTreeName=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_FolderTreeSimpleName=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_NameSort=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_FolderTreeNameSort=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_FolderTreeSimpleNameSort=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_PageTag=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_IsDefaultServer=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_SupportsFilters=nsnull;
@ -140,7 +139,6 @@ nsMsgAccountManagerDataSource::nsMsgAccountManagerDataSource()
getRDFService()->GetResource(NC_RDF_FOLDERTREESIMPLENAME, &kNC_FolderTreeSimpleName);
getRDFService()->GetResource(NC_RDF_NAME_SORT, &kNC_NameSort);
getRDFService()->GetResource(NC_RDF_FOLDERTREENAME_SORT, &kNC_FolderTreeNameSort);
getRDFService()->GetResource(NC_RDF_FOLDERTREESIMPLENAME_SORT, &kNC_FolderTreeSimpleNameSort);
getRDFService()->GetResource(NC_RDF_PAGETAG, &kNC_PageTag);
getRDFService()->GetResource(NC_RDF_ISDEFAULTSERVER, &kNC_IsDefaultServer);
getRDFService()->GetResource(NC_RDF_SUPPORTSFILTERS, &kNC_SupportsFilters);
@ -184,7 +182,6 @@ nsMsgAccountManagerDataSource::~nsMsgAccountManagerDataSource()
NS_IF_RELEASE(kNC_FolderTreeSimpleName);
NS_IF_RELEASE(kNC_NameSort);
NS_IF_RELEASE(kNC_FolderTreeNameSort);
NS_IF_RELEASE(kNC_FolderTreeSimpleNameSort);
NS_IF_RELEASE(kNC_PageTag);
NS_IF_RELEASE(kNC_IsDefaultServer);
NS_IF_RELEASE(kNC_SupportsFilters);
@ -349,8 +346,7 @@ nsMsgAccountManagerDataSource::GetTarget(nsIRDFResource *source,
// handle sorting of servers
else if ((property == kNC_NameSort) ||
(property == kNC_FolderTreeNameSort) ||
(property == kNC_FolderTreeSimpleNameSort)) {
(property == kNC_FolderTreeNameSort)) {
// make sure we're handling a root folder that is a server
nsCOMPtr<nsIMsgIncomingServer> server;
@ -654,7 +650,6 @@ nsMsgAccountManagerDataSource::getAccountArcs(nsISupportsArray **aResult)
mAccountArcsOut->AppendElement(kNC_FolderTreeSimpleName);
mAccountArcsOut->AppendElement(kNC_NameSort);
mAccountArcsOut->AppendElement(kNC_FolderTreeNameSort);
mAccountArcsOut->AppendElement(kNC_FolderTreeSimpleNameSort);
mAccountArcsOut->AppendElement(kNC_PageTag);
}
@ -681,7 +676,6 @@ nsMsgAccountManagerDataSource::getAccountRootArcs(nsISupportsArray **aResult)
mAccountRootArcsOut->AppendElement(kNC_FolderTreeSimpleName);
mAccountRootArcsOut->AppendElement(kNC_NameSort);
mAccountRootArcsOut->AppendElement(kNC_FolderTreeNameSort);
mAccountRootArcsOut->AppendElement(kNC_FolderTreeSimpleNameSort);
mAccountRootArcsOut->AppendElement(kNC_PageTag);
}

View File

@ -109,7 +109,6 @@ protected:
static nsIRDFResource* kNC_FolderTreeSimpleName;
static nsIRDFResource* kNC_NameSort;
static nsIRDFResource* kNC_FolderTreeNameSort;
static nsIRDFResource* kNC_FolderTreeSimpleNameSort;
static nsIRDFResource* kNC_PageTag;
static nsIRDFResource* kNC_IsDefaultServer;
static nsIRDFResource* kNC_SupportsFilters;

View File

@ -59,7 +59,6 @@ nsIRDFResource* nsMsgFolderDataSource::kNC_FolderTreeName= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_FolderTreeSimpleName= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_NameSort= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_FolderTreeNameSort= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_FolderTreeSimpleNameSort= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_SpecialFolder= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_ServerType = nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_CanCreateFoldersOnServer = nsnull;
@ -122,7 +121,6 @@ nsMsgFolderDataSource::nsMsgFolderDataSource()
rdf->GetResource(NC_RDF_FOLDERTREESIMPLENAME, &kNC_FolderTreeSimpleName);
rdf->GetResource(NC_RDF_NAME_SORT, &kNC_NameSort);
rdf->GetResource(NC_RDF_FOLDERTREENAME_SORT, &kNC_FolderTreeNameSort);
rdf->GetResource(NC_RDF_FOLDERTREESIMPLENAME_SORT, &kNC_FolderTreeSimpleNameSort);
rdf->GetResource(NC_RDF_SPECIALFOLDER, &kNC_SpecialFolder);
rdf->GetResource(NC_RDF_SERVERTYPE, &kNC_ServerType);
rdf->GetResource(NC_RDF_CANCREATEFOLDERSONSERVER, &kNC_CanCreateFoldersOnServer);
@ -189,7 +187,6 @@ nsMsgFolderDataSource::~nsMsgFolderDataSource (void)
NS_RELEASE2(kNC_FolderTreeSimpleName, refcnt);
NS_RELEASE2(kNC_NameSort, refcnt);
NS_RELEASE2(kNC_FolderTreeNameSort, refcnt);
NS_RELEASE2(kNC_FolderTreeSimpleNameSort, refcnt);
NS_RELEASE2(kNC_SpecialFolder, refcnt);
NS_RELEASE2(kNC_ServerType, refcnt);
NS_RELEASE2(kNC_CanCreateFoldersOnServer, refcnt);
@ -965,17 +962,15 @@ nsresult nsMsgFolderDataSource::createFolderNode(nsIMsgFolder* folder,
if (kNC_NameSort == property)
rv = createFolderNameNode(folder, target, PR_TRUE);
else if(kNC_FolderTreeNameSort == property)
rv = createFolderTreeNameNode(folder, target, PR_TRUE);
else if(kNC_FolderTreeSimpleNameSort == property)
rv = createFolderTreeSimpleNameNode(folder, target, PR_TRUE);
rv = createFolderNameNode(folder, target, PR_TRUE);
else if (kNC_Name == property)
rv = createFolderNameNode(folder, target, PR_FALSE);
else if(kNC_Open == property)
rv = createFolderOpenNode(folder, target);
else if (kNC_FolderTreeName == property)
rv = createFolderTreeNameNode(folder, target, PR_FALSE);
rv = createFolderTreeNameNode(folder, target);
else if (kNC_FolderTreeSimpleName == property)
rv = createFolderTreeSimpleNameNode(folder, target, PR_FALSE);
rv = createFolderTreeSimpleNameNode(folder, target);
else if ((kNC_SpecialFolder == property))
rv = createFolderSpecialNode(folder,target);
else if ((kNC_ServerType == property))
@ -1028,60 +1023,47 @@ nsresult nsMsgFolderDataSource::createFolderNode(nsIMsgFolder* folder,
}
nsresult nsMsgFolderDataSource::createFolderNameNode(nsIMsgFolder *folder,
nsIRDFNode **target, PRBool sort)
nsresult
nsMsgFolderDataSource::createFolderNameNode(nsIMsgFolder *folder,
nsIRDFNode **target, PRBool sort)
{
nsXPIDLString name;
nsresult rv = folder->GetName(getter_Copies(name));
if (NS_FAILED(rv)) return rv;
nsAutoString nameString(name);
if(sort)
{
CreateNameSortString(folder, nameString);
}
createNode(nameString, target, getRDFService());
if(sort)
CreateNameSortString(folder, nameString);
createNode(nameString, target, getRDFService());
return NS_OK;
}
nsresult nsMsgFolderDataSource::createFolderTreeNameNode(nsIMsgFolder *folder,
nsIRDFNode **target, PRBool sort)
{
nsXPIDLString name;
nsresult rv = folder->GetAbbreviatedName(getter_Copies(name));
if (NS_FAILED(rv)) return rv;
nsAutoString nameString(name);
if(sort)
{
CreateNameSortString(folder, nameString);
}
else
{
PRInt32 unreadMessages;
rv = folder->GetNumUnread(PR_FALSE, &unreadMessages);
if(NS_SUCCEEDED(rv))
{
CreateUnreadMessagesNameString(unreadMessages, nameString);
}
}
createNode(nameString, target, getRDFService());
return NS_OK;
}
nsresult nsMsgFolderDataSource::createFolderTreeSimpleNameNode(nsIMsgFolder * folder, nsIRDFNode **target, PRBool sort)
nsresult
nsMsgFolderDataSource::createFolderTreeNameNode(nsIMsgFolder *folder,
nsIRDFNode **target)
{
nsXPIDLString name;
nsresult rv = folder->GetAbbreviatedName(getter_Copies(name));
if (NS_FAILED(rv)) return rv;
nsAutoString nameString(name);
PRInt32 unreadMessages;
rv = folder->GetNumUnread(PR_FALSE, &unreadMessages);
if(NS_SUCCEEDED(rv))
CreateUnreadMessagesNameString(unreadMessages, nameString);
createNode(nameString, target, getRDFService());
return NS_OK;
}
nsresult nsMsgFolderDataSource::createFolderTreeSimpleNameNode(nsIMsgFolder * folder, nsIRDFNode **target)
{
nsXPIDLString name;
nsresult rv = folder->GetAbbreviatedName(getter_Copies(name));
if (NS_FAILED(rv)) return rv;
nsAutoString nameString(name);
if(sort)
{
CreateNameSortString(folder, nameString);
}
createNode(nameString, target, getRDFService());
return NS_OK;
}
@ -1089,13 +1071,14 @@ nsresult nsMsgFolderDataSource::createFolderTreeSimpleNameNode(nsIMsgFolder * fo
nsresult nsMsgFolderDataSource::CreateNameSortString(nsIMsgFolder *folder, nsAutoString &name)
{
PRInt32 order;
nsresult rv = GetFolderSortOrder(folder, &order);
if(NS_FAILED(rv))
return rv;
nsresult rv = folder->GetSortOrder(&order);
NS_ENSURE_SUCCESS(rv,rv);
nsAutoString orderString;
orderString.AppendInt(order);
// sort is insensitive to case
name.ToLowerCase();
name.Insert(orderString, 0);
return NS_OK;
@ -2037,33 +2020,3 @@ nsresult nsMsgFolderDataSource::DoFolderHasAssertion(nsIMsgFolder *folder,
}
nsresult nsMsgFolderDataSource::GetFolderSortOrder(nsIMsgFolder *folder, PRInt32* order)
{
nsresult rv;
PRUint32 flags;
rv = folder->GetFlags(&flags);
if(NS_FAILED(rv)) return rv;
if(flags & MSG_FOLDER_FLAG_INBOX)
*order = 0;
else if(flags & MSG_FOLDER_FLAG_QUEUE)
*order = 1;
else if(flags & MSG_FOLDER_FLAG_DRAFTS)
*order = 2;
else if(flags & MSG_FOLDER_FLAG_TEMPLATES)
*order = 3;
else if(flags & MSG_FOLDER_FLAG_SENTMAIL)
*order = 4;
else if(flags & MSG_FOLDER_FLAG_TRASH)
*order = 5;
else
*order = 6;
return NS_OK;
}

View File

@ -113,8 +113,8 @@ protected:
nsIRDFNode **target);
nsresult createFolderNameNode(nsIMsgFolder *folder, nsIRDFNode **target, PRBool sort);
nsresult createFolderOpenNode(nsIMsgFolder *folder,nsIRDFNode **target);
nsresult createFolderTreeNameNode(nsIMsgFolder *folder, nsIRDFNode **target, PRBool sort);
nsresult createFolderTreeSimpleNameNode(nsIMsgFolder *folder, nsIRDFNode **target, PRBool sort);
nsresult createFolderTreeNameNode(nsIMsgFolder *folder, nsIRDFNode **target);
nsresult createFolderTreeSimpleNameNode(nsIMsgFolder *folder, nsIRDFNode **target);
nsresult createFolderSpecialNode(nsIMsgFolder *folder, nsIRDFNode **target);
nsresult createFolderServerTypeNode(nsIMsgFolder *folder,
nsIRDFNode **target);
@ -177,8 +177,6 @@ protected:
nsresult CreateNameSortString(nsIMsgFolder *folder, nsAutoString &name);
nsresult CreateUnreadMessagesNameString(PRInt32 unreadMessages, nsAutoString &nameString);
nsresult GetFolderSortOrder(nsIMsgFolder *folder, PRInt32* order);
nsresult CreateArcsOutEnumerator();
nsresult OnItemAddedOrRemoved(nsISupports *parentItem, nsISupports *item,
@ -200,7 +198,6 @@ protected:
static nsIRDFResource* kNC_FolderTreeSimpleName;
static nsIRDFResource* kNC_NameSort;
static nsIRDFResource* kNC_FolderTreeNameSort;
static nsIRDFResource* kNC_FolderTreeSimpleNameSort;
static nsIRDFResource* kNC_Columns;
static nsIRDFResource* kNC_MSGFolderRoot;
static nsIRDFResource* kNC_SpecialFolder;

View File

@ -101,7 +101,6 @@ typedef struct _nsMsgRDFNotification {
#define NC_RDF_NAME_SORT NC_NAMESPACE_URI "Name?sort=true"
#define NC_RDF_FOLDERTREENAME_SORT NC_NAMESPACE_URI "FolderTreeName?sort=true"
#define NC_RDF_FOLDERTREESIMPLENAME_SORT NC_NAMESPACE_URI "FolderTreeSimpleName?sort=true"
//Folder Commands
#define NC_RDF_DELETE NC_NAMESPACE_URI "Delete"

View File

@ -2658,3 +2658,36 @@ NS_IMETHODIMP nsMsgFolder::NotifyCompactCompleted()
NS_ASSERTION(PR_FALSE, "should be overridden by child class");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP nsMsgFolder::SetSortOrder(PRInt32 order)
{
NS_ASSERTION(PR_FALSE, "not implemented");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP nsMsgFolder::GetSortOrder(PRInt32 *order)
{
NS_ENSURE_ARG_POINTER(order);
PRUint32 flags;
nsresult rv = GetFlags(&flags);
NS_ENSURE_SUCCESS(rv,rv);
if (flags & MSG_FOLDER_FLAG_INBOX)
*order = 0;
else if (flags & MSG_FOLDER_FLAG_QUEUE)
*order = 1;
else if (flags & MSG_FOLDER_FLAG_DRAFTS)
*order = 2;
else if (flags & MSG_FOLDER_FLAG_TEMPLATES)
*order = 3;
else if (flags & MSG_FOLDER_FLAG_SENTMAIL)
*order = 4;
else if (flags & MSG_FOLDER_FLAG_TRASH)
*order = 5;
else
*order = 6;
return NS_OK;
}

View File

@ -219,6 +219,8 @@ public:
NS_IMETHOD MatchName(nsString *name, PRBool *matches);
NS_IMETHOD GenerateMessageURI(nsMsgKey msgKey, char **aURI);
NS_IMETHOD GetSortOrder(PRInt32 *order);
NS_IMETHOD SetSortOrder(PRInt32 order);
protected:

View File

@ -254,6 +254,14 @@ nsMsgNewsFolder::AddNewsgroup(const char *name, const char *setStr, nsIMsgFolder
rv = newsFolder->SetCachedNewsrcLine(setStr);
if (NS_FAILED(rv)) return rv;
PRUint32 numExistingGroups;
rv = Count(&numExistingGroups);
NS_ENSURE_SUCCESS(rv,rv);
// add 1000 to prevent this problem: 1,10,11,2,3,4,5
rv = folder->SetSortOrder(numExistingGroups + 1000);
NS_ENSURE_SUCCESS(rv,rv);
//convert to an nsISupports before appending
nsCOMPtr<nsISupports> folderSupports(do_QueryInterface(folder));
if(folderSupports)
@ -1823,3 +1831,16 @@ NS_IMETHODIMP nsMsgNewsFolder::GetMessageIdForKey(nsMsgKey key, char **result)
return hdr->GetMessageId(result);
}
NS_IMETHODIMP nsMsgNewsFolder::SetSortOrder(PRInt32 order)
{
mSortOrder = order;
return NS_OK;
}
NS_IMETHODIMP nsMsgNewsFolder::GetSortOrder(PRInt32 *order)
{
NS_ENSURE_ARG_POINTER(order);
*order = mSortOrder;
return NS_OK;
}

View File

@ -97,6 +97,9 @@ public:
NS_IMETHOD DownloadMessagesForOffline(nsISupportsArray *messages, nsIMsgWindow *window);
NS_IMETHOD Compact(nsIUrlListener *aListener, nsIMsgWindow *aMsgWindow);
NS_IMETHOD DownloadAllForOffline(nsIUrlListener *listener, nsIMsgWindow *msgWindow);
NS_IMETHOD GetSortOrder(PRInt32 *order);
NS_IMETHOD SetSortOrder(PRInt32 order);
// for nsMsgLineBuffer
virtual PRInt32 HandleLine(char *line, PRUint32 line_size);
@ -138,6 +141,7 @@ protected:
// the name of the newsgroup.
char *mAsciiName;
PRInt32 mSortOrder;
private:
nsresult CreateNewsgroupUsernameUrlForSignon(const char *inUriStr, char **result);