diff options
-rw-r--r-- | chrome/app/generated_resources.grd | 22 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/account_creation_view.cc | 231 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/account_creation_view.h | 94 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/login_manager_view.h | 9 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/login_wizard_view.cc | 35 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/login_wizard_view.h | 11 | ||||
-rwxr-xr-x | chrome/chrome_browser.gypi | 2 |
7 files changed, 381 insertions, 23 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 89265b4..47c3bee 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -2741,6 +2741,28 @@ each locale. --> <message name="IDS_LOGIN_DIALOG_OK_BUTTON_LABEL" desc="The label of the 'Log In' button on the login prompt dialog"> Log In </message> + <!-- Account Creation Dialog --> + <message name="IDS_ACCOUNT_CREATION_TITLE" desc="String to be displayed in the title bar of the account creation dialog"> + Create a Google Account + </message> + <message name="IDS_ACCOUNT_CREATION_FIRSTNAME" desc="The label of the firstname field in the account creation dialog"> + First name: + </message> + <message name="IDS_ACCOUNT_CREATION_LASTNAME" desc="The label of the lastname field in the account creation dialog"> + Last name: + </message> + <message name="IDS_ACCOUNT_CREATION_EMAIL" desc="The label of the email address field in the account creation dialog"> + Choose a username: + </message> + <message name="IDS_ACCOUNT_CREATION_PASSWORD" desc="The label of the password field in the account creation dialog"> + Choose a password: + </message> + <message name="IDS_ACCOUNT_CREATION_REENTER_PASSWORD" desc="The label of the second password field in the account creation dialog"> + Re-enter password: + </message> + <message name="IDS_ACCOUNT_CREATION_BUTTON" desc="The label of the 'Create Account' button on the account creation dialog"> + Create Account + </message> <!-- FindInPage strings --> diff --git a/chrome/browser/chromeos/login/account_creation_view.cc b/chrome/browser/chromeos/login/account_creation_view.cc new file mode 100644 index 0000000..1d9665b --- /dev/null +++ b/chrome/browser/chromeos/login/account_creation_view.cc @@ -0,0 +1,231 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/login/account_creation_view.h" + +#include <algorithm> + +#include "app/gfx/canvas.h" +#include "app/l10n_util.h" +#include "app/resource_bundle.h" +#include "base/keyboard_codes.h" +#include "chrome/browser/chromeos/login/rounded_rect_painter.h" +#include "chrome/browser/chromeos/login/screen_observer.h" +#include "grit/generated_resources.h" +#include "grit/theme_resources.h" +#include "views/controls/button/native_button.h" +#include "views/controls/label.h" +#include "views/grid_layout.h" +#include "views/widget/widget.h" +#include "views/window/non_client_view.h" +#include "views/window/window.h" +#include "views/window/window_gtk.h" + +using views::Background; +using views::Label; +using views::Textfield; +using views::View; +using views::Widget; + +namespace { + +const int kCornerRadius = 12; +const int kHorizontalPad = 10; +const int kVerticalInset = 50; +const int kHorizontalInset = 40; +const int kTextfieldWidthInChars = 20; +const SkColor kErrorColor = 0xFF8F384F; +const SkColor kBackground = SK_ColorWHITE; +const SkColor kLabelColor = 0xFF808080; + +} // namespace + +/////////////////////////////////////////////////////////////////////////////// +// AccountCreationView, public: +AccountCreationView::AccountCreationView(chromeos::ScreenObserver* observer) + : observer_(observer) { +} + +AccountCreationView::~AccountCreationView() { +} + +void AccountCreationView::Init() { + // Use rounded rect background. + views::Painter* painter = new chromeos::RoundedRectPainter( + 0, kBackground, // no padding + true, SK_ColorBLACK, // black shadow + kCornerRadius, // corner radius + kBackground, kBackground); // backgound without gradient + set_background( + views::Background::CreateBackgroundPainter(true, painter)); + + InitControls(); + InitLayout(); +} + +/////////////////////////////////////////////////////////////////////////////// +// AccountCreationView, views::View overrides: +gfx::Size AccountCreationView::GetPreferredSize() { + return gfx::Size(width(), height()); +} + +/////////////////////////////////////////////////////////////////////////////// +// AccountCreationView, views::WindowDelegate overrides: +views::View* AccountCreationView::GetContentsView() { + return this; +} + +/////////////////////////////////////////////////////////////////////////////// +// AccountCreationView, views::ButtonListener overrides: +void AccountCreationView::ButtonPressed( + views::Button* sender, const views::Event& event) { + // TODO(avayvod): Back button. + CreateAccount(); +} + +/////////////////////////////////////////////////////////////////////////////// +// AccountCreationView, views::Textfield::Controller overrides: +bool AccountCreationView::HandleKeystroke(views::Textfield* s, + const views::Textfield::Keystroke& keystroke) { + if (keystroke.GetKeyboardCode() == base::VKEY_RETURN) { + CreateAccount(); + // Return true so that processing ends + return true; + } + // Return false so that processing does not end + return false; +} + +/////////////////////////////////////////////////////////////////////////////// +// AccountCreationView, private: +void AccountCreationView::CreateAccount() { + // TODO(avayvod): Implement account creation. +} + +void AccountCreationView::InitLabel(const gfx::Font& label_font, + const std::wstring& label_text, + views::Label** label) { + scoped_ptr<views::Label> new_label(new views::Label()); + new_label->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + new_label->SetFont(label_font); + new_label->SetText(label_text); + new_label->SetColor(kLabelColor); + AddChildView(new_label.get()); + *label = new_label.release(); +} + +void AccountCreationView::InitTextfield(const gfx::Font& field_font, + views::Textfield::StyleFlags style, + views::Textfield** field) { + scoped_ptr<views::Textfield> new_field(new views::Textfield(style)); + new_field->SetFont(field_font); + new_field->set_default_width_in_chars(kTextfieldWidthInChars); + AddChildView(new_field.get()); + new_field->SetController(this); + *field = new_field.release(); +} + +void AccountCreationView::InitControls() { + // Set up fonts. + gfx::Font title_font = + gfx::Font::CreateFont(L"Droid Sans", 10).DeriveFont(0, gfx::Font::BOLD); + gfx::Font label_font = gfx::Font::CreateFont(L"Droid Sans", 8); + gfx::Font button_font = label_font; + gfx::Font field_font = label_font; + + InitLabel(title_font, + l10n_util::GetString(IDS_ACCOUNT_CREATION_TITLE), + &title_label_); + + InitLabel(label_font, + l10n_util::GetString(IDS_ACCOUNT_CREATION_FIRSTNAME), + &firstname_label_); + InitTextfield(field_font, views::Textfield::STYLE_DEFAULT, + &firstname_field_); + InitLabel(label_font, + l10n_util::GetString(IDS_ACCOUNT_CREATION_LASTNAME), + &lastname_label_); + InitTextfield(field_font, views::Textfield::STYLE_DEFAULT, &lastname_field_); + InitLabel(label_font, + l10n_util::GetString(IDS_ACCOUNT_CREATION_EMAIL), + &username_label_); + InitTextfield(field_font, views::Textfield::STYLE_DEFAULT, &username_field_); + InitLabel(label_font, + l10n_util::GetString(IDS_ACCOUNT_CREATION_PASSWORD), + &password_label_); + InitTextfield(field_font, views::Textfield::STYLE_PASSWORD, + &password_field_); + InitLabel(label_font, + l10n_util::GetString(IDS_ACCOUNT_CREATION_REENTER_PASSWORD), + &reenter_password_label_); + InitTextfield(field_font, views::Textfield::STYLE_PASSWORD, + &reenter_password_field_); + + create_account_button_ = new views::NativeButton(this, std::wstring()); + create_account_button_->set_font(button_font); + create_account_button_->SetLabel( + l10n_util::GetString(IDS_ACCOUNT_CREATION_BUTTON)); + AddChildView(create_account_button_); +} + +void AccountCreationView::InitLayout() { + // Create layout for all the views. + views::GridLayout* layout = new views::GridLayout(this); + SetLayoutManager(layout); + + views::ColumnSet* columns = layout->AddColumnSet(0); + // Column for labels. + columns->AddColumn(views::GridLayout::LEADING, + views::GridLayout::CENTER, + 0, + views::GridLayout::USE_PREF, 0, 0); + columns->AddPaddingColumn(0, kHorizontalPad); + // Column for text fields. + columns->AddColumn(views::GridLayout::LEADING, + views::GridLayout::CENTER, + 0, + views::GridLayout::USE_PREF, 0, 0); + columns->AddPaddingColumn(0, kHorizontalPad); + // Column for field status. + columns->AddColumn(views::GridLayout::LEADING, + views::GridLayout::CENTER, + 1, + views::GridLayout::USE_PREF, 0, 0); + layout->SetInsets(kHorizontalInset, + kVerticalInset, + kHorizontalInset, + kVerticalInset); + + BuildLayout(layout); +} + +void AccountCreationView::BuildLayout(views::GridLayout* layout) { + layout->StartRow(1, 0); + layout->AddView(firstname_label_); + layout->AddView(firstname_field_); + + layout->StartRow(1, 0); + layout->AddView(lastname_label_); + layout->AddView(lastname_field_); + + layout->StartRow(1, 0); + layout->AddView(username_label_); + layout->AddView(username_field_); + + layout->StartRow(1, 0); + layout->AddView(password_label_); + layout->AddView(password_field_); + + layout->StartRow(1, 0); + layout->AddView(reenter_password_label_); + layout->AddView(reenter_password_field_); + + layout->StartRow(10, 0); + // Skip columns for label, field and two padding columns in between. + layout->SkipColumns(4); + layout->AddView(create_account_button_, 1, 1, + views::GridLayout::TRAILING, + views::GridLayout::TRAILING); +} + diff --git a/chrome/browser/chromeos/login/account_creation_view.h b/chrome/browser/chromeos/login/account_creation_view.h new file mode 100644 index 0000000..a7378bc --- /dev/null +++ b/chrome/browser/chromeos/login/account_creation_view.h @@ -0,0 +1,94 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_ACCOUNT_CREATION_VIEW_H_ +#define CHROME_BROWSER_CHROMEOS_LOGIN_ACCOUNT_CREATION_VIEW_H_ + +#include <string> +#include "views/accelerator.h" +#include "views/controls/button/button.h" +#include "views/controls/textfield/textfield.h" +#include "views/view.h" +#include "views/widget/widget_gtk.h" +#include "views/window/window_delegate.h" + +namespace views { +class GridLayout; +class Label; +class NativeButton; +} // namespace views + +namespace chromeos { +class ScreenObserver; +} // namespace chromeos + +class AccountCreationView : public views::View, + public views::WindowDelegate, + public views::Textfield::Controller, + public views::ButtonListener { + public: + explicit AccountCreationView(chromeos::ScreenObserver* observer); + virtual ~AccountCreationView(); + + // Initialize the controls on the dialog. + void Init(); + + // Overridden from views::View: + virtual gfx::Size GetPreferredSize(); + + // Overridden from views::WindowDelegate: + virtual views::View* GetContentsView(); + + // Overridden from views::Textfield::Controller: + virtual bool HandleKeystroke(views::Textfield* sender, + const views::Textfield::Keystroke& keystroke); + virtual void ContentsChanged(views::Textfield* sender, + const string16& new_contents) {} + + // Overriden from views::ButtonListener. + virtual void ButtonPressed(views::Button* sender, const views::Event& event); + + private: + // Tries to create an account with user input. + void CreateAccount(); + + // Initializers for labels and textfields. + void InitLabel(const gfx::Font& label_font, + const std::wstring& label_text, + views::Label** label); + void InitTextfield(const gfx::Font& field_font, + views::Textfield::StyleFlags style, + views::Textfield** field); + + // Initializes all controls on the screen. + void InitControls(); + + // Initializes the layout manager. + void InitLayout(); + + // Adds controls to layout manager. + void BuildLayout(views::GridLayout* layout); + + // Controls on the view. + views::Textfield* firstname_field_; + views::Textfield* lastname_field_; + views::Textfield* username_field_; + views::Textfield* password_field_; + views::Textfield* reenter_password_field_; + views::Label* title_label_; + views::Label* firstname_label_; + views::Label* lastname_label_; + views::Label* username_label_; + views::Label* password_label_; + views::Label* reenter_password_label_; + views::NativeButton* create_account_button_; + + // Notifications receiver. + chromeos::ScreenObserver* observer_; + + DISALLOW_COPY_AND_ASSIGN(AccountCreationView); +}; + +#endif // CHROME_BROWSER_CHROMEOS_LOGIN_ACCOUNT_CREATION_VIEW_H_ + diff --git a/chrome/browser/chromeos/login/login_manager_view.h b/chrome/browser/chromeos/login/login_manager_view.h index 7d02ed7..55b9f1f 100644 --- a/chrome/browser/chromeos/login/login_manager_view.h +++ b/chrome/browser/chromeos/login/login_manager_view.h @@ -45,14 +45,12 @@ class LoginManagerView : public views::View, // Not thread-safe, by virtue of using SetupSession(). virtual bool HandleKeystroke(views::Textfield* sender, const views::Textfield::Keystroke& keystroke); + virtual void ContentsChanged(views::Textfield* sender, + const string16& new_contents) {} // Overriden from views::ButtonListener. virtual void ButtonPressed(views::Button* sender, const views::Event& event); - // This method is called whenever the text in the field changes. - virtual void ContentsChanged(views::Textfield* sender, - const string16& new_contents) {} - private: // Given a |username| and |password|, this method attempts to authenticate to // the Google accounts servers. @@ -60,9 +58,6 @@ class LoginManagerView : public views::View, bool Authenticate(const std::string& username, const std::string& password); - // Asynchronously launches the Chrome OS window manager. - bool RunWindowManager(const std::string& username); - // This is not threadsafe; as authentication is supposed to happen on the main // thread before any other threads are started, so this should be ok. // That said, the only reason we're not threadsafe right now is that we're diff --git a/chrome/browser/chromeos/login/login_wizard_view.cc b/chrome/browser/chromeos/login/login_wizard_view.cc index f2f44f5..de9a57e 100644 --- a/chrome/browser/chromeos/login/login_wizard_view.cc +++ b/chrome/browser/chromeos/login/login_wizard_view.cc @@ -18,6 +18,7 @@ #include "base/logging.h" #include "base/process_util.h" #include "chrome/browser/chromeos/cros/login_library.h" +#include "chrome/browser/chromeos/login/account_creation_view.h" #include "chrome/browser/chromeos/login/login_manager_view.h" #include "chrome/browser/chromeos/login/rounded_rect_painter.h" #include "chrome/browser/chromeos/status/clock_menu_button.h" @@ -38,8 +39,8 @@ using views::Widget; namespace { -const int kLoginWidth = 700; -const int kLoginHeight = 350; +const int kScreenWidth = 700; +const int kScreenHeight = 350; const SkColor kBackgroundTopColor = SkColorSetRGB(82, 139, 224); const SkColor kBackgroundBottomColor = SkColorSetRGB(50, 102, 204); const int kCornerRadius = 12; @@ -48,6 +49,7 @@ const SkColor kBackgroundPaddingColor = SK_ColorBLACK; // Names of screens to start login wizard with. const char kLoginManager[] = "login"; +const char kAccountCreation[] = "create_account"; } // namespace @@ -138,7 +140,8 @@ void ShowLoginWizard(const std::string& start_screen_name) { LoginWizardView::LoginWizardView() : status_area_(NULL), current_(NULL), - login_manager_(NULL) { + login_manager_(NULL), + account_creation_(NULL) { } LoginWizardView::~LoginWizardView() { @@ -162,11 +165,14 @@ void LoginWizardView::Init(const std::string& start_view_name) { InitStatusArea(); // Create and initialize all views, hidden. - InitLoginManager(); + CreateAndInitScreen(&login_manager_); + CreateAndInitScreen(&account_creation_); // Select the view to start with and show it. if (start_view_name == kLoginManager) { current_ = login_manager_; + } else if (start_view_name == kAccountCreation) { + current_ = account_creation_; } else { // Default to login manager. current_ = login_manager_; @@ -188,7 +194,6 @@ void LoginWizardView::InitStatusArea() { status_area_ = new chromeos::StatusAreaView(this); status_area_->Init(); gfx::Size status_area_size = status_area_->GetPreferredSize(); - // TODO(avayvod): Check this on RTL interface. status_area_->SetBounds( dimensions_.width() - status_area_size.width() - kCornerRadius - kBackgroundPadding, @@ -198,15 +203,17 @@ void LoginWizardView::InitStatusArea() { AddChildView(status_area_); } -void LoginWizardView::InitLoginManager() { - login_manager_ = new LoginManagerView(this); - login_manager_->Init(); - login_manager_->SetBounds((dimensions_.width() - kLoginWidth) / 2, - (dimensions_.height() - kLoginHeight) / 2, - kLoginWidth, - kLoginHeight); - login_manager_->SetVisible(false); - AddChildView(login_manager_); +template <class T> +void LoginWizardView::CreateAndInitScreen(T** screen) { + T* new_screen = new T(this); + new_screen->Init(); + new_screen->SetBounds((dimensions_.width() - kScreenWidth) / 2, + (dimensions_.height() - kScreenHeight) / 2, + kScreenWidth, + kScreenHeight); + new_screen->SetVisible(false); + AddChildView(new_screen); + *screen = new_screen; } /////////////////////////////////////////////////////////////////////////////// diff --git a/chrome/browser/chromeos/login/login_wizard_view.h b/chrome/browser/chromeos/login/login_wizard_view.h index 13974a13..1b0655a 100644 --- a/chrome/browser/chromeos/login/login_wizard_view.h +++ b/chrome/browser/chromeos/login/login_wizard_view.h @@ -14,6 +14,7 @@ #include "views/window/window_delegate.h" class LoginManagerView; +class AccountCreationView; namespace chromeos { class StatusAreaView; @@ -50,9 +51,12 @@ class LoginWizardView : public views::View, virtual void OpenButtonOptions(const views::View* button_view) const; virtual bool IsButtonVisible(const views::View* button_view) const; - // Initializers for all child views. + // Initializer for status area. void InitStatusArea(); - void InitLoginManager(); + + // Initializer for all login screens. + template <class T> + void CreateAndInitScreen(T** screen); // Wizard view dimensions. gfx::Size dimensions_; @@ -66,6 +70,9 @@ class LoginWizardView : public views::View, // Login manager view. LoginManagerView* login_manager_; + // Account creation view. + AccountCreationView* account_creation_; + DISALLOW_COPY_AND_ASSIGN(LoginWizardView); }; diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index f149430..4ae9277 100755 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -293,6 +293,8 @@ 'browser/chromeos/external_protocol_dialog.h', 'browser/chromeos/gview_request_interceptor.cc', 'browser/chromeos/gview_request_interceptor.h', + 'browser/chromeos/login/account_creation_view.cc', + 'browser/chromeos/login/account_creation_view.h', 'browser/chromeos/login/image_background.h', 'browser/chromeos/login/ipc_message.h', 'browser/chromeos/login/login_manager_view.cc', |