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