15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2001 Peter Kelly (pmk@post.com)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003, 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef MouseEvent_h
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define MouseEvent_h
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/EventDispatchMediator.h"
2806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/MouseRelatedEvent.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class Clipboard;
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class EventDispatcher;
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class PlatformMouseEvent;
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)struct MouseEventInit : public UIEventInit {
37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    MouseEventInit();
38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int screenX;
40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int screenY;
41926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int clientX;
42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int clientY;
43926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool ctrlKey;
44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool altKey;
45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool shiftKey;
46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool metaKey;
47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    unsigned short button;
48f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    RefPtrWillBeMember<EventTarget> relatedTarget;
49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class MouseEvent : public MouseRelatedEvent {
52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public:
5307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    static PassRefPtrWillBeRawPtr<MouseEvent> create()
54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
55a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return adoptRefWillBeNoop(new MouseEvent);
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
5807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    static PassRefPtrWillBeRawPtr<MouseEvent> create(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtrWillBeRawPtr<AbstractView>,
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        int detail, int screenX, int screenY, int pageX, int pageY,
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        int movementX, int movementY,
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button,
62f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        PassRefPtrWillBeRawPtr<EventTarget> relatedTarget, PassRefPtrWillBeRawPtr<Clipboard>, bool isSimulated = false);
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
64f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    static PassRefPtrWillBeRawPtr<MouseEvent> create(const AtomicString& eventType, PassRefPtrWillBeRawPtr<AbstractView>, const PlatformMouseEvent&, int detail, PassRefPtrWillBeRawPtr<Node> relatedTarget);
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    static PassRefPtrWillBeRawPtr<MouseEvent> create(const AtomicString& eventType, const MouseEventInit&);
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual ~MouseEvent();
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void initMouseEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtrWillBeRawPtr<AbstractView>,
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        int detail, int screenX, int screenY, int clientX, int clientY,
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        bool ctrlKey, bool altKey, bool shiftKey, bool metaKey,
73f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        unsigned short button, PassRefPtrWillBeRawPtr<EventTarget> relatedTarget);
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // WinIE uses 1,4,2 for left/middle/right but not for click (just for mousedown/up, maybe others),
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // but we will match the standard DOM.
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    unsigned short button() const { return m_button; }
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool buttonDown() const { return m_buttonDown; }
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EventTarget* relatedTarget() const { return m_relatedTarget.get(); }
80a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    EventTarget* relatedTarget(bool& isNull) const { isNull = !m_relatedTarget; return m_relatedTarget.get(); }
81f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    void setRelatedTarget(PassRefPtrWillBeRawPtr<EventTarget> relatedTarget) { m_relatedTarget = relatedTarget; }
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Node* toElement() const;
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Node* fromElement() const;
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Clipboard* dataTransfer() const { return isDragEvent() ? m_clipboard.get() : 0; }
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual const AtomicString& interfaceName() const OVERRIDE;
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool isMouseEvent() const OVERRIDE;
9109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool isDragEvent() const OVERRIDE FINAL;
9209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual int which() const OVERRIDE FINAL;
93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
94d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    virtual void trace(Visitor*) OVERRIDE;
95d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)protected:
9707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    MouseEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtrWillBeRawPtr<AbstractView>,
98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        int detail, int screenX, int screenY, int pageX, int pageY,
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        int movementX, int movementY,
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button,
101f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        PassRefPtrWillBeRawPtr<EventTarget> relatedTarget, PassRefPtrWillBeRawPtr<Clipboard>, bool isSimulated);
102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    MouseEvent(const AtomicString& type, const MouseEventInit&);
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    MouseEvent();
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private:
108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    unsigned short m_button;
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool m_buttonDown;
110f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    RefPtrWillBeMember<EventTarget> m_relatedTarget;
111d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtrWillBeMember<Clipboard> m_clipboard;
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class SimulatedMouseEvent FINAL : public MouseEvent {
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
116a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    static PassRefPtrWillBeRawPtr<SimulatedMouseEvent> create(const AtomicString& eventType, PassRefPtrWillBeRawPtr<AbstractView>, PassRefPtrWillBeRawPtr<Event> underlyingEvent);
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~SimulatedMouseEvent();
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    virtual void trace(Visitor*) OVERRIDE;
120d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
122a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    SimulatedMouseEvent(const AtomicString& eventType, PassRefPtrWillBeRawPtr<AbstractView>, PassRefPtrWillBeRawPtr<Event> underlyingEvent);
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class MouseEventDispatchMediator FINAL : public EventDispatchMediator {
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    enum MouseEventType { SyntheticMouseEvent, NonSyntheticMouseEvent};
1285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    static PassRefPtrWillBeRawPtr<MouseEventDispatchMediator> create(PassRefPtrWillBeRawPtr<MouseEvent>, MouseEventType = NonSyntheticMouseEvent);
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
131a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    explicit MouseEventDispatchMediator(PassRefPtrWillBeRawPtr<MouseEvent>, MouseEventType);
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MouseEvent* event() const;
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual bool dispatchEvent(EventDispatcher*) const OVERRIDE;
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isSyntheticMouseEvent() const { return m_mouseEventType == SyntheticMouseEvent; }
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    MouseEventType m_mouseEventType;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
139f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)DEFINE_EVENT_TYPE_CASTS(MouseEvent);
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // MouseEvent_h
144