Reviewed by Darin.
[WebKit-https.git] / WebCore / khtml / xml / dom2_eventsimpl.h
1 /*
2  * This file is part of the DOM implementation for KDE.
3  *
4  * Copyright (C) 2001 Peter Kelly (pmk@post.com)
5  * Copyright (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de)
6  * Copyright (C) 2003 Apple Computer, Inc.
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  *
23  */
24
25 #ifndef _DOM_EventsImpl_h_
26 #define _DOM_EventsImpl_h_
27
28 #include "dom/dom2_events.h"
29 #include "misc/shared.h"
30 #include "xml/dom2_viewsimpl.h"
31 #include <qdatetime.h>
32 #include <qevent.h>
33
34 class KHTMLPart;
35 class QPoint;
36 class QStringList;
37
38 namespace DOM {
39
40 class AbstractViewImpl;
41 class DOMStringImpl;
42 class NodeImpl;
43 class ClipboardImpl;
44
45 // ### support user-defined events
46
47 class EventImpl : public khtml::Shared<EventImpl>
48 {
49 public:
50     enum EventId {
51         UNKNOWN_EVENT = 0,
52         // UI events
53         DOMFOCUSIN_EVENT,
54         DOMFOCUSOUT_EVENT,
55         DOMACTIVATE_EVENT,
56         // Mouse events
57         CLICK_EVENT,
58         MOUSEDOWN_EVENT,
59         MOUSEUP_EVENT,
60         MOUSEOVER_EVENT,
61         MOUSEMOVE_EVENT,
62         MOUSEOUT_EVENT,
63         // IE copy/paste events
64         BEFORECUT_EVENT,
65         CUT_EVENT,
66         BEFORECOPY_EVENT,
67         COPY_EVENT,
68         BEFOREPASTE_EVENT,
69         PASTE_EVENT,
70         // IE drag and drop events
71         DRAGENTER_EVENT,
72         DRAGOVER_EVENT,
73         DRAGLEAVE_EVENT,
74         DROP_EVENT,
75         DRAGSTART_EVENT,
76         DRAG_EVENT,
77         DRAGEND_EVENT,
78         // IE selection events
79         SELECTSTART_EVENT,
80         // Mutation events
81         DOMSUBTREEMODIFIED_EVENT,
82         DOMNODEINSERTED_EVENT,
83         DOMNODEREMOVED_EVENT,
84         DOMNODEREMOVEDFROMDOCUMENT_EVENT,
85         DOMNODEINSERTEDINTODOCUMENT_EVENT,
86         DOMATTRMODIFIED_EVENT,
87         DOMCHARACTERDATAMODIFIED_EVENT,
88         // HTML events
89         LOAD_EVENT,
90         UNLOAD_EVENT,
91         ABORT_EVENT,
92         ERROR_EVENT,
93         SELECT_EVENT,
94         CHANGE_EVENT,
95         SUBMIT_EVENT,
96         RESET_EVENT,
97         FOCUS_EVENT,
98         BLUR_EVENT,
99         RESIZE_EVENT,
100         SCROLL_EVENT,
101         CONTEXTMENU_EVENT,
102 #if APPLE_CHANGES
103         SEARCH_EVENT,
104 #endif
105         INPUT_EVENT,
106         // Keyboard events
107         KEYDOWN_EVENT,
108         KEYUP_EVENT,
109         // Text events
110         TEXTINPUT_EVENT,
111         // khtml events (not part of DOM)
112         KHTML_DBLCLICK_EVENT, // for html ondblclick
113         KHTML_CLICK_EVENT, // for html onclick
114         KHTML_DRAGDROP_EVENT,
115         KHTML_ERROR_EVENT,
116         KEYPRESS_EVENT,
117         KHTML_MOVE_EVENT,
118         KHTML_ORIGCLICK_MOUSEUP_EVENT,
119         // XMLHttpRequest events
120         KHTML_READYSTATECHANGE_EVENT
121     };
122
123     EventImpl();
124     EventImpl(EventId _id, bool canBubbleArg, bool cancelableArg);
125     virtual ~EventImpl();
126
127     EventId id() const { return m_id; }
128
129     DOMString type() const;
130     NodeImpl *target() const;
131     void setTarget(NodeImpl *_target);
132     NodeImpl *currentTarget() const;
133     void setCurrentTarget(NodeImpl *_currentTarget);
134     unsigned short eventPhase() const;
135     void setEventPhase(unsigned short _eventPhase);
136     bool bubbles() const;
137     bool cancelable() const;
138     DOMTimeStamp timeStamp();
139     void stopPropagation();
140     void preventDefault();
141     void initEvent(const DOMString &eventTypeArg, bool canBubbleArg, bool cancelableArg);
142
143     virtual bool isUIEvent() const;
144     virtual bool isMouseEvent() const;
145     virtual bool isMutationEvent() const;
146     virtual bool isKeyboardEvent() const;
147     virtual bool isDragEvent() const;   // a subset of mouse events
148     virtual bool isClipboardEvent() const;
149
150     bool propagationStopped() const { return m_propagationStopped; }
151     bool defaultPrevented() const { return m_defaultPrevented; }
152
153     static EventId typeToId(DOMString type);
154     static DOMString idToType(EventId id);
155
156     void setDefaultHandled() { m_defaultHandled = true; }
157     bool defaultHandled() const { return m_defaultHandled; }
158
159     void setCancelBubble(bool cancel) { m_cancelBubble = cancel; }
160     void setDefaultPrevented(bool defaultPrevented) { m_defaultPrevented = defaultPrevented; }
161     bool getCancelBubble() const { return m_cancelBubble; }
162
163 protected:
164     DOMStringImpl *m_type;
165     bool m_canBubble;
166     bool m_cancelable;
167
168     bool m_propagationStopped;
169     bool m_defaultPrevented;
170     bool m_defaultHandled;
171     bool m_cancelBubble;
172
173     EventId m_id;
174     NodeImpl *m_currentTarget; // ref > 0 maintained externally
175     unsigned short m_eventPhase;
176     NodeImpl *m_target;
177     QDateTime m_createTime;
178 };
179
180
181
182 class UIEventImpl : public EventImpl
183 {
184 public:
185     UIEventImpl();
186     UIEventImpl(EventId _id,
187                 bool canBubbleArg,
188                 bool cancelableArg,
189                 AbstractViewImpl *viewArg,
190                 long detailArg);
191     virtual ~UIEventImpl();
192     AbstractViewImpl *view() const { return m_view; }
193     long detail() const { return m_detail; }
194     void initUIEvent(const DOMString &typeArg,
195                      bool canBubbleArg,
196                      bool cancelableArg,
197                      const AbstractView &viewArg,
198                      long detailArg);
199     virtual bool isUIEvent() const;
200
201 protected:
202     AbstractViewImpl *m_view;
203     long m_detail;
204
205 };
206
207
208
209
210 // Introduced in DOM Level 2: - internal
211 class MouseEventImpl : public UIEventImpl {
212 public:
213     MouseEventImpl();
214     MouseEventImpl(EventId _id,
215                    bool canBubbleArg,
216                    bool cancelableArg,
217                    AbstractViewImpl *viewArg,
218                    long detailArg,
219                    long screenXArg,
220                    long screenYArg,
221                    long clientXArg,
222                    long clientYArg,
223                    bool ctrlKeyArg,
224                    bool altKeyArg,
225                    bool shiftKeyArg,
226                    bool metaKeyArg,
227                    unsigned short buttonArg,
228                    NodeImpl *relatedTargetArg,
229                    ClipboardImpl *clipboardArg=0);
230     virtual ~MouseEventImpl();
231     long screenX() const { return m_screenX; }
232     long screenY() const { return m_screenY; }
233     long clientX() const { return m_clientX; }
234     long clientY() const { return m_clientY; }
235     long layerX() const { return m_layerX; }
236     long layerY() const { return m_layerY; }
237     bool ctrlKey() const { return m_ctrlKey; }
238     bool shiftKey() const { return m_shiftKey; }
239     bool altKey() const { return m_altKey; }
240     bool metaKey() const { return m_metaKey; }
241     unsigned short button() const { return m_button; }
242     NodeImpl *relatedTarget() const { return m_relatedTarget; }
243     ClipboardImpl *clipboard() const { return m_clipboard; }
244     void initMouseEvent(const DOMString &typeArg,
245                         bool canBubbleArg,
246                         bool cancelableArg,
247                         const AbstractView &viewArg,
248                         long detailArg,
249                         long screenXArg,
250                         long screenYArg,
251                         long clientXArg,
252                         long clientYArg,
253                         bool ctrlKeyArg,
254                         bool altKeyArg,
255                         bool shiftKeyArg,
256                         bool metaKeyArg,
257                         unsigned short buttonArg,
258                         const Node &relatedTargetArg);
259     virtual bool isMouseEvent() const;
260     virtual bool isDragEvent() const;
261 protected:
262     long m_screenX;
263     long m_screenY;
264     long m_clientX;
265     long m_clientY;
266     long m_layerX;
267     long m_layerY;
268     bool m_ctrlKey;
269     bool m_altKey;
270     bool m_shiftKey;
271     bool m_metaKey;
272     unsigned short m_button;
273     NodeImpl *m_relatedTarget;
274     ClipboardImpl *m_clipboard;
275  private:
276     void computeLayerPos();
277 };
278
279
280 // Introduced in DOM Level 3
281 class KeyboardEventImpl : public UIEventImpl {
282 public:
283     KeyboardEventImpl();
284     KeyboardEventImpl(QKeyEvent *key, AbstractViewImpl *view);
285     KeyboardEventImpl(EventId _id,
286                 bool canBubbleArg,
287                 bool cancelableArg,
288                 AbstractViewImpl *viewArg,
289                 const DOMString &keyIdentifierArg,
290                 unsigned long keyLocationArg,
291                 bool ctrlKeyArg,
292                 bool shiftKeyArg,
293                 bool altKeyArg,
294                 bool metaKeyArg,
295                 bool altGraphKeyArg);
296     virtual ~KeyboardEventImpl();
297     
298     void initKeyboardEvent(const DOMString &typeArg,
299                 bool canBubbleArg,
300                 bool cancelableArg,
301                 const AbstractView &viewArg,
302                 const DOMString &keyIdentifierArg,
303                 unsigned long keyLocationArg,
304                 bool ctrlKeyArg,
305                 bool shiftKeyArg,
306                 bool altKeyArg,
307                 bool metaKeyArg,
308                 bool altGraphKeyArg);
309     
310     DOMString keyIdentifier() const { return m_keyIdentifier; }
311     unsigned long keyLocation() const { return m_keyLocation; }
312     
313     bool ctrlKey() const { return m_ctrlKey; }
314     bool shiftKey() const { return m_shiftKey; }
315     bool altKey() const { return m_altKey; }
316     bool metaKey() const { return m_metaKey; }
317     bool altGraphKey() const { return m_altGraphKey; }
318     
319     QKeyEvent *qKeyEvent() const { return m_keyEvent; }
320
321     int keyCode() const; // key code for keydown and keyup, character for other events
322     int charCode() const;
323     
324     virtual bool isKeyboardEvent() const;
325
326 private:
327     QKeyEvent *m_keyEvent;
328     DOMStringImpl *m_keyIdentifier;
329     unsigned long m_keyLocation;
330     bool m_ctrlKey : 1;
331     bool m_shiftKey : 1;
332     bool m_altKey : 1;
333     bool m_metaKey : 1;
334     bool m_altGraphKey : 1;
335 };
336
337 class MutationEventImpl : public EventImpl {
338 // ### fire these during parsing (if necessary)
339 public:
340     MutationEventImpl();
341     MutationEventImpl(EventId _id,
342                       bool canBubbleArg,
343                       bool cancelableArg,
344                       const Node &relatedNodeArg,
345                       const DOMString &prevValueArg,
346                       const DOMString &newValueArg,
347                       const DOMString &attrNameArg,
348                       unsigned short attrChangeArg);
349     ~MutationEventImpl();
350
351     Node relatedNode() const { return m_relatedNode; }
352     DOMString prevValue() const { return m_prevValue; }
353     DOMString newValue() const { return m_newValue; }
354     DOMString attrName() const { return m_attrName; }
355     unsigned short attrChange() const { return m_attrChange; }
356     void initMutationEvent(const DOMString &typeArg,
357                            bool canBubbleArg,
358                            bool cancelableArg,
359                            const Node &relatedNodeArg,
360                            const DOMString &prevValueArg,
361                            const DOMString &newValueArg,
362                            const DOMString &attrNameArg,
363                            unsigned short attrChangeArg);
364     virtual bool isMutationEvent() const;
365 protected:
366     NodeImpl *m_relatedNode;
367     DOMStringImpl *m_prevValue;
368     DOMStringImpl *m_newValue;
369     DOMStringImpl *m_attrName;
370     unsigned short m_attrChange;
371 };
372
373 class ClipboardEventImpl : public EventImpl {
374 public:
375     ClipboardEventImpl();
376     ClipboardEventImpl(EventId _id, bool canBubbleArg, bool cancelableArg, ClipboardImpl *clipboardArg);
377     ~ClipboardEventImpl();
378
379     ClipboardImpl *clipboard() const { return m_clipboard; }
380     virtual bool isClipboardEvent() const;
381 protected:
382     ClipboardImpl *m_clipboard;
383 };
384
385 class RegisteredEventListener {
386 public:
387     RegisteredEventListener(EventImpl::EventId _id, EventListener *_listener, bool _useCapture);
388     ~RegisteredEventListener();
389
390     bool operator==(const RegisteredEventListener &other);
391
392     EventImpl::EventId id;
393     EventListener *listener;
394     bool useCapture;
395 private:
396     RegisteredEventListener( const RegisteredEventListener & );
397     RegisteredEventListener & operator=( const RegisteredEventListener & );
398 };
399
400 // State available during IE's events for drag and drop and copy/paste
401 class ClipboardImpl : public khtml::Shared<ClipboardImpl> {
402 public:
403     ClipboardImpl();
404     virtual ~ClipboardImpl();
405     // Is this operation a drag-drop or a copy-paste?
406     virtual bool isForDragging() const = 0;
407
408     virtual DOMString dropEffect() const = 0;
409     virtual void setDropEffect(const DOMString &s) = 0;
410     virtual DOMString effectAllowed() const = 0;
411     virtual void setEffectAllowed(const DOMString &s) = 0;
412     
413     virtual void clearData(const DOMString &type) = 0;
414     virtual void clearAllData() = 0;
415     virtual DOMString getData(const DOMString &type, bool &success) const = 0;
416     virtual bool setData(const DOMString &type, const DOMString &data) = 0;
417     
418     // extensions beyond IE's API
419     virtual QStringList types() const = 0;
420     
421     virtual QPoint dragLocation() const = 0;
422     virtual QPixmap dragImage() const = 0;
423     virtual void setDragImage(const QPixmap &, const QPoint &) = 0;
424     virtual const Node dragImageElement() = 0;
425     virtual void setDragImageElement(const Node &, const QPoint &) = 0;
426 };
427
428 }; //namespace
429 #endif