new_user_view.cc revision dc0f95d653279beabeb9817299e2902918ba123e
1a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Use of this source code is governed by a BSD-style license that can be 3a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// found in the LICENSE file. 4a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "chrome/browser/chromeos/login/new_user_view.h" 6a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 7a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include <signal.h> 8a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include <sys/types.h> 9a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 10a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include <algorithm> 11a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include <vector> 12a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 13a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "base/callback.h" 14a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "base/command_line.h" 15a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "base/message_loop.h" 16a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "base/process_util.h" 17a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "base/string_util.h" 18a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "base/utf_string_conversions.h" 19a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "chrome/browser/browser_process.h" 20a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "chrome/browser/chromeos/cros/cros_library.h" 21a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "chrome/browser/chromeos/login/rounded_rect_painter.h" 22a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "chrome/browser/chromeos/login/textfield_with_margin.h" 23a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "chrome/browser/chromeos/login/wizard_accessibility_helper.h" 24a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "chrome/browser/chromeos/user_cros_settings_provider.h" 25a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "chrome/browser/chromeos/views/copy_background.h" 26a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "chrome/browser/prefs/pref_service.h" 27a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "chrome/common/pref_names.h" 28a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "grit/app_resources.h" 29a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "grit/chromium_strings.h" 30a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "grit/generated_resources.h" 31a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "ui/base/keycodes/keyboard_codes.h" 32a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "ui/base/l10n/l10n_util.h" 33a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "ui/base/resource/resource_bundle.h" 34a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "ui/gfx/font.h" 35a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "views/controls/button/menu_button.h" 36a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "views/controls/label.h" 37a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "views/controls/throbber.h" 38a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "views/widget/widget_gtk.h" 3971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 4071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgusing views::View; 41a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 42a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgnamespace { 43ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 44a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgconst int kTextfieldWidth = 230; 45ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgconst int kSplitterHeight = 1; 46ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgconst int kTitlePad = 20; 47a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgconst int kRowPad = 13; 48a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgconst int kBottomPad = 33; 49a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgconst int kLeftPad = 33; 50a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgconst int kColumnPad = 7; 51a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgconst int kLanguagesMenuHeight = 25; 52a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgconst int kLanguagesMenuPad = 5; 53a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgconst SkColor kLanguagesMenuTextColor = 0xFF999999; 54e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.orgconst SkColor kErrorColor = 0xFF8F384F; 55e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.orgconst SkColor kSplitterUp1Color = 0xFFD0D2D3; 56ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgconst SkColor kSplitterUp2Color = 0xFFE1E3E4; 57ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgconst SkColor kSplitterDown1Color = 0xFFE3E6E8; 58e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.orgconst SkColor kSplitterDown2Color = 0xFFEAEDEE; 59a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgconst char kDefaultDomain[] = "@gmail.com"; 60a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 61a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Textfield that adds domain to the entered username if focus is lost and 62a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// username doesn't have full domain. 63a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgclass UsernameField : public chromeos::TextfieldWithMargin { 64a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 65a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org explicit UsernameField(chromeos::NewUserView* controller) 66ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org : controller_(controller) {} 67ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 688bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // views::Textfield overrides: 698bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org virtual void OnBlur() OVERRIDE { 708bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org string16 user_input; 718bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org bool was_trim = TrimWhitespace(text(), TRIM_ALL, &user_input) != TRIM_NONE; 728bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org if (!user_input.empty()) { 738bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org std::string username = UTF16ToUTF8(user_input); 748bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 758bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org if (username.find('@') == std::string::npos) { 768bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org username += kDefaultDomain; 778bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org SetText(UTF8ToUTF16(username)); 788bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org was_trim = false; 798bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org } 808bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org } 818bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 828bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org if (was_trim) 83a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org SetText(user_input); 84a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 85a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 86a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Overridden from views::View: 87a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual bool OnKeyPressed(const views::KeyEvent& e) OVERRIDE { 8837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (e.key_code() == ui::VKEY_LEFT) { 89a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return controller_->NavigateAway(); 90a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 91a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return TextfieldWithMargin::OnKeyPressed(e); 9237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 9337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 9437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com private: 9537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com chromeos::NewUserView* controller_; 9637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com DISALLOW_COPY_AND_ASSIGN(UsernameField); 9737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}; 98a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 99a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} // namespace 100a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 10137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comnamespace chromeos { 10237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 103a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgNewUserView::NewUserView(Delegate* delegate, 104ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org bool need_border, 105a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org bool need_guest_link) 106a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org : username_field_(NULL), 10737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com password_field_(NULL), 10837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com title_label_(NULL), 10937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com title_hint_label_(NULL), 11037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com splitter_up1_(NULL), 11137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com splitter_up2_(NULL), 11237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com splitter_down1_(NULL), 11337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com splitter_down2_(NULL), 11437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com sign_in_button_(NULL), 11537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com create_account_link_(NULL), 116a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org guest_link_(NULL), 117a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org languages_menubutton_(NULL), 118a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org accel_focus_pass_(views::Accelerator(ui::VKEY_P, false, false, true)), 119a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org accel_focus_user_(views::Accelerator(ui::VKEY_U, false, false, true)), 120a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org accel_login_off_the_record_( 121c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org views::Accelerator(ui::VKEY_B, false, false, true)), 122c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org accel_toggle_accessibility_(WizardAccessibilityHelper::GetAccelerator()), 123c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org delegate_(delegate), 124c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org ALLOW_THIS_IN_INITIALIZER_LIST(focus_grabber_factory_(this)), 125c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org login_in_process_(false), 126c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org need_border_(need_border), 127c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org need_guest_link_(false), 128c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org need_create_account_(false), 129a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org languages_menubutton_order_(-1), 130a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org sign_in_button_order_(-1) { 131c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org if (UserCrosSettingsProvider::cached_allow_guest()) { 132a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org need_create_account_ = true; 133a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (need_guest_link) 134a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org need_guest_link_ = true; 135a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 136ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 1379085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 138ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgNewUserView::~NewUserView() { 139ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 140ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 141ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgvoid NewUserView::Init() { 142ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (need_border_) { 1439085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Use rounded rect background. 144ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org set_border(CreateWizardBorder(&BorderDefinition::kUserBorder)); 145ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org views::Painter* painter = CreateWizardPainter( 146ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org &BorderDefinition::kUserBorder); 147a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org set_background(views::Background::CreateBackgroundPainter(true, painter)); 14886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } 14986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 15086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Set up fonts. 15186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 15286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org gfx::Font title_font = rb.GetFont(ResourceBundle::MediumBoldFont).DeriveFont( 15386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org kLoginTitleFontDelta); 154ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org gfx::Font title_hint_font = rb.GetFont(ResourceBundle::BoldFont); 155ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 15686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org title_label_ = new views::Label(); 157ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org title_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); 158ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org title_label_->SetFont(title_font); 15986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org title_label_->SetMultiLine(true); 16086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org AddChildView(title_label_); 16186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 16286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org title_hint_label_ = new views::Label(); 16386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org title_hint_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); 16486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org title_hint_label_->SetFont(title_hint_font); 16586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org title_hint_label_->SetColor(SK_ColorGRAY); 166ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org title_hint_label_->SetMultiLine(true); 16786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org AddChildView(title_hint_label_); 168ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 16986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org splitter_up1_ = CreateSplitter(kSplitterUp1Color); 17086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org splitter_up2_ = CreateSplitter(kSplitterUp2Color); 17186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org splitter_down1_ = CreateSplitter(kSplitterDown1Color); 17286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org splitter_down2_ = CreateSplitter(kSplitterDown2Color); 17386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 17486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org username_field_ = new UsernameField(this); 17586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org username_field_->set_background(new CopyBackground(this)); 17686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org username_field_->SetAccessibleName( 17786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org l10n_util::GetStringUTF16(IDS_CHROMEOS_ACC_USERNAME_LABEL)); 17886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org AddChildView(username_field_); 17986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 18086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org password_field_ = new TextfieldWithMargin(views::Textfield::STYLE_PASSWORD); 18186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org password_field_->set_background(new CopyBackground(this)); 18286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org AddChildView(password_field_); 183ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 18486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org language_switch_menu_.InitLanguageMenu(); 18586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 18686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org RecreatePeculiarControls(); 18786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 18886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org AddChildView(sign_in_button_); 1898bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org if (need_create_account_) { 190ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org InitLink(&create_account_link_); 191ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1928bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org if (need_guest_link_) { 193a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org InitLink(&guest_link_); 194a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 19537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com AddChildView(languages_menubutton_); 196a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 19786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // Set up accelerators. 19886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org AddAccelerator(accel_focus_user_); 19986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org AddAccelerator(accel_focus_pass_); 200ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org AddAccelerator(accel_login_off_the_record_); 20186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org AddAccelerator(accel_toggle_accessibility_); 2022abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 20386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org OnLocaleChanged(); 204a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 205a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Controller to handle events from textfields 206a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org username_field_->SetController(this); 207a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org password_field_->SetController(this); 208a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (!CrosLibrary::Get()->EnsureLoaded()) { 209a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EnableInputControls(false); 210ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 211ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 212a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // The 'Sign in' button should be disabled when there is no text in the 213a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // username and password fields. 214a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org sign_in_button_->SetEnabled(false); 215a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 216a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 217a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgbool NewUserView::AcceleratorPressed(const views::Accelerator& accelerator) { 218a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (accelerator == accel_focus_user_) { 219ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org username_field_->RequestFocus(); 220a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else if (accelerator == accel_focus_pass_) { 221a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org password_field_->RequestFocus(); 222a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else if (accelerator == accel_login_off_the_record_) { 223a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org delegate_->OnLoginAsGuest(); 224a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else if (accelerator == accel_toggle_accessibility_) { 225a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org WizardAccessibilityHelper::GetInstance()->ToggleAccessibility(); 226ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } else { 227a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return false; 228a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 229a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return true; 230a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 231a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 232a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid NewUserView::RecreatePeculiarControls() { 233ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // PreferredSize reported by MenuButton (and TextField) is not able 234a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // to shrink, only grow; so recreate on text change. 235a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org delete languages_menubutton_; 236a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org languages_menubutton_ = new views::MenuButton( 237ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org NULL, std::wstring(), &language_switch_menu_, true); 238a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org languages_menubutton_->set_menu_marker( 239a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ResourceBundle::GetSharedInstance().GetBitmapNamed( 240a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org IDR_MENU_DROPARROW_SHARP)); 241ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org languages_menubutton_->SetEnabledColor(kLanguagesMenuTextColor); 242a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org languages_menubutton_->SetFocusable(true); 243a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org languages_menubutton_->SetEnabled(!g_browser_process->local_state()-> 244a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org IsManagedPreference(prefs::kApplicationLocale)); 245ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 246a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // There is no way to get native button preferred size after the button was 247a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // sized so delete and recreate the button on text update. 248a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org delete sign_in_button_; 249ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org sign_in_button_ = new login::WideButton(this, std::wstring()); 250a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org UpdateSignInButtonState(); 251a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 252a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (!CrosLibrary::Get()->EnsureLoaded()) 253c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org sign_in_button_->SetEnabled(false); 254c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 255a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 256a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid NewUserView::UpdateSignInButtonState() { 257a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org bool enabled = !username_field_->text().empty() && 2582abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org !password_field_->text().empty(); 25986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org sign_in_button_->SetEnabled(enabled); 260c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 261a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 262a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgviews::View* NewUserView::CreateSplitter(SkColor color) { 263a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org views::View* splitter = new views::View(); 264a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org splitter->set_background(views::Background::CreateSolidBackground(color)); 265a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org AddChildView(splitter); 266a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return splitter; 267a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 268a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 269a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid NewUserView::AddChildView(View* view) { 270a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // languages_menubutton_ and sign_in_button_ are recreated on text change, 271a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // so we restore their original position in layout. 272a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (view == languages_menubutton_) { 273a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (languages_menubutton_order_ < 0) { 274a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org languages_menubutton_order_ = child_count(); 275a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 276a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org views::View::AddChildViewAt(view, languages_menubutton_order_); 277ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } else if (view == sign_in_button_) { 278a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (sign_in_button_order_ < 0) { 279a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org sign_in_button_order_ = child_count(); 280a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 281a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org views::View::AddChildViewAt(view, sign_in_button_order_); 282a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 283a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org views::View::AddChildView(view); 284a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 285ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 286a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 287a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid NewUserView::UpdateLocalizedStrings() { 288a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org title_label_->SetText(UTF16ToWide( 289ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org l10n_util::GetStringUTF16(IDS_LOGIN_TITLE))); 290a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org this->SetAccessibleName(l10n_util::GetStringUTF16(IDS_LOGIN_TITLE)); 291381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org title_hint_label_->SetText(UTF16ToWide( 292381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org l10n_util::GetStringUTF16(IDS_LOGIN_TITLE_HINT))); 293381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org username_field_->set_text_to_display_when_empty( 294381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org l10n_util::GetStringUTF16(IDS_LOGIN_USERNAME)); 2958bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org password_field_->set_text_to_display_when_empty( 2968bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org l10n_util::GetStringUTF16(IDS_LOGIN_PASSWORD)); 2978bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org sign_in_button_->SetLabel(UTF16ToWide( 2988bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org l10n_util::GetStringUTF16(IDS_LOGIN_BUTTON))); 299ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (need_create_account_) { 3008bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org create_account_link_->SetText( 3018bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org UTF16ToWide(l10n_util::GetStringUTF16(IDS_CREATE_ACCOUNT_BUTTON))); 3028bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org } 3038bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org if (need_guest_link_) { 304a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org guest_link_->SetText(UTF16ToWide( 305ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org l10n_util::GetStringUTF16(IDS_BROWSE_WITHOUT_SIGNING_IN_BUTTON))); 306a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 307ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org delegate_->ClearErrors(); 308a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org languages_menubutton_->SetText( 309a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org UTF16ToWide(language_switch_menu_.GetCurrentLocaleName())); 310a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 311a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 312a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid NewUserView::OnLocaleChanged() { 313a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org RecreatePeculiarControls(); 3148bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org UpdateLocalizedStrings(); 315ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org AddChildView(sign_in_button_); 3168bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org AddChildView(languages_menubutton_); 3178bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 3188bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org Layout(); 3198bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org SchedulePaint(); 32037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com RequestFocus(); 321ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 32237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 323ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgvoid NewUserView::RequestFocus() { 32437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (username_field_->text().empty()) 32537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com username_field_->RequestFocus(); 32637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com else 32737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com password_field_->RequestFocus(); 32837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com} 32937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 33037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comvoid NewUserView::ViewHierarchyChanged(bool is_add, 33137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com View *parent, 33237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com View *child) { 333ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (is_add && (child == username_field_ || child == password_field_)) { 33437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com MessageLoop::current()->PostTask(FROM_HERE, 33537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com focus_grabber_factory_.NewRunnableMethod( 33637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com &NewUserView::Layout)); 33737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 33837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com} 33937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 34037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Sets the bounds of the view, using x and y as the origin. 341ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// The width is determined by the min of width and the preferred size 34237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// of the view, unless force_width is true in which case it is always used. 343ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// The height is gotten from the preferred size and returned. 34437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comstatic int setViewBounds( 34537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com views::View* view, int x, int y, int width, bool force_width) { 34637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com gfx::Size pref_size = view->GetPreferredSize(); 34737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (!force_width) { 34837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (pref_size.width() < width) { 34937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com width = pref_size.width(); 35037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 35137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 35237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com int height = pref_size.height(); 35337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com view->SetBounds(x, y, width, height); 35437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com return height; 35537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com} 35637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 35737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comvoid NewUserView::Layout() { 358ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org gfx::Insets insets = GetInsets(); 35937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 36037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // Place language selection in top right corner. 36137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com int x = std::max(0, 36237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com this->width() - insets.right() - 36337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com languages_menubutton_->GetPreferredSize().width() - kColumnPad); 36437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com int y = insets.top() + kLanguagesMenuPad; 36537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com int width = std::min(this->width() - insets.width() - 2 * kColumnPad, 36637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com languages_menubutton_->GetPreferredSize().width()); 36737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com int height = kLanguagesMenuHeight; 36837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com languages_menubutton_->SetBounds(x, y, width, height); 369ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org y += height + kTitlePad; 370ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 371ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org width = std::min(this->width() - insets.width() - 2 * kColumnPad, 372ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org kTextfieldWidth); 373ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org x = insets.left() + kLeftPad; 374ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int max_width = this->width() - x - std::max(insets.right(), x); 375ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org title_label_->SizeToFit(max_width); 376ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org title_hint_label_->SizeToFit(max_width); 377ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 378a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Top align title and title hint. 379ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org y += setViewBounds(title_label_, x, y, max_width, false); 380a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org y += setViewBounds(title_hint_label_, x, y, max_width, false); 381ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int title_end = y + kTitlePad; 382a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 383a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org splitter_up1_->SetBounds(0, title_end, this->width(), kSplitterHeight); 384a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org splitter_up2_->SetBounds(0, title_end + 1, this->width(), kSplitterHeight); 385a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 386a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Bottom controls. 387ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int links_height = 0; 388ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (need_create_account_) 389ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org links_height += create_account_link_->GetPreferredSize().height(); 390ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (need_guest_link_) 391ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org links_height += guest_link_->GetPreferredSize().height(); 392ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (need_create_account_ && need_guest_link_) 393ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org links_height += kRowPad; 394ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org y = this->height() - insets.bottom() - kBottomPad; 395ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (links_height) 396a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org y -= links_height + kBottomPad; 397ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int bottom_start = y; 398a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 399ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org splitter_down1_->SetBounds(0, y, this->width(), kSplitterHeight); 400a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org splitter_down2_->SetBounds(0, y + 1, this->width(), kSplitterHeight); 401a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 402a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org y += kBottomPad; 403a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (need_guest_link_) { 404a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org y += setViewBounds(guest_link_, 405ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org x, y, max_width, false) + kRowPad; 406ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 407ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (need_create_account_) { 408ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org y += setViewBounds(create_account_link_, x, y, max_width, false); 409ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 410ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 411ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Center main controls. 412ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org height = username_field_->GetPreferredSize().height() + 413ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org password_field_->GetPreferredSize().height() + 41437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com sign_in_button_->GetPreferredSize().height() + 415ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 2 * kRowPad; 416ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org y = title_end + (bottom_start - title_end - height) / 2; 417ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 418a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org y += setViewBounds(username_field_, x, y, width, true) + kRowPad; 41937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com y += setViewBounds(password_field_, x, y, width, true) + kRowPad; 420a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 421a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int sign_in_button_width = sign_in_button_->GetPreferredSize().width(); 422a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org setViewBounds(sign_in_button_, x, y, sign_in_button_width,true); 423ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 424ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org SchedulePaint(); 425ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 426ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 427ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orggfx::Size NewUserView::GetPreferredSize() { 428ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org return need_guest_link_ ? 429ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org gfx::Size(kNewUserPodFullWidth, kNewUserPodFullHeight) : 430ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org gfx::Size(kNewUserPodSmallWidth, kNewUserPodSmallHeight); 431ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 43237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 433ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgvoid NewUserView::SetUsername(const std::string& username) { 434ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org username_field_->SetText(UTF8ToUTF16(username)); 435ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 43637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 43737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comvoid NewUserView::SetPassword(const std::string& password) { 43837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com password_field_->SetText(UTF8ToUTF16(password)); 43937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com} 44037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 44137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comvoid NewUserView::Login() { 442ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (login_in_process_ || username_field_->text().empty()) 443ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org return; 444ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 44537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com login_in_process_ = true; 446ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org std::string username = UTF16ToUTF8(username_field_->text()); 447a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // todo(cmasone) Need to sanitize memory used to store password. 44837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com std::string password = UTF16ToUTF8(password_field_->text()); 449a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 450a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (username.find('@') == std::string::npos) { 451a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org username += kDefaultDomain; 452a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org username_field_->SetText(UTF8ToUTF16(username)); 453ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 454a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 455ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org delegate_->OnLogin(username, password); 456a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 457a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 458a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Sign in button causes a login attempt. 459a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid NewUserView::ButtonPressed(views::Button* sender, 460a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org const views::Event& event) { 461a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org DCHECK(sender == sign_in_button_); 462ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Login(); 463a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 464ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 465a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid NewUserView::LinkActivated(views::Link* source, int event_flags) { 466a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (source == create_account_link_) { 467a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org delegate_->OnCreateAccount(); 468a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else if (source == guest_link_) { 469a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org delegate_->OnLoginAsGuest(); 470a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 471ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 472ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 473a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid NewUserView::ClearAndFocusControls() { 474a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org login_in_process_ = false; 475a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org SetUsername(std::string()); 476a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org SetPassword(std::string()); 477a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org username_field_->RequestFocus(); 478ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 479ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 480a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid NewUserView::ClearAndFocusPassword() { 481a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org login_in_process_ = false; 482a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org SetPassword(std::string()); 483a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org password_field_->RequestFocus(); 4843291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org} 485ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 486ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orggfx::Rect NewUserView::GetMainInputScreenBounds() const { 4873291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org return GetUsernameBounds(); 4883291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org} 4893291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 4903291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orggfx::Rect NewUserView::CalculateThrobberBounds(views::Throbber* throbber) { 491a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org DCHECK(password_field_); 492a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org DCHECK(sign_in_button_); 493ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 494ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org gfx::Size throbber_size = throbber->GetPreferredSize(); 495ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int x = password_field_->x(); 496a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org x += password_field_->width() - throbber_size.width(); 497a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int y = sign_in_button_->y(); 498ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org y += (sign_in_button_->height() - throbber_size.height()) / 2; 499a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 500a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return gfx::Rect(gfx::Point(x, y), throbber_size); 501a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 502a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 503a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orggfx::Rect NewUserView::GetPasswordBounds() const { 504a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return password_field_->GetScreenBounds(); 505a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 506ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 507a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orggfx::Rect NewUserView::GetUsernameBounds() const { 508ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org return username_field_->GetScreenBounds(); 509ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 510a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 511a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgbool NewUserView::HandleKeyEvent(views::Textfield* sender, 512a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org const views::KeyEvent& key_event) { 513ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (!CrosLibrary::Get()->EnsureLoaded() || login_in_process_) 514a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return false; 515ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 516a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (key_event.key_code() == ui::VKEY_RETURN) { 517a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (!username_field_->text().empty() && !password_field_->text().empty()) 518a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Login(); 519ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Return true so that processing ends 520a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return true; 521ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 522a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org delegate_->ClearErrors(); 523a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Return false so that processing does not end 524a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return false; 525a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 526a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 527a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid NewUserView::ContentsChanged(views::Textfield* sender, 528a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org const string16& new_contents) { 529ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org UpdateSignInButtonState(); 530ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (!new_contents.empty()) 531ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org delegate_->ClearErrors(); 532ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 533a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 534a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid NewUserView::EnableInputControls(bool enabled) { 535a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org languages_menubutton_->SetEnabled(enabled && 536a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org !g_browser_process->local_state()->IsManagedPreference( 537a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org prefs::kApplicationLocale)); 538ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org username_field_->SetEnabled(enabled); 539ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org password_field_->SetEnabled(enabled); 540ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org sign_in_button_->SetEnabled(enabled); 541ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (need_create_account_) { 542a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org create_account_link_->SetEnabled(enabled); 543a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 544a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (need_guest_link_) { 545ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org guest_link_->SetEnabled(enabled); 546ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 547a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 548a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 549ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgbool NewUserView::NavigateAway() { 550a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (username_field_->text().empty() && 551a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org password_field_->text().empty()) { 552a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org delegate_->NavigateAway(); 553ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org return true; 554ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } else { 555a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return false; 556a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 557a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 558a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 559a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid NewUserView::InitLink(views::Link** link) { 560ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *link = new views::Link(std::wstring()); 561a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org (*link)->SetController(this); 562a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org (*link)->SetNormalColor(login::kLinkColor); 563a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org (*link)->SetHighlightedColor(login::kLinkColor); 564a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org AddChildView(*link); 565a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 566ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 567a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} // namespace chromeos 568a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org