| // Copyright (c) 2010 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/cocoa/vertical_layout_view.h" |
| |
| @interface VerticalLayoutView(PrivateMethods) |
| - (void)layoutChildren; |
| @end |
| |
| @implementation VerticalLayoutView |
| |
| - (id)initWithFrame:(NSRect)frame { |
| self = [super initWithFrame:frame]; |
| if (self) { |
| // Turn auto resizing off, we'll be laying out our children programatically. |
| [self setAutoresizesSubviews:NO]; |
| [self setAutoresizingMask:NSViewNotSizable]; |
| } |
| |
| return self; |
| } |
| |
| // Flip the coordinate system to arrange child views from top to bottom |
| // with top at 0, increasing down. This simplifies the logic and plays |
| // well with containing scroll views. |
| - (BOOL)isFlipped { |
| return YES; |
| } |
| |
| // Override the default |viewWillDraw| to indicate to drawing machinery proper |
| // arrangement of subviews. |
| - (void)viewWillDraw { |
| // Reposition child views prior to super's descent into its |viewWillDraw| |
| // pass. |
| [self layoutChildren]; |
| |
| // Default descent into subviews. |
| [super viewWillDraw]; |
| |
| // Adjust children again to account for any modifications made during the |
| // prior descent. Most importantly we resize our own frame to properly |
| // adjust any containing scroll view. |
| [self layoutChildren]; |
| } |
| |
| @end |
| |
| @implementation VerticalLayoutView(PrivateMethods) |
| |
| // This method traverses the immediate subviews measuring their height and |
| // adjusting their frames so they are arranged vertically ordered relative |
| // to their sibling views. Note the dependency here on the |isFlipped| |
| // state. This code assumes |isFlipped| is YES. |
| - (void)layoutChildren { |
| NSArray* children = [self subviews]; |
| int childCount = [children count]; |
| |
| CGFloat yPosition = 0.0; |
| for (int i = childCount-1; i >= 0; --i) { |
| NSView* child = [children objectAtIndex:i]; |
| [child setFrameOrigin:NSMakePoint([child frame].origin.x, yPosition)]; |
| yPosition += [child frame].size.height; |
| } |
| |
| // Resize self to reflect vertical extent of children. |
| [self setFrame:NSMakeRect([self frame].origin.x, |
| [self frame].origin.y, |
| [self frame].size.width, |
| yPosition)]; |
| } |
| |
| @end |