blob: ea376706697a4c614fb25e94ed1a6a0fb03ed552 [file] [log] [blame]
// Copyright 2019 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/crostini/crostini_force_close_view.h"
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "chrome/grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/strings/grit/ui_strings.h"
#include "ui/views/controls/label.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/layout/layout_provider.h"
#include "ui/views/widget/widget.h"
namespace crostini {
// Due to chrome's include rules, we implement this function here.
views::Widget* ShowCrostiniForceCloseDialog(
const std::string& app_name,
views::Widget* closable_widget,
base::OnceClosure force_close_callback) {
return CrostiniForceCloseView::Show(app_name, closable_widget,
std::move(force_close_callback));
}
} // namespace crostini
views::Widget* CrostiniForceCloseView::Show(
const std::string& app_name,
views::Widget* closable_widget,
base::OnceClosure force_close_callback) {
return Show(app_name, closable_widget->GetNativeWindow(),
closable_widget->GetNativeView(),
std::move(force_close_callback));
}
views::Widget* CrostiniForceCloseView::Show(
const std::string& app_name,
gfx::NativeWindow closable_window,
gfx::NativeView closable_view,
base::OnceClosure force_close_callback) {
views::Widget* dialog_widget = views::DialogDelegate::CreateDialogWidget(
new CrostiniForceCloseView(app_name, std::move(force_close_callback)),
closable_window, closable_view);
dialog_widget->Show();
return dialog_widget;
}
bool CrostiniForceCloseView::Accept() {
std::move(force_close_callback_).Run();
return true;
}
ui::ModalType CrostiniForceCloseView::GetModalType() const {
return ui::ModalType::MODAL_TYPE_WINDOW;
}
bool CrostiniForceCloseView::ShouldShowCloseButton() const {
return false;
}
base::string16 CrostiniForceCloseView::GetWindowTitle() const {
return app_name_.empty()
? l10n_util::GetStringUTF16(IDS_CROSTINI_FORCE_CLOSE_TITLE_UNKNOWN)
: l10n_util::GetStringFUTF16(IDS_CROSTINI_FORCE_CLOSE_TITLE_KNOWN,
app_name_);
}
gfx::Size CrostiniForceCloseView::CalculatePreferredSize() const {
const int dialog_width = ChromeLayoutProvider::Get()->GetDistanceMetric(
DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) -
margins().width();
return gfx::Size(dialog_width, GetHeightForWidth(dialog_width));
}
CrostiniForceCloseView::CrostiniForceCloseView(
const std::string& app_name,
base::OnceClosure force_close_callback)
: app_name_(base::UTF8ToUTF16(app_name)),
force_close_callback_(std::move(force_close_callback)) {
DialogDelegate::set_button_label(
ui::DIALOG_BUTTON_OK,
l10n_util::GetStringUTF16(IDS_CROSTINI_FORCE_CLOSE_ACCEPT_BUTTON));
views::LayoutProvider* provider = views::LayoutProvider::Get();
SetLayoutManager(std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kVertical,
provider->GetInsetsMetric(views::InsetsMetric::INSETS_DIALOG),
provider->GetDistanceMetric(views::DISTANCE_RELATED_CONTROL_VERTICAL)));
set_margins(provider->GetDialogInsetsForContentType(
views::DialogContentType::TEXT, views::DialogContentType::TEXT));
views::Label* message_label = new views::Label(
app_name_.empty()
? l10n_util::GetStringUTF16(IDS_CROSTINI_FORCE_CLOSE_BODY_UNKNOWN)
: l10n_util::GetStringFUTF16(IDS_CROSTINI_FORCE_CLOSE_BODY_KNOWN,
app_name_));
message_label->SetMultiLine(true);
message_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
AddChildView(message_label);
set_close_on_deactivate(true);
chrome::RecordDialogCreation(chrome::DialogIdentifier::CROSTINI_FORCE_CLOSE);
}
CrostiniForceCloseView::~CrostiniForceCloseView() = default;