diff options
Diffstat (limited to 'chrome/browser/cocoa/download_shelf_controller.mm')
-rw-r--r-- | chrome/browser/cocoa/download_shelf_controller.mm | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/chrome/browser/cocoa/download_shelf_controller.mm b/chrome/browser/cocoa/download_shelf_controller.mm new file mode 100644 index 0000000..b82f67f --- /dev/null +++ b/chrome/browser/cocoa/download_shelf_controller.mm @@ -0,0 +1,114 @@ +// Copyright (c) 2009 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 "download_shelf_controller.h" + +#include "base/mac_util.h" +#import "chrome/browser/cocoa/browser_window_controller.h" +#include "chrome/browser/cocoa/browser_window_cocoa.h" +#include "chrome/browser/cocoa/download_shelf_mac.h" +#import "chrome/browser/cocoa/download_shelf_view.h" + + +@interface DownloadShelfController(Private) +- (void)applyContentAreaOffset:(BOOL)apply; +- (void)positionBar; +- (void)showDownloadShelf:(BOOL)enable; +@end + + +@implementation DownloadShelfController + +- (id)initWithBrowser:(Browser*)browser + contentArea:(NSView*)content { + if ((self = [super initWithNibName:@"DownloadShelf" + bundle:mac_util::MainAppBundle()])) { + contentArea_ = content; + shelfHeight_ = [[self view] bounds].size.height; + + [self positionBar]; + [[[contentArea_ window] contentView] addSubview:[self view]]; + + // This calls show:, so it needs to be last. + bridge_.reset(new DownloadShelfMac(browser, self)); + } + return self; +} + +// Initializes the download shelf at the bottom edge of |contentArea_|. +- (void)positionBar { + // Set the bar's height to zero and position it at the bottom of the + // content area, within the window's content view (as opposed to the + // tab strip, which is a sibling). We'll enlarge it and slide the + // content area up when we need to show this strip. + NSRect contentFrame = [contentArea_ frame]; + NSRect barFrame = NSMakeRect(0, 0, + contentFrame.size.width, shelfHeight_); + [[self view] setFrame:barFrame]; +} + +// Called when the contentArea's frame changes. Enlarge the view to +// stay with the bottom of the contentArea. +- (void)resizeDownloadShelf { + NSRect barFrame = [[self view] frame]; + barFrame.origin.y = 0; + barFrame.size.height = NSMinY([contentArea_ frame]); + [[self view] setFrame:barFrame]; +} + +// Show or hide the bar based on the value of |enable|. Handles animating the +// resize of the content view. +- (void)showDownloadShelf:(BOOL)enable { + contentAreaHasOffset_ = enable; + [[self view] setHidden:enable ? NO : YES]; + [self applyContentAreaOffset:enable]; + + barIsVisible_ = enable; +} + +// Apply a contents box offset to make (or remove) room for the +// download shelf. If apply==YES, always make room (the contentView_ is +// "full size"). If apply==NO we are trying to undo an offset. If no +// offset there is nothing to undo. +- (void)applyContentAreaOffset:(BOOL)apply { + if (!contentAreaHasOffset_ && apply) { + // There is no offset to unconditionally apply. + return; + } + + NSRect frame = [contentArea_ frame]; + if (apply) { + frame.origin.y += shelfHeight_; + frame.size.height -= shelfHeight_; + } else { + frame.origin.y -= shelfHeight_; + frame.size.height += shelfHeight_; + } + + [[contentArea_ animator] setFrame:frame]; + [[self view] setNeedsDisplay:YES]; + [contentArea_ setNeedsDisplay:YES]; +} + +- (DownloadShelf*)bridge { + return bridge_.get(); +} + +- (BOOL)isVisible { + return barIsVisible_; +} + +- (void)show:(id)sender { + [self showDownloadShelf:YES]; +} + +- (void)hide:(id)sender { + [self showDownloadShelf:NO]; +} + +- (void)addDownloadItem:(NSView*)view { + [[self view] addSubview:view]; +} + +@end |