summaryrefslogtreecommitdiffstats
path: root/net/base
diff options
context:
space:
mode:
authordhg@chromium.org <dhg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-13 16:26:10 +0000
committerdhg@chromium.org <dhg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-13 16:26:10 +0000
commitf872b3ec9a2966524a9855f1a14c69436235e315 (patch)
treee109613ff5d6b31805d9af92608681cd24d515a7 /net/base
parent7c388781c4d85069c49b74784063b0da8b478c45 (diff)
downloadchromium_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/base')
-rw-r--r--net/base/directory_lister.cc54
-rw-r--r--net/base/directory_lister.h15
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_;