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"
42 const std::string& title,
const std::string& resourceBundle,
43 const std::string& cssPath)
93 auto layout = std::make_unique<WVBoxLayout>();
94 layout->setContentsMargins(0, 0, 0, 0);
97 layout->addWidget(std::move(source));
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>(
"- "));
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);
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_;
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);
219 if (langPath.empty())
222 langPath =
'/' + langPath +
'/';
226 for (
unsigned i = 0; i <
languages.size(); ++i) {
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', "
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();
336 ->
addWidget(std::make_unique<WText>(
tr(
"home.download.version")));
338 ->
addWidget(std::make_unique<WText>(
tr(
"home.download.date")));
340 ->
addWidget(std::make_unique<WText>(
tr(
"home.download.description")));
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);
366 std::string
url =
"http://prdownloads.sourceforge.net/witty/"
367 + fileName +
"?download";
372 (std::make_unique<WText>(
href(
url, description)));
379 #ifdef WT_EMWEB_BUILD
382 auto result = std::make_unique<WContainerWidget>();
383 result->setStyleClass(
"quote");
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);
433 + WWebWidget::jsStringLiteral(
environment().deploymentPath()
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
virtual Wt::Signals::connection connect(WObject *target, WObject::Method method) override
WWidget * findWidget(const std::string &name)
void doJavaScript(const std::string &javascript, bool afterLoaded=true)
std::string internalPath() const
WContainerWidget * root() const
const WString & title() const
WMessageResourceBundle & messageResourceBundle()
Signal< std::string > & internalPathChanged()
std::string internalPathNextPart(const std::string &path) const
void setTitle(const WString &title)
static std::string appRoot()
void useStyleSheet(const WLink &link, const std::string &media="all")
WLogEntry log(const std::string &type) const
std::string url(const std::string &internalPath=std::string()) const
const WEnvironment & environment() const
void setLocale(const WLocale &locale, bool doRefresh=true)
void use(const std::string &path, bool loadInMemory=true)
std::unique_ptr< WObject > removeChild(WObject *child)
std::string jsStringLiteral(char delimiter='\'') const
WTableCell * elementAt(int row, int column)
virtual void bindWidget(const std::string &varName, std::unique_ptr< WWidget > widget)
std::unique_ptr< Wt::WApplication > createWidget(const Wt::WEnvironment &env, SimpleChatServer &server)
std::string longDescription_