00001
00002
00003
00004
00005
00006
00007 #include <fstream>
00008 #include <iostream>
00009
00010 #include <boost/lexical_cast.hpp>
00011 #include <boost/tokenizer.hpp>
00012
00013 #include <Wt/WAnchor>
00014 #include <Wt/WApplication>
00015 #include <Wt/WDatePicker>
00016 #include <Wt/WCalendar>
00017 #include <Wt/WEnvironment>
00018 #include <Wt/WIconPair>
00019 #include <Wt/WImage>
00020 #include <Wt/WLineEdit>
00021 #include <Wt/WLogger>
00022 #include <Wt/WMenu>
00023 #include <Wt/WPushButton>
00024 #include <Wt/WSignalMapper>
00025 #include <Wt/WStackedWidget>
00026 #include <Wt/WTabWidget>
00027 #include <Wt/WTable>
00028 #include <Wt/WTableCell>
00029 #include <Wt/WText>
00030 #include <Wt/WTreeNode>
00031 #include <Wt/WViewWidget>
00032
00033 #include "Home.h"
00034 #include "TreeListExample.h"
00035
00036 namespace {
00037 struct Lang {
00038 std::string code, path, shortDescription, longDescription;
00039 };
00040
00041 Lang l[] = {
00042 { "en", "/", "en", "English" },
00043 { "cn", "/cn/", "汉语", "中文 (Chinese)" }
00044 };
00045
00046 std::vector<Lang> languages(l, l + 2);
00047 }
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 template <typename Function>
00059 class DeferredWidget : public WContainerWidget
00060 {
00061 public:
00062 DeferredWidget(Function f)
00063 : f_(f) { }
00064
00065 private:
00066 void load() {
00067 addWidget(f_());
00068 }
00069
00070 Function f_;
00071 };
00072
00073 template <typename Function>
00074 DeferredWidget<Function> *deferCreate(Function f)
00075 {
00076 return new DeferredWidget<Function>(f);
00077 }
00078
00079
00080 class Div : public WContainerWidget
00081 {
00082 public:
00083 Div(WContainerWidget *parent, const std::string& id)
00084 : WContainerWidget(parent)
00085 {
00086 setId(id);
00087 }
00088 };
00089
00090 Home::Home(const WEnvironment& env)
00091 : WApplication(env),
00092 recentNews_(0),
00093 historicalNews_(0),
00094 releases_(0)
00095 {
00096 messageResourceBundle().use("wt-home", false);
00097 useStyleSheet("images/wt.css");
00098 useStyleSheet("images/wt_ie.css", "lt IE 7");
00099 useStyleSheet("home.css");
00100 setTitle("Wt, C++ Web Toolkit");
00101
00102 setLocale("");
00103 language_ = 0;
00104
00105 Div *topWrapper = new Div(root(), "top_wrapper");
00106 Div *topContent = new Div(topWrapper, "top_content");
00107
00108 Div *languagesDiv = new Div(topContent, "top_languages");
00109
00110 WSignalMapper<int> *lmap = new WSignalMapper<int>(this);
00111 lmap->mapped.connect(SLOT(this, Home::changeLanguage));
00112
00113 for (unsigned i = 0; i < languages.size(); ++i) {
00114 if (i != 0)
00115 new WText("- ", languagesDiv);
00116
00117 const Lang& l = languages[i];
00118
00119 WAnchor *a = new WAnchor(bookmarkUrl(l.path), l.longDescription,
00120 languagesDiv);
00121
00122 lmap->mapConnect(a->clicked, i);
00123 }
00124
00125 WText *topWt = new WText(tr("top_wt"), topContent);
00126 topWt->setInline(false);
00127 topWt->setId("top_wt");
00128
00129 WText *bannerWt = new WText(tr("banner_wrapper"), root());
00130 bannerWt->setId("banner_wrapper");
00131
00132 Div *mainWrapper = new Div(root(), "main_wrapper");
00133 Div *mainContent = new Div(mainWrapper, "main_content");
00134 Div *mainMenu = new Div(mainContent, "main_menu");
00135
00136 WStackedWidget *contents = new WStackedWidget();
00137 contents->setId("main_page");
00138
00139 mainMenu_ = new WMenu(contents, Vertical, mainMenu);
00140 mainMenu_->setRenderAsList(true);
00141
00142
00143 mainMenu_->addItem
00144 (tr("introduction"), introduction())->setPathComponent("");
00145 mainMenu_->addItem
00146 (tr("news"), deferCreate(boost::bind(&Home::news, this)),
00147 WMenuItem::PreLoading);
00148 mainMenu_->addItem
00149 (tr("features"), wrapViewOrDefer(&Home::features),
00150 WMenuItem::PreLoading);
00151 mainMenu_->addItem
00152 (tr("documentation"), wrapViewOrDefer(&Home::documentation),
00153 WMenuItem::PreLoading);
00154 mainMenu_->addItem
00155 (tr("examples"), examples(),
00156 WMenuItem::PreLoading);
00157 mainMenu_->addItem
00158 (tr("download"), deferCreate(boost::bind(&Home::download, this)),
00159 WMenuItem::PreLoading);
00160 mainMenu_->addItem
00161 (tr("community"), wrapViewOrDefer(&Home::community),
00162 WMenuItem::PreLoading);
00163
00164 mainMenu_->itemSelectRendered.connect(SLOT(this, Home::updateTitle));
00165 mainMenu_->itemSelected.connect(SLOT(this, Home::logInternalPath));
00166 mainMenu_->select((int)0);
00167
00168
00169 mainMenu_->setInternalPathEnabled();
00170 mainMenu_->setInternalBasePath("/");
00171
00172 sideBarContent_ = new WContainerWidget(mainMenu);
00173
00174 mainContent->addWidget(contents);
00175 WContainerWidget *clearAll = new WContainerWidget(mainContent);
00176 clearAll->setStyleClass("clearall");
00177
00178 WText *footerWrapper = new WText(tr("footer_wrapper"), root());
00179 footerWrapper->setId("footer_wrapper");
00180
00181 internalPathChanged.connect(SLOT(this, Home::setLanguageFromPath));
00182 }
00183
00184 void Home::changeLanguage(int index)
00185 {
00186 if (index == language_)
00187 return;
00188
00189 int prevLanguage = language_;
00190
00191 setLanguage(index);
00192
00193 std::string langPath = languages[index].path;
00194 if (internalPath().empty())
00195 setInternalPath(langPath);
00196 else {
00197 std::string prevLangPath = languages[prevLanguage].path;
00198 std::string path = internalPath().substr(prevLangPath.length());
00199 setInternalPath(langPath + path);
00200 }
00201 }
00202
00203 void Home::setLanguage(int index)
00204 {
00205 const Lang& l = languages[index];
00206
00207 setLocale(l.code);
00208
00209 std::string langPath = l.path;
00210 mainMenu_->setInternalBasePath(langPath);
00211 examplesMenu_->setInternalBasePath(langPath + "examples");
00212 updateTitle();
00213
00214 language_ = index;
00215 }
00216
00217 void Home::setLanguageFromPath(std::string prefix)
00218 {
00219 if (prefix == "/") {
00220 std::string langPath = internalPathNextPart(prefix);
00221
00222 if (langPath.empty())
00223 langPath = '/';
00224 else
00225 langPath = '/' + langPath + '/';
00226
00227 int newLanguage = 0;
00228
00229 for (unsigned i = 0; i < languages.size(); ++i) {
00230 if (languages[i].path == langPath) {
00231 newLanguage = i;
00232 break;
00233 }
00234 }
00235
00236 if (newLanguage != language_)
00237 setLanguage(newLanguage);
00238 }
00239 }
00240
00241 void Home::updateTitle()
00242 {
00243 setTitle(tr("wt") + " - " + mainMenu_->currentItem()->text());
00244 }
00245
00246 void Home::logInternalPath()
00247 {
00248
00249 log("path") << internalPath();
00250 }
00251
00252 WWidget *Home::introduction()
00253 {
00254 return new WText(tr("home.intro"));
00255 }
00256
00257 void Home::refresh()
00258 {
00259 if (recentNews_)
00260 readNews(recentNews_, "latest-news.txt");
00261
00262 if (historicalNews_)
00263 readNews(historicalNews_, "historical-news.txt");
00264
00265 if (releases_)
00266 readReleases(releases_, "releases.txt");
00267
00268 WApplication::refresh();
00269 }
00270
00271 WWidget *Home::news()
00272 {
00273 WContainerWidget *result = new WContainerWidget();
00274
00275 result->addWidget(new WText(tr("home.news")));
00276
00277 result->addWidget(new WText(tr("home.latest-news")));
00278 recentNews_ = new WTable();
00279 readNews(recentNews_, "latest-news.txt");
00280 result->addWidget(recentNews_);
00281
00282 result->addWidget(new WText(tr("home.historical-news")));
00283 historicalNews_ = new WTable();
00284 readNews(historicalNews_, "historical-news.txt");
00285 result->addWidget(historicalNews_);
00286
00287 return result;
00288 }
00289
00290 WWidget *Home::status()
00291 {
00292 return new WText(tr("home.status"));
00293 }
00294
00295 WWidget *Home::features()
00296 {
00297 return new WText(tr("home.features"));
00298 }
00299
00300 WWidget *Home::documentation()
00301 {
00302 return new WText(tr("home.documentation"));
00303 }
00304
00305 WWidget *Home::helloWorldExample()
00306 {
00307 WContainerWidget *result = new WContainerWidget();
00308
00309 new WText(tr("home.examples.hello"), result);
00310
00311 WTreeNode *tree = makeTreeMap("Hello world", 0);
00312 makeTreeFile("hello.C", tree);
00313
00314 tree->expand();
00315
00316 result->addWidget(tree);
00317
00318 return result;
00319 }
00320
00321 WWidget *Home::homepageExample()
00322 {
00323 WContainerWidget *result = new WContainerWidget();
00324
00325 new WText(tr("home.examples.wt"), result);
00326
00327 WTreeNode *tree = makeTreeMap("Wt Homepage", 0);
00328 WTreeNode *home = makeTreeMap("class Home", tree);
00329 makeTreeFile("Home.h", home);
00330 makeTreeFile("Home.C", home);
00331 WTreeNode *treeexample = makeTreeMap("class TreeListExample", tree);
00332 makeTreeFile("TreeListExample.h", treeexample);
00333 makeTreeFile("TreeListExample.C", treeexample);
00334 makeTreeFile("wt-home.xml", tree);
00335
00336 tree->expand();
00337
00338 result->addWidget(tree);
00339
00340 return result;
00341 }
00342
00343 WWidget *Home::chartExample()
00344 {
00345 WContainerWidget *result = new WContainerWidget();
00346
00347 new WText(tr("home.examples.chart"), result);
00348
00349 WTreeNode *tree = makeTreeMap("Chart example", 0);
00350 WTreeNode *chartsExample = makeTreeMap("class ChartsExample", tree);
00351 makeTreeFile("ChartsExample.h", chartsExample);
00352 makeTreeFile("ChartsExample.C", chartsExample);
00353 WTreeNode *chartConfig = makeTreeMap("class ChartConfig", tree);
00354 makeTreeFile("ChartConfig.h", chartConfig);
00355 makeTreeFile("ChartConfig.C", chartConfig);
00356 WTreeNode *panelList = makeTreeMap("class PanelList", tree);
00357 makeTreeFile("PanelList.h", panelList);
00358 makeTreeFile("PanelList.C", panelList);
00359 makeTreeFile("CsvUtil.C", tree);
00360 makeTreeFile("charts.xml", tree);
00361 makeTreeFile("charts.css", tree);
00362
00363 tree->expand();
00364
00365 result->addWidget(tree);
00366
00367 return result;
00368 }
00369
00370 WWidget *Home::treelistExample()
00371 {
00372 WContainerWidget *result = new WContainerWidget();
00373
00374 new WText(tr("home.examples.treelist"), result);
00375 new TreeListExample(result);
00376 new WText(tr("home.examples.treelist-remarks"), result);
00377
00378 return result;
00379 }
00380
00381 WWidget *Home::hangmanExample()
00382 {
00383 WContainerWidget *result = new WContainerWidget();
00384
00385 new WText(tr("home.examples.hangman"), result);
00386
00387 WTreeNode *tree = makeTreeMap("Hangman game", 0);
00388 tree->setLoadPolicy(WTreeNode::PreLoading);
00389
00390 WTreeNode *widgets = makeTreeMap("Widgets", tree);
00391 WTreeNode *loginwidget = makeTreeMap("class LoginWidget", widgets);
00392 makeTreeFile("LoginWidget.h", loginwidget);
00393 makeTreeFile("LoginWidget.C", loginwidget);
00394 WTreeNode *hangmanwidget = makeTreeMap("class HangmanWidget", widgets);
00395 makeTreeFile("HangmanWidget.h", hangmanwidget);
00396 makeTreeFile("HangmanWidget.C", hangmanwidget);
00397 WTreeNode *highscoreswidget = makeTreeMap("class HighScoresWidget", widgets);
00398 makeTreeFile("HighScoresWidget.h", highscoreswidget);
00399 makeTreeFile("HighScoresWidget.C", highscoreswidget);
00400 WTreeNode *hangmangame = makeTreeMap("class HangmanGame", widgets);
00401 makeTreeFile("HangmanGame.h", hangmangame);
00402 makeTreeFile("HangmanGame.C", hangmangame);
00403 WTreeNode *other = makeTreeMap("Other", tree);
00404 WTreeNode *hangmandb = makeTreeMap("class HangmanDb", other);
00405 makeTreeFile("HangmanDb.h", hangmandb);
00406 makeTreeFile("HangmanDb.C", hangmandb);
00407 WTreeNode *dictionary = makeTreeMap("class Dictionary", other);
00408 makeTreeFile("Dictionary.h", dictionary);
00409 makeTreeFile("Dictionary.C", dictionary);
00410 makeTreeFile("hangman.C", other);
00411
00412 tree->expand();
00413
00414 result->addWidget(tree);
00415
00416 return result;
00417 }
00418
00419 WWidget *Home::composerExample()
00420 {
00421 WContainerWidget *result = new WContainerWidget();
00422
00423 new WText(tr("home.examples.composer"), result);
00424
00425 WTreeNode *tree = makeTreeMap("Mail composer example", 0);
00426
00427 WTreeNode *classMap;
00428 classMap = makeTreeMap("class AddresseeEdit", tree);
00429 makeTreeFile("AddresseeEdit.h", classMap);
00430 makeTreeFile("AddresseeEdit.C", classMap);
00431 classMap = makeTreeMap("class AttachmentEdit", tree);
00432 makeTreeFile("AttachmentEdit.h", classMap);
00433 makeTreeFile("AttachmentEdit.C", classMap);
00434 classMap = makeTreeMap("class ComposeExample", tree);
00435 makeTreeFile("ComposeExample.h", classMap);
00436 makeTreeFile("ComposeExample.C", classMap);
00437 classMap = makeTreeMap("class Composer", tree);
00438 makeTreeFile("Composer.h", classMap);
00439 makeTreeFile("Composer.C", classMap);
00440 classMap = makeTreeMap("class ContactSuggestions", tree);
00441 makeTreeFile("ContactSuggestions.h", classMap);
00442 makeTreeFile("ContactSuggestions.C", classMap);
00443 classMap = makeTreeMap("class Label", tree);
00444 makeTreeFile("Label.h", classMap);
00445 makeTreeFile("Label.C", classMap);
00446 classMap = makeTreeMap("class Option", tree);
00447 makeTreeFile("Option.h", classMap);
00448 makeTreeFile("Option.C", classMap);
00449 classMap = makeTreeMap("class OptionList", tree);
00450 makeTreeFile("OptionList.h", classMap);
00451 makeTreeFile("OptionList.C", classMap);
00452 makeTreeFile("Contact.h", tree);
00453 makeTreeFile("Attachment.h", tree);
00454 makeTreeFile("composer.xml", tree);
00455 makeTreeFile("composer.css", tree);
00456
00457 tree->expand();
00458
00459 result->addWidget(tree);
00460
00461 return result;
00462 }
00463
00464 WWidget *Home::dragdropExample()
00465 {
00466 WContainerWidget *result = new WContainerWidget();
00467
00468 new WText(tr("home.examples.dragdrop"), result);
00469
00470 WTreeNode *tree = makeTreeMap("DragDrop example", 0);
00471
00472 WTreeNode *classMap;
00473 classMap = makeTreeMap("class Character", tree);
00474 makeTreeFile("Character.h", classMap);
00475 makeTreeFile("Character.C", classMap);
00476 makeTreeFile("DragExample.C", tree);
00477 makeTreeFile("dragdrop.css", tree);
00478
00479 tree->expand();
00480
00481 result->addWidget(tree);
00482
00483 return result;
00484 }
00485
00486 WWidget *Home::chatExample()
00487 {
00488 WContainerWidget *result = new WContainerWidget();
00489
00490 new WText(tr("home.examples.chat"), result);
00491
00492 WTreeNode *tree = makeTreeMap("Chat example", 0);
00493
00494 WTreeNode *classMap;
00495 classMap = makeTreeMap("class SimpleChatWidget", tree);
00496 makeTreeFile("SimpleChatWidget.h", classMap);
00497 makeTreeFile("SimpleChatWidget.C", classMap);
00498 classMap = makeTreeMap("class SimpleChatServer", tree);
00499 makeTreeFile("SimpleChatServer.h", classMap);
00500 makeTreeFile("SimpleChatServer.C", classMap);
00501 makeTreeFile("simpleChat.C", tree);
00502 makeTreeFile("simplechat.css", tree);
00503 makeTreeFile("simplechat.xml", tree);
00504
00505 tree->expand();
00506
00507 result->addWidget(tree);
00508
00509 return result;
00510 }
00511
00512 WWidget *Home::fileExplorerExample()
00513 {
00514 WContainerWidget *result = new WContainerWidget();
00515
00516 new WText(tr("home.examples.fileexplorer"), result);
00517
00518 WTreeNode *tree = makeTreeMap("File explorer example", 0);
00519
00520 WTreeNode *classMap;
00521 classMap = makeTreeMap("class FileTreeTableNode", tree);
00522 makeTreeFile("FileTreeTableNode.h", classMap);
00523 makeTreeFile("FileTreeTableNode.C", classMap);
00524 classMap = makeTreeMap("class FileTreeTable", tree);
00525 makeTreeFile("FileTreeTable.h", classMap);
00526 makeTreeFile("FileTreeTable.C", classMap);
00527 makeTreeFile("FileTreeExample.C", tree);
00528 makeTreeFile("filetree.css", tree);
00529
00530 tree->expand();
00531
00532 result->addWidget(tree);
00533
00534 return result;
00535 }
00536
00537 WWidget *Home::calendarExample()
00538 {
00539 WContainerWidget *result = new WContainerWidget();
00540
00541 new WText(tr("home.examples.calendar"), result);
00542
00543 new WText(tr("home.examples.calendar.datepicker"), result);
00544
00545 WTable *tab = new WTable(result);
00546 new WText(tr("home.examples.calendar.enter-birth-date"),
00547 tab->elementAt(0, 0));
00548 WLineEdit *dateEdit = new WLineEdit(tab->elementAt(0, 1));
00549 dateEdit->setMargin(5, Right);
00550
00551 new WDatePicker(new WPushButton("..."), dateEdit,
00552 false, tab->elementAt(0, 1));
00553 tab->elementAt(0, 0)->setPadding(8);
00554 tab->elementAt(0, 1)->setPadding(8);
00555
00556 new WText(tr("home.examples.calendar.plain"), result);
00557 WCalendar *cal = new WCalendar(false, result);
00558 cal->setMargin(8);
00559
00560 new WText(tr("home.examples.calendar.multi"), result);
00561 cal = new WCalendar(false, result);
00562 cal->setMultipleSelection(true);
00563 cal->setMargin(8);
00564
00565 return result;
00566 }
00567
00568 WWidget *Home::wrapViewOrDefer(WWidget *(Home::*createWidget)())
00569 {
00570
00571
00572
00573
00574
00575
00576
00577 if (!environment().agentIEMobile()
00578 && environment().javaScript())
00579 return makeStaticModel(boost::bind(createWidget, this));
00580 else
00581 return deferCreate(boost::bind(createWidget, this));
00582 }
00583
00584 WWidget *Home::examples()
00585 {
00586 WContainerWidget *result = new WContainerWidget();
00587
00588 result->addWidget(new WText(tr("home.examples")));
00589
00590 examplesMenu_ = new WTabWidget(result);
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611 examplesMenu_->addTab(wrapViewOrDefer(&Home::helloWorldExample),
00612 tr("hello-world"))->setPathComponent("");
00613
00614 examplesMenu_->addTab(wrapViewOrDefer(&Home::chartExample),
00615 tr("charts"));
00616 examplesMenu_->addTab(wrapViewOrDefer(&Home::homepageExample),
00617 tr("wt-homepage"));
00618 examplesMenu_->addTab(deferCreate(boost::bind(&Home::treelistExample, this)),
00619 tr("treelist"));
00620 examplesMenu_->addTab(wrapViewOrDefer(&Home::hangmanExample),
00621 tr("hangman"));
00622 examplesMenu_->addTab(wrapViewOrDefer(&Home::chatExample),
00623 tr("chat"));
00624 examplesMenu_->addTab(wrapViewOrDefer(&Home::composerExample),
00625 tr("mail-composer"));
00626 examplesMenu_->addTab(wrapViewOrDefer(&Home::dragdropExample),
00627 tr("drag-and-drop"));
00628 examplesMenu_->addTab(wrapViewOrDefer(&Home::fileExplorerExample),
00629 tr("file-explorer"));
00630 examplesMenu_->addTab(deferCreate(boost::bind(&Home::calendarExample, this)),
00631 tr("calendar"));
00632
00633 examplesMenu_->currentChanged.connect(SLOT(this, Home::logInternalPath));
00634
00635
00636 examplesMenu_->setInternalPathEnabled();
00637 examplesMenu_->setInternalBasePath("/examples");
00638
00639 return result;
00640 }
00641
00642 WWidget *Home::download()
00643 {
00644 WContainerWidget *result = new WContainerWidget();
00645 result->addWidget(new WText(tr("home.download")));
00646 result->addWidget(new WText(tr("home.download.license")));
00647 result->addWidget(new WText(tr("home.download.requirements")));
00648 result->addWidget(new WText(tr("home.download.cvs")));
00649 result->addWidget(new WText(tr("home.download.packages")));
00650
00651 releases_ = new WTable();
00652 readReleases(releases_, "releases.txt");
00653 result->addWidget(releases_);
00654
00655 result->addWidget
00656 (new WText("<p>Older releases are still available at "
00657 + href("http://sourceforge.net/project/showfiles.php?"
00658 "group_id=153710#files",
00659 "sourceforge.net")
00660 + "</p>"));
00661
00662 return result;
00663 }
00664
00665 std::string Home::href(const std::string url, const std::string description)
00666 {
00667 return "<a href=\"" + url + "\" target=\"_blank\">" + description + "</a>";
00668 }
00669
00670 WWidget *Home::community()
00671 {
00672 return new WText(tr("home.community"));
00673 }
00674
00675 void Home::readNews(WTable *newsTable, const std::string newsfile)
00676 {
00677 std::ifstream f(newsfile.c_str());
00678
00679 newsTable->clear();
00680
00681 int row = 0;
00682
00683 while (f) {
00684 std::string line;
00685 getline(f, line);
00686
00687 if (f) {
00688 typedef boost::tokenizer<boost::escaped_list_separator<char> >
00689 CsvTokenizer;
00690 CsvTokenizer tok(line);
00691
00692 CsvTokenizer::iterator i=tok.begin();
00693
00694 newsTable->elementAt(row, 0)->
00695 addWidget(new WText("<p><b>" + *i + "</b></p>"));
00696 newsTable->elementAt(row, 0)
00697 ->setContentAlignment(AlignCenter | AlignTop);
00698 newsTable->elementAt(row, 0)
00699 ->resize(WLength(16, WLength::FontEx), WLength());
00700 newsTable
00701 ->elementAt(row, 1)->addWidget(new WText("<p>" + *(++i) + "</p>"));
00702
00703 ++row;
00704 }
00705 }
00706 }
00707
00708 void Home::readReleases(WTable *releaseTable, const std::string releasefile)
00709 {
00710 std::ifstream f(releasefile.c_str());
00711
00712 releaseTable->clear();
00713
00714 releaseTable->elementAt(0, 0)
00715 ->addWidget(new WText(tr("home.download.version")));
00716 releaseTable->elementAt(0, 1)
00717 ->addWidget(new WText(tr("home.download.date")));
00718 releaseTable->elementAt(0, 2)
00719 ->addWidget(new WText(tr("home.download.description")));
00720
00721 releaseTable->elementAt(0, 0)->resize(WLength(10, WLength::FontEx),
00722 WLength());
00723 releaseTable->elementAt(0, 1)->resize(WLength(15, WLength::FontEx),
00724 WLength());
00725
00726 int row = 1;
00727
00728 while (f) {
00729 std::string line;
00730 getline(f, line);
00731
00732 if (f) {
00733 typedef boost::tokenizer<boost::escaped_list_separator<char> >
00734 CsvTokenizer;
00735 CsvTokenizer tok(line);
00736
00737 CsvTokenizer::iterator i=tok.begin();
00738
00739 std::string version = *i;
00740 releaseTable->elementAt(row, 0)->addWidget
00741 (new WText(href("http://prdownloads.sourceforge.net/witty/wt-"
00742 + version + ".tar.gz?download", "Wt " + version)));
00743 releaseTable->elementAt(row, 1)->addWidget(new WText(*(++i)));
00744 releaseTable->elementAt(row, 2)->addWidget(new WText(*(++i)));
00745
00746 ++row;
00747 }
00748 }
00749 }
00750
00751 WTreeNode *Home::makeTreeMap(const std::string name, WTreeNode *parent)
00752 {
00753 WIconPair *labelIcon
00754 = new WIconPair("icons/yellow-folder-closed.png",
00755 "icons/yellow-folder-open.png", false);
00756
00757 WTreeNode *node = new WTreeNode(name, labelIcon, parent);
00758 node->label()->setFormatting(WText::PlainFormatting);
00759
00760 if (!parent) {
00761 node->setImagePack("icons/");
00762 node->expand();
00763 node->setLoadPolicy(WTreeNode::NextLevelLoading);
00764 }
00765
00766 return node;
00767 }
00768
00769 WTreeNode *Home::makeTreeFile(const std::string name, WTreeNode *parent)
00770 {
00771 WIconPair *labelIcon
00772 = new WIconPair("icons/document.png",
00773 "icons/yellow-folder-open.png", false);
00774
00775 return new WTreeNode("<a href=\"" + fixRelativeUrl("wt/src/" + name)
00776 + "\" target=\"_blank\">"
00777 + name + "</a>", labelIcon, parent);
00778 }
00779
00780 WString Home::tr(const char *key)
00781 {
00782 return WString::tr(key);
00783 }
00784
00785 WApplication *createApplication(const WEnvironment& env)
00786 {
00787 try {
00788
00789
00790
00791 std::string historyKey = env.getArgument("historyKey")[0];
00792
00793 const char *mainStr[]
00794 = { "main:0", "/",
00795 "main:1", "/news",
00796 "main:2", "/features",
00797 "main:4", "/examples",
00798 "main:3", "/documentation",
00799 "main:5", "/download",
00800 "main:6", "/community" };
00801
00802 const char *exampleStr[]
00803 = { "example:0", "/examples",
00804 "example:1", "/examples/charts",
00805 "example:2", "/examples/wt-homepage",
00806 "example:3", "/examples/treelist",
00807 "example:4", "/examples/hangman",
00808 "example:5", "/examples/chat",
00809 "example:6", "/examples/mail-composer",
00810 "example:7", "/examples/drag-and-drop",
00811 "example:8", "/examples/file-explorer",
00812 "example:9", "/examples/calendar" };
00813
00814 if (historyKey.find("main:4") != std::string::npos) {
00815 for (unsigned i = 0; i < 10; ++i)
00816 if (historyKey.find(exampleStr[i*2]) != std::string::npos) {
00817 WApplication *app = new WApplication(env);
00818 app->log("notice") << "redirecting old style URL '"
00819 << historyKey << "' to internal path: '"
00820 << exampleStr[i*2+1] << "'";
00821 app->redirect(app->bookmarkUrl(exampleStr[i*2+1]));
00822 app->quit();
00823 return app;
00824 }
00825 } else
00826 for (unsigned i = 0; i < 6; ++i)
00827 if (historyKey.find(mainStr[i*2]) != std::string::npos) {
00828 WApplication *app = new WApplication(env);
00829
00830 app->log("notice") << "redirecting old style URL '"
00831 << historyKey << "' to internal path: '"
00832 << mainStr[i*2+1] << "'";
00833 app->redirect(app->bookmarkUrl(mainStr[i*2+1]));
00834 app->quit();
00835 return app;
00836 }
00837
00838
00839 } catch (std::runtime_error) {
00840
00841 }
00842
00843 return new Home(env);
00844 }
00845
00846 int main(int argc, char **argv)
00847 {
00848 return WRun(argc, argv, &createApplication);
00849 }
00850