• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • 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_ITEM_GTK_H_
6 #define CHROME_BROWSER_UI_GTK_DOWNLOAD_DOWNLOAD_ITEM_GTK_H_
7 #pragma once
8 
9 #include <gtk/gtk.h>
10 
11 #include <string>
12 
13 #include "base/memory/scoped_ptr.h"
14 #include "base/time.h"
15 #include "chrome/browser/download/download_item.h"
16 #include "chrome/browser/icon_manager.h"
17 #include "chrome/browser/ui/gtk/owned_widget_gtk.h"
18 #include "content/common/notification_observer.h"
19 #include "content/common/notification_registrar.h"
20 #include "ui/base/animation/animation_delegate.h"
21 #include "ui/base/animation/slide_animation.h"
22 #include "ui/base/gtk/gtk_signal.h"
23 
24 class BaseDownloadItemModel;
25 class DownloadShelfContextMenuGtk;
26 class DownloadShelfGtk;
27 class GtkThemeService;
28 class NineBox;
29 class SkBitmap;
30 
31 namespace gfx {
32 class Image;
33 }
34 
35 namespace ui {
36 class SlideAnimation;
37 }
38 
39 class DownloadItemGtk : public DownloadItem::Observer,
40                         public ui::AnimationDelegate,
41                         public NotificationObserver {
42  public:
43   // DownloadItemGtk takes ownership of |download_item_model|.
44   DownloadItemGtk(DownloadShelfGtk* parent_shelf,
45                   BaseDownloadItemModel* download_item_model);
46 
47   // Destroys all widgets belonging to this DownloadItemGtk.
48   ~DownloadItemGtk();
49 
50   // DownloadItem::Observer implementation.
51   virtual void OnDownloadUpdated(DownloadItem* download);
OnDownloadOpened(DownloadItem * download)52   virtual void OnDownloadOpened(DownloadItem* download) { }
53 
54   // ui::AnimationDelegate implementation.
55   virtual void AnimationProgressed(const ui::Animation* animation);
56 
57   // Overridden from NotificationObserver:
58   virtual void Observe(NotificationType type,
59                        const NotificationSource& source,
60                        const NotificationDetails& details);
61 
62   // Called when the icon manager has finished loading the icon. We take
63   // ownership of |icon_bitmap|.
64   void OnLoadSmallIconComplete(IconManager::Handle handle,
65                                gfx::Image* image);
66   void OnLoadLargeIconComplete(IconManager::Handle handle,
67                                gfx::Image* image);
68 
69   // Returns the DownloadItem model object belonging to this item.
70   DownloadItem* get_download();
71 
72  private:
73   friend class DownloadShelfContextMenuGtk;
74 
75   // Returns true IFF the download is dangerous and unconfirmed.
76   bool IsDangerous();
77 
78   // Functions for controlling the progress animation.
79   // Repaint the download progress.
80   void UpdateDownloadProgress();
81 
82   // Starts a repeating timer for UpdateDownloadProgress.
83   void StartDownloadProgress();
84 
85   // Stops the repeating timer.
86   void StopDownloadProgress();
87 
88   // Ask the icon manager to asynchronously start loading the icon for the file.
89   void LoadIcon();
90 
91   // Sets the tooltip on the download button.
92   void UpdateTooltip();
93 
94   // Sets the name label to the correct color.
95   void UpdateNameLabel();
96 
97   // Sets the text of |status_label_| with the correct color.
98   void UpdateStatusLabel(const std::string& status_text);
99 
100   // Sets the components of the danger warning.
101   void UpdateDangerWarning();
102 
103   // Sets the icon for the danger warning dialog.
104   void UpdateDangerIcon();
105 
106   static void InitNineBoxes();
107 
108   // Show popup context menu. If |button| is not NULL, show the menu dropping
109   // down from |button|. Otherwise, show the menu where the user clicks.
110   void ShowPopupMenu(GtkWidget* button, GdkEventButton* event);
111 
112   // Draws everything in GTK rendering mode.
113   CHROMEGTK_CALLBACK_1(DownloadItemGtk, gboolean, OnHboxExpose,
114                        GdkEventExpose*);
115 
116   // Used for the download item's body and menu button in chrome theme mode.
117   CHROMEGTK_CALLBACK_1(DownloadItemGtk, gboolean, OnExpose, GdkEventExpose*);
118 
119   // Called when |body_| is clicked.
120   CHROMEGTK_CALLBACK_0(DownloadItemGtk, void, OnClick);
121 
122   // Called when |body_| is pressed with mouse button. This function is used to
123   // show popup menu with right button click.
124   CHROMEGTK_CALLBACK_1(DownloadItemGtk, gboolean, OnButtonPress,
125                        GdkEventButton*);
126 
127   // Used for the download icon.
128   CHROMEGTK_CALLBACK_1(DownloadItemGtk, gboolean, OnProgressAreaExpose,
129                        GdkEventExpose*);
130 
131   CHROMEGTK_CALLBACK_1(DownloadItemGtk, gboolean, OnMenuButtonPressEvent,
132                        GdkEventButton*);
133 
134   // Dangerous download related. -----------------------------------------------
135   CHROMEGTK_CALLBACK_1(DownloadItemGtk, gboolean, OnDangerousPromptExpose,
136                        GdkEventExpose*);
137   CHROMEGTK_CALLBACK_0(DownloadItemGtk, void, OnDangerousAccept);
138   CHROMEGTK_CALLBACK_0(DownloadItemGtk, void, OnDangerousDecline);
139 
140   // Nineboxes for the body area.
141   static NineBox* body_nine_box_normal_;
142   static NineBox* body_nine_box_prelight_;
143   static NineBox* body_nine_box_active_;
144 
145   // Nineboxes for the menu button.
146   static NineBox* menu_nine_box_normal_;
147   static NineBox* menu_nine_box_prelight_;
148   static NineBox* menu_nine_box_active_;
149 
150   // Ninebox for the background of the dangerous download prompt.
151   static NineBox* dangerous_nine_box_;
152 
153   // The shelf on which we are displayed.
154   DownloadShelfGtk* parent_shelf_;
155 
156   // The widget that contains the body and menu dropdown.
157   OwnedWidgetGtk hbox_;
158 
159   // The widget that contains the name of the download and the progress
160   // animation.
161   OwnedWidgetGtk body_;
162 
163   // The GtkLabel that holds the download title text.
164   GtkWidget* name_label_;
165 
166   // The GtkLabel that holds the status text.
167   GtkWidget* status_label_;
168 
169   // The current text of status label
170   std::string status_text_;
171 
172   // The widget that creates a dropdown menu when pressed.
173   GtkWidget* menu_button_;
174 
175   // A gtk arrow pointing downward displayed in |menu_button_|. Only displayed
176   // in GTK mode.
177   GtkWidget* arrow_;
178 
179   // Whether the menu is currently showing for |menu_button_|. Affects how we
180   // draw the button.
181   bool menu_showing_;
182 
183   // Whether we should use the GTK text color
184   GtkThemeService* theme_service_;
185 
186   // The widget that contains the animation progress and the file's icon
187   // (as well as the complete animation).
188   OwnedWidgetGtk progress_area_;
189 
190   // In degrees. Only used for downloads with no known total size.
191   int progress_angle_;
192 
193   // The menu that pops down when the user presses |menu_button_|. We do not
194   // create this until the first time we actually need it.
195   scoped_ptr<DownloadShelfContextMenuGtk> menu_;
196 
197   // The download item model we represent.
198   scoped_ptr<BaseDownloadItemModel> download_model_;
199 
200   // The dangerous download dialog. This will be null for safe downloads.
201   GtkWidget* dangerous_prompt_;
202   GtkWidget* dangerous_image_;
203   GtkWidget* dangerous_label_;
204 
205   // An hbox for holding components of the dangerous download dialog.
206   OwnedWidgetGtk dangerous_hbox_;
207   int dangerous_hbox_start_width_;
208   int dangerous_hbox_full_width_;
209 
210   // The animation when this item is first added to the shelf.
211   scoped_ptr<ui::SlideAnimation> new_item_animation_;
212 
213   // Progress animation.
214   base::RepeatingTimer<DownloadItemGtk> progress_timer_;
215 
216   // Animation for download complete.
217   ui::SlideAnimation complete_animation_;
218 
219   // The file icon for the download. May be null. The small version is used
220   // for display in the shelf; the large version is for use as a drag icon.
221   // These icons are owned by the IconManager (owned by the BrowserProcess).
222   gfx::Image* icon_small_;
223   gfx::Image* icon_large_;
224 
225   // The last download file path for which we requested an icon.
226   FilePath icon_filepath_;
227 
228   NotificationRegistrar registrar_;
229 
230   // The time at which we were insantiated.
231   base::Time creation_time_;
232 
233   // For canceling an in progress icon request.
234   CancelableRequestConsumerT<int, 0> icon_consumer_;
235 
236   // Indicates when the download has completed, so we don't redo
237   // on-completion actions.
238   bool download_complete_;
239 };
240 
241 #endif  // CHROME_BROWSER_UI_GTK_DOWNLOAD_DOWNLOAD_ITEM_GTK_H_
242