• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #import <Cocoa/Cocoa.h>
6 
7 #import "base/mac/cocoa_protocols.h"
8 #include "base/memory/scoped_nsobject.h"
9 #include "base/memory/scoped_ptr.h"
10 #import "chrome/browser/ui/cocoa/view_resizer.h"
11 
12 @class AnimatableView;
13 class BaseDownloadItemModel;
14 class Browser;
15 @class BrowserWindowController;
16 @class DownloadItemController;
17 class DownloadShelf;
18 @class DownloadShelfView;
19 @class HyperlinkButtonCell;
20 @class HoverButton;
21 
22 // A controller class that manages the download shelf for one window. It is
23 // responsible for the behavior of the shelf itself (showing/hiding, handling
24 // the link, layout) as well as for managing the download items it contains.
25 //
26 // All the files in cocoa/downloads_* are related as follows:
27 //
28 // download_shelf_mac bridges calls from chromium's c++ world to the objc
29 // download_shelf_controller for the shelf (this file). The shelf's background
30 // is drawn by download_shelf_view. Every item in a shelf is controlled by a
31 // download_item_controller.
32 //
33 // download_item_mac bridges calls from chromium's c++ world to the objc
34 // download_item_controller, which is responsible for managing a single item
35 // on the shelf. The item controller loads its UI from a xib file, where the
36 // UI of an item itself is represented by a button that is drawn by
37 // download_item_cell.
38 
39 @interface DownloadShelfController : NSViewController<NSTextViewDelegate> {
40  @private
41   IBOutlet HyperlinkButtonCell* showAllDownloadsCell_;
42 
43   IBOutlet NSImageView* image_;
44 
45   IBOutlet HoverButton* hoverCloseButton_;
46 
47   BOOL barIsVisible_;
48 
49   BOOL isFullscreen_;
50 
51   scoped_ptr<DownloadShelf> bridge_;
52 
53   // Height of the shelf when it's fully visible.
54   CGFloat maxShelfHeight_;
55 
56   // Current height of the shelf. Changes while the shelf is animating in or
57   // out.
58   CGFloat currentShelfHeight_;
59 
60   // Used to autoclose the shelf when the mouse is moved off it.  Is non-nil
61   // only when a subsequent mouseExited event can trigger autoclose or when a
62   // subsequent mouseEntered event will cancel autoclose.  Is nil otherwise.
63   scoped_nsobject<NSTrackingArea> trackingArea_;
64 
65   // The download items we have added to our shelf.
66   scoped_nsobject<NSMutableArray> downloadItemControllers_;
67 
68   // The container that contains (and clamps) all the download items.
69   IBOutlet NSView* itemContainerView_;
70 
71   // Delegate that handles resizing our view.
72   id<ViewResizer> resizeDelegate_;
73 };
74 
75 - (id)initWithBrowser:(Browser*)browser
76        resizeDelegate:(id<ViewResizer>)resizeDelegate;
77 
78 - (IBAction)showDownloadsTab:(id)sender;
79 
80 // Returns our view cast as an AnimatableView.
81 - (AnimatableView*)animatableView;
82 
83 - (DownloadShelf*)bridge;
84 - (BOOL)isVisible;
85 
86 - (IBAction)show:(id)sender;
87 
88 // Run when the user clicks the close button on the right side of the shelf.
89 - (IBAction)hide:(id)sender;
90 
91 - (void)addDownloadItem:(BaseDownloadItemModel*)model;
92 
93 // Remove a download, possibly via clearing browser data.
94 - (void)remove:(DownloadItemController*)download;
95 
96 // Called by individual item controllers when their downloads are opened.
97 - (void)downloadWasOpened:(DownloadItemController*)download;
98 
99 // Notification that we are closing and should release our downloads.
100 - (void)exiting;
101 
102 // Return the height of the download shelf.
103 - (float)height;
104 
105 // Re-layouts all download items based on their current state.
106 - (void)layoutItems;
107 
108 @end
109