bug 792566 - remove nsISupportsArrays in nsFileView.cpp r=enn

This commit is contained in:
Nathan Froyd 2012-12-11 20:49:06 -05:00
parent 87ff3077cc
commit db2daabf49

View File

@ -214,13 +214,13 @@ protected:
virtual ~nsFileView(); virtual ~nsFileView();
void FilterFiles(); void FilterFiles();
void ReverseArray(nsISupportsArray* aArray); void ReverseArray(nsTArray<nsCOMPtr<nsIFile> >& aArray);
void SortArray(nsISupportsArray* aArray); void SortArray(nsTArray<nsCOMPtr<nsIFile> >& aArray);
void SortInternal(); void SortInternal();
nsCOMPtr<nsISupportsArray> mFileList; nsTArray<nsCOMPtr<nsIFile> > mFileList;
nsCOMPtr<nsISupportsArray> mDirList; nsTArray<nsCOMPtr<nsIFile> > mDirList;
nsCOMPtr<nsISupportsArray> mFilteredFiles; nsTArray<nsCOMPtr<nsIFile> > mFilteredFiles;
nsCOMPtr<nsIFile> mDirectoryPath; nsCOMPtr<nsIFile> mDirectoryPath;
nsCOMPtr<nsITreeBoxObject> mTree; nsCOMPtr<nsITreeBoxObject> mTree;
@ -292,18 +292,6 @@ nsFileView::Init()
if (!mFileAtom) if (!mFileAtom)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
NS_NewISupportsArray(getter_AddRefs(mFileList));
if (!mFileList)
return NS_ERROR_OUT_OF_MEMORY;
NS_NewISupportsArray(getter_AddRefs(mDirList));
if (!mDirList)
return NS_ERROR_OUT_OF_MEMORY;
NS_NewISupportsArray(getter_AddRefs(mFilteredFiles));
if (!mFilteredFiles)
return NS_ERROR_OUT_OF_MEMORY;
mDateFormatter = do_CreateInstance(NS_DATETIMEFORMAT_CONTRACTID); mDateFormatter = do_CreateInstance(NS_DATETIMEFORMAT_CONTRACTID);
if (!mDateFormatter) if (!mDateFormatter)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
@ -345,12 +333,11 @@ nsFileView::SetShowOnlyDirectories(bool aOnlyDirs)
return NS_OK; return NS_OK;
mDirectoryFilter = aOnlyDirs; mDirectoryFilter = aOnlyDirs;
uint32_t dirCount; uint32_t dirCount = mDirList.Length();
mDirList->Count(&dirCount);
if (mDirectoryFilter) { if (mDirectoryFilter) {
int32_t rowDiff = mTotalRows - dirCount; int32_t rowDiff = mTotalRows - dirCount;
mFilteredFiles->Clear(); mFilteredFiles.Clear();
mTotalRows = dirCount; mTotalRows = dirCount;
if (mTree) if (mTree)
mTree->RowCountChanged(mTotalRows, -rowDiff); mTree->RowCountChanged(mTotalRows, -rowDiff);
@ -427,8 +414,8 @@ nsFileView::SetDirectory(nsIFile* aDirectory)
} }
mDirectoryPath = aDirectory; mDirectoryPath = aDirectory;
mFileList->Clear(); mFileList.Clear();
mDirList->Clear(); mDirList.Clear();
bool hasMore = false; bool hasMore = false;
@ -445,11 +432,11 @@ nsFileView::SetDirectory(nsIFile* aDirectory)
bool isHidden; bool isHidden;
theFile->IsHidden(&isHidden); theFile->IsHidden(&isHidden);
if (mShowHiddenFiles || !isHidden) { if (mShowHiddenFiles || !isHidden) {
mDirList->AppendElement(theFile); mDirList.AppendElement(theFile);
} }
} }
else { else {
mFileList->AppendElement(theFile); mFileList.AppendElement(theFile);
} }
} }
} }
@ -516,12 +503,11 @@ nsFileView::SetFilter(const nsAString& aFilterString)
if (mTree) { if (mTree) {
mTree->BeginUpdateBatch(); mTree->BeginUpdateBatch();
uint32_t count; uint32_t count = mDirList.Length();
mDirList->Count(&count);
mTree->RowCountChanged(count, count - mTotalRows); mTree->RowCountChanged(count, count - mTotalRows);
} }
mFilteredFiles->Clear(); mFilteredFiles.Clear();
FilterFiles(); FilterFiles();
@ -545,9 +531,7 @@ nsFileView::GetSelectedFiles(nsIArray** aFiles)
int32_t numRanges; int32_t numRanges;
mSelection->GetRangeCount(&numRanges); mSelection->GetRangeCount(&numRanges);
uint32_t dirCount; uint32_t dirCount = mDirList.Length();
mDirList->Count(&dirCount);
nsCOMPtr<nsIMutableArray> fileArray = nsCOMPtr<nsIMutableArray> fileArray =
do_CreateInstance(NS_ARRAY_CONTRACTID); do_CreateInstance(NS_ARRAY_CONTRACTID);
NS_ENSURE_STATE(fileArray); NS_ENSURE_STATE(fileArray);
@ -557,13 +541,13 @@ nsFileView::GetSelectedFiles(nsIArray** aFiles)
mSelection->GetRangeAt(range, &rangeBegin, &rangeEnd); mSelection->GetRangeAt(range, &rangeBegin, &rangeEnd);
for (int32_t itemIndex = rangeBegin; itemIndex <= rangeEnd; ++itemIndex) { for (int32_t itemIndex = rangeBegin; itemIndex <= rangeEnd; ++itemIndex) {
nsCOMPtr<nsIFile> curFile; nsIFile* curFile = nullptr;
if (itemIndex < (int32_t) dirCount) if (itemIndex < (int32_t) dirCount)
curFile = do_QueryElementAt(mDirList, itemIndex); curFile = mDirList[itemIndex];
else { else {
if (itemIndex < mTotalRows) if (itemIndex < mTotalRows)
curFile = do_QueryElementAt(mFilteredFiles, itemIndex - dirCount); curFile = mFilteredFiles[itemIndex - dirCount];
} }
if (curFile) if (curFile)
@ -611,8 +595,7 @@ NS_IMETHODIMP
nsFileView::GetCellProperties(int32_t aRow, nsITreeColumn* aCol, nsFileView::GetCellProperties(int32_t aRow, nsITreeColumn* aCol,
nsISupportsArray* aProperties) nsISupportsArray* aProperties)
{ {
uint32_t dirCount; uint32_t dirCount = mDirList.Length();
mDirList->Count(&dirCount);
if (aRow < (int32_t) dirCount) if (aRow < (int32_t) dirCount)
aProperties->AppendElement(mDirectoryAtom); aProperties->AppendElement(mDirectoryAtom);
@ -725,19 +708,16 @@ NS_IMETHODIMP
nsFileView::GetCellText(int32_t aRow, nsITreeColumn* aCol, nsFileView::GetCellText(int32_t aRow, nsITreeColumn* aCol,
nsAString& aCellText) nsAString& aCellText)
{ {
uint32_t dirCount, fileCount; uint32_t dirCount = mDirList.Length();
mDirList->Count(&dirCount);
mFilteredFiles->Count(&fileCount);
bool isDirectory; bool isDirectory;
nsCOMPtr<nsIFile> curFile; nsIFile* curFile = nullptr;
if (aRow < (int32_t) dirCount) { if (aRow < (int32_t) dirCount) {
isDirectory = true; isDirectory = true;
curFile = do_QueryElementAt(mDirList, aRow); curFile = mDirList[aRow];
} else if (aRow < mTotalRows) { } else if (aRow < mTotalRows) {
isDirectory = false; isDirectory = false;
curFile = do_QueryElementAt(mFilteredFiles, aRow - dirCount); curFile = mFilteredFiles[aRow - dirCount];
} else { } else {
// invalid row // invalid row
aCellText.SetCapacity(0); aCellText.SetCapacity(0);
@ -855,16 +835,14 @@ nsFileView::PerformActionOnCell(const PRUnichar* aAction, int32_t aRow,
void void
nsFileView::FilterFiles() nsFileView::FilterFiles()
{ {
uint32_t count = 0; uint32_t count = mDirList.Length();
mDirList->Count(&count);
mTotalRows = count; mTotalRows = count;
mFileList->Count(&count); count = mFileList.Length();
mFilteredFiles->Clear(); mFilteredFiles.Clear();
uint32_t filterCount = mCurrentFilters.Length(); uint32_t filterCount = mCurrentFilters.Length();
nsCOMPtr<nsIFile> file;
for (uint32_t i = 0; i < count; ++i) { for (uint32_t i = 0; i < count; ++i) {
file = do_QueryElementAt(mFileList, i); nsIFile* file = mFileList[i];
bool isHidden = false; bool isHidden = false;
if (!mShowHiddenFiles) if (!mShowHiddenFiles)
file->IsHidden(&isHidden); file->IsHidden(&isHidden);
@ -888,7 +866,7 @@ nsFileView::FilterFiles()
true) == MATCH); true) == MATCH);
if (matched) { if (matched) {
mFilteredFiles->AppendElement(file); mFilteredFiles.AppendElement(file);
++mTotalRows; ++mTotalRows;
break; break;
} }
@ -898,15 +876,15 @@ nsFileView::FilterFiles()
} }
void void
nsFileView::ReverseArray(nsISupportsArray* aArray) nsFileView::ReverseArray(nsTArray<nsCOMPtr<nsIFile> >& aArray)
{ {
uint32_t count; uint32_t count = aArray.Length();
aArray->Count(&count);
for (uint32_t i = 0; i < count/2; ++i) { for (uint32_t i = 0; i < count/2; ++i) {
nsCOMPtr<nsISupports> element = dont_AddRef(aArray->ElementAt(i)); // If we get references to the COMPtrs in the array, and then .swap() them
nsCOMPtr<nsISupports> element2 = dont_AddRef(aArray->ElementAt(count-i-1)); // we avoid AdRef() / Release() calls.
aArray->ReplaceElementAt(element2, i); nsCOMPtr<nsIFile>& element = aArray[i];
aArray->ReplaceElementAt(element, count-i-1); nsCOMPtr<nsIFile>& element2 = aArray[count - i - 1];
element.swap(element2);
} }
} }
@ -956,7 +934,7 @@ SortDateCallback(const void* aElement1, const void* aElement2, void* aContext)
} }
void void
nsFileView::SortArray(nsISupportsArray* aArray) nsFileView::SortArray(nsTArray<nsCOMPtr<nsIFile> >& aArray)
{ {
// We assume the array to be in filesystem order, which // We assume the array to be in filesystem order, which
// for our purposes, is completely unordered. // for our purposes, is completely unordered.
@ -977,21 +955,18 @@ nsFileView::SortArray(nsISupportsArray* aArray)
return; return;
} }
uint32_t count; uint32_t count = aArray.Length();
aArray->Count(&count);
// each item will have an additional refcount while
// the array is alive.
nsIFile** array = new nsIFile*[count]; nsIFile** array = new nsIFile*[count];
uint32_t i; for (uint32_t i = 0; i < count; ++i) {
for (i = 0; i < count; ++i) array[i] = aArray[i];
aArray->QueryElementAt(i, NS_GET_IID(nsIFile), (void**)&(array[i])); }
NS_QuickSort(array, count, sizeof(nsIFile*), compareFunc, nullptr); NS_QuickSort(array, count, sizeof(nsIFile*), compareFunc, nullptr);
for (i = 0; i < count; ++i) { for (uint32_t i = 0; i < count; ++i) {
aArray->ReplaceElementAt(array[i], i); // Use swap() to avoid refcounting.
NS_RELEASE(array[i]); aArray[i].swap(array[i]);
} }
delete[] array; delete[] array;