1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/ui/views/login_view.h" 6 7#include "grit/generated_resources.h" 8#include "ui/base/l10n/l10n_util.h" 9#include "ui/views/controls/label.h" 10#include "ui/views/controls/textfield/textfield.h" 11#include "ui/views/layout/grid_layout.h" 12#include "ui/views/layout/layout_constants.h" 13 14static const int kMessageWidth = 320; 15static const int kTextfieldStackHorizontalSpacing = 30; 16 17using password_manager::LoginModel; 18using views::GridLayout; 19 20/////////////////////////////////////////////////////////////////////////////// 21// LoginView, public: 22 23LoginView::LoginView(const base::string16& explanation, 24 LoginModel* model) 25 : username_field_(new views::Textfield()), 26 password_field_(new views::Textfield()), 27 username_label_(new views::Label( 28 l10n_util::GetStringUTF16(IDS_LOGIN_DIALOG_USERNAME_FIELD))), 29 password_label_(new views::Label( 30 l10n_util::GetStringUTF16(IDS_LOGIN_DIALOG_PASSWORD_FIELD))), 31 message_label_(new views::Label(explanation)), 32 login_model_(model) { 33 password_field_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD); 34 message_label_->SetMultiLine(true); 35 message_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 36 message_label_->SetAllowCharacterBreak(true); 37 38 // Initialize the Grid Layout Manager used for this dialog box. 39 GridLayout* layout = GridLayout::CreatePanel(this); 40 SetLayoutManager(layout); 41 42 // Add the column set for the information message at the top of the dialog 43 // box. 44 const int single_column_view_set_id = 0; 45 views::ColumnSet* column_set = 46 layout->AddColumnSet(single_column_view_set_id); 47 column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1, 48 GridLayout::FIXED, kMessageWidth, 0); 49 50 // Add the column set for the user name and password fields and labels. 51 const int labels_column_set_id = 1; 52 column_set = layout->AddColumnSet(labels_column_set_id); 53 column_set->AddPaddingColumn(0, kTextfieldStackHorizontalSpacing); 54 column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0, 55 GridLayout::USE_PREF, 0, 0); 56 column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing); 57 column_set->AddColumn(GridLayout::FILL, GridLayout::CENTER, 1, 58 GridLayout::USE_PREF, 0, 0); 59 column_set->AddPaddingColumn(0, kTextfieldStackHorizontalSpacing); 60 61 layout->StartRow(0, single_column_view_set_id); 62 layout->AddView(message_label_); 63 64 layout->AddPaddingRow(0, views::kUnrelatedControlLargeVerticalSpacing); 65 66 layout->StartRow(0, labels_column_set_id); 67 layout->AddView(username_label_); 68 layout->AddView(username_field_); 69 70 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 71 72 layout->StartRow(0, labels_column_set_id); 73 layout->AddView(password_label_); 74 layout->AddView(password_field_); 75 76 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); 77 78 if (login_model_) 79 login_model_->AddObserver(this); 80} 81 82LoginView::~LoginView() { 83 if (login_model_) 84 login_model_->RemoveObserver(this); 85} 86 87const base::string16& LoginView::GetUsername() const { 88 return username_field_->text(); 89} 90 91const base::string16& LoginView::GetPassword() const { 92 return password_field_->text(); 93} 94 95views::View* LoginView::GetInitiallyFocusedView() { 96 return username_field_; 97} 98 99/////////////////////////////////////////////////////////////////////////////// 100// LoginView, views::View, password_manager::LoginModelObserver overrides: 101 102void LoginView::OnAutofillDataAvailable(const base::string16& username, 103 const base::string16& password) { 104 if (username_field_->text().empty()) { 105 username_field_->SetText(username); 106 password_field_->SetText(password); 107 username_field_->SelectAll(true); 108 } 109} 110 111void LoginView::OnLoginModelDestroying() { 112 login_model_->RemoveObserver(this); 113 login_model_ = NULL; 114} 115