172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/existing_user_view.h" 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/utf_string_conversions.h" 8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/login/textfield_with_margin.h" 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/user_controller.h" 10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/wizard_accessibility_helper.h" 11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/generated_resources.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/resource/resource_bundle.h" 14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "views/background.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/textfield/textfield.h" 16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/focus/focus_manager.h" 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/layout/fill_layout.h" 18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace chromeos { 20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Colors for gradient background. These should be consistent with border 22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// window background so textfield border is not visible to the user. 23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// The background is needed for password textfield to imitate its borders 24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// transparency correctly. 25513209b27ff55e2841eac0e4120199c23acce758Ben Murdochconst SkColor kBackgroundColorTop = SkColorSetRGB(209, 213, 216); 26513209b27ff55e2841eac0e4120199c23acce758Ben Murdochconst SkColor kBackgroundColorBottom = SkColorSetRGB(205, 210, 213); 27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Textfield with custom processing for Tab/Shift+Tab to select entries. 29513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass UserEntryTextfield : public TextfieldWithMargin { 30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public: 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen UserEntryTextfield(UserController* controller, 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen views::Textfield::StyleFlags style) 33513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch : TextfieldWithMargin(style), 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen controller_(controller) {} 35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Overridden from views::View: 37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual bool OnKeyPressed(const views::KeyEvent& e) { 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (e.key_code() == ui::VKEY_TAB) { 3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen controller_->SelectUserRelative(e.IsShiftDown() ? -1 : 1); 4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return true; 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else if (e.key_code() == ui::VKEY_LEFT) { 4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen controller_->SelectUserRelative(-1); 4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return true; 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else if (e.key_code() == ui::VKEY_RIGHT) { 4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen controller_->SelectUserRelative(1); 46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else { 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return TextfieldWithMargin::OnKeyPressed(e); 49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual bool SkipDefaultKeyEventProcessing(const views::KeyEvent& e) { 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (e.key_code() == ui::VKEY_TAB) 54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen else 56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return views::Textfield::SkipDefaultKeyEventProcessing(e); 57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private: 60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen UserController* controller_; 61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DISALLOW_COPY_AND_ASSIGN(UserEntryTextfield); 63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenExistingUserView::ExistingUserView(UserController* user_controller) 6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen : user_controller_(user_controller), 68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick password_field_(NULL), 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen accel_enterprise_enrollment_( 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen views::Accelerator(ui::VKEY_E, false, true, true)), 7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen accel_login_off_the_record_( 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen views::Accelerator(ui::VKEY_B, false, false, true)), 7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen accel_toggle_accessibility_( 74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen WizardAccessibilityHelper::GetAccelerator()) { 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddAccelerator(accel_enterprise_enrollment_); 76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddAccelerator(accel_login_off_the_record_); 7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen AddAccelerator(accel_toggle_accessibility_); 78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid ExistingUserView::RecreateFields() { 81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (password_field_ == NULL) { 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetLayoutManager(new views::FillLayout); 83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen password_field_ = new UserEntryTextfield(user_controller_, 84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen views::Textfield::STYLE_PASSWORD); 85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch password_field_->set_background( 86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch views::Background::CreateVerticalGradientBackground( 87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch kBackgroundColorTop, kBackgroundColorBottom)); 88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen password_field_->SetFocusable(true); 8921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen password_field_->SetController(this); 90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick AddChildView(password_field_); 91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const gfx::Font& base_font = ResourceBundle::GetSharedInstance().GetFont( 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ResourceBundle::BaseFont); 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SetAndCorrectTextfieldFont(password_field_, base_font); 95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen password_field_->set_text_to_display_when_empty( 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_LOGIN_POD_EMPTY_PASSWORD_TEXT)); 97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Layout(); 98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SchedulePaint(); 99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool ExistingUserView::AcceleratorPressed( 102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const views::Accelerator& accelerator) { 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (accelerator == accel_enterprise_enrollment_) { 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen user_controller_->OnStartEnterpriseEnrollment(); 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else if (accelerator == accel_login_off_the_record_) { 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen user_controller_->OnLoginAsGuest(); 108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } else if (accelerator == accel_toggle_accessibility_) { 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen WizardAccessibilityHelper::GetInstance()->ToggleAccessibility(); 111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return false; 114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1163f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenbool ExistingUserView::HandleKeyEvent(views::Textfield* sender, 1173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen const views::KeyEvent& key_event) { 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (key_event.key_code() == ui::VKEY_RETURN) { 11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!password_field_->text().empty()) 12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen user_controller_->OnLogin("", UTF16ToUTF8(password_field_->text())); 12121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } else { 12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen user_controller_->ClearErrors(); 12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return false; 12421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 12521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return true; 12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 12721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ExistingUserView::RequestFocus() { 12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen password_field_->RequestFocus(); 13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ExistingUserView::ContentsChanged(views::Textfield* sender, 13321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const string16& new_contents) { 13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!new_contents.empty()) 13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen user_controller_->ClearErrors(); 13621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 13721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 13821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ExistingUserView::EnableInputControls(bool enabled) { 13921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen password_field_->SetEnabled(enabled); 14021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 14121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 14221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ExistingUserView::ClearAndFocusControls() { 14321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ClearAndFocusPassword(); 14421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 14521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 14621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ExistingUserView::ClearAndFocusPassword() { 14721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen password_field_->SetText(string16()); 14821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FocusPasswordField(); 14921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 15021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid ExistingUserView::FocusPasswordField() { 15221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen password_field_->RequestFocus(); 15321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 15421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 15521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsengfx::Rect ExistingUserView::GetMainInputScreenBounds() const { 15621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return password_field_->GetScreenBounds(); 157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid ExistingUserView::OnLocaleChanged() { 160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen RecreateFields(); 161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} // namespace chromeos 164