blob: 9927deaca31ee86d88f655a3414d99dcdf5c5d94 [file] [log] [blame]
// Copyright 2017 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 "chrome/browser/ui/views/chrome_cleaner_reboot_dialog_win.h"
#include "base/strings/string16.h"
#include "chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_reboot_dialog_controller_win.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/ui_base_types.h"
#include "ui/events/event.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/text_constants.h"
#include "ui/views/controls/button/label_button.h"
#include "ui/views/layout/layout_provider.h"
#include "ui/views/widget/widget.h"
#include "ui/views/window/dialog_client_view.h"
namespace chrome {
void ShowChromeCleanerRebootPrompt(
Browser* browser,
safe_browsing::ChromeCleanerRebootDialogController* dialog_controller) {
DCHECK(browser);
DCHECK(dialog_controller);
ChromeCleanerRebootDialog* dialog =
new ChromeCleanerRebootDialog(dialog_controller);
dialog->Show(browser);
}
} // namespace chrome
namespace {
constexpr int kDialogWidth = 448;
constexpr int kDialogHeight = 116;
constexpr int kDialogYOffset = 72;
} // namespace
ChromeCleanerRebootDialog::ChromeCleanerRebootDialog(
safe_browsing::ChromeCleanerRebootDialogController* dialog_controller)
: dialog_controller_(dialog_controller) {
DCHECK(dialog_controller_);
set_margins(ChromeLayoutProvider::Get()->GetDialogInsetsForContentType(
views::TEXT, views::TEXT));
}
ChromeCleanerRebootDialog::~ChromeCleanerRebootDialog() {
// Make sure the controller is correctly notified in case the dialog widget is
// closed by some other means than the dialog buttons.
if (dialog_controller_) {
HandleDialogInteraction(DialogInteractionResult::kClosedOnDestruction);
}
}
void ChromeCleanerRebootDialog::Show(Browser* browser) {
DCHECK(browser);
DCHECK(dialog_controller_);
views::Widget* widget = DialogDelegate::CreateDialogWidget(
this, nullptr, browser->window()->GetNativeWindow());
widget->SetBounds(GetDialogBounds(browser));
widget->Show();
}
// WidgetDelegate overrides.
ui::ModalType ChromeCleanerRebootDialog::GetModalType() const {
return ui::MODAL_TYPE_NONE;
}
base::string16 ChromeCleanerRebootDialog::GetWindowTitle() const {
DCHECK(dialog_controller_);
return l10n_util::GetStringUTF16(IDS_CHROME_CLEANUP_REBOOT_PROMPT_TITLE);
}
views::View* ChromeCleanerRebootDialog::GetInitiallyFocusedView() {
// Set focus away from the Restart/OK button to prevent accidental prompt
// acceptance if the user is typing as the dialog appears.
return GetDialogClientView()->cancel_button();
}
// DialogDelegate overrides.
base::string16 ChromeCleanerRebootDialog::GetDialogButtonLabel(
ui::DialogButton button) const {
DCHECK(button == ui::DIALOG_BUTTON_OK || button == ui::DIALOG_BUTTON_CANCEL);
DCHECK(dialog_controller_);
return button == ui::DIALOG_BUTTON_OK
? l10n_util::GetStringUTF16(
IDS_CHROME_CLEANUP_REBOOT_PROMPT_RESTART_BUTTON_LABEL)
: DialogDelegate::GetDialogButtonLabel(button);
}
bool ChromeCleanerRebootDialog::Accept() {
HandleDialogInteraction(DialogInteractionResult::kAccept);
return true;
}
bool ChromeCleanerRebootDialog::Cancel() {
HandleDialogInteraction(DialogInteractionResult::kCancel);
return true;
}
bool ChromeCleanerRebootDialog::Close() {
HandleDialogInteraction(DialogInteractionResult::kClose);
return true;
}
bool ChromeCleanerRebootDialog::IsDialogDraggable() const {
return true;
}
void ChromeCleanerRebootDialog::HandleDialogInteraction(
DialogInteractionResult result) {
if (!dialog_controller_)
return;
switch (result) {
case DialogInteractionResult::kAccept:
dialog_controller_->Accept();
break;
case DialogInteractionResult::kCancel:
dialog_controller_->Cancel();
break;
case DialogInteractionResult::kClose:
case DialogInteractionResult::kClosedOnDestruction:
// Fallthrough.
dialog_controller_->Close();
break;
}
dialog_controller_ = nullptr;
}
gfx::Rect ChromeCleanerRebootDialog::GetDialogBounds(Browser* browser) const {
gfx::Rect browser_bounds = browser->window()->GetBounds();
return gfx::Rect(
browser_bounds.x() + (browser_bounds.width() - kDialogWidth) / 2,
browser_bounds.y() + kDialogYOffset, kDialogWidth, kDialogHeight);
}