Wt examples: /home/koen/project/wt/public-git/wt/examples/wt-homepage/WtHome.C Source File

Wt examples 3.3.0

- Main Page
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

/home/koen/project/wt/public-git/wt/examples/wt-homepage/WtHome.C
Go to the documentation of this file.

    00001 /*
    00002  * Copyright (C) 2008 Emweb bvba, Kessel-Lo, Belgium.
    00003  *
    00004  * See the LICENSE file for terms of use.
    00005  */
    00006
    00007 #include "WtHome.h"
    00008
    00009 #ifdef WT_EMWEB_BUILD
    00010 #include "QuoteForm.h"
    00011 #endif // WT_EMWEB_BUILD
    00012
    00013 #include <Wt/WAnchor>
    00014 #include <Wt/WEnvironment>
    00015 #include <Wt/WLogger>
    00016 #include <Wt/WMenuItem>
    00017 #include <Wt/WStackedWidget>
    00018 #include <Wt/WTable>
    00019 #include <Wt/WTabWidget>
    00020 #include <Wt/WText>
    00021 #include <Wt/WTreeNode>
    00022 #include <Wt/WViewWidget>
    00023 #include <Wt/WWidget>
    00024
    00025 #include "ExampleSourceViewer.h"
    00026
    00027 WtHome::WtHome(const WEnvironment& env)
    00028   : Home(env, "Wt, C++ Web Toolkit", "wt-home", "css/wt")
    00029 {
    00030   addLanguage(Lang("en", "/", "en", "English"));
    00031   addLanguage(Lang("cn", "/cn/", "汉语", "中文 (Chinese)"));
    00032   addLanguage(Lang("ru", "/ru/", "ру", "Русский (Russian)"));
    00033
    00034   char* wtExamplePath  = getenv("WT_EXAMPLE_PATH");
    00035   if (wtExamplePath)
    00036     wtExamplePath_ = wtExamplePath;
    00037   else
    00038     wtExamplePath_ = "..";
    00039
    00040   init();
    00041 }
    00042
    00043 WWidget *WtHome::example(const char *textKey, const std::string& sourceDir)
    00044 {
    00045   WContainerWidget *result = new WContainerWidget();
    00046   WText *w = new WText(tr(textKey), result);
    00047   w->setInternalPathEncoding(true);
    00048   result->addWidget(linkSourceBrowser(sourceDir));
    00049   return result;
    00050 }
    00051
    00052 WWidget *WtHome::helloWorldExample()
    00053 {
    00054   return example("home.examples.hello", "hello");
    00055 }
    00056
    00057 WWidget *WtHome::chartExample()
    00058 {
    00059   return example("home.examples.chart", "charts");
    00060 }
    00061
    00062 WWidget *WtHome::homepageExample()
    00063 {
    00064   return example("home.examples.wt", "wt-homepage");
    00065 }
    00066
    00067 WWidget *WtHome::treeviewExample()
    00068 {
    00069   return example("home.examples.treeview", "treeview-dragdrop");
    00070 }
    00071
    00072 WWidget *WtHome::gitExample()
    00073 {
    00074   return example("home.examples.git", "gitmodel");
    00075 }
    00076
    00077 WWidget *WtHome::chatExample()
    00078 {
    00079   return example("home.examples.chat", "simplechat");
    00080 }
    00081
    00082 WWidget *WtHome::composerExample()
    00083 {
    00084   return example("home.examples.composer", "composer");
    00085 }
    00086
    00087 WWidget *WtHome::widgetGalleryExample()
    00088 {
    00089   return example("home.examples.widgetgallery", "widgetgallery");
    00090 }
    00091
    00092 WWidget *WtHome::hangmanExample()
    00093 {
    00094   return example("home.examples.hangman", "hangman");
    00095 }
    00096
    00097 WWidget *WtHome::examples()
    00098 {
    00099   WContainerWidget *result = new WContainerWidget();
    00100
    00101   WText *intro = new WText(tr("home.examples"));
    00102   intro->setInternalPathEncoding(true);
    00103   result->addWidget(intro);
    00104
    00105   examplesMenu_ = new WTabWidget(result);
    00106
    00107   WAnimation animation(WAnimation::SlideInFromRight, WAnimation::EaseIn);
    00108   examplesMenu_->contentsStack()->setTransitionAnimation(animation, true);
    00109
    00110   /*
    00111    * The following code is functionally equivalent to:
    00112    *
    00113    *   examplesMenu_->addTab(helloWorldExample(), "Hello world");
    00114    *
    00115    * However, we optimize here for memory consumption (it is a homepage
    00116    * after all, and we hope to be slashdotted some day)
    00117    *
    00118    * Therefore, we wrap all the static content (including the tree
    00119    * widgets), into WViewWidgets with static models. In this way the
    00120    * widgets are not actually stored in memory on the server.
    00121    */
    00122
    00123   // The call ->setPathComponent() is to use "/examples/" instead of
    00124   // "/examples/hello_world" as internal path
    00125   examplesMenu_->addTab(wrapView(&WtHome::helloWorldExample),
    00126                         tr("hello-world"))->setPathComponent("");
    00127   examplesMenu_->addTab(wrapView(&WtHome::chartExample),
    00128                         tr("charts"));
    00129   examplesMenu_->addTab(wrapView(&WtHome::homepageExample),
    00130                         tr("wt-homepage"));
    00131   examplesMenu_->addTab(wrapView(&WtHome::treeviewExample),
    00132                         tr("treeview"));
    00133   examplesMenu_->addTab(wrapView(&WtHome::gitExample),
    00134                         tr("git"));
    00135   examplesMenu_->addTab(wrapView(&WtHome::chatExample),
    00136                         tr("chat"));
    00137   examplesMenu_->addTab(wrapView(&WtHome::composerExample),
    00138                         tr("mail-composer"));
    00139   examplesMenu_->addTab(wrapView(&WtHome::hangmanExample),
    00140                         tr("hangman"));
    00141   examplesMenu_->addTab(wrapView(&WtHome::widgetGalleryExample),
    00142                         tr("widget-gallery"));
    00143
    00144   // Enable internal paths for the example menu
    00145   examplesMenu_->setInternalPathEnabled("/examples");
    00146   examplesMenu_->currentChanged().connect(this, &Home::googleAnalyticsLogger);
    00147
    00148   return result;
    00149 }
    00150
    00151 WWidget *WtHome::createQuoteForm()
    00152 {
    00153 #ifdef WT_EMWEB_BUILD
    00154   return new QuoteForm(QuoteForm::Wt);
    00155 #else
    00156   return 0;
    00157 #endif
    00158 }
    00159
    00160 WWidget *WtHome::sourceViewer(const std::string& deployPath)
    00161 {
    00162   return new ExampleSourceViewer(deployPath, wtExamplePath_ + "/", "CPP");
    00163 }
    00164
    00165 WWidget *WtHome::wrapView(WWidget *(WtHome::*createWidget)())
    00166 {
    00167   return makeStaticModel(boost::bind(createWidget, this));
    00168 }
    00169
    00170 WApplication *createWtHomeApplication(const WEnvironment& env)
    00171 {
    00172   // support for old (< Wt-2.2) homepage URLS: redirect from "states"
    00173   // to "internal paths"
    00174   // this contains the initial "history state" in old Wt versions
    00175   const std::string *historyKey = env.getParameter("historyKey");
    00176
    00177   if (historyKey) {
    00178     const char *mainStr[]
    00179       = { "main:0", "/",
    00180           "main:1", "/news",
    00181           "main:2", "/features",
    00182           "main:4", "/examples",
    00183           "main:3", "/documentation",
    00184           "main:5", "/download",
    00185           "main:6", "/community" };
    00186
    00187     const char *exampleStr[]
    00188       = { "example:0", "/examples",
    00189           "example:1", "/examples/charts",
    00190           "example:2", "/examples/wt-homepage",
    00191           "example:3", "/examples/treelist",
    00192           "example:4", "/examples/hangman",
    00193           "example:5", "/examples/chat",
    00194           "example:6", "/examples/mail-composer",
    00195           "example:7", "/examples/drag-and-drop",
    00196           "example:8", "/examples/file-explorer",
    00197           "example:9", "/examples/calendar" };
    00198
    00199     if (historyKey->find("main:4") != std::string::npos) {
    00200       for (unsigned i = 0; i < 10; ++i)
    00201         if (historyKey->find(exampleStr[i*2]) != std::string::npos) {
    00202           WApplication *app = new WApplication(env);
    00203           app->log("notice") << "redirecting old style URL '"
    00204                              << *historyKey << "' to internal path: '"
    00205                              << exampleStr[i*2+1] << "'";
    00206           app->redirect(app->bookmarkUrl(exampleStr[i*2+1]));
    00207           app->quit();
    00208           return app;
    00209         }
    00210     } else
    00211       for (unsigned i = 0; i < 6; ++i)
    00212         if (historyKey->find(mainStr[i*2]) != std::string::npos) {
    00213           WApplication *app = new WApplication(env);
    00214
    00215           app->log("notice") << "redirecting old style URL '"
    00216                              << *historyKey << "' to internal path: '"
    00217                              << mainStr[i*2+1] << "'";
    00218           app->redirect(app->bookmarkUrl(mainStr[i*2+1]));
    00219           app->quit();
    00220           return app;
    00221         }
    00222
    00223     // unknown history key, just continue
    00224   }
    00225
    00226   return new WtHome(env);
    00227 }