Home | History | Annotate | Download | only in omnibox
      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_OMNIBOX_OMNIBOX_VIEW_VIEWS_H_
      6 #define CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_VIEW_VIEWS_H_
      7 
      8 #include <string>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "chrome/browser/ui/omnibox/omnibox_view.h"
     13 #include "chrome/browser/ui/toolbar/toolbar_model.h"
     14 #include "ui/base/window_open_disposition.h"
     15 #include "ui/gfx/range/range.h"
     16 #include "ui/views/controls/textfield/textfield.h"
     17 #include "ui/views/controls/textfield/textfield_controller.h"
     18 
     19 #if defined(OS_CHROMEOS)
     20 #include "chromeos/ime/input_method_manager.h"
     21 #endif
     22 
     23 class LocationBarView;
     24 class OmniboxPopupView;
     25 class Profile;
     26 
     27 namespace gfx {
     28 class RenderText;
     29 }
     30 
     31 namespace ui {
     32 class OSExchangeData;
     33 }  // namespace ui
     34 
     35 // Views-implementation of OmniboxView.
     36 class OmniboxViewViews
     37     : public OmniboxView,
     38       public views::Textfield,
     39 #if defined(OS_CHROMEOS)
     40       public
     41           chromeos::input_method::InputMethodManager::CandidateWindowObserver,
     42 #endif
     43       public views::TextfieldController {
     44  public:
     45   // The internal view class name.
     46   static const char kViewClassName[];
     47 
     48   OmniboxViewViews(OmniboxEditController* controller,
     49                    Profile* profile,
     50                    CommandUpdater* command_updater,
     51                    bool popup_window_mode,
     52                    LocationBarView* location_bar,
     53                    const gfx::FontList& font_list);
     54   virtual ~OmniboxViewViews();
     55 
     56   // Initialize, create the underlying views, etc.
     57   void Init();
     58 
     59   // Exposes the RenderText for tests.
     60 #if defined(UNIT_TEST)
     61   gfx::RenderText* GetRenderText() {
     62     return views::Textfield::GetRenderText();
     63   }
     64 #endif
     65 
     66   // OmniboxView:
     67   virtual void SaveStateToTab(content::WebContents* tab) OVERRIDE;
     68   virtual void OnTabChanged(const content::WebContents* web_contents) OVERRIDE;
     69   virtual void Update() OVERRIDE;
     70   virtual base::string16 GetText() const OVERRIDE;
     71   virtual void SetUserText(const base::string16& text,
     72                            const base::string16& display_text,
     73                            bool update_popup) OVERRIDE;
     74   virtual void SetForcedQuery() OVERRIDE;
     75   virtual void GetSelectionBounds(
     76       base::string16::size_type* start,
     77       base::string16::size_type* end) const OVERRIDE;
     78   virtual void SelectAll(bool reversed) OVERRIDE;
     79   virtual void RevertAll() OVERRIDE;
     80   virtual void SetFocus() OVERRIDE;
     81   virtual int GetTextWidth() const OVERRIDE;
     82   virtual bool IsImeComposing() const OVERRIDE;
     83 
     84   // views::Textfield:
     85   virtual gfx::Size GetMinimumSize() const OVERRIDE;
     86   virtual void OnNativeThemeChanged(const ui::NativeTheme* theme) OVERRIDE;
     87   virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
     88 
     89  private:
     90   FRIEND_TEST_ALL_PREFIXES(OmniboxViewViewsTest, CloseOmniboxPopupOnTextDrag);
     91 
     92   // Update the field with |text| and set the selection.
     93   void SetTextAndSelectedRange(const base::string16& text,
     94                                const gfx::Range& range);
     95 
     96   // Returns the selected text.
     97   base::string16 GetSelectedText() const;
     98 
     99   // Paste text from the clipboard into the omnibox.
    100   // Textfields implementation of Paste() pastes the contents of the clipboard
    101   // as is. We want to strip whitespace and other things (see GetClipboardText()
    102   // for details).
    103   // It is assumed this is invoked after a call to OnBeforePossibleChange() and
    104   // that after invoking this OnAfterPossibleChange() is invoked.
    105   void OnPaste();
    106 
    107   // Handle keyword hint tab-to-search and tabbing through dropdown results.
    108   bool HandleEarlyTabActions(const ui::KeyEvent& event);
    109 
    110   // OmniboxView:
    111   virtual void SetWindowTextAndCaretPos(const base::string16& text,
    112                                         size_t caret_pos,
    113                                         bool update_popup,
    114                                         bool notify_text_changed) OVERRIDE;
    115   virtual bool IsSelectAll() const OVERRIDE;
    116   virtual bool DeleteAtEndPressed() OVERRIDE;
    117   virtual void UpdatePopup() OVERRIDE;
    118   virtual void ApplyCaretVisibility() OVERRIDE;
    119   virtual void OnTemporaryTextMaybeChanged(
    120       const base::string16& display_text,
    121       bool save_original_selection,
    122       bool notify_text_changed) OVERRIDE;
    123   virtual bool OnInlineAutocompleteTextMaybeChanged(
    124       const base::string16& display_text, size_t user_text_length) OVERRIDE;
    125   virtual void OnInlineAutocompleteTextCleared() OVERRIDE;
    126   virtual void OnRevertTemporaryText() OVERRIDE;
    127   virtual void OnBeforePossibleChange() OVERRIDE;
    128   virtual bool OnAfterPossibleChange() OVERRIDE;
    129   virtual gfx::NativeView GetNativeView() const OVERRIDE;
    130   virtual gfx::NativeView GetRelativeWindowForPopup() const OVERRIDE;
    131   virtual void SetGrayTextAutocompletion(const base::string16& input) OVERRIDE;
    132   virtual base::string16 GetGrayTextAutocompletion() const OVERRIDE;
    133   virtual int GetWidth() const OVERRIDE;
    134   virtual bool IsImeShowingPopup() const OVERRIDE;
    135   virtual void ShowImeIfNeeded() OVERRIDE;
    136   virtual void OnMatchOpened(const AutocompleteMatch& match,
    137                              Profile* profile,
    138                              content::WebContents* web_contents) const OVERRIDE;
    139   virtual int GetOmniboxTextLength() const OVERRIDE;
    140   virtual void EmphasizeURLComponents() OVERRIDE;
    141 
    142   // views::Textfield:
    143   virtual bool OnKeyReleased(const ui::KeyEvent& event) OVERRIDE;
    144   virtual bool IsItemForCommandIdDynamic(int command_id) const OVERRIDE;
    145   virtual base::string16 GetLabelForCommandId(int command_id) const OVERRIDE;
    146   virtual const char* GetClassName() const OVERRIDE;
    147   virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE;
    148   virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE;
    149   virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE;
    150   virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE;
    151   virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
    152   virtual void AboutToRequestFocusFromTabTraversal(bool reverse) OVERRIDE;
    153   virtual bool SkipDefaultKeyEventProcessing(
    154       const ui::KeyEvent& event) OVERRIDE;
    155   virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE;
    156   virtual void OnFocus() OVERRIDE;
    157   virtual void OnBlur() OVERRIDE;
    158   virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
    159   virtual base::string16 GetSelectionClipboardText() const OVERRIDE;
    160 
    161   // chromeos::input_method::InputMethodManager::CandidateWindowObserver:
    162 #if defined(OS_CHROMEOS)
    163   virtual void CandidateWindowOpened(
    164       chromeos::input_method::InputMethodManager* manager) OVERRIDE;
    165   virtual void CandidateWindowClosed(
    166       chromeos::input_method::InputMethodManager* manager) OVERRIDE;
    167 #endif
    168 
    169   // views::TextfieldController:
    170   virtual void ContentsChanged(views::Textfield* sender,
    171                                const base::string16& new_contents) OVERRIDE;
    172   virtual bool HandleKeyEvent(views::Textfield* sender,
    173                               const ui::KeyEvent& key_event) OVERRIDE;
    174   virtual void OnBeforeUserAction(views::Textfield* sender) OVERRIDE;
    175   virtual void OnAfterUserAction(views::Textfield* sender) OVERRIDE;
    176   virtual void OnAfterCutOrCopy(ui::ClipboardType clipboard_type) OVERRIDE;
    177   virtual void OnWriteDragData(ui::OSExchangeData* data) OVERRIDE;
    178   virtual void OnGetDragOperationsForTextfield(int* drag_operations) OVERRIDE;
    179   virtual void AppendDropFormats(
    180       int* formats,
    181       std::set<ui::OSExchangeData::CustomFormat>* custom_formats) OVERRIDE;
    182   virtual int OnDrop(const ui::OSExchangeData& data) OVERRIDE;
    183   virtual void UpdateContextMenu(ui::SimpleMenuModel* menu_contents) OVERRIDE;
    184 
    185   // When true, the location bar view is read only and also is has a slightly
    186   // different presentation (smaller font size). This is used for popups.
    187   bool popup_window_mode_;
    188 
    189   scoped_ptr<OmniboxPopupView> popup_view_;
    190 
    191   ToolbarModel::SecurityLevel security_level_;
    192 
    193   // Selection persisted across temporary text changes, like popup suggestions.
    194   gfx::Range saved_temporary_selection_;
    195 
    196   // Holds the user's selection across focus changes.  There is only a saved
    197   // selection if this range IsValid().
    198   gfx::Range saved_selection_for_focus_change_;
    199 
    200   // Tracking state before and after a possible change.
    201   base::string16 text_before_change_;
    202   gfx::Range sel_before_change_;
    203   bool ime_composing_before_change_;
    204 
    205   // Was the delete key pressed with an empty selection at the end of the edit?
    206   bool delete_at_end_pressed_;
    207   LocationBarView* location_bar_view_;
    208 
    209   // True if the IME candidate window is open. When this is true, we want to
    210   // avoid showing the popup. So far, the candidate window is detected only
    211   // on Chrome OS.
    212   bool ime_candidate_window_open_;
    213 
    214   // Should we select all the text when we see the mouse button get released?
    215   // We select in response to a click that focuses the omnibox, but we defer
    216   // until release, setting this variable back to false if we saw a drag, to
    217   // allow the user to select just a portion of the text.
    218   bool select_all_on_mouse_release_;
    219 
    220   // Indicates if we want to select all text in the omnibox when we get a
    221   // GESTURE_TAP. We want to select all only when the textfield is not in focus
    222   // and gets a tap. So we use this variable to remember focus state before tap.
    223   bool select_all_on_gesture_tap_;
    224 
    225   DISALLOW_COPY_AND_ASSIGN(OmniboxViewViews);
    226 };
    227 
    228 #endif  // CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_VIEW_VIEWS_H_
    229