download_shelf.cc revision 3345a6884c488ff3a535c2c9acdd33d74b37e311
1// Copyright (c) 2009 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#include "chrome/browser/download/download_shelf.h" 6 7#include "app/l10n_util.h" 8#include "base/file_util.h" 9#include "chrome/browser/browser.h" 10#include "chrome/browser/dom_ui/downloads_ui.h" 11#include "chrome/browser/download/download_item.h" 12#include "chrome/browser/download/download_item_model.h" 13#include "chrome/browser/download/download_manager.h" 14#include "chrome/browser/download/download_util.h" 15#include "chrome/browser/metrics/user_metrics.h" 16#include "chrome/common/url_constants.h" 17#include "grit/generated_resources.h" 18 19// DownloadShelfContextMenu ---------------------------------------------------- 20 21DownloadShelfContextMenu::DownloadShelfContextMenu( 22 BaseDownloadItemModel* download_model) 23 : download_(download_model->download()), 24 model_(download_model) { 25} 26 27DownloadShelfContextMenu::~DownloadShelfContextMenu() { 28} 29 30bool DownloadShelfContextMenu::IsCommandIdChecked(int command_id) const { 31 switch (command_id) { 32 case OPEN_WHEN_COMPLETE: 33 return download_->open_when_complete(); 34 case ALWAYS_OPEN_TYPE: 35 return download_->ShouldOpenFileBasedOnExtension(); 36 } 37 return false; 38} 39 40string16 DownloadShelfContextMenu::GetLabelForCommandId(int command_id) const { 41 switch (command_id) { 42 case SHOW_IN_FOLDER: 43 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_SHOW); 44 case OPEN_WHEN_COMPLETE: 45 if (download_->state() == DownloadItem::IN_PROGRESS) 46 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE); 47 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN); 48 case ALWAYS_OPEN_TYPE: 49 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE); 50 case CANCEL: 51 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_CANCEL); 52 case TOGGLE_PAUSE: { 53 if (download_->is_paused()) 54 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_RESUME_ITEM); 55 else 56 return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_PAUSE_ITEM); 57 } 58 default: 59 NOTREACHED(); 60 } 61 return string16(); 62} 63 64bool DownloadShelfContextMenu::IsCommandIdEnabled(int command_id) const { 65 switch (command_id) { 66 case SHOW_IN_FOLDER: 67 case OPEN_WHEN_COMPLETE: 68 return download_->state() != DownloadItem::CANCELLED; 69 case ALWAYS_OPEN_TYPE: 70 return download_->CanOpenDownload(); 71 case CANCEL: 72 return download_->state() == DownloadItem::IN_PROGRESS; 73 case TOGGLE_PAUSE: 74 return download_->state() == DownloadItem::IN_PROGRESS; 75 default: 76 return command_id > 0 && command_id < MENU_LAST; 77 } 78} 79 80void DownloadShelfContextMenu::ExecuteCommand(int command_id) { 81 switch (command_id) { 82 case SHOW_IN_FOLDER: 83 download_->ShowDownloadInShell(); 84 break; 85 case OPEN_WHEN_COMPLETE: 86 download_->OpenDownload(); 87 break; 88 case ALWAYS_OPEN_TYPE: { 89 download_->OpenFilesBasedOnExtension( 90 !IsCommandIdChecked(ALWAYS_OPEN_TYPE)); 91 break; 92 } 93 case CANCEL: 94 model_->CancelTask(); 95 break; 96 case TOGGLE_PAUSE: 97 // It is possible for the download to complete before the user clicks the 98 // menu item, recheck if the download is in progress state before toggling 99 // pause. 100 if (download_->state() == DownloadItem::IN_PROGRESS) 101 download_->TogglePause(); 102 break; 103 default: 104 NOTREACHED(); 105 } 106} 107 108bool DownloadShelfContextMenu::GetAcceleratorForCommandId( 109 int command_id, menus::Accelerator* accelerator) { 110 return false; 111} 112 113bool DownloadShelfContextMenu::IsLabelForCommandIdDynamic( 114 int command_id) const { 115 return command_id == TOGGLE_PAUSE; 116} 117 118menus::SimpleMenuModel* DownloadShelfContextMenu::GetInProgressMenuModel() { 119 if (in_progress_download_menu_model_.get()) 120 return in_progress_download_menu_model_.get(); 121 122 in_progress_download_menu_model_.reset(new menus::SimpleMenuModel(this)); 123 124 in_progress_download_menu_model_->AddCheckItemWithStringId( 125 OPEN_WHEN_COMPLETE, IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE); 126 in_progress_download_menu_model_->AddCheckItemWithStringId( 127 ALWAYS_OPEN_TYPE, IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE); 128 in_progress_download_menu_model_->AddSeparator(); 129 in_progress_download_menu_model_->AddItemWithStringId( 130 TOGGLE_PAUSE, IDS_DOWNLOAD_MENU_PAUSE_ITEM); 131 in_progress_download_menu_model_->AddItemWithStringId( 132 SHOW_IN_FOLDER, IDS_DOWNLOAD_MENU_SHOW); 133 in_progress_download_menu_model_->AddSeparator(); 134 in_progress_download_menu_model_->AddItemWithStringId( 135 CANCEL, IDS_DOWNLOAD_MENU_CANCEL); 136 137 return in_progress_download_menu_model_.get(); 138} 139 140menus::SimpleMenuModel* DownloadShelfContextMenu::GetFinishedMenuModel() { 141 if (finished_download_menu_model_.get()) 142 return finished_download_menu_model_.get(); 143 144 finished_download_menu_model_.reset(new menus::SimpleMenuModel(this)); 145 146 finished_download_menu_model_->AddItemWithStringId( 147 OPEN_WHEN_COMPLETE, IDS_DOWNLOAD_MENU_OPEN); 148 finished_download_menu_model_->AddCheckItemWithStringId( 149 ALWAYS_OPEN_TYPE, IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE); 150 finished_download_menu_model_->AddSeparator(); 151 finished_download_menu_model_->AddItemWithStringId( 152 SHOW_IN_FOLDER, IDS_DOWNLOAD_MENU_SHOW); 153 finished_download_menu_model_->AddSeparator(); 154 finished_download_menu_model_->AddItemWithStringId( 155 CANCEL, IDS_DOWNLOAD_MENU_CANCEL); 156 157 return finished_download_menu_model_.get(); 158} 159