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