fix crash when new headers arrive into threaded view r=hawarra, sr=sspitzer 75296

git-svn-id: svn://10.0.0.236/trunk@93230 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
bienvenu%netscape.com 2001-04-27 03:46:03 +00:00
parent 2d2cbc327c
commit 75484d71c2
3 changed files with 37 additions and 6 deletions

View File

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

View File

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

View File

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