# Copyright 2014 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.

import("//build/config/jumbo.gni")
import("//build/config/ui.gni")
import("//testing/test.gni")

if (is_android) {
  import("//build/config/android/rules.gni")
}

jumbo_component("touch_selection") {
  output_name = "ui_touch_selection"

  sources = [
    "longpress_drag_selector.cc",
    "longpress_drag_selector.h",
    "selection_event_type.h",
    "touch_handle.cc",
    "touch_handle.h",
    "touch_handle_orientation.h",
    "touch_selection_controller.cc",
    "touch_selection_controller.h",
    "touch_selection_draggable.h",
    "ui_touch_selection_export.h",
  ]

  defines = [ "UI_TOUCH_SELECTION_IMPLEMENTATION" ]

  deps = [
    "//base:base",
    "//ui/base:base",
    "//ui/events:events",
    "//ui/events:gesture_detection",
    "//ui/gfx",
    "//ui/gfx/geometry",
  ]

  if (use_aura) {
    deps += [
      "//skia:skia",
      "//ui/aura",
      "//ui/aura_extra",
      "//ui/compositor:compositor",
      "//ui/gfx:gfx",
      "//ui/resources",
    ]

    sources += [
      "touch_handle_drawable_aura.cc",
      "touch_handle_drawable_aura.h",
      "touch_selection_menu_runner.cc",
      "touch_selection_menu_runner.h",
    ]
  }
}

static_library("test_support") {
  testonly = true

  sources = [
    "touch_selection_controller_test_api.cc",
    "touch_selection_controller_test_api.h",
  ]

  deps = [
    ":touch_selection",
    "//base:base",
  ]
}

test("ui_touch_selection_unittests") {
  sources = [
    "longpress_drag_selector_unittest.cc",
    "touch_handle_unittest.cc",
    "touch_selection_controller_unittest.cc",
  ]

  deps = [
    ":test_support",
    ":touch_selection",
    "//base/test:run_all_unittests",
    "//testing/gmock:gmock",
    "//testing/gtest:gtest",
    "//ui/base:base",
    "//ui/events:test_support",
    "//ui/gfx:gfx",
    "//ui/gfx:test_support",
  ]

  data_deps = [
    "//third_party/mesa_headers",
  ]
}

if (is_android) {
  java_cpp_enum("ui_touch_selection_enums_srcjar") {
    sources = [
      "selection_event_type.h",
    ]
  }
  java_cpp_enum("ui_touch_handle_orientation_srcjar") {
    sources = [
      "touch_handle_orientation.h",
    ]
  }
}
