15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import <Cocoa/Cocoa.h> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/mac/scoped_nsobject.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import "chrome/browser/ui/cocoa/view_resizer.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/cocoa/tracking_area.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class AnimatableView; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class BrowserWindowController; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class DownloadItemController; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadShelf; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class DownloadShelfView; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class HyperlinkButtonCell; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class HoverButton; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DownloadItem; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PageNavigator; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A controller class that manages the download shelf for one window. It is 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// responsible for the behavior of the shelf itself (showing/hiding, handling 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the link, layout) as well as for managing the download items it contains. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All the files in cocoa/downloads_* are related as follows: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download_shelf_mac bridges calls from chromium's c++ world to the objc 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download_shelf_controller for the shelf (this file). The shelf's background 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is drawn by download_shelf_view. Every item in a shelf is controlled by a 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download_item_controller. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download_item_mac bridges calls from chromium's c++ world to the objc 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download_item_controller, which is responsible for managing a single item 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on the shelf. The item controller loads its UI from a xib file, where the 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UI of an item itself is represented by a button that is drawn by 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download_item_cell. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@interface DownloadShelfController : NSViewController<NSTextViewDelegate> { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @private 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IBOutlet HoverButton* hoverCloseButton_; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // YES if the download shelf is intended to be displayed. The shelf animates 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // out when it is closing. During this time, barIsVisible_ is NO although the 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // shelf is still visible on screen. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BOOL barIsVisible_; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // YES if the containing browser window is fullscreen. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BOOL isFullscreen_; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // YES if the shelf should be closed when the mouse leaves the shelf. 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BOOL shouldCloseOnMouseExit_; 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // YES if the mouse is currently over the download shelf. 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BOOL isMouseInsideView_; 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DownloadShelf> bridge_; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Height of the shelf when it's fully visible. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CGFloat maxShelfHeight_; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Current height of the shelf. Changes while the shelf is animating in or 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // out. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CGFloat currentShelfHeight_; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Used to autoclose the shelf when the mouse is moved off it. 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::ScopedCrTrackingArea trackingArea_; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The download items we have added to our shelf. 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<NSMutableArray> downloadItemControllers_; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The container that contains (and clamps) all the download items. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IBOutlet NSView* itemContainerView_; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delegate that handles resizing our view. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id<ViewResizer> resizeDelegate_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used for loading pages. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PageNavigator* navigator_; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (id)initWithBrowser:(Browser*)browser 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resizeDelegate:(id<ViewResizer>)resizeDelegate; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Run when the user clicks the 'Show All' button. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)showDownloadsTab:(id)sender; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Run when the user clicks the close button on the right side of the shelf. 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (IBAction)handleClose:(id)sender; 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Shows or hides the download shelf based on the value of |show|. 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |isUserAction| should be YES if the operation is being triggered based on a 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// user action (currently only relevant when hiding the shelf). 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Note: This is intended to be invoked from DownloadShelfMac. If invoked 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// directly, the shelf visibility state maintained by DownloadShelf and the 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// owning Browser will not be updated. 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)showDownloadShelf:(BOOL)show 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) isUserAction:(BOOL)isUserAction; 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns our view cast as an AnimatableView. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (AnimatableView*)animatableView; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (DownloadShelf*)bridge; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (BOOL)isVisible; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Add a new download item to the leftmost position of the download shelf. The 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// item should not have been already added to this shelf. 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)- (void)addDownloadItem:(content::DownloadItem*)downloadItem; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Similar to addDownloadItem above, but adds a DownloadItemController. 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)- (void)add:(DownloadItemController*)download; 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Remove a download, possibly via clearing browser data. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)remove:(DownloadItemController*)download; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Called by individual item controllers when their downloads are opened. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)downloadWasOpened:(DownloadItemController*)download; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Notification that the download shelf is going to be destroyed and should 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// release the downloads. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)exiting; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return the height of the download shelf. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (float)height; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Re-layouts all download items based on their current state. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)layoutItems; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end 134