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