Line | Count | Source |
1 | | // This may look like C code, but it's really -*- C++ -*- |
2 | | /* |
3 | | * Copyright (C) 2008 Emweb bv, Herent, Belgium. |
4 | | * |
5 | | * See the LICENSE file for terms of use. |
6 | | */ |
7 | | #ifndef WEVENT_H_ |
8 | | #define WEVENT_H_ |
9 | | |
10 | | #include <Wt/WGlobal.h> |
11 | | #include <string> |
12 | | #include <vector> |
13 | | |
14 | | namespace Wt { |
15 | | |
16 | | /*! \brief A coordinate. |
17 | | */ |
18 | | struct Coordinates { |
19 | | int x; //!< X coordinate |
20 | | int y; //!< Y coordinate |
21 | | |
22 | | operator WPointF() const; |
23 | | |
24 | | /*! \brief Constructor. |
25 | | */ |
26 | 0 | Coordinates(int X, int Y) : x(X), y(Y) { } |
27 | | }; |
28 | | |
29 | | /*! \brief A single finger touch of a touch event. |
30 | | * |
31 | | * \sa WTouchEvent |
32 | | */ |
33 | | class WT_API Touch { |
34 | | public: |
35 | | /*! \brief Constructor. |
36 | | */ |
37 | | Touch(long long identifier, |
38 | | int clientX, int clientY, |
39 | | int documentX, int documentY, |
40 | | int screenX, int screenY, |
41 | | int widgetX, int widgetY); |
42 | | |
43 | | /*! \brief Returns the touch position relative to the document. |
44 | | */ |
45 | 0 | Coordinates document() const { return Coordinates(documentX_, documentY_); } |
46 | | |
47 | | /*! \brief Returns the touch position relative to the window. |
48 | | * |
49 | | * This differs from document() only when scrolling through |
50 | | * the document. |
51 | | */ |
52 | 0 | Coordinates window() const { return Coordinates(clientX_, clientY_); } |
53 | | |
54 | | /*! \brief Returns the touch position relative to the screen. |
55 | | */ |
56 | 0 | Coordinates screen() const { return Coordinates(screenX_, screenY_); } |
57 | | |
58 | | /*! \brief Returns the touch position relative to the widget. |
59 | | */ |
60 | 0 | Coordinates widget() const { return Coordinates(widgetX_, widgetY_); } |
61 | | |
62 | | /*! \brief Returns the identifier for this touch. |
63 | | */ |
64 | 0 | long long identifier() const { return identifier_; } |
65 | | |
66 | | private: |
67 | | int clientX_, clientY_; |
68 | | int documentX_, documentY_; |
69 | | int screenX_, screenY_; |
70 | | int widgetX_, widgetY_; |
71 | | long long identifier_; |
72 | | }; |
73 | | |
74 | | class WebRequest; |
75 | | class WObject; |
76 | | class WString; |
77 | | |
78 | | template<class E> class EventSignal; |
79 | | |
80 | | class WT_API JavaScriptEvent { |
81 | | public: |
82 | | // for mouse events: |
83 | | int clientX, clientY; |
84 | | int documentX, documentY; |
85 | | int screenX, screenY; |
86 | | int widgetX, widgetY; |
87 | | int dragDX, dragDY; |
88 | | int wheelDelta; |
89 | | |
90 | | // for key events or mouse event modifiers |
91 | | int button; |
92 | | int keyCode, charCode; |
93 | | WFlags<KeyboardModifier> modifiers; |
94 | | |
95 | | // for touch events |
96 | | std::vector<Touch> touches, targetTouches, changedTouches; |
97 | | |
98 | | // for gesture events |
99 | | double scale, rotation; |
100 | | |
101 | | // for scroll events |
102 | | int scrollX, scrollY, viewportWidth, viewportHeight; |
103 | | |
104 | | // event type |
105 | | std::string type; |
106 | | |
107 | | // target id |
108 | | std::string tid; |
109 | | |
110 | | std::string response; |
111 | | |
112 | | std::vector<std::string> userEventArgs; |
113 | | |
114 | | void get(const WebRequest& request, const std::string& se); |
115 | | |
116 | | JavaScriptEvent(); |
117 | | }; |
118 | | |
119 | | /*! \class WEvent Wt/WEvent.h Wt/WEvent.h |
120 | | * \brief An application event. |
121 | | * |
122 | | * The application is notified of an event (like a user interaction, a |
123 | | * sesion timeout, an internal keep-alive event, or other event) using |
124 | | * WApplication::notify(). |
125 | | * |
126 | | * You can check for a particular event type using eventType(). |
127 | | */ |
128 | | class WT_API WEvent { |
129 | | public: |
130 | | struct Impl; |
131 | | |
132 | | /*! \brief Returns the event type. |
133 | | */ |
134 | | EventType eventType() const; |
135 | | |
136 | | private: |
137 | | WEvent(const Impl& impl) |
138 | 0 | : impl_(impl) |
139 | 0 | { } |
140 | | |
141 | | const Impl& impl_; |
142 | | |
143 | | friend class WebSession; |
144 | | friend class WebController; |
145 | | }; |
146 | | |
147 | | #ifdef WT_TARGET_JAVA |
148 | | /*! \class WAbstractEvent Wt/WEvent.h Wt/WEvent.h |
149 | | * \brief Internal class WAbstractEvent. |
150 | | */ |
151 | | class WAbstractEvent |
152 | | { |
153 | | public: |
154 | | virtual WAbstractEvent *createFromJSEvent(const JavaScriptEvent& jsEvent) = 0; |
155 | | }; |
156 | | #endif // WT_TARGET_JAVA |
157 | | |
158 | | |
159 | | /*! \brief Enumeration for the mouse button. |
160 | | */ |
161 | | enum class MouseButton { |
162 | | None = 0, //!< No button |
163 | | Left = 1, //!< Left button |
164 | | Middle = 2, //!< Middle button |
165 | | Right = 4 //!< Right button |
166 | | }; |
167 | | |
168 | | /*! \class WMouseEvent Wt/WEvent.h Wt/WEvent.h |
169 | | * \brief A class providing details for a mouse event. |
170 | | * |
171 | | * \sa WInteractWidget::clicked(), WInteractWidget::doubleClicked(), |
172 | | * WInteractWidget::mouseWentDown(), WInteractWidget::mouseWentUp(), |
173 | | * WInteractWidget::mouseWentOver(), WInteractWidget::mouseMoved() |
174 | | * |
175 | | * \ingroup signalslot |
176 | | */ |
177 | | class WT_API WMouseEvent |
178 | | #ifdef WT_TARGET_JAVA |
179 | | : public WAbstractEvent |
180 | | #endif // WT_TARGET_JAVA |
181 | | { |
182 | | public: |
183 | | /*! \brief Typedef for enum Wt::MouseButton */ |
184 | | typedef MouseButton Button; |
185 | | |
186 | | /*! \brief Default constructor |
187 | | */ |
188 | | WMouseEvent(); |
189 | | |
190 | | /*! \brief Returns the button. |
191 | | * |
192 | | * If multiple buttons are currently pressed for a mouse moved or |
193 | | * mouse dragged event, then the one with the smallest numerical value |
194 | | * is returned. |
195 | | */ |
196 | | MouseButton button() const; |
197 | | |
198 | | /*! \brief Returns keyboard modifiers. |
199 | | * |
200 | | * The result is a logical OR of \link Wt::KeyboardModifier |
201 | | * KeyboardModifier\endlink flags. |
202 | | */ |
203 | 0 | WFlags<KeyboardModifier> modifiers() const { return jsEvent_.modifiers; } |
204 | | |
205 | | /*! \brief Returns the mouse position relative to the document. |
206 | | */ |
207 | | Coordinates document() const |
208 | 0 | { return Coordinates(jsEvent_.documentX, jsEvent_.documentY); } |
209 | | |
210 | | /*! \brief Returns the mouse position relative to the window. |
211 | | * |
212 | | * This differs from documentX() only through scrolling |
213 | | * through the document. |
214 | | */ |
215 | | Coordinates window() const |
216 | 0 | { return Coordinates(jsEvent_.clientX, jsEvent_.clientY); } |
217 | | |
218 | | /*! \brief Returns the mouse position relative to the screen. |
219 | | */ |
220 | | Coordinates screen() const |
221 | 0 | { return Coordinates(jsEvent_.screenX, jsEvent_.screenY); } |
222 | | |
223 | | /*! \brief Returns the mouse position relative to the widget. |
224 | | */ |
225 | | Coordinates widget() const |
226 | 0 | { return Coordinates(jsEvent_.widgetX, jsEvent_.widgetY); } |
227 | | |
228 | | /*! \brief Returns the distance over which the mouse has been dragged. |
229 | | * |
230 | | * This is only defined for a WInteractWidget::mouseWentUp() event. |
231 | | */ |
232 | | Coordinates dragDelta() const |
233 | 0 | { return Coordinates(jsEvent_.dragDX, jsEvent_.dragDY); } |
234 | | |
235 | | /*! \brief Returns the scroll wheel delta. |
236 | | * |
237 | | * This is 1 when wheel was scrolled up or -1 when wheel was scrolled down. |
238 | | * |
239 | | * This is only defined for a WInteractWidget::mouseWheel() event. |
240 | | */ |
241 | 0 | int wheelDelta() const { return jsEvent_.wheelDelta; } |
242 | | |
243 | | #ifdef WT_TARGET_JAVA |
244 | | virtual WAbstractEvent *createFromJSEvent(const JavaScriptEvent& jsEvent) |
245 | | { |
246 | | return new WMouseEvent(jsEvent); |
247 | | } |
248 | | |
249 | | static WMouseEvent templateEvent; |
250 | | #endif // WT_TARGET_JAVA |
251 | | |
252 | | WMouseEvent(const JavaScriptEvent& jsEvent); |
253 | | |
254 | | protected: |
255 | | JavaScriptEvent jsEvent_; |
256 | | }; |
257 | | |
258 | | /*! \class WKeyEvent Wt/WEvent.h Wt/WEvent.h |
259 | | * \brief A class providing details for a keyboard event. |
260 | | * |
261 | | * A key event is associated with the WInteractWidget::keyWentDown(), |
262 | | * WInteractWidget::keyWentUp() and WInteractWidget::keyPressed() |
263 | | * signals. |
264 | | * |
265 | | * \ingroup signalslot |
266 | | */ |
267 | | class WT_API WKeyEvent |
268 | | #ifdef WT_TARGET_JAVA |
269 | | : public WAbstractEvent |
270 | | #endif // WT_TARGET_JAVA |
271 | | { |
272 | | public: |
273 | | /*! \brief Default constructor |
274 | | */ |
275 | | WKeyEvent(); |
276 | | |
277 | | /*! \brief Returns the key code key that was pressed or released. |
278 | | * |
279 | | * The key code corresponds to the actual key on the keyboard, |
280 | | * rather than the generated character. |
281 | | * |
282 | | * All three types of key events provide this information. |
283 | | * |
284 | | * \sa modifiers(), charCode() |
285 | | */ |
286 | | Key key() const; |
287 | | |
288 | | /*! \brief Returns keyboard modifiers. |
289 | | * |
290 | | * The result is a logical OR of \link Wt::KeyboardModifier |
291 | | * KeyboardModifier\endlink flags. |
292 | | * |
293 | | * All three types of key events provide this information. |
294 | | * |
295 | | * \sa key(), charCode() |
296 | | */ |
297 | 0 | WFlags<KeyboardModifier> modifiers() const { return jsEvent_.modifiers; } |
298 | | |
299 | | /*! \brief Returns the unicode character code. |
300 | | * |
301 | | * This is only defined for a \link WInteractWidget::keyPressed |
302 | | * keyPressed \endlink event, and returns the unicode character code point |
303 | | * of a character that is entered. |
304 | | * |
305 | | * For the \link WInteractWidget::keyWentDown keyWentDown \endlink |
306 | | * and \link WInteractWidget::keyWentUp keyWentUp \endlink events, |
307 | | * '0' is returned. |
308 | | * |
309 | | * The charCode() may be different from key(). For example, a \link |
310 | | * Wt::Key::M Key::M\endlink key may correspond to 'm' or 'M' |
311 | | * character, depending on whether the shift key is pressed |
312 | | * simultaneously. |
313 | | * |
314 | | * \sa key(), text() |
315 | | */ |
316 | | int charCode() const; |
317 | | |
318 | | /*! \brief The (unicode) text that this key generated. |
319 | | * |
320 | | * This is only defined for a \link WInteractWidget::keyPressed |
321 | | * keyPressed \endlink event, and returns a string that holds |
322 | | * exactly one unicode character, which corresponds to charCode(). |
323 | | * |
324 | | * For the \link WInteractWidget::keyWentDown keyWentDown \endlink |
325 | | * and \link WInteractWidget::keyWentUp keyWentUp \endlink events, |
326 | | * an empty string is returned. |
327 | | * |
328 | | * \sa charCode() |
329 | | */ |
330 | | WT_USTRING text() const; |
331 | | |
332 | | #ifdef WT_TARGET_JAVA |
333 | | virtual WAbstractEvent *createFromJSEvent(const JavaScriptEvent& jsEvent) |
334 | | { |
335 | | return new WKeyEvent(jsEvent); |
336 | | } |
337 | | |
338 | | static WKeyEvent templateEvent; |
339 | | #endif // WT_TARGET_JAVA |
340 | | |
341 | | WKeyEvent(const JavaScriptEvent& jsEvent); |
342 | | |
343 | | private: |
344 | | JavaScriptEvent jsEvent_; |
345 | | }; |
346 | | |
347 | | /*! \class WDropEvent Wt/WEvent.h Wt/WEvent.h |
348 | | * \brief A class providing details for a drop event. |
349 | | * |
350 | | * \sa WWidget::dropEvent(WDropEvent) |
351 | | * |
352 | | * \ingroup signalslot |
353 | | */ |
354 | | class WT_API WDropEvent |
355 | | { |
356 | | public: |
357 | | /*! \brief The type of the original event. |
358 | | */ |
359 | | enum class OriginalEventType { |
360 | | Mouse, //!< The original event was a WMouseEvent |
361 | | Touch //!< The original event was a WTouchEvent |
362 | | }; |
363 | | |
364 | | /*! \brief Constructor. |
365 | | */ |
366 | | WDropEvent(WObject *source, const std::string& mimeType, |
367 | | const WMouseEvent& mouseEvent); |
368 | | |
369 | | /*! \brief Constructor. |
370 | | */ |
371 | | WDropEvent(WObject *source, const std::string& mimeType, |
372 | | const WTouchEvent& touchEvent); |
373 | | |
374 | | #ifndef WT_TARGET_JAVA |
375 | | WDropEvent(const WDropEvent &other); |
376 | | WDropEvent &operator=(const WDropEvent &other); |
377 | | #endif |
378 | | |
379 | | /*! \brief Returns the source of the drag&drop operation. |
380 | | * |
381 | | * The source is the widget that was set draggable using |
382 | | * WInteractWidget::setDraggable(). |
383 | | */ |
384 | 0 | WObject *source() const { return dropSource_; } |
385 | | |
386 | | /*! \brief Returns the mime type of this drop event. |
387 | | */ |
388 | 0 | const std::string& mimeType() const { return dropMimeType_; } |
389 | | |
390 | | /*! \brief Returns the original mouse event. |
391 | | * |
392 | | * If eventType() == OriginalEventType::Mouse, this returns the original mouse event, |
393 | | * otherwise this returns null. |
394 | | */ |
395 | 0 | const WMouseEvent *mouseEvent() const { return mouseEvent_.get(); } |
396 | | |
397 | | /*! \brief Returns the original touch event. |
398 | | * |
399 | | * If eventType() == OriginalEventType::Touch, this returns the original touch event, |
400 | | * otherwise this returns null. |
401 | | */ |
402 | 0 | const WTouchEvent *touchEvent() const { return touchEvent_.get(); } |
403 | | |
404 | | /*! \brief Returns the type of the original event. |
405 | | */ |
406 | 0 | OriginalEventType originalEventType() const { return mouseEvent_ ? OriginalEventType::Mouse : OriginalEventType::Touch; } |
407 | | |
408 | | private: |
409 | | WObject *dropSource_; |
410 | | std::string dropMimeType_; |
411 | | std::unique_ptr<const WMouseEvent> mouseEvent_; |
412 | | std::unique_ptr<const WTouchEvent> touchEvent_; |
413 | | }; |
414 | | |
415 | | /*! \class WScrollEvent Wt/WEvent.h Wt/WEvent.h |
416 | | * \brief A class providing details for a scroll event. |
417 | | * |
418 | | * \sa WContainerWidget::scrolled() |
419 | | * |
420 | | * \ingroup signalslot |
421 | | */ |
422 | | class WT_API WScrollEvent |
423 | | #ifdef WT_TARGET_JAVA |
424 | | : public WAbstractEvent |
425 | | #endif // WT_TARGET_JAVA |
426 | | { |
427 | | public: |
428 | | /*! \brief Default constructor |
429 | | */ |
430 | | WScrollEvent(); |
431 | | |
432 | | /*! \brief Returns the current horizontal scroll position. |
433 | | * |
434 | | * \sa scrollY(), viewportWidth() |
435 | | */ |
436 | 0 | int scrollX() const { return jsEvent_.scrollX; } |
437 | | |
438 | | /*! \brief Returns the current vertical scroll position. |
439 | | * |
440 | | * \sa scrollX(), viewportHeight() |
441 | | */ |
442 | 0 | int scrollY() const { return jsEvent_.scrollY; } |
443 | | |
444 | | /*! \brief Returns the current horizontal viewport width. |
445 | | * |
446 | | * Returns the current viewport width. |
447 | | * |
448 | | * \sa viewportHeight(), scrollX() |
449 | | */ |
450 | 0 | int viewportWidth() const { return jsEvent_.viewportWidth; } |
451 | | |
452 | | /*! \brief Returns the current horizontal viewport height. |
453 | | * |
454 | | * Returns the current viewport height. |
455 | | * |
456 | | * \sa viewportWidth(), scrollY() |
457 | | */ |
458 | 0 | int viewportHeight() const { return jsEvent_.viewportHeight; } |
459 | | |
460 | | #ifdef WT_TARGET_JAVA |
461 | | virtual WAbstractEvent *createFromJSEvent(const JavaScriptEvent& jsEvent) |
462 | | { |
463 | | return new WScrollEvent(jsEvent); |
464 | | } |
465 | | |
466 | | static WScrollEvent templateEvent; |
467 | | #endif // WT_TARGET_JAVA |
468 | | |
469 | | private: |
470 | | JavaScriptEvent jsEvent_; |
471 | | |
472 | | WScrollEvent(const JavaScriptEvent& jsEvent); |
473 | | |
474 | | friend class EventSignal<WScrollEvent>; |
475 | | }; |
476 | | |
477 | | /*! \class WTouchEvent Wt/WEvent.h Wt/WEvent.h |
478 | | * \brief A class providing details for a touch event. |
479 | | * |
480 | | * \sa WInteractWidget::touchStarted(), WInteractWidget::touchMoved(), |
481 | | * WInteractWidget::touchEnded() |
482 | | * |
483 | | * \ingroup signalslot |
484 | | */ |
485 | | class WT_API WTouchEvent |
486 | | #ifdef WT_TARGET_JAVA |
487 | | : public WAbstractEvent |
488 | | #endif // WT_TARGET_JAVA |
489 | | { |
490 | | public: |
491 | | /*! \brief Default constructor |
492 | | */ |
493 | | WTouchEvent(); |
494 | | |
495 | | /*! \brief Returns a list of \link Touch\endlink objects for every finger |
496 | | * currently touching the screen. |
497 | | */ |
498 | | const std::vector<Touch>& touches() const |
499 | 0 | { return jsEvent_.touches; } |
500 | | |
501 | | /*! \brief Returns a list of \link Touch\endlink objects for finger touches |
502 | | * that started out within the same widget. |
503 | | */ |
504 | | const std::vector<Touch>& targetTouches() const |
505 | 0 | { return jsEvent_.targetTouches; } |
506 | | |
507 | | /*! \brief Returns a list of \link Touch\endlink objects for every finger |
508 | | * involved in the event. |
509 | | */ |
510 | | const std::vector<Touch>& changedTouches() const |
511 | 0 | { return jsEvent_.changedTouches; } |
512 | | |
513 | | #ifdef WT_TARGET_JAVA |
514 | | virtual WAbstractEvent *createFromJSEvent(const JavaScriptEvent& jsEvent) |
515 | | { |
516 | | return new WTouchEvent(jsEvent); |
517 | | } |
518 | | |
519 | | static WTouchEvent templateEvent; |
520 | | #endif // WT_TARGET_JAVA |
521 | | |
522 | | WTouchEvent(const JavaScriptEvent& jsEvent); |
523 | | |
524 | | protected: |
525 | | JavaScriptEvent jsEvent_; |
526 | | }; |
527 | | |
528 | | /*! \class WGestureEvent Wt/WEvent.h Wt/WEvent.h |
529 | | * \brief A class providing details for a gesture event. |
530 | | * |
531 | | * \sa WInteractWidget::gestureStarted(), WInteractWidget::gestureChanged(), |
532 | | * WInteractWidget::gestureEnded() |
533 | | * |
534 | | * \ingroup signalslot |
535 | | */ |
536 | | class WT_API WGestureEvent |
537 | | #ifdef WT_TARGET_JAVA |
538 | | : public WAbstractEvent |
539 | | #endif // WT_TARGET_JAVA |
540 | | { |
541 | | public: |
542 | | /*! \brief Default constructor |
543 | | */ |
544 | | WGestureEvent(); |
545 | | |
546 | | /*! \brief Returns the multiplier which the user has pinched or pushed |
547 | | (relative to 1). |
548 | | */ |
549 | 0 | double scale() const { return jsEvent_.scale; } |
550 | | |
551 | | /*! \brief Returns the number of degrees the user has rotated his/her fingers. |
552 | | */ |
553 | 0 | double rotation() const { return jsEvent_.rotation; } |
554 | | |
555 | | #ifdef WT_TARGET_JAVA |
556 | | virtual WAbstractEvent *createFromJSEvent(const JavaScriptEvent& jsEvent) |
557 | | { |
558 | | return new WGestureEvent(jsEvent); |
559 | | } |
560 | | |
561 | | static WGestureEvent templateEvent; |
562 | | #endif // WT_TARGET_JAVA |
563 | | |
564 | | WGestureEvent(const JavaScriptEvent& jsEvent); |
565 | | |
566 | | protected: |
567 | | JavaScriptEvent jsEvent_; |
568 | | }; |
569 | | |
570 | | } |
571 | | |
572 | | #endif // WEVENT_H_ |