Index: ios/chrome/browser/autofill/form_suggestion_view.mm |
diff --git a/ios/chrome/browser/autofill/form_suggestion_view.mm b/ios/chrome/browser/autofill/form_suggestion_view.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4ac0467c2240cce5bd7f1c05c823db06089a75c1 |
--- /dev/null |
+++ b/ios/chrome/browser/autofill/form_suggestion_view.mm |
@@ -0,0 +1,97 @@ |
+// Copyright 2013 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/autofill/form_suggestion_view.h" |
+ |
+#include "base/i18n/rtl.h" |
+#include "base/mac/scoped_nsobject.h" |
+#import "ios/chrome/browser/autofill/form_suggestion_label.h" |
+#import "ios/chrome/browser/autofill/form_suggestion_view_client.h" |
+ |
+namespace { |
+ |
+// Vertical margin between suggestions and the edge of the suggestion content |
+// frame. |
+const CGFloat kSuggestionVerticalMargin = 4; |
+ |
+// Horizontal margin around suggestions (i.e. between suggestions, and between |
+// the end suggestions and the suggestion content frame). |
+const CGFloat kSuggestionHorizontalMargin = 2; |
+ |
+} // namespace |
+ |
+@implementation FormSuggestionView { |
+ // The FormSuggestions that are displayed by this view. |
+ base::scoped_nsobject<NSArray> _suggestions; |
+} |
+ |
+- (instancetype)initWithFrame:(CGRect)frame |
+ client:(id<FormSuggestionViewClient>)client |
+ suggestions:(NSArray*)suggestions { |
+ self = [super initWithFrame:frame]; |
+ if (self) { |
+ _suggestions.reset([suggestions copy]); |
+ |
+ self.showsVerticalScrollIndicator = NO; |
+ self.showsHorizontalScrollIndicator = NO; |
+ self.bounces = NO; |
+ self.canCancelContentTouches = YES; |
+ |
+ // Total height occupied by the label content, padding, border and margin. |
+ const CGFloat labelHeight = |
+ CGRectGetHeight(frame) - kSuggestionVerticalMargin * 2; |
+ |
+ BOOL isRTL = base::i18n::IsRTL(); |
+ |
+ NSUInteger suggestionCount = [_suggestions count]; |
+ // References to labels. These references are used to adjust the labels' |
+ // positions if they don't take up the whole suggestion view area for RTL. |
+ base::scoped_nsobject<NSMutableArray> labels( |
+ [[NSMutableArray alloc] initWithCapacity:suggestionCount]); |
+ __block CGFloat currentX = kSuggestionHorizontalMargin; |
+ void (^setupBlock)(FormSuggestion* suggestion, NSUInteger idx, BOOL* stop) = |
+ ^(FormSuggestion* suggestion, NSUInteger idx, BOOL* stop) { |
+ // FormSuggestionLabel will adjust the width, so here 0 is used for |
+ // the width. |
+ CGRect proposedFrame = |
+ CGRectMake(currentX, kSuggestionVerticalMargin, 0, labelHeight); |
+ base::scoped_nsobject<UIView> label( |
+ [[FormSuggestionLabel alloc] initWithSuggestion:suggestion |
+ proposedFrame:proposedFrame |
+ client:client]); |
+ [self addSubview:label]; |
+ [labels addObject:label]; |
+ currentX += |
+ CGRectGetWidth([label frame]) + kSuggestionHorizontalMargin; |
+ }; |
+ [_suggestions enumerateObjectsWithOptions:(isRTL ? NSEnumerationReverse : 0) |
+ usingBlock:setupBlock]; |
+ |
+ if (isRTL) { |
+ if (currentX < CGRectGetWidth(frame)) { |
+ self.contentSize = frame.size; |
+ // Offsets labels for right alignment. |
+ CGFloat offset = CGRectGetWidth(frame) - currentX; |
+ for (UIView* label in labels.get()) { |
+ label.frame = CGRectOffset(label.frame, offset, 0); |
+ } |
+ } else { |
+ self.contentSize = CGSizeMake(currentX, CGRectGetHeight(frame)); |
+ // Sets the visible rectangle so suggestions at the right end are |
+ // initially visible. |
+ CGRect initRect = {{currentX - CGRectGetWidth(frame), 0}, frame.size}; |
+ [self scrollRectToVisible:initRect animated:NO]; |
+ } |
+ } else { |
+ self.contentSize = CGSizeMake(currentX, CGRectGetHeight(frame)); |
+ } |
+ } |
+ return self; |
+} |
+ |
+- (NSArray*)suggestions { |
+ return _suggestions.get(); |
+} |
+ |
+@end |