Index: chrome/browser/ui/cocoa/autofill/autofill_suggestion_container.mm |
diff --git a/chrome/browser/ui/cocoa/autofill/autofill_suggestion_container.mm b/chrome/browser/ui/cocoa/autofill/autofill_suggestion_container.mm |
deleted file mode 100644 |
index fa4d39a1e88dc7ba0b54ed9bd7b17f084465d987..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/cocoa/autofill/autofill_suggestion_container.mm |
+++ /dev/null |
@@ -1,283 +0,0 @@ |
-// 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 "chrome/browser/ui/cocoa/autofill/autofill_suggestion_container.h" |
- |
-#include <algorithm> |
-#include <cmath> |
- |
-#include "base/logging.h" |
-#include "base/mac/scoped_nsobject.h" |
-#include "base/strings/sys_string_conversions.h" |
-#include "chrome/browser/ui/autofill/autofill_dialog_view_delegate.h" |
-#include "chrome/browser/ui/chrome_style.h" |
-#include "chrome/browser/ui/cocoa/autofill/autofill_dialog_constants.h" |
-#import "chrome/browser/ui/cocoa/autofill/autofill_textfield.h" |
-#include "skia/ext/skia_utils_mac.h" |
- |
-namespace { |
- |
-// Horizontal padding between text and other elements (in pixels). |
-const int kAroundTextPadding = 4; |
- |
-// Padding at the top of suggestions. |
-const CGFloat kTopPadding = 10; |
- |
-// Indicates infinite size in either vertical or horizontal direction. |
-// Technically, CGFLOAT_MAX should do. Practically, it runs into several issues. |
-// #1) Many computations on Retina devices overflow with that value. |
-// #2) In this particular use case, it results in the message |
-// "CGAffineTransformInvert: singular matrix." |
-const CGFloat kInfiniteSize = 1.0e6; |
- |
-// A line fragment padding that creates the same visual look as text layout in |
-// an NSTextField does. (Which UX feedback was based on) |
-const CGFloat kLineFragmentPadding = 2.0; |
- |
-// Padding added on top of the label so its first line looks centered with |
-// respect to the input field. Only added when the input field is showing. |
-const CGFloat kLabelWithInputTopPadding = 5.0; |
- |
-} |
- |
-// An attachment cell for a single icon - takes care of proper alignment of |
-// text and icon. |
-@interface IconAttachmentCell : NSTextAttachmentCell { |
- CGFloat baseline_; // The cell's baseline adjustment. |
-} |
- |
-// Adjust the cell's baseline so that the lower edge of the image aligns with |
-// the longest descender, not the font baseline |
-- (void)adjustBaselineForFont:(NSFont*)font; |
- |
-@end |
- |
- |
-@interface AutofillSuggestionView : NSView { |
- @private |
- // The main input field - only view not ignoring mouse events. |
- NSView* inputField_; |
-} |
- |
-@property (assign, nonatomic) NSView* inputField; |
- |
-@end |
- |
- |
-// The suggestion container should ignore any mouse events unless they occur |
-// within the bounds of an editable field. |
-@implementation AutofillSuggestionView |
- |
-@synthesize inputField = inputField_; |
- |
-- (NSView*)hitTest:(NSPoint)point { |
- NSView* hitView = [super hitTest:point]; |
- if ([hitView isDescendantOf:inputField_]) |
- return hitView; |
- |
- return nil; |
-} |
- |
-@end |
- |
- |
-@implementation IconAttachmentCell |
- |
-- (NSPoint)cellBaselineOffset { |
- return NSMakePoint(0.0, baseline_); |
-} |
- |
-// Ensure proper padding between text and icon. |
-- (NSSize)cellSize { |
- NSSize size = [super cellSize]; |
- size.width += kAroundTextPadding; |
- return size; |
-} |
- |
-// drawWithFrame: needs to be overridden to left-align the image. Default |
-// rendering centers images in the cell's frame. |
-- (void)drawWithFrame:(NSRect)frame inView:(NSView*)view { |
- frame.size.width -= kAroundTextPadding; |
- [super drawWithFrame:frame inView:view]; |
-} |
- |
-- (void)adjustBaselineForFont:(NSFont*)font { |
- CGFloat lineHeight = [font ascender]; |
- baseline_ = std::floor((lineHeight - [[self image] size].height) / 2.0); |
-} |
- |
-@end |
- |
- |
-@interface AutofillSuggestionContainer (Private) |
- |
-// Set the main suggestion text and the corresponding |icon|. |
-// Attempts to wrap the text if |wrapText| is set. |
-- (void)setSuggestionText:(NSString*)line |
- icon:(NSImage*)icon |
- wrapText:(BOOL)wrapText; |
- |
-@end |
- |
- |
-@implementation AutofillSuggestionContainer |
- |
-- (AutofillTextField*)inputField { |
- return inputField_.get(); |
-} |
- |
-- (NSTextField*)makeDetailSectionLabel:(NSString*)labelText { |
- base::scoped_nsobject<NSTextField> label([[NSTextField alloc] init]); |
- [label setFont: |
- [[NSFontManager sharedFontManager] convertFont:[label font] |
- toHaveTrait:NSBoldFontMask]]; |
- [label setStringValue:labelText]; |
- [label setEditable:NO]; |
- [label setBordered:NO]; |
- [label sizeToFit]; |
- return label.autorelease(); |
-} |
- |
-- (void)loadView { |
- label_.reset([[NSTextView alloc] initWithFrame:NSZeroRect]); |
- [[label_ textContainer] setLineFragmentPadding:kLineFragmentPadding]; |
- [label_ setEditable:NO]; |
- [label_ setSelectable:NO]; |
- [label_ setDrawsBackground:NO]; |
- |
- base::scoped_nsobject<NSMutableParagraphStyle> paragraphStyle( |
- [[NSMutableParagraphStyle alloc] init]); |
- [paragraphStyle setLineSpacing:0.5 * [[label_ font] pointSize]]; |
- [label_ setDefaultParagraphStyle:paragraphStyle]; |
- |
- inputField_.reset([[AutofillTextField alloc] initWithFrame:NSZeroRect]); |
- [inputField_ setHidden:YES]; |
- |
- spacer_.reset([[NSBox alloc] initWithFrame:NSZeroRect]); |
- [spacer_ setBoxType:NSBoxSeparator]; |
- [spacer_ setBorderType:NSLineBorder]; |
- |
- base::scoped_nsobject<AutofillSuggestionView> view( |
- [[AutofillSuggestionView alloc] initWithFrame:NSZeroRect]); |
- [view setSubviews: |
- @[ label_, inputField_, spacer_ ]]; |
- [view setInputField:inputField_]; |
- [self setView:view]; |
-} |
- |
-- (void)setSuggestionText:(NSString*)line |
- icon:(NSImage*)icon |
- wrapText:(BOOL)wrapText { |
- [label_ setString:@""]; |
- |
- if ([icon size].width) { |
- base::scoped_nsobject<IconAttachmentCell> cell( |
- [[IconAttachmentCell alloc] initImageCell:icon]); |
- base::scoped_nsobject<NSTextAttachment> attachment( |
- [[NSTextAttachment alloc] init]); |
- [cell adjustBaselineForFont:[NSFont controlContentFontOfSize:0]]; |
- [cell setAlignment:NSLeftTextAlignment]; |
- [attachment setAttachmentCell:cell]; |
- [[label_ textStorage] setAttributedString: |
- [NSAttributedString attributedStringWithAttachment:attachment]]; |
- } |
- |
- NSDictionary* attributes = @{ |
- NSParagraphStyleAttributeName : [label_ defaultParagraphStyle], |
- NSCursorAttributeName : [NSCursor arrowCursor], |
- NSFontAttributeName : [NSFont controlContentFontOfSize:0] |
- }; |
- base::scoped_nsobject<NSAttributedString> str1( |
- [[NSAttributedString alloc] initWithString:line |
- attributes:attributes]); |
- [[label_ textStorage] appendAttributedString:str1]; |
- |
- [label_ setVerticallyResizable:YES]; |
- [label_ setHorizontallyResizable:!wrapText]; |
- if (wrapText) { |
- CGFloat availableWidth = |
- 4 * autofill::kFieldWidth - [inputField_ frame].size.width; |
- [label_ setFrameSize:NSMakeSize(availableWidth, kInfiniteSize)]; |
- } else { |
- [label_ setFrameSize:NSMakeSize(kInfiniteSize, kInfiniteSize)]; |
- } |
- [[label_ layoutManager] ensureLayoutForTextContainer:[label_ textContainer]]; |
- [label_ sizeToFit]; |
-} |
- |
-- (void) |
- setSuggestionWithVerticallyCompactText:(NSString*)verticallyCompactText |
- horizontallyCompactText:(NSString*)horizontallyCompactText |
- icon:(NSImage*)icon |
- maxWidth:(CGFloat)maxWidth { |
- // Prefer the vertically compact text when it fits. If it doesn't fit, fall |
- // back to the horizontally compact text. |
- [self setSuggestionText:verticallyCompactText icon:icon wrapText:NO]; |
- if ([self preferredSize].width > maxWidth) |
- [self setSuggestionText:horizontallyCompactText icon:icon wrapText:YES]; |
-} |
- |
- |
-- (void)showInputField:(NSString*)text withIcon:(NSImage*)icon { |
- [[inputField_ cell] setPlaceholderString:text]; |
- [[inputField_ cell] setIcon:icon]; |
- [inputField_ setHidden:NO]; |
- [inputField_ sizeToFit]; |
- |
- // Enforce fixed width. |
- NSSize frameSize = NSMakeSize(autofill::kFieldWidth, |
- NSHeight([inputField_ frame])); |
- [inputField_ setFrameSize:frameSize]; |
-} |
- |
- |
-- (NSSize)preferredSize { |
- NSSize size = [label_ bounds].size; |
- |
- // Final inputField_ sizing/spacing depends on a TODO(estade) in Views code. |
- if (![inputField_ isHidden]) { |
- size.height = std::max(size.height + kLabelWithInputTopPadding, |
- NSHeight([inputField_ frame])); |
- size.width += NSWidth([inputField_ frame]) + kAroundTextPadding; |
- } |
- |
- size.height += kTopPadding; |
- |
- return size; |
-} |
- |
-- (void)performLayout { |
- NSRect bounds = [[self view] bounds]; |
- NSSize preferredContainerSize = [self preferredSize]; |
- // width is externally determined. |
- preferredContainerSize.width = NSWidth(bounds); |
- |
- NSRect spacerFrame = NSMakeRect(0, preferredContainerSize.height - 1, |
- preferredContainerSize.width, 1); |
- |
- NSRect labelFrame = [label_ bounds]; |
- labelFrame.origin.x = NSMinX(bounds); |
- labelFrame.origin.y = NSMaxY(bounds) - NSHeight(labelFrame) - kTopPadding; |
- |
- // Position input field - top is aligned to top of label field. |
- if (![inputField_ isHidden]) { |
- NSRect inputFieldFrame = [inputField_ frame]; |
- inputFieldFrame.origin.x = NSMaxX(bounds) - NSWidth(inputFieldFrame); |
- inputFieldFrame.origin.y = NSMaxY(labelFrame) - NSHeight(inputFieldFrame); |
- [inputField_ setFrameOrigin:inputFieldFrame.origin]; |
- |
- // Vertically center the first line of the label with respect to the input |
- // field. |
- labelFrame.origin.y -= kLabelWithInputTopPadding; |
- |
- // Due to fixed width, fields are guaranteed to not overlap. |
- DCHECK_LE(NSMaxX(labelFrame), NSMinX(inputFieldFrame)); |
- } |
- |
- [spacer_ setFrame:spacerFrame]; |
- [label_ setFrame:labelFrame]; |
- [[self view] setFrameSize:preferredContainerSize]; |
-} |
- |
-@end |