blob: fbd5c92d5c67b06611274a4fa1810ef0b9064abd [file] [log] [blame]
/*
* Copyright (C) 2001 Peter Kelly (pmk@post.com)
* Copyright (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de)
* Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
* Copyright (C) 2003, 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.
*
* 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 MouseEvent_h
#define MouseEvent_h
#include "core/CoreExport.h"
#include "core/events/EventDispatchMediator.h"
#include "core/events/MouseEventInit.h"
#include "core/events/MouseRelatedEvent.h"
#include "platform/PlatformMouseEvent.h"
namespace blink {
class DataTransfer;
class EventDispatcher;
class CORE_EXPORT MouseEvent : public MouseRelatedEvent {
DEFINE_WRAPPERTYPEINFO();
public:
static MouseEvent* create() { return new MouseEvent; }
// TODO(mustaq): Should replace most/all of these params with a
// MouseEventInit.
static MouseEvent* create(const AtomicString& type,
bool canBubble,
bool cancelable,
AbstractView*,
int detail,
int screenX,
int screenY,
int windowX,
int windowY,
int movementX,
int movementY,
PlatformEvent::Modifiers,
short button,
unsigned short buttons,
EventTarget* relatedTarget,
double platformTimeStamp,
PlatformMouseEvent::SyntheticEventType,
const String& region,
const PlatformMouseEvent*);
static MouseEvent* create(const AtomicString& eventType,
AbstractView*,
const PlatformMouseEvent&,
int detail,
Node* relatedTarget);
static MouseEvent* create(ScriptState*,
const AtomicString& eventType,
const MouseEventInit&);
static MouseEvent* create(const AtomicString& eventType,
AbstractView*,
Event* underlyingEvent,
SimulatedClickCreationScope);
~MouseEvent() override;
static unsigned short platformModifiersToButtons(unsigned modifiers);
void initMouseEvent(ScriptState*,
const AtomicString& type,
bool canBubble,
bool cancelable,
AbstractView*,
int detail,
int screenX,
int screenY,
int clientX,
int clientY,
bool ctrlKey,
bool altKey,
bool shiftKey,
bool metaKey,
short button,
EventTarget* relatedTarget,
unsigned short buttons = 0);
// WinIE uses 1,4,2 for left/middle/right but not for click (just for
// mousedown/up, maybe others), but we will match the standard DOM.
virtual short button() const { return m_button == -1 ? 0 : m_button; }
unsigned short buttons() const { return m_buttons; }
bool buttonDown() const { return m_button != -1; }
EventTarget* relatedTarget() const { return m_relatedTarget.get(); }
void setRelatedTarget(EventTarget* relatedTarget) {
m_relatedTarget = relatedTarget;
}
PlatformMouseEvent::SyntheticEventType getSyntheticEventType() const {
return m_syntheticEventType;
}
const String& region() const { return m_region; }
void setRegion(const String& region) { m_region = region; }
Node* toElement() const;
Node* fromElement() const;
virtual DataTransfer* getDataTransfer() const { return nullptr; }
bool fromTouch() const {
return m_syntheticEventType == PlatformMouseEvent::FromTouch;
}
const AtomicString& interfaceName() const override;
bool isMouseEvent() const override;
int which() const final;
EventDispatchMediator* createMediator() override;
int clickCount() { return detail(); }
const PlatformMouseEvent* mouseEvent() const { return m_mouseEvent.get(); }
DECLARE_VIRTUAL_TRACE();
protected:
MouseEvent(const AtomicString& type,
bool canBubble,
bool cancelable,
AbstractView*,
int detail,
int screenX,
int screenY,
int windowX,
int windowY,
int movementX,
int movementY,
PlatformEvent::Modifiers,
short button,
unsigned short buttons,
EventTarget* relatedTarget,
double platformTimeStamp,
PlatformMouseEvent::SyntheticEventType,
const String& region,
const PlatformMouseEvent*);
MouseEvent(const AtomicString& type, const MouseEventInit&);
MouseEvent();
short rawButton() const { return m_button; }
private:
friend class MouseEventDispatchMediator;
void initMouseEventInternal(const AtomicString& type,
bool canBubble,
bool cancelable,
AbstractView*,
int detail,
int screenX,
int screenY,
int clientX,
int clientY,
PlatformEvent::Modifiers,
short button,
EventTarget* relatedTarget,
InputDeviceCapabilities* sourceCapabilities,
unsigned short buttons = 0);
short m_button;
unsigned short m_buttons;
Member<EventTarget> m_relatedTarget;
PlatformMouseEvent::SyntheticEventType m_syntheticEventType;
String m_region;
std::unique_ptr<PlatformMouseEvent> m_mouseEvent;
};
class MouseEventDispatchMediator final : public EventDispatchMediator {
public:
static MouseEventDispatchMediator* create(MouseEvent*);
private:
explicit MouseEventDispatchMediator(MouseEvent*);
MouseEvent& event() const;
DispatchEventResult dispatchEvent(EventDispatcher&) const override;
};
DEFINE_EVENT_TYPE_CASTS(MouseEvent);
} // namespace blink
#endif // MouseEvent_h