diff options
Diffstat (limited to 'chrome/browser/views/find_bar_host.cc')
-rw-r--r-- | chrome/browser/views/find_bar_host.cc | 297 |
1 files changed, 0 insertions, 297 deletions
diff --git a/chrome/browser/views/find_bar_host.cc b/chrome/browser/views/find_bar_host.cc deleted file mode 100644 index 3926e70..0000000 --- a/chrome/browser/views/find_bar_host.cc +++ /dev/null @@ -1,297 +0,0 @@ -// 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/views/find_bar_host.h" - -#include "app/keyboard_codes.h" -#include "chrome/browser/browser.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/find_bar_controller.h" -#include "chrome/browser/renderer_host/render_view_host.h" -#include "chrome/browser/view_ids.h" -#include "chrome/browser/views/find_bar_view.h" -#include "chrome/browser/views/frame/browser_view.h" -#include "chrome/browser/tab_contents/tab_contents.h" -#include "chrome/browser/tab_contents/tab_contents_view.h" -#include "views/focus/external_focus_tracker.h" -#include "views/focus/view_storage.h" -#include "views/widget/root_view.h" -#include "views/widget/widget.h" - -namespace browser { - -// Declared in browser_dialogs.h so others don't have to depend on our header. -FindBar* CreateFindBar(BrowserView* browser_view) { - return new FindBarHost(browser_view); -} - -} // namespace browser - -//////////////////////////////////////////////////////////////////////////////// -// FindBarHost, public: - -FindBarHost::FindBarHost(BrowserView* browser_view) - : DropdownBarHost(browser_view), - find_bar_controller_(NULL) { - Init(new FindBarView(this)); -} - -FindBarHost::~FindBarHost() { -} - -bool FindBarHost::MaybeForwardKeystrokeToWebpage( - const views::Textfield::Keystroke& key_stroke) { - if (!ShouldForwardKeystrokeToWebpageNative(key_stroke)) { - // Native implementation says not to forward these events. - return false; - } - - switch (key_stroke.GetKeyboardCode()) { - case app::VKEY_DOWN: - case app::VKEY_UP: - case app::VKEY_PRIOR: - case app::VKEY_NEXT: - break; - case app::VKEY_HOME: - case app::VKEY_END: - if (key_stroke.IsControlHeld()) - break; - // Fall through. - default: - return false; - } - - TabContents* contents = find_bar_controller_->tab_contents(); - if (!contents) - return false; - - RenderViewHost* render_view_host = contents->render_view_host(); - - // Make sure we don't have a text field element interfering with keyboard - // input. Otherwise Up and Down arrow key strokes get eaten. "Nom Nom Nom". - render_view_host->ClearFocusedNode(); - NativeWebKeyboardEvent event = GetKeyboardEvent(contents, key_stroke); - render_view_host->ForwardKeyboardEvent(event); - return true; -} - -FindBarController* FindBarHost::GetFindBarController() const { - return find_bar_controller_; -} - -void FindBarHost::SetFindBarController(FindBarController* find_bar_controller) { - find_bar_controller_ = find_bar_controller; -} - -void FindBarHost::Show(bool animate) { - DropdownBarHost::Show(animate); -} - -void FindBarHost::Hide(bool animate) { - DropdownBarHost::Hide(animate); -} - -void FindBarHost::SetFocusAndSelection() { - DropdownBarHost::SetFocusAndSelection(); -} - -void FindBarHost::ClearResults(const FindNotificationDetails& results) { - find_bar_view()->UpdateForResult(results, string16()); -} - -void FindBarHost::StopAnimation() { - DropdownBarHost::StopAnimation(); -} - -void FindBarHost::MoveWindowIfNecessary(const gfx::Rect& selection_rect, - bool no_redraw) { - // We only move the window if one is active for the current TabContents. If we - // don't check this, then SetWidgetPosition below will end up making the Find - // Bar visible. - if (!find_bar_controller_->tab_contents() || - !find_bar_controller_->tab_contents()->find_ui_active()) { - return; - } - - gfx::Rect new_pos = GetDialogPosition(selection_rect); - SetDialogPosition(new_pos, no_redraw); - - // May need to redraw our frame to accommodate bookmark bar styles. - view()->SchedulePaint(); -} - -void FindBarHost::SetFindText(const string16& find_text) { - find_bar_view()->SetFindText(find_text); -} - -void FindBarHost::UpdateUIForFindResult(const FindNotificationDetails& result, - const string16& find_text) { - if (!find_text.empty()) - find_bar_view()->UpdateForResult(result, find_text); - - // We now need to check if the window is obscuring the search results. - if (!result.selection_rect().IsEmpty()) - MoveWindowIfNecessary(result.selection_rect(), false); - - // Once we find a match we no longer want to keep track of what had - // focus. EndFindSession will then set the focus to the page content. - if (result.number_of_matches() > 0) - ResetFocusTracker(); -} - -bool FindBarHost::IsFindBarVisible() { - return DropdownBarHost::IsVisible(); -} - -void FindBarHost::RestoreSavedFocus() { - if (focus_tracker() == NULL) { - // TODO(brettw) Focus() should be on TabContentsView. - find_bar_controller_->tab_contents()->Focus(); - } else { - focus_tracker()->FocusLastFocusedExternalView(); - } -} - -FindBarTesting* FindBarHost::GetFindBarTesting() { - return this; -} - -//////////////////////////////////////////////////////////////////////////////// -// FindBarWin, views::AcceleratorTarget implementation: - -bool FindBarHost::AcceleratorPressed(const views::Accelerator& accelerator) { - app::KeyboardCode key = accelerator.GetKeyCode(); - if (key == app::VKEY_RETURN && accelerator.IsCtrlDown()) { - // Ctrl+Enter closes the Find session and navigates any link that is active. - find_bar_controller_->EndFindSession(FindBarController::kActivateSelection); - } else if (key == app::VKEY_ESCAPE) { - // This will end the Find session and hide the window, causing it to loose - // focus and in the process unregister us as the handler for the Escape - // accelerator through the FocusWillChange event. - find_bar_controller_->EndFindSession(FindBarController::kKeepSelection); - } else { - NOTREACHED() << "Unknown accelerator"; - } - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// FindBarTesting implementation: - -bool FindBarHost::GetFindBarWindowInfo(gfx::Point* position, - bool* fully_visible) { - if (!find_bar_controller_ || -#if defined(OS_WIN) - !::IsWindow(host()->GetNativeView())) { -#else - false) { - // TODO(sky): figure out linux side. - // This is tricky due to asynchronous nature of x11. - // See bug http://crbug.com/28629. -#endif - if (position) - *position = gfx::Point(); - if (fully_visible) - *fully_visible = false; - return false; - } - - gfx::Rect window_rect; - host()->GetBounds(&window_rect, true); - if (position) - *position = window_rect.origin(); - if (fully_visible) - *fully_visible = IsVisible() && !IsAnimating(); - return true; -} - -string16 FindBarHost::GetFindText() { - return find_bar_view()->GetFindText(); -} - -//////////////////////////////////////////////////////////////////////////////// -// Overridden from DropdownBarHost: - -gfx::Rect FindBarHost::GetDialogPosition(gfx::Rect avoid_overlapping_rect) { - // Find the area we have to work with (after accounting for scrollbars, etc). - gfx::Rect widget_bounds; - GetWidgetBounds(&widget_bounds); - if (widget_bounds.IsEmpty()) - return gfx::Rect(); - - // Ask the view how large an area it needs to draw on. - gfx::Size prefsize = view()->GetPreferredSize(); - - // Place the view in the top right corner of the widget boundaries (top left - // for RTL languages). - gfx::Rect view_location; - int x = widget_bounds.x(); - if (!base::i18n::IsRTL()) - x += widget_bounds.width() - prefsize.width(); - int y = widget_bounds.y(); - view_location.SetRect(x, y, prefsize.width(), prefsize.height()); - - // When we get Find results back, we specify a selection rect, which we - // should strive to avoid overlapping. But first, we need to offset the - // selection rect (if one was provided). - if (!avoid_overlapping_rect.IsEmpty()) { - // For comparison (with the Intersects function below) we need to account - // for the fact that we draw the Find widget relative to the Chrome frame, - // whereas the selection rect is relative to the page. - GetWidgetPositionNative(&avoid_overlapping_rect); - } - - gfx::Rect new_pos = FindBarController::GetLocationForFindbarView( - view_location, widget_bounds, avoid_overlapping_rect); - - // While we are animating, the Find window will grow bottoms up so we need to - // re-position the widget so that it appears to grow out of the toolbar. - if (animation_offset() > 0) - new_pos.Offset(0, std::min(0, -animation_offset())); - - return new_pos; -} - -void FindBarHost::SetDialogPosition(const gfx::Rect& new_pos, bool no_redraw) { - if (new_pos.IsEmpty()) - return; - - // Make sure the window edges are clipped to just the visible region. We need - // to do this before changing position, so that when we animate the closure - // of it it doesn't look like the window crumbles into the toolbar. - UpdateWindowEdges(new_pos); - - SetWidgetPositionNative(new_pos, no_redraw); -} - -void FindBarHost::GetWidgetBounds(gfx::Rect* bounds) { - DCHECK(bounds); - // The BrowserView does Layout for the components that we care about - // positioning relative to, so we ask it to tell us where we should go. - *bounds = browser_view()->GetFindBarBoundingBox(); -} - -void FindBarHost::RegisterAccelerators() { - DropdownBarHost::RegisterAccelerators(); - - // Register for Ctrl+Return. - views::Accelerator escape(app::VKEY_RETURN, false, true, false); - focus_manager()->RegisterAccelerator(escape, this); -} - -void FindBarHost::UnregisterAccelerators() { - // Unregister Ctrl+Return. - views::Accelerator escape(app::VKEY_RETURN, false, true, false); - focus_manager()->UnregisterAccelerator(escape, this); - - DropdownBarHost::UnregisterAccelerators(); -} - -//////////////////////////////////////////////////////////////////////////////// -// private: - -FindBarView* FindBarHost::find_bar_view() { - return static_cast<FindBarView*>(view()); -} |