15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A ChromeView that implements one download on the Download shelf. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Each DownloadItemView contains an application icon, a text label 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// indicating the download's file name, a text label indicating the 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download's status (such as the number of bytes downloaded so far) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and a button for canceling an in progress download, or opening 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the completed download. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The DownloadItemView lives in the Browser, and has a corresponding 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DownloadController that receives / writes data which lives in the 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Renderer. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_VIEWS_DOWNLOAD_DOWNLOAD_ITEM_VIEW_H__ 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_VIEWS_DOWNLOAD_DOWNLOAD_ITEM_VIEW_H__ 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/task/cancelable_task_tracker.h" 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/download/download_item_model.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/icon_manager.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/animation_delegate.h" 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/font_list.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/context_menu_controller.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/button.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadShelfView; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadShelfContextMenuView; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace extensions { 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class ExperienceSamplingEvent; 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Image; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImageSkia; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SlideAnimation; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Label; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LabelButton; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadItemView : public views::ButtonListener, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public views::View, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public views::ContextMenuController, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::DownloadItem::Observer, 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public gfx::AnimationDelegate { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DownloadItemView(content::DownloadItem* download, DownloadShelfView* parent); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DownloadItemView(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Timer callback for handling animations 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateDownloadProgress(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartDownloadProgress(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StopDownloadProgress(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IconManager::Client interface. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnExtractIconComplete(gfx::Image* icon); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the DownloadItem model object belonging to this item. 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::DownloadItem* download() { return model_.download(); } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DownloadItem::Observer methods 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnDownloadUpdated(content::DownloadItem* download) OVERRIDE; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnDownloadOpened(content::DownloadItem* download) OVERRIDE; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnDownloadDestroyed(content::DownloadItem* download) OVERRIDE; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::View: 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Layout() OVERRIDE; 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetPreferredSize() const OVERRIDE; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMouseCaptureLost() OVERRIDE; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMouseMoved(const ui::MouseEvent& event) OVERRIDE; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetTooltipText(const gfx::Point& p, 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16* tooltip) const OVERRIDE; 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnThemeChanged() OVERRIDE; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ui::EventHandler: 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::ContextMenuController. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowContextMenuForView(View* source, 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const gfx::Point& point, 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ui::MenuSourceType source_type) OVERRIDE; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ButtonListener implementation. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ButtonPressed(views::Button* sender, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Event& event) OVERRIDE; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // gfx::AnimationDelegate implementation. 109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::View: 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnPaintBackground(gfx::Canvas* canvas) OVERRIDE; 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnFocus() OVERRIDE; 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnBlur() OVERRIDE; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum State { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NORMAL = 0, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HOT, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PUSHED 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Mode { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NORMAL_MODE = 0, // Showing download item. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DANGEROUS_MODE, // Displaying the dangerous download warning. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MALICIOUS_MODE // Displaying the malicious download warning. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The image set associated with the part containing the icon and text. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct BodyImageSet { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* top_left; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* left; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* bottom_left; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* top; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* center; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* bottom; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* top_right; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* right; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* bottom_right; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The image set associated with the drop-down button on the right. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct DropDownImageSet { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* top; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* center; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* bottom; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDownload(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Submits the downloaded file to the safebrowsing download feedback service. 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns whether submission was successful. On successful submission, 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |this| and the DownloadItem will have been deleted. 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool SubmitDownloadToFeedbackService(); 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the user has |enabled| uploading, calls SubmitDownloadToFeedbackService. 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Otherwise, it simply removes the DownloadItem without uploading. 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void PossiblySubmitDownloadToFeedbackService(bool enabled); 1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadIcon(); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadIconIfItemPathChanged(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the button colors based on the current theme. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateColorsFromTheme(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows the context menu at the specified location. |point| is in the view's 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // coordinate system. 1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void ShowContextMenuImpl(const gfx::Point& point, 1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ui::MenuSourceType source_type); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Common code for handling pointer events (i.e. mouse or gesture). 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandlePressEvent(const ui::LocatedEvent& event, bool active_event); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleClickEvent(const ui::LocatedEvent& event, bool active_event); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convenience method to paint the 3 vertical images (bottom, middle, top) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that form the background. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PaintImages(gfx::Canvas* canvas, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia* top_image, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia* center_image, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia* bottom_image, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the state and triggers a repaint. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetState(State body_state, State drop_down_state); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we are in the dangerous mode. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsShowingWarningDialog() const { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mode_ == DANGEROUS_MODE || mode_ == MALICIOUS_MODE; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reverts from dangerous mode to normal download mode. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearWarningDialog(); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start displaying the dangerous download warning or the malicious download 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // warning. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShowWarningDialog(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets |size| with the size of the Save and Discard buttons (they have the 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // same size). 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::Size GetButtonSize() const; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sizes the dangerous download label to a minimum width available using 2 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lines. The size is computed only the first time this method is invoked 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and simply returned on subsequent calls. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SizeLabelToMinWidth(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reenables the item after it has been disabled when a user clicked it to 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // open the downloaded file. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reenable(); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Releases drop down button after showing a context menu. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReleaseDropDown(); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Given |x|, returns whether |x| is within the x coordinate range of 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the drop-down button or not. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool InDropDownButtonXCoordinateRange(int x); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the accessible name to reflect the current state of the control, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so that screenreaders can access the filename, status text, and 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dangerous download warning message (if any). 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateAccessibleName(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the location of the drop down button. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateDropDownButtonPosition(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show/Hide/Reset |animation| based on the state transition specified by 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |from| and |to|. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AnimateStateTransition(State from, State to, 234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::SlideAnimation* animation); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The different images used for the background. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BodyImageSet normal_body_image_set_; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BodyImageSet hot_body_image_set_; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BodyImageSet pushed_body_image_set_; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BodyImageSet dangerous_mode_body_image_set_; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BodyImageSet malicious_mode_body_image_set_; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DropDownImageSet normal_drop_down_image_set_; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DropDownImageSet hot_drop_down_image_set_; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DropDownImageSet pushed_drop_down_image_set_; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The warning icon showns for dangerous downloads. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia* warning_icon_; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download shelf that owns us. 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadShelfView* shelf_; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Elements of our particular download 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 status_text_; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The font list used to print the file name and status. 25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::FontList font_list_; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The tooltip. Only displayed when not showing a warning dialog. 259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 tooltip_text_; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current state (normal, hot or pushed) of the body and drop-down. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State body_state_; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State drop_down_state_; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mode of the download item view. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mode mode_; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In degrees, for downloads with no known total size. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int progress_angle_; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The left and right x coordinates of the drop-down button. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int drop_down_x_left_; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int drop_down_x_right_; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used when we are showing the menu to show the drop-down as pressed. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool drop_down_pressed_; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The height of the box formed by the background images and its labels. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int box_height_; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The y coordinate of the box formed by the background images and its labels. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int box_y_; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we are dragging the download button. 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool dragging_; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we are tracking a possible drag. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool starting_drag_; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position that a possible drag started at. 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point drag_start_point_; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For canceling an in progress icon request. 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker cancelable_task_tracker_; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A model class to control the status text we display. 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItemModel model_; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hover animations for our body and drop buttons. 300d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<gfx::SlideAnimation> body_hover_animation_; 301d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<gfx::SlideAnimation> drop_hover_animation_; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Animation for download complete. 304d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<gfx::SlideAnimation> complete_animation_; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Progress animation 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RepeatingTimer<DownloadItemView> progress_timer_; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dangerous mode buttons. 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::LabelButton* save_button_; 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::LabelButton* discard_button_; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dangerous mode label. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* dangerous_download_label_; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the dangerous mode label has been sized yet. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool dangerous_download_label_sized_; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The size of the buttons. Cached so animation works when hidden. 320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mutable gfx::Size cached_button_size_; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we are currently disabled as part of opening the downloaded file. 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool disabled_while_opening_; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The time at which this view was created. 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time creation_time_; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The time at which a dangerous download warning was displayed. 3291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Time time_download_warning_shown_; 3301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The currently running download context menu. 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DownloadShelfContextMenuView> context_menu_; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The name of this view as reported to assistive technology. 335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 accessible_name_; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The icon loaded in the download shelf is based on the file path of the 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // item. Store the path used, so that we can detect a change in the path 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and reload the icon. 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath last_download_item_path_; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // ExperienceSampling: This tracks dangerous/malicious downloads warning UI 34303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // and the user's decisions about it. 34403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<extensions::ExperienceSamplingEvent> sampling_event_; 34503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Method factory used to delay reenabling of the item when opening the 3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // downloaded file. 3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::WeakPtrFactory<DownloadItemView> weak_ptr_factory_; 3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DownloadItemView); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_VIEWS_DOWNLOAD_DOWNLOAD_ITEM_VIEW_H__ 354