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