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_COCOA_OMNIBOX_OMNIBOX_VIEW_MAC_H_ 6 #define CHROME_BROWSER_UI_COCOA_OMNIBOX_OMNIBOX_VIEW_MAC_H_ 7 8 #import <Cocoa/Cocoa.h> 9 10 #include "base/memory/scoped_ptr.h" 11 #include "base/strings/string16.h" 12 #include "chrome/browser/ui/cocoa/location_bar/autocomplete_text_field.h" 13 #include "chrome/browser/ui/omnibox/omnibox_view.h" 14 15 class OmniboxPopupView; 16 17 namespace ui { 18 class Clipboard; 19 } 20 21 // Implements OmniboxView on an AutocompleteTextField. 22 class OmniboxViewMac : public OmniboxView, 23 public AutocompleteTextFieldObserver { 24 public: 25 OmniboxViewMac(OmniboxEditController* controller, 26 Profile* profile, 27 CommandUpdater* command_updater, 28 AutocompleteTextField* field); 29 virtual ~OmniboxViewMac(); 30 31 // OmniboxView: 32 virtual void SaveStateToTab(content::WebContents* tab) OVERRIDE; 33 virtual void OnTabChanged(const content::WebContents* web_contents) OVERRIDE; 34 virtual void Update() OVERRIDE; 35 virtual void UpdatePlaceholderText() OVERRIDE; 36 virtual void OpenMatch(const AutocompleteMatch& match, 37 WindowOpenDisposition disposition, 38 const GURL& alternate_nav_url, 39 const base::string16& pasted_text, 40 size_t selected_line) OVERRIDE; 41 virtual base::string16 GetText() const OVERRIDE; 42 virtual void SetWindowTextAndCaretPos(const base::string16& text, 43 size_t caret_pos, 44 bool update_popup, 45 bool notify_text_changed) OVERRIDE; 46 virtual void SetForcedQuery() OVERRIDE; 47 virtual bool IsSelectAll() const OVERRIDE; 48 virtual bool DeleteAtEndPressed() OVERRIDE; 49 virtual void GetSelectionBounds( 50 base::string16::size_type* start, 51 base::string16::size_type* end) const OVERRIDE; 52 virtual void SelectAll(bool reversed) OVERRIDE; 53 virtual void RevertAll() OVERRIDE; 54 virtual void UpdatePopup() OVERRIDE; 55 virtual void CloseOmniboxPopup() OVERRIDE; 56 virtual void SetFocus() OVERRIDE; 57 virtual void ApplyCaretVisibility() OVERRIDE; 58 virtual void OnTemporaryTextMaybeChanged( 59 const base::string16& display_text, 60 bool save_original_selection, 61 bool notify_text_changed) OVERRIDE; 62 virtual bool OnInlineAutocompleteTextMaybeChanged( 63 const base::string16& display_text, size_t user_text_length) OVERRIDE; 64 virtual void OnInlineAutocompleteTextCleared() OVERRIDE; 65 virtual void OnRevertTemporaryText() OVERRIDE; 66 virtual void OnBeforePossibleChange() OVERRIDE; 67 virtual bool OnAfterPossibleChange() OVERRIDE; 68 virtual gfx::NativeView GetNativeView() const OVERRIDE; 69 virtual gfx::NativeView GetRelativeWindowForPopup() const OVERRIDE; 70 virtual void SetGrayTextAutocompletion(const base::string16& input) OVERRIDE; 71 virtual base::string16 GetGrayTextAutocompletion() const OVERRIDE; 72 virtual int GetTextWidth() const OVERRIDE; 73 virtual int GetWidth() const OVERRIDE; 74 virtual bool IsImeComposing() const OVERRIDE; 75 76 // Implement the AutocompleteTextFieldObserver interface. 77 virtual NSRange SelectionRangeForProposedRange( 78 NSRange proposed_range) OVERRIDE; 79 virtual void OnControlKeyChanged(bool pressed) OVERRIDE; 80 virtual bool CanCopy() OVERRIDE; 81 virtual void CopyToPasteboard(NSPasteboard* pboard) OVERRIDE; 82 virtual bool ShouldEnableShowURL() OVERRIDE; 83 virtual void ShowURL() OVERRIDE; 84 virtual void OnPaste() OVERRIDE; 85 virtual bool CanPasteAndGo() OVERRIDE; 86 virtual int GetPasteActionStringId() OVERRIDE; 87 virtual void OnPasteAndGo() OVERRIDE; 88 virtual void OnFrameChanged() OVERRIDE; 89 virtual void ClosePopup() OVERRIDE; 90 virtual void OnDidBeginEditing() OVERRIDE; 91 virtual void OnBeforeChange() OVERRIDE; 92 virtual void OnDidChange() OVERRIDE; 93 virtual void OnDidEndEditing() OVERRIDE; 94 virtual bool OnDoCommandBySelector(SEL cmd) OVERRIDE; 95 virtual void OnSetFocus(bool control_down) OVERRIDE; 96 virtual void OnKillFocus() OVERRIDE; 97 virtual void OnMouseDown(NSInteger button_number) OVERRIDE; 98 virtual bool ShouldSelectAllOnMouseDown() OVERRIDE; 99 100 // Helper for LocationBarViewMac. Optionally selects all in |field_|. 101 void FocusLocation(bool select_all); 102 103 // Helper to get the font to use in the field, exposed for the 104 // popup. 105 // The style parameter specifies the new style for the font, and is a 106 // bitmask of the values: BOLD, ITALIC and UNDERLINE (see ui/gfx/font.h). 107 static NSFont* GetFieldFont(int style); 108 109 // If |resource_id| has a PDF image which can be used, return it. 110 // Otherwise return the PNG image from the resource bundle. 111 static NSImage* ImageForResource(int resource_id); 112 113 // Color used to draw suggest text. 114 static NSColor* SuggestTextColor(); 115 116 AutocompleteTextField* field() const { return field_; } 117 118 private: 119 // Called when the user hits backspace in |field_|. Checks whether 120 // keyword search is being terminated. Returns true if the 121 // backspace should be intercepted (not forwarded on to the standard 122 // machinery). 123 bool OnBackspacePressed(); 124 125 // Returns the field's currently selected range. Only valid if the 126 // field has focus. 127 NSRange GetSelectedRange() const; 128 129 // Returns the field's currently marked range. Only valid if the field has 130 // focus. 131 NSRange GetMarkedRange() const; 132 133 // Returns true if |field_| is first-responder in the window. Used 134 // in various DCHECKS to make sure code is running in appropriate 135 // situations. 136 bool IsFirstResponder() const; 137 138 // If |model_| believes it has focus, grab focus if needed and set 139 // the selection to |range|. Otherwise does nothing. 140 void SetSelectedRange(const NSRange range); 141 142 // Update the field with |display_text| and highlight the host and scheme (if 143 // it's an URL or URL-fragment). Resets any suggest text that may be present. 144 void SetText(const base::string16& display_text); 145 146 // Internal implementation of SetText. Does not reset the suggest text before 147 // setting the display text. Most callers should use |SetText()| instead. 148 void SetTextInternal(const base::string16& display_text); 149 150 // Update the field with |display_text| and set the selection. 151 void SetTextAndSelectedRange(const base::string16& display_text, 152 const NSRange range); 153 154 // Pass the current content of |field_| to SetText(), maintaining 155 // any selection. Named to be consistent with GTK and Windows, 156 // though here we cannot really do the in-place operation they do. 157 virtual void EmphasizeURLComponents() OVERRIDE; 158 159 // Calculates text attributes according to |display_text| and applies them 160 // to the given |as| object. 161 void ApplyTextAttributes(const base::string16& display_text, 162 NSMutableAttributedString* as); 163 164 // Return the number of UTF-16 units in the current buffer, excluding the 165 // suggested text. 166 virtual int GetOmniboxTextLength() const OVERRIDE; 167 NSUInteger GetTextLength() const; 168 169 // Returns true if the caret is at the end of the content. 170 bool IsCaretAtEnd() const; 171 172 scoped_ptr<OmniboxPopupView> popup_view_; 173 174 AutocompleteTextField* field_; // owned by tab controller 175 176 // Selection at the point where the user started using the 177 // arrows to move around in the popup. 178 NSRange saved_temporary_selection_; 179 180 // Tracking state before and after a possible change for reporting 181 // to model_. 182 NSRange selection_before_change_; 183 base::string16 text_before_change_; 184 NSRange marked_range_before_change_; 185 186 // Was delete pressed? 187 bool delete_was_pressed_; 188 189 // Was the delete key pressed with an empty selection at the end of the edit? 190 bool delete_at_end_pressed_; 191 192 base::string16 suggest_text_; 193 194 // State used to coalesce changes to text and selection to avoid drawing 195 // transient state. 196 bool in_coalesced_update_block_; 197 bool do_coalesced_text_update_; 198 base::string16 coalesced_text_update_; 199 bool do_coalesced_range_update_; 200 NSRange coalesced_range_update_; 201 202 DISALLOW_COPY_AND_ASSIGN(OmniboxViewMac); 203 }; 204 205 #endif // CHROME_BROWSER_UI_COCOA_OMNIBOX_OMNIBOX_VIEW_MAC_H_ 206