// Copyright (c) 2020 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.
//
// ---------------------------------------------------------------------------
//
// This file was generated by the CEF translator tool. If making changes by
// hand only do so within the body of existing method and function
// implementations. See the translator.README.txt file in the tools directory
// for more information.
//
// $hash=52b31a63bbe83937a9f5dc557accfc1e84af6d84$
//

#include "libcef_dll/cpptoc/views/window_delegate_cpptoc.h"
#include "libcef_dll/ctocpp/views/view_ctocpp.h"
#include "libcef_dll/ctocpp/views/window_ctocpp.h"
#include "libcef_dll/shutdown_checker.h"

namespace {

// MEMBER FUNCTIONS - Body may be edited by hand.

void CEF_CALLBACK
window_delegate_on_window_created(struct _cef_window_delegate_t* self,
                                  cef_window_t* window) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return;
  // Verify param: window; type: refptr_diff
  DCHECK(window);
  if (!window)
    return;

  // Execute
  CefWindowDelegateCppToC::Get(self)->OnWindowCreated(
      CefWindowCToCpp::Wrap(window));
}

void CEF_CALLBACK
window_delegate_on_window_destroyed(struct _cef_window_delegate_t* self,
                                    cef_window_t* window) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return;
  // Verify param: window; type: refptr_diff
  DCHECK(window);
  if (!window)
    return;

  // Execute
  CefWindowDelegateCppToC::Get(self)->OnWindowDestroyed(
      CefWindowCToCpp::Wrap(window));
}

cef_window_t* CEF_CALLBACK
window_delegate_get_parent_window(struct _cef_window_delegate_t* self,
                                  cef_window_t* window,
                                  int* is_menu,
                                  int* can_activate_menu) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return NULL;
  // Verify param: window; type: refptr_diff
  DCHECK(window);
  if (!window)
    return NULL;
  // Verify param: is_menu; type: bool_byaddr
  DCHECK(is_menu);
  if (!is_menu)
    return NULL;
  // Verify param: can_activate_menu; type: bool_byaddr
  DCHECK(can_activate_menu);
  if (!can_activate_menu)
    return NULL;

  // Translate param: is_menu; type: bool_byaddr
  bool is_menuBool = (is_menu && *is_menu) ? true : false;
  // Translate param: can_activate_menu; type: bool_byaddr
  bool can_activate_menuBool =
      (can_activate_menu && *can_activate_menu) ? true : false;

  // Execute
  CefRefPtr<CefWindow> _retval =
      CefWindowDelegateCppToC::Get(self)->GetParentWindow(
          CefWindowCToCpp::Wrap(window), &is_menuBool, &can_activate_menuBool);

  // Restore param: is_menu; type: bool_byaddr
  if (is_menu)
    *is_menu = is_menuBool ? true : false;
  // Restore param: can_activate_menu; type: bool_byaddr
  if (can_activate_menu)
    *can_activate_menu = can_activate_menuBool ? true : false;

  // Return type: refptr_diff
  return CefWindowCToCpp::Unwrap(_retval);
}

int CEF_CALLBACK
window_delegate_is_frameless(struct _cef_window_delegate_t* self,
                             cef_window_t* window) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return 0;
  // Verify param: window; type: refptr_diff
  DCHECK(window);
  if (!window)
    return 0;

  // Execute
  bool _retval = CefWindowDelegateCppToC::Get(self)->IsFrameless(
      CefWindowCToCpp::Wrap(window));

  // Return type: bool
  return _retval;
}

int CEF_CALLBACK window_delegate_can_resize(struct _cef_window_delegate_t* self,
                                            cef_window_t* window) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return 0;
  // Verify param: window; type: refptr_diff
  DCHECK(window);
  if (!window)
    return 0;

  // Execute
  bool _retval = CefWindowDelegateCppToC::Get(self)->CanResize(
      CefWindowCToCpp::Wrap(window));

  // Return type: bool
  return _retval;
}

int CEF_CALLBACK
window_delegate_can_maximize(struct _cef_window_delegate_t* self,
                             cef_window_t* window) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return 0;
  // Verify param: window; type: refptr_diff
  DCHECK(window);
  if (!window)
    return 0;

  // Execute
  bool _retval = CefWindowDelegateCppToC::Get(self)->CanMaximize(
      CefWindowCToCpp::Wrap(window));

  // Return type: bool
  return _retval;
}

