Wt examples
3.2.1
|
00001 /* 00002 * Copyright (C) 2008 Emweb bvba, Heverlee, Belgium. 00003 * 00004 * See the LICENSE file for terms of use. 00005 */ 00006 00007 #include <Wt/WApplication> 00008 #include <Wt/WContainerWidget> 00009 #include <Wt/WEnvironment> 00010 #include <Wt/WPushButton> 00011 #include <Wt/WServer> 00012 #include <Wt/WText> 00013 00014 #include "SimpleChatServer.h" 00015 #include "PopupChatWidget.h" 00016 00017 using namespace Wt; 00018 00023 00026 class ChatApplication : public WApplication 00027 { 00028 public: 00031 ChatApplication(const WEnvironment& env, SimpleChatServer& server); 00032 00033 private: 00034 SimpleChatServer& server_; 00035 00038 void addChatWidget(); 00039 }; 00040 00041 ChatApplication::ChatApplication(const WEnvironment& env, 00042 SimpleChatServer& server) 00043 : WApplication(env), 00044 server_(server) 00045 { 00046 setTitle("Wt Chat"); 00047 useStyleSheet("chatapp.css"); 00048 00049 messageResourceBundle().use(appRoot() + "simplechat"); 00050 00051 root()->addWidget(new WText(WString::tr("introduction"))); 00052 00053 SimpleChatWidget *chatWidget = new SimpleChatWidget(server_, root()); 00054 chatWidget->setStyleClass("chat"); 00055 00056 root()->addWidget(new WText(WString::tr("details"))); 00057 00058 WPushButton *b = new WPushButton("I'm schizophrenic ...", root()); 00059 b->clicked().connect(b, &WPushButton::hide); 00060 b->clicked().connect(this, &ChatApplication::addChatWidget); 00061 } 00062 00063 void ChatApplication::addChatWidget() 00064 { 00065 SimpleChatWidget *chatWidget2 = new SimpleChatWidget(server_, root()); 00066 chatWidget2->setStyleClass("chat"); 00067 } 00068 00071 class ChatWidget : public WApplication 00072 { 00073 public: 00074 ChatWidget(const WEnvironment& env, SimpleChatServer& server); 00075 00076 private: 00077 JSignal<WString> login_; 00078 }; 00079 00080 ChatWidget::ChatWidget(const WEnvironment& env, SimpleChatServer& server) 00081 : WApplication(env), 00082 login_(this, "login") 00083 { 00084 setCssTheme(""); 00085 useStyleSheet("chatwidget.css"); 00086 useStyleSheet("chatwidget_ie6.css", "lt IE 7"); 00087 00088 const std::string *div = env.getParameter("div"); 00089 std::string defaultDiv = "div"; 00090 if (!div) 00091 div = &defaultDiv; 00092 00093 if (div) { 00094 setJavaScriptClass(*div); 00095 PopupChatWidget *chatWidget = new PopupChatWidget(server, *div); 00096 bindWidget(chatWidget, *div); 00097 00098 login_.connect(chatWidget, &PopupChatWidget::setName); 00099 00100 std::string chat = javaScriptClass(); 00101 doJavaScript("if (window." + chat + "User) " 00102 + chat + ".emit(" + chat + ", 'login', " + chat + "User);" 00103 + "document.body.appendChild(" + chatWidget->jsRef() + ");"); 00104 } else { 00105 std::cerr << "Missing: parameter: 'div'" << std::endl; 00106 quit(); 00107 } 00108 } 00109 00110 WApplication *createApplication(const WEnvironment& env, 00111 SimpleChatServer& server) 00112 { 00113 return new ChatApplication(env, server); 00114 } 00115 00116 WApplication *createWidget(const WEnvironment& env, SimpleChatServer& server) 00117 { 00118 return new ChatWidget(env, server); 00119 } 00120 00121 int main(int argc, char **argv) 00122 { 00123 Wt::WServer server(argv[0]); 00124 SimpleChatServer chatServer(server); 00125 00126 server.setServerConfiguration(argc, argv, WTHTTP_CONFIGURATION); 00127 00128 /* 00129 * We add two entry points: one for the full-window application, 00130 * and one for a widget that can be integrated in another page. 00131 */ 00132 server.addEntryPoint(Wt::Application, 00133 boost::bind(createApplication, _1, 00134 boost::ref(chatServer))); 00135 server.addEntryPoint(Wt::WidgetSet, 00136 boost::bind(createWidget, _1, 00137 boost::ref(chatServer)), "/chat.js"); 00138 00139 if (server.start()) { 00140 int sig = Wt::WServer::waitForShutdown(); 00141 std::cerr << "Shutting down: (signal = " << sig << ")" << std::endl; 00142 server.stop(); 00143 } 00144 } 00145