• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 class AutocompleteEditController;
17 class AutocompletePopupViewMac;
18 class Profile;
19 class ToolbarModel;
20 
21 namespace ui {
22 class Clipboard;
23 }
24 
25 // Implements AutocompleteEditView on an AutocompleteTextField.
26 
27 class 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