int CEF_CALLBACK
window_delegate_can_minimize(struct _cef_window_delegate_t* self,
                             cef_window_t* window) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return 0;
  // Verify param: window; type: refptr_diff
  DCHECK(window);
  if (!window)
    return 0;

  // Execute
  bool _retval = CefWindowDelegateCppToC::Get(self)->CanMinimize(
      CefWindowCToCpp::Wrap(window));

  // Return type: bool
  return _retval;
}

int CEF_CALLBACK window_delegate_can_close(struct _cef_window_delegate_t* self,
                                           cef_window_t* window) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return 0;
  // Verify param: window; type: refptr_diff
  DCHECK(window);
  if (!window)
    return 0;

  // Execute
  bool _retval = CefWindowDelegateCppToC::Get(self)->CanClose(
      CefWindowCToCpp::Wrap(window));

  // Return type: bool
  return _retval;
}

int CEF_CALLBACK
window_delegate_on_accelerator(struct _cef_window_delegate_t* self,
                               cef_window_t* window,
                               int command_id) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return 0;
  // Verify param: window; type: refptr_diff
  DCHECK(window);
  if (!window)
    return 0;

  // Execute
  bool _retval = CefWindowDelegateCppToC::Get(self)->OnAccelerator(
      CefWindowCToCpp::Wrap(window), command_id);

  // Return type: bool
  return _retval;
}

int CEF_CALLBACK
window_delegate_on_key_event(struct _cef_window_delegate_t* self,
                             cef_window_t* window,
                             const struct _cef_key_event_t* event) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return 0;
  // Verify param: window; type: refptr_diff
  DCHECK(window);
  if (!window)
    return 0;
  // Verify param: event; type: struct_byref_const
  DCHECK(event);
  if (!event)
    return 0;

  // Translate param: event; type: struct_byref_const
  CefKeyEvent eventObj;
  if (event)
    eventObj.Set(*event, false);

  // Execute
  bool _retval = CefWindowDelegateCppToC::Get(self)->OnKeyEvent(
      CefWindowCToCpp::Wrap(window), eventObj);

  // Return type: bool
  return _retval;
}

cef_size_t CEF_CALLBACK
window_delegate_get_preferred_size(struct _cef_view_delegate_t* self,
                                   cef_view_t* view) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return CefSize();
  // Verify param: view; type: refptr_diff
  DCHECK(view);
  if (!view)
    return CefSize();

  // Execute
  cef_size_t _retval = CefWindowDelegateCppToC::Get(
                           reinterpret_cast<cef_window_delegate_t*>(self))
                           ->GetPreferredSize(CefViewCToCpp::Wrap(view));

  // Return type: simple
  return _retval;
}

cef_size_t CEF_CALLBACK
window_delegate_get_minimum_size(struct _cef_view_delegate_t* self,
                                 cef_view_t* view) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return CefSize();
  // Verify param: view; type: refptr_diff
  DCHECK(view);
  if (!view)
    return CefSize();

  // Execute
  cef_size_t _retval = CefWindowDelegateCppToC::Get(
                           reinterpret_cast<cef_window_delegate_t*>(self))
                           ->GetMinimumSize(CefViewCToCpp::Wrap(view));

  // Return type: simple
  return _retval;
}

cef_size_t CEF_CALLBACK
window_delegate_get_maximum_size(struct _cef_view_delegate_t* self,
                                 cef_view_t* view) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return CefSize();
  // Verify param: view; type: refptr_diff
  DCHECK(view);
  if (!view)
    return CefSize();

  // Execute
  cef_size_t _retval = CefWindowDelegateCppToC::Get(
                           reinterpret_cast<cef_window_delegate_t*>(self))
                           ->GetMaximumSize(CefViewCToCpp::Wrap(view));

  // Return type: simple
  return _retval;
}

int CEF_CALLBACK
window_delegate_get_height_for_width(struct _cef_view_delegate_t* self,
                                     cef_view_t* view,
                                     int width) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return 0;
  // Verify param: view; type: refptr_diff
  DCHECK(view);
  if (!view)
    return 0;

  // Execute
  int _retval = CefWindowDelegateCppToC::Get(
                    reinterpret_cast<cef_window_delegate_t*>(self))
                    ->GetHeightForWidth(CefViewCToCpp::Wrap(view), width);

  // Return type: simple
  return _retval;
}

