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:
parent
2d2cbc327c
commit
75484d71c2
@ -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.
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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).
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user