Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6721)

Unified Diff: chrome/browser/ui/cocoa/autofill/autofill_section_container.mm

Issue 15645004: [rAC] Allow sub-views to trigger layout reflow. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address review issues. Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/autofill/autofill_section_container.mm
diff --git a/chrome/browser/ui/cocoa/autofill/autofill_section_container.mm b/chrome/browser/ui/cocoa/autofill/autofill_section_container.mm
index a3edb9c50411b3a90aeaf98a9f968495da942a1a..ef5c9607c534c4926582ccbb18eed122a8b5a1eb 100644
--- a/chrome/browser/ui/cocoa/autofill/autofill_section_container.mm
+++ b/chrome/browser/ui/cocoa/autofill/autofill_section_container.mm
@@ -50,10 +50,6 @@ const size_t kDetailSectionInset = 10;
// Create properly styled label for section. Autoreleased.
- (NSTextField*)makeDetailSectionLabel:(NSString*)labelText;
-// Create NSView containing inputs & labelling. Autoreleased.
-- (NSView*)makeSectionView:(NSString*)labelText
- withControls:(LayoutView*)controls;
-
// Create a button offering input suggestions.
- (MenuButton*)makeSuggestionButton;
@@ -103,22 +99,67 @@ const size_t kDetailSectionInset = 10;
inputs_.reset([[self makeInputControls] retain]);
string16 labelText = controller_->LabelForSection(section_);
- scoped_nsobject<NSView> sectionView(
- [[self makeSectionView:base::SysUTF16ToNSString(labelText)
- withControls:inputs_] retain]);
+ label_.reset([[self makeDetailSectionLabel:
+ base::SysUTF16ToNSString(labelText)] retain]);
+
suggestButton_.reset([[self makeSuggestionButton] retain]);
- NSRect buttonFrame = [suggestButton_ frame];
- buttonFrame.origin.x = NSMaxX([sectionView frame]);
- NSRect frame = NSUnionRect(buttonFrame, [sectionView frame]);
- DCHECK(NSHeight(frame) >= NSHeight(buttonFrame) + 2 * kDetailSectionInset);
- buttonFrame.origin.y =
- NSMaxY(frame) - NSHeight(buttonFrame) - kDetailSectionInset;
- [suggestButton_ setFrame:buttonFrame];
[self modelChanged];
- [self setView:[[[NSView alloc] initWithFrame:frame] autorelease]];
- [[self view] setSubviews:@[sectionView, suggestButton_]];
+ view_.reset([[NSView alloc] initWithFrame:NSZeroRect]);
+ [self performLayout];
+ [self setView:view_];
+ [[self view] setSubviews:@[label_, inputs_, suggestButton_]];
+}
+
+- (NSSize)preferredSize {
+ NSSize labelSize = [label_ frame].size; // Assumes sizeToFit was called.
+ CGFloat contentHeight = [inputs_ preferredHeightForWidth:kDetailsWidth];
+ contentHeight = std::max(contentHeight, labelSize.height);
+ contentHeight = std::max(contentHeight, NSHeight([suggestButton_ frame]));
+
+ return NSMakeSize(kLabelWidth + kPadding + kDetailsWidth,
+ contentHeight + 2 * kDetailSectionInset);
+}
+
+- (void)performLayout {
+ NSSize buttonSize = [suggestButton_ frame].size; // Assume sizeToFit.
+ NSSize labelSize = [label_ frame].size; // Assumes sizeToFit was called.
+ CGFloat controlHeight = [inputs_ preferredHeightForWidth:kDetailsWidth];
+
+ NSRect viewFrame = NSZeroRect;
+ viewFrame.size = [self preferredSize];
+
+ NSRect contentFrame = NSInsetRect(viewFrame, 0, kDetailSectionInset);
+ NSRect dummy;
+
+ // Set up three content columns. kLabelWidth is first column width,
+ // then padding, then have suggestButton and inputs share kDetailsWidth.
+ NSRect column[3];
+ NSDivideRect(contentFrame, &column[0], &dummy, kLabelWidth, NSMinXEdge);
+ NSDivideRect(contentFrame, &column[1], &dummy, kDetailsWidth, NSMaxXEdge);
+ NSDivideRect(column[1],
+ &column[2], &column[1], buttonSize.width, NSMaxXEdge);
+
+ // Center inputs by height in column 1.
+ NSRect controlFrame = column[1];
+ int centerOffset = (NSHeight(controlFrame) - controlHeight) / 2;
+ controlFrame.origin.x += centerOffset;
+ controlFrame.size.height = controlHeight;
+
+ // Align label to right top in column 0.
+ NSRect labelFrame;
+ NSDivideRect(column[0], &labelFrame, &dummy, labelSize.height, NSMaxYEdge);
+ NSDivideRect(labelFrame, &labelFrame, &dummy, labelSize.width, NSMaxXEdge);
+
+ // suggest button is top left of column 2.
+ NSRect buttonFrame = column[2];
+ NSDivideRect(column[2], &buttonFrame, &dummy, buttonSize.height, NSMaxYEdge);
+
+ [inputs_ setFrame:controlFrame];
+ [label_ setFrame:labelFrame];
+ [suggestButton_ setFrame:buttonFrame];
+ [view_ setFrame:viewFrame];
}
- (NSTextField*)makeDetailSectionLabel:(NSString*)labelText {
@@ -134,37 +175,6 @@ const size_t kDetailSectionInset = 10;
return label.autorelease();
}
-- (NSView*)makeSectionView:(NSString*)labelText
- withControls:(LayoutView*)controls {
- scoped_nsobject<NSTextField> label(
- [[self makeDetailSectionLabel:labelText] retain]);
-
- CGFloat controlHeight = [controls preferredHeightForWidth:kDetailsWidth];
- NSRect frame = NSZeroRect;
- frame.size.width = kLabelWidth + kPadding + kDetailsWidth;
- frame.size.height = std::max(NSHeight([label frame]), controlHeight) +
- 2 * kDetailSectionInset;
- scoped_nsobject<NSView> section_container(
- [[NSView alloc] initWithFrame:frame]);
-
- NSPoint labelOrigin = NSMakePoint(
- kLabelWidth - NSWidth([label frame]),
- NSHeight(frame) - NSHeight([label frame]) - kDetailSectionInset);
- [label setFrameOrigin:labelOrigin];
- [label setAutoresizingMask:(NSViewMinYMargin | NSViewMinYMargin)];
-
- NSRect dummyFrame;
- NSRect controlFrame = [controls frame];
- NSDivideRect(NSInsetRect(frame, 0, kDetailSectionInset),
- &controlFrame, &dummyFrame, kDetailsWidth, NSMaxXEdge);
- controlFrame.size.height = controlHeight;
- [controls setFrame:controlFrame];
- [controls setAutoresizingMask:(NSViewMaxXMargin | NSViewMinYMargin)];
-
- [section_container setSubviews:@[label, controls]];
- return section_container.autorelease();
-}
-
- (MenuButton*)makeSuggestionButton {
scoped_nsobject<MenuButton> button([[MenuButton alloc] init]);
@@ -272,4 +282,4 @@ const size_t kDetailSectionInset = 10;
return nil;
}
- @end
+@end

Powered by Google App Engine
This is Rietveld 408576698