diff --git a/mozilla/mailnews/base/src/nsMsgDBView.cpp b/mozilla/mailnews/base/src/nsMsgDBView.cpp index 197885eaf27..e78d736a9e7 100644 --- a/mozilla/mailnews/base/src/nsMsgDBView.cpp +++ b/mozilla/mailnews/base/src/nsMsgDBView.cpp @@ -1096,6 +1096,14 @@ NS_IMETHODIMP nsMsgDBView::Open(nsIMsgFolder *folder, nsMsgViewSortTypeValue sor NS_IMETHODIMP nsMsgDBView::Close() { + if (mOutliner) + mOutliner->RowCountChanged(0, -GetSize()); + // this is important, because the outliner will ask us for our + // row count, which get determine from the number of keys. + m_keys.RemoveAll(); + // be consistent + m_flags.RemoveAll(); + m_levels.RemoveAll(); if (m_db) { m_db->RemoveListener(this); @@ -2778,7 +2786,7 @@ nsMsgViewIndex nsMsgDBView::GetIndexForThread(nsIMsgDBHdr *hdr) // and put new header before found header, or at end. for (PRInt32 i = GetSize() - 1; i >= 0; i--) { - if (m_levels[i]) + if (m_levels[i] == 0) { if (insertKey < m_keys.GetAt(i)) prevInsertIndex = i; @@ -3043,7 +3051,7 @@ PRInt32 nsMsgDBView::FindLevelInThread(nsIMsgDBHdr *msgHdr, nsMsgViewIndex start return m_levels[parentIndex] + 1; else { -#ifdef DEBUG_bienvenu +#ifdef DEBUG_bienvenu1 NS_ASSERTION(PR_FALSE, "couldn't find parent of msg"); #endif return 1; // well, return level 1. diff --git a/mozilla/mailnews/base/src/nsMsgThreadedDBView.cpp b/mozilla/mailnews/base/src/nsMsgThreadedDBView.cpp index ef94c2db273..c1f1431b736 100644 --- a/mozilla/mailnews/base/src/nsMsgThreadedDBView.cpp +++ b/mozilla/mailnews/base/src/nsMsgThreadedDBView.cpp @@ -294,8 +294,8 @@ nsresult nsMsgThreadedDBView::ListThreadIds(nsMsgKey *startMsg, PRBool unreadOnl numListed++; } - else - NS_ASSERTION(NS_SUCCEEDED(rv) && msgHdr, "couldn't get header for some reason"); +// else +// NS_ASSERTION(NS_SUCCEEDED(rv) && msgHdr, "couldn't get header for some reason"); } else if (threadsRemoved < 10 && !(threadFlags & (MSG_FLAG_WATCHED | MSG_FLAG_IGNORED))) { @@ -438,8 +438,7 @@ nsresult nsMsgThreadedDBView::OnNewHeader(nsMsgKey newKey, nsMsgKey aParentKey, PRUint32 flags = m_flags[threadIndex]; // if we have a collapsed thread which just got a new // top of thread, change the keys array. - nsMsgViewIndex insertIndex = GetInsertIndex(msgHdr); - PRInt32 level = FindLevelInThread(msgHdr, insertIndex); + PRInt32 level = FindLevelInThread(msgHdr, threadIndex); if ((flags & MSG_FLAG_ELIDED) && (!(m_viewFlags & nsMsgViewFlagsType::kUnreadOnly) || !(msgFlags & MSG_FLAG_READ))) { @@ -463,6 +462,7 @@ nsresult nsMsgThreadedDBView::OnNewHeader(nsMsgKey newKey, nsMsgKey aParentKey, { // insert child into thread // levels of other hdrs may have changed! PRUint32 newFlags = msgFlags; + nsMsgViewIndex insertIndex = GetInsertInfoForNewHdr(msgHdr, threadIndex, level); // this header is the new king! try collapsing the existing thread, // removing it, installing this header as king, and expanding it. if (level == 0) @@ -497,6 +497,28 @@ nsresult nsMsgThreadedDBView::OnNewHeader(nsMsgKey newKey, nsMsgKey aParentKey, return rv; } +nsMsgViewIndex nsMsgThreadedDBView::GetInsertInfoForNewHdr(nsIMsgDBHdr *newHdr, nsMsgViewIndex threadIndex, PRInt32 targetLevel) +{ + nsMsgKey threadParent; + newHdr->GetThreadParent(&threadParent); + nsMsgViewIndex parentIndex = m_keys.FindIndex(threadParent, threadIndex); + PRInt32 viewSize = GetSize(); + nsMsgViewIndex insertIndex = parentIndex + 1; + if (parentIndex != nsMsgViewIndex_None) + { + PRInt32 parentLevel = m_levels[parentIndex]; + NS_ASSERTION(targetLevel == parentLevel + 1, "levels are screwed up"); + while ((PRInt32) insertIndex < viewSize) + { + // loop until we find a message at a level less than or equal to the parent level + if (m_levels[insertIndex] <= parentLevel) + break; + insertIndex++; + } + } + return insertIndex; +} + nsresult nsMsgThreadedDBView::AddMsgToThreadNotInView(nsIMsgThread *threadHdr, nsIMsgDBHdr *msgHdr, PRBool ensureListed) { nsresult rv = NS_OK; diff --git a/mozilla/mailnews/base/src/nsMsgThreadedDBView.h b/mozilla/mailnews/base/src/nsMsgThreadedDBView.h index bc7cb97dd39..011f9b3e18d 100644 --- a/mozilla/mailnews/base/src/nsMsgThreadedDBView.h +++ b/mozilla/mailnews/base/src/nsMsgThreadedDBView.h @@ -53,6 +53,7 @@ protected: virtual void OnHeaderAddedOrDeleted(); void ClearPrevIdArray(); virtual nsresult RemoveByIndex(nsMsgViewIndex index); + nsMsgViewIndex GetInsertInfoForNewHdr(nsIMsgDBHdr *newHdr, nsMsgViewIndex threadIndex, PRInt32 targetLevel); // these are used to save off the previous view so that bopping back and forth // between two views is quick (e.g., threaded and flat sorted by date).