10 #include <boost/lexical_cast.hpp>
11 #include <boost/tokenizer.hpp>
12 #include <boost/algorithm/string.hpp>
14 #include <Wt/WAnchor.h>
15 #include <Wt/WApplication.h>
16 #include <Wt/WEnvironment.h>
17 #include <Wt/WLogger.h>
19 #include <Wt/WPushButton.h>
20 #include <Wt/WStackedWidget.h>
21 #include <Wt/WTabWidget.h>
22 #include <Wt/WTable.h>
23 #include <Wt/WTableCell.h>
24 #include <Wt/WTemplate.h>
26 #include <Wt/WViewWidget.h>
27 #include <Wt/WVBoxLayout.h>
30 #include "view/BlogView.h"
41 Dbo::SqlConnectionPool& blogDb,
42 const std::string& title,
const std::string& resourceBundle,
43 const std::string& cssPath)
49 messageResourceBundle().use(appRoot() + resourceBundle,
false);
51 useStyleSheet(cssPath +
"/wt.css");
52 useStyleSheet(cssPath +
"/wt_ie.css",
"lt IE 7",
"all");
53 useStyleSheet(
"css/home.css");
54 useStyleSheet(
"css/sourceview.css");
55 useStyleSheet(
"css/chatwidget.css");
56 useStyleSheet(
"css/chatwidget_ie6.css",
"lt IE 7",
"all");
84 std::string base = internalPathNextPart(
"/");
93 auto layout = std::make_unique<WVBoxLayout>();
94 layout->setContentsMargins(0, 0, 0, 0);
97 layout->addWidget(std::move(source));
99 root()->setLayout(std::move(layout));
116 WTemplate *result = root()->addWidget(std::make_unique<WTemplate>(
tr(
"template")));
119 auto languagesDiv = std::make_unique<WContainerWidget>();
120 languagesDiv->setId(
"top_languages");
122 for (
unsigned i = 0; i <
languages.size(); ++i) {
124 languagesDiv->addWidget(std::make_unique<WText>(
"- "));
128 languagesDiv->addWidget(std::make_unique<WAnchor>(WLink(LinkType::InternalPath, l.
path_), l.
longDescription_));
131 auto contents = std::make_unique<WStackedWidget>();
132 WAnimation fade(AnimationEffect::Fade, TimingFunction::Linear, 250);
133 contents->setTransitionAnimation(fade);
134 contents->setId(
"main_page");
136 auto mainMenu = std::make_unique<WMenu>(contents.get());
146 ContentLoading::Eager);
150 ContentLoading::Eager);
154 ContentLoading::Eager)->setPathComponent(
"examples/");
158 ContentLoading::Eager);
162 ContentLoading::Eager);
166 ContentLoading::Eager);
177 result->bindWidget(
"languages", std::move(languagesDiv));
178 result->bindWidget(
"menu", std::move(mainMenu));
179 result->bindWidget(
"contents", std::move(contents));
190 std::string langPath = l.
path_;
191 mainMenu_->setInternalBasePath(langPath);
193 BlogView *
blog =
dynamic_cast<BlogView *
>(findWidget(
"blog"));
195 blog->setInternalBasePath(langPath +
"blog/");
210 std::unique_ptr<WText> a(std::make_unique<WText>(
tr(
"source-browser-link").arg(path)));
211 a->setInternalPathEncoding(
true);
217 std::string langPath = internalPathNextPart(
"/");
219 if (langPath.empty())
222 langPath =
'/' + langPath +
'/';
226 for (
unsigned i = 0; i <
languages.size(); ++i) {
240 setTitle(
tr(
"wt") +
" - " +
mainMenu_->currentItem()->text());
250 if (path.size() >= 4 && path.substr(0, 4) ==
"/src") {
257 return std::make_unique<WText>(
tr(
"home.intro"));
263 std::string langPath = l.
path_;
264 std::unique_ptr<BlogView>
blog
265 = std::make_unique<BlogView>(langPath +
"blog/",
267 blog->setObjectName(
"blog");
269 if (!
blog->user().empty())
274 return std::move(
blog);
279 WApplication::instance()->doJavaScript
280 (
"if (window.chat && window.chat.emit) {"
282 "" "window.chat.emit(window.chat, 'login', "
283 "" "" + userName.jsStringLiteral() +
"); "
285 "" "window.chatUser=" + userName.jsStringLiteral() +
";"
288 """window.chatUser=" + userName.jsStringLiteral() +
";");
293 return std::make_unique<WText>(
tr(
"home.status"));
298 return std::unique_ptr<WText>(std::make_unique<WText>(
tr(
"home.features")));
303 std::unique_ptr<WText> result
304 = std::make_unique<WText>(
tr(
"home.documentation"));
305 result->setInternalPathEncoding(
true);
306 return std::move(result);
311 return std::unique_ptr<WText>(std::make_unique<WText>(
tr(
"home.other-language")));
319 std::string
Home::href(
const std::string& url,
const std::string& description)
321 return "<a href=\"" + url +
"\" target=\"_blank\">" + description +
"</a>";
326 return std::make_unique<WText>(
tr(
"home.community"));
331 std::ifstream f((
filePrefix() +
"releases.txt").c_str());
333 releaseTable->clear();
335 releaseTable->elementAt(0, 0)
336 ->addWidget(std::make_unique<WText>(
tr(
"home.download.version")));
337 releaseTable->elementAt(0, 1)
338 ->addWidget(std::make_unique<WText>(
tr(
"home.download.date")));
339 releaseTable->elementAt(0, 2)
340 ->addWidget(std::make_unique<WText>(
tr(
"home.download.description")));
342 releaseTable->elementAt(0, 0)->resize(WLength(15, LengthUnit::FontEx),
344 releaseTable->elementAt(0, 1)->resize(WLength(15, LengthUnit::FontEx),
354 typedef boost::tokenizer<boost::escaped_list_separator<char> >
356 CsvTokenizer tok(line);
358 CsvTokenizer::iterator i=tok.begin();
360 std::string fileName = *i;
361 std::string description = *(++i);
362 releaseTable->elementAt(row, 1)->addWidget(std::make_unique<WText>(*(++i)));
363 releaseTable->elementAt(row, 2)->addWidget(std::make_unique<WText>(*(++i)));
366 std::string url =
"http://prdownloads.sourceforge.net/witty/"
367 + fileName +
"?download";
371 releaseTable->elementAt(row, 0)->addWidget
372 (std::make_unique<WText>(
href(url, description)));
379 #ifdef WT_EMWEB_BUILD
382 auto result = std::make_unique<WContainerWidget>();
383 result->setStyleClass(
"quote");
385 WTemplate *requestTemplate =
386 result->addWidget(std::make_unique<WTemplate>(
tr(
"quote.request")));
388 auto quoteButton = std::make_unique<WPushButton>(
tr(
"quote.requestbutton"));
389 auto quoteButtonPtr = requestTemplate->bindWidget(
"button", std::move(quoteButton));
393 quoteButtonPtr->clicked().connect(
quoteForm, &WWidget::show);
394 quoteButtonPtr->clicked().connect(requestTemplate, &WWidget::hide);
404 auto result = std::make_unique<WContainerWidget>();
405 result->addWidget(std::make_unique<WText>(
tr(
"home.download")));
407 result->addWidget(std::make_unique<WText>(
tr(
"home.download.license")));
409 #ifdef WT_EMWEB_BUILD
410 result->addWidget(std::move(
quoteForm()));
413 result->addWidget(std::make_unique<WText>(
tr(
"home.download.packages")));
415 auto releases = std::make_unique<WTable>();
417 releases_ = result->addWidget(std::move(releases));
419 result->addWidget(std::make_unique<WText>(
tr(
"home.download.other")));
421 return std::move(result);
427 return WString::tr(key);
432 doJavaScript(
"if (window.ga) ga('send','pageview',"
433 + WWebWidget::jsStringLiteral(environment().deploymentPath()
434 + internalPath()) +
");");
static const std::string SRC_INTERNAL_PATH
std::unique_ptr< DeferredWidget< Function > > deferCreate(Function f)
std::unique_ptr< WWidget > blog()
std::unique_ptr< WWidget > community()
std::unique_ptr< WWidget > linkSourceBrowser(const std::string &examplePath)
std::unique_ptr< WWidget > quoteForm()
std::unique_ptr< WWidget > download()
Home(const WEnvironment &env, Dbo::SqlConnectionPool &blogDb, const std::string &title, const std::string &resourceBundle, const std::string &cssPath)
WTabWidget * examplesMenu_
void googleAnalyticsLogger()
std::string href(const std::string &url, const std::string &description)
std::unique_ptr< WWidget > wrapView(std::unique_ptr< WWidget >(Home::*createFunction)())
std::unique_ptr< WWidget > otherLanguage()
void setLanguage(int language)
std::unique_ptr< WWidget > documentation()
Dbo::SqlConnectionPool & blogDb_
WString tr(const char *key)
virtual std::string filePrefix() const =0
std::unique_ptr< WWidget > features()
virtual std::unique_ptr< WWidget > sourceViewer(const std::string &deployPath)=0
void readReleases(WTable *releaseTable)
std::unique_ptr< WContainerWidget > sideBarContent_
std::unique_ptr< WWidget > status()
void logInternalPath(const std::string &path)
std::vector< Lang > languages
virtual std::unique_ptr< WWidget > createQuoteForm()=0
void setLanguageFromPath()
std::unique_ptr< WWidget > introduction()
void chatSetUser(const WString &name)
virtual std::unique_ptr< WWidget > examples()=0
std::unique_ptr< Wt::WApplication > createWidget(const Wt::WEnvironment &env, SimpleChatServer &server)
std::string longDescription_