| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "ios/chrome/browser/ui/find_bar/find_bar_view.h" | 5 #import "ios/chrome/browser/ui/find_bar/find_bar_view.h" |
| 6 | 6 |
| 7 #include "base/mac/scoped_nsobject.h" | |
| 8 #include "components/strings/grit/components_strings.h" | 7 #include "components/strings/grit/components_strings.h" |
| 9 #import "ios/chrome/browser/ui/commands/UIKit+ChromeExecuteCommand.h" | 8 #import "ios/chrome/browser/ui/commands/UIKit+ChromeExecuteCommand.h" |
| 10 #import "ios/chrome/browser/ui/commands/ios_command_ids.h" | 9 #import "ios/chrome/browser/ui/commands/ios_command_ids.h" |
| 11 #import "ios/chrome/browser/ui/find_bar/find_bar_touch_forwarding_view.h" | 10 #import "ios/chrome/browser/ui/find_bar/find_bar_touch_forwarding_view.h" |
| 12 #import "ios/chrome/browser/ui/uikit_ui_util.h" | 11 #import "ios/chrome/browser/ui/uikit_ui_util.h" |
| 13 #include "ios/chrome/grit/ios_strings.h" | 12 #include "ios/chrome/grit/ios_strings.h" |
| 14 #import "ios/third_party/material_components_ios/src/components/Typography/src/M
aterialTypography.h" | 13 #import "ios/third_party/material_components_ios/src/components/Typography/src/M
aterialTypography.h" |
| 15 #include "ui/base/l10n/l10n_util_mac.h" | 14 #include "ui/base/l10n/l10n_util_mac.h" |
| 16 #import "ui/gfx/ios/NSString+CrStringDrawing.h" | 15 #import "ui/gfx/ios/NSString+CrStringDrawing.h" |
| 17 | 16 |
| 17 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 18 #error "This file requires ARC support." |
| 19 #endif |
| 20 |
| 18 NSString* const kFindInPageInputFieldId = @"kFindInPageInputFieldId"; | 21 NSString* const kFindInPageInputFieldId = @"kFindInPageInputFieldId"; |
| 19 NSString* const kFindInPageNextButtonId = @"kFindInPageNextButtonId"; | 22 NSString* const kFindInPageNextButtonId = @"kFindInPageNextButtonId"; |
| 20 NSString* const kFindInPagePreviousButtonId = @"kFindInPagePreviousButtonId"; | 23 NSString* const kFindInPagePreviousButtonId = @"kFindInPagePreviousButtonId"; |
| 21 NSString* const kFindInPageCloseButtonId = @"kFindInPageCloseButtonId"; | 24 NSString* const kFindInPageCloseButtonId = @"kFindInPageCloseButtonId"; |
| 22 | 25 |
| 23 @interface FindBarView () | 26 @interface FindBarView () |
| 24 | 27 |
| 25 // The overlay that shows number of results in format "1 of 13". | 28 // The overlay that shows number of results in format "1 of 13". |
| 26 @property(nonatomic, assign) UILabel* resultsLabel; | 29 @property(nonatomic, weak) UILabel* resultsLabel; |
| 27 @property(nonatomic, assign) UIView* separator; | 30 @property(nonatomic, weak) UIView* separator; |
| 28 | 31 |
| 29 // Initializes all subviews. | 32 // Initializes all subviews. |
| 30 - (void)setupSubviews; | 33 - (void)setupSubviews; |
| 31 // Sets up appearance of subviews, such as fonts, background colors. | 34 // Sets up appearance of subviews, such as fonts, background colors. |
| 32 - (void)configureApperance:(BOOL)isDark; | 35 - (void)configureApperance:(BOOL)isDark; |
| 33 // Convenience method that returns images for light and dark appearances. | 36 // Convenience method that returns images for light and dark appearances. |
| 34 - (UIImage*)imageWithName:(NSString*)imageName isDark:(BOOL)isDark; | 37 - (UIImage*)imageWithName:(NSString*)imageName isDark:(BOOL)isDark; |
| 35 | 38 |
| 36 @end | 39 @end |
| 37 | 40 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 58 self.resultsLabel.hidden = (text.length == 0); | 61 self.resultsLabel.hidden = (text.length == 0); |
| 59 self.resultsLabel.text = text; | 62 self.resultsLabel.text = text; |
| 60 } | 63 } |
| 61 | 64 |
| 62 #pragma mark - Internal | 65 #pragma mark - Internal |
| 63 | 66 |
| 64 - (void)setupSubviews { | 67 - (void)setupSubviews { |
| 65 [self setBackgroundColor:[UIColor clearColor]]; | 68 [self setBackgroundColor:[UIColor clearColor]]; |
| 66 | 69 |
| 67 // Input field. | 70 // Input field. |
| 68 base::scoped_nsobject<UITextField> inputFieldScoped( | 71 UITextField* inputFieldScoped = |
| 69 [[UITextField alloc] initWithFrame:CGRectZero]); | 72 [[UITextField alloc] initWithFrame:CGRectZero]; |
| 70 self.inputField = inputFieldScoped; | 73 self.inputField = inputFieldScoped; |
| 71 self.inputField.backgroundColor = [UIColor clearColor]; | 74 self.inputField.backgroundColor = [UIColor clearColor]; |
| 72 self.inputField.tag = IDC_FIND_UPDATE; | 75 self.inputField.tag = IDC_FIND_UPDATE; |
| 73 self.inputField.translatesAutoresizingMaskIntoConstraints = NO; | 76 self.inputField.translatesAutoresizingMaskIntoConstraints = NO; |
| 74 self.inputField.placeholder = | 77 self.inputField.placeholder = |
| 75 l10n_util::GetNSString(IDS_IOS_PLACEHOLDER_FIND_IN_PAGE); | 78 l10n_util::GetNSString(IDS_IOS_PLACEHOLDER_FIND_IN_PAGE); |
| 76 | 79 |
| 77 // Label containing number of found results. | 80 // Label containing number of found results. |
| 78 base::scoped_nsobject<UILabel> resultsLabelScoped( | 81 UILabel* resultsLabelScoped = [[UILabel alloc] initWithFrame:CGRectZero]; |
| 79 [[UILabel alloc] initWithFrame:CGRectZero]); | |
| 80 self.resultsLabel = resultsLabelScoped; | 82 self.resultsLabel = resultsLabelScoped; |
| 81 self.resultsLabel.textColor = [UIColor lightGrayColor]; | 83 self.resultsLabel.textColor = [UIColor lightGrayColor]; |
| 82 self.resultsLabel.font = [UIFont systemFontOfSize:14]; | 84 self.resultsLabel.font = [UIFont systemFontOfSize:14]; |
| 83 [self.resultsLabel | 85 [self.resultsLabel |
| 84 setContentCompressionResistancePriority:UILayoutPriorityRequired | 86 setContentCompressionResistancePriority:UILayoutPriorityRequired |
| 85 forAxis:UILayoutConstraintAxisHorizontal]; | 87 forAxis:UILayoutConstraintAxisHorizontal]; |
| 86 [self.resultsLabel | 88 [self.resultsLabel |
| 87 setContentHuggingPriority:UILayoutPriorityRequired | 89 setContentHuggingPriority:UILayoutPriorityRequired |
| 88 forAxis:UILayoutConstraintAxisHorizontal]; | 90 forAxis:UILayoutConstraintAxisHorizontal]; |
| 89 | 91 |
| 90 // Stack view that holds |inputField| and |resultsLabel|. | 92 // Stack view that holds |inputField| and |resultsLabel|. |
| 91 base::scoped_nsobject<UIStackView> inputStackView([[UIStackView alloc] | 93 UIStackView* inputStackView = [[UIStackView alloc] |
| 92 initWithArrangedSubviews:@[ inputFieldScoped, resultsLabelScoped ]]); | 94 initWithArrangedSubviews:@[ inputFieldScoped, resultsLabelScoped ]]; |
| 93 [inputStackView setLayoutMargins:UIEdgeInsetsMake(0, 12, 0, 12)]; | 95 [inputStackView setLayoutMargins:UIEdgeInsetsMake(0, 12, 0, 12)]; |
| 94 [inputStackView setLayoutMarginsRelativeArrangement:YES]; | 96 [inputStackView setLayoutMarginsRelativeArrangement:YES]; |
| 95 [inputStackView setSpacing:12]; | 97 [inputStackView setSpacing:12]; |
| 96 [inputStackView setTranslatesAutoresizingMaskIntoConstraints:NO]; | 98 [inputStackView setTranslatesAutoresizingMaskIntoConstraints:NO]; |
| 97 [self addSubview:inputStackView]; | 99 [self addSubview:inputStackView]; |
| 98 | 100 |
| 99 base::scoped_nsobject<NSMutableArray> constraints( | 101 NSMutableArray* constraints = [[NSMutableArray alloc] init]; |
| 100 [[NSMutableArray alloc] init]); | |
| 101 [constraints addObjectsFromArray:@[ | 102 [constraints addObjectsFromArray:@[ |
| 102 [[inputStackView leadingAnchor] constraintEqualToAnchor:self.leadingAnchor], | 103 [[inputStackView leadingAnchor] constraintEqualToAnchor:self.leadingAnchor], |
| 103 [[inputStackView topAnchor] constraintEqualToAnchor:self.topAnchor], | 104 [[inputStackView topAnchor] constraintEqualToAnchor:self.topAnchor], |
| 104 [[inputStackView bottomAnchor] constraintEqualToAnchor:self.bottomAnchor], | 105 [[inputStackView bottomAnchor] constraintEqualToAnchor:self.bottomAnchor], |
| 105 ]]; | 106 ]]; |
| 106 | 107 |
| 107 // Touch-forwarding view is put on top of |inputStackView| to forward touches | 108 // Touch-forwarding view is put on top of |inputStackView| to forward touches |
| 108 // to |inputField|. | 109 // to |inputField|. |
| 109 // Unlike a gesture recognizer, forwarding all touch events allows for using | 110 // Unlike a gesture recognizer, forwarding all touch events allows for using |
| 110 // long press, pinch and other manipulatiosn on the target textfield. | 111 // long press, pinch and other manipulatiosn on the target textfield. |
| 111 base::scoped_nsobject<FindBarTouchForwardingView> forwarder( | 112 FindBarTouchForwardingView* forwarder = |
| 112 [[FindBarTouchForwardingView alloc] init]); | 113 [[FindBarTouchForwardingView alloc] init]; |
| 113 [forwarder setTargetView:self.inputField]; | 114 [forwarder setTargetView:self.inputField]; |
| 114 [self addSubview:forwarder]; | 115 [self addSubview:forwarder]; |
| 115 [constraints addObjectsFromArray:@[ | 116 [constraints addObjectsFromArray:@[ |
| 116 [[forwarder leadingAnchor] | 117 [[forwarder leadingAnchor] |
| 117 constraintEqualToAnchor:[inputStackView leadingAnchor]], | 118 constraintEqualToAnchor:[inputStackView leadingAnchor]], |
| 118 [[forwarder topAnchor] constraintEqualToAnchor:[inputStackView topAnchor]], | 119 [[forwarder topAnchor] constraintEqualToAnchor:[inputStackView topAnchor]], |
| 119 [[forwarder bottomAnchor] | 120 [[forwarder bottomAnchor] |
| 120 constraintEqualToAnchor:[inputStackView bottomAnchor]], | 121 constraintEqualToAnchor:[inputStackView bottomAnchor]], |
| 121 [[forwarder trailingAnchor] | 122 [[forwarder trailingAnchor] |
| 122 constraintEqualToAnchor:[inputStackView trailingAnchor]], | 123 constraintEqualToAnchor:[inputStackView trailingAnchor]], |
| 123 ]]; | 124 ]]; |
| 124 [forwarder setTranslatesAutoresizingMaskIntoConstraints:NO]; | 125 [forwarder setTranslatesAutoresizingMaskIntoConstraints:NO]; |
| 125 | 126 |
| 126 // Thin line separator between buttons and input. | 127 // Thin line separator between buttons and input. |
| 127 base::scoped_nsobject<UIView> separatorScoped( | 128 UIView* separatorScoped = [[UIView alloc] initWithFrame:CGRectZero]; |
| 128 [[UIView alloc] initWithFrame:CGRectZero]); | |
| 129 UIView* separator = separatorScoped; | 129 UIView* separator = separatorScoped; |
| 130 separator.backgroundColor = [UIColor colorWithWhite:0.83 alpha:1]; | 130 separator.backgroundColor = [UIColor colorWithWhite:0.83 alpha:1]; |
| 131 [self addSubview:separator]; | 131 [self addSubview:separator]; |
| 132 [constraints addObjectsFromArray:@[ | 132 [constraints addObjectsFromArray:@[ |
| 133 [separator.widthAnchor constraintEqualToConstant:1], | 133 [separator.widthAnchor constraintEqualToConstant:1], |
| 134 [separator.bottomAnchor constraintEqualToAnchor:self.bottomAnchor | 134 [separator.bottomAnchor constraintEqualToAnchor:self.bottomAnchor |
| 135 constant:-8], | 135 constant:-8], |
| 136 [separator.topAnchor constraintEqualToAnchor:self.topAnchor constant:8], | 136 [separator.topAnchor constraintEqualToAnchor:self.topAnchor constant:8], |
| 137 [separator.leadingAnchor | 137 [separator.leadingAnchor |
| 138 constraintEqualToAnchor:inputStackView.get().trailingAnchor], | 138 constraintEqualToAnchor:inputStackView.trailingAnchor], |
| 139 ]]; | 139 ]]; |
| 140 separator.translatesAutoresizingMaskIntoConstraints = NO; | 140 separator.translatesAutoresizingMaskIntoConstraints = NO; |
| 141 self.separator = separator; | 141 self.separator = separator; |
| 142 | 142 |
| 143 // Previous button with an arrow. | 143 // Previous button with an arrow. |
| 144 base::scoped_nsobject<UIButton> previousButtonScoped( | 144 UIButton* previousButtonScoped = [[UIButton alloc] initWithFrame:CGRectZero]; |
| 145 [[UIButton alloc] initWithFrame:CGRectZero]); | |
| 146 self.previousButton = previousButtonScoped; | 145 self.previousButton = previousButtonScoped; |
| 147 [self addSubview:self.previousButton]; | 146 [self addSubview:self.previousButton]; |
| 148 [constraints addObjectsFromArray:@[ | 147 [constraints addObjectsFromArray:@[ |
| 149 [self.previousButton.centerYAnchor | 148 [self.previousButton.centerYAnchor |
| 150 constraintEqualToAnchor:self.centerYAnchor], | 149 constraintEqualToAnchor:self.centerYAnchor], |
| 151 [self.previousButton.widthAnchor constraintEqualToConstant:48], | 150 [self.previousButton.widthAnchor constraintEqualToConstant:48], |
| 152 [self.previousButton.heightAnchor constraintEqualToConstant:56], | 151 [self.previousButton.heightAnchor constraintEqualToConstant:56], |
| 153 [self.previousButton.leadingAnchor | 152 [self.previousButton.leadingAnchor |
| 154 constraintEqualToAnchor:separator.trailingAnchor], | 153 constraintEqualToAnchor:separator.trailingAnchor], |
| 155 ]]; | 154 ]]; |
| 156 self.previousButton.isAccessibilityElement = YES; | 155 self.previousButton.isAccessibilityElement = YES; |
| 157 self.previousButton.accessibilityTraits = UIAccessibilityTraitButton; | 156 self.previousButton.accessibilityTraits = UIAccessibilityTraitButton; |
| 158 self.previousButton.tag = IDC_FIND_PREVIOUS; | 157 self.previousButton.tag = IDC_FIND_PREVIOUS; |
| 159 self.previousButton.translatesAutoresizingMaskIntoConstraints = NO; | 158 self.previousButton.translatesAutoresizingMaskIntoConstraints = NO; |
| 160 | 159 |
| 161 // Next button with an arrow. | 160 // Next button with an arrow. |
| 162 base::scoped_nsobject<UIButton> nextButtonScoped( | 161 UIButton* nextButtonScoped = [[UIButton alloc] initWithFrame:CGRectZero]; |
| 163 [[UIButton alloc] initWithFrame:CGRectZero]); | |
| 164 self.nextButton = nextButtonScoped; | 162 self.nextButton = nextButtonScoped; |
| 165 [self addSubview:self.nextButton]; | 163 [self addSubview:self.nextButton]; |
| 166 [constraints addObjectsFromArray:@[ | 164 [constraints addObjectsFromArray:@[ |
| 167 [self.nextButton.centerYAnchor constraintEqualToAnchor:self.centerYAnchor], | 165 [self.nextButton.centerYAnchor constraintEqualToAnchor:self.centerYAnchor], |
| 168 [self.nextButton.widthAnchor constraintEqualToConstant:48], | 166 [self.nextButton.widthAnchor constraintEqualToConstant:48], |
| 169 [self.nextButton.heightAnchor constraintEqualToConstant:56], | 167 [self.nextButton.heightAnchor constraintEqualToConstant:56], |
| 170 [self.nextButton.leadingAnchor | 168 [self.nextButton.leadingAnchor |
| 171 constraintEqualToAnchor:self.previousButton.trailingAnchor], | 169 constraintEqualToAnchor:self.previousButton.trailingAnchor], |
| 172 ]]; | 170 ]]; |
| 173 self.nextButton.tag = IDC_FIND_NEXT; | 171 self.nextButton.tag = IDC_FIND_NEXT; |
| 174 self.nextButton.translatesAutoresizingMaskIntoConstraints = NO; | 172 self.nextButton.translatesAutoresizingMaskIntoConstraints = NO; |
| 175 | 173 |
| 176 // Close button with a cross. | 174 // Close button with a cross. |
| 177 base::scoped_nsobject<UIButton> closeButtonScoped( | 175 UIButton* closeButtonScoped = [[UIButton alloc] initWithFrame:CGRectZero]; |
| 178 [[UIButton alloc] initWithFrame:CGRectZero]); | |
| 179 self.closeButton = closeButtonScoped; | 176 self.closeButton = closeButtonScoped; |
| 180 [self addSubview:self.closeButton]; | 177 [self addSubview:self.closeButton]; |
| 181 [constraints addObjectsFromArray:@[ | 178 [constraints addObjectsFromArray:@[ |
| 182 [self.closeButton.centerYAnchor constraintEqualToAnchor:self.centerYAnchor], | 179 [self.closeButton.centerYAnchor constraintEqualToAnchor:self.centerYAnchor], |
| 183 [self.closeButton.trailingAnchor constraintEqualToAnchor:self.trailingAnchor | 180 [self.closeButton.trailingAnchor constraintEqualToAnchor:self.trailingAnchor |
| 184 constant:-4], | 181 constant:-4], |
| 185 [self.closeButton.widthAnchor constraintEqualToConstant:48], | 182 [self.closeButton.widthAnchor constraintEqualToConstant:48], |
| 186 [self.closeButton.heightAnchor constraintEqualToConstant:56], | 183 [self.closeButton.heightAnchor constraintEqualToConstant:56], |
| 187 [self.closeButton.leadingAnchor | 184 [self.closeButton.leadingAnchor |
| 188 constraintEqualToAnchor:self.nextButton.trailingAnchor], | 185 constraintEqualToAnchor:self.nextButton.trailingAnchor], |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 246 | 243 |
| 247 if (!isDark) { | 244 if (!isDark) { |
| 248 return; | 245 return; |
| 249 } | 246 } |
| 250 | 247 |
| 251 // Setup dark appearance. | 248 // Setup dark appearance. |
| 252 [self.inputField setTextColor:[UIColor whiteColor]]; | 249 [self.inputField setTextColor:[UIColor whiteColor]]; |
| 253 NSString* placeholder = [self.inputField placeholder]; | 250 NSString* placeholder = [self.inputField placeholder]; |
| 254 UIColor* inputTextColor = [UIColor colorWithWhite:1 alpha:0.7]; | 251 UIColor* inputTextColor = [UIColor colorWithWhite:1 alpha:0.7]; |
| 255 NSDictionary* attributes = @{NSForegroundColorAttributeName : inputTextColor}; | 252 NSDictionary* attributes = @{NSForegroundColorAttributeName : inputTextColor}; |
| 256 [self.inputField | 253 [self.inputField setAttributedPlaceholder:[[NSAttributedString alloc] |
| 257 setAttributedPlaceholder:[[[NSAttributedString alloc] | 254 initWithString:placeholder |
| 258 initWithString:placeholder | 255 attributes:attributes]]; |
| 259 attributes:attributes] autorelease]]; | |
| 260 UIColor* resultTextColor = [UIColor colorWithWhite:1 alpha:0.3]; | 256 UIColor* resultTextColor = [UIColor colorWithWhite:1 alpha:0.3]; |
| 261 [self.resultsLabel setTextColor:resultTextColor]; | 257 [self.resultsLabel setTextColor:resultTextColor]; |
| 262 UIColor* separatorColor = [UIColor colorWithWhite:0 alpha:0.1]; | 258 UIColor* separatorColor = [UIColor colorWithWhite:0 alpha:0.1]; |
| 263 [self.separator setBackgroundColor:separatorColor]; | 259 [self.separator setBackgroundColor:separatorColor]; |
| 264 } | 260 } |
| 265 | 261 |
| 266 - (UIImage*)imageWithName:(NSString*)imageName isDark:(BOOL)isDark { | 262 - (UIImage*)imageWithName:(NSString*)imageName isDark:(BOOL)isDark { |
| 267 NSString* name = | 263 NSString* name = |
| 268 isDark ? [imageName stringByAppendingString:@"_incognito"] : imageName; | 264 isDark ? [imageName stringByAppendingString:@"_incognito"] : imageName; |
| 269 return [UIImage imageNamed:name]; | 265 return [UIImage imageNamed:name]; |
| 270 } | 266 } |
| 271 | 267 |
| 272 @end | 268 @end |
| OLD | NEW |