| Index: chrome/browser/cocoa/vertical_layout_view.mm
|
| ===================================================================
|
| --- chrome/browser/cocoa/vertical_layout_view.mm (revision 0)
|
| +++ chrome/browser/cocoa/vertical_layout_view.mm (revision 0)
|
| @@ -0,0 +1,73 @@
|
| +// 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 subvies.
|
| +- (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
|
|
|