Wt examples  3.7.1
simpleChat.C
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2008 Emweb bv, Herent, Belgium.
3  *
4  * See the LICENSE file for terms of use.
5  */
6 
7 #include <Wt/WApplication>
8 #include <Wt/WContainerWidget>
9 #include <Wt/WEnvironment>
10 #include <Wt/WPushButton>
11 #include <Wt/WServer>
12 #include <Wt/WText>
13 #include <Wt/WTimer>
14 
15 #include "SimpleChatServer.h"
16 #include "PopupChatWidget.h"
17 
18 using namespace Wt;
19 
24 
28 {
29 public:
32  ChatApplication(const WEnvironment& env, SimpleChatServer& server);
33 
34 private:
39 
42  void addChatWidget();
43  void javaScriptTest();
44  void emptyFunc();
45 };
46 
48  SimpleChatServer& server)
49  : WApplication(env),
50  server_(server),
51  env_(env)
52 {
53  setTitle("Wt Chat");
54  useStyleSheet("chatapp.css");
55 
56  messageResourceBundle().use(appRoot() + "simplechat");
57 
59 
60  root()->addWidget(new WText(WString::tr("introduction")));
61 
62  SimpleChatWidget *chatWidget =
64  chatWidget->setStyleClass("chat");
65 
66  root()->addWidget(new WText(WString::tr("details")));
67 
68  WPushButton *b = new WPushButton("I'm schizophrenic ...", root());
69  b->clicked().connect(b, &WPushButton::hide);
70  b->clicked().connect(this, &ChatApplication::addChatWidget);
71 }
72 
74 {
75  if(!env_.javaScript()){
76  javaScriptError_ = new WText(WString::tr("serverpushwarning"), root());
77 
78  // The 5 second timer is a fallback for real server push. The updated
79  // server state will piggy back on the response to this timeout.
80  timer_ = new Wt::WTimer(root());
81  timer_->setInterval(5000);
82  timer_->timeout().connect(this, &ChatApplication::emptyFunc);
83  timer_->start();
84  }
85 }
86 
88 {}
89 
91 {
92  SimpleChatWidget *chatWidget2 = new SimpleChatWidget(server_, root());
93  chatWidget2->setStyleClass("chat");
94 }
95 
98 class ChatWidget : public WApplication
99 {
100 public:
101  ChatWidget(const WEnvironment& env, SimpleChatServer& server);
102 
103 private:
105 };
106 
108  : WApplication(env),
109  login_(this, "login")
110 {
111  setCssTheme("");
112  useStyleSheet("chatwidget.css");
113  useStyleSheet("chatwidget_ie6.css", "lt IE 7");
114 
115  messageResourceBundle().use(appRoot() + "simplechat");
116 
117  const std::string *div = env.getParameter("div");
118  std::string defaultDiv = "div";
119  if (!div)
120  div = &defaultDiv;
121 
122  if (div) {
123  setJavaScriptClass(*div);
124  PopupChatWidget *chatWidget = new PopupChatWidget(server, *div);
125  bindWidget(chatWidget, *div);
126 
128 
129  std::string chat = javaScriptClass();
130  doJavaScript("if (window." + chat + "User) "
131  + chat + ".emit(" + chat + ", 'login', " + chat + "User);"
132  + "document.body.appendChild(" + chatWidget->jsRef() + ");");
133  } else {
134  std::cerr << "Missing: parameter: 'div'" << std::endl;
135  quit();
136  }
137 }
138 
140  SimpleChatServer& server)
141 {
142  return new ChatApplication(env, server);
143 }
144 
146 {
147  return new ChatWidget(env, server);
148 }
149 
150 int main(int argc, char **argv)
151 {
152  Wt::WServer server(argc, argv, WTHTTP_CONFIGURATION);
153  SimpleChatServer chatServer(server);
154 
155  /*
156  * We add two entry points: one for the full-window application,
157  * and one for a widget that can be integrated in another page.
158  */
159  server.addEntryPoint(Wt::Application,
160  boost::bind(createApplication, _1,
161  boost::ref(chatServer)));
162  server.addEntryPoint(Wt::WidgetSet,
163  boost::bind(createWidget, _1,
164  boost::ref(chatServer)), "/chat.js");
165 
166  if (server.start()) {
167  int sig = Wt::WServer::waitForShutdown();
168  std::cerr << "Shutting down: (signal = " << sig << ")" << std::endl;
169  server.stop();
170  }
171 }
172 
SimpleChatServer & server_
Definition: simpleChat.C:35
virtual void setStyleClass(const WString &styleClass) override
std::string jsRef() const
int main(int argc, char **argv)
Definition: simpleChat.C:150
WTCONNECTOR_API void stop()
ChatApplication(const WEnvironment &env, SimpleChatServer &server)
Create a new instance.
Definition: simpleChat.C:47
void bindWidget(std::unique_ptr< WWidget > widget, const std::string &domId)
EventSignal< WMouseEvent > & clicked()
WApplication * createApplication(const WEnvironment &env, SimpleChatServer &server)
Definition: simpleChat.C:139
void javaScriptTest()
Definition: simpleChat.C:73
Wt::Signals::connection connect(F function)
WMessageResourceBundle & messageResourceBundle()
A self-contained chat widget.
void setTitle(const WString &title)
std::string javaScriptClass()
Wt::WTimer * timer_
Definition: simpleChat.C:38
A chat demo application.
Definition: simpleChat.C:27
void start()
void setJavaScriptClass(const std::string &className)
Wt::WText * javaScriptError_
Definition: simpleChat.C:36
const std::string * getParameter(const std::string &name) const
EventSignal< WMouseEvent > & timeout()
A popup chat widget.
void addChatWidget()
Add another chat client.
Definition: simpleChat.C:90
const WEnvironment & env_
Definition: simpleChat.C:37
void use(const std::string &path, bool loadInMemory=true)
WContainerWidget * root() const
void emptyFunc()
Definition: simpleChat.C:87
WT_API void addEntryPoint(EntryPointType type, ApplicationCreator callback, const std::string &path=std::string(), const std::string &favicon=std::string())
WApplication * createWidget(const WEnvironment &env, SimpleChatServer &server)
Definition: simpleChat.C:145
A chat application widget.
Definition: simpleChat.C:98
static std::string appRoot()
void useStyleSheet(const WLink &link, const std::string &media="all")
static WT_API int waitForShutdown()
WTCONNECTOR_API bool start()
A simple chat server.
JSignal< WString > login_
Definition: simpleChat.C:104
void doJavaScript(const std::string &javascript, bool afterLoaded=true)
void setCssTheme(const std::string &name)
ChatWidget(const WEnvironment &env, SimpleChatServer &server)
Definition: simpleChat.C:107
void setName(const Wt::WString &name)
bool javaScript() const
virtual void addWidget(std::unique_ptr< WWidget > widget)
void setInterval(std::chrono::milliseconds interval)

Generated on Tue Dec 15 2020 for the C++ Web Toolkit (Wt) by doxygen 1.8.13