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