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

#include "libcef/browser/views/menu_button_impl.h"

#include "libcef/browser/views/menu_button_view.h"
#include "libcef/browser/views/window_impl.h"

#include "ui/gfx/canvas.h"

// static
CefRefPtr<CefMenuButton> CefMenuButton::CreateMenuButton(
    CefRefPtr<CefMenuButtonDelegate> delegate,
    const CefString& text) {
  return CefMenuButtonImpl::Create(delegate, text);
}

// static
CefRefPtr<CefMenuButtonImpl> CefMenuButtonImpl::Create(
    CefRefPtr<CefMenuButtonDelegate> delegate,
    const CefString& text) {
  CEF_REQUIRE_UIT_RETURN(nullptr);
  DCHECK(delegate);
  if (!delegate)
    return nullptr;
  CefRefPtr<CefMenuButtonImpl> menu_button = new CefMenuButtonImpl(delegate);
  menu_button->Initialize();
  if (!text.empty())
    menu_button->SetText(text);
  return menu_button;
}

void CefMenuButtonImpl::ShowMenu(CefRefPtr<CefMenuModel> menu_model,
                                 const CefPoint& screen_point,
                                 cef_menu_anchor_position_t anchor_position) {
  CEF_REQUIRE_VALID_RETURN_VOID();
  CefRefPtr<CefWindow> window =
      view_util::GetWindowFor(root_view()->GetWidget());
  CefWindowImpl* window_impl = static_cast<CefWindowImpl*>(window.get());
  if (window_impl) {
    window_impl->ShowMenu(root_view(), menu_model, screen_point,
                          anchor_position);
  }
}

void CefMenuButtonImpl::TriggerMenu() {
  CEF_REQUIRE_VALID_RETURN_VOID();
  root_view()->Activate(nullptr);
}

void CefMenuButtonImpl::SetFocusable(bool focusable) {
  CEF_REQUIRE_VALID_RETURN_VOID();
  static_cast<CefMenuButtonView*>(root_view())
      ->SetDrawStringsFlags(focusable ? gfx::Canvas::SHOW_PREFIX
                                      : gfx::Canvas::HIDE_PREFIX);
  ParentClass::SetFocusable(focusable);
}

CefMenuButtonImpl::CefMenuButtonImpl(CefRefPtr<CefMenuButtonDelegate> delegate)
    : ParentClass(delegate) {
  DCHECK(delegate);
}

views::MenuButton* CefMenuButtonImpl::CreateRootView() {
  return new CefMenuButtonView(delegate());
}

void CefMenuButtonImpl::InitializeRootView() {
  static_cast<CefMenuButtonView*>(root_view())->Initialize();
}
