File: SimpleChatWidget_8C-source.html

package info (click to toggle)
witty 3.1.2-3
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 45,512 kB
  • ctags: 35,832
  • sloc: cpp: 69,469; ansic: 66,945; xml: 4,383; sh: 594; perl: 108; makefile: 106
file content (331 lines) | stat: -rw-r--r-- 51,848 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>Wt examples: /home/koen/project/wt/public-git/wt/examples/simplechat/SimpleChatWidget.C Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.6 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
<h1>/home/koen/project/wt/public-git/wt/examples/simplechat/SimpleChatWidget.C</h1><a href="SimpleChatWidget_8C.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> * Copyright (C) 2008 Emweb bvba, Heverlee, Belgium.</span>
<a name="l00003"></a>00003 <span class="comment"> *</span>
<a name="l00004"></a>00004 <span class="comment"> * See the LICENSE file for terms of use.</span>
<a name="l00005"></a>00005 <span class="comment"> */</span>
<a name="l00006"></a>00006 
<a name="l00007"></a>00007 <span class="preprocessor">#include "<a class="code" href="SimpleChatWidget_8h.html">SimpleChatWidget.h</a>"</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include "<a class="code" href="SimpleChatServer_8h.html">SimpleChatServer.h</a>"</span>
<a name="l00009"></a>00009 
<a name="l00010"></a>00010 <span class="preprocessor">#include &lt;Wt/WApplication&gt;</span>
<a name="l00011"></a>00011 <span class="preprocessor">#include &lt;Wt/WContainerWidget&gt;</span>
<a name="l00012"></a>00012 <span class="preprocessor">#include &lt;Wt/WEnvironment&gt;</span>
<a name="l00013"></a>00013 <span class="preprocessor">#include &lt;Wt/WHBoxLayout&gt;</span>
<a name="l00014"></a>00014 <span class="preprocessor">#include &lt;Wt/WVBoxLayout&gt;</span>
<a name="l00015"></a>00015 <span class="preprocessor">#include &lt;Wt/WLabel&gt;</span>
<a name="l00016"></a>00016 <span class="preprocessor">#include &lt;Wt/WLineEdit&gt;</span>
<a name="l00017"></a>00017 <span class="preprocessor">#include &lt;Wt/WText&gt;</span>
<a name="l00018"></a>00018 <span class="preprocessor">#include &lt;Wt/WTextArea&gt;</span>
<a name="l00019"></a>00019 <span class="preprocessor">#include &lt;Wt/WPushButton&gt;</span>
<a name="l00020"></a>00020 <span class="preprocessor">#include &lt;Wt/WCheckBox&gt;</span>
<a name="l00021"></a>00021 
<a name="l00022"></a>00022 <span class="preprocessor">#include &lt;iostream&gt;</span>
<a name="l00023"></a>00023 
<a name="l00024"></a>00024 <span class="keyword">using namespace </span>Wt;
<a name="l00025"></a>00025 
<a name="l00026"></a><a class="code" href="classSimpleChatWidget.html#a1cdfd4ad4b7442304c6f44b3346f2e0">00026</a> <a class="code" href="classSimpleChatWidget.html#a1cdfd4ad4b7442304c6f44b3346f2e0" title="Create a chat widget that will connect to the given server.">SimpleChatWidget::SimpleChatWidget</a>(<a class="code" href="classSimpleChatServer.html" title="A simple chat server.">SimpleChatServer</a>&amp; server,
<a name="l00027"></a>00027                                    <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WContainerWidget.html">Wt::WContainerWidget</a> *parent)
<a name="l00028"></a>00028   : <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WContainerWidget.html">WContainerWidget</a>(parent),
<a name="l00029"></a>00029     server_(server),
<a name="l00030"></a>00030     app_(<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WApplication.html">WApplication</a>::instance()),
<a name="l00031"></a>00031     messageReceived_(<span class="stringliteral">"sounds/message_received.mp3"</span>)
<a name="l00032"></a>00032 {
<a name="l00033"></a>00033   <a class="code" href="classSimpleChatWidget.html#596f7cbf70f45da9af017ac9d6f55ebc">user_</a> = <a class="code" href="classSimpleChatWidget.html#b29db4cbc3935964daf6b6c264ce68d3">server_</a>.<a class="code" href="classSimpleChatServer.html#bf692567706118193111c2b2589c8d3f" title="Get a suggestion for a guest user name.">suggestGuest</a>();
<a name="l00034"></a>00034   <a class="code" href="classSimpleChatWidget.html#71d98bf20e007af247f3b5a74f35efa2" title="Show a simple login screen.">letLogin</a>();
<a name="l00035"></a>00035 
<a name="l00036"></a>00036   <span class="comment">// this widget supports server-side updates its processChatEvent()</span>
<a name="l00037"></a>00037   <span class="comment">// method is connected to a slot that is triggered from outside this</span>
<a name="l00038"></a>00038   <span class="comment">// session's event loop (usually because another user enters text).</span>
<a name="l00039"></a>00039   <a class="code" href="classSimpleChatWidget.html#f27ada14cf08ce58437c2f3f72f0c4d1">app_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WApplication.html#d9631ca64e68d30d40cb49c90e55223d">enableUpdates</a>();
<a name="l00040"></a>00040 }
<a name="l00041"></a>00041 
<a name="l00042"></a><a class="code" href="classSimpleChatWidget.html#fdf56768400ee025d0b71ccce476b1bf">00042</a> <a class="code" href="classSimpleChatWidget.html#fdf56768400ee025d0b71ccce476b1bf" title="Delete a chat widget.">SimpleChatWidget::~SimpleChatWidget</a>()
<a name="l00043"></a>00043 {
<a name="l00044"></a>00044   <a class="code" href="classSimpleChatWidget.html#bff498a5a43a7e0caac5f2140f14e301">logout</a>();
<a name="l00045"></a>00045 }
<a name="l00046"></a>00046 
<a name="l00047"></a><a class="code" href="classSimpleChatWidget.html#71d98bf20e007af247f3b5a74f35efa2">00047</a> <span class="keywordtype">void</span> <a class="code" href="classSimpleChatWidget.html#71d98bf20e007af247f3b5a74f35efa2" title="Show a simple login screen.">SimpleChatWidget::letLogin</a>()
<a name="l00048"></a>00048 {
<a name="l00049"></a>00049   <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WContainerWidget.html#608f748cbdda763f1a11556ddad9fbe1">clear</a>();
<a name="l00050"></a>00050 
<a name="l00051"></a>00051   <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WVBoxLayout.html">WVBoxLayout</a> *vLayout = <span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WVBoxLayout.html">WVBoxLayout</a>();
<a name="l00052"></a>00052   <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WContainerWidget.html#1c84e0ffe330d4798f0ce217f75be08c">setLayout</a>(vLayout, <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/namespaceWt.html#b8f772c69bc8180c31f9e4f4593b143fd033ef69b45d0b75633be34168c9b606">AlignLeft</a> | <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/namespaceWt.html#b8f772c69bc8180c31f9e4f4593b143f58fe5182bd266132c59718c6d30945a9">AlignTop</a>);
<a name="l00053"></a>00053 
<a name="l00054"></a>00054   <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WHBoxLayout.html">WHBoxLayout</a> *hLayout = <span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WHBoxLayout.html">WHBoxLayout</a>();
<a name="l00055"></a>00055   vLayout-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WBoxLayout.html#062d26b432841995a0be7b7d7aac6413">addLayout</a>(hLayout);
<a name="l00056"></a>00056 
<a name="l00057"></a>00057   hLayout-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WBoxLayout.html#7c1ec58e25d0b7add93f5f4342844db6">addWidget</a>(<span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WLabel.html">WLabel</a>(<span class="stringliteral">"User name:"</span>), 0, <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/namespaceWt.html#b8f772c69bc8180c31f9e4f4593b143f2ed90f01dbf74049f428d33769d48e3f">AlignMiddle</a>);
<a name="l00058"></a>00058   hLayout-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WBoxLayout.html#7c1ec58e25d0b7add93f5f4342844db6">addWidget</a>(<a class="code" href="classSimpleChatWidget.html#6216e8cf4d368c1550562e1c5525d34b">userNameEdit_</a> = <span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WLineEdit.html">WLineEdit</a>(<a class="code" href="classSimpleChatWidget.html#596f7cbf70f45da9af017ac9d6f55ebc">user_</a>), 0, <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/namespaceWt.html#b8f772c69bc8180c31f9e4f4593b143f2ed90f01dbf74049f428d33769d48e3f">AlignMiddle</a>);
<a name="l00059"></a>00059   <a class="code" href="classSimpleChatWidget.html#6216e8cf4d368c1550562e1c5525d34b">userNameEdit_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WFormWidget.html#fe33f5c3658ddbd08fec9f6c203c578b">setFocus</a>();
<a name="l00060"></a>00060 
<a name="l00061"></a>00061   <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WPushButton.html">WPushButton</a> *b = <span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WPushButton.html">WPushButton</a>(<span class="stringliteral">"Login"</span>);
<a name="l00062"></a>00062   hLayout-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WBoxLayout.html#7c1ec58e25d0b7add93f5f4342844db6">addWidget</a>(b, 0, <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/namespaceWt.html#b8f772c69bc8180c31f9e4f4593b143f2ed90f01dbf74049f428d33769d48e3f">AlignMiddle</a>);
<a name="l00063"></a>00063   hLayout-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WBoxLayout.html#811708ce9336d753c20aaedc14b00d5f">addStretch</a>(1);
<a name="l00064"></a>00064 
<a name="l00065"></a>00065   b-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WInteractWidget.html#e11e050cce0d4a8f742afa3ef92bfe8c">clicked</a>().connect(SLOT(<span class="keyword">this</span>, <a class="code" href="classSimpleChatWidget.html#e085fda18af441e1630342395499478c">SimpleChatWidget::login</a>));
<a name="l00066"></a>00066   <a class="code" href="classSimpleChatWidget.html#6216e8cf4d368c1550562e1c5525d34b">userNameEdit_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WInteractWidget.html#38f06d1ad95e7599b055f49931236c10">enterPressed</a>().<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1EventSignal.html#6efcb92576b5aa846a3354dd26918a9f">connect</a>(SLOT(<span class="keyword">this</span>, <a class="code" href="classSimpleChatWidget.html#e085fda18af441e1630342395499478c">SimpleChatWidget::login</a>));
<a name="l00067"></a>00067 
<a name="l00068"></a>00068   vLayout-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WBoxLayout.html#7c1ec58e25d0b7add93f5f4342844db6">addWidget</a>(<a class="code" href="classSimpleChatWidget.html#98f69adc6f2381cd98584566ed4c497e">statusMsg_</a> = <span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WText.html">WText</a>());
<a name="l00069"></a>00069   <a class="code" href="classSimpleChatWidget.html#98f69adc6f2381cd98584566ed4c497e">statusMsg_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WText.html#f22c64c4c5fed3d2aef0915a7e5c5866">setTextFormat</a>(<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/namespaceWt.html#140dea437d52d3d7c438ea3bd16a1480e06bb9ae9a26d13c3dcf9f20d5067885">PlainText</a>);
<a name="l00070"></a>00070 }
<a name="l00071"></a>00071 
<a name="l00072"></a><a class="code" href="classSimpleChatWidget.html#e085fda18af441e1630342395499478c">00072</a> <span class="keywordtype">void</span> <a class="code" href="classSimpleChatWidget.html#e085fda18af441e1630342395499478c">SimpleChatWidget::login</a>()
<a name="l00073"></a>00073 {
<a name="l00074"></a>00074   <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WString.html">WString</a> name = WWebWidget::escapeText(<a class="code" href="classSimpleChatWidget.html#6216e8cf4d368c1550562e1c5525d34b">userNameEdit_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WLineEdit.html#c74b58779cb635898cac13e81d8b0c7a">text</a>());
<a name="l00075"></a>00075 
<a name="l00076"></a>00076   <span class="keywordflow">if</span> (!<a class="code" href="classSimpleChatWidget.html#19c0deeaf8952ec36791c3f444964878" title="Start a chat for the given user.">startChat</a>(name))
<a name="l00077"></a>00077     <a class="code" href="classSimpleChatWidget.html#98f69adc6f2381cd98584566ed4c497e">statusMsg_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WText.html#2f788aa524d51b3962642c9f565e66e6">setText</a>(<span class="stringliteral">"Sorry, name '"</span> + name + <span class="stringliteral">"' is already taken."</span>);
<a name="l00078"></a>00078 }
<a name="l00079"></a>00079 
<a name="l00080"></a><a class="code" href="classSimpleChatWidget.html#bff498a5a43a7e0caac5f2140f14e301">00080</a> <span class="keywordtype">void</span> <a class="code" href="classSimpleChatWidget.html#bff498a5a43a7e0caac5f2140f14e301">SimpleChatWidget::logout</a>()
<a name="l00081"></a>00081 {
<a name="l00082"></a>00082   <span class="keywordflow">if</span> (<a class="code" href="classSimpleChatWidget.html#9a6485984b400d54882606f2c947a286">eventConnection_</a>.connected()) {
<a name="l00083"></a>00083     <a class="code" href="classSimpleChatWidget.html#9a6485984b400d54882606f2c947a286">eventConnection_</a>.disconnect(); <span class="comment">// do not listen for more events</span>
<a name="l00084"></a>00084     <a class="code" href="classSimpleChatWidget.html#b29db4cbc3935964daf6b6c264ce68d3">server_</a>.<a class="code" href="classSimpleChatServer.html#5d376e3ff441f24843be648dd420e027" title="Logout from the server.">logout</a>(<a class="code" href="classSimpleChatWidget.html#596f7cbf70f45da9af017ac9d6f55ebc">user_</a>);
<a name="l00085"></a>00085 
<a name="l00086"></a>00086     <a class="code" href="classSimpleChatWidget.html#71d98bf20e007af247f3b5a74f35efa2" title="Show a simple login screen.">letLogin</a>();
<a name="l00087"></a>00087   }
<a name="l00088"></a>00088 }
<a name="l00089"></a>00089 
<a name="l00090"></a><a class="code" href="classSimpleChatWidget.html#19c0deeaf8952ec36791c3f444964878">00090</a> <span class="keywordtype">bool</span> <a class="code" href="classSimpleChatWidget.html#19c0deeaf8952ec36791c3f444964878" title="Start a chat for the given user.">SimpleChatWidget::startChat</a>(<span class="keyword">const</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WString.html">WString</a>&amp; user)
<a name="l00091"></a>00091 {
<a name="l00092"></a>00092   <span class="keywordflow">if</span> (<a class="code" href="classSimpleChatWidget.html#b29db4cbc3935964daf6b6c264ce68d3">server_</a>.<a class="code" href="classSimpleChatServer.html#da0ab17464e1711ca15f30b381ede57c" title="Try to login with given user name.">login</a>(user)) {
<a name="l00093"></a>00093     <a class="code" href="classSimpleChatWidget.html#9a6485984b400d54882606f2c947a286">eventConnection_</a>
<a name="l00094"></a>00094       = <a class="code" href="classSimpleChatWidget.html#b29db4cbc3935964daf6b6c264ce68d3">server_</a>.<a class="code" href="classSimpleChatServer.html#baf4e2a4e3e17b14e208146b0251f7ab" title="Signal that will convey chat events.">chatEvent</a>().<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1Signal.html#6fc9536d2e7f59684ec32f3734b01f38">connect</a>(SLOT(<span class="keyword">this</span>,
<a name="l00095"></a>00095                                        <a class="code" href="classSimpleChatWidget.html#cda2bbe138c3119e4c62a6132801a232">SimpleChatWidget::processChatEvent</a>));
<a name="l00096"></a>00096     <a class="code" href="classSimpleChatWidget.html#596f7cbf70f45da9af017ac9d6f55ebc">user_</a> = user;    
<a name="l00097"></a>00097 
<a name="l00098"></a>00098     <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WContainerWidget.html#608f748cbdda763f1a11556ddad9fbe1">clear</a>();
<a name="l00099"></a>00099 
<a name="l00100"></a>00100     <span class="comment">/*</span>
<a name="l00101"></a>00101 <span class="comment">     * Create a vertical layout, which will hold 3 rows,</span>
<a name="l00102"></a>00102 <span class="comment">     * organized like this:</span>
<a name="l00103"></a>00103 <span class="comment">     *</span>
<a name="l00104"></a>00104 <span class="comment">     * WVBoxLayout</span>
<a name="l00105"></a>00105 <span class="comment">     * --------------------------------------------</span>
<a name="l00106"></a>00106 <span class="comment">     * | nested WHBoxLayout (vertical stretch=1)  |</span>
<a name="l00107"></a>00107 <span class="comment">     * |                              |           |</span>
<a name="l00108"></a>00108 <span class="comment">     * |  messages                    | userslist |</span>
<a name="l00109"></a>00109 <span class="comment">     * |   (horizontal stretch=1)     |           |</span>
<a name="l00110"></a>00110 <span class="comment">     * |                              |           |</span>
<a name="l00111"></a>00111 <span class="comment">     * --------------------------------------------</span>
<a name="l00112"></a>00112 <span class="comment">     * | message edit area                        |</span>
<a name="l00113"></a>00113 <span class="comment">     * --------------------------------------------</span>
<a name="l00114"></a>00114 <span class="comment">     * | WHBoxLayout                              |</span>
<a name="l00115"></a>00115 <span class="comment">     * | send | logout |       stretch = 1        |</span>
<a name="l00116"></a>00116 <span class="comment">     * --------------------------------------------</span>
<a name="l00117"></a>00117 <span class="comment">     */</span>
<a name="l00118"></a>00118     <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WVBoxLayout.html">WVBoxLayout</a> *vLayout = <span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WVBoxLayout.html">WVBoxLayout</a>();
<a name="l00119"></a>00119 
<a name="l00120"></a>00120     <span class="comment">// Create a horizontal layout for the messages | userslist.</span>
<a name="l00121"></a>00121     <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WHBoxLayout.html">WHBoxLayout</a> *hLayout = <span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WHBoxLayout.html">WHBoxLayout</a>();
<a name="l00122"></a>00122 
<a name="l00123"></a>00123     <span class="comment">// Add widget to horizontal layout with stretch = 1</span>
<a name="l00124"></a>00124     hLayout-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WBoxLayout.html#7c1ec58e25d0b7add93f5f4342844db6">addWidget</a>(<a class="code" href="classSimpleChatWidget.html#32a593ed511997f32a33a55d651ce79d">messages_</a> = <span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WContainerWidget.html#520ba6e52a36a7f2efbef1a31a69e898">WContainerWidget</a>(), 1);
<a name="l00125"></a>00125     <a class="code" href="classSimpleChatWidget.html#32a593ed511997f32a33a55d651ce79d">messages_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WWebWidget.html#6fd43dced1a62f7e79bc3522eeb16216">setStyleClass</a>(<span class="stringliteral">"chat-msgs"</span>);
<a name="l00126"></a>00126     <span class="comment">// Display scroll bars if contents overflows</span>
<a name="l00127"></a>00127     <a class="code" href="classSimpleChatWidget.html#32a593ed511997f32a33a55d651ce79d">messages_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WContainerWidget.html#e269f870992c5843d3097a63795b10d6">setOverflow</a>(WContainerWidget::OverflowAuto);
<a name="l00128"></a>00128 
<a name="l00129"></a>00129     <span class="comment">// Add another widget to hirozontal layout with stretch = 0</span>
<a name="l00130"></a>00130     hLayout-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WBoxLayout.html#7c1ec58e25d0b7add93f5f4342844db6">addWidget</a>(<a class="code" href="classSimpleChatWidget.html#ee074d5eb739091af79eb8dccc90853e">userList_</a> = <span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WContainerWidget.html#520ba6e52a36a7f2efbef1a31a69e898">WContainerWidget</a>());
<a name="l00131"></a>00131     <a class="code" href="classSimpleChatWidget.html#ee074d5eb739091af79eb8dccc90853e">userList_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WWebWidget.html#6fd43dced1a62f7e79bc3522eeb16216">setStyleClass</a>(<span class="stringliteral">"chat-users"</span>);
<a name="l00132"></a>00132     <a class="code" href="classSimpleChatWidget.html#ee074d5eb739091af79eb8dccc90853e">userList_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WContainerWidget.html#e269f870992c5843d3097a63795b10d6">setOverflow</a>(WContainerWidget::OverflowAuto);
<a name="l00133"></a>00133 
<a name="l00134"></a>00134     hLayout-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WBoxLayout.html#00bdfb4d442bd8e8ad9c33b72692763f">setResizable</a>(0, <span class="keyword">true</span>);
<a name="l00135"></a>00135 
<a name="l00136"></a>00136     <span class="comment">// Add nested layout to vertical layout with stretch = 1</span>
<a name="l00137"></a>00137     vLayout-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WBoxLayout.html#062d26b432841995a0be7b7d7aac6413">addLayout</a>(hLayout, 1);
<a name="l00138"></a>00138 
<a name="l00139"></a>00139     <span class="comment">// Add widget to vertical layout with stretch = 0</span>
<a name="l00140"></a>00140     vLayout-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WBoxLayout.html#7c1ec58e25d0b7add93f5f4342844db6">addWidget</a>(<a class="code" href="classSimpleChatWidget.html#4b658b56ef4ba1862765b9ad84fd9a9c">messageEdit_</a> = <span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WTextArea.html">WTextArea</a>());
<a name="l00141"></a>00141     <a class="code" href="classSimpleChatWidget.html#4b658b56ef4ba1862765b9ad84fd9a9c">messageEdit_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WWebWidget.html#6fd43dced1a62f7e79bc3522eeb16216">setStyleClass</a>(<span class="stringliteral">"chat-noedit"</span>);
<a name="l00142"></a>00142     <a class="code" href="classSimpleChatWidget.html#4b658b56ef4ba1862765b9ad84fd9a9c">messageEdit_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WTextArea.html#de46b47350f427f45c9b53ac7e41c5b2">setRows</a>(2);
<a name="l00143"></a>00143     <a class="code" href="classSimpleChatWidget.html#4b658b56ef4ba1862765b9ad84fd9a9c">messageEdit_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WFormWidget.html#fe33f5c3658ddbd08fec9f6c203c578b">setFocus</a>();
<a name="l00144"></a>00144 
<a name="l00145"></a>00145     <span class="comment">// Create a horizontal layout for the buttons.</span>
<a name="l00146"></a>00146     hLayout = <span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WHBoxLayout.html">WHBoxLayout</a>();
<a name="l00147"></a>00147 
<a name="l00148"></a>00148     <span class="comment">// Add button to horizontal layout with stretch = 0</span>
<a name="l00149"></a>00149     hLayout-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WBoxLayout.html#7c1ec58e25d0b7add93f5f4342844db6">addWidget</a>(<a class="code" href="classSimpleChatWidget.html#a9a81423eda8238f8aa37be1a5a5bee8">sendButton_</a> = <span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WPushButton.html">WPushButton</a>(<span class="stringliteral">"Send"</span>));
<a name="l00150"></a>00150     <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WPushButton.html">WPushButton</a> *b;
<a name="l00151"></a>00151 
<a name="l00152"></a>00152     <span class="comment">// Add button to horizontal layout with stretch = 0</span>
<a name="l00153"></a>00153     hLayout-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WBoxLayout.html#7c1ec58e25d0b7add93f5f4342844db6">addWidget</a>(b = <span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WPushButton.html">WPushButton</a>(<span class="stringliteral">"Logout"</span>));
<a name="l00154"></a>00154 
<a name="l00155"></a>00155     <span class="comment">// Add stretching spacer to horizontal layout</span>
<a name="l00156"></a>00156     hLayout-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WBoxLayout.html#811708ce9336d753c20aaedc14b00d5f">addStretch</a>(1);
<a name="l00157"></a>00157 
<a name="l00158"></a>00158     <span class="comment">// Add nested layout to vertical layout with stretch = 0</span>
<a name="l00159"></a>00159     vLayout-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WBoxLayout.html#062d26b432841995a0be7b7d7aac6413">addLayout</a>(hLayout);
<a name="l00160"></a>00160 
<a name="l00161"></a>00161     <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WContainerWidget.html#1c84e0ffe330d4798f0ce217f75be08c">setLayout</a>(vLayout);
<a name="l00162"></a>00162 
<a name="l00163"></a>00163     <span class="comment">/*</span>
<a name="l00164"></a>00164 <span class="comment">     * Connect event handlers:</span>
<a name="l00165"></a>00165 <span class="comment">     *  - click on button</span>
<a name="l00166"></a>00166 <span class="comment">     *  - enter in text area</span>
<a name="l00167"></a>00167 <span class="comment">     *</span>
<a name="l00168"></a>00168 <span class="comment">     * We will clear the input field using a small custom client-side</span>
<a name="l00169"></a>00169 <span class="comment">     * JavaScript invocation.</span>
<a name="l00170"></a>00170 <span class="comment">     */</span>
<a name="l00171"></a>00171 
<a name="l00172"></a>00172     <span class="comment">// Create a JavaScript 'slot' (JSlot). The JavaScript slot always takes</span>
<a name="l00173"></a>00173     <span class="comment">// 2 arguments: the originator of the event (in our case the</span>
<a name="l00174"></a>00174     <span class="comment">// button or text area), and the JavaScript event object.</span>
<a name="l00175"></a>00175     <a class="code" href="classSimpleChatWidget.html#7e58bf2312b413d2d649500c26a6f8d6">clearInput_</a>.<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1JSlot.html#4e28a8ef6d2965aeaac0c5dcf587bbbb">setJavaScript</a>
<a name="l00176"></a>00176       (<span class="stringliteral">"function(o, e) {"</span>
<a name="l00177"></a>00177        <span class="stringliteral">""</span> + <a class="code" href="classSimpleChatWidget.html#4b658b56ef4ba1862765b9ad84fd9a9c">messageEdit_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WWidget.html#a2b7078b3b43d53a85e5244b45d504f7">jsRef</a>() + <span class="stringliteral">".value='';"</span>
<a name="l00178"></a>00178        <span class="stringliteral">"}"</span>);
<a name="l00179"></a>00179 
<a name="l00180"></a>00180     <span class="comment">// Bind the C++ and JavaScript event handlers.</span>
<a name="l00181"></a>00181     <a class="code" href="classSimpleChatWidget.html#a9a81423eda8238f8aa37be1a5a5bee8">sendButton_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WInteractWidget.html#e11e050cce0d4a8f742afa3ef92bfe8c">clicked</a>().connect(SLOT(<span class="keyword">this</span>, <a class="code" href="classSimpleChatWidget.html#d1c4dc9e6aca0c5b8e1db81ee7c5fad3">SimpleChatWidget::send</a>));
<a name="l00182"></a>00182     <a class="code" href="classSimpleChatWidget.html#4b658b56ef4ba1862765b9ad84fd9a9c">messageEdit_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WInteractWidget.html#38f06d1ad95e7599b055f49931236c10">enterPressed</a>().<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1EventSignal.html#6efcb92576b5aa846a3354dd26918a9f">connect</a>(SLOT(<span class="keyword">this</span>, <a class="code" href="classSimpleChatWidget.html#d1c4dc9e6aca0c5b8e1db81ee7c5fad3">SimpleChatWidget::send</a>));
<a name="l00183"></a>00183     <a class="code" href="classSimpleChatWidget.html#a9a81423eda8238f8aa37be1a5a5bee8">sendButton_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WInteractWidget.html#e11e050cce0d4a8f742afa3ef92bfe8c">clicked</a>().connect(<a class="code" href="classSimpleChatWidget.html#7e58bf2312b413d2d649500c26a6f8d6">clearInput_</a>);
<a name="l00184"></a>00184     <a class="code" href="classSimpleChatWidget.html#4b658b56ef4ba1862765b9ad84fd9a9c">messageEdit_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WInteractWidget.html#38f06d1ad95e7599b055f49931236c10">enterPressed</a>().<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1EventSignal.html#6efcb92576b5aa846a3354dd26918a9f">connect</a>(<a class="code" href="classSimpleChatWidget.html#7e58bf2312b413d2d649500c26a6f8d6">clearInput_</a>);
<a name="l00185"></a>00185 
<a name="l00186"></a>00186     <span class="comment">// Prevent the enter from generating a new line, which is its</span>
<a name="l00187"></a>00187     <span class="comment">// default function</span>
<a name="l00188"></a>00188     <a class="code" href="classSimpleChatWidget.html#4b658b56ef4ba1862765b9ad84fd9a9c">messageEdit_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WInteractWidget.html#38f06d1ad95e7599b055f49931236c10">enterPressed</a>().setPreventDefault(<span class="keyword">true</span>);
<a name="l00189"></a>00189 
<a name="l00190"></a>00190     b-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WInteractWidget.html#e11e050cce0d4a8f742afa3ef92bfe8c">clicked</a>().connect(SLOT(<span class="keyword">this</span>, <a class="code" href="classSimpleChatWidget.html#bff498a5a43a7e0caac5f2140f14e301">SimpleChatWidget::logout</a>));
<a name="l00191"></a>00191 
<a name="l00192"></a>00192     <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WText.html">WText</a> *msg = <span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WText.html">WText</a>
<a name="l00193"></a>00193       (<span class="stringliteral">"&lt;div&gt;&lt;span class='chat-info'&gt;You are joining the conversation as "</span>
<a name="l00194"></a>00194        + <a class="code" href="classSimpleChatWidget.html#596f7cbf70f45da9af017ac9d6f55ebc">user_</a> + <span class="stringliteral">"&lt;/span&gt;&lt;/div&gt;"</span>, <a class="code" href="classSimpleChatWidget.html#32a593ed511997f32a33a55d651ce79d">messages_</a>);
<a name="l00195"></a>00195     msg-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WWebWidget.html#6fd43dced1a62f7e79bc3522eeb16216">setStyleClass</a>(<span class="stringliteral">"chat-msg"</span>);
<a name="l00196"></a>00196 
<a name="l00197"></a>00197     <a class="code" href="classSimpleChatWidget.html#282d3fa5a7aceea89558de31db4bb6e0">updateUsers</a>();
<a name="l00198"></a>00198     
<a name="l00199"></a>00199     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00200"></a>00200   } <span class="keywordflow">else</span>
<a name="l00201"></a>00201     <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00202"></a>00202 }
<a name="l00203"></a>00203 
<a name="l00204"></a><a class="code" href="classSimpleChatWidget.html#d1c4dc9e6aca0c5b8e1db81ee7c5fad3">00204</a> <span class="keywordtype">void</span> <a class="code" href="classSimpleChatWidget.html#d1c4dc9e6aca0c5b8e1db81ee7c5fad3">SimpleChatWidget::send</a>()
<a name="l00205"></a>00205 {
<a name="l00206"></a>00206   <span class="keywordflow">if</span> (!<a class="code" href="classSimpleChatWidget.html#4b658b56ef4ba1862765b9ad84fd9a9c">messageEdit_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WTextArea.html#d8b89ce30df2b02894c53b6ed71fe4a6">text</a>().<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WString.html#87a90e69ab25d62ba029e10ea244abaf">empty</a>()) {
<a name="l00207"></a>00207     <a class="code" href="classSimpleChatWidget.html#b29db4cbc3935964daf6b6c264ce68d3">server_</a>.<a class="code" href="classSimpleChatServer.html#ab42074f7904397b3547a6df89c16d9d" title="Send a message on behalve of a user.">sendMessage</a>(<a class="code" href="classSimpleChatWidget.html#596f7cbf70f45da9af017ac9d6f55ebc">user_</a>, <a class="code" href="classSimpleChatWidget.html#4b658b56ef4ba1862765b9ad84fd9a9c">messageEdit_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WTextArea.html#d8b89ce30df2b02894c53b6ed71fe4a6">text</a>());
<a name="l00208"></a>00208     <span class="keywordflow">if</span> (!WApplication::instance()-&gt;environment().ajax())
<a name="l00209"></a>00209       <a class="code" href="classSimpleChatWidget.html#4b658b56ef4ba1862765b9ad84fd9a9c">messageEdit_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WTextArea.html#1f05060c037d13c2c6c26f51f1fb9640">setText</a>(WString::Empty);
<a name="l00210"></a>00210   }
<a name="l00211"></a>00211 
<a name="l00212"></a>00212   <a class="code" href="classSimpleChatWidget.html#4b658b56ef4ba1862765b9ad84fd9a9c">messageEdit_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WFormWidget.html#fe33f5c3658ddbd08fec9f6c203c578b">setFocus</a>();
<a name="l00213"></a>00213 }
<a name="l00214"></a>00214 
<a name="l00215"></a><a class="code" href="classSimpleChatWidget.html#282d3fa5a7aceea89558de31db4bb6e0">00215</a> <span class="keywordtype">void</span> <a class="code" href="classSimpleChatWidget.html#282d3fa5a7aceea89558de31db4bb6e0">SimpleChatWidget::updateUsers</a>()
<a name="l00216"></a>00216 {
<a name="l00217"></a>00217   <a class="code" href="classSimpleChatWidget.html#ee074d5eb739091af79eb8dccc90853e">userList_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WContainerWidget.html#608f748cbdda763f1a11556ddad9fbe1">clear</a>();
<a name="l00218"></a>00218 
<a name="l00219"></a>00219   <a class="code" href="classSimpleChatServer.html#911329f24472ca7ed245ab18611488d4" title="Typedef for a collection of user names.">SimpleChatServer::UserSet</a> users = <a class="code" href="classSimpleChatWidget.html#b29db4cbc3935964daf6b6c264ce68d3">server_</a>.<a class="code" href="classSimpleChatServer.html#40f5c6465b1edb44278be93c97a29a39" title="Get the users currently logged in.">users</a>();
<a name="l00220"></a>00220 
<a name="l00221"></a>00221   <a class="code" href="classSimpleChatWidget.html#e3fdaeefe19e26c6c6ad9f7c0445af57">UserMap</a> oldUsers = <a class="code" href="classSimpleChatWidget.html#fe3350a7929733a5b93db803dee8704b">users_</a>;
<a name="l00222"></a>00222   <a class="code" href="classSimpleChatWidget.html#fe3350a7929733a5b93db803dee8704b">users_</a>.clear();
<a name="l00223"></a>00223 
<a name="l00224"></a>00224   <span class="keywordflow">for</span> (SimpleChatServer::UserSet::iterator i = users.begin();
<a name="l00225"></a>00225        i != users.end(); ++i) {
<a name="l00226"></a>00226     <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WCheckBox.html">WCheckBox</a> *w = <span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WCheckBox.html">WCheckBox</a>(*i, <a class="code" href="classSimpleChatWidget.html#ee074d5eb739091af79eb8dccc90853e">userList_</a>);
<a name="l00227"></a>00227     w-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WWebWidget.html#73c0244d363cd2f8bd4814fe1ebee2b1">setInline</a>(<span class="keyword">false</span>);
<a name="l00228"></a>00228 
<a name="l00229"></a>00229     UserMap::const_iterator j = oldUsers.find(*i);
<a name="l00230"></a>00230     <span class="keywordflow">if</span> (j != oldUsers.end())
<a name="l00231"></a>00231       w-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WAbstractToggleButton.html#6838c9a37f3e9e3c466e9f48bde55e62">setChecked</a>(j-&gt;second);
<a name="l00232"></a>00232     <span class="keywordflow">else</span>
<a name="l00233"></a>00233       w-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WAbstractToggleButton.html#6838c9a37f3e9e3c466e9f48bde55e62">setChecked</a>(<span class="keyword">true</span>);
<a name="l00234"></a>00234 
<a name="l00235"></a>00235     <a class="code" href="classSimpleChatWidget.html#fe3350a7929733a5b93db803dee8704b">users_</a>[*i] = w-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WAbstractToggleButton.html#bd40ce7a6c4b4e924c9097015f4971ea">isChecked</a>();
<a name="l00236"></a>00236     w-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WFormWidget.html#5216ba1594b5dc525cc47cad593c7ba8">changed</a>().<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1EventSignal.html#6efcb92576b5aa846a3354dd26918a9f">connect</a>(SLOT(<span class="keyword">this</span>, <a class="code" href="classSimpleChatWidget.html#76509fdffaf6a244c99977cf587c42e0">SimpleChatWidget::updateUser</a>));
<a name="l00237"></a>00237 
<a name="l00238"></a>00238     <span class="keywordflow">if</span> (*i == <a class="code" href="classSimpleChatWidget.html#596f7cbf70f45da9af017ac9d6f55ebc">user_</a>)
<a name="l00239"></a>00239       w-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WWebWidget.html#6fd43dced1a62f7e79bc3522eeb16216">setStyleClass</a>(<span class="stringliteral">"chat-self"</span>);
<a name="l00240"></a>00240   }
<a name="l00241"></a>00241 }
<a name="l00242"></a>00242 
<a name="l00243"></a><a class="code" href="classSimpleChatWidget.html#76509fdffaf6a244c99977cf587c42e0">00243</a> <span class="keywordtype">void</span> <a class="code" href="classSimpleChatWidget.html#76509fdffaf6a244c99977cf587c42e0">SimpleChatWidget::updateUser</a>()
<a name="l00244"></a>00244 {
<a name="l00245"></a>00245   <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WCheckBox.html">WCheckBox</a> *b = <span class="keyword">dynamic_cast&lt;</span><a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WCheckBox.html">WCheckBox</a> *<span class="keyword">&gt;</span>(<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WObject.html#413deb54de40ee278dd554e4960d58ca">sender</a>());
<a name="l00246"></a>00246   <a class="code" href="classSimpleChatWidget.html#fe3350a7929733a5b93db803dee8704b">users_</a>[b-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WAbstractToggleButton.html#3ef9682b5fe66d802380ccd6c698725d">text</a>()] = b-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WAbstractToggleButton.html#bd40ce7a6c4b4e924c9097015f4971ea">isChecked</a>();
<a name="l00247"></a>00247 }
<a name="l00248"></a>00248 
<a name="l00249"></a><a class="code" href="classSimpleChatWidget.html#cda2bbe138c3119e4c62a6132801a232">00249</a> <span class="keywordtype">void</span> <a class="code" href="classSimpleChatWidget.html#cda2bbe138c3119e4c62a6132801a232">SimpleChatWidget::processChatEvent</a>(<span class="keyword">const</span> <a class="code" href="classChatEvent.html" title="Encapsulate a chat event.">ChatEvent</a>&amp; event)
<a name="l00250"></a>00250 {
<a name="l00251"></a>00251   <span class="comment">/*</span>
<a name="l00252"></a>00252 <span class="comment">   * This is where the "server-push" happens. This method is called</span>
<a name="l00253"></a>00253 <span class="comment">   * when a new event or message needs to be notified to the user. In</span>
<a name="l00254"></a>00254 <span class="comment">   * general, it is called from another session.</span>
<a name="l00255"></a>00255 <span class="comment">   */</span>
<a name="l00256"></a>00256 
<a name="l00257"></a>00257   <span class="comment">/*</span>
<a name="l00258"></a>00258 <span class="comment">   * First, take the lock to safely manipulate the UI outside of the</span>
<a name="l00259"></a>00259 <span class="comment">   * normal event loop, by having exclusive access to the session.</span>
<a name="l00260"></a>00260 <span class="comment">   */</span>
<a name="l00261"></a>00261   <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WApplication_1_1UpdateLock.html">WApplication::UpdateLock</a> lock = <a class="code" href="classSimpleChatWidget.html#f27ada14cf08ce58437c2f3f72f0c4d1">app_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WApplication.html#c7582c37defc49b5e8d6ccbda3b68d45">getUpdateLock</a>();
<a name="l00262"></a>00262 
<a name="l00263"></a>00263   <span class="comment">/*</span>
<a name="l00264"></a>00264 <span class="comment">   * Format and append the line to the conversation.</span>
<a name="l00265"></a>00265 <span class="comment">   *</span>
<a name="l00266"></a>00266 <span class="comment">   * This is also the step where the automatic XSS filtering will kick in:</span>
<a name="l00267"></a>00267 <span class="comment">   * - if another user tried to pass on some JavaScript, it is filtered away.</span>
<a name="l00268"></a>00268 <span class="comment">   * - if another user did not provide valid XHTML, the text is automatically</span>
<a name="l00269"></a>00269 <span class="comment">   *   interpreted as PlainText</span>
<a name="l00270"></a>00270 <span class="comment">   */</span>
<a name="l00271"></a>00271   <span class="keywordtype">bool</span> needPush = <span class="keyword">false</span>;
<a name="l00272"></a>00272 
<a name="l00273"></a>00273   <span class="comment">/*</span>
<a name="l00274"></a>00274 <span class="comment">   * If it is not a normal message, also update the user list.</span>
<a name="l00275"></a>00275 <span class="comment">   */</span>
<a name="l00276"></a>00276   <span class="keywordflow">if</span> (event.<a class="code" href="classChatEvent.html#c932234e63d23080f4f91f7ae1167418" title="Get the event type.">type</a>() != <a class="code" href="classChatEvent.html#fa84446dae17c08fe15cf932fc0b7d61b8894351cd11a316e25495f677eb9ae1">ChatEvent::Message</a>) {
<a name="l00277"></a>00277     needPush = <span class="keyword">true</span>;
<a name="l00278"></a>00278     <a class="code" href="classSimpleChatWidget.html#282d3fa5a7aceea89558de31db4bb6e0">updateUsers</a>();
<a name="l00279"></a>00279   }
<a name="l00280"></a>00280 
<a name="l00281"></a>00281   <span class="keywordtype">bool</span> display = <span class="keyword">event</span>.type() != <a class="code" href="classChatEvent.html#fa84446dae17c08fe15cf932fc0b7d61b8894351cd11a316e25495f677eb9ae1">ChatEvent::Message</a>
<a name="l00282"></a>00282     || (<a class="code" href="classSimpleChatWidget.html#fe3350a7929733a5b93db803dee8704b">users_</a>.find(event.<a class="code" href="classChatEvent.html#dbeff19aece69e75ab0b69f2adecc5b6" title="Get the user who caused the event.">user</a>()) != <a class="code" href="classSimpleChatWidget.html#fe3350a7929733a5b93db803dee8704b">users_</a>.end() &amp;&amp; <a class="code" href="classSimpleChatWidget.html#fe3350a7929733a5b93db803dee8704b">users_</a>[<span class="keyword">event</span>.user()]);
<a name="l00283"></a>00283 
<a name="l00284"></a>00284   <span class="keywordflow">if</span> (display) {
<a name="l00285"></a>00285     needPush = <span class="keyword">true</span>;
<a name="l00286"></a>00286 
<a name="l00287"></a>00287     <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WText.html">WText</a> *w = <span class="keyword">new</span> <a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WText.html">WText</a>(event.<a class="code" href="classChatEvent.html#6df1eda449e68e7f29644e68919b2f3f" title="Get the message formatted as HTML, rendered for the given user.">formattedHTML</a>(<a class="code" href="classSimpleChatWidget.html#596f7cbf70f45da9af017ac9d6f55ebc">user_</a>), <a class="code" href="classSimpleChatWidget.html#32a593ed511997f32a33a55d651ce79d">messages_</a>);
<a name="l00288"></a>00288     w-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WWebWidget.html#73c0244d363cd2f8bd4814fe1ebee2b1">setInline</a>(<span class="keyword">false</span>);
<a name="l00289"></a>00289     w-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WWebWidget.html#6fd43dced1a62f7e79bc3522eeb16216">setStyleClass</a>(<span class="stringliteral">"chat-msg"</span>);
<a name="l00290"></a>00290 
<a name="l00291"></a>00291     <span class="comment">/*</span>
<a name="l00292"></a>00292 <span class="comment">     * Leave not more than 100 messages in the back-log</span>
<a name="l00293"></a>00293 <span class="comment">     */</span>
<a name="l00294"></a>00294     <span class="keywordflow">if</span> (<a class="code" href="classSimpleChatWidget.html#32a593ed511997f32a33a55d651ce79d">messages_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WContainerWidget.html#85abd4d928575717052ff7fa04c3c2c9">count</a>() &gt; 100)
<a name="l00295"></a>00295       <span class="keyword">delete</span> <a class="code" href="classSimpleChatWidget.html#32a593ed511997f32a33a55d651ce79d">messages_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WWebWidget.html#6f32718bcdfa546f012c795f80f319e3">children</a>()[0];
<a name="l00296"></a>00296 
<a name="l00297"></a>00297     <span class="comment">/*</span>
<a name="l00298"></a>00298 <span class="comment">     * Little javascript trick to make sure we scroll along with new content</span>
<a name="l00299"></a>00299 <span class="comment">     */</span>
<a name="l00300"></a>00300     <a class="code" href="classSimpleChatWidget.html#f27ada14cf08ce58437c2f3f72f0c4d1">app_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WApplication.html#2a92457b9212cef4057cb54e56183967">doJavaScript</a>(<a class="code" href="classSimpleChatWidget.html#32a593ed511997f32a33a55d651ce79d">messages_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WWidget.html#a2b7078b3b43d53a85e5244b45d504f7">jsRef</a>() + <span class="stringliteral">".scrollTop += "</span>
<a name="l00301"></a>00301                        + <a class="code" href="classSimpleChatWidget.html#32a593ed511997f32a33a55d651ce79d">messages_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WWidget.html#a2b7078b3b43d53a85e5244b45d504f7">jsRef</a>() + <span class="stringliteral">".scrollHeight;"</span>);
<a name="l00302"></a>00302 
<a name="l00303"></a>00303     <span class="comment">/* If this message belongs to another user, play a received sound */</span>
<a name="l00304"></a>00304     <span class="keywordflow">if</span> (event.<a class="code" href="classChatEvent.html#dbeff19aece69e75ab0b69f2adecc5b6" title="Get the user who caused the event.">user</a>() != <a class="code" href="classSimpleChatWidget.html#596f7cbf70f45da9af017ac9d6f55ebc">user_</a>)
<a name="l00305"></a>00305       <a class="code" href="classSimpleChatWidget.html#47d6f7d355107d9d44d3662b8c3de442">messageReceived_</a>.<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WSound.html#6ca6b48ebc9e49ee6745228961df3817">play</a>();
<a name="l00306"></a>00306   }
<a name="l00307"></a>00307 
<a name="l00308"></a>00308   <span class="keywordflow">if</span> (needPush)
<a name="l00309"></a>00309     <a class="code" href="classSimpleChatWidget.html#f27ada14cf08ce58437c2f3f72f0c4d1">app_</a>-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html/" href="../../reference/html/classWt_1_1WApplication.html#51f50e0641a6d702a7c6ab7f8dd5946a">triggerUpdate</a>();
<a name="l00310"></a>00310 }
</pre></div></div>
<hr size="1"><address style="align: right;"><small>
Generated on Fri Mar 26 17:12:12 2010 for <a href="http://www.webtoolkit.eu/wt/">Wt</a> by&nbsp;<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.6</small></address>
</body>
</html>