Home | History | Annotate | Download | only in download
      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 
     19 class Browser;
     20 class BrowserView;
     21 class DownloadItemView;
     22 
     23 namespace content {
     24 class DownloadItem;
     25 class PageNavigator;
     26 }
     27 
     28 namespace ui {
     29 class SlideAnimation;
     30 }
     31 
     32 namespace views {
     33 class ImageButton;
     34 class 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.
     42 class 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