// 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.

#include "sky/engine/core/events/PointerEvent.h"

#include "gen/sky/core/EventNames.h"
#include "gen/sky/core/EventTypeNames.h"

namespace blink {

static AtomicString stringForType(WebInputEvent::Type type)
{
    if (type == WebInputEvent::PointerDown)
        return EventTypeNames::pointerdown;
    if (type == WebInputEvent::PointerUp)
        return EventTypeNames::pointerup;
    if (type == WebInputEvent::PointerMove)
        return EventTypeNames::pointermove;
    if (type == WebInputEvent::PointerCancel)
        return EventTypeNames::pointercancel;
    ASSERT_NOT_REACHED();
    return AtomicString();
}

static String stringForKind(WebPointerEvent::Kind kind)
{
    switch (kind) {
    case WebPointerEvent::Touch:
        return "touch";
    case WebPointerEvent::Mouse:
        return "mouse";
    case WebPointerEvent::Stylus:
        return "stylus";
    }
    ASSERT_NOT_REACHED();
    return String();
}

PointerEvent::~PointerEvent()
{
}

const AtomicString& PointerEvent::interfaceName() const
{
    return EventNames::PointerEvent;
}

PointerEvent::PointerEvent()
    : PointerEvent(AtomicString(), PointerEventInit())
{
}

PointerEvent::PointerEvent(const WebPointerEvent& event)
    : Event(stringForType(event.type), true, true)
    , m_pointer(event.pointer)
    , m_kind(stringForKind(event.kind))
    , m_x(event.x)
    , m_y(event.y)
    , m_dx(0)
    , m_dy(0)
    , m_buttons(event.buttons)
    , m_down(false)
    , m_primary(false)
    , m_obscured(false)
    , m_pressure(event.pressure)
    , m_pressureMin(event.pressureMin)
    , m_pressureMax(event.pressureMax)
    , m_distance(event.distance)
    , m_distanceMin(event.distanceMin)
    , m_distanceMax(event.distanceMax)
    , m_radiusMajor(event.radiusMajor)
    , m_radiusMinor(event.radiusMinor)
    , m_radiusMin(event.radiusMin)
    , m_radiusMax(event.radiusMax)
    , m_orientation(event.orientation)
    , m_tilt(event.tilt)
{
    m_timeStamp = event.timeStampMS;
}

PointerEvent::PointerEvent(const AtomicString& type, const PointerEventInit& initializer)
    : Event(type, initializer)
    , m_pointer(initializer.pointer)
    , m_kind(initializer.kind)
    , m_x(initializer.x)
    , m_y(initializer.y)
    , m_dx(initializer.dx)
    , m_dy(initializer.dy)
    , m_buttons(initializer.buttons)
    , m_down(initializer.down)
    , m_primary(initializer.primary)
    , m_obscured(initializer.obscured)
    , m_pressure(initializer.pressure)
    , m_pressureMin(initializer.pressureMin)
    , m_pressureMax(initializer.pressureMax)
    , m_distance(initializer.distance)
    , m_distanceMin(initializer.distanceMin)
    , m_distanceMax(initializer.distanceMax)
    , m_radiusMajor(initializer.radiusMajor)
    , m_radiusMinor(initializer.radiusMinor)
    , m_radiusMin(initializer.radiusMin)
    , m_radiusMax(initializer.radiusMax)
    , m_orientation(initializer.orientation)
    , m_tilt(initializer.tilt)
{
}

} // namespace blink
