Home | History | Annotate | Download | only in views
      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 
     16 class FindBarHost;
     17 class FindNotificationDetails;
     18 
     19 namespace views {
     20 class ImageButton;
     21 class Label;
     22 class MouseEvent;
     23 class 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 ////////////////////////////////////////////////////////////////////////////////
     33 class 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