1// Copyright (c) 2011 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_AUTOCOMPLETE_AUTOCOMPLETE_EDIT_VIEW_MAC_H_
6#define CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_EDIT_VIEW_MAC_H_
7#pragma once
8
9#import <Cocoa/Cocoa.h>
10
11#include "base/memory/scoped_ptr.h"
12#include "base/string16.h"
13#include "chrome/browser/autocomplete/autocomplete_edit_view.h"
14#include "chrome/browser/ui/cocoa/location_bar/autocomplete_text_field.h"
15
16class AutocompleteEditController;
17class AutocompletePopupViewMac;
18class Profile;
19class ToolbarModel;
20
21namespace ui {
22class Clipboard;
23}
24
25// Implements AutocompleteEditView on an AutocompleteTextField.
26
27class AutocompleteEditViewMac : public AutocompleteEditView,
28                                public AutocompleteTextFieldObserver {
29 public:
30  AutocompleteEditViewMac(AutocompleteEditController* controller,
31                          ToolbarModel* toolbar_model,
32                          Profile* profile,
33                          CommandUpdater* command_updater,
34                          AutocompleteTextField* field);
35  virtual ~AutocompleteEditViewMac();
36
37  // Implement the AutocompleteEditView interface.
38  virtual AutocompleteEditModel* model();
39  virtual const AutocompleteEditModel* model() const;
40
41  virtual void SaveStateToTab(TabContents* tab);
42  virtual void Update(const TabContents* tab_for_state_restoring);
43
44  virtual void OpenURL(const GURL& url,
45                       WindowOpenDisposition disposition,
46                       PageTransition::Type transition,
47                       const GURL& alternate_nav_url,
48                       size_t selected_line,
49                       const string16& keyword);
50
51  virtual string16 GetText() const;
52
53  virtual bool IsEditingOrEmpty() const;
54  virtual int GetIcon() const;
55
56  virtual void SetUserText(const string16& text);
57  virtual void SetUserText(const string16& text,
58                           const string16& display_text,
59                           bool update_popup);
60
61  virtual void SetWindowTextAndCaretPos(const string16& text,
62                                        size_t caret_pos);
63
64  virtual void SetForcedQuery();
65
66  virtual bool IsSelectAll();
67  virtual bool DeleteAtEndPressed();
68  virtual void GetSelectionBounds(string16::size_type* start,
69                                  string16::size_type* end);
70
71  virtual void SelectAll(bool reversed);
72  virtual void RevertAll();
73  virtual void UpdatePopup();
74  virtual void ClosePopup();
75  virtual void SetFocus();
76  virtual void OnTemporaryTextMaybeChanged(const string16& display_text,
77                                           bool save_original_selection);
78  virtual bool OnInlineAutocompleteTextMaybeChanged(
79      const string16& display_text, size_t user_text_length);
80  virtual void OnStartingIME();
81  virtual void OnRevertTemporaryText();
82  virtual void OnBeforePossibleChange();
83  virtual bool OnAfterPossibleChange();
84  virtual gfx::NativeView GetNativeView() const;
85  virtual CommandUpdater* GetCommandUpdater();
86  virtual void SetInstantSuggestion(const string16& input,
87                                    bool animate_to_complete);
88  virtual string16 GetInstantSuggestion() const;
89  virtual int TextWidth() const;
90  virtual bool IsImeComposing() const;
91
92  // Implement the AutocompleteTextFieldObserver interface.
93  virtual NSRange SelectionRangeForProposedRange(NSRange proposed_range);
94  virtual void OnControlKeyChanged(bool pressed);
95  virtual bool CanCopy();
96  virtual void CopyToPasteboard(NSPasteboard* pboard);
97  virtual void OnPaste();
98  virtual bool CanPasteAndGo();
99  virtual int GetPasteActionStringId();
100  virtual void OnPasteAndGo();
101  virtual void OnFrameChanged();
102  virtual void OnDidBeginEditing();
103  virtual void OnBeforeChange();
104  virtual void OnDidChange();
105  virtual void OnDidEndEditing();
106  virtual bool OnDoCommandBySelector(SEL cmd);
107  virtual void OnSetFocus(bool control_down);
108  virtual void OnKillFocus();
109
110  // Helper for LocationBarViewMac.  Optionally selects all in |field_|.
111  void FocusLocation(bool select_all);
112
113  // Helper to get appropriate contents from |clipboard|.  Returns
114  // empty string if no appropriate data is found on |clipboard|.
115  static string16 GetClipboardText(ui::Clipboard* clipboard);
116
117  // Helper to get the font to use in the field, exposed for the
118  // popup.
119  static NSFont* GetFieldFont();
120
121  // If |resource_id| has a PDF image which can be used, return it.
122  // Otherwise return the PNG image from the resource bundle.
123  static NSImage* ImageForResource(int resource_id);
124
125 private:
126  // Called when the user hits backspace in |field_|.  Checks whether
127  // keyword search is being terminated.  Returns true if the
128  // backspace should be intercepted (not forwarded on to the standard
129  // machinery).
130  bool OnBackspacePressed();
131
132  // Returns the field's currently selected range.  Only valid if the
133  // field has focus.
134  NSRange GetSelectedRange() const;
135
136  // Returns the field's currently marked range. Only valid if the field has
137  // focus.
138  NSRange GetMarkedRange() const;
139
140  // Returns true if |field_| is first-responder in the window.  Used
141  // in various DCHECKS to make sure code is running in appropriate
142  // situations.
143  bool IsFirstResponder() const;
144
145  // If |model_| believes it has focus, grab focus if needed and set
146  // the selection to |range|.  Otherwise does nothing.
147  void SetSelectedRange(const NSRange range);
148
149  // Update the field with |display_text| and highlight the host and scheme (if
150  // it's an URL or URL-fragment).  Resets any suggest text that may be present.
151  void SetText(const string16& display_text);
152
153  // Internal implementation of SetText.  Does not reset the suggest text before
154  // setting the display text.  Most callers should use |SetText()| instead.
155  void SetTextInternal(const string16& display_text);
156
157  // Update the field with |display_text| and set the selection.
158  void SetTextAndSelectedRange(const string16& display_text,
159                               const NSRange range);
160
161  // Returns the non-suggest portion of |field_|'s string value.
162  NSString* GetNonSuggestTextSubstring() const;
163
164  // Returns the suggest portion of |field_|'s string value.
165  NSString* GetSuggestTextSubstring() const;
166
167  // Pass the current content of |field_| to SetText(), maintaining
168  // any selection.  Named to be consistent with GTK and Windows,
169  // though here we cannot really do the in-place operation they do.
170  void EmphasizeURLComponents();
171
172  // Calculates text attributes according to |display_text| and applies them
173  // to the given |as| object.
174  void ApplyTextAttributes(const string16& display_text,
175                           NSMutableAttributedString* as);
176
177  // Return the number of UTF-16 units in the current buffer, excluding the
178  // suggested text.
179  NSUInteger GetTextLength() const;
180
181  // Places the caret at the given position. This clears any selection.
182  void PlaceCaretAt(NSUInteger pos);
183
184  // Returns true if the caret is at the end of the content.
185  bool IsCaretAtEnd() const;
186
187  scoped_ptr<AutocompleteEditModel> model_;
188  scoped_ptr<AutocompletePopupViewMac> popup_view_;
189
190  AutocompleteEditController* controller_;
191  ToolbarModel* toolbar_model_;
192
193  // The object that handles additional command functionality exposed on the
194  // edit, such as invoking the keyword editor.
195  CommandUpdater* command_updater_;
196
197  AutocompleteTextField* field_;  // owned by tab controller
198
199  // Selection at the point where the user started using the
200  // arrows to move around in the popup.
201  NSRange saved_temporary_selection_;
202
203  // Tracking state before and after a possible change for reporting
204  // to model_.
205  NSRange selection_before_change_;
206  string16 text_before_change_;
207  NSRange marked_range_before_change_;
208
209  // Length of the suggest text.  The suggest text always appears at the end of
210  // the field.
211  size_t suggest_text_length_;
212
213  // Was delete pressed?
214  bool delete_was_pressed_;
215
216  // Was the delete key pressed with an empty selection at the end of the edit?
217  bool delete_at_end_pressed_;
218
219  // The maximum/standard line height for the displayed text.
220  CGFloat line_height_;
221
222  DISALLOW_COPY_AND_ASSIGN(AutocompleteEditViewMac);
223};
224
225#endif  // CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_EDIT_VIEW_MAC_H_
226