download_item_controller.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BaseDownloadItemModel;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class ChromeUILocalizer;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class DownloadItemCell;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class DownloadItemButton;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadItemMac;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadShelfContextMenuMac;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class DownloadShelfController;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class GTMWidthBasedTweaker;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadItem;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PageNavigator;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Font;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A controller class that manages one download item.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@interface DownloadItemController : NSViewController {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @private
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet DownloadItemButton* progressView_;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet DownloadItemCell* cell_;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet NSMenu* activeDownloadMenu_;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet NSMenu* completeDownloadMenu_;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is shown instead of progressView_ for dangerous downloads.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet NSView* dangerousDownloadView_;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet NSTextField* dangerousDownloadLabel_;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet NSButton* dangerousDownloadConfirmButton_;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Needed to find out how much the tweaker changed sizes to update the
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // other views.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet GTMWidthBasedTweaker* buttonTweaker_;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Because the confirm text and button for dangerous downloads are determined
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // at runtime, an outlet to the localizer is needed to construct the layout
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tweaker in awakeFromNib in order to adjust the UI after all strings are
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // determined.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet ChromeUILocalizer* localizer_;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet NSImageView* image_;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DownloadItemMac> bridge_;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DownloadShelfContextMenuMac> menuBridge_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Weak pointer to the shelf that owns us.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadShelfController* shelf_;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The time at which this view was created.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time creationTime_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Default font to use for text metrics.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gfx::Font> font_;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The state of this item.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum DownoadItemState {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kNormal,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kDangerous
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } state_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Takes ownership of |downloadModel|.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (id)initWithModel:(BaseDownloadItemModel*)downloadModel
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              shelf:(DownloadShelfController*)shelf
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          navigator:(content::PageNavigator*)navigator;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Updates the UI and menu state from |downloadModel|.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)setStateFromDownload:(BaseDownloadItemModel*)downloadModel;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Remove ourself from the download UI.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)remove;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Update item's visibility depending on if the item is still completely
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contained in its parent.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)updateVisibility:(id)sender;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Called after a download is opened.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)downloadWasOpened;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Asynchronous icon loading callback.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)setIcon:(NSImage*)icon;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Download item button clicked
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)handleButtonClick:(id)sender;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the size this item wants to have.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSSize)preferredSize;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the DownloadItem model object belonging to this item.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (content::DownloadItem*)download;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Updates the tooltip with the download's path.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)updateToolTip;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handling of dangerous downloads
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)clearDangerousMode;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (BOOL)isDangerousMode;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)saveDownload:(id)sender;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)discardDownload:(id)sender;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Context menu handlers.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)handleOpen:(id)sender;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)handleAlwaysOpen:(id)sender;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)handleReveal:(id)sender;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)handleCancel:(id)sender;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)handleTogglePause:(id)sender;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end
121