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