1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/user_controller.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <algorithm>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/existing_user_view.h"
12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/login/guest_user_view.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/helper.h"
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/rounded_rect_painter.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/user_view.h"
16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/login/username_view.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/wizard_accessibility_helper.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/wizard_controller.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/user_cros_settings_provider.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/theme_resources.h"
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/cros/chromeos_wm_ipc_enums.h"
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/background.h"
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/button/native_button.h"
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "views/controls/label.h"
2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "views/controls/throbber.h"
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/focus/focus_manager.h"
31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "views/painter.h"
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "views/screen.h"
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/widget/root_view.h"
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/widget/widget_gtk.h"
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing views::Widget;
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing views::WidgetGtk;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Gap between the border around the image/buttons and user name.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kUserNameGap = 4;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Approximate height of controls window, this constant is used in new user
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// case to make border window size close to existing users.
48201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#if defined(CROS_FONTS_USING_BCI)
49201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst int kControlsHeight = 31;
50201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#else
51513209b27ff55e2841eac0e4120199c23acce758Ben Murdochconst int kControlsHeight = 28;
52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#endif
534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Vertical interval between the image and the textfield.
5521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst int kVerticalIntervalSize = 10;
5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// A window for controls that sets focus to the view when
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// it first got focus.
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass ControlsWindow : public WidgetGtk {
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  explicit ControlsWindow(views::View* initial_focus_view)
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      : WidgetGtk(WidgetGtk::TYPE_WINDOW),
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        initial_focus_view_(initial_focus_view) {
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // WidgetGtk overrides:
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetInitialFocus() OVERRIDE {
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (initial_focus_view_)
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      initial_focus_view_->RequestFocus();
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnMap(GtkWidget* widget) OVERRIDE {
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // For some reason, Controls window never gets first expose event,
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // which makes WM believe that the login screen is not ready.
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // This is a workaround to let WM show the login screen. While
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // this may allow WM to show unpainted window, we haven't seen any
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // issue (yet). We will not investigate this further because we're
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // migrating to different implemention (WebUI).
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    UpdateFreezeUpdatesProperty(GTK_WINDOW(GetNativeView()),
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                false /* remove */);
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  views::View* initial_focus_view_;
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(ControlsWindow);
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Widget that notifies window manager about clicking on itself.
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Doesn't send anything if user is selected.
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ClickNotifyingWidget : public views::WidgetGtk {
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ClickNotifyingWidget(views::WidgetGtk::Type type,
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       UserController* controller)
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : WidgetGtk(type),
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        controller_(controller) {
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gboolean OnButtonPress(GtkWidget* widget, GdkEventButton* event) {
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (!controller_->IsUserSelected())
10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      controller_->SelectUserRelative(0);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return views::WidgetGtk::OnButtonPress(widget, event);
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UserController* controller_;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ClickNotifyingWidget);
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CloseWindow(views::Widget* window) {
1134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (!window)
1144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    return;
115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  window->set_widget_delegate(NULL);
1164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  window->Close();
1174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
1184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing login::kBorderSize;
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing login::kUserImageSize;
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst int UserController::kPadding = 30;
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Max size needed when an entry is not selected.
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int UserController::kUnselectedSize = 100;
129513209b27ff55e2841eac0e4120199c23acce758Ben Murdochconst int UserController::kNewUserUnselectedSize = 42;
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen////////////////////////////////////////////////////////////////////////////////
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// UserController, public:
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
134731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickUserController::UserController(Delegate* delegate, bool is_guest)
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : user_index_(-1),
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      is_user_selected_(false),
137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      is_new_user_(!is_guest),
138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      is_guest_(is_guest),
139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      is_owner_(false),
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      show_name_tooltip_(false),
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      delegate_(delegate),
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controls_window_(NULL),
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      image_window_(NULL),
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      border_window_(NULL),
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      label_window_(NULL),
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      unselected_label_window_(NULL),
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      user_view_(NULL),
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      label_view_(NULL),
14921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      unselected_label_view_(NULL),
15021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      user_input_(NULL),
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      throbber_host_(NULL) {
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochUserController::UserController(Delegate* delegate,
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               const UserManager::User& user)
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : user_index_(-1),
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      is_user_selected_(false),
1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      is_new_user_(false),
159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      is_guest_(false),
160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // Empty 'cached_owner()' means that owner hasn't been cached yet, not
161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // that owner has an empty email.
16221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      is_owner_(user.email() == UserCrosSettingsProvider::cached_owner()),
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      show_name_tooltip_(false),
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      user_(user),
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      delegate_(delegate),
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controls_window_(NULL),
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      image_window_(NULL),
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      border_window_(NULL),
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      label_window_(NULL),
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      unselected_label_window_(NULL),
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      user_view_(NULL),
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      label_view_(NULL),
17321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      unselected_label_view_(NULL),
17421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      user_input_(NULL),
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      throbber_host_(NULL) {
17621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  DCHECK(!user.email().empty());
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochUserController::~UserController() {
180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Reset the widget delegate of every window to NULL, so the user
181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // controller will not get notified about the active window change.
182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // See also crosbug.com/7400.
1834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  CloseWindow(controls_window_);
1844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  CloseWindow(image_window_);
1854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  CloseWindow(border_window_);
1864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  CloseWindow(label_window_);
1874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  CloseWindow(unselected_label_window_);
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid UserController::Init(int index,
1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                          int total_user_count,
1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                          bool need_browse_without_signin) {
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int controls_height = 0;
194513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int controls_width = 0;
1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  controls_window_ =
196513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      CreateControlsWindow(index, &controls_width, &controls_height,
197513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                           need_browse_without_signin);
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  image_window_ = CreateImageWindow(index);
199513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CreateBorderWindow(index, total_user_count, controls_width, controls_height);
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  label_window_ = CreateLabelWindow(index, WM_IPC_WINDOW_LOGIN_LABEL);
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  unselected_label_window_ =
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      CreateLabelWindow(index, WM_IPC_WINDOW_LOGIN_UNSELECTED_LABEL);
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid UserController::ClearAndEnableFields() {
20621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  user_input_->EnableInputControls(true);
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  user_input_->ClearAndFocusControls();
20821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  StopThrobber();
20921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
21021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid UserController::ClearAndEnablePassword() {
212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Somehow focus manager thinks that textfield is still focused but the
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // textfield doesn't know that. So we clear focus for focus manager so it
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // sets focus on the textfield again.
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(avayvod): Fix the actual issue.
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  views::FocusManager* focus_manager = controls_window_->GetFocusManager();
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (focus_manager)
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    focus_manager->ClearFocus();
21921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  user_input_->EnableInputControls(true);
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  user_input_->ClearAndFocusPassword();
22121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  StopThrobber();
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid UserController::EnableNameTooltip(bool enable) {
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  name_tooltip_enabled_ = enable;
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring tooltip_text;
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (enable)
2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    tooltip_text = GetNameTooltip();
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (user_view_)
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    user_view_->SetTooltipText(tooltip_text);
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (label_view_)
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    label_view_->SetTooltipText(tooltip_text);
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (unselected_label_view_)
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    unselected_label_view_->SetTooltipText(tooltip_text);
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsengfx::Rect UserController::GetMainInputScreenBounds() const {
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return user_input_->GetMainInputScreenBounds();
24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid UserController::OnUserImageChanged(UserManager::User* user) {
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (user_.email() != user->email())
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  user_.set_image(user->image());
24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Controller might exist without windows,
24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // i.e. if user pod doesn't fit on the screen.
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (user_view_)
24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    user_view_->SetImage(user_.image(), user_.image());
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid UserController::SelectUserRelative(int shift) {
25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delegate_->SelectUser(user_index() + shift);
25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
25572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
25672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid UserController::StartThrobber() {
25772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  throbber_host_->StartThrobber();
25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid UserController::StopThrobber() {
26172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  throbber_host_->StopThrobber();
26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
26372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
26472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid UserController::UpdateUserCount(int index, int total_user_count) {
26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  user_index_ = index;
26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<int> params;
26772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  params.push_back(index);
26872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  params.push_back(total_user_count);
26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  params.push_back(is_new_user_ ? kNewUserUnselectedSize : kUnselectedSize);
27072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  params.push_back(kPadding);
27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  WmIpc::instance()->SetWindowType(
27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      border_window_->GetNativeView(),
27372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      WM_IPC_WINDOW_LOGIN_BORDER,
27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      &params);
27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
27672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstd::string UserController::GetAccessibleUserLabel() {
278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (is_new_user_)
279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return l10n_util::GetStringUTF8(IDS_ADD_USER);
280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (is_guest_)
281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return l10n_util::GetStringUTF8(IDS_GUEST);
282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return user_.email();
283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
28572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen////////////////////////////////////////////////////////////////////////////////
28672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// UserController, WidgetDelegate implementation:
28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid UserController::OnWidgetActivated(bool active) {
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  is_user_selected_ = active;
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (active) {
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_->OnUserSelected(this);
292731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    user_view_->SetRemoveButtonVisible(
293731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        !is_new_user_ && !is_guest_ && !is_owner_);
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
2953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    user_view_->SetRemoveButtonVisible(false);
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_->ClearErrors();
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen////////////////////////////////////////////////////////////////////////////////
30172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// UserController, NewUserView::Delegate implementation:
30272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid UserController::OnLogin(const std::string& username,
30472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             const std::string& password) {
30572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (is_new_user_)
30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    user_.set_email(username);
30772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
30872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  user_input_->EnableInputControls(false);
30972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  StartThrobber();
31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
31172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delegate_->Login(this, UTF8ToUTF16(password));
31272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
31472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid UserController::OnCreateAccount() {
31572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  user_input_->EnableInputControls(false);
31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  StartThrobber();
31772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
31872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delegate_->CreateAccount();
31972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
32072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid UserController::OnStartEnterpriseEnrollment() {
322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  delegate_->StartEnterpriseEnrollment();
323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
32572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid UserController::OnLoginAsGuest() {
32672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  user_input_->EnableInputControls(false);
32772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  StartThrobber();
32872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
32972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delegate_->LoginAsGuest();
33072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
33172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
33272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid UserController::ClearErrors() {
33372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delegate_->ClearErrors();
33472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
33572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
33672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid UserController::NavigateAway() {
33772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SelectUserRelative(-1);
33872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
33972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
34072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen////////////////////////////////////////////////////////////////////////////////
34172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// UserController, UserView::Delegate implementation:
34272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
34372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid UserController::OnLocaleChanged() {
34472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Update text tooltips on guest and new user pods.
34572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (is_guest_ || is_new_user_) {
34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (name_tooltip_enabled_)
34772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      EnableNameTooltip(name_tooltip_enabled_);
34872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  label_view_->SetFont(GetLabelFont());
350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  unselected_label_view_->SetFont(GetUnselectedLabelFont());
35172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
35272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
35372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid UserController::OnRemoveUser() {
35472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delegate_->RemoveUser(this);
35572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
35672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
35772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen////////////////////////////////////////////////////////////////////////////////
35872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// UserController, private:
35972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid UserController::ConfigureLoginWindow(WidgetGtk* window,
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          int index,
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          const gfx::Rect& bounds,
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          chromeos::WmIpcWindowType type,
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          views::View* contents_view) {
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  window->MakeTransparent();
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  window->Init(NULL, bounds);
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  window->SetContentsView(contents_view);
368dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  window->set_widget_delegate(this);
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<int> params;
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  params.push_back(index);
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WmIpc::instance()->SetWindowType(
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      window->GetNativeView(),
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      type,
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      &params);
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GdkWindow* gdk_window = window->GetNativeView()->window;
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gdk_window_set_back_pixmap(gdk_window, NULL, false);
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  window->Show();
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3833345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickWidgetGtk* UserController::CreateControlsWindow(
3843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    int index,
385513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    int* width, int* height,
3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool need_browse_without_signin) {
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::View* control_view;
3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (is_new_user_) {
38921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    NewUserView* new_user_view =
390513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        new NewUserView(this, true, need_browse_without_signin);
39121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    new_user_view->Init();
39221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    control_view = new_user_view;
39321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    user_input_ = new_user_view;
39421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    throbber_host_ = new_user_view;
395731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  } else if (is_guest_) {
39621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    GuestUserView* guest_user_view = new GuestUserView(this);
39721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    guest_user_view->RecreateFields();
39821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    control_view = guest_user_view;
39921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    user_input_ = guest_user_view;
40021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    throbber_host_ = guest_user_view;
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
40221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    ExistingUserView* existing_user_view = new ExistingUserView(this);
40321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    existing_user_view->RecreateFields();
40421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    control_view = existing_user_view;
40521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    user_input_ = existing_user_view;
40621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    throbber_host_ = existing_user_view;
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  *height = kControlsHeight;
410513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  *width = kUserImageSize;
411513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (is_new_user_) {
41221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    gfx::Size size = control_view->GetPreferredSize();
413513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    *width = size.width();
414513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    *height = size.height();
415513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  WidgetGtk* window = new ControlsWindow(control_view);
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConfigureLoginWindow(window,
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       index,
420513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                       gfx::Rect(*width, *height),
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       WM_IPC_WINDOW_LOGIN_CONTROLS,
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       control_view);
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return window;
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWidgetGtk* UserController::CreateImageWindow(int index) {
4273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  user_view_ = new UserView(this, true, !is_new_user_);
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
429201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
430731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (is_guest_) {
431201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    SkBitmap* image = rb.GetBitmapNamed(IDR_LOGIN_GUEST);
432201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    user_view_->SetImage(*image, *image);
4333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else if (is_new_user_) {
434201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    SkBitmap* image = rb.GetBitmapNamed(IDR_LOGIN_ADD_USER);
435201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    SkBitmap* image_hover = rb.GetBitmapNamed(IDR_LOGIN_ADD_USER_HOVER);
436201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    user_view_->SetImage(*image, *image_hover);
4373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
438201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    user_view_->SetImage(user_.image(), user_.image());
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WidgetGtk* window = new ClickNotifyingWidget(WidgetGtk::TYPE_WINDOW, this);
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConfigureLoginWindow(window,
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       index,
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       gfx::Rect(user_view_->GetPreferredSize()),
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       WM_IPC_WINDOW_LOGIN_IMAGE,
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       user_view_);
4473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return window;
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid UserController::CreateBorderWindow(int index,
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        int total_user_count,
453513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                        int controls_width,
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        int controls_height) {
4553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // New user login controls window is much higher than existing user's controls
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // window so window manager will place the control instead of image window.
457201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // New user will have 0 size border.
458201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int width = controls_width;
459201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int height = controls_height;
460201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!is_new_user_) {
461201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    width += kBorderSize * 2;
46221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    height += 2 * kBorderSize + kUserImageSize + kVerticalIntervalSize;
463201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
464513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Widget::CreateParams params(Widget::CreateParams::TYPE_WINDOW);
466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  params.transparent = true;
467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  border_window_ = Widget::CreateWidget(params);
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  border_window_->Init(NULL, gfx::Rect(0, 0, width, height));
4693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!is_new_user_) {
470dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    views::View* background_view = new views::View();
4713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    views::Painter* painter = CreateWizardPainter(
4723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        &BorderDefinition::kUserBorder);
473dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    background_view->set_background(
4743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        views::Background::CreateBackgroundPainter(true, painter));
475dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    border_window_->SetContentsView(background_view);
4763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UpdateUserCount(index, total_user_count);
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GdkWindow* gdk_window = border_window_->GetNativeView()->window;
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gdk_window_set_back_pixmap(gdk_window, NULL, false);
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  border_window_->Show();
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWidgetGtk* UserController::CreateLabelWindow(int index,
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                             WmIpcWindowType type) {
4873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::wstring text;
488731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (is_guest_) {
48972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    text = std::wstring();
4903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else if (is_new_user_) {
4913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Add user should have label only in activated state.
4923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // When new user is the only, label is not needed.
4933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (type == WM_IPC_WINDOW_LOGIN_LABEL && index != 0)
4943f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      text = UTF16ToWide(l10n_util::GetStringUTF16(IDS_ADD_USER));
4953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
4963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    text = UTF8ToWide(user_.GetDisplayName());
4973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
49972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  views::Label* label = NULL;
50021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
50121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (is_new_user_) {
50221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    label = new views::Label(text);
50321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else if (type == WM_IPC_WINDOW_LOGIN_LABEL) {
50421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    label = UsernameView::CreateShapedUsernameView(text, false);
50521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else {
50621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    DCHECK(type == WM_IPC_WINDOW_LOGIN_UNSELECTED_LABEL);
50721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // TODO(altimofeev): switch to the rounded username view.
50821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    label = UsernameView::CreateShapedUsernameView(text, true);
50921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
5104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
51172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const gfx::Font& font = (type == WM_IPC_WINDOW_LOGIN_LABEL) ?
512ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      GetLabelFont() : GetUnselectedLabelFont();
5134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  label->SetFont(font);
51472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  label->SetColor(login::kTextColor);
515731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (type == WM_IPC_WINDOW_LOGIN_LABEL)
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    label_view_ = label;
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  else
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    unselected_label_view_ = label;
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int width = (type == WM_IPC_WINDOW_LOGIN_LABEL) ?
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      kUserImageSize : kUnselectedSize;
523513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (is_new_user_) {
524513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Make label as small as possible to don't show tooltip.
525513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    width = 0;
526513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
5274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int height = (type == WM_IPC_WINDOW_LOGIN_LABEL) ?
5284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      login::kSelectedLabelHeight : login::kUnselectedLabelHeight;
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WidgetGtk* window = new ClickNotifyingWidget(WidgetGtk::TYPE_WINDOW, this);
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConfigureLoginWindow(window,
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       index,
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       gfx::Rect(0, 0, width, height),
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       type,
5344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                       label);
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return window;
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
538ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsengfx::Font UserController::GetLabelFont() {
539ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
540ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return rb.GetFont(ResourceBundle::MediumBoldFont).DeriveFont(
541ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      kSelectedUsernameFontDelta);
542ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
543ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
544ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsengfx::Font UserController::GetUnselectedLabelFont() {
545ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
546ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return rb.GetFont(ResourceBundle::BaseFont).DeriveFont(
547ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      kUnselectedUsernameFontDelta, gfx::Font::BOLD);
548ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
549ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
550ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
55172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstd::wstring UserController::GetNameTooltip() const {
55221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (is_new_user_)
55372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return UTF16ToWide(l10n_util::GetStringUTF16(IDS_ADD_USER));
55472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  else if (is_guest_)
55572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return UTF16ToWide(l10n_util::GetStringUTF16(IDS_GO_INCOGNITO_BUTTON));
55672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  else
55772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return UTF8ToWide(user_.GetNameTooltip());
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
561