download_item_view.h revision 868fa2fe829687343ffae624259930155e16dbd8
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" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/timer.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/download/download_item_model.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/icon_manager.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/cancelable_task_tracker.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/animation/animation_delegate.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/font.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) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Image; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImageSkia; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SlideAnimation; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Label; 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LabelButton; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadItemView : public views::ButtonListener, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public views::View, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public views::ContextMenuController, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::DownloadItem::Observer, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ui::AnimationDelegate { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadItemView(content::DownloadItem* download, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 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; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Size GetPreferredSize() 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, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16* tooltip) const OVERRIDE; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetAccessibleState(ui::AccessibleViewState* 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, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& point) OVERRIDE; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ButtonListener implementation. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ButtonPressed(views::Button* sender, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Event& event) OVERRIDE; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ui::AnimationDelegate implementation. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::View: 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum State { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NORMAL = 0, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HOT, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PUSHED 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Mode { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NORMAL_MODE = 0, // Showing download item. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DANGEROUS_MODE, // Displaying the dangerous download warning. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MALICIOUS_MODE // Displaying the malicious download warning. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The image set associated with the part containing the icon and text. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct BodyImageSet { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* top_left; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* left; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* bottom_left; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* top; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* center; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* bottom; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* top_right; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* right; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* bottom_right; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The image set associated with the drop-down button on the right. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct DropDownImageSet { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* top; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* center; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* bottom; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDownload(); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadIcon(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadIconIfItemPathChanged(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the button colors based on the current theme. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateColorsFromTheme(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows the context menu at the specified location. |point| is in the view's 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // coordinate system. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShowContextMenuImpl(const gfx::Point& point, bool is_mouse_gesture); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Common code for handling pointer events (i.e. mouse or gesture). 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandlePressEvent(const ui::LocatedEvent& event, bool active_event); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleClickEvent(const ui::LocatedEvent& event, bool active_event); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convenience method to paint the 3 vertical images (bottom, middle, top) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that form the background. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PaintImages(gfx::Canvas* canvas, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia* top_image, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia* center_image, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia* bottom_image, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the state and triggers a repaint. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetState(State body_state, State drop_down_state); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we are in the dangerous mode. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsShowingWarningDialog() const { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mode_ == DANGEROUS_MODE || mode_ == MALICIOUS_MODE; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reverts from dangerous mode to normal download mode. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearWarningDialog(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start displaying the dangerous download warning or the malicious download 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // warning. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShowWarningDialog(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets |size| with the size of the Save and Discard buttons (they have the 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // same size). 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size GetButtonSize(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sizes the dangerous download label to a minimum width available using 2 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lines. The size is computed only the first time this method is invoked 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and simply returned on subsequent calls. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SizeLabelToMinWidth(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reenables the item after it has been disabled when a user clicked it to 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // open the downloaded file. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reenable(); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Releases drop down button after showing a context menu. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReleaseDropDown(); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Given |x|, returns whether |x| is within the x coordinate range of 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the drop-down button or not. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool InDropDownButtonXCoordinateRange(int x); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the accessible name to reflect the current state of the control, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so that screenreaders can access the filename, status text, and 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dangerous download warning message (if any). 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateAccessibleName(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the location of the drop down button. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateDropDownButtonPosition(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show/Hide/Reset |animation| based on the state transition specified by 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |from| and |to|. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AnimateStateTransition(State from, State to, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SlideAnimation* animation); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The different images used for the background. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BodyImageSet normal_body_image_set_; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BodyImageSet hot_body_image_set_; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BodyImageSet pushed_body_image_set_; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BodyImageSet dangerous_mode_body_image_set_; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BodyImageSet malicious_mode_body_image_set_; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DropDownImageSet normal_drop_down_image_set_; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DropDownImageSet hot_drop_down_image_set_; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DropDownImageSet pushed_drop_down_image_set_; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The warning icon showns for dangerous downloads. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia* warning_icon_; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The download shelf that owns us. 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadShelfView* shelf_; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Elements of our particular download 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 status_text_; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The font used to print the file name and status. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Font font_; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The tooltip. Only displayed when not showing a warning dialog. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 tooltip_text_; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current state (normal, hot or pushed) of the body and drop-down. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State body_state_; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State drop_down_state_; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mode of the download item view. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mode mode_; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In degrees, for downloads with no known total size. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int progress_angle_; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The left and right x coordinates of the drop-down button. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int drop_down_x_left_; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int drop_down_x_right_; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used when we are showing the menu to show the drop-down as pressed. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool drop_down_pressed_; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The height of the box formed by the background images and its labels. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int box_height_; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The y coordinate of the box formed by the background images and its labels. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int box_y_; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we are dragging the download button. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool dragging_; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we are tracking a possible drag. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool starting_drag_; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Position that a possible drag started at. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point drag_start_point_; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For canceling an in progress icon request. 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CancelableTaskTracker cancelable_task_tracker_; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A model class to control the status text we display. 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItemModel model_; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hover animations for our body and drop buttons. 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::SlideAnimation> body_hover_animation_; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::SlideAnimation> drop_hover_animation_; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Animation for download complete. 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::SlideAnimation> complete_animation_; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Progress animation 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RepeatingTimer<DownloadItemView> progress_timer_; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dangerous mode buttons. 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::LabelButton* save_button_; 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::LabelButton* discard_button_; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dangerous mode label. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* dangerous_download_label_; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the dangerous mode label has been sized yet. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool dangerous_download_label_sized_; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The size of the buttons. Cached so animation works when hidden. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size cached_button_size_; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we are currently disabled as part of opening the downloaded file. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool disabled_while_opening_; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The time at which this view was created. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time creation_time_; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Method factory used to delay reenabling of the item when opening the 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // downloaded file. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<DownloadItemView> weak_ptr_factory_; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The currently running download context menu. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DownloadShelfContextMenuView> context_menu_; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The name of this view as reported to assistive technology. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 accessible_name_; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The icon loaded in the download shelf is based on the file path of the 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // item. Store the path used, so that we can detect a change in the path 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and reload the icon. 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath last_download_item_path_; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DownloadItemView); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_VIEWS_DOWNLOAD_DOWNLOAD_ITEM_VIEW_H__ 333