| // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/download/download_shelf.h" |
| |
| #include "app/l10n_util.h" |
| #include "base/file_util.h" |
| #include "chrome/browser/browser.h" |
| #include "chrome/browser/dom_ui/downloads_ui.h" |
| #include "chrome/browser/download/download_item_model.h" |
| #include "chrome/browser/download/download_manager.h" |
| #include "chrome/browser/download/download_util.h" |
| #include "chrome/browser/metrics/user_metrics.h" |
| #include "chrome/common/url_constants.h" |
| #include "grit/generated_resources.h" |
| |
| // DownloadShelfContextMenu ---------------------------------------------------- |
| |
| DownloadShelfContextMenu::DownloadShelfContextMenu( |
| BaseDownloadItemModel* download_model) |
| : download_(download_model->download()), |
| model_(download_model) { |
| } |
| |
| DownloadShelfContextMenu::~DownloadShelfContextMenu() { |
| } |
| |
| bool DownloadShelfContextMenu::IsCommandIdChecked(int command_id) const { |
| switch (command_id) { |
| case OPEN_WHEN_COMPLETE: { |
| return download_->open_when_complete(); |
| } |
| case ALWAYS_OPEN_TYPE: { |
| return download_->manager()->ShouldOpenFileBasedOnExtension( |
| download_->full_path()); |
| } |
| } |
| return false; |
| } |
| |
| string16 DownloadShelfContextMenu::GetLabelForCommandId(int command_id) const { |
| switch (command_id) { |
| case SHOW_IN_FOLDER: |
| return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_SHOW); |
| case OPEN_WHEN_COMPLETE: |
| if (download_->state() == DownloadItem::IN_PROGRESS) |
| return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE); |
| return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_OPEN); |
| case ALWAYS_OPEN_TYPE: |
| return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE); |
| case CANCEL: |
| return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_CANCEL); |
| case TOGGLE_PAUSE: { |
| if (download_->is_paused()) |
| return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_RESUME_ITEM); |
| else |
| return l10n_util::GetStringUTF16(IDS_DOWNLOAD_MENU_PAUSE_ITEM); |
| } |
| default: |
| NOTREACHED(); |
| } |
| return string16(); |
| } |
| |
| bool DownloadShelfContextMenu::IsCommandIdEnabled(int command_id) const { |
| switch (command_id) { |
| case SHOW_IN_FOLDER: |
| case OPEN_WHEN_COMPLETE: |
| return download_->state() != DownloadItem::CANCELLED; |
| case ALWAYS_OPEN_TYPE: |
| return download_util::CanOpenDownload(download_); |
| case CANCEL: |
| return download_->state() == DownloadItem::IN_PROGRESS; |
| case TOGGLE_PAUSE: |
| return download_->state() == DownloadItem::IN_PROGRESS; |
| default: |
| return command_id > 0 && command_id < MENU_LAST; |
| } |
| } |
| |
| void DownloadShelfContextMenu::ExecuteCommand(int command_id) { |
| switch (command_id) { |
| case SHOW_IN_FOLDER: |
| download_->manager()->ShowDownloadInShell(download_); |
| break; |
| case OPEN_WHEN_COMPLETE: |
| download_util::OpenDownload(download_); |
| break; |
| case ALWAYS_OPEN_TYPE: { |
| download_->manager()->OpenFilesBasedOnExtension( |
| download_->full_path(), !IsCommandIdChecked(ALWAYS_OPEN_TYPE)); |
| break; |
| } |
| case CANCEL: |
| model_->CancelTask(); |
| break; |
| case TOGGLE_PAUSE: |
| // It is possible for the download to complete before the user clicks the |
| // menu item, recheck if the download is in progress state before toggling |
| // pause. |
| if (download_->state() == DownloadItem::IN_PROGRESS) |
| download_->TogglePause(); |
| break; |
| default: |
| NOTREACHED(); |
| } |
| } |
| |
| bool DownloadShelfContextMenu::GetAcceleratorForCommandId( |
| int command_id, menus::Accelerator* accelerator) { |
| return false; |
| } |
| |
| bool DownloadShelfContextMenu::IsLabelForCommandIdDynamic( |
| int command_id) const { |
| return command_id == TOGGLE_PAUSE; |
| } |
| |
| menus::SimpleMenuModel* DownloadShelfContextMenu::GetInProgressMenuModel() { |
| if (in_progress_download_menu_model_.get()) |
| return in_progress_download_menu_model_.get(); |
| |
| in_progress_download_menu_model_.reset(new menus::SimpleMenuModel(this)); |
| |
| in_progress_download_menu_model_->AddCheckItemWithStringId( |
| OPEN_WHEN_COMPLETE, IDS_DOWNLOAD_MENU_OPEN_WHEN_COMPLETE); |
| in_progress_download_menu_model_->AddCheckItemWithStringId( |
| ALWAYS_OPEN_TYPE, IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE); |
| in_progress_download_menu_model_->AddSeparator(); |
| in_progress_download_menu_model_->AddItemWithStringId( |
| TOGGLE_PAUSE, IDS_DOWNLOAD_MENU_PAUSE_ITEM); |
| in_progress_download_menu_model_->AddItemWithStringId( |
| SHOW_IN_FOLDER, IDS_DOWNLOAD_MENU_SHOW); |
| in_progress_download_menu_model_->AddSeparator(); |
| in_progress_download_menu_model_->AddItemWithStringId( |
| CANCEL, IDS_DOWNLOAD_MENU_CANCEL); |
| |
| return in_progress_download_menu_model_.get(); |
| } |
| |
| menus::SimpleMenuModel* DownloadShelfContextMenu::GetFinishedMenuModel() { |
| if (finished_download_menu_model_.get()) |
| return finished_download_menu_model_.get(); |
| |
| finished_download_menu_model_.reset(new menus::SimpleMenuModel(this)); |
| |
| finished_download_menu_model_->AddItemWithStringId( |
| OPEN_WHEN_COMPLETE, IDS_DOWNLOAD_MENU_OPEN); |
| finished_download_menu_model_->AddCheckItemWithStringId( |
| ALWAYS_OPEN_TYPE, IDS_DOWNLOAD_MENU_ALWAYS_OPEN_TYPE); |
| finished_download_menu_model_->AddSeparator(); |
| finished_download_menu_model_->AddItemWithStringId( |
| SHOW_IN_FOLDER, IDS_DOWNLOAD_MENU_SHOW); |
| finished_download_menu_model_->AddSeparator(); |
| finished_download_menu_model_->AddItemWithStringId( |
| CANCEL, IDS_DOWNLOAD_MENU_CANCEL); |
| |
| return finished_download_menu_model_.get(); |
| } |