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_session_aborted_dialog.h" 6 7#include "ash/shell.h" 8#include "base/strings/utf_string_conversions.h" 9#include "chrome/browser/lifetime/application_lifetime.h" 10#include "chrome/grit/generated_resources.h" 11#include "ui/base/l10n/l10n_util.h" 12#include "ui/base/resource/resource_bundle.h" 13#include "ui/views/controls/button/checkbox.h" 14#include "ui/views/controls/label.h" 15#include "ui/views/layout/grid_layout.h" 16#include "ui/views/widget/widget.h" 17#include "ui/views/window/dialog_delegate.h" 18 19namespace chromeos { 20 21namespace { 22 23// Default width/height of the dialog. 24const int kDefaultWidth = 600; 25const int kDefaultHeight = 250; 26 27const int kPaddingToMessage = 20; 28const int kInset = 40; 29const int kTopInset = 10; 30 31//////////////////////////////////////////////////////////////////////////////// 32// Dialog for an aborted multi-profile session due to a user policy change . 33class MultiprofilesSessionAbortedView : public views::DialogDelegateView { 34 public: 35 explicit MultiprofilesSessionAbortedView(); 36 virtual ~MultiprofilesSessionAbortedView(); 37 38 static void ShowDialog(const std::string& user_email); 39 40 // views::DialogDelegate overrides. 41 virtual bool Accept() OVERRIDE; 42 virtual int GetDialogButtons() const OVERRIDE; 43 virtual base::string16 GetDialogButtonLabel( 44 ui::DialogButton button) const OVERRIDE; 45 46 // views::WidgetDelegate overrides. 47 virtual ui::ModalType GetModalType() const OVERRIDE; 48 49 // views::View overrides. 50 virtual gfx::Size GetPreferredSize() const OVERRIDE; 51 52 private: 53 void InitDialog(const std::string& user_email); 54 55 DISALLOW_COPY_AND_ASSIGN(MultiprofilesSessionAbortedView); 56}; 57 58//////////////////////////////////////////////////////////////////////////////// 59// MultiprofilesSessionAbortedView implementation. 60 61MultiprofilesSessionAbortedView::MultiprofilesSessionAbortedView() { 62} 63 64MultiprofilesSessionAbortedView::~MultiprofilesSessionAbortedView() { 65} 66 67// static 68void MultiprofilesSessionAbortedView::ShowDialog( 69 const std::string& user_email) { 70 MultiprofilesSessionAbortedView* dialog_view = 71 new MultiprofilesSessionAbortedView(); 72 views::DialogDelegate::CreateDialogWidget( 73 dialog_view, ash::Shell::GetTargetRootWindow(), NULL); 74 dialog_view->InitDialog(user_email); 75 views::Widget* widget = dialog_view->GetWidget(); 76 DCHECK(widget); 77 widget->Show(); 78 79 // Since this is the last thing the user ever sees, we also hide all system 80 // tray's from the screen. 81 aura::Window::Windows root_windows = ash::Shell::GetAllRootWindows(); 82 for (aura::Window::Windows::const_iterator iter = root_windows.begin(); 83 iter != root_windows.end(); ++iter) { 84 ash::Shell::GetInstance()->SetShelfAutoHideBehavior( 85 ash::SHELF_AUTO_HIDE_ALWAYS_HIDDEN, *iter); 86 } 87} 88 89bool MultiprofilesSessionAbortedView::Accept() { 90 chrome::AttemptUserExit(); 91 return true; 92} 93 94int MultiprofilesSessionAbortedView::GetDialogButtons() const { 95 return ui::DIALOG_BUTTON_OK; 96} 97 98base::string16 MultiprofilesSessionAbortedView::GetDialogButtonLabel( 99 ui::DialogButton button) const { 100 return l10n_util::GetStringUTF16( 101 IDS_MULTIPROFILES_SESSION_ABORT_BUTTON_LABEL); 102} 103 104ui::ModalType MultiprofilesSessionAbortedView::GetModalType() const { 105 return ui::MODAL_TYPE_SYSTEM; 106} 107 108gfx::Size MultiprofilesSessionAbortedView::GetPreferredSize() const { 109 return gfx::Size(kDefaultWidth, kDefaultHeight); 110} 111 112void MultiprofilesSessionAbortedView::InitDialog( 113 const std::string& user_email) { 114 const gfx::Insets kDialogInsets(kTopInset, kInset, kInset, kInset); 115 116 // Create the views and layout manager and set them up. 117 views::GridLayout* grid_layout = views::GridLayout::CreatePanel(this); 118 grid_layout->SetInsets(kDialogInsets); 119 120 views::ColumnSet* column_set = grid_layout->AddColumnSet(0); 121 column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, 122 views::GridLayout::USE_PREF, 0, 0); 123 124 views::Label* title_label_ = new views::Label( 125 l10n_util::GetStringUTF16(IDS_MULTIPROFILES_SESSION_ABORT_HEADLINE)); 126 title_label_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( 127 ui::ResourceBundle::MediumBoldFont)); 128 title_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 129 grid_layout->StartRow(0, 0); 130 grid_layout->AddView(title_label_); 131 grid_layout->AddPaddingRow(0, kPaddingToMessage); 132 133 // Explanation string. 134 views::Label* label = new views::Label( 135 l10n_util::GetStringFUTF16(IDS_MULTIPROFILES_SESSION_ABORT_MESSAGE, 136 base::ASCIIToUTF16(user_email))); 137 label->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( 138 ui::ResourceBundle::MediumFont)); 139 label->SetMultiLine(true); 140 label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 141 label->SetAllowCharacterBreak(true); 142 grid_layout->StartRow(0, 0); 143 grid_layout->AddView(label); 144 145 SetLayoutManager(grid_layout); 146 Layout(); 147} 148 149} // namespace 150 151//////////////////////////////////////////////////////////////////////////////// 152// Factory function. 153 154void ShowMultiprofilesSessionAbortedDialog(const std::string& user_email) { 155 MultiprofilesSessionAbortedView::ShowDialog(user_email); 156} 157 158} // namespace chromeos 159