download_item_controller.h revision 558790d6acca3451cf3a6b497803a5f07d0bec58
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"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class ChromeUILocalizer;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class DownloadItemCell;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class DownloadItemButton;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadItemMac;
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DownloadItemModel;
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)
28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace ui {
29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass MenuModel;
30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
31558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A controller class that manages one download item.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@interface DownloadItemController : NSViewController {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @private
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet DownloadItemButton* progressView_;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet DownloadItemCell* cell_;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is shown instead of progressView_ for dangerous downloads.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet NSView* dangerousDownloadView_;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet NSTextField* dangerousDownloadLabel_;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet NSButton* dangerousDownloadConfirmButton_;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Needed to find out how much the tweaker changed sizes to update the
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // other views.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet GTMWidthBasedTweaker* buttonTweaker_;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Because the confirm text and button for dangerous downloads are determined
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // at runtime, an outlet to the localizer is needed to construct the layout
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tweaker in awakeFromNib in order to adjust the UI after all strings are
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // determined.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet ChromeUILocalizer* localizer_;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet NSImageView* image_;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DownloadItemMac> bridge_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DownloadShelfContextMenuMac> menuBridge_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Weak pointer to the shelf that owns us.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadShelfController* shelf_;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The time at which this view was created.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time creationTime_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Default font to use for text metrics.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gfx::Font> font_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The state of this item.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum DownoadItemState {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kNormal,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kDangerous
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } state_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Initialize controller for |downloadItem|.
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)- (id)initWithDownload:(content::DownloadItem*)downloadItem
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 shelf:(DownloadShelfController*)shelf
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             navigator:(content::PageNavigator*)navigator;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Updates the UI and menu state from |downloadModel|.
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)- (void)setStateFromDownload:(DownloadItemModel*)downloadModel;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Remove ourself from the download UI.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)remove;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Update item's visibility depending on if the item is still completely
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contained in its parent.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)updateVisibility:(id)sender;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Called after a download is opened.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)downloadWasOpened;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Asynchronous icon loading callback.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)setIcon:(NSImage*)icon;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Download item button clicked
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)handleButtonClick:(id)sender;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the size this item wants to have.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSSize)preferredSize;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the DownloadItem model object belonging to this item.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (content::DownloadItem*)download;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Returns the MenuModel for the download item context menu. The returned
106558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// MenuModel is owned by the DownloadItemController and will be valid until the
107558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// DownloadItemController is destroyed.
108558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch- (ui::MenuModel*)contextMenuModel;
109558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Updates the tooltip with the download's path.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)updateToolTip;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handling of dangerous downloads
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)clearDangerousMode;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (BOOL)isDangerousMode;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)saveDownload:(id)sender;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)discardDownload:(id)sender;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end
120