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