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