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