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