// Copyright 2019 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 "ash/wm/wm_highlight_item_border.h"

#include "ash/style/ash_color_provider.h"
#include "cc/paint/paint_flags.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/geometry/rect_f.h"
#include "ui/views/view.h"

namespace ash {

namespace {

// The desk preview border size and padding in dips.
constexpr int kBorderSize = 2;
constexpr int kBorderPadding = 2;

}  // namespace

WmHighlightItemBorder::WmHighlightItemBorder(int corner_radius,
                                             gfx::Insets padding)
    : views::Border(SK_ColorTRANSPARENT),
      corner_radius_(corner_radius),
      border_insets_(gfx::Insets(kBorderSize + kBorderPadding) + padding) {}

void WmHighlightItemBorder::SetFocused(bool focused) {
  // Note that all WM features that use this custom border currently have dark
  // mode as the default color mode.
  set_color(focused ? AshColorProvider::Get()->GetControlsLayerColor(
                          AshColorProvider::ControlsLayerType::kFocusRingColor)
                    : SK_ColorTRANSPARENT);
}

void WmHighlightItemBorder::Paint(const views::View& view,
                                  gfx::Canvas* canvas) {
  if (color() == SK_ColorTRANSPARENT)
    return;

  cc::PaintFlags flags;
  flags.setStrokeWidth(kBorderSize);
  flags.setColor(color());
  flags.setStyle(cc::PaintFlags::kStroke_Style);
  flags.setAntiAlias(true);

  gfx::RectF bounds(view.GetLocalBounds());
  // The following inset is needed for the rounded corners of the border to
  // look correct. Otherwise, the borders will be painted at the edge of the
  // view, resulting in this border looking chopped.
  bounds.Inset(kBorderSize / 2, kBorderSize / 2);
  canvas->DrawRoundRect(bounds, corner_radius_, flags);
}

gfx::Insets WmHighlightItemBorder::GetInsets() const {
  return border_insets_;
}

gfx::Size WmHighlightItemBorder::GetMinimumSize() const {
  const int minmum_length = 2 * (kBorderSize + kBorderPadding);
  return gfx::Size(minmum_length, minmum_length);
}

}  // namespace ash
