// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SKY_ENGINE_CORE_EVENTS_GESTUREEVENT_H_
#define SKY_ENGINE_CORE_EVENTS_GESTUREEVENT_H_

#include "sky/engine/core/events/Event.h"
#include "sky/engine/public/platform/WebInputEvent.h"

namespace blink {

struct GestureEventInit : public EventInit {
    double x = 0;
    double y = 0;
    double dx = 0;
    double dy = 0;
    double velocityX = 0;
    double velocityY = 0;
};

class GestureEvent : public Event {
    DEFINE_WRAPPERTYPEINFO();
public:
    static PassRefPtr<GestureEvent> create()
    {
        return adoptRef(new GestureEvent);
    }
    static PassRefPtr<GestureEvent> create(const WebGestureEvent& event)
    {
        return adoptRef(new GestureEvent(event));
    }
    static PassRefPtr<GestureEvent> create(const AtomicString& type, const GestureEventInit& initializer)
    {
        return adoptRef(new GestureEvent(type, initializer));
    }

    ~GestureEvent() override;
    const AtomicString& interfaceName() const override;

    float x() const { return m_x; }
    float y() const { return m_y; }
    float dx() const { return m_dx; }
    float dy() const { return m_dy; }
    float velocityX() const { return m_velocityX; }
    float velocityY() const { return m_velocityY; }

private:
    GestureEvent();
    explicit GestureEvent(const WebGestureEvent&);
    GestureEvent(const AtomicString& type, const GestureEventInit&);

    float m_x;
    float m_y;
    float m_dx;
    float m_dy;
    float m_velocityX;
    float m_velocityY;
};

} // namespace blink

#endif  // SKY_ENGINE_CORE_EVENTS_GESTUREEVENT_H_
