Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2230)

Unified Diff: chrome/browser/download_tab_view.cc

Issue 2826: Move the download code to new directories: (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 12 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/download_tab_view.h ('k') | chrome/browser/download_uitest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/download_tab_view.cc
===================================================================
--- chrome/browser/download_tab_view.cc (revision 2162)
+++ chrome/browser/download_tab_view.cc (working copy)
@@ -1,1183 +0,0 @@
-// Copyright (c) 2006-2008 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_tab_view.h"
-
-#include <time.h>
-
-#include <algorithm>
-#include <functional>
-
-#include "base/file_util.h"
-#include "base/string_util.h"
-#include "base/task.h"
-#include "base/time_format.h"
-#include "base/timer.h"
-#include "chrome/app/theme/theme_resources.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/download_manager.h"
-#include "chrome/browser/download_util.h"
-#include "chrome/browser/profile.h"
-#include "chrome/browser/user_metrics.h"
-#include "chrome/common/gfx/chrome_canvas.h"
-#include "chrome/common/gfx/chrome_font.h"
-#include "chrome/common/l10n_util.h"
-#include "chrome/common/resource_bundle.h"
-#include "chrome/common/stl_util-inl.h"
-#include "chrome/common/time_format.h"
-#include "chrome/views/background.h"
-#include "googleurl/src/gurl.h"
-#include "generated_resources.h"
-
-// Approximate spacing, in pixels, taken from initial UI mock up screens
-static const int kVerticalPadding = 5;
-static const int kHorizontalButtonPadding = 15;
-
-// For vertical and horizontal element spacing
-static const int kSpacer = 20;
-
-// Horizontal space between the left edge of the entries and the
-// left edge of the view.
-static const int kLeftMargin = 38;
-
-// x-position of the icon (massage this so it visually matches
-// kDestinationSearchOffset in native_ui_contents.cc
-static const int kDownloadIconOffset = 132;
-
-// Padding between the progress icon and the title, url
-static const int kInfoPadding = 16;
-
-// Horizontal distance from the left window edge to the left icon edge
-static const int kDateSize = 132;
-
-// Maximum size of the text for the file name or URL
-static const int kFilenameSize = 350;
-
-// Maximum size of the progress text during download, which is taken
-// out of kFilenameSize
-static const int kProgressSize = 170;
-
-// Status label color (grey)
-static const SkColor kStatusColor = SkColorSetRGB(128, 128, 128);
-
-// URL label color (green)
-static const SkColor kUrlColor = SkColorSetRGB(0, 128, 0);
-
-// Paused download indicator (red)
-static const SkColor kPauseColor = SkColorSetRGB(128, 0, 0);
-
-// Selected item background color
-static const SkColor kSelectedItemColor = SkColorSetRGB(215, 232, 255);
-
-// State key used to identify search text.
-static const wchar_t kSearchTextKey[] = L"st";
-
-// Sorting functor for DownloadItem --------------------------------------------
-
-// Sort DownloadItems into ascending order by their start time.
-class DownloadItemSorter : public std::binary_function<DownloadItem*,
- DownloadItem*,
- bool> {
- public:
- bool operator()(const DownloadItem* lhs, const DownloadItem* rhs) {
- return lhs->start_time() < rhs->start_time();
- }
-};
-
-
-// DownloadItemTabView implementation ------------------------------------------
-DownloadItemTabView::DownloadItemTabView()
- : model_(NULL),
- parent_(NULL) {
- // Create our element views using empty strings for now,
- // set them based on the model's state in Layout().
- since_ = new ChromeViews::Label(L"");
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- ChromeFont font = rb.GetFont(ResourceBundle::WebFont);
- since_->SetHorizontalAlignment(ChromeViews::Label::ALIGN_LEFT);
- since_->SetFont(font);
- AddChildView(since_);
-
- date_ = new ChromeViews::Label(L"");
- date_->SetColor(kStatusColor);
- date_->SetHorizontalAlignment(ChromeViews::Label::ALIGN_LEFT);
- date_->SetFont(font);
- AddChildView(date_);
-
- // file_name_ is enabled once the download has finished and we can open
- // it via ShellExecute.
- file_name_ = new ChromeViews::Link(L"");
- file_name_->SetHorizontalAlignment(ChromeViews::Label::ALIGN_LEFT);
- file_name_->SetController(this);
- file_name_->SetFont(font);
- AddChildView(file_name_);
-
- // Set our URL name
- download_url_ = new ChromeViews::Label(L"");
- download_url_->SetColor(kUrlColor);
- download_url_->SetHorizontalAlignment(ChromeViews::Label::ALIGN_LEFT);
- download_url_->SetFont(font);
- AddChildView(download_url_);
-
- // Set our time remaining
- time_remaining_ = new ChromeViews::Label(L"");
- time_remaining_->SetColor(kStatusColor);
- time_remaining_->SetHorizontalAlignment(ChromeViews::Label::ALIGN_LEFT);
- time_remaining_->SetFont(font);
- AddChildView(time_remaining_);
-
- // Set our download progress
- download_progress_ = new ChromeViews::Label(L"");
- download_progress_->SetColor(kStatusColor);
- download_progress_->SetHorizontalAlignment(ChromeViews::Label::ALIGN_LEFT);
- download_progress_->SetFont(font);
- AddChildView(download_progress_);
-
- // Set our 'Pause', 'Cancel' and 'Show in folder' links using
- // actual strings, since these are constant
- pause_ = new ChromeViews::Link(l10n_util::GetString(IDS_DOWNLOAD_LINK_PAUSE));
- pause_->SetController(this);
- pause_->SetFont(font);
- AddChildView(pause_);
-
- cancel_ = new ChromeViews::Link(
- l10n_util::GetString(IDS_DOWNLOAD_LINK_CANCEL));
- cancel_->SetController(this);
- cancel_->SetFont(font);
- AddChildView(cancel_);
-
- show_ = new ChromeViews::Link(l10n_util::GetString(IDS_DOWNLOAD_LINK_SHOW));
- show_->SetController(this);
- show_->SetFont(font);
- AddChildView(show_);
-}
-
-DownloadItemTabView::~DownloadItemTabView() {
-}
-
-void DownloadItemTabView::SetModel(DownloadItem* model,
- DownloadTabView* parent) {
- DCHECK(model && parent);
- model_ = model;
- parent_ = parent;
- parent_->LookupIcon(model_);
-}
-
-void DownloadItemTabView::GetPreferredSize(CSize* out) {
- CSize pause_size;
- pause_->GetPreferredSize(&pause_size);
- CSize cancel_size;
- cancel_->GetPreferredSize(&cancel_size);
- CSize show_size;
- show_->GetPreferredSize(&show_size);
-
- out->cx = download_util::kBigProgressIconSize +
- 2 * kSpacer +
- kHorizontalButtonPadding +
- kFilenameSize +
- std::max(pause_size.cx + cancel_size.cx + kHorizontalButtonPadding,
- show_size.cx);
-
- out->cy = download_util::kBigProgressIconSize;
-}
-
-// Each DownloadItemTabView has reasonably complex layout requirements
-// that are based on the state of its model. To make the code much simpler
-// to read, Layout() is split into state specific code which will result
-// in some redundant code.
-void DownloadItemTabView::Layout() {
- DCHECK(model_);
- switch (model_->state()) {
- case DownloadItem::COMPLETE:
- LayoutComplete();
- break;
- case DownloadItem::CANCELLED:
- LayoutCancelled();
- break;
- case DownloadItem::IN_PROGRESS:
- LayoutInProgress();
- break;
- case DownloadItem::REMOVING:
- break;
- default:
- NOTREACHED();
- }
-}
-
-// Only display the date if the download is the last that occurred
-// on a given day.
-void DownloadItemTabView::LayoutDate() {
- if (!parent_->ShouldDrawDateForDownload(model_)) {
- since_->SetVisible(false);
- date_->SetVisible(false);
- return;
- }
-
- CSize since_size;
-
- since_->SetText(TimeFormat::RelativeDate(model_->start_time(), NULL));
- since_->GetPreferredSize(&since_size);
- since_->SetBounds(kLeftMargin, download_util::kBigProgressIconOffset,
- kDateSize, since_size.cy);
- since_->SetVisible(true);
-
- CSize date_size;
- date_->SetText(base::TimeFormatShortDate(model_->start_time()));
- date_->GetPreferredSize(&date_size);
- date_->SetBounds(kLeftMargin, since_size.cy + kVerticalPadding +
- download_util::kBigProgressIconOffset,
- kDateSize, date_size.cy);
- date_->SetVisible(true);
-}
-
-// DownloadItem::COMPLETE state layout
-void DownloadItemTabView::LayoutComplete() {
- // Hide unused UI elements
- pause_->SetVisible(false);
- pause_->SetEnabled(false);
- cancel_->SetVisible(false);
- cancel_->SetEnabled(false);
- time_remaining_->SetVisible(false);
- download_progress_->SetVisible(false);
-
- LayoutDate();
- int dx = kDownloadIconOffset - download_util::kBigProgressIconOffset +
- download_util::kBigProgressIconSize + kInfoPadding;
-
- // File name and URL
- CSize file_name_size;
- file_name_->SetText(model_->file_name());
- file_name_->GetPreferredSize(&file_name_size);
- file_name_->SetBounds(dx, download_util::kBigProgressIconOffset,
- std::min(kFilenameSize,
- static_cast<int>(file_name_size.cx)),
- file_name_size.cy);
- file_name_->SetVisible(true);
- file_name_->SetEnabled(true);
-
- GURL url(model_->url());
- download_url_->SetURL(url);
- CSize url_size;
- download_url_->GetPreferredSize(&url_size);
- download_url_->SetBounds(dx,
- file_name_size.cy + kVerticalPadding +
- download_util::kBigProgressIconOffset,
- std::min(kFilenameSize,
- static_cast<int>(GetWidth() - dx)),
- url_size.cy);
- download_url_->SetVisible(true);
- dx += kFilenameSize + kSpacer;
-
- // Action button (text is constant and set in constructor)
- CSize show_size;
- show_->GetPreferredSize(&show_size);
- show_->SetBounds(dx, ((file_name_size.cy + url_size.cy) / 2) +
- download_util::kBigProgressIconOffset,
- show_size.cx, show_size.cy);
- show_->SetVisible(true);
- show_->SetEnabled(true);
-}
-
-// DownloadItem::CANCELLED state layout
-void DownloadItemTabView::LayoutCancelled() {
- // Hide unused UI elements
- show_->SetVisible(false);
- show_->SetEnabled(false);
- pause_->SetVisible(false);
- pause_->SetEnabled(false);
- cancel_->SetVisible(false);
- cancel_->SetEnabled(false);
-
- LayoutDate();
- int dx = kDownloadIconOffset - download_util::kBigProgressIconOffset +
- download_util::kBigProgressIconSize + kInfoPadding;
-
- // File name and URL, truncated to show cancelled status
- CSize file_name_size;
- file_name_->SetText(model_->file_name());
- file_name_->GetPreferredSize(&file_name_size);
- file_name_->SetBounds(dx, download_util::kBigProgressIconOffset,
- kFilenameSize - kProgressSize - kSpacer,
- file_name_size.cy);
- file_name_->SetVisible(true);
- file_name_->SetEnabled(false);
-
- GURL url(model_->url());
- download_url_->SetURL(url);
- CSize url_size;
- download_url_->GetPreferredSize(&url_size);
- download_url_->SetBounds(dx,
- file_name_size.cy + kVerticalPadding +
- download_util::kBigProgressIconOffset,
- std::min(kFilenameSize - kProgressSize - kSpacer,
- static_cast<int>(GetWidth() - dx)),
- url_size.cy);
- download_url_->SetVisible(true);
-
- dx += kFilenameSize - kProgressSize;
-
- // Display cancelled status
- CSize cancel_size;
- time_remaining_->SetColor(kStatusColor);
- time_remaining_->SetText(l10n_util::GetString(IDS_DOWNLOAD_TAB_CANCELLED));
- time_remaining_->GetPreferredSize(&cancel_size);
- time_remaining_->SetBounds(dx, download_util::kBigProgressIconOffset,
- kProgressSize, cancel_size.cy);
- time_remaining_->SetVisible(true);
-
- // Display received size, we may not know the total size if the server didn't
- // provide a content-length.
- int64 total = model_->total_bytes();
- int64 size = model_->received_bytes();
- DataUnits amount_units = GetByteDisplayUnits(size);
- std::wstring received_size = FormatBytes(size, amount_units, true);
- std::wstring amount = received_size;
-
- // We don't know which string we'll end up using for constructing the final
- // progress string so we need to adjust both strings for the locale
- // direction.
- std::wstring amount_localized;
- if (l10n_util::AdjustStringForLocaleDirection(amount, &amount_localized)) {
- amount.assign(amount_localized);
- received_size.assign(amount_localized);
- }
-
- if (total > 0) {
- amount_units = GetByteDisplayUnits(total);
- std::wstring total_text = FormatBytes(total, amount_units, true);
- std::wstring total_text_localized;
- if (l10n_util::AdjustStringForLocaleDirection(total_text,
- &total_text_localized))
- total_text.assign(total_text_localized);
-
- // Note that there is no need to adjust the new amount string for the
- // locale direction as ChromeViews::Label does that for us.
- amount = l10n_util::GetStringF(IDS_DOWNLOAD_TAB_PROGRESS_SIZE,
- received_size,
- total_text);
- }
-
- CSize byte_size;
- download_progress_->SetText(amount);
- download_progress_->GetPreferredSize(&byte_size);
- download_progress_->SetBounds(dx,
- file_name_size.cy + kVerticalPadding +
- download_util::kBigProgressIconOffset,
- kProgressSize,
- byte_size.cy);
- download_progress_->SetVisible(true);
-}
-
-// DownloadItem::IN_PROGRESS state layout
-void DownloadItemTabView::LayoutInProgress() {
- // Hide unused UI elements
- show_->SetVisible(false);
- show_->SetEnabled(false);
-
- LayoutDate();
- int dx = kDownloadIconOffset - download_util::kBigProgressIconOffset +
- download_util::kBigProgressIconSize +
- kInfoPadding;
-
- // File name and URL, truncated to show progress status
- CSize file_name_size;
- file_name_->SetText(model_->file_name());
- file_name_->GetPreferredSize(&file_name_size);
- file_name_->SetBounds(dx, download_util::kBigProgressIconOffset,
- kFilenameSize - kProgressSize - kSpacer,
- file_name_size.cy);
- file_name_->SetVisible(true);
- file_name_->SetEnabled(false);
-
- GURL url(model_->url());
- download_url_->SetURL(url);
- CSize url_size;
- download_url_->GetPreferredSize(&url_size);
- download_url_->SetBounds(dx, file_name_size.cy + kVerticalPadding +
- download_util::kBigProgressIconOffset,
- std::min(kFilenameSize - kProgressSize - kSpacer,
- static_cast<int>(GetWidth() - dx)),
- url_size.cy);
- download_url_->SetVisible(true);
-
- dx += kFilenameSize - kProgressSize;
-
- // Set the time remaining and progress display strings. This can
- // be complicated by not having received the total download size
- // In that case, we can't calculate time remaining so we just
- // display speed and received size.
-
- // Size
- int64 total = model_->total_bytes();
- int64 size = model_->received_bytes();
- DataUnits amount_units = GetByteDisplayUnits(size);
- std::wstring received_size = FormatBytes(size, amount_units, true);
- std::wstring amount = received_size;
-
- // Adjust both strings for the locale direction since we don't yet know which
- // string we'll end up using for constructing the final progress string.
- std::wstring amount_localized;
- if (l10n_util::AdjustStringForLocaleDirection(amount, &amount_localized)) {
- amount.assign(amount_localized);
- received_size.assign(amount_localized);
- }
-
- if (total > 0) {
- amount_units = GetByteDisplayUnits(total);
- std::wstring total_text = FormatBytes(total, amount_units, true);
- std::wstring total_text_localized;
- if (l10n_util::AdjustStringForLocaleDirection(total_text,
- &total_text_localized))
- total_text.assign(total_text_localized);
-
- amount = l10n_util::GetStringF(IDS_DOWNLOAD_TAB_PROGRESS_SIZE,
- received_size,
- total_text);
-
- // We adjust the 'amount' string in case we use it as part of the progress
- // text.
- if (l10n_util::AdjustStringForLocaleDirection(amount, &amount_localized))
- amount.assign(amount_localized);
- }
-
- // Speed
- int64 speed = model_->CurrentSpeed();
- std::wstring progress = amount;
- if (!model_->is_paused() && speed > 0) {
- amount_units = GetByteDisplayUnits(speed);
- std::wstring speed_text = FormatSpeed(speed, amount_units, true);
- std::wstring speed_text_localized;
- if (l10n_util::AdjustStringForLocaleDirection(speed_text,
- &speed_text_localized))
- speed_text.assign(speed_text_localized);
-
- progress = l10n_util::GetStringF(IDS_DOWNLOAD_TAB_PROGRESS_SPEED,
- speed_text,
- amount);
-
- // For some reason, the appearance of the dash character ('-') in a string
- // causes Windows to ignore the 'LRE'/'RLE'/'PDF' Unicode formatting
- // characters within the string and this causes the string to be displayed
- // incorrectly on RTL UIs. Therefore, we add the Unicode right-to-left
- // override character (U+202E) if the locale is RTL in order to fix this
- // problem.
- if (l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT)
- progress.insert(0, L"\x202E");
- }
-
- // Time remaining
- int y_pos = file_name_size.cy + kVerticalPadding +
- download_util::kBigProgressIconOffset;
- CSize time_size;
- time_remaining_->SetColor(kStatusColor);
- if (model_->is_paused()) {
- time_remaining_->SetColor(kPauseColor);
- time_remaining_->SetText(
- l10n_util::GetString(IDS_DOWNLOAD_PROGRESS_PAUSED));
- time_remaining_->GetPreferredSize(&time_size);
- time_remaining_->SetBounds(dx, download_util::kBigProgressIconOffset,
- kProgressSize, time_size.cy);
- time_remaining_->SetVisible(true);
- } else if (total > 0) {
- TimeDelta remaining;
- if (model_->TimeRemaining(&remaining))
- time_remaining_->SetText(TimeFormat::TimeRemaining(remaining));
- time_remaining_->GetPreferredSize(&time_size);
- time_remaining_->SetBounds(dx, download_util::kBigProgressIconOffset,
- kProgressSize, time_size.cy);
- time_remaining_->SetVisible(true);
- } else {
- time_remaining_->SetText(L"");
- y_pos = ((file_name_size.cy + url_size.cy) / 2) +
- download_util::kBigProgressIconOffset;
- }
-
- CSize byte_size;
- download_progress_->SetText(progress);
- download_progress_->GetPreferredSize(&byte_size);
- download_progress_->SetBounds(dx, y_pos,
- kProgressSize, byte_size.cy);
- download_progress_->SetVisible(true);
-
- dx += kProgressSize + kSpacer;
- y_pos = ((file_name_size.cy + url_size.cy) / 2) +
- download_util::kBigProgressIconOffset;
-
- // Pause (or Resume) / Cancel buttons.
- if (model_->is_paused())
- pause_->SetText(l10n_util::GetString(IDS_DOWNLOAD_LINK_RESUME));
- else
- pause_->SetText(l10n_util::GetString(IDS_DOWNLOAD_LINK_PAUSE));
-
- CSize pause_size;
- pause_->SetVisible(true);
- pause_->SetEnabled(true);
- pause_->GetPreferredSize(&pause_size);
- pause_->SetBounds(dx, y_pos, pause_size.cx, pause_size.cy);
-
- dx += pause_size.cx + kHorizontalButtonPadding;
-
- CSize cancel_size;
- cancel_->GetPreferredSize(&cancel_size);
- cancel_->SetBounds(dx, y_pos, cancel_size.cx, cancel_size.cy);
- cancel_->SetVisible(true);
- cancel_->SetEnabled(true);
-}
-
-void DownloadItemTabView::Paint(ChromeCanvas* canvas) {
- PaintBackground(canvas);
-
- if (model_->state() == DownloadItem::IN_PROGRESS) {
- download_util::PaintDownloadProgress(canvas,
- this,
- kDownloadIconOffset -
- download_util::kBigProgressIconOffset,
- 0,
- parent_->start_angle(),
- model_->PercentComplete(),
- download_util::BIG);
- }
-
- // Most of the UI elements in the DownloadItemTabView are represented as
- // child Views and therefore they get mirrored automatically in
- // right-to-left UIs. The download item icon is not contained within a child
- // View so we need to mirror it manually if the locale is RTL.
- SkBitmap* icon = parent_->LookupIcon(model_);
- if (icon) {
- gfx::Rect icon_bounds(kDownloadIconOffset,
- download_util::kBigProgressIconOffset,
- icon->width(), icon->height());
- icon_bounds.set_x(MirroredLeftPointForRect(icon_bounds));
- canvas->DrawBitmapInt(*icon, icon_bounds.x(), icon_bounds.y());
- }
-}
-
-void DownloadItemTabView::PaintBackground(ChromeCanvas* canvas) {
- if (parent_->ItemIsSelected(model_)) {
- // Before we paint the border and the focus rect, we need to mirror the
- // highlighted area if the View is using a right-to-left UI layout. We need
- // to explicitly mirror the position because the highlighted area is
- // directly painted on the canvas (as opposed to being represented as a
- // child View like the rest of the UI elements in DownloadItemTabView).
- gfx::Rect highlighted_bounds(kDownloadIconOffset -
- download_util::kBigProgressIconOffset,
- 0,
- download_util::kBigProgressIconSize +
- kInfoPadding + kFilenameSize,
- download_util::kBigProgressIconSize);
- highlighted_bounds.set_x(MirroredLeftPointForRect(highlighted_bounds));
-
- canvas->FillRectInt(kSelectedItemColor,
- highlighted_bounds.x(),
- highlighted_bounds.y(),
- highlighted_bounds.width(),
- highlighted_bounds.height());
-
- canvas->DrawFocusRect(highlighted_bounds.x(),
- highlighted_bounds.y(),
- highlighted_bounds.width(),
- highlighted_bounds.height());
- }
-}
-
-void DownloadItemTabView::DidChangeBounds(const CRect& previous,
- const CRect& current) {
- Layout();
-}
-
-bool DownloadItemTabView::OnMousePressed(const ChromeViews::MouseEvent& event) {
- CPoint point(event.GetX(), event.GetY());
-
- // If the click is in the highlight region, then highlight this download.
- // Otherwise, remove the highlighting from any download.
- CRect select_rect(kDownloadIconOffset - download_util::kBigProgressIconOffset,
- 0,
- kDownloadIconOffset -
- download_util::kBigProgressIconOffset +
- download_util::kBigProgressIconSize + kInfoPadding +
- kFilenameSize,
- download_util::kBigProgressIconSize);
-
- // The position of the highlighted region does not take into account the
- // View's UI layout so we have to manually mirror the position if the View is
- // using a right-to-left UI layout.
- gfx::Rect mirrored_rect(select_rect);
- select_rect.MoveToX(MirroredLeftPointForRect(mirrored_rect));
- if (select_rect.PtInRect(point)) {
- parent_->ItemBecameSelected(model_);
-
- if (event.IsRightMouseButton()) {
- ChromeViews::View::ConvertPointToScreen(this, &point);
-
- download_util::DownloadDestinationContextMenu menu(
- model_, GetViewContainer()->GetHWND(), point);
- }
- } else {
- parent_->ItemBecameSelected(NULL);
- }
-
- return true;
-}
-
-// Handle drag (file copy) operations.
-bool DownloadItemTabView::OnMouseDragged(const ChromeViews::MouseEvent& event) {
- if (model_->state() != DownloadItem::COMPLETE)
- return false;
-
- CPoint point(event.GetX(), event.GetY());
-
- // In order to make sure drag and drop works as expected when the UI is
- // mirrored, we can either flip the mouse X coordinate or flip the X position
- // of the drag rectangle. Flipping the mouse X coordinate is easier.
- point.x = MirroredXCoordinateInsideView(point.x);
- CRect drag_rect(kDownloadIconOffset - download_util::kBigProgressIconOffset,
- 0,
- kDownloadIconOffset - download_util::kBigProgressIconOffset +
- download_util::kBigProgressIconSize + kInfoPadding +
- kFilenameSize,
- download_util::kBigProgressIconSize);
-
- if (drag_rect.PtInRect(point)) {
- SkBitmap* icon = parent_->LookupIcon(model_);
- if (icon)
- download_util::DragDownload(model_, icon);
- }
-
- return true;
-}
-
-void DownloadItemTabView::LinkActivated(ChromeViews::Link* source,
- int event_flags) {
- // There are several links in our view that could have been clicked:
- if (source == file_name_) {
- ChromeViews::ViewContainer* container = this->GetViewContainer();
- HWND parent_window = container ? container->GetHWND() : NULL;
- model_->manager()->OpenDownloadInShell(model_, parent_window);
- } else if (source == pause_) {
- model_->TogglePause();
- } else if (source == cancel_) {
- model_->Cancel(true /* update history service */);
- } else if (source == show_) {
- model_->manager()->ShowDownloadInShell(model_);
- } else {
- NOTREACHED();
- }
-
- parent_->ItemBecameSelected(model_);
-}
-
-
-// DownloadTabView implementation ----------------------------------------------
-
-DownloadTabView::DownloadTabView(DownloadManager* model)
- : model_(model),
- start_angle_(download_util::kStartAngleDegrees),
- scroll_helper_(kSpacer, download_util::kBigProgressIconSize + kSpacer),
- selected_index_(-1) {
- DCHECK(model_);
-}
-
-DownloadTabView::~DownloadTabView() {
- StopDownloadProgress();
- model_->RemoveObserver(this);
-
- // DownloadManager owns the contents.
- downloads_.clear();
- ClearDownloadInProgress();
-
- icon_consumer_.CancelAllRequests();
-}
-
-void DownloadTabView::Initialize() {
- model_->AddObserver(this);
-}
-
-// Start progress animation timers when we get our first (in-progress) download.
-void DownloadTabView::StartDownloadProgress() {
- if (progress_timer_.IsRunning())
- return;
- progress_timer_.Start(
- TimeDelta::FromMilliseconds(download_util::kProgressRateMs), this,
- &DownloadTabView::UpdateDownloadProgress);
-}
-
-// Stop progress animation when there are no more in-progress downloads.
-void DownloadTabView::StopDownloadProgress() {
- progress_timer_.Stop();
-}
-
-// Update our animations.
-void DownloadTabView::UpdateDownloadProgress() {
- start_angle_ = (start_angle_ + download_util::kUnknownIncrementDegrees) %
- download_util::kMaxDegrees;
- SchedulePaint();
-}
-
-void DownloadTabView::DidChangeBounds(const CRect& previous,
- const CRect& current) {
- Layout();
-}
-
-void DownloadTabView::Layout() {
- CRect r;
- DetachAllFloatingViews();
- View* v = GetParent();
- if (v) {
- v->GetLocalBounds(&r, true);
- int x = GetX();
- int y = GetY();
- int w = v->GetWidth();
- int h = static_cast<int>(downloads_.size()) *
- (download_util::kBigProgressIconSize + kSpacer) + kSpacer;
- SetBounds(x, y, w, h);
- }
-}
-
-// Paint our scrolled region
-void DownloadTabView::Paint(ChromeCanvas* canvas) {
- ChromeViews::View::Paint(canvas);
-
- if (download_util::kBigIconSize == 0 || downloads_.size() == 0)
- return;
-
- SkRect clip;
- if (canvas->getClipBounds(&clip)) {
- int row_start = (SkScalarRound(clip.fTop) - kSpacer) /
- (download_util::kBigProgressIconSize + kSpacer);
- int row_stop = SkScalarRound(clip.fBottom) /
- (download_util::kBigProgressIconSize + kSpacer);
- SkRect download_rect;
- for (int i = row_start; i <= row_stop; ++i) {
- int y = i * (download_util::kBigProgressIconSize + kSpacer) + kSpacer;
- if (HasFloatingViewForPoint(0, y))
- continue;
- download_rect.set(SkIntToScalar(0),
- SkIntToScalar(y),
- SkIntToScalar(GetWidth()),
- SkIntToScalar(y + download_util::kBigProgressIconSize));
- if (SkRect::Intersects(clip, download_rect)) {
- // The DownloadManager stores downloads earliest first, but this
- // view displays latest first, so adjust the index:
- int index = static_cast<int>(downloads_.size()) - 1 - i;
- download_renderer_.SetModel(downloads_[index], this);
- PaintFloatingView(canvas, &download_renderer_,
- 0, y,
- GetWidth(), download_util::kBigProgressIconSize);
- }
- }
- }
-}
-
-// Draw the DownloadItemTabView for the current position.
-bool DownloadTabView::GetFloatingViewIDForPoint(int x, int y, int* id) {
- if (y < kSpacer ||
- y > (kSpacer + download_util::kBigProgressIconSize) *
- static_cast<int>(downloads_.size()))
- return false;
-
- // Are we hovering over a download or the spacer? If we're over the
- // download, create a floating view for it.
- if ((y - kSpacer) % (download_util::kBigProgressIconSize + kSpacer) <
- download_util::kBigProgressIconSize) {
- int row = y / (download_util::kBigProgressIconSize + kSpacer);
- *id = static_cast<int>(downloads_.size()) - 1 - row;
- return true;
- }
- return false;
-}
-
-ChromeViews::View* DownloadTabView::CreateFloatingViewForIndex(int index) {
- if (index >= static_cast<int>(downloads_.size())) {
- // It's possible that the downloads have been cleared via the "Clear
- // Browsing Data" command, so this index is gone.
- return NULL;
- }
-
- DownloadItemTabView* dl = new DownloadItemTabView();
- dl->SetModel(downloads_[index], this);
- int row = static_cast<int>(downloads_.size()) - 1 - index;
- int y_pos = row * (download_util::kBigProgressIconSize + kSpacer) + kSpacer;
- dl->SetBounds(0, y_pos, GetWidth(), download_util::kBigProgressIconSize);
- dl->Layout();
- AttachFloatingView(dl, index);
- return dl;
-}
-
-bool DownloadTabView::EnumerateFloatingViews(
- ChromeViews::View::FloatingViewPosition position,
- int starting_id, int* id) {
- DCHECK(id);
- return View::EnumerateFloatingViewsForInterval(
- 0, static_cast<int>(downloads_.size()), false, position, starting_id, id);
-}
-
-ChromeViews::View* DownloadTabView::ValidateFloatingViewForID(int id) {
- return CreateFloatingViewForIndex(id);
-}
-
-void DownloadTabView::OnDownloadUpdated(DownloadItem* download) {
- switch (download->state()) {
- case DownloadItem::COMPLETE:
- case DownloadItem::CANCELLED: {
- base::hash_set<DownloadItem*>::iterator d = in_progress_.find(download);
- if (d != in_progress_.end()) {
- (*d)->RemoveObserver(this);
- in_progress_.erase(d);
- }
- if (in_progress_.empty())
- StopDownloadProgress();
- LoadIcon(download);
- break;
- }
- case DownloadItem::IN_PROGRESS: {
- // If all IN_PROGRESS downloads are paused, don't waste CPU issuing any
- // further progress updates until at least one download is active again.
- if (download->is_paused()) {
- bool continue_update = false;
- base::hash_set<DownloadItem*>::iterator it = in_progress_.begin();
- for (; it != in_progress_.end(); ++it) {
- if (!(*it)->is_paused()) {
- continue_update = true;
- break;
- }
- }
- if (!continue_update)
- StopDownloadProgress();
- } else {
- StartDownloadProgress();
- }
- break;
- }
- case DownloadItem::REMOVING:
- // Handled below.
- break;
- default:
- NOTREACHED();
- break;
- }
-
- OrderedDownloads::iterator it = find(downloads_.begin(),
- downloads_.end(),
- download);
- if (it == downloads_.end())
- return;
-
- const int index = static_cast<int>(it - downloads_.begin());
- DownloadItemTabView* view =
- static_cast<DownloadItemTabView*>(RetrieveFloatingViewForID(index));
- if (view) {
- if (download->state() != DownloadItem::REMOVING) {
- view->Layout();
- SchedulePaintForViewAtIndex(index);
- } else if (selected_index_ == index) {
- selected_index_ = -1;
- }
- }
-}
-
-// A download has started or been deleted. Query our DownloadManager for the
-// current set of downloads, which will call us back in SetDownloads once it
-// has retrieved them.
-void DownloadTabView::ModelChanged() {
- downloads_.clear();
- ClearDownloadInProgress();
- DetachAllFloatingViews();
-
- // Issue the query.
- model_->GetDownloads(this, search_text_);
-}
-
-void DownloadTabView::SetDownloads(std::vector<DownloadItem*>& downloads) {
- // Stop progress timers.
- StopDownloadProgress();
-
- // Clear out old state and remove self as observer for each download.
- downloads_.clear();
- ClearDownloadInProgress();
-
- // Swap new downloads in.
- downloads_.swap(downloads);
- sort(downloads_.begin(), downloads_.end(), DownloadItemSorter());
-
- // Scan for any in progress downloads and add ourself to them as an observer.
- for (OrderedDownloads::iterator it = downloads_.begin();
- it != downloads_.end(); ++it) {
- DownloadItem* download = *it;
- if (download->state() == DownloadItem::IN_PROGRESS) {
- download->AddObserver(this);
- in_progress_.insert(download);
- }
- }
-
- // Start any progress timers if required.
- if (!in_progress_.empty())
- StartDownloadProgress();
-
- // Update the UI.
- selected_index_ = -1;
- GetParent()->GetParent()->Layout();
- SchedulePaint();
-}
-
-
-// If we have the icon in our cache, then return it. If not, look it up via the
-// IconManager. Ignore in progress requests (duplicates).
-SkBitmap* DownloadTabView::LookupIcon(DownloadItem* download) {
- IconManager* im = g_browser_process->icon_manager();
- // Fast look up.
- SkBitmap* icon = im->LookupIcon(download->full_path(), IconLoader::NORMAL);
-
- // Expensive look up.
- if (!icon)
- LoadIcon(download);
-
- return icon;
-}
-
-// Bypass the caches and perform the Icon extraction directly. This is useful in
-// the case where the download has completed and we want to re-check the file
-// to see if it has an embedded icon (which we couldn't do at download start).
-void DownloadTabView::LoadIcon(DownloadItem* download) {
- IconManager* im = g_browser_process->icon_manager();
- IconManager::Handle h =
- im->LoadIcon(download->full_path(), IconLoader::NORMAL,
- &icon_consumer_,
- NewCallback(this, &DownloadTabView::OnExtractIconComplete));
- icon_consumer_.SetClientData(im, h, download);
-}
-
-void DownloadTabView::ClearDownloadInProgress() {
- for (base::hash_set<DownloadItem*>::iterator it = in_progress_.begin();
- it != in_progress_.end(); ++it)
- (*it)->RemoveObserver(this);
- in_progress_.clear();
-}
-
-// Check to see if the download is the latest download on a given day.
-// We use this to determine when to draw the date next to a particular
-// download view: if the DownloadItem is the latest download on a given
-// day, the date gets drawn.
-bool DownloadTabView::ShouldDrawDateForDownload(DownloadItem* download) {
- DCHECK(download);
- OrderedDownloads::iterator it = find(downloads_.begin(),
- downloads_.end(),
- download);
- DCHECK(it != downloads_.end());
- const int index = static_cast<int>(it - downloads_.begin());
-
- // If download is the last or only download, it draws the date.
- if (downloads_.size() - 1 == index)
- return true;
-
- const DownloadItem* next = downloads_[index + 1];
-
- Time next_midnight = next->start_time().LocalMidnight();
- Time curr_midnight = download->start_time().LocalMidnight();
- if (next_midnight == curr_midnight) {
- // 'next' happened today: let it draw the date so we don't have to.
- return false;
- }
- return true;
-}
-
-int DownloadTabView::GetPageScrollIncrement(
- ChromeViews::ScrollView* scroll_view, bool is_horizontal,
- bool is_positive) {
- return scroll_helper_.GetPageScrollIncrement(scroll_view, is_horizontal,
- is_positive);
-}
-
-int DownloadTabView::GetLineScrollIncrement(
- ChromeViews::ScrollView* scroll_view, bool is_horizontal,
- bool is_positive) {
- return scroll_helper_.GetLineScrollIncrement(scroll_view, is_horizontal,
- is_positive);
-}
-
-void DownloadTabView::ItemBecameSelected(const DownloadItem* download) {
- int index = -1;
- if (download != NULL) {
- OrderedDownloads::const_iterator it = find(downloads_.begin(),
- downloads_.end(),
- download);
- DCHECK(it != downloads_.end());
- index = static_cast<int>(it - downloads_.begin());
- if (index == selected_index_)
- return; // Avoid unnecessary paint.
- }
-
- if (selected_index_ >= 0)
- SchedulePaintForViewAtIndex(selected_index_);
- if (index >= 0)
- SchedulePaintForViewAtIndex(index);
- selected_index_ = index;
-}
-
-bool DownloadTabView::ItemIsSelected(DownloadItem* download) {
- OrderedDownloads::iterator it = find(downloads_.begin(),
- downloads_.end(),
- download);
- if (it != downloads_.end())
- return selected_index_ == static_cast<int>(it - downloads_.begin());
- return false;
-}
-
-void DownloadTabView::SchedulePaintForViewAtIndex(int index) {
- int y = GetYPositionForIndex(index);
- SchedulePaint(0, y, GetWidth(), download_util::kBigProgressIconSize);
-}
-
-int DownloadTabView::GetYPositionForIndex(int index) {
- int row = static_cast<int>(downloads_.size()) - 1 - index;
- return row * (download_util::kBigProgressIconSize + kSpacer) + kSpacer;
-}
-
-void DownloadTabView::SetSearchText(const std::wstring& search_text) {
- search_text_ = search_text;
- model_->GetDownloads(this, search_text_);
-}
-
-// The 'icon_bitmap' is ignored here, since it is cached by the IconManager.
-// When the paint message runs, we'll use the fast IconManager lookup API to
-// retrieve it.
-void DownloadTabView::OnExtractIconComplete(IconManager::Handle handle,
- SkBitmap* icon_bitmap) {
- IconManager* im = g_browser_process->icon_manager();
- DownloadItem* download = icon_consumer_.GetClientData(im, handle);
- OrderedDownloads::iterator it = find(downloads_.begin(),
- downloads_.end(),
- download);
- if (it != downloads_.end()) {
- const int index = static_cast<int>(it - downloads_.begin());
- SchedulePaintForViewAtIndex(index);
- }
-}
-
-// DownloadTabUIFactory ------------------------------------------------------
-
-class DownloadTabUIFactory : public NativeUIFactory {
- public:
- DownloadTabUIFactory() {}
- virtual ~DownloadTabUIFactory() {}
-
- virtual NativeUI* CreateNativeUIForURL(const GURL& url,
- NativeUIContents* contents) {
- return new DownloadTabUI(contents);
- }
-
- private:
- DISALLOW_EVIL_CONSTRUCTORS(DownloadTabUIFactory);
-};
-
-// DownloadTabUI -------------------------------------------------------------
-
-DownloadTabUI::DownloadTabUI(NativeUIContents* contents)
-#pragma warning(suppress: 4355) // Okay to pass "this" here.
- : searchable_container_(this),
- download_tab_view_(NULL),
- contents_(contents) {
- DownloadManager* dlm = contents_->profile()->GetDownloadManager();
- download_tab_view_ = new DownloadTabView(dlm);
- searchable_container_.SetContents(download_tab_view_);
- download_tab_view_->Initialize();
-
- NotificationService* ns = NotificationService::current();
- ns->AddObserver(this, NOTIFY_DOWNLOAD_START,
- NotificationService::AllSources());
- ns->AddObserver(this, NOTIFY_DOWNLOAD_STOP,
- NotificationService::AllSources());
-
- // Spin the throbber if there are active downloads, since we may have been
- // created after the NOTIFY_DOWNLOAD_START was sent. If the download manager
- // has not been created, don't bother since it will negatively impact start
- // up time with history requests.
- Profile* profile = contents_->profile();
- if (profile &&
- profile->HasCreatedDownloadManager() &&
- profile->GetDownloadManager()->in_progress_count() > 0)
- contents_->SetIsLoading(true, NULL);
-}
-
-DownloadTabUI::~DownloadTabUI() {
- NotificationService* ns = NotificationService::current();
- ns->RemoveObserver(this, NOTIFY_DOWNLOAD_START,
- NotificationService::AllSources());
- ns->RemoveObserver(this, NOTIFY_DOWNLOAD_STOP,
- NotificationService::AllSources());
-}
-
-const std::wstring DownloadTabUI::GetTitle() const {
- return l10n_util::GetString(IDS_DOWNLOAD_TITLE);
-}
-
-const int DownloadTabUI::GetFavIconID() const {
- return IDR_DOWNLOADS_FAVICON;
-}
-
-const int DownloadTabUI::GetSectionIconID() const {
- return IDR_DOWNLOADS_SECTION;
-}
-
-const std::wstring DownloadTabUI::GetSearchButtonText() const {
- return l10n_util::GetString(IDS_DOWNLOAD_SEARCH_BUTTON);
-}
-
-ChromeViews::View* DownloadTabUI::GetView() {
- return &searchable_container_;
-}
-
-void DownloadTabUI::WillBecomeVisible(NativeUIContents* parent) {
- UserMetrics::RecordAction(L"Destination_Downloads", parent->profile());
-}
-
-void DownloadTabUI::WillBecomeInvisible(NativeUIContents* parent) {
-}
-
-void DownloadTabUI::Navigate(const PageState& state) {
- std::wstring search_text;
- state.GetProperty(kSearchTextKey, &search_text);
- download_tab_view_->SetSearchText(search_text);
- searchable_container_.GetSearchField()->SetText(search_text);
-}
-
-bool DownloadTabUI::SetInitialFocus() {
- searchable_container_.GetSearchField()->RequestFocus();
- return true;
-}
-
-// static
-GURL DownloadTabUI::GetURL() {
- std::string spec(NativeUIContents::GetScheme());
- spec.append("://downloads");
- return GURL(spec);
-}
-
-// static
-NativeUIFactory* DownloadTabUI::GetNativeUIFactory() {
- return new DownloadTabUIFactory();
-}
-
-void DownloadTabUI::DoSearch(const std::wstring& new_text) {
- download_tab_view_->SetSearchText(new_text);
- PageState* page_state = contents_->page_state().Copy();
- page_state->SetProperty(kSearchTextKey, new_text);
- contents_->SetPageState(page_state);
-}
-
-void DownloadTabUI::Observe(NotificationType type,
- const NotificationSource& source,
- const NotificationDetails& details) {
- switch (type) {
- case NOTIFY_DOWNLOAD_START:
- case NOTIFY_DOWNLOAD_STOP:
- DCHECK(profile()->HasCreatedDownloadManager());
- contents_->SetIsLoading(
- profile()->GetDownloadManager()->in_progress_count() > 0,
- NULL);
- break;
- default:
- break;
- }
-}
-
« no previous file with comments | « chrome/browser/download_tab_view.h ('k') | chrome/browser/download_uitest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698