// Copyright 2016 The Chromium Embedded Framework 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 CEF_LIBCEF_BROWSER_VIEWS_LABEL_BUTTON_IMPL_H_
#define CEF_LIBCEF_BROWSER_VIEWS_LABEL_BUTTON_IMPL_H_
#pragma once

#include "include/views/cef_button.h"
#include "include/views/cef_label_button.h"
#include "include/views/cef_menu_button.h"

#include "libcef/browser/image_impl.h"
#include "libcef/browser/views/button_impl.h"

#include "base/logging.h"
#include "ui/views/controls/button/label_button.h"

// Helpers for template boiler-plate.
#define CEF_LABEL_BUTTON_IMPL_T CEF_BUTTON_IMPL_T
#define CEF_LABEL_BUTTON_IMPL_A CEF_BUTTON_IMPL_A
#define CEF_LABEL_BUTTON_IMPL_D CefLabelButtonImpl<CEF_LABEL_BUTTON_IMPL_A>

// Template for implementing CefLabelButton-derived classes. See comments in
// view_impl.h for a usage overview.
CEF_LABEL_BUTTON_IMPL_T class CefLabelButtonImpl : public CEF_BUTTON_IMPL_D {
 public:
  typedef CEF_BUTTON_IMPL_D ParentClass;

  // CefLabelButton methods. When adding new As*() methods make sure to update
  // CefViewAdapter::GetFor() in view_adapter.cc.
  void SetText(const CefString& text) override;
  CefString GetText() override;
  void SetImage(cef_button_state_t button_state,
                CefRefPtr<CefImage> image) override;
  CefRefPtr<CefImage> GetImage(cef_button_state_t button_state) override;
  void SetTextColor(cef_button_state_t for_state, cef_color_t color) override;
  void SetEnabledTextColors(cef_color_t color) override;
  void SetFontList(const CefString& font_list) override;
  void SetHorizontalAlignment(cef_horizontal_alignment_t alignment) override;
  void SetMinimumSize(const CefSize& size) override;
  void SetMaximumSize(const CefSize& size) override;

  // CefLabelButton methods:
  CefRefPtr<CefMenuButton> AsMenuButton() override { return nullptr; }

  // CefButton methods:
  CefRefPtr<CefLabelButton> AsLabelButton() override { return this; }

  // CefViewAdapter methods:
  void GetDebugInfo(base::DictionaryValue* info,
                    bool include_children) override {
    ParentClass::GetDebugInfo(info, include_children);
    info->SetString("text", ParentClass::root_view()->GetText());
  }

 protected:
  // Create a new implementation object.
  // Always call Initialize() after creation.
  // |delegate| may be nullptr.
  explicit CefLabelButtonImpl(CefRefPtr<CefViewDelegateClass> delegate)
      : ParentClass(delegate) {}
};

CEF_LABEL_BUTTON_IMPL_T void CEF_LABEL_BUTTON_IMPL_D::SetText(
    const CefString& text) {
  CEF_REQUIRE_VALID_RETURN_VOID();
  ParentClass::root_view()->SetText(text);
}

CEF_LABEL_BUTTON_IMPL_T CefString CEF_LABEL_BUTTON_IMPL_D::GetText() {
  CEF_REQUIRE_VALID_RETURN(CefString());
  return ParentClass::root_view()->GetText();
}

CEF_LABEL_BUTTON_IMPL_T void CEF_LABEL_BUTTON_IMPL_D::SetImage(
    cef_button_state_t button_state,
    CefRefPtr<CefImage> image) {
  CEF_REQUIRE_VALID_RETURN_VOID();
  gfx::ImageSkia image_skia;
  if (image)
    image_skia = static_cast<CefImageImpl*>(image.get())->AsImageSkia();
  ParentClass::root_view()->SetImage(
      static_cast<views::Button::ButtonState>(button_state), image_skia);
}

CEF_LABEL_BUTTON_IMPL_T CefRefPtr<CefImage> CEF_LABEL_BUTTON_IMPL_D::GetImage(
    cef_button_state_t button_state) {
  CEF_REQUIRE_VALID_RETURN(nullptr);
  const gfx::ImageSkia& image_skia = ParentClass::root_view()->GetImage(
      static_cast<views::Button::ButtonState>(button_state));
  if (image_skia.isNull())
    return nullptr;
  return new CefImageImpl(image_skia);
}

CEF_LABEL_BUTTON_IMPL_T void CEF_LABEL_BUTTON_IMPL_D::SetTextColor(
    cef_button_state_t for_state,
    cef_color_t color) {
  CEF_REQUIRE_VALID_RETURN_VOID();
  ParentClass::root_view()->SetTextColor(
      static_cast<views::Button::ButtonState>(for_state), color);
}

CEF_LABEL_BUTTON_IMPL_T void CEF_LABEL_BUTTON_IMPL_D::SetEnabledTextColors(
    cef_color_t color) {
  CEF_REQUIRE_VALID_RETURN_VOID();
  ParentClass::root_view()->SetEnabledTextColors(color);
}

CEF_LABEL_BUTTON_IMPL_T void CEF_LABEL_BUTTON_IMPL_D::SetFontList(
    const CefString& font_list) {
  CEF_REQUIRE_VALID_RETURN_VOID();
  ParentClass::root_view()->SetFontList(gfx::FontList(font_list));
}

CEF_LABEL_BUTTON_IMPL_T void CEF_LABEL_BUTTON_IMPL_D::SetHorizontalAlignment(
    cef_horizontal_alignment_t alignment) {
  CEF_REQUIRE_VALID_RETURN_VOID();
  ParentClass::root_view()->SetHorizontalAlignment(
      static_cast<gfx::HorizontalAlignment>(alignment));
}

CEF_LABEL_BUTTON_IMPL_T void CEF_LABEL_BUTTON_IMPL_D::SetMinimumSize(
    const CefSize& size) {
  CEF_REQUIRE_VALID_RETURN_VOID();
  ParentClass::root_view()->SetMinSize(gfx::Size(size.width, size.height));
}

CEF_LABEL_BUTTON_IMPL_T void CEF_LABEL_BUTTON_IMPL_D::SetMaximumSize(
    const CefSize& size) {
  CEF_REQUIRE_VALID_RETURN_VOID();
  ParentClass::root_view()->SetMaxSize(gfx::Size(size.width, size.height));
}

#endif  // CEF_LIBCEF_BROWSER_VIEWS_LABEL_BUTTON_IMPL_H_
