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