Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #include "FileTreeTableNode.h"
00009
00010 #include <boost/filesystem/operations.hpp>
00011 #include <boost/filesystem/exception.hpp>
00012 #include <boost/lexical_cast.hpp>
00013 #include <iostream>
00014 #include <time.h>
00015
00016 #include <Wt/WIconPair>
00017 #include <Wt/WStringUtil>
00018 #include <Wt/WText>
00019
00020 using namespace Wt;
00021
00022 FileTreeTableNode::FileTreeTableNode(const boost::filesystem::path& path)
00023 #if BOOST_FILESYSTEM_VERSION < 3
00024 #ifndef WT_NO_STD_WSTRING
00025 : WTreeTableNode(Wt::widen(path.leaf()), createIcon(path)),
00026 #else
00027 : WTreeTableNode(path.leaf(), createIcon(path)),
00028 #endif
00029 #else
00030 : WTreeTableNode(path.leaf().string(), createIcon(path)),
00031 #endif
00032 path_(path)
00033 {
00034 label()->setTextFormat(PlainText);
00035
00036 if (boost::filesystem::exists(path)) {
00037 if (!boost::filesystem::is_directory(path)) {
00038 int fsize = (int)boost::filesystem::file_size(path);
00039 setColumnWidget(1, new WText(boost::lexical_cast<std::string>(fsize)));
00040 columnWidget(1)->setStyleClass("fsize");
00041 } else
00042 setSelectable(false);
00043
00044 std::time_t t = boost::filesystem::last_write_time(path);
00045 struct tm ttm;
00046 #if WIN32
00047 ttm=*localtime(&t);
00048 #else
00049 localtime_r(&t, &ttm);
00050 #endif
00051
00052 char c[100];
00053 strftime(c, 100, "%b %d %Y", &ttm);
00054
00055 setColumnWidget(2, new WText(c));
00056 columnWidget(2)->setStyleClass("date");
00057 }
00058 }
00059
00060 WIconPair *FileTreeTableNode::createIcon(const boost::filesystem::path& path)
00061 {
00062 if (boost::filesystem::exists(path)
00063 && boost::filesystem::is_directory(path))
00064 return new WIconPair("icons/yellow-folder-closed.png",
00065 "icons/yellow-folder-open.png", false);
00066 else
00067 return new WIconPair("icons/document.png",
00068 "icons/yellow-folder-open.png", false);
00069 }
00070
00071 void FileTreeTableNode::populate()
00072 {
00073 try {
00074 if (boost::filesystem::is_directory(path_)) {
00075 std::set<boost::filesystem::path> paths;
00076 boost::filesystem::directory_iterator end_itr;
00077
00078 for (boost::filesystem::directory_iterator i(path_); i != end_itr; ++i)
00079 paths.insert(*i);
00080
00081 for (std::set<boost::filesystem::path>::iterator i = paths.begin();
00082 i != paths.end(); ++i)
00083 addChildNode(new FileTreeTableNode(*i));
00084 }
00085 } catch (boost::filesystem::filesystem_error& e) {
00086 std::cerr << e.what() << std::endl;
00087 }
00088 }
00089
00090 bool FileTreeTableNode::expandable()
00091 {
00092 if (!populated()) {
00093 return boost::filesystem::is_directory(path_);
00094 } else
00095 return WTreeTableNode::expandable();
00096 }