autocomplete_edit_view.h revision dc0f95d653279beabeb9817299e2902918ba123e
1// Copyright (c) 2010 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// This file defines the interface class AutocompleteEditView.  Each toolkit
6// will implement the edit view differently, so that code is inherently
7// platform specific.  However, the AutocompleteEditModel needs to do some
8// communication with the view.  Since the model is shared between platforms,
9// we need to define an interface that all view implementations will share.
10
11#ifndef CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_EDIT_VIEW_H_
12#define CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_EDIT_VIEW_H_
13#pragma once
14
15#include <string>
16
17#include "base/string16.h"
18#include "chrome/common/page_transition_types.h"
19#include "ui/gfx/native_widget_types.h"
20#include "webkit/glue/window_open_disposition.h"
21
22class AutocompleteEditModel;
23class CommandUpdater;
24class GURL;
25class TabContents;
26
27#if defined(TOOLKIT_VIEWS)
28namespace views {
29class DropTargetEvent;
30class View;
31}  // namespace views
32#endif
33
34class AutocompleteEditView {
35 public:
36  // Used by the automation system for getting at the model from the view.
37  virtual AutocompleteEditModel* model() = 0;
38  virtual const AutocompleteEditModel* model() const = 0;
39
40  // For use when switching tabs, this saves the current state onto the tab so
41  // that it can be restored during a later call to Update().
42  virtual void SaveStateToTab(TabContents* tab) = 0;
43
44  // Called when any LocationBarView state changes. If
45  // |tab_for_state_restoring| is non-NULL, it points to a TabContents whose
46  // state we should restore.
47  virtual void Update(const TabContents* tab_for_state_restoring) = 0;
48
49  // Asks the browser to load the specified URL, which is assumed to be one of
50  // the popup entries, using the supplied disposition and transition type.
51  // |alternate_nav_url|, if non-empty, contains the alternate navigation URL
52  // for |url|.  See comments on AutocompleteResult::GetAlternateNavURL().
53  //
54  // |selected_line| is passed to SendOpenNotification(); see comments there.
55  //
56  // If the URL was expanded from a keyword, |keyword| is that keyword.
57  //
58  // This may close the popup.
59  virtual void OpenURL(const GURL& url,
60                       WindowOpenDisposition disposition,
61                       PageTransition::Type transition,
62                       const GURL& alternate_nav_url,
63                       size_t selected_line,
64                       const string16& keyword) = 0;
65
66  // Returns the current text of the edit control, which could be the
67  // "temporary" text set by the popup, the "permanent" text set by the
68  // browser, or just whatever the user has currently typed.
69  virtual string16 GetText() const = 0;
70
71  // |true| if the user is in the process of editing the field, or if
72  // the field is empty.
73  virtual bool IsEditingOrEmpty() const = 0;
74
75  // Returns the resource ID of the icon to show for the current text.
76  virtual int GetIcon() const = 0;
77
78  // The user text is the text the user has manually keyed in.  When present,
79  // this is shown in preference to the permanent text; hitting escape will
80  // revert to the permanent text.
81  virtual void SetUserText(const string16& text) = 0;
82  virtual void SetUserText(const string16& text,
83                           const string16& display_text,
84                           bool update_popup) = 0;
85
86  // Sets the window text and the caret position.
87  virtual void SetWindowTextAndCaretPos(const string16& text,
88                                        size_t caret_pos) = 0;
89
90  // Sets the edit to forced query mode.  Practically speaking, this means that
91  // if the edit is not in forced query mode, its text is set to "?" with the
92  // cursor at the end, and if the edit is in forced query mode (its first
93  // non-whitespace character is '?'), the text after the '?' is selected.
94  //
95  // In the future we should display the search engine UI for the default engine
96  // rather than '?'.
97  virtual void SetForcedQuery() = 0;
98
99  // Returns true if all text is selected or there is no text at all.
100  virtual bool IsSelectAll() = 0;
101
102  // Returns true if the user deleted the suggested text.
103  virtual bool DeleteAtEndPressed() = 0;
104
105  // Fills |start| and |end| with the indexes of the current selection's bounds.
106  // It is not guaranteed that |*start < *end|, as the selection can be
107  // directed.  If there is no selection, |start| and |end| will both be equal
108  // to the current cursor position.
109  virtual void GetSelectionBounds(string16::size_type* start,
110                                  string16::size_type* end) = 0;
111
112  // Selects all the text in the edit.  Use this in place of SetSelAll() to
113  // avoid selecting the "phantom newline" at the end of the edit.
114  virtual void SelectAll(bool reversed) = 0;
115
116  // Reverts the edit and popup back to their unedited state (permanent text
117  // showing, popup closed, no user input in progress).
118  virtual void RevertAll() = 0;
119
120  // Updates the autocomplete popup and other state after the text has been
121  // changed by the user.
122  virtual void UpdatePopup() = 0;
123
124  // Closes the autocomplete popup, if it's open.
125  virtual void ClosePopup() = 0;
126
127  // Sets the focus to the autocomplete view.
128  virtual void SetFocus() = 0;
129
130  // Called when the temporary text in the model may have changed.
131  // |display_text| is the new text to show; |save_original_selection| is true
132  // when there wasn't previously a temporary text and thus we need to save off
133  // the user's existing selection.
134  virtual void OnTemporaryTextMaybeChanged(const string16& display_text,
135                                           bool save_original_selection) = 0;
136
137  // Called when the inline autocomplete text in the model may have changed.
138  // |display_text| is the new text to show; |user_text_length| is the length of
139  // the user input portion of that (so, up to but not including the inline
140  // autocompletion).  Returns whether the display text actually changed.
141  virtual bool OnInlineAutocompleteTextMaybeChanged(
142      const string16& display_text, size_t user_text_length) = 0;
143
144  // Called when the temporary text has been reverted by the user.  This will
145  // reset the user's original selection.
146  virtual void OnRevertTemporaryText() = 0;
147
148  // Every piece of code that can change the edit should call these functions
149  // before and after the change.  These functions determine if anything
150  // meaningful changed, and do any necessary updating and notification.
151  virtual void OnBeforePossibleChange() = 0;
152  // OnAfterPossibleChange() returns true if there was a change that caused it
153  // to call UpdatePopup().
154  virtual bool OnAfterPossibleChange() = 0;
155
156  // Returns the gfx::NativeView of the edit view.
157  virtual gfx::NativeView GetNativeView() const = 0;
158
159  // Returns the command updater for this view.
160  virtual CommandUpdater* GetCommandUpdater() = 0;
161
162  // Shows the instant suggestion text.
163  virtual void SetInstantSuggestion(const string16& input) = 0;
164
165  // Returns the current instant suggestion text.
166  virtual string16 GetInstantSuggestion() const = 0;
167
168  // Returns the width in pixels needed to display the current text. The
169  // returned value includes margins.
170  virtual int TextWidth() const = 0;
171
172  // Returns true if the user is composing something in an IME.
173  virtual bool IsImeComposing() const = 0;
174
175#if defined(TOOLKIT_VIEWS)
176  // Adds the autocomplete edit view to view hierarchy and
177  // returns the views::View of the edit view.
178  virtual views::View* AddToView(views::View* parent) = 0;
179
180  // Performs the drop of a drag and drop operation on the view.
181  virtual int OnPerformDrop(const views::DropTargetEvent& event) = 0;
182#endif
183
184  virtual ~AutocompleteEditView() {}
185};
186
187#endif  // CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_EDIT_VIEW_H_
188