blob: aec4f95a5354fd91219555920f6a363e586a4ea2 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_GTK_DOWNLOAD_DOWNLOAD_ITEM_GTK_H_
#define CHROME_BROWSER_UI_GTK_DOWNLOAD_DOWNLOAD_ITEM_GTK_H_
#include <gtk/gtk.h>
#include <string>
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "chrome/browser/download/download_item_model.h"
#include "chrome/browser/icon_manager.h"
#include "chrome/common/cancelable_task_tracker.h"
#include "content/public/browser/download_item.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "ui/base/gtk/gtk_signal.h"
#include "ui/base/gtk/owned_widget_gtk.h"
#include "ui/gfx/animation/animation_delegate.h"
#include "ui/gfx/animation/slide_animation.h"
class DownloadShelfContextMenuGtk;
class DownloadShelfGtk;
class GtkThemeService;
class NineBox;
namespace gfx {
class Image;
class SlideAnimation;
}
class DownloadItemGtk : public content::DownloadItem::Observer,
public gfx::AnimationDelegate,
public content::NotificationObserver {
public:
// DownloadItemGtk takes ownership of |download_item_model|.
DownloadItemGtk(DownloadShelfGtk* parent_shelf,
content::DownloadItem* download_item);
// Destroys all widgets belonging to this DownloadItemGtk.
virtual ~DownloadItemGtk();
// content::DownloadItem::Observer implementation.
virtual void OnDownloadUpdated(content::DownloadItem* download) OVERRIDE;
virtual void OnDownloadDestroyed(content::DownloadItem* download) OVERRIDE;
virtual void OnDownloadOpened(content::DownloadItem* download) OVERRIDE;
// gfx::AnimationDelegate implementation.
virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE;
// Overridden from content::NotificationObserver:
virtual void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE;
// Called when the icon manager has finished loading the icon. We take
// ownership of |icon_bitmap|.
void OnLoadSmallIconComplete(gfx::Image* image);
void OnLoadLargeIconComplete(gfx::Image* image);
// Returns the DownloadItem model object belonging to this item.
content::DownloadItem* download() { return download_model_.download(); }
private:
friend class DownloadShelfContextMenuGtk;
// Functions for controlling the progress animation.
// Repaint the download progress.
void UpdateDownloadProgress();
// Starts a repeating timer for UpdateDownloadProgress.
void StartDownloadProgress();
// Stops the repeating timer.
void StopDownloadProgress();
// Ask the icon manager to asynchronously start loading the icon for the file.
void LoadIcon();
// Sets the tooltip on the download button.
void UpdateTooltip();
// Sets the name label to the correct color.
void UpdateNameLabel();
// Sets the text of |status_label_| with the correct color.
void UpdateStatusLabel(const std::string& status_text);
// Sets the components of the danger warning.
void UpdateDangerWarning();
// Sets the icon for the danger warning dialog.
void UpdateDangerIcon();
// Reenables the download button after it has been clicked.
void ReenableHbox();
static void InitNineBoxes();
// Show popup context menu. If |button| is not NULL, show the menu dropping
// down from |button|. Otherwise, show the menu where the user clicks.
void ShowPopupMenu(GtkWidget* button, GdkEventButton* event);
// Draws everything in GTK rendering mode.
CHROMEGTK_CALLBACK_1(DownloadItemGtk, gboolean, OnHboxExpose,
GdkEventExpose*);
// Used for the download item's body and menu button in chrome theme mode.
CHROMEGTK_CALLBACK_1(DownloadItemGtk, gboolean, OnExpose, GdkEventExpose*);
// Called when |body_| is clicked.
CHROMEGTK_CALLBACK_0(DownloadItemGtk, void, OnClick);
// Called when |body_| is pressed with mouse button. This function is used to
// show popup menu with right button click.
CHROMEGTK_CALLBACK_1(DownloadItemGtk, gboolean, OnButtonPress,
GdkEventButton*);
// Used for the download icon.
CHROMEGTK_CALLBACK_1(DownloadItemGtk, gboolean, OnProgressAreaExpose,
GdkEventExpose*);
CHROMEGTK_CALLBACK_1(DownloadItemGtk, gboolean, OnMenuButtonPressEvent,
GdkEventButton*);
// Dangerous download related. -----------------------------------------------
CHROMEGTK_CALLBACK_1(DownloadItemGtk, gboolean, OnDangerousPromptExpose,
GdkEventExpose*);
CHROMEGTK_CALLBACK_0(DownloadItemGtk, void, OnDangerousAccept);
CHROMEGTK_CALLBACK_0(DownloadItemGtk, void, OnDangerousDecline);
// Nineboxes for the body area.
static NineBox* body_nine_box_normal_;
static NineBox* body_nine_box_prelight_;
static NineBox* body_nine_box_active_;
// Nineboxes for the menu button.
static NineBox* menu_nine_box_normal_;
static NineBox* menu_nine_box_prelight_;
static NineBox* menu_nine_box_active_;
// Ninebox for the background of the dangerous download prompt.
static NineBox* dangerous_nine_box_;
// The shelf on which we are displayed.
DownloadShelfGtk* parent_shelf_;
// The widget that contains the body and menu dropdown.
ui::OwnedWidgetGtk hbox_;
// The widget that contains the name of the download and the progress
// animation.
ui::OwnedWidgetGtk body_;
// The widget that contains the texts of |name_label_| and |status_label_|.
GtkWidget* text_stack_;
// The GtkLabel that holds the download title text.
GtkWidget* name_label_;
// The GtkLabel that holds the status text.
GtkWidget* status_label_;
// The current text of status label
std::string status_text_;
// The widget that creates a dropdown menu when pressed.
GtkWidget* menu_button_;
// A gtk arrow pointing downward displayed in |menu_button_|. Only displayed
// in GTK mode.
GtkWidget* arrow_;
// Whether the menu is currently showing for |menu_button_|. Affects how we
// draw the button.
bool menu_showing_;
// Whether we should use the GTK text color
GtkThemeService* theme_service_;
// The widget that contains the animation progress and the file's icon
// (as well as the complete animation).
ui::OwnedWidgetGtk progress_area_;
// In degrees. Only used for downloads with no known total size.
int progress_angle_;
// The menu that pops down when the user presses |menu_button_|. We do not
// create this until the first time we actually need it.
scoped_ptr<DownloadShelfContextMenuGtk> menu_;
// The download item model we represent.
DownloadItemModel download_model_;
// The dangerous download dialog. This will be null for safe downloads.
GtkWidget* dangerous_prompt_;
GtkWidget* dangerous_image_;
GtkWidget* dangerous_label_;
// An hbox for holding components of the dangerous download dialog.
ui::OwnedWidgetGtk dangerous_hbox_;
int dangerous_hbox_start_width_;
int dangerous_hbox_full_width_;
// The animation when this item is first added to the shelf.
scoped_ptr<gfx::SlideAnimation> new_item_animation_;
// Progress animation.
base::RepeatingTimer<DownloadItemGtk> progress_timer_;
// Animation for download complete.
gfx::SlideAnimation complete_animation_;
// The file icon for the download. May be null. The small version is used
// for display in the shelf; the large version is for use as a drag icon.
// These icons are owned by the IconManager (owned by the BrowserProcess).
gfx::Image* icon_small_;
gfx::Image* icon_large_;
// The last download file path for which we requested an icon.
base::FilePath icon_filepath_;
content::NotificationRegistrar registrar_;
// The time at which we were insantiated.
base::Time creation_time_;
// For canceling an in progress icon request.
CancelableTaskTracker cancelable_task_tracker_;
// Indicates when the download has completed, so we don't redo
// on-completion actions.
bool download_complete_;
// Whether we are currently disabled as part of opening the downloaded file.
bool disabled_while_opening_;
// Method factory used to delay reenabling of the item when opening the
// downloaded file.
base::WeakPtrFactory<DownloadItemGtk> weak_ptr_factory_;
};
#endif // CHROME_BROWSER_UI_GTK_DOWNLOAD_DOWNLOAD_ITEM_GTK_H_