1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 24a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 34a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// found in the LICENSE file. 44a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 54a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// A ChromeView that implements one download on the Download shelf. 64a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Each DownloadItemView contains an application icon, a text label 74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// indicating the download's file name, a text label indicating the 84a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// download's status (such as the number of bytes downloaded so far) 94a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// and a button for canceling an in progress download, or opening 104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// the completed download. 114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// The DownloadItemView lives in the Browser, and has a corresponding 134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// DownloadController that receives / writes data which lives in the 144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Renderer. 154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#ifndef CHROME_BROWSER_UI_VIEWS_DOWNLOAD_DOWNLOAD_ITEM_VIEW_H__ 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#define CHROME_BROWSER_UI_VIEWS_DOWNLOAD_DOWNLOAD_ITEM_VIEW_H__ 184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#pragma once 194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include <string> 214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/basictypes.h" 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/time.h" 254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/timer.h" 264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/download/download_item.h" 274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/download/download_manager.h" 284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/icon_manager.h" 29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/cancelable_request.h" 303f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "ui/base/animation/animation_delegate.h" 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/font.h" 324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/controls/button/button.h" 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/events/event.h" 344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/view.h" 354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass BaseDownloadItemModel; 374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass DownloadShelfView; 384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass SkBitmap; 394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass DownloadShelfContextMenuWin; 403f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace gfx { 42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass Image; 43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 453f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace ui { 464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass SlideAnimation; 473f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen} 483f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 493f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace views { 503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass Label; 513f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass NativeButton; 523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen} 534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass DownloadItemView : public views::ButtonListener, 554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public views::View, 564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public DownloadItem::Observer, 573f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen public ui::AnimationDelegate { 584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public: 594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DownloadItemView(DownloadItem* download, 604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DownloadShelfView* parent, 614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BaseDownloadItemModel* model); 624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual ~DownloadItemView(); 634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Timer callback for handling animations 654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void UpdateDownloadProgress(); 664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void StartDownloadProgress(); 674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void StopDownloadProgress(); 684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // IconManager::Client interface. 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void OnExtractIconComplete(IconManager::Handle handle, gfx::Image* icon); 714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns the DownloadItem model object belonging to this item. 734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DownloadItem* download() const { return download_; } 744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // DownloadObserver method 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnDownloadUpdated(DownloadItem* download) OVERRIDE; 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnDownloadOpened(DownloadItem* download) OVERRIDE; 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Overridden from views::View: 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void Layout() OVERRIDE; 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual gfx::Size GetPreferredSize() OVERRIDE; 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE; 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnMouseReleased(const views::MouseEvent& event) OVERRIDE; 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnMouseCaptureLost() OVERRIDE; 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnMouseMoved(const views::MouseEvent& event) OVERRIDE; 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnMouseExited(const views::MouseEvent& event) OVERRIDE; 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool OnKeyPressed(const views::KeyEvent& event) OVERRIDE; 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool GetTooltipText(const gfx::Point& p, 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::wstring* tooltip) OVERRIDE; 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void ShowContextMenu(const gfx::Point& p, 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool is_mouse_gesture) OVERRIDE; 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // ButtonListener implementation. 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void ButtonPressed(views::Button* sender, 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const views::Event& event) OVERRIDE; 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // ui::AnimationDelegate implementation. 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE; 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected: 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Overridden from views::View: 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private: 1074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch enum State { 1084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch NORMAL = 0, 1094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch HOT, 1104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch PUSHED, 1114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DANGEROUS 1124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch }; 1134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The image set associated with the part containing the icon and text. 1154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch struct BodyImageSet { 1164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch SkBitmap* top_left; 1174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch SkBitmap* left; 1184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch SkBitmap* bottom_left; 1194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch SkBitmap* top; 1204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch SkBitmap* center; 1214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch SkBitmap* bottom; 1224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch SkBitmap* top_right; 1234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch SkBitmap* right; 1244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch SkBitmap* bottom_right; 1254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch }; 1264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The image set associated with the drop-down button on the right. 1284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch struct DropDownImageSet { 1294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch SkBitmap* top; 1304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch SkBitmap* center; 1314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch SkBitmap* bottom; 1324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch }; 1334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void OpenDownload(); 1354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void LoadIcon(); 1374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Convenience method to paint the 3 vertical bitmaps (bottom, middle, top) 1394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // that form the background. 1404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void PaintBitmaps(gfx::Canvas* canvas, 1414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const SkBitmap* top_bitmap, 1424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const SkBitmap* center_bitmap, 1434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const SkBitmap* bottom_bitmap, 1444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int x, 1454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int y, 1464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int height, 1474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int width); 1484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Sets the state and triggers a repaint. 1504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void SetState(State body_state, State drop_down_state); 1514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Whether we are in the dangerous mode. 1534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool IsDangerousMode() { return body_state_ == DANGEROUS; } 1544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Reverts from dangerous mode to normal download mode. 1564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void ClearDangerousMode(); 1574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Sets |size| with the size of the Save and Discard buttons (they have the 1594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // same size). 1604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch gfx::Size GetButtonSize(); 1614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Sizes the dangerous download label to a minimum width available using 2 1634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // lines. The size is computed only the first time this method is invoked 1644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // and simply returned on subsequent calls. 1654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void SizeLabelToMinWidth(); 1664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Reenables the item after it has been disabled when a user clicked it to 1684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // open the downloaded file. 1694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void Reenable(); 1704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Given |x|, returns whether |x| is within the x coordinate range of 1724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // the drop-down button or not. 1734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool InDropDownButtonXCoordinateRange(int x); 1744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Update the accessible name to reflect the current state of the control, 1764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // so that screenreaders can access the filename, status text, and 1774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // dangerous download warning message (if any). 1784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void UpdateAccessibleName(); 1794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The different images used for the background. 1814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BodyImageSet normal_body_image_set_; 1824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BodyImageSet hot_body_image_set_; 1834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BodyImageSet pushed_body_image_set_; 1844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BodyImageSet dangerous_mode_body_image_set_; 1854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DropDownImageSet normal_drop_down_image_set_; 1864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DropDownImageSet hot_drop_down_image_set_; 1874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DropDownImageSet pushed_drop_down_image_set_; 1884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The warning icon showns for dangerous downloads. 190dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const SkBitmap* warning_icon_; 1914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The model we query for display information 1934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DownloadItem* download_; 1944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Our parent view that owns us. 1964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DownloadShelfView* parent_; 1974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Elements of our particular download 1994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::wstring status_text_; 2004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool show_status_text_; 2014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The font used to print the file name and status. 2034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch gfx::Font font_; 2044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The tooltip. 2064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::wstring tooltip_text_; 2074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The current state (normal, hot or pushed) of the body and drop-down. 2094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch State body_state_; 2104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch State drop_down_state_; 2114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // In degrees, for downloads with no known total size. 2134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int progress_angle_; 2144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The left and right x coordinates of the drop-down button. 2164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int drop_down_x_left_; 2174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int drop_down_x_right_; 2184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Used when we are showing the menu to show the drop-down as pressed. 2204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool drop_down_pressed_; 2214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The height of the box formed by the background images and its labels. 2234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int box_height_; 2244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The y coordinate of the box formed by the background images and its labels. 2264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int box_y_; 2274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Whether we are dragging the download button. 2294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool dragging_; 2304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Whether we are tracking a possible drag. 2324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool starting_drag_; 2334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Position that a possible drag started at. 2354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch gfx::Point drag_start_point_; 2364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // For canceling an in progress icon request. 2384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch CancelableRequestConsumerT<int, 0> icon_consumer_; 2394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // A model class to control the status text we display and the cancel 2414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // behavior. 2424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // This class owns the pointer. 2434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_ptr<BaseDownloadItemModel> model_; 2444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Hover animations for our body and drop buttons. 2463f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen scoped_ptr<ui::SlideAnimation> body_hover_animation_; 2473f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen scoped_ptr<ui::SlideAnimation> drop_hover_animation_; 2484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Animation for download complete. 2503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen scoped_ptr<ui::SlideAnimation> complete_animation_; 2514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Progress animation 2534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch base::RepeatingTimer<DownloadItemView> progress_timer_; 2544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Dangerous mode buttons. 2564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch views::NativeButton* save_button_; 2574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch views::NativeButton* discard_button_; 2584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Dangerous mode label. 2604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch views::Label* dangerous_download_label_; 2614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Whether the dangerous mode label has been sized yet. 2634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool dangerous_download_label_sized_; 2644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The size of the buttons. Cached so animation works when hidden. 2664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch gfx::Size cached_button_size_; 2674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Whether we are currently disabled as part of opening the downloaded file. 2694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool disabled_while_opening_; 2704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The time at which this view was created. 2724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch base::Time creation_time_; 2734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Method factory used to delay reenabling of the item when opening the 2754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // downloaded file. 2764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ScopedRunnableMethodFactory<DownloadItemView> reenable_method_factory_; 2774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The currently running download context menu. 2794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_ptr<DownloadShelfContextMenuWin> context_menu_; 2804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // If non-NULL, set to true when this object is deleted. 2824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // (Used when showing the context menu as it runs an inner message loop that 2834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // might delete us). 2844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool* deleted_; 2854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The name of this view as reported to assistive technology. 287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16 accessible_name_; 288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DISALLOW_COPY_AND_ASSIGN(DownloadItemView); 2904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}; 2914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif // CHROME_BROWSER_UI_VIEWS_DOWNLOAD_DOWNLOAD_ITEM_VIEW_H__ 293