Wt examples  3.3.5
Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes
Home Class Reference

#include <Home.h>

Inheritance diagram for Home:
Inheritance graph
[legend]

List of all members.

Public Member Functions

 Home (const WEnvironment &env, Wt::Dbo::SqlConnectionPool &blogDb, const std::string &title, const std::string &resourceBundle, const std::string &cssPath)
virtual ~Home ()
void googleAnalyticsLogger ()

Protected Member Functions

virtual WWidget * examples ()=0
virtual WWidget * createQuoteForm ()=0
virtual WWidget * sourceViewer (const std::string &deployPath)=0
virtual std::string filePrefix () const =0
void init ()
void addLanguage (const Lang &l)
WWidget * linkSourceBrowser (const std::string &examplePath)
WString tr (const char *key)
std::string href (const std::string &url, const std::string &description)
void readReleases (WTable *releaseTable)

Protected Attributes

WTabWidget * examplesMenu_
WTable * releases_

Private Member Functions

void createHome ()
WWidget * introduction ()
WWidget * blog ()
WWidget * status ()
WWidget * features ()
WWidget * documentation ()
WWidget * community ()
WWidget * otherLanguage ()
WWidget * download ()
WWidget * quoteForm ()
void readNews (WTable *newsTable, const std::string &newsfile)
WWidget * wrapView (WWidget *(Home::*createFunction)())
void updateTitle ()
void setLanguage (int language)
void setLanguageFromPath ()
void setup ()
void logInternalPath (const std::string &path)
void chatSetUser (const WString &name)

Private Attributes

Wt::Dbo::SqlConnectionPool & blogDb_
WWidget * homePage_
WWidget * sourceViewer_
WStackedWidget * contents_
WMenu * mainMenu_
int language_
WContainerWidget * sideBarContent_
std::vector< Langlanguages

Detailed Description

Definition at line 67 of file Home.h.


Constructor & Destructor Documentation

Home::Home ( const WEnvironment &  env,
Wt::Dbo::SqlConnectionPool &  blogDb,
const std::string &  title,
const std::string &  resourceBundle,
const std::string &  cssPath 
)

Definition at line 38 of file Home.C.

  : WApplication(env),
    releases_(0),
    blogDb_(blogDb),
    homePage_(0),
    sourceViewer_(0)
{
  messageResourceBundle().use(appRoot() + resourceBundle, false);

  useStyleSheet(cssPath + "/wt.css");
  useStyleSheet(cssPath + "/wt_ie.css", "lt IE 7", "all");
  useStyleSheet("css/home.css");
  useStyleSheet("css/sourceview.css");
  useStyleSheet("css/chatwidget.css");
  useStyleSheet("css/chatwidget_ie6.css", "lt IE 7", "all");
  setTitle(title);

  setLocale("");
  language_ = 0;
}
Home::~Home ( ) [virtual]

Definition at line 34 of file Home.C.

{
}

Member Function Documentation

void Home::addLanguage ( const Lang l) [inline, protected]

Definition at line 86 of file Home.h.

{ languages.push_back(l); }
WWidget * Home::blog ( ) [private]

Definition at line 258 of file Home.C.

{
  const Lang& l = languages[language_];
  std::string langPath = l.path_;
  BlogView *blog = new BlogView(langPath + "blog/",
                                blogDb_, "/wt/blog/feed/");
  blog->setObjectName("blog");

  if (!blog->user().empty())
    chatSetUser(blog->user());

  blog->userChanged().connect(this, &Home::chatSetUser);

  return blog;
}
void Home::chatSetUser ( const WString &  name) [private]

Definition at line 274 of file Home.C.

