chromium/ios/chrome/browser/ui/omnibox/popup/autocomplete_suggestion.h

// Copyright 2017 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_UI_OMNIBOX_POPUP_AUTOCOMPLETE_SUGGESTION_H_
#define IOS_CHROME_BROWSER_UI_OMNIBOX_POPUP_AUTOCOMPLETE_SUGGESTION_H_

#import <UIKit/UIKit.h>

@protocol OmniboxIcon;
@protocol OmniboxPedal;
@class CrURL;
@class SuggestAction;

/// Copy of `SuggestTileType` enum in histograms.
typedef NS_ENUM(NSUInteger, SuggestTileType) {
  kOther = 0,
  kURL = 1,
  kSearch = 2,
  kCount = 3
};

/// Represents an autocomplete suggestion in UI.
@protocol AutocompleteSuggestion <NSObject>
/// Some suggestions can be deleted with a swipe-to-delete gesture.
@property(nonatomic, readonly) BOOL supportsDeletion;
/// Some suggestions are answers that are displayed inline, such as for weather
/// or calculator.
@property(nonatomic, readonly) BOOL hasAnswer;
/// Some suggestions represent a URL, for example the ones from history.
@property(nonatomic, readonly) BOOL isURL;
/// Some suggestions can be appended to omnibox text in order to refine the
/// query or URL.
@property(nonatomic, readonly) BOOL isAppendable;
/// Some suggestions are opened in an other tab.
@property(nonatomic, readonly) BOOL isTabMatch;
/// Text of the suggestion.
@property(nonatomic, readonly) NSAttributedString* text;
/// Second line of text.
@property(nonatomic, readonly) NSAttributedString* detailText;
/// Suggested number of lines to format `detailText`.
@property(nonatomic, readonly) NSInteger numberOfLines;

/// Either nil or NSNumber-wrapped omnibox::GroupId.
@property(nonatomic, readonly, strong) NSNumber* suggestionGroupId;
/// Either nil or NSNumber-wrapped omnibox::GroupSection.
@property(nonatomic, readonly, strong) NSNumber* suggestionSectionId;

/// Text to use in the omnibox when the suggestion is highlighted.
/// Effectively an accessor for fill_into_edit.
@property(nonatomic, readonly) NSAttributedString* omniboxPreviewText;

@property(nonatomic, readonly) id<OmniboxIcon> icon;

@property(nonatomic, readonly) id<OmniboxPedal, OmniboxIcon> pedal;

/// Icon corresponding to the suggestion's autocomplete match type, e.g.
/// History, Search, or Stock.
/// Ignores `starred` status of the suggestion.
@property(nonatomic, readonly) UIImage* matchTypeIcon;
/// Accessibility identifier of the icon corresponding to the suggestion's
/// autocomplete match type.
@property(nonatomic, readonly) NSString* matchTypeIconAccessibilityIdentifier;
/// Whether this is a search suggestion (as opposed to URL suggestion)
@property(nonatomic, readonly, getter=isMatchTypeSearch) BOOL matchTypeSearch;
/// Whether the text of the suggestion can wrap on multiple lines.
@property(nonatomic, readonly) BOOL isWrapping;
/// For URL suggestions, the URL that the match represents.
@property(nonatomic, readonly) CrURL* destinationUrl;
/// Suggestion attached actions in suggest.
@property(nonatomic, readonly) NSArray<SuggestAction*>* actionsInSuggest;

#pragma mark tail suggest

/// Yes if this is a tail suggestion. Used by the popup to display according to
/// tail suggest standards.
@property(nonatomic, readonly) BOOL isTailSuggestion;

/// Common prefix for tail suggestions. Empty otherwise.
@property(nonatomic, readonly, copy) NSString* commonPrefix;

@end

typedef NS_ENUM(NSUInteger, SuggestionGroupDisplayStyle) {
  SuggestionGroupDisplayStyleDefault,   // Vertical list.
  SuggestionGroupDisplayStyleCarousel,  // Horizontal scrolling icons.
};

/// A group of AutocompleteSuggestions with an optional section header.
@protocol AutocompleteSuggestionGroup

/// Optional title.
@property(nonatomic, copy, readonly) NSString* title;

/// Contained suggestions.
@property(nonatomic, strong, readonly)
    NSArray<id<AutocompleteSuggestion>>* suggestions;

/// How suggestion are displayed.
@property(nonatomic, readonly) SuggestionGroupDisplayStyle displayStyle;

@end

#endif  // IOS_CHROME_BROWSER_UI_OMNIBOX_POPUP_AUTOCOMPLETE_SUGGESTION_H_