blob: 55325ada7033d94ad4b0680bf2b4fa8b30f969eb [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_OMNIBOX_MODEL_OMNIBOX_TEXT_CONTROLLER_H_
#define IOS_CHROME_BROWSER_OMNIBOX_MODEL_OMNIBOX_TEXT_CONTROLLER_H_
#import <UIKit/UIKit.h>
#import <string>
#import "ios/chrome/browser/omnibox/model/omnibox_text_model.h"
@protocol AutocompleteSuggestion;
@class OmniboxAutocompleteController;
class OmniboxClient;
@protocol OmniboxFocusDelegate;
@protocol OmniboxTextControllerDelegate;
@class OmniboxTextFieldIOS;
/// Controller of the omnibox text.
@interface OmniboxTextController : NSObject
/// Delegate of the omnibox text controller.
@property(nonatomic, weak) id<OmniboxTextControllerDelegate> delegate;
/// Omnibox focus delegate.
@property(nonatomic, weak) id<OmniboxFocusDelegate> focusDelegate;
/// Controller of autocomplete.
@property(nonatomic, weak)
OmniboxAutocompleteController* omniboxAutocompleteController;
/// Omnibox textfield.
@property(nonatomic, weak) OmniboxTextFieldIOS* textField;
/// Returns the current selection range.
@property(nonatomic, assign, readonly) NSRange currentSelection;
/// Temporary initializer, used during the refactoring. crbug.com/390409559
- (instancetype)initWithOmniboxClient:(OmniboxClient*)omniboxClient
omniboxTextModel:(OmniboxTextModel*)omniboxTextModel
inLensOverlay:(BOOL)inLensOverlay
NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
/// Removes all C++ references.
- (void)disconnect;
/// Updates the omnibox text based on its current client state.
- (void)updateAppearance;
/// Returns whether the omnibox is first responder.
- (BOOL)isOmniboxFirstResponder;
/// Focuses the omnibox.
- (void)focusOmnibox;
/// Ends omnibox editing / defocus the omnibox.
- (void)endEditing;
/// Inserts text into the omnibox without triggering autocomplete.
- (void)insertTextToOmnibox:(NSString*)text;
/// Notifies the client about input changes.
- (void)notifyClientOnUserInputInProgressChange:(BOOL)changedToUserInProgress;
/// Retrieves the current textfield selection bounds.
- (void)getSelectionBounds:(size_t*)start end:(size_t*)end;
/// Reverts the edit and popup back to their unedited state (permanent text
/// showing, popup closed, no user input in progress).
- (void)revertAll;
/// Returns the current text field displayed text.
- (std::u16string)displayedText;
/// Updates the text model input_in_progress state.
- (void)setInputInProgress:(BOOL)inProgress;
/// Reverts the text model back to its unedited state (permanent text showing,
/// no user input in progress).
- (void)revertState;
/// Copies a match corresponding to the current text into `match`, and
/// populates `alternate_nav_url` as well if it's not nullptr. If the popup
/// is closed, the match is generated from the autocomplete classifier.
- (void)getInfoForCurrentText:(AutocompleteMatch*)match
alternateNavigationURL:(GURL*)alternateNavigationURL;
/// Sets the user_text_ to `text`. Also enters user-input-in-progress mode.
/// Virtual for testing.
- (void)setUserText:(const std::u16string&)text;
/// Returns the match for the current text. If the user has not edited the text
/// this is the match corresponding to the permanent text. Returns the
/// alternate nav URL, if `alternateNavURL` is non-NULL and there is such a
/// URL.
- (AutocompleteMatch)currentMatch:(GURL*)alternateNavURL;
/// Invoked any time the text may have changed in the edit.
- (void)onTextChanged;
/// Called when any relevant data changes. This rolls together several
/// separate pieces of data into one call so we can update all the UI
/// efficiently. Specifically, it's invoked for autocompletion.
/// `inline_autocompletion` is the autocompletion.
/// `additional_text` is additional omnibox text to be displayed adjacent to
/// the omnibox view.
/// `new_match` is the selected match when the user is changing selection,
/// the default match if the user is typing, or an empty match when
/// selecting a header.
- (void)onPopupDataChanged:(const std::u16string&)inlineAutocompletion
additionalText:(const std::u16string&)additionalText
newMatch:(const AutocompleteMatch&)newMatch;
/// Resets the permanent display texts `url_for_editing` to those provided by
/// the controller. Returns true if the display text shave changed and the
/// change should be immediately user-visible, because either the user is not
/// editing or the edit does not have focus.
- (bool)resetDisplayTexts;
#pragma mark - Autocomplete event
/// Sets the additional text.
- (void)setAdditionalText:(const std::u16string&)text;
#pragma mark - Omnibox text event
/// Called when the user removes the additional text.
- (void)onUserRemoveAdditionalText;
/// Called when a thumbnail is set.
- (void)onThumbnailSet:(BOOL)hasThumbnail;
/// Called when the thumbnail has been removed during omnibox edit.
- (void)onUserRemoveThumbnail;
/// Clears the Omnibox text.
- (void)clearText;
/// Accepts the current input / default suggestion.
- (void)acceptInput;
/// Prepares the omnibox for scribble.
- (void)prepareForScribble;
/// Cleans up the omnibox after scribble.
- (void)cleanupAfterScribble;
/// Called when the text input mode changed.
- (void)onTextInputModeChange;
/// Called when the omnibox text field starts editing.
- (void)onDidBeginEditing;
/// Called before the omnibox text field changes. `newText` will replace the
/// text currently in `range`.
- (BOOL)shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString*)newText;
/// Called after the omnibox text field changes.
/// `processingUserEvent`: Whether the change is user initiated.
- (void)textDidChangeWithUserEvent:(BOOL)isProcessingUserEvent;
/// Called when autocomplete text is accepted. (e.g. tap on autocomplete text,
/// tap on left/right arrow key).
- (void)onAcceptAutocomplete;
/// Called when the Omnibox text field should copy.
- (void)onCopy;
/// Called when the Omnibox text field should paste.
- (void)willPaste;
/// Called when the backspace button is pressed in the Omnibox text field.
- (void)onDeleteBackward;
#pragma mark - Omnibox popup event
/// Sets the currently previewed autocomplete suggestion.
- (void)previewSuggestion:(id<AutocompleteSuggestion>)suggestion
isFirstUpdate:(BOOL)isFirstUpdate;
/// Notifies of scroll event.
- (void)onScroll;
/// Hides the keyboard.
- (void)hideKeyboard;
/// Refines omnibox content with `text`.
- (void)refineWithText:(const std::u16string&)text;
#pragma mark - Private event
// Events that are private. Removed from header after refactoring
// (crbug.com/390409559). Since these methods should be private, comments are in
// the implementation file.
- (void)setCaretPos:(NSUInteger)caretPos;
- (void)startAutocompleteAfterEdit;
- (void)setWindowText:(const std::u16string&)text
caretPos:(size_t)caretPos
startAutocomplete:(BOOL)startAutocomplete
notifyTextChanged:(BOOL)notifyTextChanged;
- (void)updateAutocompleteIfTextChanged:(const std::u16string&)userText
autocompletion:
(const std::u16string&)inlineAutocomplete;
@end
#endif // IOS_CHROME_BROWSER_OMNIBOX_MODEL_OMNIBOX_TEXT_CONTROLLER_H_