// Copyright (c) 2011 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_AUTOCOMPLETE_AUTOCOMPLETE_EDIT_VIEW_MAC_H_ #define CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_EDIT_VIEW_MAC_H_ #pragma once #import <Cocoa/Cocoa.h> #include "base/memory/scoped_ptr.h" #include "base/string16.h" #include "chrome/browser/autocomplete/autocomplete_edit_view.h" #include "chrome/browser/ui/cocoa/location_bar/autocomplete_text_field.h" class AutocompleteEditController; class AutocompletePopupViewMac; class Profile; class ToolbarModel; namespace ui { class Clipboard; } // Implements AutocompleteEditView on an AutocompleteTextField. class AutocompleteEditViewMac : public AutocompleteEditView, public AutocompleteTextFieldObserver { public: AutocompleteEditViewMac(AutocompleteEditController* controller, ToolbarModel* toolbar_model, Profile* profile, CommandUpdater* command_updater, AutocompleteTextField* field); virtual ~AutocompleteEditViewMac(); // Implement the AutocompleteEditView interface. virtual AutocompleteEditModel* model(); virtual const AutocompleteEditModel* model() const; virtual void SaveStateToTab(TabContents* tab); virtual void Update(const TabContents* tab_for_state_restoring); virtual void OpenURL(const GURL& url, WindowOpenDisposition disposition, PageTransition::Type transition, const GURL& alternate_nav_url, size_t selected_line, const string16& keyword); virtual string16 GetText() const; virtual bool IsEditingOrEmpty() const; virtual int GetIcon() const; virtual void SetUserText(const string16& text); virtual void SetUserText(const string16& text, const string16& display_text, bool update_popup); virtual void SetWindowTextAndCaretPos(const string16& text, size_t caret_pos); virtual void SetForcedQuery(); virtual bool IsSelectAll(); virtual bool DeleteAtEndPressed(); virtual void GetSelectionBounds(string16::size_type* start, string16::size_type* end); virtual void SelectAll(bool reversed); virtual void RevertAll(); virtual void UpdatePopup(); virtual void ClosePopup(); virtual void SetFocus(); virtual void OnTemporaryTextMaybeChanged(const string16& display_text, bool save_original_selection); virtual bool OnInlineAutocompleteTextMaybeChanged( const string16& display_text, size_t user_text_length); virtual void OnStartingIME(); virtual void OnRevertTemporaryText(); virtual void OnBeforePossibleChange(); virtual bool OnAfterPossibleChange(); virtual gfx::NativeView GetNativeView() const; virtual CommandUpdater* GetCommandUpdater(); virtual void SetInstantSuggestion(const string16& input, bool animate_to_complete); virtual string16 GetInstantSuggestion() const; virtual int TextWidth() const; virtual bool IsImeComposing() const; // Implement the AutocompleteTextFieldObserver interface. virtual NSRange SelectionRangeForProposedRange(NSRange proposed_range); virtual void OnControlKeyChanged(bool pressed); virtual bool CanCopy(); virtual void CopyToPasteboard(NSPasteboard* pboard); virtual void OnPaste(); virtual bool CanPasteAndGo(); virtual int GetPasteActionStringId(); virtual void OnPasteAndGo(); virtual void OnFrameChanged(); virtual void OnDidBeginEditing(); virtual void OnBeforeChange(); virtual void OnDidChange(); virtual void OnDidEndEditing(); virtual bool OnDoCommandBySelector(SEL cmd); virtual void OnSetFocus(bool control_down); virtual void OnKillFocus(); // Helper for LocationBarViewMac. Optionally selects all in |field_|. void FocusLocation(bool select_all); // Helper to get appropriate contents from |clipboard|. Returns // empty string if no appropriate data is found on |clipboard|. static string16 GetClipboardText(ui::Clipboard* clipboard); // Helper to get the font to use in the field, exposed for the // popup. static NSFont* GetFieldFont(); // If |resource_id| has a PDF image which can be used, return it. // Otherwise return the PNG image from the resource bundle. static NSImage* ImageForResource(int resource_id); private: // Called when the user hits backspace in |field_|. Checks whether // keyword search is being terminated. Returns true if the // backspace should be intercepted (not forwarded on to the standard // machinery). bool OnBackspacePressed(); // Returns the field's currently selected range. Only valid if the // field has focus. NSRange GetSelectedRange() const; // Returns the field's currently marked range. Only valid if the field has // focus. NSRange GetMarkedRange() const; // Returns true if |field_| is first-responder in the window. Used // in various DCHECKS to make sure code is running in appropriate // situations. bool IsFirstResponder() const; // If |model_| believes it has focus, grab focus if needed and set // the selection to |range|. Otherwise does nothing. void SetSelectedRange(const NSRange range); // Update the field with |display_text| and highlight the host and scheme (if // it's an URL or URL-fragment). Resets any suggest text that may be present. void SetText(const string16& display_text); // Internal implementation of SetText. Does not reset the suggest text before // setting the display text. Most callers should use |SetText()| instead. void SetTextInternal(const string16& display_text); // Update the field with |display_text| and set the selection. void SetTextAndSelectedRange(const string16& display_text, const NSRange range); // Returns the non-suggest portion of |field_|'s string value. NSString* GetNonSuggestTextSubstring() const; // Returns the suggest portion of |field_|'s string value. NSString* GetSuggestTextSubstring() const; // Pass the current content of |field_| to SetText(), maintaining // any selection. Named to be consistent with GTK and Windows, // though here we cannot really do the in-place operation they do. void EmphasizeURLComponents(); // Calculates text attributes according to |display_text| and applies them // to the given |as| object. void ApplyTextAttributes(const string16& display_text, NSMutableAttributedString* as); // Return the number of UTF-16 units in the current buffer, excluding the // suggested text. NSUInteger GetTextLength() const; // Places the caret at the given position. This clears any selection. void PlaceCaretAt(NSUInteger pos); // Returns true if the caret is at the end of the content. bool IsCaretAtEnd() const; scoped_ptr<AutocompleteEditModel> model_; scoped_ptr<AutocompletePopupViewMac> popup_view_; AutocompleteEditController* controller_; ToolbarModel* toolbar_model_; // The object that handles additional command functionality exposed on the // edit, such as invoking the keyword editor. CommandUpdater* command_updater_; AutocompleteTextField* field_; // owned by tab controller // Selection at the point where the user started using the // arrows to move around in the popup. NSRange saved_temporary_selection_; // Tracking state before and after a possible change for reporting // to model_. NSRange selection_before_change_; string16 text_before_change_; NSRange marked_range_before_change_; // Length of the suggest text. The suggest text always appears at the end of // the field. size_t suggest_text_length_; // Was delete pressed? bool delete_was_pressed_; // Was the delete key pressed with an empty selection at the end of the edit? bool delete_at_end_pressed_; // The maximum/standard line height for the displayed text. CGFloat line_height_; DISALLOW_COPY_AND_ASSIGN(AutocompleteEditViewMac); }; #endif // CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_EDIT_VIEW_MAC_H_