diff options
author | dhg@chromium.org <dhg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-13 16:26:10 +0000 |
---|---|---|
committer | dhg@chromium.org <dhg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-13 16:26:10 +0000 |
commit | f872b3ec9a2966524a9855f1a14c69436235e315 (patch) | |
tree | e109613ff5d6b31805d9af92608681cd24d515a7 /net | |
parent | 7c388781c4d85069c49b74784063b0da8b478c45 (diff) | |
download | chromium_src-f872b3ec9a2966524a9855f1a14c69436235e315.zip chromium_src-f872b3ec9a2966524a9855f1a14c69436235e315.tar.gz chromium_src-f872b3ec9a2966524a9855f1a14c69436235e315.tar.bz2 |
Adding ability to sort by date to directory_lister.cc. Adding support for title and making so long filenames are ellipsis.
BUG=chromium-os:5565 chromium-os:5566
TEST=manual
Review URL: http://codereview.chromium.org/3177010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@56036 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net')
-rw-r--r-- | net/base/directory_lister.cc | 54 | ||||
-rw-r--r-- | net/base/directory_lister.h | 15 |
2 files changed, 61 insertions, 8 deletions
diff --git a/net/base/directory_lister.cc b/net/base/directory_lister.cc index ab45e2f..05f70b8 100644 --- a/net/base/directory_lister.cc +++ b/net/base/directory_lister.cc @@ -39,8 +39,8 @@ class DirectoryDataEvent : public Task { // Comparator for sorting FindInfo's. This uses the locale aware filename // comparison function on the filenames for sorting in the user's locale. -static bool CompareFindInfo(const file_util::FileEnumerator::FindInfo& a, - const file_util::FileEnumerator::FindInfo& b) { +static bool CompareFindInfoAlpha(const file_util::FileEnumerator::FindInfo& a, + const file_util::FileEnumerator::FindInfo& b) { // Parent directory before all else. if (file_util::IsDotDot(file_util::FileEnumerator::GetFilename(a))) return true; @@ -58,10 +58,47 @@ static bool CompareFindInfo(const file_util::FileEnumerator::FindInfo& a, file_util::FileEnumerator::GetFilename(b)); } +static bool CompareFindInfoDate(const file_util::FileEnumerator::FindInfo& a, + const file_util::FileEnumerator::FindInfo& b) { + // Parent directory before all else. + if (file_util::IsDotDot(file_util::FileEnumerator::GetFilename(a))) + return true; + if (file_util::IsDotDot(file_util::FileEnumerator::GetFilename(b))) + return false; + + // Directories before regular files. + bool a_is_directory = file_util::FileEnumerator::IsDirectory(a); + bool b_is_directory = file_util::FileEnumerator::IsDirectory(b); + if (a_is_directory != b_is_directory) + return a_is_directory; +#if defined(OS_POSIX) + return a.stat.st_mtime > b.stat.st_mtime; +#elif defined(OS_WIN) + if (a.ftLastWriteTime.dwHighDateTime == b.ftLastWriteTime.dwHighDateTime) { + return a.ftLastWriteTime.dwLowDateTime > b.ftLastWriteTime.dwLowDateTime; + } else { + return a.ftLastWriteTime.dwHighDateTime > b.ftLastWriteTime.dwHighDateTime; + } +#endif +} + + DirectoryLister::DirectoryLister(const FilePath& dir, DirectoryListerDelegate* delegate) : dir_(dir), delegate_(delegate), + sort_(DEFAULT), + message_loop_(NULL), + thread_(kNullThreadHandle) { + DCHECK(!dir.value().empty()); +} + +DirectoryLister::DirectoryLister(const FilePath& dir, + SORT_TYPE sort, + DirectoryListerDelegate* delegate) + : dir_(dir), + delegate_(delegate), + sort_(sort), message_loop_(NULL), thread_(kNullThreadHandle) { DCHECK(!dir.value().empty()); @@ -108,12 +145,11 @@ void DirectoryLister::ThreadMain() { Release(); return; } - file_util::FileEnumerator file_enum(dir_, false, static_cast<file_util::FileEnumerator::FILE_TYPE>( - file_util::FileEnumerator::FILES | - file_util::FileEnumerator::DIRECTORIES | - file_util::FileEnumerator::INCLUDE_DOT_DOT)); + file_util::FileEnumerator::FILES | + file_util::FileEnumerator::DIRECTORIES | + file_util::FileEnumerator::INCLUDE_DOT_DOT)); while (!canceled_.IsSet() && !(file_enum.Next().value().empty())) { e->data.push_back(file_util::FileEnumerator::FindInfo()); @@ -133,7 +169,11 @@ void DirectoryLister::ThreadMain() { if (!e->data.empty()) { // Sort the results. See the TODO above (this sort should be removed and we // should do it from JS). - std::sort(e->data.begin(), e->data.end(), CompareFindInfo); + if (sort_ == DATE) { + std::sort(e->data.begin(), e->data.end(), CompareFindInfoDate); + } else { + std::sort(e->data.begin(), e->data.end(), CompareFindInfoAlpha); + } message_loop_->PostTask(FROM_HERE, e); e = new DirectoryDataEvent(this); diff --git a/net/base/directory_lister.h b/net/base/directory_lister.h index bc21218..5563093 100644 --- a/net/base/directory_lister.h +++ b/net/base/directory_lister.h @@ -39,7 +39,19 @@ class DirectoryLister : public base::RefCountedThreadSafe<DirectoryLister>, virtual ~DirectoryListerDelegate() {} }; - DirectoryLister(const FilePath& dir, DirectoryListerDelegate* delegate); + enum SORT_TYPE { + DEFAULT, + DATE, + ALPHA + }; + + DirectoryLister(const FilePath& dir, + DirectoryListerDelegate* delegate); + + DirectoryLister(const FilePath& dir, + SORT_TYPE sort, + DirectoryListerDelegate* delegate); + // Call this method to start the directory enumeration thread. bool Start(); @@ -68,6 +80,7 @@ class DirectoryLister : public base::RefCountedThreadSafe<DirectoryLister>, FilePath dir_; DirectoryListerDelegate* delegate_; + SORT_TYPE sort_; MessageLoop* message_loop_; PlatformThreadHandle thread_; base::CancellationFlag canceled_; |