mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-24 18:55:30 +00:00
bug 792566 - remove nsISupportsArrays in nsFileView.cpp r=enn
This commit is contained in:
parent
87ff3077cc
commit
db2daabf49
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user