{
  WApplication::instance()->doJavaScript
    ("if (window.chat && window.chat.emit) {"
     """try {"
     ""  "window.chat.emit(window.chat, 'login', "
     ""                    "" + userName.jsStringLiteral() + "); "
     """} catch (e) {"
     ""  "window.chatUser=" + userName.jsStringLiteral() + ";"
     """}"
     "} else "
     """window.chatUser=" + userName.jsStringLiteral() + ";");
}
WWidget * Home::community ( ) [private]

Definition at line 320 of file Home.C.

{
  return new WText(tr("home.community"));
}
void Home::createHome ( ) [private]

Definition at line 113 of file Home.C.

{
  WTemplate *result = new WTemplate(tr("template"), root());
  homePage_ = result;

  WContainerWidget *languagesDiv = new WContainerWidget();
  languagesDiv->setId("top_languages");

  for (unsigned i = 0; i < languages.size(); ++i) {
    if (i != 0)
      new WText("- ", languagesDiv);

    const Lang& l = languages[i];

    new WAnchor(WLink(WLink::InternalPath, l.path_),
                WString::fromUTF8(l.longDescription_), languagesDiv);
  }

  WStackedWidget *contents = new WStackedWidget();
  WAnimation fade(WAnimation::Fade, WAnimation::Linear, 250);
  contents->setTransitionAnimation(fade);
  contents->setId("main_page");

  mainMenu_ = new WMenu(contents, Vertical);

  mainMenu_->addItem
    (tr("introduction"), introduction())->setPathComponent("");

  mainMenu_->addItem
    (tr("blog"), deferCreate(boost::bind(&Home::blog, this)));

  mainMenu_->addItem
    (tr("features"), wrapView(&Home::features), WMenuItem::PreLoading);

  mainMenu_->addItem
    (tr("documentation"), wrapView(&Home::documentation),
     WMenuItem::PreLoading);

  mainMenu_->addItem
    (tr("examples"), examples(),
     WMenuItem::PreLoading)->setPathComponent("examples/");

  mainMenu_->addItem
    (tr("download"), deferCreate(boost::bind(&Home::download, this)),
     WMenuItem::PreLoading);

  mainMenu_->addItem
    (tr("community"), wrapView(&Home::community), WMenuItem::PreLoading);

  mainMenu_->addItem
    (tr("other-language"), wrapView(&Home::otherLanguage),
     WMenuItem::PreLoading);

  mainMenu_->itemSelectRendered().connect(this, &Home::updateTitle);

  mainMenu_->itemSelected().connect(this, &Home::googleAnalyticsLogger);

  // Make the menu be internal-path aware.
  mainMenu_->setInternalPathEnabled("/");

  sideBarContent_ = new WContainerWidget();

  result->bindWidget("languages", languagesDiv);
  result->bindWidget("menu", mainMenu_);
  result->bindWidget("contents", contents);
  result->bindWidget("sidebar", sideBarContent_);
}
virtual WWidget* Home::createQuoteForm ( ) [protected, pure virtual]

Implemented in JWtHome, and WtHome.

WWidget * Home::documentation ( ) [private]

Definition at line 298 of file Home.C.

{
  WText *result = new WText(tr("home.documentation"));
  result->setInternalPathEncoding(true);
  return result;
}
WWidget * Home::download ( ) [private]

Definition at line 392 of file Home.C.

{
  WContainerWidget *result = new WContainerWidget();
  result->addWidget(new WText(tr("home.download")));

  result->addWidget(new WText(tr("home.download.license")));

#ifdef WT_EMWEB_BUILD
  result->addWidget(quoteForm());
#endif // WT_EMWEB_BUILD

  result->addWidget(new WText(tr("home.download.packages")));

  releases_ = new WTable();
  readReleases(releases_);
  result->addWidget(releases_);

  result->addWidget(new WText(tr("home.download.other")));

  return result;
}
virtual WWidget* Home::examples ( ) [protected, pure virtual]

Implemented in JWtHome, and WtHome.

WWidget * Home::features ( ) [private]

Definition at line 293 of file Home.C.

{
  return new WText(tr("home.features"));
}
virtual std::string Home::filePrefix ( ) const [protected, pure virtual]

Implemented in JWtHome, and WtHome.

Definition at line 420 of file Home.C.

{
  doJavaScript("if (window.ga) ga('send','pageview','"
               + environment().deploymentPath() + internalPath() + "');");
}
std::string Home::href ( const std::string &  url,
const std::string &  description 
) [protected]

Definition at line 315 of file Home.C.

{
  return "<a href=\"" + url + "\" target=\"_blank\">" + description + "</a>";
}
void Home::init ( ) [protected]

Definition at line 62 of file Home.C.

{
  internalPathChanged().connect(this, &Home::setup);
  internalPathChanged().connect(this, &Home::setLanguageFromPath);
  internalPathChanged().connect(this, &Home::logInternalPath);

  setup();

  setLanguageFromPath();
}
WWidget * Home::introduction ( ) [private]

Definition at line 253 of file Home.C.

{
  return new WText(tr("home.intro"));
}
WWidget * Home::linkSourceBrowser ( const std::string &  examplePath) [protected]

Definition at line 200 of file Home.C.

{
  /*
   * Instead of using a WAnchor, which will not progress properly because
   * it is wrapped with wrapView() (-- should we not fix that?), we use
   * a WText which contains an anchor, and enable internal path encoding.
   */
  std::string path = "#/" + SRC_INTERNAL_PATH + "/" + example;
  WText *a = new WText(tr("source-browser-link").arg(path));
  a->setInternalPathEncoding(true);
  return a;
}
void Home::logInternalPath ( const std::string &  path) [private]

Definition at line 242 of file Home.C.

{
  // simulate an access log for the interal paths
  log("path") << path;

  // If this goes to /src, we need to invoke google analytics method too
  if (path.size() >= 4 && path.substr(0, 4) == "/src") {
    googleAnalyticsLogger();
  }
}
WWidget * Home::otherLanguage ( ) [private]

Definition at line 305 of file Home.C.

{
  return new WText(tr("home.other-language"));
}
WWidget* Home::quoteForm ( ) [private]
void Home::readNews ( WTable *  newsTable,
const std::string &  newsfile 
) [private]
void Home::readReleases ( WTable *  releaseTable) [protected]

Definition at line 325 of file Home.C.

{
  std::ifstream f((filePrefix() + "releases.txt").c_str());

  releaseTable->clear();

  releaseTable->elementAt(0, 0)
    ->addWidget(new WText(tr("home.download.version")));
  releaseTable->elementAt(0, 1)
    ->addWidget(new WText(tr("home.download.date")));
  releaseTable->elementAt(0, 2)
    ->addWidget(new WText(tr("home.download.description")));

  releaseTable->elementAt(0, 0)->resize(WLength(15, WLength::FontEx),
                                        WLength::Auto);
  releaseTable->elementAt(0, 1)->resize(WLength(15, WLength::FontEx),
                                        WLength::Auto);

  int row = 1;

  while (f) {
    std::string line;
    getline(f, line);

    if (f) {
      typedef boost::tokenizer<boost::escaped_list_separator<char> >
        CsvTokenizer;
      CsvTokenizer tok(line);

      CsvTokenizer::iterator i=tok.begin();

      std::string fileName = *i;
      std::string description = *(++i);
      releaseTable->elementAt(row, 0)->addWidget
        (new WText(href("http://prdownloads.sourceforge.net/witty/" 
                        + fileName + "?download", description)));
      releaseTable->elementAt(row, 1)->addWidget(new WText(*(++i)));
      releaseTable->elementAt(row, 2)->addWidget(new WText(*(++i)));

      ++row;
    }
  }
}
void Home::setLanguage ( int  language) [private]

Definition at line 181 of file Home.C.

{
  if (homePage_) {
    const Lang& l = languages[index];

    setLocale(l.code_);

    std::string langPath = l.path_;
    mainMenu_->setInternalBasePath(langPath);
    examplesMenu_->setInternalBasePath(langPath + "examples");
    BlogView *blog = dynamic_cast<BlogView *>(findWidget("blog"));
    if (blog)
      blog->setInternalBasePath(langPath + "blog/");
    updateTitle();

    language_ = index;
  }
}
void Home::setLanguageFromPath ( ) [private]

Definition at line 213 of file Home.C.

{
  std::string langPath = internalPathNextPart("/");

  if (langPath.empty())
    langPath = '/';
  else
    langPath = '/' + langPath + '/';

  int newLanguage = 0;

  for (unsigned i = 0; i < languages.size(); ++i) {
    if (languages[i].path_ == langPath) {
      newLanguage = i;
      break;
    }
  }

  if (newLanguage != language_)
    setLanguage(newLanguage);
}
void Home::setup ( ) [private]

Definition at line 73 of file Home.C.

{
  /*
   * This function switches between the two major components of the homepage,
   * depending on the internal path:
   * /src -> source viewer
   * /... -> homepage
   *
   * FIXME: we should take into account language /cn/src ...
   */
  std::string base = internalPathNextPart("/");

  if (base == SRC_INTERNAL_PATH) {
    if (!sourceViewer_) {
      delete homePage_;
      homePage_ = 0;

      root()->clear();

      sourceViewer_ = sourceViewer("/" + SRC_INTERNAL_PATH + "/");
      WVBoxLayout *layout = new WVBoxLayout();
      layout->setContentsMargins(0, 0, 0, 0);
      layout->addWidget(sourceViewer_);
      root()->setLayout(layout);
    }
  } else {
    if (!homePage_) {
      delete sourceViewer_;
      sourceViewer_ = 0;

      root()->clear();

      createHome();
      root()->addWidget(homePage_);

      setLanguageFromPath();
    }
  }
}
virtual WWidget* Home::sourceViewer ( const std::string &  deployPath) [protected, pure virtual]

Implemented in JWtHome, and WtHome.

WWidget * Home::status ( ) [private]

Definition at line 288 of file Home.C.

{
  return new WText(tr("home.status"));
}
WString Home::tr ( const char *  key) [protected]

Definition at line 415 of file Home.C.

{
  return WString::tr(key);
}
void Home::updateTitle ( ) [private]

Definition at line 235 of file Home.C.

{
  if (mainMenu_->currentItem()) {
    setTitle(tr("wt") + " - " + mainMenu_->currentItem()->text());
  }
}
WWidget * Home::wrapView ( WWidget *(Home::*)()  createFunction) [private]

Definition at line 310 of file Home.C.

{
  return makeStaticModel(boost::bind(createWidget, this));
}

Member Data Documentation

Wt::Dbo::SqlConnectionPool& Home::blogDb_ [private]

Definition at line 98 of file Home.h.

WStackedWidget* Home::contents_ [private]

Definition at line 102 of file Home.h.

WTabWidget* Home::examplesMenu_ [protected]

Definition at line 89 of file Home.h.

WWidget* Home::homePage_ [private]

Definition at line 99 of file Home.h.

int Home::language_ [private]

Definition at line 118 of file Home.h.

std::vector<Lang> Home::languages [private]

Definition at line 133 of file Home.h.

WMenu* Home::mainMenu_ [private]

Definition at line 116 of file Home.h.

WTable* Home::releases_ [protected]

Definition at line 94 of file Home.h.

WContainerWidget* Home::sideBarContent_ [private]

Definition at line 131 of file Home.h.

WWidget* Home::sourceViewer_ [private]

Definition at line 100 of file Home.h.


The documentation for this class was generated from the following files:

Generated on Wed Mar 23 2016 for the C++ Web Toolkit (Wt) by doxygen 1.7.6.1