download_shelf_view.h revision a93a17c8d99d686bd4a1511e5504e5e6cc9fcadf
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_BROWSER_UI_VIEWS_DOWNLOAD_DOWNLOAD_SHELF_VIEW_H_ 6#define CHROME_BROWSER_UI_VIEWS_DOWNLOAD_DOWNLOAD_SHELF_VIEW_H_ 7 8#include <vector> 9 10#include "base/basictypes.h" 11#include "base/compiler_specific.h" 12#include "chrome/browser/download/download_shelf.h" 13#include "ui/base/animation/animation_delegate.h" 14#include "ui/views/accessible_pane_view.h" 15#include "ui/views/controls/button/button.h" 16#include "ui/views/controls/link_listener.h" 17#include "ui/views/mouse_watcher.h" 18 19class Browser; 20class BrowserView; 21class DownloadItemView; 22 23namespace content { 24class DownloadItem; 25class PageNavigator; 26} 27 28namespace ui { 29class SlideAnimation; 30} 31 32namespace views { 33class ImageButton; 34class ImageView; 35} 36 37// DownloadShelfView is a view that contains individual views for each download, 38// as well as a close button and a link to show all downloads. 39// 40// DownloadShelfView does not hold an infinite number of download views, rather 41// it'll automatically remove views once a certain point is reached. 42class DownloadShelfView : public views::AccessiblePaneView, 43 public ui::AnimationDelegate, 44 public DownloadShelf, 45 public views::ButtonListener, 46 public views::LinkListener, 47 public views::MouseWatcherListener { 48 public: 49 DownloadShelfView(Browser* browser, BrowserView* parent); 50 virtual ~DownloadShelfView(); 51 52 // Sent from the DownloadItemView when the user opens an item. 53 void OpenedDownload(DownloadItemView* view); 54 55 // Returns the relevant containing object that can load pages. 56 // i.e. the |browser_|. 57 content::PageNavigator* GetNavigator(); 58 59 // Implementation of View. 60 virtual gfx::Size GetPreferredSize() OVERRIDE; 61 virtual void Layout() OVERRIDE; 62 virtual void ViewHierarchyChanged( 63 const ViewHierarchyChangedDetails& details) OVERRIDE; 64 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 65 66 // Implementation of ui::AnimationDelegate. 67 virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE; 68 virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE; 69 70 // Implementation of views::LinkListener. 71 // Invoked when the user clicks the 'show all downloads' link button. 72 virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; 73 74 // Implementation of ButtonListener. 75 // Invoked when the user clicks the close button. Asks the browser to 76 // hide the download shelf. 77 virtual void ButtonPressed(views::Button* button, 78 const ui::Event& event) OVERRIDE; 79 80 // Implementation of DownloadShelf. 81 virtual bool IsShowing() const OVERRIDE; 82 virtual bool IsClosing() const OVERRIDE; 83 virtual Browser* browser() const OVERRIDE; 84 85 // Implementation of MouseWatcherListener OVERRIDE. 86 virtual void MouseMovedOutOfHost() OVERRIDE; 87 88 // Override views::FocusChangeListener method from AccessiblePaneView. 89 virtual void OnWillChangeFocus(View* focused_before, 90 View* focused_now) OVERRIDE; 91 virtual void OnDidChangeFocus(View* focused_before, 92 View* focused_now) OVERRIDE; 93 94 // Removes a specified download view. The supplied view is deleted after 95 // it's removed. 96 void RemoveDownloadView(views::View* view); 97 98 protected: 99 // Implementation of DownloadShelf. 100 virtual void DoAddDownload(content::DownloadItem* download) OVERRIDE; 101 virtual void DoShow() OVERRIDE; 102 virtual void DoClose(CloseReason reason) OVERRIDE; 103 104 // From AccessiblePaneView 105 virtual views::View* GetDefaultFocusableChild() OVERRIDE; 106 107 private: 108 // Adds a View representing a download to this DownloadShelfView. 109 // DownloadShelfView takes ownership of the View, and will delete it as 110 // necessary. 111 void AddDownloadView(DownloadItemView* view); 112 113 // Paints the border. 114 virtual void OnPaintBorder(gfx::Canvas* canvas) OVERRIDE; 115 116 // Returns true if the shelf is wide enough to show the first download item. 117 bool CanFitFirstDownloadItem(); 118 119 // Called on theme change. 120 void UpdateColorsFromTheme(); 121 122 // Overridden from views::View. 123 virtual void OnThemeChanged() OVERRIDE; 124 125 // Called when the "close shelf" animation ended. 126 void Closed(); 127 128 // Returns true if we can auto close. We can auto-close if all the items on 129 // the shelf have been opened. 130 bool CanAutoClose(); 131 132 // Called when any view |view| gains or loses focus. If it's one of our 133 // DownloadItemView children, call SchedulePaint on its bounds 134 // so that its focus rect is repainted. 135 void SchedulePaintForDownloadItem(views::View* view); 136 137 // Get the rect that perfectly surrounds a DownloadItemView so we can 138 // draw a focus rect around it. 139 gfx::Rect GetFocusRectBounds(const DownloadItemView* download_item_view); 140 141 // The browser for this shelf. 142 Browser* browser_; 143 144 // The animation for adding new items to the shelf. 145 scoped_ptr<ui::SlideAnimation> new_item_animation_; 146 147 // The show/hide animation for the shelf itself. 148 scoped_ptr<ui::SlideAnimation> shelf_animation_; 149 150 // The download views. These are also child Views, and deleted when 151 // the DownloadShelfView is deleted. 152 std::vector<DownloadItemView*> download_views_; 153 154 // An image displayed on the right of the "Show all downloads..." link. 155 views::ImageView* arrow_image_; 156 157 // Link for showing all downloads. This is contained as a child, and deleted 158 // by View. 159 views::Link* show_all_view_; 160 161 // Button for closing the downloads. This is contained as a child, and 162 // deleted by View. 163 views::ImageButton* close_button_; 164 165 // The window this shelf belongs to. 166 BrowserView* parent_; 167 168 views::MouseWatcher mouse_watcher_; 169 170 DISALLOW_COPY_AND_ASSIGN(DownloadShelfView); 171}; 172 173#endif // CHROME_BROWSER_UI_VIEWS_DOWNLOAD_DOWNLOAD_SHELF_VIEW_H_ 174