// Copyright (c) 2012 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 <Cocoa/Cocoa.h> #include "base/mac/scoped_nsobject.h" #include "base/memory/scoped_ptr.h" #import "chrome/browser/ui/cocoa/view_resizer.h" #include "ui/base/cocoa/tracking_area.h" @class AnimatableView; class Browser; @class BrowserWindowController; @class DownloadItemController; class DownloadShelf; @class DownloadShelfView; @class HyperlinkButtonCell; @class HoverButton; namespace content { class DownloadItem; class PageNavigator; } // A controller class that manages the download shelf for one window. It is // responsible for the behavior of the shelf itself (showing/hiding, handling // the link, layout) as well as for managing the download items it contains. // // All the files in cocoa/downloads_* are related as follows: // // download_shelf_mac bridges calls from chromium's c++ world to the objc // download_shelf_controller for the shelf (this file). The shelf's background // is drawn by download_shelf_view. Every item in a shelf is controlled by a // download_item_controller. // // download_item_mac bridges calls from chromium's c++ world to the objc // download_item_controller, which is responsible for managing a single item // on the shelf. The item controller loads its UI from a xib file, where the // UI of an item itself is represented by a button that is drawn by // download_item_cell. @interface DownloadShelfController : NSViewController<NSTextViewDelegate> { @private IBOutlet HoverButton* hoverCloseButton_; // YES if the download shelf is intended to be displayed. The shelf animates // out when it is closing. During this time, barIsVisible_ is NO although the // shelf is still visible on screen. BOOL barIsVisible_; // YES if the containing browser window is fullscreen. BOOL isFullscreen_; // YES if the shelf should be closed when the mouse leaves the shelf. BOOL shouldCloseOnMouseExit_; // YES if the mouse is currently over the download shelf. BOOL isMouseInsideView_; scoped_ptr<DownloadShelf> bridge_; // Height of the shelf when it's fully visible. CGFloat maxShelfHeight_; // Current height of the shelf. Changes while the shelf is animating in or // out. CGFloat currentShelfHeight_; // Used to autoclose the shelf when the mouse is moved off it. ui::ScopedCrTrackingArea trackingArea_; // The download items we have added to our shelf. base::scoped_nsobject<NSMutableArray> downloadItemControllers_; // The container that contains (and clamps) all the download items. IBOutlet NSView* itemContainerView_; // Delegate that handles resizing our view. id<ViewResizer> resizeDelegate_; // Used for loading pages. content::PageNavigator* navigator_; }; - (id)initWithBrowser:(Browser*)browser resizeDelegate:(id<ViewResizer>)resizeDelegate; // Run when the user clicks the 'Show All' button. - (IBAction)showDownloadsTab:(id)sender; // Run when the user clicks the close button on the right side of the shelf. - (IBAction)handleClose:(id)sender; // Shows or hides the download shelf based on the value of |show|. // |isUserAction| should be YES if the operation is being triggered based on a // user action (currently only relevant when hiding the shelf). // Note: This is intended to be invoked from DownloadShelfMac. If invoked // directly, the shelf visibility state maintained by DownloadShelf and the // owning Browser will not be updated. - (void)showDownloadShelf:(BOOL)show isUserAction:(BOOL)isUserAction; // Returns our view cast as an AnimatableView. - (AnimatableView*)animatableView; - (DownloadShelf*)bridge; - (BOOL)isVisible; // Add a new download item to the leftmost position of the download shelf. The // item should not have been already added to this shelf. - (void)addDownloadItem:(content::DownloadItem*)downloadItem; // Similar to addDownloadItem above, but adds a DownloadItemController. - (void)add:(DownloadItemController*)download; // Remove a download, possibly via clearing browser data. - (void)remove:(DownloadItemController*)download; // Called by individual item controllers when their downloads are opened. - (void)downloadWasOpened:(DownloadItemController*)download; // Notification that the download shelf is going to be destroyed and should // release the downloads. - (void)exiting; // Return the height of the download shelf. - (float)height; // Re-layouts all download items based on their current state. - (void)layoutItems; @end