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 17 namespace chromeos { 18 19 namespace { 20 21 // Default width/height of the dialog. 22 const int kDefaultWidth = 600; 23 const int kDefaultHeight = 250; 24 25 const int kPaddingToMessage = 20; 26 const int kPaddingToCheckBox = 50; 27 const int kInset = 40; 28 const int kTopInset = 10; 29 30 //////////////////////////////////////////////////////////////////////////////// 31 // Dialog for multi-profiles introduction. 32 class 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 60 MultiprofilesIntroView::MultiprofilesIntroView( 61 const base::Callback<void(bool)> on_accept) 62 : on_accept_(on_accept) { 63 } 64 65 MultiprofilesIntroView::~MultiprofilesIntroView() { 66 } 67 68 // static 69 void 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 81 bool MultiprofilesIntroView::Accept() { 82 on_accept_.Run(no_show_checkbox_->checked()); 83 return true; 84 } 85 86 ui::ModalType MultiprofilesIntroView::GetModalType() const { 87 return ui::MODAL_TYPE_SYSTEM; 88 } 89 90 gfx::Size MultiprofilesIntroView::GetPreferredSize() const { 91 return gfx::Size(kDefaultWidth, kDefaultHeight); 92 } 93 94 void 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 158 void ShowMultiprofilesIntroDialog(const base::Callback<void(bool)> on_accept) { 159 MultiprofilesIntroView::ShowDialog(on_accept); 160 } 161 162 } // namespace chromeos 163