| // Copyright 2015 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/settings/autofill_edit_collection_view_controller.h" |
| |
| #include "base/logging.h" |
| #import "base/mac/foundation_util.h" |
| #import "ios/chrome/browser/ui/autofill/autofill_edit_accessory_view.h" |
| #import "ios/chrome/browser/ui/autofill/cells/legacy_autofill_edit_item.h" |
| #import "ios/chrome/browser/ui/settings/autofill_edit_collection_view_controller+protected.h" |
| #import "ios/third_party/material_components_ios/src/components/CollectionCells/src/MaterialCollectionCells.h" |
| |
| #if !defined(__has_feature) || !__has_feature(objc_arc) |
| #error "This file requires ARC support." |
| #endif |
| |
| namespace { |
| |
| LegacyAutofillEditCell* AutofillEditCellForTextField(UITextField* textField) { |
| LegacyAutofillEditCell* settingsCell = nil; |
| for (UIView* view = textField; view; view = [view superview]) { |
| LegacyAutofillEditCell* cell = |
| base::mac::ObjCCast<LegacyAutofillEditCell>(view); |
| if (cell) { |
| settingsCell = cell; |
| break; |
| } |
| } |
| |
| // There should be a cell associated with this text field. |
| DCHECK(settingsCell); |
| return settingsCell; |
| } |
| |
| } // namespace |
| |
| @interface AutofillEditCollectionViewController ()< |
| AutofillEditAccessoryDelegate> { |
| LegacyAutofillEditCell* _currentEditingCell; |
| AutofillEditAccessoryView* _accessoryView; |
| } |
| @end |
| |
| @implementation AutofillEditCollectionViewController |
| |
| - (instancetype)initWithLayout:(UICollectionViewLayout*)layout |
| style:(CollectionViewControllerStyle)style { |
| self = [super initWithLayout:layout style:style]; |
| if (!self) { |
| return nil; |
| } |
| |
| _accessoryView = [[AutofillEditAccessoryView alloc] initWithDelegate:self]; |
| [self setShouldHideDoneButton:YES]; |
| [self updateEditButton]; |
| return self; |
| } |
| |
| - (void)viewDidAppear:(BOOL)animated { |
| [super viewDidAppear:animated]; |
| [[NSNotificationCenter defaultCenter] |
| addObserver:self |
| selector:@selector(keyboardDidShow) |
| name:UIKeyboardDidShowNotification |
| object:nil]; |
| } |
| |
| - (void)viewWillDisappear:(BOOL)animated { |
| [super viewWillDisappear:animated]; |
| [[NSNotificationCenter defaultCenter] |
| removeObserver:self |
| name:UIKeyboardDidShowNotification |
| object:nil]; |
| } |
| |
| #pragma mark - SettingsRootCollectionViewController |
| |
| - (BOOL)shouldShowEditButton { |
| return YES; |
| } |
| |
| - (BOOL)editButtonEnabled { |
| return YES; |
| } |
| |
| - (NSIndexPath*)indexForCellPathWithOffset:(NSInteger)offset |
| fromPath:(NSIndexPath*)cellPath { |
| if (!cellPath || !offset) |
| return nil; |
| |
| NSInteger cellSection = [cellPath section]; |
| NSInteger nextCellRow = [cellPath row] + offset; |
| |
| if (nextCellRow >= 0 && |
| nextCellRow < [[self collectionView] numberOfItemsInSection:cellSection]) |
| return [NSIndexPath indexPathForRow:nextCellRow inSection:cellSection]; |
| |
| NSInteger nextCellSection = cellSection + offset; |
| if (nextCellSection >= 0 && |
| nextCellSection < [[self collectionView] numberOfSections]) |
| return [NSIndexPath indexPathForRow:0 inSection:nextCellSection]; |
| |
| return nil; |
| } |
| |
| #pragma mark - UITextFieldDelegate |
| |
| - (void)textFieldDidBeginEditing:(UITextField*)textField { |
| LegacyAutofillEditCell* cell = AutofillEditCellForTextField(textField); |
| _currentEditingCell = cell; |
| [textField setInputAccessoryView:_accessoryView]; |
| [self updateAccessoryViewButtonState]; |
| } |
| |
| - (void)textFieldDidEndEditing:(UITextField*)textField { |
| LegacyAutofillEditCell* cell = AutofillEditCellForTextField(textField); |
| DCHECK(_currentEditingCell == cell); |
| [textField setInputAccessoryView:nil]; |
| _currentEditingCell = nil; |
| } |
| |
| - (BOOL)textFieldShouldReturn:(UITextField*)textField { |
| DCHECK([_currentEditingCell textField] == textField); |
| [self nextPressed]; |
| return NO; |
| } |
| |
| #pragma mark - AutofillEditAccessoryDelegate |
| |
| - (void)nextPressed { |
| [self moveToAnotherCellWithOffset:1]; |
| } |
| |
| - (void)previousPressed { |
| [self moveToAnotherCellWithOffset:-1]; |
| } |
| |
| - (void)closePressed { |
| [[_currentEditingCell textField] resignFirstResponder]; |
| } |
| |
| #pragma mark - Helper methods |
| |
| - (NSIndexPath*)indexPathForCurrentTextField { |
| DCHECK(_currentEditingCell); |
| return [[self collectionView] indexPathForCell:_currentEditingCell]; |
| } |
| |
| - (void)moveToAnotherCellWithOffset:(NSInteger)offset { |
| UICollectionView* collectionView = [self collectionView]; |
| NSIndexPath* cellPath = [self indexPathForCurrentTextField]; |
| DCHECK(cellPath); |
| NSIndexPath* nextCellPath = |
| [self indexForCellPathWithOffset:offset fromPath:cellPath]; |
| |
| if (!nextCellPath) { |
| [[_currentEditingCell textField] resignFirstResponder]; |
| } else { |
| LegacyAutofillEditCell* nextCell = |
| base::mac::ObjCCastStrict<LegacyAutofillEditCell>( |
| [collectionView cellForItemAtIndexPath:nextCellPath]); |
| [nextCell.textField becomeFirstResponder]; |
| } |
| } |
| |
| - (void)updateAccessoryViewButtonState { |
| NSIndexPath* currentPath = [self indexPathForCurrentTextField]; |
| NSIndexPath* nextPath = |
| [self indexForCellPathWithOffset:1 fromPath:currentPath]; |
| NSIndexPath* previousPath = |
| [self indexForCellPathWithOffset:-1 fromPath:currentPath]; |
| |
| [[_accessoryView previousButton] setEnabled:previousPath != nil]; |
| [[_accessoryView nextButton] setEnabled:nextPath != nil]; |
| } |
| |
| #pragma mark - Keyboard handling |
| |
| - (void)keyboardDidShow { |
| [self.collectionView scrollRectToVisible:[_currentEditingCell frame] |
| animated:YES]; |
| } |
| |
| @end |