| // Copyright 2018 The Chromium Authors |
| // 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/bookmarks/cells/bookmark_text_field_item.h" |
| |
| #import "base/apple/foundation_util.h" |
| #import "base/check_op.h" |
| #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" |
| #import "ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h" |
| #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" |
| #import "ios/chrome/common/ui/colors/semantic_color_names.h" |
| #import "ios/chrome/common/ui/util/constraints_ui_util.h" |
| #import "ios/chrome/grit/ios_strings.h" |
| #import "ui/base/l10n/l10n_util_mac.h" |
| |
| #pragma mark - BookmarkTextFieldItem |
| |
| @implementation BookmarkTextFieldItem |
| |
| @synthesize text = _text; |
| @synthesize placeholder = _placeholder; |
| @synthesize delegate = _delegate; |
| |
| - (instancetype)initWithType:(NSInteger)type { |
| self = [super initWithType:type]; |
| self.cellClass = [BookmarkTextFieldCell class]; |
| return self; |
| } |
| |
| #pragma mark TableViewItem |
| |
| - (void)configureCell:(TableViewCell*)tableCell |
| withStyler:(ChromeTableViewStyler*)styler { |
| [super configureCell:tableCell withStyler:styler]; |
| |
| BookmarkTextFieldCell* cell = |
| base::apple::ObjCCastStrict<BookmarkTextFieldCell>(tableCell); |
| cell.textField.text = self.text; |
| cell.titleLabel.text = self.placeholder; |
| cell.textField.placeholder = self.placeholder; |
| cell.textField.tag = self.type; |
| [cell.textField addTarget:self |
| action:@selector(textFieldDidChange:) |
| forControlEvents:UIControlEventEditingChanged]; |
| cell.textField.delegate = self.delegate; |
| cell.textField.accessibilityLabel = self.text; |
| cell.textField.accessibilityIdentifier = |
| [NSString stringWithFormat:@"%@_textField", self.accessibilityIdentifier]; |
| cell.selectionStyle = UITableViewCellSelectionStyleNone; |
| } |
| |
| #pragma mark UIControlEventEditingChanged |
| |
| - (void)textFieldDidChange:(UITextField*)textField { |
| DCHECK_EQ(textField.tag, self.type); |
| self.text = textField.text; |
| [self.delegate textDidChangeForItem:self]; |
| } |
| |
| @end |
| |
| #pragma mark - BookmarkTextFieldCell |
| |
| @interface BookmarkTextFieldCell () |
| // Stack view to display label / value which we'll switch from horizontal to |
| // vertical based on preferredContentSizeCategory. |
| @property(nonatomic, strong) UIStackView* stackView; |
| @end |
| |
| @implementation BookmarkTextFieldCell |
| @synthesize textField = _textField; |
| @synthesize titleLabel = _titleLabel; |
| @synthesize stackView = _stackView; |
| |
| - (instancetype)initWithStyle:(UITableViewCellStyle)style |
| reuseIdentifier:(NSString*)reuseIdentifier { |
| self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; |
| if (!self) { |
| return nil; |
| } |
| |
| // Label. |
| self.titleLabel = [[UILabel alloc] init]; |
| self.titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; |
| self.titleLabel.adjustsFontForContentSizeCategory = YES; |
| [self.titleLabel setContentHuggingPriority:UILayoutPriorityRequired |
| forAxis:UILayoutConstraintAxisHorizontal]; |
| [self.titleLabel |
| setContentCompressionResistancePriority:UILayoutPriorityRequired |
| forAxis:UILayoutConstraintAxisHorizontal]; |
| [self.titleLabel |
| setContentCompressionResistancePriority:UILayoutPriorityRequired |
| forAxis:UILayoutConstraintAxisVertical]; |
| |
| // Textfield. |
| self.textField = [[UITextField alloc] init]; |
| self.textField.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; |
| self.textField.adjustsFontForContentSizeCategory = YES; |
| self.textField.textColor = [BookmarkTextFieldCell textColorForEditing:NO]; |
| self.textField.clearButtonMode = UITextFieldViewModeWhileEditing; |
| self.textField.textAlignment = NSTextAlignmentRight; |
| [self.textField setContentHuggingPriority:UILayoutPriorityDefaultLow |
| forAxis:UILayoutConstraintAxisHorizontal]; |
| [self.textField |
| setContentCompressionResistancePriority:UILayoutPriorityRequired |
| forAxis:UILayoutConstraintAxisVertical]; |
| |
| // StackView. |
| self.stackView = [[UIStackView alloc] |
| initWithArrangedSubviews:@[ self.titleLabel, self.textField ]]; |
| self.stackView.axis = UILayoutConstraintAxisHorizontal; |
| self.stackView.spacing = kBookmarkCellViewSpacing; |
| self.stackView.distribution = UIStackViewDistributionFill; |
| self.stackView.alignment = UIStackViewAlignmentCenter; |
| [self.stackView |
| setContentCompressionResistancePriority:UILayoutPriorityRequired |
| forAxis:UILayoutConstraintAxisVertical]; |
| self.stackView.translatesAutoresizingMaskIntoConstraints = NO; |
| [self.contentView addSubview:self.stackView]; |
| |
| // Set up constraints. |
| AddSameConstraintsToSidesWithInsets( |
| self.stackView, self.contentView, |
| LayoutSides::kLeading | LayoutSides::kTrailing | LayoutSides::kBottom | |
| LayoutSides::kTop, |
| NSDirectionalEdgeInsetsMake( |
| kBookmarkCellVerticalInset, kBookmarkCellHorizontalLeadingInset, |
| kBookmarkCellVerticalInset, kBookmarkCellHorizontalTrailingInset)); |
| |
| [self applyContentSizeCategoryStyles]; |
| |
| return self; |
| } |
| |
| - (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { |
| [super traitCollectionDidChange:previousTraitCollection]; |
| if (self.traitCollection.preferredContentSizeCategory != |
| previousTraitCollection.preferredContentSizeCategory) { |
| [self applyContentSizeCategoryStyles]; |
| } |
| } |
| |
| - (void)applyContentSizeCategoryStyles { |
| if (UIContentSizeCategoryIsAccessibilityCategory( |
| UIScreen.mainScreen.traitCollection.preferredContentSizeCategory)) { |
| self.stackView.axis = UILayoutConstraintAxisVertical; |
| self.stackView.alignment = UIStackViewAlignmentLeading; |
| self.textField.textAlignment = NSTextAlignmentLeft; |
| } else { |
| self.stackView.axis = UILayoutConstraintAxisHorizontal; |
| self.stackView.alignment = UIStackViewAlignmentCenter; |
| self.textField.textAlignment = NSTextAlignmentRight; |
| } |
| } |
| |
| + (UIColor*)textColorForEditing:(BOOL)editing { |
| return editing ? [UIColor colorNamed:kTextPrimaryColor] |
| : [UIColor colorNamed:kTextSecondaryColor]; |
| } |
| |
| - (void)prepareForReuse { |
| [super prepareForReuse]; |
| [self.textField resignFirstResponder]; |
| [self.textField removeTarget:nil |
| action:NULL |
| forControlEvents:UIControlEventAllEvents]; |
| self.textField.delegate = nil; |
| self.textField.text = nil; |
| } |
| |
| @end |