void CEF_CALLBACK
window_delegate_on_parent_view_changed(struct _cef_view_delegate_t* self,
                                       cef_view_t* view,
                                       int added,
                                       cef_view_t* parent) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return;
  // Verify param: view; type: refptr_diff
  DCHECK(view);
  if (!view)
    return;
  // Verify param: parent; type: refptr_diff
  DCHECK(parent);
  if (!parent)
    return;

  // Execute
  CefWindowDelegateCppToC::Get(reinterpret_cast<cef_window_delegate_t*>(self))
      ->OnParentViewChanged(CefViewCToCpp::Wrap(view), added ? true : false,
                            CefViewCToCpp::Wrap(parent));
}

void CEF_CALLBACK
window_delegate_on_child_view_changed(struct _cef_view_delegate_t* self,
                                      cef_view_t* view,
                                      int added,
                                      cef_view_t* child) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return;
  // Verify param: view; type: refptr_diff
  DCHECK(view);
  if (!view)
    return;
  // Verify param: child; type: refptr_diff
  DCHECK(child);
  if (!child)
    return;

  // Execute
  CefWindowDelegateCppToC::Get(reinterpret_cast<cef_window_delegate_t*>(self))
      ->OnChildViewChanged(CefViewCToCpp::Wrap(view), added ? true : false,
                           CefViewCToCpp::Wrap(child));
}

void CEF_CALLBACK window_delegate_on_focus(struct _cef_view_delegate_t* self,
                                           cef_view_t* view) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return;
  // Verify param: view; type: refptr_diff
  DCHECK(view);
  if (!view)
    return;

  // Execute
  CefWindowDelegateCppToC::Get(reinterpret_cast<cef_window_delegate_t*>(self))
      ->OnFocus(CefViewCToCpp::Wrap(view));
}

void CEF_CALLBACK window_delegate_on_blur(struct _cef_view_delegate_t* self,
                                          cef_view_t* view) {
  shutdown_checker::AssertNotShutdown();

  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING

  DCHECK(self);
  if (!self)
    return;
  // Verify param: view; type: refptr_diff
  DCHECK(view);
  if (!view)
    return;

  // Execute
  CefWindowDelegateCppToC::Get(reinterpret_cast<cef_window_delegate_t*>(self))
      ->OnBlur(CefViewCToCpp::Wrap(view));
}

}  // namespace

// CONSTRUCTOR - Do not edit by hand.

CefWindowDelegateCppToC::CefWindowDelegateCppToC() {
  GetStruct()->on_window_created = window_delegate_on_window_created;
  GetStruct()->on_window_destroyed = window_delegate_on_window_destroyed;
  GetStruct()->get_parent_window = window_delegate_get_parent_window;
  GetStruct()->is_frameless = window_delegate_is_frameless;
  GetStruct()->can_resize = window_delegate_can_resize;
  GetStruct()->can_maximize = window_delegate_can_maximize;
  GetStruct()->can_minimize = window_delegate_can_minimize;
  GetStruct()->can_close = window_delegate_can_close;
  GetStruct()->on_accelerator = window_delegate_on_accelerator;
  GetStruct()->on_key_event = window_delegate_on_key_event;
  GetStruct()->base.base.get_preferred_size =
      window_delegate_get_preferred_size;
  GetStruct()->base.base.get_minimum_size = window_delegate_get_minimum_size;
  GetStruct()->base.base.get_maximum_size = window_delegate_get_maximum_size;
  GetStruct()->base.base.get_height_for_width =
      window_delegate_get_height_for_width;
  GetStruct()->base.base.on_parent_view_changed =
      window_delegate_on_parent_view_changed;
  GetStruct()->base.base.on_child_view_changed =
      window_delegate_on_child_view_changed;
  GetStruct()->base.base.on_focus = window_delegate_on_focus;
  GetStruct()->base.base.on_blur = window_delegate_on_blur;
}

// DESTRUCTOR - Do not edit by hand.

CefWindowDelegateCppToC::~CefWindowDelegateCppToC() {
  shutdown_checker::AssertNotShutdown();
}

template <>
CefRefPtr<CefWindowDelegate> CefCppToCRefCounted<
    CefWindowDelegateCppToC,
    CefWindowDelegate,
    cef_window_delegate_t>::UnwrapDerived(CefWrapperType type,
                                          cef_window_delegate_t* s) {
  NOTREACHED() << "Unexpected class type: " << type;
  return nullptr;
}

template <>
CefWrapperType CefCppToCRefCounted<CefWindowDelegateCppToC,
                                   CefWindowDelegate,
                                   cef_window_delegate_t>::kWrapperType =
    WT_WINDOW_DELEGATE;
