• 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 #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_NEW_USER_VIEW_H_
6 #define CHROME_BROWSER_CHROMEOS_LOGIN_NEW_USER_VIEW_H_
7 #pragma once
8 
9 #include <string>
10 
11 #include "base/task.h"
12 #include "chrome/browser/chromeos/login/helper.h"
13 #include "chrome/browser/chromeos/login/language_switch_menu.h"
14 #include "chrome/browser/chromeos/login/user_input.h"
15 #include "views/accelerator.h"
16 #include "views/controls/button/button.h"
17 #include "views/controls/link.h"
18 #include "views/controls/textfield/textfield_controller.h"
19 #include "views/view.h"
20 
21 namespace views {
22 class Label;
23 class MenuButton;
24 class NativeButton;
25 }  // namespace views
26 
27 namespace chromeos {
28 
29 // View that is used for new user login. It asks for username and password,
30 // allows to specify language preferences or initiate new account creation.
31 class NewUserView : public ThrobberHostView,
32                     public UserInput,
33                     public views::TextfieldController,
34                     public views::LinkController,
35                     public views::ButtonListener {
36  public:
37   // Delegate class to get notifications from the view.
38   class Delegate {
39   public:
~Delegate()40     virtual ~Delegate() {}
41 
42     // User provided |username|, |password| and initiated login.
43     virtual void OnLogin(const std::string& username,
44                          const std::string& password) = 0;
45 
46     // Initiates incognito login.
47     virtual void OnLoginAsGuest() = 0;
48 
49     // User initiated new account creation.
50     virtual void OnCreateAccount() = 0;
51 
52     // User requested enterprise enrollment.
53     virtual void OnStartEnterpriseEnrollment() = 0;
54 
55     // User started typing so clear all error messages.
56     virtual void ClearErrors() = 0;
57 
58     // User tries to navigate away from NewUserView pod.
59     virtual void NavigateAway() = 0;
60   };
61 
62   // If |need_border| is true, RoundedRect border and background are required.
63   NewUserView(Delegate* delegate,
64               bool need_border,
65               bool need_guest_link);
66 
67   virtual ~NewUserView();
68 
69   // Initialize view layout.
70   void Init();
71 
72   // Update strings from the resources. Executed on language change.
73   void UpdateLocalizedStringsAndFonts();
74 
75   // Returns bounds of password field in screen coordinates.
76   gfx::Rect GetPasswordBounds() const;
77 
78   // Returns bounds of username field in screen coordinates.
79   gfx::Rect GetUsernameBounds() const;
80 
81   // views::View:
82   virtual gfx::Size GetPreferredSize();
83   virtual void Layout();
84   virtual void RequestFocus();
85 
86   // Setters for textfields.
87   void SetUsername(const std::string& username);
88   void SetPassword(const std::string& password);
89 
90   // Attempt to login with the current field values.
91   void Login();
92 
93   // views::TextfieldController:
94   // Not thread-safe, by virtue of using SetupSession().
95   virtual bool HandleKeyEvent(views::Textfield* sender,
96                               const views::KeyEvent& keystroke);
97   virtual void ContentsChanged(views::Textfield* sender,
98                                const string16& new_contents);
99 
100   // views::ButtonListener:
101   virtual void ButtonPressed(views::Button* sender, const views::Event& event);
102 
103   // views::LinkController:
104   virtual void LinkActivated(views::Link* source, int event_flags);
105   virtual bool AcceleratorPressed(const views::Accelerator& accelerator);
106 
107   // ThrobberHostView:
108   virtual gfx::Rect CalculateThrobberBounds(views::Throbber* throbber);
109 
110   // UserInput:
111   virtual void EnableInputControls(bool enabled);
112   virtual void ClearAndFocusControls();
113   virtual void ClearAndFocusPassword();
114   virtual gfx::Rect GetMainInputScreenBounds() const;
115 
116   // Navigates "away" to other user pods if allowed.
117   // Returns true if event has been processed.
118   bool NavigateAway();
119 
120  protected:
121   // views::View:
122   virtual void ViewHierarchyChanged(bool is_add,
123                                     views::View *parent,
124                                     views::View *child);
125   virtual void OnLocaleChanged();
126   void AddChildView(View* view);
127 
128  private:
129   // Creates Link control and adds it as a child.
130   void InitLink(views::Link** link);
131 
132   // Delete and recreate native controls that fail to update preferred size
133   // after text/locale update.
134   void RecreatePeculiarControls();
135 
136   // Enable or disable the |sign_in_button_| based on the contents of the
137   // |username_field_| and |password_field_|. If there is text in both the
138   // button is enabled, otherwise it's disabled.
139   void UpdateSignInButtonState();
140 
141   // Create view with specified solid background and add it as  child.
142   views::View* CreateSplitter(SkColor color);
143 
144   // Screen controls.
145   // NOTE: sign_in_button_ and languages_menubutton_ are handled with
146   // special care: they are recreated on any text/locale change
147   // because they are not resized properly.
148   views::Textfield* username_field_;
149   views::Textfield* password_field_;
150   views::Label* title_label_;
151   views::Label* title_hint_label_;
152   views::View* splitter_up1_;
153   views::View* splitter_up2_;
154   views::View* splitter_down1_;
155   views::View* splitter_down2_;
156   views::NativeButton* sign_in_button_;
157   views::Link* guest_link_;
158   views::Link* create_account_link_;
159   views::MenuButton* languages_menubutton_;
160 
161   views::Accelerator accel_focus_pass_;
162   views::Accelerator accel_focus_user_;
163   views::Accelerator accel_enterprise_enrollment_;
164   views::Accelerator accel_login_off_the_record_;
165   views::Accelerator accel_toggle_accessibility_;
166 
167   // Notifications receiver.
168   Delegate* delegate_;
169 
170   ScopedRunnableMethodFactory<NewUserView> focus_grabber_factory_;
171 
172   LanguageSwitchMenu language_switch_menu_;
173 
174   // True when login is in process.
175   bool login_in_process_;
176 
177   // If true, this view needs RoundedRect border and background.
178   bool need_border_;
179 
180   // Whether Guest Mode link is needed.
181   bool need_guest_link_;
182 
183   // Whether create account link is needed. Set to false for now but we may
184   // need it back in near future.
185   bool need_create_account_;
186 
187   // Ordinal position of controls inside view layout.
188   int languages_menubutton_order_;
189   int sign_in_button_order_;
190 
191   DISALLOW_COPY_AND_ASSIGN(NewUserView);
192 };
193 
194 }  // namespace chromeos
195 
196 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_NEW_USER_VIEW_H_
197