• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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/login/existing_user_view.h"
6 
7 #include "base/utf_string_conversions.h"
8 #include "chrome/browser/chromeos/login/textfield_with_margin.h"
9 #include "chrome/browser/chromeos/login/user_controller.h"
10 #include "chrome/browser/chromeos/login/wizard_accessibility_helper.h"
11 #include "grit/generated_resources.h"
12 #include "ui/base/l10n/l10n_util.h"
13 #include "ui/base/resource/resource_bundle.h"
14 #include "views/background.h"
15 #include "views/controls/textfield/textfield.h"
16 #include "views/focus/focus_manager.h"
17 #include "views/layout/fill_layout.h"
18 
19 namespace chromeos {
20 
21 // Colors for gradient background. These should be consistent with border
22 // window background so textfield border is not visible to the user.
23 // The background is needed for password textfield to imitate its borders
24 // transparency correctly.
25 const SkColor kBackgroundColorTop = SkColorSetRGB(209, 213, 216);
26 const SkColor kBackgroundColorBottom = SkColorSetRGB(205, 210, 213);
27 
28 // Textfield with custom processing for Tab/Shift+Tab to select entries.
29 class UserEntryTextfield : public TextfieldWithMargin {
30  public:
UserEntryTextfield(UserController * controller,views::Textfield::StyleFlags style)31   UserEntryTextfield(UserController* controller,
32                      views::Textfield::StyleFlags style)
33       : TextfieldWithMargin(style),
34         controller_(controller) {}
35 
36   // Overridden from views::View:
OnKeyPressed(const views::KeyEvent & e)37   virtual bool OnKeyPressed(const views::KeyEvent& e) {
38     if (e.key_code() == ui::VKEY_TAB) {
39       controller_->SelectUserRelative(e.IsShiftDown() ? -1 : 1);
40       return true;
41     } else if (e.key_code() == ui::VKEY_LEFT) {
42       controller_->SelectUserRelative(-1);
43       return true;
44     } else if (e.key_code() == ui::VKEY_RIGHT) {
45       controller_->SelectUserRelative(1);
46       return true;
47     } else {
48       return TextfieldWithMargin::OnKeyPressed(e);
49     }
50   }
51 
SkipDefaultKeyEventProcessing(const views::KeyEvent & e)52   virtual bool SkipDefaultKeyEventProcessing(const views::KeyEvent& e) {
53     if (e.key_code() == ui::VKEY_TAB)
54       return true;
55     else
56       return views::Textfield::SkipDefaultKeyEventProcessing(e);
57   }
58 
59  private:
60   UserController* controller_;
61 
62   DISALLOW_COPY_AND_ASSIGN(UserEntryTextfield);
63 };
64 
65 
ExistingUserView(UserController * user_controller)66 ExistingUserView::ExistingUserView(UserController* user_controller)
67     : user_controller_(user_controller),
68       password_field_(NULL),
69       accel_enterprise_enrollment_(
70           views::Accelerator(ui::VKEY_E, false, true, true)),
71       accel_login_off_the_record_(
72           views::Accelerator(ui::VKEY_B, false, false, true)),
73       accel_toggle_accessibility_(
74           WizardAccessibilityHelper::GetAccelerator()) {
75   AddAccelerator(accel_enterprise_enrollment_);
76   AddAccelerator(accel_login_off_the_record_);
77   AddAccelerator(accel_toggle_accessibility_);
78 }
79 
RecreateFields()80 void ExistingUserView::RecreateFields() {
81   if (password_field_ == NULL) {
82     SetLayoutManager(new views::FillLayout);
83     password_field_ = new UserEntryTextfield(user_controller_,
84                                              views::Textfield::STYLE_PASSWORD);
85     password_field_->set_background(
86         views::Background::CreateVerticalGradientBackground(
87             kBackgroundColorTop, kBackgroundColorBottom));
88     password_field_->SetFocusable(true);
89     password_field_->SetController(this);
90     AddChildView(password_field_);
91   }
92   const gfx::Font& base_font = ResourceBundle::GetSharedInstance().GetFont(
93       ResourceBundle::BaseFont);
94   SetAndCorrectTextfieldFont(password_field_, base_font);
95   password_field_->set_text_to_display_when_empty(
96       l10n_util::GetStringUTF16(IDS_LOGIN_POD_EMPTY_PASSWORD_TEXT));
97   Layout();
98   SchedulePaint();
99 }
100 
AcceleratorPressed(const views::Accelerator & accelerator)101 bool ExistingUserView::AcceleratorPressed(
102     const views::Accelerator& accelerator) {
103   if (accelerator == accel_enterprise_enrollment_) {
104     user_controller_->OnStartEnterpriseEnrollment();
105     return true;
106   } else if (accelerator == accel_login_off_the_record_) {
107     user_controller_->OnLoginAsGuest();
108     return true;
109   } else if (accelerator == accel_toggle_accessibility_) {
110     WizardAccessibilityHelper::GetInstance()->ToggleAccessibility();
111     return true;
112   }
113   return false;
114 }
115 
HandleKeyEvent(views::Textfield * sender,const views::KeyEvent & key_event)116 bool ExistingUserView::HandleKeyEvent(views::Textfield* sender,
117                                       const views::KeyEvent& key_event) {
118   if (key_event.key_code() == ui::VKEY_RETURN) {
119     if (!password_field_->text().empty())
120       user_controller_->OnLogin("", UTF16ToUTF8(password_field_->text()));
121   } else {
122     user_controller_->ClearErrors();
123     return false;
124   }
125   return true;
126 }
127 
RequestFocus()128 void ExistingUserView::RequestFocus() {
129   password_field_->RequestFocus();
130 }
131 
ContentsChanged(views::Textfield * sender,const string16 & new_contents)132 void ExistingUserView::ContentsChanged(views::Textfield* sender,
133                                        const string16& new_contents) {
134   if (!new_contents.empty())
135     user_controller_->ClearErrors();
136 }
137 
EnableInputControls(bool enabled)138 void ExistingUserView::EnableInputControls(bool enabled) {
139   password_field_->SetEnabled(enabled);
140 }
141 
ClearAndFocusControls()142 void ExistingUserView::ClearAndFocusControls() {
143   ClearAndFocusPassword();
144 }
145 
ClearAndFocusPassword()146 void ExistingUserView::ClearAndFocusPassword() {
147   password_field_->SetText(string16());
148   FocusPasswordField();
149 }
150 
FocusPasswordField()151 void ExistingUserView::FocusPasswordField() {
152   password_field_->RequestFocus();
153 }
154 
GetMainInputScreenBounds() const155 gfx::Rect ExistingUserView::GetMainInputScreenBounds() const {
156   return password_field_->GetScreenBounds();
157 }
158 
OnLocaleChanged()159 void ExistingUserView::OnLocaleChanged() {
160   RecreateFields();
161 }
162 
163 }  // namespace chromeos
164