|
Wt examples
3.3.0
|
A simple widget to visualise a set of example source files. More...
#include <ExampleSourceViewer.h>

Public Member Functions | |
| ExampleSourceViewer (const std::string &deployPath, const std::string &examplesRoot, const std::string &examplesType) | |
| Constructor. | |
Private Member Functions | |
| void | cppTraverseDir (Wt::WStandardItem *parent, const boost::filesystem::path &path) |
| void | javaTraverseDir (Wt::WStandardItem *parent, const boost::filesystem::path &path) |
| void | javaTraversePackages (Wt::WStandardItem *parent, const boost::filesystem::path &srcPath, const std::string packageName) |
| void | showFile () |
| Displayed the currently selected file. | |
| void | handlePathChange () |
| void | setExample (const std::string &exampleDir, const std::string &example) |
Private Attributes | |
| Wt::WTreeView * | exampleView_ |
| SourceView * | sourceView_ |
| std::string | deployPath_ |
| std::string | examplesRoot_ |
| std::string | examplesType_ |
| Wt::WStandardItemModel * | model_ |
A simple widget to visualise a set of example source files.
Definition at line 21 of file ExampleSourceViewer.h.
| ExampleSourceViewer::ExampleSourceViewer | ( | const std::string & | deployPath, |
| const std::string & | examplesRoot, | ||
| const std::string & | examplesType | ||
| ) |
Constructor.
Definition at line 71 of file ExampleSourceViewer.C.
: deployPath_(deployPath), examplesRoot_(examplesRoot), examplesType_(examplesType) { wApp->internalPathChanged().connect (this, &ExampleSourceViewer::handlePathChange); handlePathChange(); }
| void ExampleSourceViewer::cppTraverseDir | ( | Wt::WStandardItem * | parent, |
| const boost::filesystem::path & | path | ||
| ) | [private] |
Definition at line 194 of file ExampleSourceViewer.C.
{
static const char *supportedFiles[] = {
".C", ".cpp", ".h", ".css", ".xml", ".png", ".gif", ".csv", ".ico", 0
};
FileItem* dir = new FileItem("/icons/yellow-folder-open.png", filename(path),
"");
parent->appendRow(dir);
parent = dir;
try {
std::set<fs::path> paths;
fs::directory_iterator end_itr;
for (fs::directory_iterator i(path); i != end_itr; ++i)
paths.insert(*i);
std::vector<FileItem*> classes, files;
std::vector<fs::path> dirs;
while (!paths.empty()) {
fs::path p = *paths.begin();
paths.erase(p);
// skip symbolic links and other files
if (fs::is_symlink(p))
continue;
// skip files with an extension we do not want to handle
if (fs::is_regular(p)) {
std::string ext = fs::extension(p);
bool supported = false;
for (const char **s = supportedFiles; *s != 0; ++s)
if (*s == ext) {
supported = true;
break;
}
if (!supported)
continue;
}
// see if we have one file of a class (.C, .h)
fs::path companion = getCompanion(p);
if (!companion.empty()) {
std::set<fs::path>::iterator it_companion = paths.find(companion);
if (it_companion != paths.end()) {
std::string className = stem(p);
escapeText(className);
std::string label = "<i>class</i> " + className;
FileItem *classItem =
new FileItem("/icons/cppclass.png", label, std::string());
classItem->setFlags(classItem->flags() | ItemIsXHTMLText);
FileItem *header = new FileItem("/icons/document.png", filename(p),
p.string());
FileItem *cpp = new FileItem("/icons/document.png",
filename(*it_companion),
(*it_companion).string());
classItem->appendRow(header);
classItem->appendRow(cpp);
classes.push_back(classItem);
paths.erase(it_companion);
} else {
FileItem *file = new FileItem("/icons/document.png", filename(p),
p.string());
files.push_back(file);
}
} else if (fs::is_directory(p)) {
dirs.push_back(p);
} else {
FileItem *file = new FileItem("/icons/document.png", filename(p),
p.string());
files.push_back(file);
}
}
std::sort(dirs.begin(), dirs.end(), comparePaths);
for (unsigned int i = 0; i < classes.size(); i++)
parent->appendRow(classes[i]);
for (unsigned int i = 0; i < files.size(); i++)
parent->appendRow(files[i]);
for (unsigned int i = 0; i < dirs.size(); i++)
cppTraverseDir(parent, dirs[i]);
} catch (fs::filesystem_error& e) {
std::cerr << e.what() << std::endl;
}
}
| void ExampleSourceViewer::handlePathChange | ( | ) | [private] |
Definition at line 84 of file ExampleSourceViewer.C.
{
WApplication *app = wApp;
if (app->internalPathMatches(deployPath_)) {
std::string example = app->internalPathNextPart(deployPath_);
if (example.find("..") != std::string::npos
|| example.find('/') != std::string::npos
|| example.find('\\') != std::string::npos) {
app->setInternalPathValid(false);
setExample("INVALID_DIR", "INVALID");
} else
setExample(examplesRoot_ + example, example);
}
}
| void ExampleSourceViewer::javaTraverseDir | ( | Wt::WStandardItem * | parent, |
| const boost::filesystem::path & | path | ||
| ) | [private] |
Definition at line 324 of file ExampleSourceViewer.C.
{
FileItem* dir = new FileItem("/icons/yellow-folder-open.png", filename(path),
"");
parent->appendRow(dir);
parent = dir;
std::vector<fs::path> files, dirs;
fs::directory_iterator end_itr;
for (fs::directory_iterator i(path); i != end_itr; ++i) {
fs::path p = *i;
if (fs::is_directory(p)) {
if (filename(p) == "src") {
FileItem* dir = new FileItem("/icons/package-folder-open.png",
filename(p), "");
parent->appendRow(dir);
javaTraversePackages(dir, p, "");
} else
dirs.push_back(p);
} else {
files.push_back(p);
}
}
std::sort(dirs.begin(), dirs.end(), comparePaths);
std::sort(files.begin(), files.end(), comparePaths);
for (unsigned int i = 0; i < dirs.size(); i++)
javaTraverseDir(parent, dirs[i]);
for (unsigned int i = 0; i < files.size(); i++) {
FileItem *file = new FileItem("/icons/document.png", filename(files[i]),
files[i].string());
parent->appendRow(file);
}
}
| void ExampleSourceViewer::javaTraversePackages | ( | Wt::WStandardItem * | parent, |
| const boost::filesystem::path & | srcPath, | ||
| const std::string | packageName | ||
| ) | [private] |
Definition at line 290 of file ExampleSourceViewer.C.
{
fs::directory_iterator end_itr;
FileItem *packageItem = 0;
for (fs::directory_iterator i(srcPath); i != end_itr; ++i) {
fs::path p = *i;
if (fs::is_regular(p)) {
if (!packageItem) {
packageItem = new FileItem("/icons/package.png", packageName, "");
parent->appendRow(packageItem);
}
FileItem *file = new FileItem("/icons/javaclass.png", filename(p),
p.string());
packageItem->appendRow(file);
}
}
for (fs::directory_iterator i(srcPath); i != end_itr; ++i) {
fs::path p = *i;
if (fs::is_directory(p)) {
std::string pn = packageName;
if (!pn.empty())
pn += ".";
pn += filename(p);
javaTraversePackages(parent, p, pn);
}
}
}
| void ExampleSourceViewer::setExample | ( | const std::string & | exampleDir, |
| const std::string & | example | ||
| ) | [private] |
Definition at line 101 of file ExampleSourceViewer.C.
{
clear();
bool exists = false;
try {
exists = fs::exists(exampleDir);
} catch (std::exception&) {
}
if (!exists) {
WApplication::instance()->setInternalPathValid(false);
addWidget(new WText("No such example: " + exampleDir));
return;
}
model_ = new WStandardItemModel(0, 1, this);
if (examplesType_ == "CPP") {
cppTraverseDir(model_->invisibleRootItem(), exampleDir);
} else if (examplesType_ == "JAVA") {
javaTraverseDir(model_->invisibleRootItem(), exampleDir);
}
WApplication::instance()->setTitle(tr("srcview.title." + example));
WText *title =
new WText(tr("srcview.title." + examplesType_ + "." + example));
title->setInternalPathEncoding(true);
exampleView_ = new WTreeView();
exampleView_->setHeaderHeight(0);
exampleView_->resize(300, WLength::Auto);
exampleView_->setSortingEnabled(false);
exampleView_->setModel(model_);
exampleView_->expandToDepth(1);
exampleView_->setSelectionMode(SingleSelection);
exampleView_->setAlternatingRowColors(false);
exampleView_->selectionChanged().connect
(this, &ExampleSourceViewer::showFile);
sourceView_ = new SourceView(FileItem::FileNameRole,
FileItem::ContentsRole,
FileItem::FilePathRole);
sourceView_->setStyleClass("source-view");
/*
* Expand path to first file, to show something in the source viewer
*/
WStandardItem *w = model_->item(0);
do {
exampleView_->setExpanded(w->index(), true);
if (w->rowCount() > 0)
w = w->child(0);
else {
exampleView_->select(w->index(), Select);
w = 0;
}
} while (w);
WVBoxLayout *topLayout = new WVBoxLayout();
topLayout->addWidget(title);
WHBoxLayout *gitLayout = new WHBoxLayout();
gitLayout->addWidget(exampleView_, 0);
gitLayout->addWidget(sourceView_, 1);
topLayout->addLayout(gitLayout, 1);
gitLayout->setResizable(0);
/*
* FIXME, in plain HTML mode, we should set a minimum size to the source
* view, and remove this in enableAjax() ?
*/
// sourceView_->setHeight("100%");
setLayout(topLayout);
setStyleClass("maindiv");
}
| void ExampleSourceViewer::showFile | ( | ) | [private] |
Displayed the currently selected file.
Definition at line 365 of file ExampleSourceViewer.C.
{
if (exampleView_->selectedIndexes().empty())
return;
WModelIndex selected = *exampleView_->selectedIndexes().begin();
// expand a folder when clicked
if (exampleView_->model()->rowCount(selected) > 0
&& !exampleView_->isExpanded(selected))
exampleView_->setExpanded(selected, true);
// (for a file,) load data in source viewer
sourceView_->setIndex(selected);
}
std::string ExampleSourceViewer::deployPath_ [private] |
Definition at line 34 of file ExampleSourceViewer.h.
std::string ExampleSourceViewer::examplesRoot_ [private] |
Definition at line 35 of file ExampleSourceViewer.h.
std::string ExampleSourceViewer::examplesType_ [private] |
Definition at line 36 of file ExampleSourceViewer.h.
Wt::WTreeView* ExampleSourceViewer::exampleView_ [private] |
Definition at line 31 of file ExampleSourceViewer.h.
Definition at line 38 of file ExampleSourceViewer.h.
SourceView* ExampleSourceViewer::sourceView_ [private] |
Definition at line 32 of file ExampleSourceViewer.h.
1.7.5.1