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