Chromium Code Reviews| Index: chrome/browser/ui/views/frame/touch_browser_frame_view.cc | 
| diff --git a/chrome/browser/ui/views/frame/touch_browser_frame_view.cc b/chrome/browser/ui/views/frame/touch_browser_frame_view.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..2706173137d5b37287c1405798626f0b7f23bfc6 | 
| --- /dev/null | 
| +++ b/chrome/browser/ui/views/frame/touch_browser_frame_view.cc | 
| @@ -0,0 +1,106 @@ | 
| +// 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. | 
| + | 
| +#include "chrome/browser/ui/views/frame/touch_browser_frame_view.h" | 
| + | 
| +#include <algorithm> | 
| + | 
| +#include "chrome/browser/profiles/profile.h" | 
| +#include "chrome/browser/renderer_host/site_instance.h" | 
| +#include "chrome/browser/ui/browser.h" | 
| +#include "chrome/browser/ui/views/dom_view.h" | 
| +#include "chrome/browser/ui/views/frame/browser_view.h" | 
| +#include "chrome/common/notification_service.h" | 
| +#include "chrome/common/notification_type.h" | 
| +#include "chrome/common/url_constants.h" | 
| +#include "gfx/rect.h" | 
| + | 
| +/////////////////////////////////////////////////////////////////////////////// | 
| +// TouchBrowserFrameView, public: | 
| + | 
| +TouchBrowserFrameView::TouchBrowserFrameView(BrowserFrame* frame, | 
| + BrowserView* browser_view) | 
| + : OpaqueBrowserFrameView(frame, browser_view) { | 
| + registrar_.Add(this, | 
| 
 
sky
2010/12/09 22:19:03
initialize keyboard_ to NULL here.
 
bryeung
2010/12/10 17:23:19
Done.
 
 | 
| + NotificationType::NAV_ENTRY_COMMITTED, | 
| + NotificationService::AllSources()); | 
| + registrar_.Add(this, | 
| + NotificationType::FOCUS_CHANGED_IN_PAGE, | 
| + NotificationService::AllSources()); | 
| +} | 
| + | 
| +TouchBrowserFrameView::~TouchBrowserFrameView() { | 
| +} | 
| + | 
| +void TouchBrowserFrameView::Layout() { | 
| + OpaqueBrowserFrameView::Layout(); | 
| + | 
| + if (keyboard_ && keyboard_->IsVisible()) { | 
| + gfx::Rect* client_view_bounds = this->client_view_bounds(); | 
| 
 
sky
2010/12/09 22:19:03
Adjusting the height in this manner is subtle and
 
bryeung
2010/12/10 17:23:19
Done.
 
 | 
| + int keyboard_height = 200; | 
| + client_view_bounds->set_height( | 
| + std::max(0, client_view_bounds->height() - keyboard_height)); | 
| + | 
| + keyboard_->SetBounds(client_view_bounds->x(), | 
| + client_view_bounds->y() + client_view_bounds->height(), | 
| + client_view_bounds->width(), keyboard_height); | 
| + keyboard_->Layout(); | 
| + } | 
| +} | 
| + | 
| +/////////////////////////////////////////////////////////////////////////////// | 
| +// TouchBrowserFrameView, private: | 
| + | 
| +void TouchBrowserFrameView::InitVirtualKeyboard() { | 
| + if (keyboard_) | 
| + return; | 
| + | 
| + keyboard_ = new DOMView; | 
| + | 
| + Profile* keyboard_profile = GetBrowserView()->browser()->profile(); | 
| + DCHECK(keyboard_profile) << "Profile required for virtual keyboard."; | 
| + | 
| + GURL keyboard_url(chrome::kChromeUIKeyboardURL); | 
| + keyboard_->Init(keyboard_profile, | 
| + SiteInstance::CreateSiteInstanceForURL(keyboard_profile, keyboard_url)); | 
| + keyboard_->LoadURL(keyboard_url); | 
| + | 
| + keyboard_->SetVisible(false); | 
| + AddChildView(keyboard_); | 
| +} | 
| + | 
| +void TouchBrowserFrameView::UpdateKeyboardAndLayout(bool should_show_keyboard) { | 
| + // If we have not created the keyboard yet, then we can safely skip | 
| + // this method as must be trying to hide it. | 
| + if (!keyboard_) { | 
| + DCHECK(!should_show_keyboard); | 
| + return; | 
| + } | 
| + | 
| + keyboard_->SetVisible(should_show_keyboard); | 
| + Layout(); | 
| + | 
| + // Because the NonClientFrameView is a sibling of the ClientView, | 
| + // we rely on the parent to properly resize the ClientView. | 
| + GetParent()->Layout(); | 
| 
 
sky
2010/12/09 22:19:03
Shouldn't this result in a Layout on this class to
 
bryeung
2010/12/10 17:23:19
Yep, you're right.  I'll use a smaller hammer :-)
 
 | 
| +} | 
| + | 
| +void TouchBrowserFrameView::Observe(NotificationType type, | 
| + const NotificationSource& source, | 
| + const NotificationDetails& details) { | 
| + if (type == NotificationType::FOCUS_CHANGED_IN_PAGE) { | 
| + InitVirtualKeyboard(); | 
| + const bool is_editable_node = *Details<const bool>(details).ptr(); | 
| + if (is_editable_node != keyboard_->IsVisible()) { | 
| 
 
sky
2010/12/09 22:19:03
Rather than having the check here, wouldn't it be
 
bryeung
2010/12/10 17:23:19
Yes: good idea.  Done.
 
 | 
| + UpdateKeyboardAndLayout(is_editable_node); | 
| + } | 
| + } else { | 
| 
 
sky
2010/12/09 22:19:03
You should at least have a DCHECK here on the type
 
bryeung
2010/12/10 17:23:19
Done.
 
 | 
| + // TODO(bryeung): this is hiding the keyboard for the very first page | 
| + // load after browser startup when the page has an input element focused | 
| + // to start with. It would be nice to fix, but not critical. | 
| + | 
| + // Everything else we have registered for should hide the keyboard. | 
| + UpdateKeyboardAndLayout(false); | 
| + } | 
| +} |