diff options
Diffstat (limited to 'khtml/xml/dom2_eventsimpl.h')
-rw-r--r-- | khtml/xml/dom2_eventsimpl.h | 513 |
1 files changed, 513 insertions, 0 deletions
diff --git a/khtml/xml/dom2_eventsimpl.h b/khtml/xml/dom2_eventsimpl.h new file mode 100644 index 000000000..2f2034088 --- /dev/null +++ b/khtml/xml/dom2_eventsimpl.h @@ -0,0 +1,513 @@ +/* + * This file is part of the DOM implementation for KDE. + * + * Copyright (C) 2001 Peter Kelly (pmk@post.com) + * (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de) + * (C) 2002 Apple Computer, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef _DOM_EventsImpl_h_ +#define _DOM_EventsImpl_h_ + +#include "dom/dom2_events.h" +#include "xml/dom2_viewsimpl.h" + +class KHTMLPart; +class QMouseEvent; + +namespace DOM { + +class AbstractViewImpl; +class DOMStringImpl; +class NodeImpl; + +// ### support user-defined events + +class EventImpl : public khtml::Shared<EventImpl> +{ +public: + enum EventId { + UNKNOWN_EVENT = 0, + // UI events + DOMFOCUSIN_EVENT, + DOMFOCUSOUT_EVENT, + DOMACTIVATE_EVENT, + // Mouse events + CLICK_EVENT, + MOUSEDOWN_EVENT, + MOUSEUP_EVENT, + MOUSEOVER_EVENT, + MOUSEMOVE_EVENT, + MOUSEOUT_EVENT, + // Mutation events + DOMSUBTREEMODIFIED_EVENT, + DOMNODEINSERTED_EVENT, + DOMNODEREMOVED_EVENT, + DOMNODEREMOVEDFROMDOCUMENT_EVENT, + DOMNODEINSERTEDINTODOCUMENT_EVENT, + DOMATTRMODIFIED_EVENT, + DOMCHARACTERDATAMODIFIED_EVENT, + // HTML events + LOAD_EVENT, + UNLOAD_EVENT, + ABORT_EVENT, + ERROR_EVENT, + SELECT_EVENT, + CHANGE_EVENT, + SUBMIT_EVENT, + RESET_EVENT, + FOCUS_EVENT, + BLUR_EVENT, + RESIZE_EVENT, + SCROLL_EVENT, + // keyboard events + KEYDOWN_EVENT, + KEYUP_EVENT, + KEYPRESS_EVENT, //Mostly corresponds to DOM3 textInput event. + // khtml events (not part of DOM) + KHTML_ECMA_DBLCLICK_EVENT, // for html ondblclick + KHTML_ECMA_CLICK_EVENT, // for html onclick + KHTML_DRAGDROP_EVENT, + KHTML_MOVE_EVENT, + // XMLHttpRequest events + KHTML_READYSTATECHANGE_EVENT + }; + + EventImpl(); + EventImpl(EventId _id, bool canBubbleArg, bool cancelableArg); + virtual ~EventImpl(); + + EventId id() const { return m_id; } + + DOMString type() const { return m_type; } + NodeImpl *target() const { return m_target; } + void setTarget(NodeImpl *_target); + NodeImpl *currentTarget() const { return m_currentTarget; } + void setCurrentTarget(NodeImpl *_currentTarget) { m_currentTarget = _currentTarget; } + unsigned short eventPhase() const { return m_eventPhase; } + void setEventPhase(unsigned short _eventPhase) { m_eventPhase = _eventPhase; } + bool bubbles() const { return m_canBubble; } + bool cancelable() const { return m_cancelable; } + DOMTimeStamp timeStamp(); + void stopPropagation(bool stop) { m_propagationStopped = stop; } + void preventDefault(bool prevent) { if ( m_cancelable ) m_defaultPrevented = prevent; } + + void initEvent(const DOMString &eventTypeArg, bool canBubbleArg, bool cancelableArg); + + virtual bool isUIEvent() const; + virtual bool isMouseEvent() const; + virtual bool isMutationEvent() const; + virtual bool isTextInputEvent() const; + virtual bool isKeyboardEvent() const; + bool isKeyRelatedEvent() const { return isTextInputEvent() || isKeyboardEvent(); } + + bool propagationStopped() const { return m_propagationStopped; } + bool defaultPrevented() const { return m_defaultPrevented; } + + static EventId typeToId(DOMString type); + static DOMString idToType(EventId id); + + void setDefaultHandled() { m_defaultHandled = true; } + bool defaultHandled() const { return m_defaultHandled; } + + DOMString message() const { return m_message; } + void setMessage(const DOMString &_message) { m_message = _message; } + +protected: + DOMStringImpl *m_type; + bool m_canBubble; + bool m_cancelable; + + bool m_propagationStopped; + bool m_defaultPrevented; + bool m_defaultHandled; + EventId m_id : 6; + unsigned short m_eventPhase : 2; + NodeImpl *m_currentTarget; // ref > 0 maintained externally + NodeImpl *m_target; + QDateTime m_createTime; + DOMString m_message; +}; + + + +class UIEventImpl : public EventImpl +{ +public: + UIEventImpl() : m_view(0), m_detail(0) {} + UIEventImpl(EventId _id, + bool canBubbleArg, + bool cancelableArg, + AbstractViewImpl *viewArg, + long detailArg); + virtual ~UIEventImpl(); + AbstractViewImpl *view() const { return m_view; } + long detail() const { return m_detail; } + void initUIEvent(const DOMString &typeArg, + bool canBubbleArg, + bool cancelableArg, + const AbstractView &viewArg, + long detailArg); + virtual bool isUIEvent() const; + +protected: + AbstractViewImpl *m_view; + long m_detail; + +}; + +// Introduced in DOM Level 2: - internal +class MouseEventImpl : public UIEventImpl { +public: + MouseEventImpl(); + MouseEventImpl(EventId _id, + bool canBubbleArg, + bool cancelableArg, + AbstractViewImpl *viewArg, + long detailArg, + long screenXArg, + long screenYArg, + long clientXArg, + long clientYArg, + long pageXArg, + long pageYArg, + bool ctrlKeyArg, + bool altKeyArg, + bool shiftKeyArg, + bool metaKeyArg, + unsigned short buttonArg, + NodeImpl *relatedTargetArg, + QMouseEvent *qe = 0, + bool isDoubleClick = false); + virtual ~MouseEventImpl(); + long screenX() const { return m_screenX; } + long screenY() const { return m_screenY; } + long clientX() const { return m_clientX; } + long clientY() const { return m_clientY; } + long layerX() const { return m_layerX; } // non-DOM extension + long layerY() const { return m_layerY; } // non-DOM extension + long pageX() const { return m_pageX; } // non-DOM extension + long pageY() const { return m_pageY; } // non-DOM extension + bool isDoubleClick() const { return m_isDoubleClick; } // non-DOM extension + bool ctrlKey() const { return m_ctrlKey; } + bool shiftKey() const { return m_shiftKey; } + bool altKey() const { return m_altKey; } + bool metaKey() const { return m_metaKey; } + unsigned short button() const { return m_button; } + NodeImpl *relatedTarget() const { return m_relatedTarget; } + + void computeLayerPos(); + + void initMouseEvent(const DOMString &typeArg, + bool canBubbleArg, + bool cancelableArg, + const AbstractView &viewArg, + long detailArg, + long screenXArg, + long screenYArg, + long clientXArg, + long clientYArg, + bool ctrlKeyArg, + bool altKeyArg, + bool shiftKeyArg, + bool metaKeyArg, + unsigned short buttonArg, + const Node &relatedTargetArg); + virtual bool isMouseEvent() const; + + QMouseEvent *qEvent() const { return m_qevent; } +protected: + long m_screenX; + long m_screenY; + long m_clientX; + long m_clientY; + long m_layerX; + long m_layerY; + long m_pageX; + long m_pageY; + bool m_ctrlKey : 1; + bool m_altKey : 1; + bool m_shiftKey : 1; + bool m_metaKey : 1; + bool m_isDoubleClick : 1; + unsigned short m_button; + NodeImpl *m_relatedTarget; + QMouseEvent *m_qevent; +}; + + +class KeyEventBaseImpl : public UIEventImpl { +public: + // VirtualKeyCode + enum KeyCodes { + DOM_VK_UNDEFINED = 0x0, + DOM_VK_RIGHT_ALT = 0x12, + DOM_VK_LEFT_ALT = 0x12, + DOM_VK_LEFT_CONTROL = 0x11, + DOM_VK_RIGHT_CONTROL = 0x11, + DOM_VK_LEFT_SHIFT = 0x10, + DOM_VK_RIGHT_SHIFT = 0x10, + DOM_VK_META = 0x9D, + DOM_VK_BACK_SPACE = 0x08, + DOM_VK_CAPS_LOCK = 0x14, + DOM_VK_DELETE = 0x7F, + DOM_VK_END = 0x23, + DOM_VK_ENTER = 0x0D, + DOM_VK_ESCAPE = 0x1B, + DOM_VK_HOME = 0x24, + DOM_VK_NUM_LOCK = 0x90, + DOM_VK_PAUSE = 0x13, + DOM_VK_PRINTSCREEN = 0x9A, + DOM_VK_SCROLL_LOCK = 0x91, + DOM_VK_SPACE = 0x20, + DOM_VK_TAB = 0x09, + DOM_VK_LEFT = 0x25, + DOM_VK_RIGHT = 0x27, + DOM_VK_UP = 0x26, + DOM_VK_DOWN = 0x28, + DOM_VK_PAGE_DOWN = 0x22, + DOM_VK_PAGE_UP = 0x21, + DOM_VK_F1 = 0x70, + DOM_VK_F2 = 0x71, + DOM_VK_F3 = 0x72, + DOM_VK_F4 = 0x73, + DOM_VK_F5 = 0x74, + DOM_VK_F6 = 0x75, + DOM_VK_F7 = 0x76, + DOM_VK_F8 = 0x77, + DOM_VK_F9 = 0x78, + DOM_VK_F10 = 0x79, + DOM_VK_F11 = 0x7A, + DOM_VK_F12 = 0x7B, + DOM_VK_F13 = 0xF000, + DOM_VK_F14 = 0xF001, + DOM_VK_F15 = 0xF002, + DOM_VK_F16 = 0xF003, + DOM_VK_F17 = 0xF004, + DOM_VK_F18 = 0xF005, + DOM_VK_F19 = 0xF006, + DOM_VK_F20 = 0xF007, + DOM_VK_F21 = 0xF008, + DOM_VK_F22 = 0xF009, + DOM_VK_F23 = 0xF00A, + DOM_VK_F24 = 0xF00B + }; + + void initKeyBaseEvent(const DOMString &typeArg, + bool canBubbleArg, + bool cancelableArg, + const AbstractView &viewArg, + unsigned long keyVal, + unsigned long virtKeyVal, + unsigned long modifiers); + + bool ctrlKey() const { return m_modifier & Qt::ControlButton; } + bool shiftKey() const { return m_modifier & Qt::ShiftButton; } + bool altKey() const { return m_modifier & Qt::AltButton; } + bool metaKey() const { return m_modifier & Qt::MetaButton; } + + bool inputGenerated() const { return m_virtKeyVal == 0; } + unsigned long keyVal() const { return m_keyVal; } + unsigned long virtKeyVal() const { return m_virtKeyVal; } + + QKeyEvent *qKeyEvent() const { if (!m_keyEvent) buildQKeyEvent(); return m_keyEvent; } + + //Legacy key stuff... + virtual int keyCode() const = 0; + virtual int charCode() const = 0; + + //### KDE4: remove these 2 + void initModifier(unsigned long modifierArg, bool valueArg); + bool checkModifier(unsigned long modifierArg); + + ~KeyEventBaseImpl(); + + //Returns true if the event was synthesized by client use of DOM + bool isSynthetic() const { return m_synthetic; } +protected: + KeyEventBaseImpl(): m_keyEvent(0), m_keyVal(0), m_virtKeyVal(0), m_modifier(0), m_synthetic(false) + { m_detail = 0; } + + KeyEventBaseImpl(EventId id, + bool canBubbleArg, + bool cancelableArg, + AbstractViewImpl *viewArg, + QKeyEvent *key); + + + mutable QKeyEvent *m_keyEvent; + unsigned long m_keyVal; //Unicode key value + unsigned long m_virtKeyVal; //Virtual key value for keys like arrows, Fn, etc. + + // bitfield containing state of modifiers. not part of the dom. + unsigned long m_modifier; + + bool m_synthetic; + + void buildQKeyEvent() const; //Construct a Qt key event from m_keyVal/m_virtKeyVal +}; + +class TextEventImpl : public KeyEventBaseImpl { +public: + TextEventImpl(); + + TextEventImpl(QKeyEvent* key, DOM::AbstractViewImpl* view); + + void initTextEvent(const DOMString &typeArg, + bool canBubbleArg, + bool cancelableArg, + const AbstractView &viewArg, + const DOMString& text); + + virtual bool isTextInputEvent() const; + + //Legacy key stuff... + int keyCode() const; + int charCode() const; + + DOMString data() const { return m_outputString; } +private: + DOMString m_outputString; +}; + +class KeyboardEventImpl : public KeyEventBaseImpl { +public: + KeyboardEventImpl(); + KeyboardEventImpl(QKeyEvent* key, DOM::AbstractViewImpl* view); + + virtual bool isKeyboardEvent() const; + + enum KeyLocation { + DOM_KEY_LOCATION_STANDARD = 0x00, + DOM_KEY_LOCATION_LEFT = 0x01, + DOM_KEY_LOCATION_RIGHT = 0x02, + DOM_KEY_LOCATION_NUMPAD = 0x03 + }; + + //Legacy key stuff... + int keyCode() const; + int charCode() const; + + DOMString keyIdentifier() const; + unsigned long keyLocation() const { return m_keyLocation; } + + bool getModifierState(const DOMString& keyIdentifierArg) const; + + void initKeyboardEvent(const DOMString &typeArg, + bool canBubbleArg, + bool cancelableArg, + const AbstractView &viewArg, + const DOMString &keyIdentifierArg, + unsigned long keyLocationArg, + const DOMString& modifiersList); + + //### KDE4: remove this, it's only for compatibility with + //the old TextEvent wrapper + void initKeyboardEvent(const DOMString &typeArg, + bool canBubbleArg, + bool cancelableArg, + const AbstractView &viewArg, + unsigned long keyVal, + unsigned long virtKeyVal, + unsigned long modifiers, + unsigned long keyLocationArg) { + initKeyBaseEvent(typeArg, canBubbleArg, cancelableArg, viewArg, + keyVal, virtKeyVal, modifiers); + m_keyLocation = keyLocationArg; + } +private: + unsigned long m_keyLocation; +}; + + + +class MutationEventImpl : public EventImpl { +// ### fire these during parsing (if necessary) +public: + MutationEventImpl(); + MutationEventImpl(EventId _id, + bool canBubbleArg, + bool cancelableArg, + const Node &relatedNodeArg, + const DOMString &prevValueArg, + const DOMString &newValueArg, + const DOMString &attrNameArg, + unsigned short attrChangeArg); + ~MutationEventImpl(); + + Node relatedNode() const { return m_relatedNode; } + DOMString prevValue() const { return m_prevValue; } + DOMString newValue() const { return m_newValue; } + DOMString attrName() const { return m_attrName; } + unsigned short attrChange() const { return m_attrChange; } + void initMutationEvent(const DOMString &typeArg, + bool canBubbleArg, + bool cancelableArg, + const Node &relatedNodeArg, + const DOMString &prevValueArg, + const DOMString &newValueArg, + const DOMString &attrNameArg, + unsigned short attrChangeArg); + virtual bool isMutationEvent() const; +protected: + NodeImpl *m_relatedNode; + DOMStringImpl *m_prevValue; + DOMStringImpl *m_newValue; + DOMStringImpl *m_attrName; + unsigned short m_attrChange; +}; + + +class RegisteredEventListener { +public: + RegisteredEventListener() : id(EventImpl::EventId(0)), useCapture(false), listener(0) {} + + RegisteredEventListener(EventImpl::EventId _id, EventListener *_listener, bool _useCapture) + : id(_id), useCapture(_useCapture), listener(_listener) { if (listener) listener->ref(); } + + ~RegisteredEventListener() { if (listener) listener->deref(); listener = 0; } + + bool operator==(const RegisteredEventListener &other) const + { return id == other.id && listener == other.listener && useCapture == other.useCapture; } + + + EventImpl::EventId id : 6; + bool useCapture; + EventListener *listener; + + RegisteredEventListener( const RegisteredEventListener &other ) : + id(other.id), useCapture(other.useCapture), listener(other.listener) + { if (listener) listener->ref(); } + + RegisteredEventListener & operator=( const RegisteredEventListener &other ) { + id = other.id; + useCapture = other.useCapture; + if (other.listener) + other.listener->ref(); + if (listener) + listener->deref(); + listener = other.listener; + return *this; + } +}; + + + +} //namespace +#endif |