# 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/ui.gni")

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

component("base") {
  output_name = "ui_base"
  sources = [
    "accelerators/accelerator.cc",
    "accelerators/accelerator.h",
    "accelerators/accelerator_manager.cc",
    "accelerators/accelerator_manager.h",
    "accelerators/menu_label_accelerator_util_linux.cc",
    "accelerators/menu_label_accelerator_util_linux.h",
    "accelerators/platform_accelerator.h",
    "accelerators/platform_accelerator_cocoa.h",
    "accelerators/platform_accelerator_cocoa.mm",
    "android/ui_base_jni_registrar.cc",
    "android/ui_base_jni_registrar.h",
    "android/view_android.cc",
    "android/view_android.h",
    "android/window_android.cc",
    "android/window_android.h",
    "android/window_android_compositor.h",
    "android/window_android_observer.h",
    "base_window.cc",
    "base_window.h",
    "clipboard/clipboard.cc",
    "clipboard/clipboard.h",
    "clipboard/clipboard_android.cc",
    "clipboard/clipboard_android_initialization.h",
    "clipboard/clipboard_constants.cc",
    "clipboard/clipboard_mac.mm",
    "clipboard/clipboard_types.h",
    "clipboard/clipboard_util_win.cc",
    "clipboard/clipboard_util_win.h",
    "clipboard/clipboard_win.cc",
    "clipboard/custom_data_helper.cc",
    "clipboard/custom_data_helper.h",
    "clipboard/custom_data_helper_linux.cc",
    "clipboard/custom_data_helper_mac.mm",
    "clipboard/scoped_clipboard_writer.cc",
    "clipboard/scoped_clipboard_writer.h",
    "cocoa/animation_utils.h",
    "cocoa/appkit_utils.h",
    "cocoa/appkit_utils.mm",
    "cocoa/base_view.h",
    "cocoa/base_view.mm",
    "cocoa/cocoa_base_utils.h",
    "cocoa/cocoa_base_utils.mm",
    "cocoa/controls/blue_label_button.h",
    "cocoa/controls/blue_label_button.mm",
    "cocoa/controls/hover_image_menu_button.h",
    "cocoa/controls/hover_image_menu_button.mm",
    "cocoa/controls/hover_image_menu_button_cell.h",
    "cocoa/controls/hover_image_menu_button_cell.mm",
    "cocoa/controls/hyperlink_button_cell.h",
    "cocoa/controls/hyperlink_button_cell.mm",
    "cocoa/find_pasteboard.h",
    "cocoa/find_pasteboard.mm",
    "cocoa/flipped_view.h",
    "cocoa/flipped_view.mm",
    "cocoa/focus_tracker.h",
    "cocoa/focus_tracker.mm",
    "cocoa/focus_window_set.h",
    "cocoa/focus_window_set.mm",
    "cocoa/fullscreen_window_manager.h",
    "cocoa/fullscreen_window_manager.mm",
    "cocoa/hover_button.h",
    "cocoa/hover_button.mm",
    "cocoa/hover_image_button.h",
    "cocoa/hover_image_button.mm",
    "cocoa/menu_controller.h",
    "cocoa/menu_controller.mm",
    "cocoa/nib_loading.h",
    "cocoa/nib_loading.mm",
    "cocoa/nsgraphics_context_additions.h",
    "cocoa/nsgraphics_context_additions.mm",
    "cocoa/tracking_area.h",
    "cocoa/tracking_area.mm",
    "cocoa/underlay_opengl_hosting_window.h",
    "cocoa/underlay_opengl_hosting_window.mm",
    "cocoa/view_description.h",
    "cocoa/view_description.mm",
    "cocoa/window_size_constants.h",
    "cocoa/window_size_constants.mm",
    "cursor/cursor.cc",
    "cursor/cursor.h",
    "cursor/cursor_android.cc",
    "cursor/cursor_loader.h",
    "cursor/cursor_loader_win.cc",
    "cursor/cursor_loader_win.h",
    "cursor/cursor_util.cc",
    "cursor/cursor_util.h",
    "cursor/cursor_win.cc",
    "cursor/cursors_aura.cc",
    "cursor/cursors_aura.h",
    "default_theme_provider.cc",
    "default_theme_provider.h",
    "default_theme_provider_mac.mm",
    "device_form_factor_android.cc",
    "device_form_factor_android.h",
    "device_form_factor_desktop.cc",
    "device_form_factor_ios.mm",
    "device_form_factor.h",
    "dragdrop/cocoa_dnd_util.h",
    "dragdrop/cocoa_dnd_util.mm",
    "dragdrop/drag_drop_types.h",
    "dragdrop/drag_drop_types.h",
    "dragdrop/drag_drop_types_win.cc",
    "dragdrop/drag_source_win.cc",
    "dragdrop/drag_source_win.h",
    "dragdrop/drag_utils.cc",
    "dragdrop/drag_utils.h",
    "dragdrop/drag_utils_aura.cc",
    "dragdrop/drag_utils_win.cc",
    "dragdrop/drop_target_event.cc",
    "dragdrop/drop_target_event.h",
    "dragdrop/drop_target_win.cc",
    "dragdrop/drop_target_win.h",
    "dragdrop/file_info.cc",
    "dragdrop/file_info.h",
    "dragdrop/os_exchange_data.cc",
    "dragdrop/os_exchange_data.h",
    "dragdrop/os_exchange_data_provider_win.cc",
    "dragdrop/os_exchange_data_provider_win.h",
    "hit_test.h",
    "l10n/formatter.cc",
    "l10n/formatter.h",
    "l10n/l10n_font_util.cc",
    "l10n/l10n_font_util.h",
    "l10n/l10n_util.cc",
    "l10n/l10n_util.h",
    "l10n/l10n_util_android.cc",
    "l10n/l10n_util_android.h",
    "l10n/l10n_util_collator.h",
    "l10n/l10n_util_mac.h",
    "l10n/l10n_util_mac.mm",
    "l10n/l10n_util_plurals.cc",
    "l10n/l10n_util_plurals.h",
    "l10n/l10n_util_posix.cc",
    "l10n/l10n_util_win.cc",
    "l10n/l10n_util_win.h",
    "l10n/time_format.cc",
    "l10n/time_format.h",
    "layout.cc",
    "layout.h",
    "layout_mac.mm",
    "models/button_menu_item_model.cc",
    "models/button_menu_item_model.h",
    "models/combobox_model.cc",
    "models/combobox_model.h",
    "models/combobox_model_observer.h",
    "models/dialog_model.cc",
    "models/dialog_model.h",
    "models/list_model.h",
    "models/list_model_observer.h",
    "models/list_selection_model.cc",
    "models/list_selection_model.h",
    "models/menu_model.cc",
    "models/menu_model.h",
    "models/menu_model_delegate.h",
    "models/menu_separator_types.h",
    "models/simple_menu_model.cc",
    "models/simple_menu_model.h",
    "models/table_model.cc",
    "models/table_model.h",
    "models/table_model_observer.h",
    "models/tree_model.cc",
    "models/tree_model.h",
    "models/tree_node_iterator.h",
    "models/tree_node_model.h",
    "nine_image_painter_factory.cc",
    "nine_image_painter_factory.h",
    "resource/data_pack.cc",
    "resource/data_pack.h",
    "resource/resource_bundle.cc",
    "resource/resource_bundle.h",
    "resource/resource_bundle_android.cc",
    "resource/resource_bundle_auralinux.cc",
    "resource/resource_bundle_ios.mm",
    "resource/resource_bundle_mac.mm",
    "resource/resource_bundle_win.cc",
    "resource/resource_bundle_win.h",
    "resource/resource_data_dll_win.cc",
    "resource/resource_data_dll_win.h",
    "resource/resource_handle.h",
    "text/bytes_formatting.cc",
    "text/bytes_formatting.h",
    "theme_provider.cc",
    "theme_provider.h",
    "touch/touch_device.h",
    "touch/touch_editing_controller.cc",
    "touch/touch_editing_controller.h",
    "touch/touch_enabled.cc",
    "touch/touch_enabled.h",
    "ui_base_exports.cc",
    "ui_base_paths.cc",
    "ui_base_paths.h",
    "ui_base_switches.cc",
    "ui_base_switches.h",
    "ui_base_switches_util.cc",
    "ui_base_switches_util.h",
    "ui_base_types.cc",
    "ui_base_types.h",
    "ui_base_export.h",
    "view_prop.cc",
    "view_prop.h",
    "webui/jstemplate_builder.cc",
    "webui/jstemplate_builder.h",
    "webui/web_ui_util.cc",
    "webui/web_ui_util.h",
    "win/accessibility_ids_win.h",
    "win/accessibility_misc_utils.cc",
    "win/accessibility_misc_utils.h",
    "win/atl_module.h",
    "win/dpi_setup.cc",
    "win/dpi_setup.h",
    "win/foreground_helper.cc",
    "win/foreground_helper.h",
    "win/hidden_window.cc",
    "win/hidden_window.h",
    "win/hwnd_subclass.cc",
    "win/hwnd_subclass.h",
    "win/internal_constants.cc",
    "win/internal_constants.h",
    "win/lock_state.cc",
    "win/lock_state.h",
    "win/message_box_win.cc",
    "win/message_box_win.h",
    "win/mouse_wheel_util.cc",
    "win/mouse_wheel_util.h",
    "win/scoped_ole_initializer.cc",
    "win/scoped_ole_initializer.h",
    "win/shell.cc",
    "win/shell.h",
    "win/touch_input.cc",
    "win/touch_input.h",
    "win/window_event_target.cc",
    "win/window_event_target.h",
    "window_open_disposition.cc",
    "window_open_disposition.h",
    "work_area_watcher_observer.h",
    "x/x11_menu_list.cc",
    "x/x11_menu_list.h",
    "x/x11_util.cc",
    "x/x11_util.h",
    "x/x11_util_internal.h",
  ]

  if (is_win) {
    sources += [ "touch/touch_device_win.cc" ]
  } else if (is_android) {
    sources += [ "touch/touch_device_android.cc" ]
  } else if (use_ozone) {
    sources += [ "touch/touch_device_ozone.cc" ]
  } else if (use_aura && use_x11) { 
    sources += [ "touch/touch_device_aurax11.cc" ]
  } else {
    # Empty implementation for all other cases.
    sources += [ "touch/touch_device.cc" ]
  }

  defines = [ "UI_BASE_IMPLEMENTATION" ]

  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//base:base_static",
    "//base:i18n",
    "//net",
    "//skia",
    "//third_party/icu",
    "//ui/resources",
    "//ui/resources:unscaled_resources",
    "//ui/strings",
    "//ui/webui/resources",
    "//url",
  ]

  if (is_ios) {
    sources += [
      "l10n/l10n_util_mac.h",
      "l10n/l10n_util_mac.mm",
    ]
  }

  if (toolkit_views) {
    deps += [
      "//ui/events",
    ]
  }

  if (use_x11 && use_aura) {
    sources += [
      "x/selection_owner.cc",
      "x/selection_owner.h",
      "x/selection_requestor.cc",
      "x/selection_requestor.h",
      "x/selection_utils.cc",
      "x/selection_utils.h",
    ]
  }

  if (use_aura) {
    deps += [
      "//ui/events",
    ]
  } else {
    sources -= [
      "cursor/cursor.cc",
      "cursor/cursor.h",
      "dragdrop/drag_utils_aura.cc",
    ]
  }
  if (!use_x11) {
    sources -= [
      "x/x11_util.cc",
      "x/x11_util.h",
      "x/x11_util_internal.h",
    ]
  }

  if (!use_aura || !is_linux) {
    sources -= [
      "resource/resource_bundle_auralinux.cc",
    ]
  }

  if (use_aura && is_win) {
    sources -= [
      "dragdrop/drag_utils_aura.cc",
    ]
  }

  if (is_linux) {
    configs += [
      "//build/config/linux:fontconfig",
      "//build/config/linux:glib",
    ]
  }

  if ((is_linux && !is_chromeos) || is_chromeos) {
    if (!toolkit_views && !use_aura) {
      sources -= [
        "dragdrop/drag_utils.cc",
        "dragdrop/drag_utils.h",
      ]
    }
  }

  if (use_pango) {
    configs += [
      "//build/config/linux:pangocairo",
    ]
  }

  if (is_chromeos || (use_aura && is_linux && !use_x11)) {
    sources += [
      "dragdrop/os_exchange_data_provider_aura.cc",
      "dragdrop/os_exchange_data_provider_aura.h",
    ]
  }

  libs = []
  if (is_win) {
    deps += [
      "//third_party/wtl",
    ]
    cflags = [
      "/wd4267",  # TODO(jschuh): C4267: http://crbug.com/167187 size_t -> int.
      "/wd4324",  # Structure was padded due to __declspec(align()), which is
                  # uninteresting.
    ]
    ldflags = [
      "/DELAYLOAD:d2d1.dll",
      "/DELAYLOAD:d3d10_1.dll",
      "/DELAYLOAD:dwmapi.dll",
    ]
    libs += [
      "d2d1.lib",
      "d3d10_1.lib",
      "dwmapi.lib",
      "imm32.lib",
      "d2d1.lib",
      "dwmapi.lib",
      "oleacc.lib",
    ]
  } else {
    if (!use_aura) {
      sources -= [
        "view_prop.cc",
        "view_prop.h",
      ]
    }
  }

  if (is_mac) {
    deps += [
      #TODO(tfarina): port this third_party component to GN.
      #"//third_party/mozilla",
    ]

    sources -= [
      "dragdrop/drag_utils.cc",
      "dragdrop/drag_utils.h",
    ]

    libs += [
      "Accelerate.framework",
      "AudioUnit.framework",
      "CoreView.framework",
    ]
  }

  if (use_x11) {
    #'all_dependent_settings': {
      #'ldflags': [
        #'-L<(PRODUCT_DIR)',
      #],
    #},
    configs += [
      "//build/config/linux:x11"
    ]
  }

  if (use_aura) {
    if (use_x11) {
      sources += [
        "cursor/cursor_loader_x11.cc",
        "cursor/cursor_loader_x11.h",
        "cursor/cursor_x11.cc",
      ]
      if (!is_chromeos) {
        # These Aura X11 files aren't used on ChromeOS.
        sources += [
          "dragdrop/os_exchange_data_provider_aurax11.cc",
          "dragdrop/os_exchange_data_provider_aurax11.h",
        ]
      }
    }
  }

  if (!toolkit_views) {
    sources -= [
      "dragdrop/drag_drop_types.h",
      "dragdrop/drop_target_event.cc",
      "dragdrop/drop_target_event.h",
      "dragdrop/os_exchange_data.cc",
      "dragdrop/os_exchange_data.h",
      "nine_image_painter_factory.cc",
      "nine_image_painter_factory.h",
    ]
  }

  if (is_android) {
    sources -= [
      "default_theme_provider.cc",
      "dragdrop/drag_utils.cc",
      "dragdrop/drag_utils.h",
      "l10n/l10n_font_util.cc",
      "models/button_menu_item_model.cc",
      "models/dialog_model.cc",
      "theme_provider.cc",
      "touch/touch_editing_controller.cc",
      "ui_base_types.cc",
    ]

    deps += [
      ":ui_base_jni_headers",
    ]

    libs += [
      "jnigraphics",
    ]
  }

  if (is_android && is_android_webview_build) {
    deps += [
      #TODO(GYP): port this component to GN.
      #"//ui/android:ui_java",
    ]
  }

  if (is_android && !use_aura) {
    sources -= [
      "cursor/cursor_android.cc",
    ]
  }

  # Aura clipboard.
  if (use_aura) {
    if (use_x11) {
      sources += [ "clipboard/clipboard_aurax11.cc" ]
    } else if (!is_win) {
      # This file is used for all non-X11, non-Windows aura Builds.
      sources += [ "clipboard/clipboard_aura.cc" ]
    }
  }

  if (is_android || is_ios) {
    sources -= [
      "device_form_factor_desktop.cc",
    ]
  }
}

