| // Copyright 2016 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. |
| |
| #import "ios/chrome/browser/ui/history/history_search_view.h" |
| |
| #include "components/strings/grit/components_strings.h" |
| #include "ios/chrome/browser/ui/uikit_ui_util.h" |
| #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h" |
| #include "ui/base/l10n/l10n_util_mac.h" |
| |
| #if !defined(__has_feature) || !__has_feature(objc_arc) |
| #error "This file requires ARC support." |
| #endif |
| |
| namespace { |
| // Shadow opacity for the search view. |
| CGFloat kShadowOpacity = 0.2f; |
| // Margin for the search view. |
| CGFloat kHorizontalMargin = 16.0f; |
| } // namespace |
| |
| @interface HistorySearchView () |
| |
| // Stack view for laying out the text field and cancel button. |
| @property(nonatomic, strong) UIStackView* stackView; |
| // Text field for the search view. |
| @property(nonatomic, strong) UITextField* textField; |
| // Cancel button for dismissing the search view. |
| @property(nonatomic, strong) UIButton* cancelButton; |
| // Constraint for the top anchor. |
| @property(nonatomic, strong) NSLayoutConstraint* topAnchorConstraint; |
| |
| @end |
| |
| @implementation HistorySearchView |
| |
| @synthesize enabled = _enabled; |
| @synthesize stackView = _stackView; |
| @synthesize textField = _textField; |
| @synthesize cancelButton = _cancelButton; |
| @synthesize topAnchorConstraint = _topAnchorConstraint; |
| |
| - (instancetype)initWithFrame:(CGRect)frame { |
| self = [super initWithFrame:frame]; |
| if (self) { |
| [self setBackgroundColor:[UIColor whiteColor]]; |
| [[self layer] setShadowOpacity:kShadowOpacity]; |
| |
| _textField = [[UITextField alloc] init]; |
| _textField.contentVerticalAlignment = |
| UIControlContentVerticalAlignmentCenter; |
| _textField.backgroundColor = [UIColor whiteColor]; |
| _textField.textColor = |
| [UIColor colorWithWhite:0 alpha:[MDCTypography body1FontOpacity]]; |
| _textField.font = [MDCTypography subheadFont]; |
| _textField.borderStyle = UITextBorderStyleNone; |
| [_textField setLeftViewMode:UITextFieldViewModeNever]; |
| _textField.clearButtonMode = UITextFieldViewModeAlways; |
| _textField.placeholder = l10n_util::GetNSString(IDS_HISTORY_SEARCH_BUTTON); |
| |
| _cancelButton = [UIButton buttonWithType:UIButtonTypeCustom]; |
| [_cancelButton setImage:[UIImage imageNamed:@"collapse"] |
| forState:UIControlStateNormal]; |
| [_cancelButton setImage:[UIImage imageNamed:@"collapse_pressed"] |
| forState:UIControlStateHighlighted]; |
| [_cancelButton |
| setContentCompressionResistancePriority:UILayoutPriorityRequired |
| forAxis: |
| UILayoutConstraintAxisHorizontal]; |
| [_cancelButton setContentHuggingPriority:UILayoutPriorityRequired |
| forAxis:UILayoutConstraintAxisHorizontal]; |
| [_cancelButton setAccessibilityLabel:l10n_util::GetNSString(IDS_CANCEL)]; |
| |
| _stackView = [[UIStackView alloc] |
| initWithArrangedSubviews:@[ _textField, _cancelButton ]]; |
| _stackView.alignment = UIStackViewAlignmentFill; |
| _stackView.axis = UILayoutConstraintAxisHorizontal; |
| _stackView.distribution = UIStackViewDistributionFill; |
| [self addSubview:_stackView]; |
| _stackView.translatesAutoresizingMaskIntoConstraints = NO; |
| _stackView.layoutMarginsRelativeArrangement = YES; |
| |
| CGFloat topAnchorConstant = IsCompact() ? StatusBarHeight() : 0; |
| _topAnchorConstraint = |
| [_stackView.topAnchor constraintEqualToAnchor:self.topAnchor |
| constant:topAnchorConstant]; |
| [NSLayoutConstraint activateConstraints:@[ |
| _topAnchorConstraint, |
| [_stackView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor], |
| [_stackView.layoutMarginsGuide.leadingAnchor |
| constraintEqualToAnchor:self.leadingAnchor |
| constant:kHorizontalMargin], |
| [_stackView.layoutMarginsGuide.trailingAnchor |
| constraintEqualToAnchor:self.trailingAnchor |
| constant:-kHorizontalMargin], |
| ]]; |
| } |
| return self; |
| } |
| |
| - (BOOL)becomeFirstResponder { |
| return [self.textField becomeFirstResponder]; |
| } |
| |
| - (void)setEnabled:(BOOL)enabled { |
| _enabled = enabled; |
| self.cancelButton.enabled = enabled; |
| self.textField.enabled = enabled; |
| self.textField.clearButtonMode = |
| enabled ? UITextFieldViewModeAlways : UITextFieldViewModeNever; |
| } |
| |
| - (void)setCancelTarget:(id)target action:(SEL)action { |
| [_cancelButton addTarget:target |
| action:action |
| forControlEvents:UIControlEventTouchUpInside]; |
| } |
| |
| - (void)setSearchBarDelegate:(id<UITextFieldDelegate>)delegate { |
| [self.textField setDelegate:delegate]; |
| } |
| |
| - (void)clearText { |
| self.textField.text = nil; |
| } |
| |
| #pragma mark - UITraitEnvironment |
| |
| - (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { |
| self.topAnchorConstraint.constant = IsCompact() ? StatusBarHeight() : 0; |
| } |
| |
| @end |