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 #ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SHELF_CONTEXT_MENU_H_ 6 #define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SHELF_CONTEXT_MENU_H_ 7 8 #include "base/basictypes.h" 9 #include "base/compiler_specific.h" 10 #include "base/memory/scoped_ptr.h" 11 #include "base/strings/string16.h" 12 #include "content/public/browser/download_item.h" 13 #include "ui/base/models/simple_menu_model.h" 14 15 namespace content { 16 class PageNavigator; 17 } 18 19 // This class is responsible for the download shelf context menu. Platform 20 // specific subclasses are responsible for creating and running the menu. 21 // 22 // The DownloadItem corresponding to the context menu is observed for removal or 23 // destruction. 24 class DownloadShelfContextMenu : public ui::SimpleMenuModel::Delegate, 25 public content::DownloadItem::Observer { 26 public: 27 enum ContextMenuCommands { 28 SHOW_IN_FOLDER = 1, // Open a folder view window with the item selected. 29 OPEN_WHEN_COMPLETE, // Open the download when it's finished. 30 ALWAYS_OPEN_TYPE, // Default this file extension to always open. 31 PLATFORM_OPEN, // Open using platform handler. 32 CANCEL, // Cancel the download. 33 TOGGLE_PAUSE, // Pause or resume a download. 34 DISCARD, // Discard the malicious download. 35 KEEP, // Keep the malicious download. 36 LEARN_MORE_SCANNING, // Show information about download scanning. 37 LEARN_MORE_INTERRUPTED,// Show information about interrupted downloads. 38 REPORT, // Send the download to Google for analysis. 39 }; 40 41 virtual ~DownloadShelfContextMenu(); 42 43 content::DownloadItem* download_item() const { return download_item_; } 44 45 protected: 46 DownloadShelfContextMenu(content::DownloadItem* download_item, 47 content::PageNavigator* navigator); 48 49 // Returns the correct menu model depending on the state of the download item. 50 // Returns NULL if the download was destroyed. 51 ui::SimpleMenuModel* GetMenuModel(); 52 53 // ui::SimpleMenuModel::Delegate: 54 virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE; 55 virtual bool IsCommandIdChecked(int command_id) const OVERRIDE; 56 virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE; 57 virtual bool GetAcceleratorForCommandId( 58 int command_id, 59 ui::Accelerator* accelerator) OVERRIDE; 60 virtual bool IsItemForCommandIdDynamic(int command_id) const OVERRIDE; 61 virtual base::string16 GetLabelForCommandId(int command_id) const OVERRIDE; 62 63 private: 64 // Detaches self from |download_item_|. Called when the DownloadItem is 65 // destroyed or when this object is being destroyed. 66 void DetachFromDownloadItem(); 67 68 // content::DownloadItem::Observer 69 virtual void OnDownloadDestroyed(content::DownloadItem* download) OVERRIDE; 70 71 ui::SimpleMenuModel* GetInProgressMenuModel(); 72 ui::SimpleMenuModel* GetFinishedMenuModel(); 73 ui::SimpleMenuModel* GetInterruptedMenuModel(); 74 ui::SimpleMenuModel* GetMaybeMaliciousMenuModel(); 75 ui::SimpleMenuModel* GetMaliciousMenuModel(); 76 77 // We show slightly different menus if the download is in progress vs. if the 78 // download has finished. 79 scoped_ptr<ui::SimpleMenuModel> in_progress_download_menu_model_; 80 scoped_ptr<ui::SimpleMenuModel> finished_download_menu_model_; 81 scoped_ptr<ui::SimpleMenuModel> interrupted_download_menu_model_; 82 scoped_ptr<ui::SimpleMenuModel> maybe_malicious_download_menu_model_; 83 scoped_ptr<ui::SimpleMenuModel> malicious_download_menu_model_; 84 85 // Information source. 86 content::DownloadItem* download_item_; 87 88 // Used to open tabs. 89 content::PageNavigator* navigator_; 90 91 DISALLOW_COPY_AND_ASSIGN(DownloadShelfContextMenu); 92 }; 93 94 #endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SHELF_CONTEXT_MENU_H_ 95