Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7448)

Unified Diff: chrome/browser/chromeos/login/touch_login_view.cc

Issue 7302015: A keyboard widget that manages itself (the animation and all that). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merge with trunk Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/login/touch_login_view.cc
diff --git a/chrome/browser/chromeos/login/touch_login_view.cc b/chrome/browser/chromeos/login/touch_login_view.cc
deleted file mode 100644
index e8572de84815b88cf4fe41620735b8bb1e8dfcf1..0000000000000000000000000000000000000000
--- a/chrome/browser/chromeos/login/touch_login_view.cc
+++ /dev/null
@@ -1,238 +0,0 @@
-// Copyright (c) 2011 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/touch_login_view.h"
-
-#include "chrome/browser/chromeos/status/status_area_view.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/renderer_host/render_widget_host_view_views.h"
-#include "chrome/browser/ui/touch/frame/keyboard_container_view.h"
-#include "chrome/browser/ui/views/tab_contents/tab_contents_view_touch.h"
-#include "chrome/browser/ui/views/dom_view.h"
-#include "chrome/common/chrome_notification_types.h"
-#include "content/browser/tab_contents/tab_contents.h"
-#include "content/common/notification_service.h"
-#include "googleurl/src/gurl.h"
-#include "ui/base/animation/slide_animation.h"
-#include "ui/gfx/transform.h"
-#include "views/controls/textfield/textfield.h"
-#include "views/widget/widget.h"
-
-namespace {
-
-const char kViewClassName[] = "browser/chromeos/login/TouchLoginView";
-const int kDefaultKeyboardHeight = 300;
-const int kKeyboardSlideDuration = 300; // In milliseconds
-
-PropertyAccessor<bool>* GetFocusedStateAccessor() {
- static PropertyAccessor<bool> state;
- return &state;
-}
-
-bool TabContentsHasFocus(const TabContents* contents) {
- views::View* view = static_cast<TabContentsViewTouch*>(contents->view());
- return view->Contains(view->GetFocusManager()->GetFocusedView());
-}
-
-} // namespace
-
-namespace chromeos {
-
-// TouchLoginView public: ------------------------------------------------------
-
-TouchLoginView::TouchLoginView()
- : WebUILoginView(),
- keyboard_showing_(false),
- keyboard_height_(kDefaultKeyboardHeight),
- focus_listener_added_(false),
- keyboard_(NULL) {
-}
-
-TouchLoginView::~TouchLoginView() {
-}
-
-void TouchLoginView::Init() {
- WebUILoginView::Init();
- InitStatusArea();
- InitVirtualKeyboard();
-
-
- Source<TabContents> tab_contents(webui_login_->tab_contents());
- registrar_.Add(this,
- content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE,
- tab_contents);
- registrar_.Add(this,
- content::NOTIFICATION_TAB_CONTENTS_DESTROYED,
- tab_contents);
- registrar_.Add(this,
- chrome::NOTIFICATION_HIDE_KEYBOARD_INVOKED,
- NotificationService::AllSources());
- registrar_.Add(this,
- chrome::NOTIFICATION_SET_KEYBOARD_HEIGHT_INVOKED,
- NotificationService::AllSources());
-}
-
-std::string TouchLoginView::GetClassName() const {
- return kViewClassName;
-}
-
-void TouchLoginView::FocusWillChange(views::View* focused_before,
- views::View* focused_now) {
- VirtualKeyboardType before = DecideKeyboardStateForView(focused_before);
- VirtualKeyboardType now = DecideKeyboardStateForView(focused_now);
- if (before != now) {
- // TODO(varunjain): support other types of keyboard.
- UpdateKeyboardAndLayout(now == GENERIC);
- }
-}
-
-void TouchLoginView::OnWindowCreated() {
-}
-
-// TouchLoginView protected: ---------------------------------------------------
-
-void TouchLoginView::Layout() {
- WebUILoginView::Layout();
- DCHECK(status_area_);
-
- // Layout the Status Area up in the right corner. This should always be done.
- gfx::Size status_area_size = status_area_->GetPreferredSize();
- status_area_->SetBounds(
- width() - status_area_size.width() -
- WebUILoginView::kStatusAreaCornerPadding,
- WebUILoginView::kStatusAreaCornerPadding,
- status_area_size.width(),
- status_area_size.height());
-
- if (!keyboard_)
- return;
-
- // We are not resizing the DOMView here, so the keyboard is going to occlude
- // the login screen partially. It is the responsibility of the UX layer to
- // handle this.
-
- // Lastly layout the keyboard
- bool display_keyboard = (keyboard_showing_ || animation_->is_animating());
- keyboard_->SetVisible(display_keyboard);
- gfx::Rect keyboard_bounds = bounds();
- int keyboard_height = display_keyboard ? keyboard_height_ : 0;
- keyboard_bounds.set_y(keyboard_bounds.height() - keyboard_height);
- keyboard_bounds.set_height(keyboard_height);
- keyboard_->SetBoundsRect(keyboard_bounds);
-}
-
-void TouchLoginView::InitStatusArea() {
- if (status_area_)
- return;
- status_area_ = new StatusAreaView(this);
- status_area_->Init();
- AddChildView(status_area_);
-}
-
-// TouchLoginView private: -----------------------------------------------------
-
-void TouchLoginView::InitVirtualKeyboard() {
- // TODO(yusukes): Support non-US virtual keyboard on the login screen.
- keyboard_ = new KeyboardContainerView(profile_, NULL, GURL());
-
- keyboard_->SetVisible(false);
- AddChildView(keyboard_);
-
- animation_.reset(new ui::SlideAnimation(this));
- animation_->SetTweenType(ui::Tween::LINEAR);
- animation_->SetSlideDuration(kKeyboardSlideDuration);
-}
-
-void TouchLoginView::UpdateKeyboardAndLayout(bool should_show_keyboard) {
- DCHECK(keyboard_);
- if (should_show_keyboard == keyboard_showing_)
- return;
- keyboard_showing_ = should_show_keyboard;
- if (keyboard_showing_) {
- ui::Transform transform;
- transform.SetTranslateY(-keyboard_height_);
- keyboard_->SetTransform(transform);
- Layout();
- animation_->Show();
- } else {
- ui::Transform transform;
- keyboard_->SetTransform(transform);
- animation_->Hide();
- Layout();
- }
-}
-
-TouchLoginView::VirtualKeyboardType
- TouchLoginView::DecideKeyboardStateForView(views::View* view) {
- if (!view)
- return NONE;
-
- std::string cname = view->GetClassName();
- if (cname == views::Textfield::kViewClassName) {
- return GENERIC;
- } else if (cname == RenderWidgetHostViewViews::kViewClassName) {
- TabContents* contents = webui_login_->tab_contents();
- bool* editable = contents ? GetFocusedStateAccessor()->GetProperty(
- contents->property_bag()) : NULL;
- if (editable && *editable)
- return GENERIC;
- }
- return NONE;
-}
-
-void TouchLoginView::Observe(int type,
- const NotificationSource& source,
- const NotificationDetails& details) {
- if (type == content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE) {
- // Only modify the keyboard state if the currently active tab sent the
- // notification.
- const TabContents* current_tab = webui_login_->tab_contents();
- TabContents* source_tab = Source<TabContents>(source).ptr();
- const bool editable = *Details<const bool>(details).ptr();
-
- if (current_tab == source_tab && TabContentsHasFocus(source_tab))
- UpdateKeyboardAndLayout(editable);
-
- // Save the state of the focused field so that the keyboard visibility
- // can be determined after tab switching.
- GetFocusedStateAccessor()->SetProperty(
- source_tab->property_bag(), editable);
- } else if (type == content::NOTIFICATION_TAB_CONTENTS_DESTROYED) {
- GetFocusedStateAccessor()->DeleteProperty(
- Source<TabContents>(source).ptr()->property_bag());
- } else if (type == chrome::NOTIFICATION_HIDE_KEYBOARD_INVOKED) {
- UpdateKeyboardAndLayout(false);
- } else if (type == chrome::NOTIFICATION_SET_KEYBOARD_HEIGHT_INVOKED) {
- // TODO(penghuang) Allow extension conrtol the virtual keyboard directly
- // instead of using Notification.
- int height = *(Details<int>(details).ptr());
- if (height != keyboard_height_) {
- DCHECK_GE(height, 0) << "Height of the keyboard is less than 0.";
- DCHECK_LE(height, View::height()) << "Height of the keyboard is greater "
- "than the height of containing view.";
- keyboard_height_ = height;
- Layout();
- }
- }
-}
-
-// ui::AnimationDelegate implementation ----------------------------------------
-
-void TouchLoginView::AnimationProgressed(const ui::Animation* anim) {
- ui::Transform transform;
- transform.SetTranslateY(
- ui::Tween::ValueBetween(anim->GetCurrentValue(), keyboard_height_, 0));
- keyboard_->SetTransform(transform);
-}
-
-void TouchLoginView::AnimationEnded(const ui::Animation* animation) {
- if (keyboard_showing_) {
- Layout();
- } else {
- // Notify the keyboard that it is hidden now.
- keyboard_->SetVisible(false);
- }
-}
-
-} // namespace chromeos
« no previous file with comments | « chrome/browser/chromeos/login/touch_login_view.h ('k') | chrome/browser/chromeos/login/webui_login_display_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698