1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/chromeos/profiles/multiprofiles_intro_dialog.h"
6
7#include "ash/shell.h"
8#include "chrome/grit/generated_resources.h"
9#include "ui/base/l10n/l10n_util.h"
10#include "ui/base/resource/resource_bundle.h"
11#include "ui/views/controls/button/checkbox.h"
12#include "ui/views/controls/label.h"
13#include "ui/views/layout/grid_layout.h"
14#include "ui/views/widget/widget.h"
15#include "ui/views/window/dialog_delegate.h"
16
17namespace chromeos {
18
19namespace {
20
21// Default width/height of the dialog.
22const int kDefaultWidth = 600;
23const int kDefaultHeight = 250;
24
25const int kPaddingToMessage = 20;
26const int kPaddingToCheckBox = 50;
27const int kInset = 40;
28const int kTopInset = 10;
29
30////////////////////////////////////////////////////////////////////////////////
31// Dialog for multi-profiles introduction.
32class MultiprofilesIntroView : public views::DialogDelegateView {
33 public:
34  explicit MultiprofilesIntroView(const base::Callback<void(bool)> on_accept);
35  virtual ~MultiprofilesIntroView();
36
37  static void ShowDialog(const base::Callback<void(bool)> on_accept);
38
39  // views::DialogDelegate overrides.
40  virtual bool Accept() OVERRIDE;
41
42  // views::WidgetDelegate overrides.
43  virtual ui::ModalType GetModalType() const OVERRIDE;
44
45  // views::View overrides.
46  virtual gfx::Size GetPreferredSize() const OVERRIDE;
47
48 private:
49  void InitDialog();
50
51  scoped_ptr<views::Checkbox> no_show_checkbox_;
52  const base::Callback<void(bool)> on_accept_;
53
54  DISALLOW_COPY_AND_ASSIGN(MultiprofilesIntroView);
55};
56
57////////////////////////////////////////////////////////////////////////////////
58// MultiprofilesIntroDialog implementation.
59
60MultiprofilesIntroView::MultiprofilesIntroView(
61    const base::Callback<void(bool)> on_accept)
62    : on_accept_(on_accept) {
63}
64
65MultiprofilesIntroView::~MultiprofilesIntroView() {
66}
67
68// static
69void MultiprofilesIntroView::ShowDialog(
70    const base::Callback<void(bool)> on_accept) {
71  MultiprofilesIntroView* dialog_view =
72      new MultiprofilesIntroView(on_accept);
73  views::DialogDelegate::CreateDialogWidget(
74      dialog_view, ash::Shell::GetTargetRootWindow(), NULL);
75  dialog_view->InitDialog();
76  views::Widget* widget = dialog_view->GetWidget();
77  DCHECK(widget);
78  widget->Show();
79}
80
81bool MultiprofilesIntroView::Accept() {
82  on_accept_.Run(no_show_checkbox_->checked());
83  return true;
84}
85
86ui::ModalType MultiprofilesIntroView::GetModalType() const {
87  return ui::MODAL_TYPE_SYSTEM;
88}
89
90gfx::Size MultiprofilesIntroView::GetPreferredSize() const {
91  return gfx::Size(kDefaultWidth, kDefaultHeight);
92}
93
94void MultiprofilesIntroView::InitDialog() {
95  const gfx::Insets kDialogInsets(kTopInset, kInset, kInset, kInset);
96
97  // Create the views and layout manager and set them up.
98  views::GridLayout* grid_layout = views::GridLayout::CreatePanel(this);
99  grid_layout->SetInsets(kDialogInsets);
100
101  views::ColumnSet* column_set = grid_layout->AddColumnSet(0);
102  column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1,
103                        views::GridLayout::USE_PREF, 0, 0);
104
105  views::Label* title_label_ = new views::Label(
106      l10n_util::GetStringUTF16(IDS_MULTIPROFILES_INTRO_HEADLINE));
107  title_label_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
108      ui::ResourceBundle::MediumBoldFont));
109  title_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
110  grid_layout->StartRow(0, 0);
111  grid_layout->AddView(title_label_);
112  grid_layout->AddPaddingRow(0, kPaddingToMessage);
113
114  // Explanation string.
115  views::Label* label = new views::Label(
116      l10n_util::GetStringUTF16(IDS_MULTIPROFILES_INTRO_MESSAGE));
117  label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
118      ui::ResourceBundle::MediumFont));
119  label->SetMultiLine(true);
120  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
121  label->SetAllowCharacterBreak(true);
122  grid_layout->StartRow(0, 0);
123  grid_layout->AddView(label);
124
125  // Next explanation string.
126  grid_layout->AddPaddingRow(0, kPaddingToMessage);
127  views::Label* lower_label = new views::Label(
128      l10n_util::GetStringUTF16(IDS_MULTIPROFILES_INTRO_EXPLANATION));
129  lower_label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList(
130      ui::ResourceBundle::MediumFont));
131  lower_label->SetMultiLine(true);
132  lower_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
133  lower_label->SetAllowCharacterBreak(true);
134  grid_layout->StartRow(0, 0);
135  grid_layout->AddView(lower_label);
136
137  // No-show again checkbox.
138  grid_layout->AddPaddingRow(0, kPaddingToCheckBox);
139  no_show_checkbox_.reset(new views::Checkbox(
140      l10n_util::GetStringUTF16(IDS_MULTIPROFILES_INTRO_NOSHOW_AGAIN)));
141  no_show_checkbox_->SetChecked(true);
142  no_show_checkbox_->SetFontList(
143      ui::ResourceBundle::GetSharedInstance().GetFontList(
144      ui::ResourceBundle::MediumFont));
145  no_show_checkbox_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
146  grid_layout->StartRow(0, 0);
147  grid_layout->AddView(no_show_checkbox_.get());
148
149  SetLayoutManager(grid_layout);
150  Layout();
151}
152
153}  // namespace
154
155////////////////////////////////////////////////////////////////////////////////
156// Factory function.
157
158void ShowMultiprofilesIntroDialog(const base::Callback<void(bool)> on_accept) {
159  MultiprofilesIntroView::ShowDialog(on_accept);
160}
161
162}  // namespace chromeos
163