find_bar_view.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_BROWSER_UI_VIEWS_FIND_BAR_VIEW_H_ 6#define CHROME_BROWSER_UI_VIEWS_FIND_BAR_VIEW_H_ 7 8#include "base/compiler_specific.h" 9#include "base/memory/scoped_ptr.h" 10#include "base/strings/string16.h" 11#include "chrome/browser/ui/views/dropdown_bar_view.h" 12#include "ui/views/controls/button/button.h" 13#include "ui/views/controls/textfield/textfield.h" 14#include "ui/views/controls/textfield/textfield_controller.h" 15 16class FindBarHost; 17class FindNotificationDetails; 18 19namespace views { 20class ImageButton; 21class Label; 22class MouseEvent; 23class Painter; 24} 25 26//////////////////////////////////////////////////////////////////////////////// 27// 28// The FindBarView is responsible for drawing the UI controls of the 29// FindBar, the find text box, the 'Find' button and the 'Close' 30// button. It communicates the user search words to the FindBarHost. 31// 32//////////////////////////////////////////////////////////////////////////////// 33class FindBarView : public DropdownBarView, 34 public views::ButtonListener, 35 public views::TextfieldController { 36 public: 37 // A tag denoting which button the user pressed. 38 enum ButtonTag { 39 FIND_PREVIOUS_TAG = 0, // The Find Previous button. 40 FIND_NEXT_TAG, // The Find Next button. 41 CLOSE_TAG, // The Close button (the 'X'). 42 }; 43 44 explicit FindBarView(FindBarHost* host); 45 virtual ~FindBarView(); 46 47 // Accessors for the text and selection displayed in the text box. 48 void SetFindTextAndSelectedRange(const base::string16& find_text, 49 const gfx::Range& selected_range); 50 base::string16 GetFindText() const; 51 gfx::Range GetSelectedRange() const; 52 53 // Gets the selected text in the text box. 54 base::string16 GetFindSelectedText() const; 55 56 // Gets the match count text displayed in the text box. 57 base::string16 GetMatchCountText() const; 58 59 // Updates the label inside the Find text box that shows the ordinal of the 60 // active item and how many matches were found. 61 void UpdateForResult(const FindNotificationDetails& result, 62 const base::string16& find_text); 63 64 // Clears the current Match Count value in the Find text box. 65 void ClearMatchCount(); 66 67 // Claims focus for the text field and selects its contents. 68 virtual void SetFocusAndSelection(bool select_all) OVERRIDE; 69 70 // views::View: 71 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 72 virtual void Layout() OVERRIDE; 73 virtual gfx::Size GetPreferredSize() const OVERRIDE; 74 75 // views::ButtonListener: 76 virtual void ButtonPressed(views::Button* sender, 77 const ui::Event& event) OVERRIDE; 78 79 // views::TextfieldController: 80 virtual bool HandleKeyEvent(views::Textfield* sender, 81 const ui::KeyEvent& key_event) OVERRIDE; 82 virtual void OnAfterUserAction(views::Textfield* sender) OVERRIDE; 83 virtual void OnAfterPaste() OVERRIDE; 84 85 private: 86 // Starts finding |search_text|. If the text is empty, stops finding. 87 void Find(const base::string16& search_text); 88 89 // Updates the appearance for the match count label. 90 void UpdateMatchCountAppearance(bool no_match); 91 92 // views::View: 93 virtual void OnThemeChanged() OVERRIDE; 94 95 // We use a hidden view to grab mouse clicks and bring focus to the find 96 // text box. This is because although the find text box may look like it 97 // extends all the way to the find button, it only goes as far as to the 98 // match_count label. The user, however, expects being able to click anywhere 99 // inside what looks like the find text box (including on or around the 100 // match_count label) and have focus brought to the find box. 101 class FocusForwarderView : public views::View { 102 public: 103 explicit FocusForwarderView( 104 views::Textfield* view_to_focus_on_mousedown) 105 : view_to_focus_on_mousedown_(view_to_focus_on_mousedown) {} 106 107 private: 108 virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE; 109 110 views::Textfield* view_to_focus_on_mousedown_; 111 112 DISALLOW_COPY_AND_ASSIGN(FocusForwarderView); 113 }; 114 115 // Returns the OS-specific view for the find bar that acts as an intermediary 116 // between us and the WebContentsView. 117 FindBarHost* find_bar_host() const; 118 119 // Used to detect if the input text, not including the IME composition text, 120 // has changed or not. 121 base::string16 last_searched_text_; 122 123 // The controls in the window. 124 views::Textfield* find_text_; 125 scoped_ptr<views::Painter> find_text_border_; 126 views::Label* match_count_text_; 127 FocusForwarderView* focus_forwarder_view_; 128 views::ImageButton* find_previous_button_; 129 views::ImageButton* find_next_button_; 130 views::ImageButton* close_button_; 131 132 // The preferred height of the find bar. 133 int preferred_height_; 134 135 DISALLOW_COPY_AND_ASSIGN(FindBarView); 136}; 137 138#endif // CHROME_BROWSER_UI_VIEWS_FIND_BAR_VIEW_H_ 139