source_set("ui_base_test_support") {
  sources = [
    "test/ui_controls.h",
    "test/ui_controls_aura.cc",
    "test/ui_controls_internal_win.cc",
    "test/ui_controls_internal_win.h",
    "test/ui_controls_mac.mm",
    "test/ui_controls_win.cc",
  ]

  deps = [
    "//base",
    "//skia",
    "//testing/gtest",
    "//ui/events:events_base",
    "//ui/gfx",
    "//ui/gfx/geometry",
  ]

  if (!is_ios) {
    sources += [
      "ime/dummy_input_method.cc",
      "ime/dummy_input_method.h",
      "ime/dummy_text_input_client.cc",
      "ime/dummy_text_input_client.h",
    ]
  }
}

if (is_android) {
  generate_jni("ui_base_jni_headers") {
    sources = [
      "../android/java/src/org/chromium/ui/base/Clipboard.java",
      "../android/java/src/org/chromium/ui/base/DeviceFormFactor.java",
      "../android/java/src/org/chromium/ui/base/LocalizationUtils.java",
      "../android/java/src/org/chromium/ui/base/ResourceBundle.java",
      "../android/java/src/org/chromium/ui/base/SelectFileDialog.java",
      "../android/java/src/org/chromium/ui/base/TouchDevice.java",
      "../android/java/src/org/chromium/ui/base/ViewAndroid.java",
      "../android/java/src/org/chromium/ui/base/WindowAndroid.java",
    ]
    jni_package = "base"
  }
}