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 ¶ms); 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 ¶ms); 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