Home | History | Annotate | Download | only in download
      1 // Copyright (c) 2011 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_GTK_DOWNLOAD_DOWNLOAD_SHELF_GTK_H_
      6 #define CHROME_BROWSER_UI_GTK_DOWNLOAD_DOWNLOAD_SHELF_GTK_H_
      7 #pragma once
      8 
      9 #include <gtk/gtk.h>
     10 
     11 #include <vector>
     12 
     13 #include "base/memory/scoped_ptr.h"
     14 #include "base/message_loop.h"
     15 #include "chrome/browser/download/download_shelf.h"
     16 #include "chrome/browser/ui/gtk/owned_widget_gtk.h"
     17 #include "chrome/browser/ui/gtk/slide_animator_gtk.h"
     18 #include "content/common/notification_observer.h"
     19 #include "content/common/notification_registrar.h"
     20 #include "ui/base/gtk/gtk_signal.h"
     21 #include "ui/gfx/native_widget_types.h"
     22 
     23 class BaseDownloadItemModel;
     24 class Browser;
     25 class CustomDrawButton;
     26 class DownloadItemGtk;
     27 class GtkThemeService;
     28 class SlideAnimatorGtk;
     29 
     30 namespace gfx {
     31 class Point;
     32 }
     33 
     34 class DownloadShelfGtk : public DownloadShelf,
     35                          public NotificationObserver,
     36                          public SlideAnimatorGtk::Delegate,
     37                          public MessageLoopForUI::Observer {
     38  public:
     39   explicit DownloadShelfGtk(Browser* browser, gfx::NativeView view);
     40 
     41   ~DownloadShelfGtk();
     42 
     43   // DownloadShelf implementation.
     44   virtual void AddDownload(BaseDownloadItemModel* download_model);
     45   virtual bool IsShowing() const;
     46   virtual bool IsClosing() const;
     47   virtual void Show();
     48   virtual void Close();
     49   virtual Browser* browser() const;
     50 
     51   // SlideAnimatorGtk::Delegate implementation.
     52   virtual void Closed();
     53 
     54   // Overridden from NotificationObserver:
     55   virtual void Observe(NotificationType type,
     56                        const NotificationSource& source,
     57                        const NotificationDetails& details);
     58 
     59   // Returns the current height of the shelf.
     60   int GetHeight() const;
     61 
     62   // MessageLoop::Observer implementation:
     63   virtual void WillProcessEvent(GdkEvent* event);
     64   virtual void DidProcessEvent(GdkEvent* event);
     65 
     66  private:
     67   // Remove |download_item| from the download shelf and delete it.
     68   void RemoveDownloadItem(DownloadItemGtk* download_item);
     69 
     70   // Get the hbox download items ought to pack themselves into.
     71   GtkWidget* GetHBox() const;
     72 
     73   // Show more hidden download items if there is enough space in the shelf.
     74   // It's called when a download item is removed from the shelf or an item's
     75   // size is changed.
     76   void MaybeShowMoreDownloadItems();
     77 
     78   // Checks that all download items have been opened, and sets the auto-close
     79   // state of the shelf if so.
     80   void AutoCloseIfPossible();
     81 
     82   // Cancels the auto-close state set by AutoCloseIfPossible, including any
     83   // pending close tasks that have already been posted.
     84   void CancelAutoClose();
     85 
     86   // A download item has been opened. It might be possible to automatically
     87   // close now.
     88   void ItemOpened();
     89 
     90   // Sets whether the shelf should automatically close.
     91   void SetCloseOnMouseOut(bool close);
     92 
     93   // Returns whether the given point is within the "zone" of the shelf, which is
     94   // the shelf and a band of 40 pixels on the top of it.
     95   bool IsCursorInShelfZone(const gfx::Point& cursor_screen_coords);
     96 
     97   // Synthesized enter-notify and leave-notify events for the shelf's "zone".
     98   void MouseLeftShelf();
     99   void MouseEnteredShelf();
    100 
    101   CHROMEGTK_CALLBACK_0(DownloadShelfGtk, void, OnButtonClick);
    102 
    103   // The browser that owns this download shelf.
    104   Browser* browser_;
    105 
    106   // The top level widget of the shelf.
    107   scoped_ptr<SlideAnimatorGtk> slide_widget_;
    108 
    109   // |items_hbox_| holds the download items.
    110   OwnedWidgetGtk items_hbox_;
    111 
    112   // |shelf_| is the second highest level widget. See the constructor
    113   // for an explanation of the widget layout.
    114   OwnedWidgetGtk shelf_;
    115 
    116   // Top level event box which draws the one pixel border.
    117   GtkWidget* top_border_;
    118 
    119   // A GtkEventBox which we color.
    120   GtkWidget* padding_bg_;
    121 
    122   // The "Show all downloads..." link.
    123   GtkWidget* link_button_;
    124 
    125   // The 'x' that the user can press to hide the download shelf.
    126   scoped_ptr<CustomDrawButton> close_button_;
    127 
    128   // Keeps track of our current hide/show state.
    129   bool is_showing_;
    130 
    131   // The download items we have added to our shelf.
    132   std::vector<DownloadItemGtk*> download_items_;
    133 
    134   // Gives us our colors and theme information.
    135   GtkThemeService* theme_service_;
    136 
    137   NotificationRegistrar registrar_;
    138 
    139   // True if the shelf will automatically close when the user mouses out.
    140   bool close_on_mouse_out_;
    141 
    142   // True if the mouse is within the shelf's bounds, as of the last mouse event
    143   // we received.
    144   bool mouse_in_shelf_;
    145 
    146   ScopedRunnableMethodFactory<DownloadShelfGtk> auto_close_factory_;
    147 
    148   friend class DownloadItemGtk;
    149 };
    150 
    151 #endif  // CHROME_BROWSER_UI_GTK_DOWNLOAD_DOWNLOAD_SHELF_GTK_H_
    152