diff options
author | varunjain@chromium.org <varunjain@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-05 03:48:16 +0000 |
---|---|---|
committer | varunjain@chromium.org <varunjain@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-05 03:48:16 +0000 |
commit | 8c61a78225a427e664c90f3bad9f403c906af910 (patch) | |
tree | 07726bf7866b801a1839245c305015a06b83a005 /chrome/browser/ui/touch | |
parent | 83a58a2def8fd827b1385149c58d95d3d1b340ff (diff) | |
download | chromium_src-8c61a78225a427e664c90f3bad9f403c906af910.zip chromium_src-8c61a78225a427e664c90f3bad9f403c906af910.tar.gz chromium_src-8c61a78225a427e664c90f3bad9f403c906af910.tar.bz2 |
Browser should get notified if a views textfield changes focus. In addition,
if the browser frame is touch based, it should update the virtual keyboard.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/6384004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@73908 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/ui/touch')
-rw-r--r-- | chrome/browser/ui/touch/frame/touch_browser_frame_view.cc | 36 | ||||
-rw-r--r-- | chrome/browser/ui/touch/frame/touch_browser_frame_view.h | 14 |
2 files changed, 50 insertions, 0 deletions
diff --git a/chrome/browser/ui/touch/frame/touch_browser_frame_view.cc b/chrome/browser/ui/touch/frame/touch_browser_frame_view.cc index b4edbc6..12fc62c 100644 --- a/chrome/browser/ui/touch/frame/touch_browser_frame_view.cc +++ b/chrome/browser/ui/touch/frame/touch_browser_frame_view.cc @@ -16,11 +16,18 @@ #include "chrome/common/notification_service.h" #include "chrome/common/notification_type.h" #include "ui/gfx/rect.h" +#include "views/controls/textfield/textfield.h" namespace { const int kKeyboardHeight = 300; +TouchBrowserFrameView::VirtualKeyboardType GetKeyboardType(views::View* view) { + if (view->GetClassName().compare(views::Textfield::kViewClassName) == 0) + return TouchBrowserFrameView::GENERIC; + return TouchBrowserFrameView::NONE; +} + PropertyAccessor<bool>* GetFocusedStateAccessor() { static PropertyAccessor<bool> state; return &state; @@ -35,6 +42,7 @@ TouchBrowserFrameView::TouchBrowserFrameView(BrowserFrame* frame, BrowserView* browser_view) : OpaqueBrowserFrameView(frame, browser_view), keyboard_showing_(false), + focus_listener_added_(false), keyboard_(NULL) { registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED, @@ -63,6 +71,16 @@ void TouchBrowserFrameView::Layout() { keyboard_->SetBounds(GetBoundsForReservedArea()); } +void TouchBrowserFrameView::FocusWillChange(views::View* focused_before, + views::View* focused_now) { + if (!focused_before || + (focused_now && GetKeyboardType(focused_now) + != GetKeyboardType(focused_before))) { + // TODO(varunjain): support other types of keyboard. + UpdateKeyboardAndLayout(GetKeyboardType(focused_now) == GENERIC); + } +} + /////////////////////////////////////////////////////////////////////////////// // TouchBrowserFrameView, protected: int TouchBrowserFrameView::GetReservedHeight() const { @@ -72,6 +90,24 @@ int TouchBrowserFrameView::GetReservedHeight() const { return 0; } +void TouchBrowserFrameView::ViewHierarchyChanged(bool is_add, + View* parent, + View* child) { + OpaqueBrowserFrameView::ViewHierarchyChanged(is_add, parent, child); + if (!GetFocusManager()) + return; + + if (is_add && !focus_listener_added_) { + // Add focus listener when this view is added to the hierarchy. + GetFocusManager()->AddFocusChangeListener(this); + focus_listener_added_ = true; + } else if (!is_add && focus_listener_added_) { + // Remove focus listener when this view is removed from the hierarchy. + GetFocusManager()->RemoveFocusChangeListener(this); + focus_listener_added_ = false; + } +} + /////////////////////////////////////////////////////////////////////////////// // TouchBrowserFrameView, private: diff --git a/chrome/browser/ui/touch/frame/touch_browser_frame_view.h b/chrome/browser/ui/touch/frame/touch_browser_frame_view.h index c06600f..fd443db 100644 --- a/chrome/browser/ui/touch/frame/touch_browser_frame_view.h +++ b/chrome/browser/ui/touch/frame/touch_browser_frame_view.h @@ -10,6 +10,7 @@ #include "chrome/browser/tabs/tab_strip_model_observer.h" #include "chrome/common/notification_observer.h" #include "chrome/common/notification_registrar.h" +#include "views/focus/focus_manager.h" class BrowserFrame; class BrowserView; @@ -18,9 +19,16 @@ class NotificationDetails; class NotificationSource; class TouchBrowserFrameView : public OpaqueBrowserFrameView, + public views::FocusChangeListener, public TabStripModelObserver, public NotificationObserver { public: + enum VirtualKeyboardType { + NONE, + GENERIC, + URL, + }; + // Constructs a non-client view for an BrowserFrame. TouchBrowserFrameView(BrowserFrame* frame, BrowserView* browser_view); virtual ~TouchBrowserFrameView(); @@ -28,9 +36,14 @@ class TouchBrowserFrameView : public OpaqueBrowserFrameView, // Overridden from OpaqueBrowserFrameView virtual void Layout(); + // views::FocusChangeListener implementation + virtual void FocusWillChange(views::View* focused_before, + views::View* focused_now); + protected: // Overridden from OpaqueBrowserFrameView virtual int GetReservedHeight() const; + virtual void ViewHierarchyChanged(bool is_add, View* parent, View* child); private: virtual void InitVirtualKeyboard(); @@ -48,6 +61,7 @@ class TouchBrowserFrameView : public OpaqueBrowserFrameView, const NotificationDetails& details); bool keyboard_showing_; + bool focus_listener_added_; KeyboardContainerView* keyboard_; NotificationRegistrar registrar_; |