// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_CONSTRAINED_WINDOW_CONSTRAINED_WINDOW_VIEWS_H_
#define COMPONENTS_CONSTRAINED_WINDOW_CONSTRAINED_WINDOW_VIEWS_H_

#include <memory>

#include "build/build_config.h"
#include "ui/gfx/native_ui_types.h"
#include "ui/views/widget/widget.h"

namespace content {
class WebContents;
}

namespace ui {
class DialogModel;
}

namespace views {
class DialogDelegate;
class WidgetDelegate;
}  // namespace views

namespace web_modal {
class ModalDialogHost;
class WebContentsModalDialogHost;
}  // namespace web_modal

namespace constrained_window {

extern const void* kConstrainedWindowWidgetIdentifier;

class ConstrainedWindowViewsClient;

// -- Helper functions for showing web modals.
// -- Please use tabs::TabDialogManager on desktop platforms.

// Shows the dialog with a new SingleWebContentsDialogManager. The dialog will
// notify via WillClose() when it is being destroyed.
// Please use tabs::TabDialogManager on desktop platforms.
void ShowModalDialog(gfx::NativeWindow dialog,
                     content::WebContents* web_contents);

// Calls CreateWebModalDialogViews, shows the dialog, and returns its widget.
// Please use tabs::TabDialogManager on desktop platforms.
views::Widget* ShowWebModalDialogViews(
    views::WidgetDelegate* dialog,
    content::WebContents* initiator_web_contents);

// As above, but with an owned widget.
// Please use tabs::TabDialogManager on desktop platforms.
std::unique_ptr<views::Widget> ShowWebModalDialogViewsOwned(
    views::WidgetDelegate* dialog,
    content::WebContents* initiator_web_contents,
    views::Widget::InitParams::Ownership expected_ownership);

// Create a widget for |dialog| that is modal to |web_contents|.
// The modal type of |dialog->GetModalType()| must be
// ui::mojom::ModalType::kChild.
// Please use tabs::TabDialogManager on desktop platforms.
views::Widget* CreateWebModalDialogViews(views::WidgetDelegate* dialog,
                                         content::WebContents* web_contents);

// Shows a web/tab-modal dialog based on `dialog_model` and returns its widget.
// Please use tabs::TabDialogManager on desktop platforms.
views::Widget* ShowWebModal(std::unique_ptr<ui::DialogModel> dialog_model,
                            content::WebContents* web_contents);

// -- Helper function for showing browser modals.

// Create a widget for |dialog| that has a modality given by
// |dialog->GetModalType()|.  The modal type must be either
// ui::mojom::ModalType::kSystem or ui::mojom::ModalType::kWindow.  This places
// the dialog appropriately if |parent| is a valid browser window. Currently,
// |parent| may be null for MODAL_TYPE_WINDOW, but that's a bug and callers
// shouldn't rely on that working. See http://crbug.com/657293. Instead of
// calling this function with null |parent| and MODAL_TYPE_WINDOW, consider
// calling views:: DialogDelegate::CreateDialogWidget(dialog, nullptr, nullptr)
// instead. For dialogs that may appear without direct user interaction (i.e.,
// that may appear while a user is busily accomplishing some other task in the
// browser), consider providing an override of GetDefaultDialogButton on
// |dialog| to suppress the normal behavior of choosing a focused-by-default
// button. This is especially important if the action of the default button has
// consequences on the user's task at hand.
views::Widget* CreateBrowserModalDialogViews(
    std::unique_ptr<views::DialogDelegate> dialog,
    gfx::NativeWindow parent);

// TODO(pbos): Transition calls to this to the unique_ptr<> version above.
views::Widget* CreateBrowserModalDialogViews(views::DialogDelegate* dialog,
                                             gfx::NativeWindow parent);

// Shows a browser-modal dialog based on `dialog_model`, returns pointer
// to the created widget.
views::Widget* ShowBrowserModal(std::unique_ptr<ui::DialogModel> dialog_model,
                                gfx::NativeWindow parent);

// -- Other utility functions.

// Sets the ConstrainedWindowClient impl.
void SetConstrainedWindowViewsClient(
    std::unique_ptr<ConstrainedWindowViewsClient> client);

// Update the position of dialog |widget| against |dialog_host|. This is used to
// reposition widgets e.g. when the host dimensions change.
void UpdateWebContentsModalDialogPosition(
    views::Widget* widget,
    web_modal::WebContentsModalDialogHost* dialog_host);

void UpdateWidgetModalDialogPosition(views::Widget* widget,
                                     web_modal::ModalDialogHost* dialog_host);

// Returns the top level WebContents of |initiator_web_contents|.
content::WebContents* GetTopLevelWebContents(
    content::WebContents* initiator_web_contents);

// True if the platform supports global screen coordinates. This is typically
// supported by most platforms except linux-wayland.
bool SupportsGlobalScreenCoordinates();

// True if the platform clips child widgets to their parent's viewport.
bool PlatformClipsChildrenToViewport();

}  // namespace constrained_window

#endif  // COMPONENTS_CONSTRAINED_WINDOW_CONSTRAINED_WINDOW_VIEWS_H_
