Replace some more uses of nsUInt32Array with nsTArray b=258018 r+sr=bienvenu
git-svn-id: svn://10.0.0.236/trunk@245581 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -2035,7 +2035,7 @@ NS_IMETHODIMP nsMsgDBView::Close()
|
||||
// row count, which get determine from the number of keys.
|
||||
m_keys.RemoveAll();
|
||||
// be consistent
|
||||
m_flags.RemoveAll();
|
||||
m_flags.Clear();
|
||||
m_levels.Clear();
|
||||
|
||||
// clear these out since they no longer apply if we're switching a folder
|
||||
@@ -2280,7 +2280,7 @@ NS_IMETHODIMP nsMsgDBView::DoCommand(nsMsgViewCommandTypeValue command)
|
||||
nsMsgViewIndex numIndices = GetSize();
|
||||
for (nsMsgViewIndex curIndex = 0; curIndex < numIndices; curIndex++)
|
||||
{
|
||||
if (m_flags.GetAt(curIndex) & MSG_FLAG_MARKED)
|
||||
if (m_flags[curIndex] & MSG_FLAG_MARKED)
|
||||
mTreeSelection->ToggleSelect(curIndex);
|
||||
}
|
||||
mTreeSelection->SetSelectEventsSuppressed(PR_FALSE);
|
||||
@@ -2448,7 +2448,7 @@ nsMsgDBView::CopyMessages(nsIMsgWindow *window, nsMsgViewIndex *indices, PRInt32
|
||||
messageArray->AppendElement(msgHdr);
|
||||
// if we are deleting rows, save off the keys
|
||||
if (m_deletingRows)
|
||||
mIndicesToNoteChange.Add(indices[index]);
|
||||
mIndicesToNoteChange.AppendElement(indices[index]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2672,7 +2672,7 @@ nsresult nsMsgDBView::RemoveByIndex(nsMsgViewIndex index)
|
||||
if (!IsValidIndex(index))
|
||||
return NS_MSG_INVALID_DBVIEW_INDEX;
|
||||
m_keys.RemoveAt(index);
|
||||
m_flags.RemoveAt(index);
|
||||
m_flags.RemoveElementAt(index);
|
||||
m_levels.RemoveElementAt(index);
|
||||
|
||||
// the call to NoteChange() has to happen after we remove the key
|
||||
@@ -2708,7 +2708,7 @@ nsresult nsMsgDBView::DeleteMessages(nsIMsgWindow *window, nsMsgViewIndex *indic
|
||||
messageArray->AppendElement(msgHdr);
|
||||
// if we are deleting rows, save off the keys
|
||||
if (m_deletingRows)
|
||||
mIndicesToNoteChange.Add(indices[index]);
|
||||
mIndicesToNoteChange.AppendElement(indices[index]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3147,7 +3147,7 @@ nsMsgDBView::DetermineActionsForJunkMsgs(PRBool* movingJunkMessages, PRBool* mar
|
||||
// make a copy of each array and copy them over.
|
||||
nsresult nsMsgDBView::ReverseThreads()
|
||||
{
|
||||
nsUInt32Array newFlagArray;
|
||||
nsTArray<PRUint32> newFlagArray;
|
||||
nsMsgKeyArray newKeyArray;
|
||||
nsTArray<PRUint8> newLevelArray;
|
||||
|
||||
@@ -3155,7 +3155,7 @@ nsresult nsMsgDBView::ReverseThreads()
|
||||
PRInt32 viewSize = GetSize();
|
||||
|
||||
newKeyArray.SetSize(m_keys.GetSize());
|
||||
newFlagArray.SetSize(m_flags.GetSize());
|
||||
newFlagArray.SetLength(m_flags.Length());
|
||||
newLevelArray.SetLength(m_levels.Length());
|
||||
|
||||
for (sourceIndex = 0, destIndex = viewSize - 1; sourceIndex < viewSize;)
|
||||
@@ -3164,7 +3164,7 @@ nsresult nsMsgDBView::ReverseThreads()
|
||||
PRBool inExpandedThread = PR_FALSE;
|
||||
for (endThread = sourceIndex; endThread < viewSize; endThread++)
|
||||
{
|
||||
PRUint32 flags = m_flags.GetAt(endThread);
|
||||
PRUint32 flags = m_flags[endThread];
|
||||
if (!inExpandedThread && (flags & (MSG_VIEW_FLAG_ISTHREAD|MSG_VIEW_FLAG_HASCHILDREN)) && !(flags & MSG_FLAG_ELIDED))
|
||||
inExpandedThread = PR_TRUE;
|
||||
else if (flags & MSG_VIEW_FLAG_ISTHREAD)
|
||||
@@ -3181,7 +3181,7 @@ nsresult nsMsgDBView::ReverseThreads()
|
||||
while (endThread >= sourceIndex)
|
||||
{
|
||||
newKeyArray.SetAt(destIndex, m_keys.GetAt(endThread));
|
||||
newFlagArray.SetAt(destIndex, m_flags.GetAt(endThread));
|
||||
newFlagArray[destIndex] = m_flags[endThread];
|
||||
newLevelArray[destIndex] = m_levels[endThread];
|
||||
endThread--;
|
||||
destIndex--;
|
||||
@@ -3192,7 +3192,7 @@ nsresult nsMsgDBView::ReverseThreads()
|
||||
// just assign the new data ptrs to the old arrays and "forget" the new
|
||||
// arrays' data ptrs, so they won't be freed when the arrays are deleted.
|
||||
m_keys.CopyArray(newKeyArray);
|
||||
m_flags.CopyArray(newFlagArray);
|
||||
m_flags.SwapElements(newFlagArray);
|
||||
m_levels.SwapElements(newLevelArray);
|
||||
|
||||
return NS_OK;
|
||||
@@ -3210,9 +3210,9 @@ nsresult nsMsgDBView::ReverseSort()
|
||||
{
|
||||
// swap flags
|
||||
PRUint32 end = num - i - 1;
|
||||
PRUint32 tempFlags = m_flags.GetAt(i);
|
||||
m_flags.SetAt(i, m_flags.GetAt(end));
|
||||
m_flags.SetAt(end, tempFlags);
|
||||
PRUint32 tempFlags = m_flags[i];
|
||||
m_flags[i] = m_flags[end];
|
||||
m_flags[end] = tempFlags;
|
||||
|
||||
// swap keys
|
||||
nsMsgKey tempKey = m_keys.GetAt(i);
|
||||
@@ -3973,7 +3973,7 @@ NS_IMETHODIMP nsMsgDBView::Sort(nsMsgViewSortTypeValue sortType, nsMsgViewSortOr
|
||||
IdKey *info = (IdKey*)pTemp;
|
||||
pPtrBase[numSoFar] = info;
|
||||
info->id = thisKey;
|
||||
info->bits = m_flags.GetAt(numSoFar);
|
||||
info->bits = m_flags[numSoFar];
|
||||
info->dword = longValue;
|
||||
//info->pad = 0;
|
||||
|
||||
@@ -4028,7 +4028,7 @@ NS_IMETHODIMP nsMsgDBView::Sort(nsMsgViewSortTypeValue sortType, nsMsgViewSortOr
|
||||
for (PRUint32 i = 0; i < numSoFar; i++)
|
||||
{
|
||||
m_keys.SetAt(i, pPtrBase[i]->id);
|
||||
m_flags.SetAt(i, pPtrBase[i]->bits);
|
||||
m_flags[i] = pPtrBase[i]->bits;
|
||||
|
||||
if (folders)
|
||||
folders->SetElementAt(i, pPtrBase[i]->folder);
|
||||
@@ -4489,8 +4489,8 @@ nsresult nsMsgDBView::CollapseByIndex(nsMsgViewIndex index, PRUint32 *pNumCollap
|
||||
for (int i = 1; i <= threadCount && index + 1 < m_keys.GetSize(); i++)
|
||||
{
|
||||
m_keys.RemoveAt(index + 1);
|
||||
m_flags.RemoveAt(index + 1);
|
||||
}
|
||||
m_flags.RemoveElementsAt(index + 1, threadCount);
|
||||
m_levels.RemoveElementsAt(index + 1, threadCount);
|
||||
if (pNumCollapsed != nsnull)
|
||||
*pNumCollapsed = numRemoved;
|
||||
@@ -4701,7 +4701,7 @@ nsresult nsMsgDBView::AddHdr(nsIMsgDBHdr *msgHdr)
|
||||
{
|
||||
PRUint32 flags = 0;
|
||||
#ifdef DEBUG_bienvenu
|
||||
NS_ASSERTION((int) m_keys.GetSize() == m_flags.GetSize() && (int) m_keys.GetSize() == m_levels.Length(), "view arrays out of sync!");
|
||||
NS_ASSERTION(m_keys.GetSize() == m_flags.Length() && m_keys.GetSize() == m_levels.Length(), "view arrays out of sync!");
|
||||
#endif
|
||||
|
||||
if (!GetShowingIgnored())
|
||||
@@ -4735,7 +4735,7 @@ nsresult nsMsgDBView::AddHdr(nsIMsgDBHdr *msgHdr)
|
||||
if (m_sortOrder == nsMsgViewSortOrder::ascending)
|
||||
{
|
||||
m_keys.Add(msgKey);
|
||||
m_flags.Add(flags);
|
||||
m_flags.AppendElement(flags);
|
||||
m_levels.AppendElement(levelToAdd);
|
||||
|
||||
// the call to NoteChange() has to happen after we add the key
|
||||
@@ -4745,7 +4745,7 @@ nsresult nsMsgDBView::AddHdr(nsIMsgDBHdr *msgHdr)
|
||||
else
|
||||
{
|
||||
m_keys.InsertAt(0, msgKey);
|
||||
m_flags.InsertAt(0, flags);
|
||||
m_flags.InsertElementAt(0, flags);
|
||||
m_levels.InsertElementAt(0, levelToAdd);
|
||||
|
||||
// the call to NoteChange() has to happen after we insert the key
|
||||
@@ -4757,7 +4757,7 @@ nsresult nsMsgDBView::AddHdr(nsIMsgDBHdr *msgHdr)
|
||||
else
|
||||
{
|
||||
m_keys.InsertAt(insertIndex, msgKey);
|
||||
m_flags.InsertAt(insertIndex, flags);
|
||||
m_flags.InsertElementAt(insertIndex, flags);
|
||||
PRInt32 level = 0;
|
||||
m_levels.InsertElementAt(insertIndex, level);
|
||||
|
||||
@@ -4829,7 +4829,7 @@ nsresult nsMsgDBView::ListIdsInThreadOrder(nsIMsgThread *threadHdr, nsMsgKey par
|
||||
AdjustReadFlag(msgHdr, &msgFlags);
|
||||
m_keys.SetAt(*viewIndex, msgKey);
|
||||
// ### TODO - how about hasChildren flag?
|
||||
m_flags.SetAt(*viewIndex, msgFlags & ~MSG_VIEW_FLAGS);
|
||||
m_flags[*viewIndex] = msgFlags & ~MSG_VIEW_FLAGS;
|
||||
// ### TODO this is going to be tricky - might use enumerators
|
||||
m_levels[*viewIndex] = level;
|
||||
// turn off thread or elided bit if they got turned on (maybe from new only view?)
|
||||
@@ -4855,7 +4855,7 @@ nsresult nsMsgDBView::ListIdsInThread(nsIMsgThread *threadHdr, nsMsgViewIndex st
|
||||
threadHdr->GetNumChildren(&numChildren);
|
||||
numChildren--; // account for the existing thread root
|
||||
m_keys.InsertAt(viewIndex, 0, numChildren);
|
||||
m_flags.InsertAt(viewIndex, 0, numChildren);
|
||||
m_flags.InsertElementsAt(viewIndex, numChildren, 0);
|
||||
m_levels.InsertElementsAt(viewIndex, numChildren, 1); // default unthreaded level
|
||||
|
||||
// ### need to rework this when we implemented threading in group views.
|
||||
@@ -4879,7 +4879,7 @@ nsresult nsMsgDBView::ListIdsInThread(nsIMsgThread *threadHdr, nsMsgViewIndex st
|
||||
msgHdr->GetFlags(&msgFlags);
|
||||
AdjustReadFlag(msgHdr, &msgFlags);
|
||||
m_keys.SetAt(viewIndex, msgKey);
|
||||
m_flags.SetAt(viewIndex, msgFlags & ~MSG_VIEW_FLAGS);
|
||||
m_flags[viewIndex] = msgFlags & ~MSG_VIEW_FLAGS;
|
||||
// here, we're either flat, or we're grouped - in either case, level is 1
|
||||
// turn off thread or elided bit if they got turned on (maybe from new only view?)
|
||||
if (i > 0)
|
||||
@@ -4893,7 +4893,7 @@ nsresult nsMsgDBView::ListIdsInThread(nsIMsgThread *threadHdr, nsMsgViewIndex st
|
||||
{
|
||||
NS_NOTREACHED("thread corrupt in db");
|
||||
m_keys.RemoveAt(viewIndex, numChildren - *pNumListed);
|
||||
m_flags.RemoveAt(viewIndex, numChildren - *pNumListed);
|
||||
m_flags.RemoveElementsAt(viewIndex, numChildren - *pNumListed);
|
||||
m_levels.RemoveElementsAt(viewIndex, numChildren - *pNumListed);
|
||||
// if we've listed fewer messages than are in the thread, then the db
|
||||
// is corrupt, and we should invalidate it.
|
||||
@@ -4978,7 +4978,7 @@ nsresult nsMsgDBView::ListUnreadIdsInThread(nsIMsgThread *threadHdr, nsMsgViewIn
|
||||
if (msgKey != topLevelMsgKey)
|
||||
{
|
||||
m_keys.InsertAt(viewIndex, msgKey);
|
||||
m_flags.InsertAt(viewIndex, msgFlags);
|
||||
m_flags.InsertElementAt(viewIndex, msgFlags);
|
||||
levelToAdd = FindLevelInThread(msgHdr, startOfThreadViewIndex, viewIndex);
|
||||
m_levels.InsertElementAt(viewIndex, levelToAdd);
|
||||
viewIndex++;
|
||||
@@ -5064,7 +5064,7 @@ NS_IMETHODIMP nsMsgDBView::OnAnnouncerGoingAway(nsIDBChangeAnnouncer *instigator
|
||||
// row count, which get determine from the number of keys.
|
||||
m_keys.RemoveAll();
|
||||
// be consistent
|
||||
m_flags.RemoveAll();
|
||||
m_flags.Clear();
|
||||
m_levels.Clear();
|
||||
|
||||
// tell the tree all the rows have gone away
|
||||
@@ -5235,7 +5235,7 @@ nsresult nsMsgDBView::MarkThreadRead(nsIMsgThread *threadHdr, nsMsgViewIndex thr
|
||||
{
|
||||
PRBool threadElided = PR_TRUE;
|
||||
if (threadIndex != nsMsgViewIndex_None)
|
||||
threadElided = (m_flags.GetAt(threadIndex) & MSG_FLAG_ELIDED);
|
||||
threadElided = (m_flags[threadIndex] & MSG_FLAG_ELIDED);
|
||||
|
||||
PRUint32 numChildren;
|
||||
threadHdr->GetNumChildren(&numChildren);
|
||||
@@ -5369,7 +5369,7 @@ nsresult nsMsgDBView::NavigateFromPos(nsMsgNavigationTypeValue motion, nsMsgView
|
||||
startIndex = nsMsgViewIndex_None; // note fall thru - is this motion ever used?
|
||||
case nsMsgNavigationType::nextUnreadMessage:
|
||||
for (curIndex = (startIndex == nsMsgViewIndex_None) ? 0 : startIndex; curIndex <= lastIndex && lastIndex != nsMsgViewIndex_None; curIndex++) {
|
||||
PRUint32 flags = m_flags.GetAt(curIndex);
|
||||
PRUint32 flags = m_flags[curIndex];
|
||||
|
||||
// don't return start index since navigate should move
|
||||
if (!(flags & (MSG_FLAG_READ | MSG_VIEW_FLAG_DUMMY)) && (curIndex != startIndex))
|
||||
@@ -5638,7 +5638,7 @@ nsresult nsMsgDBView::FindNextFlagged(nsMsgViewIndex startIndex, nsMsgViewIndex
|
||||
{
|
||||
for (curIndex = startIndex; curIndex <= lastIndex; curIndex++)
|
||||
{
|
||||
PRUint32 flags = m_flags.GetAt(curIndex);
|
||||
PRUint32 flags = m_flags[curIndex];
|
||||
if (flags & MSG_FLAG_MARKED)
|
||||
{
|
||||
*pResultIndex = curIndex;
|
||||
@@ -5678,7 +5678,7 @@ nsresult nsMsgDBView::FindPrevUnread(nsMsgKey startKey, nsMsgKey *pResultKey,
|
||||
|
||||
for (; (int) curIndex >= 0 && (*pResultKey == nsMsgKey_None); curIndex--)
|
||||
{
|
||||
PRUint32 flags = m_flags.GetAt(curIndex);
|
||||
PRUint32 flags = m_flags[curIndex];
|
||||
|
||||
if (curIndex != startIndex && flags & MSG_VIEW_FLAG_ISTHREAD && flags & MSG_FLAG_ELIDED)
|
||||
{
|
||||
@@ -5720,7 +5720,7 @@ nsresult nsMsgDBView::FindPrevFlagged(nsMsgViewIndex startIndex, nsMsgViewIndex
|
||||
if (curIndex != 0)
|
||||
curIndex--;
|
||||
|
||||
PRUint32 flags = m_flags.GetAt(curIndex);
|
||||
PRUint32 flags = m_flags[curIndex];
|
||||
if (flags & MSG_FLAG_MARKED)
|
||||
{
|
||||
*pResultIndex = curIndex;
|
||||
@@ -6040,13 +6040,13 @@ nsMsgDBView::OnDeleteCompleted(PRBool aSucceeded)
|
||||
{
|
||||
if (aSucceeded)
|
||||
{
|
||||
PRUint32 numIndices = mIndicesToNoteChange.GetSize();
|
||||
PRUint32 numIndices = mIndicesToNoteChange.Length();
|
||||
if (numIndices)
|
||||
{
|
||||
if (mTree)
|
||||
{
|
||||
if (numIndices > 1)
|
||||
mIndicesToNoteChange.QuickSort(CompareViewIndices);
|
||||
mIndicesToNoteChange.Sort();
|
||||
|
||||
// the call to NoteChange() has to happen after we are done removing the keys
|
||||
// as NoteChange() will call RowCountChanged() which will call our GetRowCount()
|
||||
@@ -6057,7 +6057,7 @@ nsMsgDBView::OnDeleteCompleted(PRBool aSucceeded)
|
||||
if (numIndices > 1)
|
||||
mTree->EndUpdateBatch();
|
||||
}
|
||||
mIndicesToNoteChange.RemoveAll();
|
||||
mIndicesToNoteChange.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6081,7 +6081,7 @@ PRBool nsMsgDBView::OfflineMsgSelected(nsMsgViewIndex * indices, PRInt32 numIndi
|
||||
|
||||
for (nsMsgViewIndex index = 0; index < (nsMsgViewIndex) numIndices; index++)
|
||||
{
|
||||
PRUint32 flags = m_flags.GetAt(indices[index]);
|
||||
PRUint32 flags = m_flags[indices[index]];
|
||||
if ((flags & MSG_FLAG_OFFLINE))
|
||||
return PR_TRUE;
|
||||
}
|
||||
@@ -6092,7 +6092,7 @@ PRBool nsMsgDBView::NonDummyMsgSelected(nsMsgViewIndex * indices, PRInt32 numInd
|
||||
{
|
||||
for (nsMsgViewIndex index = 0; index < (nsMsgViewIndex) numIndices; index++)
|
||||
{
|
||||
PRUint32 flags = m_flags.GetAt(indices[index]);
|
||||
PRUint32 flags = m_flags[indices[index]];
|
||||
if (!(flags & MSG_VIEW_FLAG_DUMMY))
|
||||
return PR_TRUE;
|
||||
}
|
||||
@@ -6319,7 +6319,7 @@ nsresult nsMsgDBView::CopyDBView(nsMsgDBView *aNewMsgDBView, nsIMessenger *aMess
|
||||
aNewMsgDBView->mShowSizeInLines = mShowSizeInLines;
|
||||
aNewMsgDBView->mHeaderParser = mHeaderParser;
|
||||
aNewMsgDBView->mDeleteModel = mDeleteModel;
|
||||
aNewMsgDBView->m_flags.CopyArray(m_flags);
|
||||
aNewMsgDBView->m_flags = m_flags;
|
||||
aNewMsgDBView->m_levels = m_levels;
|
||||
aNewMsgDBView->m_keys.CopyArray(m_keys);
|
||||
|
||||
|
||||
@@ -349,7 +349,7 @@ protected:
|
||||
void FreeAll(nsVoidArray *ptrs);
|
||||
void ClearHdrCache();
|
||||
nsMsgKeyArray m_keys;
|
||||
nsUInt32Array m_flags;
|
||||
nsTArray<PRUint32> m_flags;
|
||||
nsTArray<PRUint8> m_levels;
|
||||
nsMsgImapDeleteModel mDeleteModel;
|
||||
|
||||
@@ -411,7 +411,7 @@ protected:
|
||||
nsMsgViewIndex *mJunkIndices;
|
||||
PRUint32 mNumJunkIndices;
|
||||
|
||||
nsUInt32Array mIndicesToNoteChange;
|
||||
nsTArray<PRUint32> mIndicesToNoteChange;
|
||||
|
||||
// the saved search views keep track of the XX most recently deleted msg ids, so that if the
|
||||
// delete is undone, we can add the msg back to the search results, even if it no longer
|
||||
|
||||
@@ -326,7 +326,7 @@ nsMsgGroupThread *nsMsgGroupView::AddHdrToThread(nsIMsgDBHdr *msgHdr, PRBool *pN
|
||||
if (insertIndex == nsMsgViewIndex_None)
|
||||
insertIndex = m_keys.GetSize();
|
||||
m_keys.InsertAt(insertIndex, msgKey);
|
||||
m_flags.InsertAt(insertIndex, msgFlags | MSG_VIEW_FLAG_ISTHREAD | MSG_FLAG_ELIDED);
|
||||
m_flags.InsertElementAt(insertIndex, msgFlags | MSG_VIEW_FLAG_ISTHREAD | MSG_FLAG_ELIDED);
|
||||
m_levels.InsertElementAt(insertIndex, 0);
|
||||
// if grouped by date, insert dummy header for "age"
|
||||
if (GroupViewUsesDummyRow())
|
||||
@@ -434,7 +434,7 @@ nsresult nsMsgGroupView::HandleDayChange()
|
||||
// row count, which get determine from the number of keys.
|
||||
m_keys.RemoveAll();
|
||||
// be consistent
|
||||
m_flags.RemoveAll();
|
||||
m_flags.Clear();
|
||||
m_levels.Clear();
|
||||
|
||||
// this needs to happen after we remove all the keys, since RowCountChanged() will call our GetRowCount()
|
||||
@@ -514,7 +514,7 @@ nsresult nsMsgGroupView::OnNewHeader(nsIMsgDBHdr *newHdr, nsMsgKey aParentKey, P
|
||||
}
|
||||
|
||||
m_keys.InsertAt(threadIndex + msgIndexInThread, msgKey);
|
||||
m_flags.InsertAt(threadIndex + msgIndexInThread, msgFlags);
|
||||
m_flags.InsertElementAt(threadIndex + msgIndexInThread, msgFlags);
|
||||
if (msgIndexInThread > 0)
|
||||
{
|
||||
m_levels.InsertElementAt(threadIndex + msgIndexInThread, 1);
|
||||
@@ -587,7 +587,7 @@ NS_IMETHODIMP nsMsgGroupView::OnHdrDeleted(nsIMsgDBHdr *aHdrDeleted, nsMsgKey aP
|
||||
{
|
||||
nsMsgDBView::RemoveByIndex(viewIndexOfThread - 1);
|
||||
if (m_deletingRows)
|
||||
mIndicesToNoteChange.Add(viewIndexOfThread - 1);
|
||||
mIndicesToNoteChange.AppendElement(viewIndexOfThread - 1);
|
||||
}
|
||||
}
|
||||
else if (rootDeleted && viewIndexOfThread > 0)
|
||||
|
||||
@@ -307,7 +307,7 @@ nsMsgQuickSearchDBView::OnNewSearch()
|
||||
|
||||
m_keys.RemoveAll();
|
||||
m_levels.Clear();
|
||||
m_flags.RemoveAll();
|
||||
m_flags.Clear();
|
||||
m_hdrHits.Clear();
|
||||
// this needs to happen after we remove all the keys, since RowCountChanged() will call our GetRowCount()
|
||||
if (mTree)
|
||||
@@ -454,7 +454,7 @@ nsresult nsMsgQuickSearchDBView::SortThreads(nsMsgViewSortTypeValue sortType, ns
|
||||
}
|
||||
m_keys.RemoveAll();
|
||||
m_levels.Clear();
|
||||
m_flags.RemoveAll();
|
||||
m_flags.Clear();
|
||||
// now we've build up the list of thread ids - need to build the view
|
||||
// from that. So for each thread id, we need to list the messages in the thread.
|
||||
PRUint32 numThreads = threadRootIds.GetSize();
|
||||
@@ -476,7 +476,7 @@ nsresult nsMsgQuickSearchDBView::SortThreads(nsMsgViewSortTypeValue sortType, ns
|
||||
displayRootHdr->GetFlags(&rootFlags);
|
||||
rootFlags |= MSG_VIEW_FLAG_ISTHREAD;
|
||||
m_keys.Add(rootKey);
|
||||
m_flags.Add(rootFlags);
|
||||
m_flags.AppendElement(rootFlags);
|
||||
m_levels.AppendElement(0);
|
||||
|
||||
nsMsgViewIndex startOfThreadViewIndex = m_keys.GetSize() - 1;
|
||||
@@ -519,11 +519,11 @@ nsresult nsMsgQuickSearchDBView::ListIdsInThread(nsIMsgThread *threadHdr, nsMsg
|
||||
msgHdr->GetFlags(&childFlags);
|
||||
PRUint8 levelToAdd;
|
||||
m_keys.InsertAt(viewIndex, msgKey);
|
||||
m_flags.InsertAt(viewIndex, childFlags);
|
||||
m_flags.InsertElementAt(viewIndex, childFlags);
|
||||
if (! (rootFlags & MSG_VIEW_FLAG_HASCHILDREN))
|
||||
{
|
||||
rootFlags |= MSG_VIEW_FLAG_HASCHILDREN;
|
||||
m_flags.SetAt(startOfThreadViewIndex, rootFlags);
|
||||
m_flags[startOfThreadViewIndex] = rootFlags;
|
||||
}
|
||||
levelToAdd = FindLevelInThread(msgHdr, startOfThreadViewIndex, viewIndex);
|
||||
m_levels.InsertElementAt(viewIndex, levelToAdd);
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
#include "nsMsgUtils.h"
|
||||
#include "nsITreeColumns.h"
|
||||
#include "nsIMsgMessageService.h"
|
||||
#include "nsAutoPtr.h"
|
||||
|
||||
nsMsgSearchDBView::nsMsgSearchDBView()
|
||||
{
|
||||
@@ -110,8 +111,6 @@ nsMsgSearchDBView::CopyDBView(nsMsgDBView *aNewMsgDBView, nsIMessenger *aMesseng
|
||||
m_dbToUseList[i]->AddListener(newMsgDBView);
|
||||
}
|
||||
|
||||
// nsUInt32Array* mTestIndices;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@@ -193,7 +192,7 @@ nsresult nsMsgSearchDBView::AddHdrFromFolder(nsIMsgDBHdr *msgHdr, nsISupports *f
|
||||
msgHdr->GetFlags(&msgFlags);
|
||||
m_keys.Add(msgKey);
|
||||
m_levels.AppendElement(0);
|
||||
m_flags.Add(msgFlags);
|
||||
m_flags.AppendElement(msgFlags);
|
||||
|
||||
// this needs to be called after we add the key, since RowCountChanged() will call our GetRowCount()
|
||||
if (mTree)
|
||||
@@ -253,7 +252,7 @@ nsMsgSearchDBView::OnNewSearch()
|
||||
m_folders->Clear();
|
||||
m_keys.RemoveAll();
|
||||
m_levels.Clear();
|
||||
m_flags.RemoveAll();
|
||||
m_flags.Clear();
|
||||
|
||||
// needs to happen after we remove the keys, since RowCountChanged() will call our GetRowCount()
|
||||
if (mTree)
|
||||
@@ -317,13 +316,13 @@ NS_IMETHODIMP nsMsgSearchDBView::DoCommand(nsMsgViewCommandTypeValue command)
|
||||
// ApplyCommandToIndices with the command and the indices in the
|
||||
// selection that are from that folder.
|
||||
|
||||
nsUInt32Array *indexArrays;
|
||||
nsAutoArrayPtr<nsTArray<PRUint32> > indexArrays;
|
||||
PRInt32 numArrays;
|
||||
rv = PartitionSelectionByFolder(indices, numIndices, &indexArrays, &numArrays);
|
||||
rv = PartitionSelectionByFolder(indices, numIndices, getter_Transfers(indexArrays), &numArrays);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
for (PRInt32 folderIndex = 0; folderIndex < numArrays; folderIndex++)
|
||||
{
|
||||
rv = ApplyCommandToIndices(command, indexArrays[folderIndex].GetData(), indexArrays[folderIndex].GetSize());
|
||||
rv = ApplyCommandToIndices(command, indexArrays[folderIndex].Elements(), indexArrays[folderIndex].Length());
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
@@ -378,38 +377,45 @@ nsMsgSearchDBView::CopyMessages(nsIMsgWindow *window, nsMsgViewIndex *indices, P
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsMsgSearchDBView::PartitionSelectionByFolder(nsMsgViewIndex *indices, PRInt32 numIndices, nsUInt32Array **indexArrays, PRInt32 *numArrays)
|
||||
nsMsgSearchDBView::PartitionSelectionByFolder(nsMsgViewIndex *indices, PRInt32 numIndices, nsTArray<PRUint32> **indexArrays, PRInt32 *numArrays)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
nsCOMPtr <nsISupportsArray> uniqueFoldersSelected = do_CreateInstance(NS_SUPPORTSARRAY_CONTRACTID, &rv);
|
||||
nsMsgViewIndex i;
|
||||
PRInt32 folderIndex;
|
||||
nsCOMArray<nsISupports> uniqueFoldersSelected;
|
||||
nsTArray<PRUint32> numIndicesSelected;
|
||||
mCurIndex = 0;
|
||||
|
||||
//Build unique folder list based on headers selected by the user
|
||||
for (nsMsgViewIndex i = 0; i < (nsMsgViewIndex) numIndices; i++)
|
||||
for (i = 0; i < (nsMsgViewIndex) numIndices; i++)
|
||||
{
|
||||
nsCOMPtr <nsISupports> curSupports = getter_AddRefs(m_folders->ElementAt(indices[i]));
|
||||
if ( uniqueFoldersSelected->IndexOf(curSupports) < 0)
|
||||
uniqueFoldersSelected->AppendElement(curSupports);
|
||||
nsCOMPtr <nsISupports> curSupports = dont_AddRef(m_folders->ElementAt(indices[i]));
|
||||
folderIndex = uniqueFoldersSelected.IndexOf(curSupports);
|
||||
if (folderIndex < 0)
|
||||
{
|
||||
uniqueFoldersSelected.AppendObject(curSupports);
|
||||
numIndicesSelected.AppendElement(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
numIndicesSelected[folderIndex]++;
|
||||
}
|
||||
}
|
||||
|
||||
PRUint32 numFolders =0;
|
||||
rv = uniqueFoldersSelected->Count(&numFolders); //group the headers selected by each folder
|
||||
*indexArrays = new nsUInt32Array[numFolders];
|
||||
PRInt32 numFolders = uniqueFoldersSelected.Count();
|
||||
*indexArrays = new nsTArray<PRUint32>[numFolders];
|
||||
*numArrays = numFolders;
|
||||
NS_ENSURE_TRUE(*indexArrays, NS_ERROR_OUT_OF_MEMORY);
|
||||
for (PRUint32 folderIndex=0; folderIndex < numFolders; folderIndex++)
|
||||
for (folderIndex = 0; folderIndex < numFolders; folderIndex++)
|
||||
{
|
||||
nsCOMPtr <nsIMsgFolder> curFolder =
|
||||
do_QueryElementAt(uniqueFoldersSelected, folderIndex, &rv);
|
||||
for (nsMsgViewIndex i = 0; i < (nsMsgViewIndex) numIndices; i++)
|
||||
{
|
||||
nsCOMPtr <nsIMsgFolder> msgFolder = do_QueryElementAt(m_folders,
|
||||
indices[i], &rv);
|
||||
if (NS_SUCCEEDED(rv) && msgFolder && msgFolder == curFolder)
|
||||
(*indexArrays)[folderIndex].Add(indices[i]);
|
||||
}
|
||||
(*indexArrays)[folderIndex].SetCapacity(numIndicesSelected[folderIndex]);
|
||||
}
|
||||
return rv;
|
||||
for (i = 0; i < (nsMsgViewIndex) numIndices; i++)
|
||||
{
|
||||
nsCOMPtr <nsISupports> curSupports = getter_AddRefs(m_folders->ElementAt(indices[i]));
|
||||
PRInt32 folderIndex = uniqueFoldersSelected.IndexOf(curSupports);
|
||||
(*indexArrays)[folderIndex].AppendElement(indices[i]);
|
||||
}
|
||||
return NS_OK;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -84,7 +84,7 @@ protected:
|
||||
virtual nsresult DeleteMessages(nsIMsgWindow *window, nsMsgViewIndex *indices, PRInt32 numIndices, PRBool deleteStorage);
|
||||
nsresult GetFoldersAndHdrsForSelection(nsMsgViewIndex *indices, PRInt32 numIndices);
|
||||
nsresult GroupSearchResultsByFolder();
|
||||
nsresult PartitionSelectionByFolder(nsMsgViewIndex *indices, PRInt32 numIndices, nsUInt32Array **indexArrays, PRInt32 *numArrays);
|
||||
nsresult PartitionSelectionByFolder(nsMsgViewIndex *indices, PRInt32 numIndices, nsTArray<PRUint32> **indexArrays, PRInt32 *numArrays);
|
||||
virtual nsresult ApplyCommandToIndicesWithFolder(nsMsgViewCommandTypeValue command, nsMsgViewIndex* indices,
|
||||
PRInt32 numIndices, nsIMsgFolder *destFolder);
|
||||
|
||||
|
||||
@@ -103,9 +103,9 @@ NS_IMETHODIMP nsMsgThreadedDBView::Open(nsIMsgFolder *folder, nsMsgViewSortTypeV
|
||||
PRInt32 unreadMsgsInView = 0;
|
||||
if (!(m_viewFlags & nsMsgViewFlagsType::kThreadedDisplay))
|
||||
{
|
||||
for (PRInt32 i = 0; i < m_flags.GetSize(); i++)
|
||||
for (PRInt32 i = 0; i < m_flags.Length(); i++)
|
||||
{
|
||||
if (! (m_flags.GetAt(i) & MSG_FLAG_READ))
|
||||
if (! (m_flags[i] & MSG_FLAG_READ))
|
||||
unreadMsgsInView++;
|
||||
}
|
||||
if (unreadMessages != unreadMsgsInView)
|
||||
@@ -126,10 +126,10 @@ nsresult nsMsgThreadedDBView::InitThreadedView(PRInt32 *pCount)
|
||||
nsresult rv;
|
||||
|
||||
m_keys.RemoveAll();
|
||||
m_flags.RemoveAll();
|
||||
m_flags.Clear();
|
||||
m_levels.Clear();
|
||||
m_prevKeys.RemoveAll();
|
||||
m_prevFlags.RemoveAll();
|
||||
m_prevFlags.Clear();
|
||||
m_prevLevels.Clear();
|
||||
m_havePrevView = PR_FALSE;
|
||||
nsresult getSortrv = NS_OK; // ### TODO m_db->GetSortInfo(&sortType, &sortOrder);
|
||||
@@ -187,7 +187,7 @@ nsresult nsMsgThreadedDBView::SortThreads(nsMsgViewSortTypeValue sortType, nsMsg
|
||||
}
|
||||
}
|
||||
m_keys.SetSize(numThreads);
|
||||
m_flags.SetSize(numThreads);
|
||||
m_flags.SetLength(numThreads);
|
||||
m_levels.SetLength(numThreads);
|
||||
//m_viewFlags &= ~nsMsgViewFlagsType::kThreadedDisplay;
|
||||
m_sortType = nsMsgViewSortType::byNone; // sort from scratch
|
||||
@@ -239,7 +239,7 @@ nsresult nsMsgThreadedDBView::AddKeys(nsMsgKey *pKeys, PRInt32 *pFlags, const ch
|
||||
PRInt32 numAdded = 0;
|
||||
// Allocate enough space first to avoid memory allocation/deallocation.
|
||||
m_keys.AllocateSpace(numKeysToAdd+m_keys.GetSize());
|
||||
m_flags.AllocateSpace(numKeysToAdd+m_flags.GetSize());
|
||||
m_flags.SetCapacity(m_flags.Length() + numKeysToAdd);
|
||||
m_levels.SetCapacity(m_levels.Length() + numKeysToAdd);
|
||||
for (PRInt32 i = 0; i < numKeysToAdd; i++)
|
||||
{
|
||||
@@ -256,7 +256,7 @@ nsresult nsMsgThreadedDBView::AddKeys(nsMsgKey *pKeys, PRInt32 *pFlags, const ch
|
||||
// should this be persistent? Doesn't seem to need to be.
|
||||
flag |= MSG_VIEW_FLAG_ISTHREAD;
|
||||
m_keys.Add(pKeys[i]);
|
||||
m_flags.Add(flag);
|
||||
m_flags.AppendElement(flag);
|
||||
m_levels.AppendElement(pLevels[i]);
|
||||
numAdded++;
|
||||
// we expand as we build the view, which allows us to insert at the end of the key array,
|
||||
@@ -309,8 +309,7 @@ NS_IMETHODIMP nsMsgThreadedDBView::Sort(nsMsgViewSortTypeValue sortType, nsMsgVi
|
||||
// restore saved id array and flags array
|
||||
m_keys.RemoveAll();
|
||||
m_keys.InsertAt(0, &m_prevKeys);
|
||||
m_flags.RemoveAll();
|
||||
m_flags.InsertAt(0, &m_prevFlags);
|
||||
m_flags = m_prevFlags;
|
||||
m_levels = m_prevLevels;
|
||||
m_sortValid = PR_TRUE;
|
||||
|
||||
@@ -354,15 +353,14 @@ NS_IMETHODIMP nsMsgThreadedDBView::Sort(nsMsgViewSortTypeValue sortType, nsMsgVi
|
||||
// going from SortByThread to non-thread sort - must build new key, level,and flags arrays
|
||||
m_prevKeys.RemoveAll();
|
||||
m_prevKeys.InsertAt(0, &m_keys);
|
||||
m_prevFlags.RemoveAll();
|
||||
m_prevFlags.InsertAt(0, &m_flags);
|
||||
m_prevFlags = m_flags;
|
||||
m_prevLevels = m_levels;
|
||||
// do this before we sort, so that we'll use the cheap method
|
||||
// of expanding.
|
||||
m_viewFlags &= ~(nsMsgViewFlagsType::kThreadedDisplay | nsMsgViewFlagsType::kGroupBySort);
|
||||
ExpandAll();
|
||||
// m_idArray.RemoveAll();
|
||||
// m_flags.RemoveAll();
|
||||
// m_flags.Clear();
|
||||
m_havePrevView = PR_TRUE;
|
||||
}
|
||||
}
|
||||
@@ -507,7 +505,7 @@ void nsMsgThreadedDBView::OnExtraFlagChanged(nsMsgViewIndex index, PRUint32 extr
|
||||
nsMsgViewIndex prevViewIndex = m_prevKeys.FindIndex(keyChanged);
|
||||
if (prevViewIndex != nsMsgViewIndex_None)
|
||||
{
|
||||
PRUint32 prevFlag = m_prevFlags.GetAt(prevViewIndex);
|
||||
PRUint32 prevFlag = m_prevFlags[prevViewIndex];
|
||||
// don't want to change the elided bit, or has children or is thread
|
||||
if (prevFlag & MSG_FLAG_ELIDED)
|
||||
extraFlag |= MSG_FLAG_ELIDED;
|
||||
@@ -521,7 +519,7 @@ void nsMsgThreadedDBView::OnExtraFlagChanged(nsMsgViewIndex index, PRUint32 extr
|
||||
extraFlag |= MSG_VIEW_FLAG_HASCHILDREN;
|
||||
else
|
||||
extraFlag &= ~MSG_VIEW_FLAG_HASCHILDREN;
|
||||
m_prevFlags.SetAt(prevViewIndex, extraFlag); // will this be right?
|
||||
m_prevFlags[prevViewIndex] = extraFlag; // will this be right?
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -541,7 +539,7 @@ void nsMsgThreadedDBView::ClearPrevIdArray()
|
||||
{
|
||||
m_prevKeys.RemoveAll();
|
||||
m_prevLevels.Clear();
|
||||
m_prevFlags.RemoveAll();
|
||||
m_prevFlags.Clear();
|
||||
m_havePrevView = PR_FALSE;
|
||||
}
|
||||
|
||||
@@ -627,7 +625,7 @@ nsresult nsMsgThreadedDBView::OnNewHeader(nsIMsgDBHdr *newHdr, nsMsgKey aParentK
|
||||
insertIndex = GetInsertInfoForNewHdr(newHdr, parentIndex, level);
|
||||
}
|
||||
m_keys.InsertAt(insertIndex, newKey);
|
||||
m_flags.InsertAt(insertIndex, newFlags, 1);
|
||||
m_flags.InsertElementAt(insertIndex, newFlags);
|
||||
m_levels.InsertElementAt(insertIndex, level);
|
||||
|
||||
// the call to NoteChange() has to happen after we add the key
|
||||
@@ -767,7 +765,7 @@ nsresult nsMsgThreadedDBView::RemoveByIndex(nsMsgViewIndex index)
|
||||
msgHdr->GetFlags(&flag);
|
||||
if (numThreadChildren > 1)
|
||||
flag |= MSG_VIEW_FLAG_ISTHREAD | MSG_VIEW_FLAG_HASCHILDREN;
|
||||
m_flags.SetAtGrow(index, flag);
|
||||
m_flags[index] = flag;
|
||||
m_levels[index] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@ protected:
|
||||
// between two views is quick (e.g., threaded and flat sorted by date).
|
||||
PRBool m_havePrevView;
|
||||
nsMsgKeyArray m_prevKeys; //this is used for caching non-threaded view.
|
||||
nsUInt32Array m_prevFlags;
|
||||
nsTArray<PRUint32> m_prevFlags;
|
||||
nsTArray<PRUint8> m_prevLevels;
|
||||
nsCOMPtr <nsISimpleEnumerator> m_threadEnumerator;
|
||||
};
|
||||
|
||||
@@ -161,7 +161,7 @@ nsresult nsMsgXFVirtualFolderDBView::InsertHdrFromFolder(nsIMsgDBHdr *msgHdr, ns
|
||||
msgHdr->GetMessageKey(&msgKey);
|
||||
msgHdr->GetFlags(&msgFlags);
|
||||
m_keys.InsertAt(insertIndex, msgKey);
|
||||
m_flags.InsertAt(insertIndex, msgFlags);
|
||||
m_flags.InsertElementAt(insertIndex, msgFlags);
|
||||
m_folders->InsertElementAt(folder, insertIndex);
|
||||
m_levels.InsertElementAt(insertIndex, 0);
|
||||
|
||||
@@ -293,7 +293,7 @@ nsMsgXFVirtualFolderDBView::OnSearchDone(nsresult status)
|
||||
// folder - easier than trying to keep the count up to date in the face of
|
||||
// search hits coming in while the user is reading/deleting messages.
|
||||
PRInt32 numUnread = 0;
|
||||
for (PRInt32 i = 0; i < m_flags.GetSize(); i++)
|
||||
for (PRUint32 i = 0; i < m_flags.Length(); i++)
|
||||
if (!(m_flags[i] & MSG_FLAG_READ))
|
||||
numUnread++;
|
||||
dbFolderInfo->SetNumUnreadMessages(numUnread);
|
||||
@@ -323,7 +323,7 @@ nsMsgXFVirtualFolderDBView::OnNewSearch()
|
||||
m_folders->Clear();
|
||||
m_keys.RemoveAll();
|
||||
m_levels.Clear();
|
||||
m_flags.RemoveAll();
|
||||
m_flags.Clear();
|
||||
|
||||
// needs to happen after we remove the keys, since RowCountChanged() will call our GetRowCount()
|
||||
if (mTree)
|
||||
|
||||
Reference in New Issue
Block a user