// Copyright (c) 2006-2008 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. // // A ChromeView that implements one download on the Download shelf. // Each DownloadItemView contains an application icon, a text label // indicating the download's file name, a text label indicating the // download's status (such as the number of bytes downloaded so far) // and a button for canceling an in progress download, or opening // the completed download. // // The DownloadItemView lives in the Browser, and has a corresponding // DownloadController that receives / writes data which lives in the // Renderer. #ifndef CHROME_BROWSER_VIEWS_DOWNLOAD_ITEM_VIEW_H__ #define CHROME_BROWSER_VIEWS_DOWNLOAD_ITEM_VIEW_H__ #include #include "base/basictypes.h" #include "base/scoped_ptr.h" #include "base/timer.h" #include "chrome/common/slide_animation.h" #include "chrome/browser/cancelable_request.h" #include "chrome/browser/download/download_manager.h" #include "chrome/browser/icon_manager.h" #include "chrome/views/event.h" #include "chrome/views/native_button.h" #include "chrome/views/view.h" namespace views { class Label; } class DownloadShelfView; class SkBitmap; class DownloadItemView : public views::NativeButton::Listener, public views::View, public DownloadItem::Observer, public AnimationDelegate { public: // This class provides functions which have different behaviors between // download and saving page. class BaseDownloadItemModel { public: // Cancel the task corresponding to the item. virtual void CancelTask() = 0; // Get the status text to display. virtual std::wstring GetStatusText() = 0; }; DownloadItemView(DownloadItem* download, DownloadShelfView* parent, BaseDownloadItemModel* model); virtual ~DownloadItemView(); // DownloadObserver method virtual void OnDownloadUpdated(DownloadItem* download); // View overrides virtual void Layout(); virtual void Paint(ChromeCanvas* canvas); virtual gfx::Size GetPreferredSize(); virtual void OnMouseExited(const views::MouseEvent& event); virtual void OnMouseMoved(const views::MouseEvent& event); virtual bool OnMousePressed(const views::MouseEvent& event); virtual void OnMouseReleased(const views::MouseEvent& event, bool canceled); virtual bool OnMouseDragged(const views::MouseEvent& event); // NativeButton::Listener implementation. virtual void ButtonPressed(views::NativeButton* sender); // AnimationDelegate implementation. virtual void AnimationProgressed(const Animation* animation); // Timer callback for handling animations void UpdateDownloadProgress(); void StartDownloadProgress(); void StopDownloadProgress(); // IconManager::Client interface. void OnExtractIconComplete(IconManager::Handle handle, SkBitmap* icon_bitmap); private: enum State { NORMAL = 0, HOT, PUSHED, DANGEROUS }; // The image set associated with the part containing the icon and text. struct BodyImageSet { SkBitmap* top_left; SkBitmap* left; SkBitmap* bottom_left; SkBitmap* top; SkBitmap* center; SkBitmap* bottom; SkBitmap* top_right; SkBitmap* right; SkBitmap* bottom_right; }; // The image set associated with the drop-down button on the right. struct DropDownImageSet { SkBitmap* top; SkBitmap* center; SkBitmap* bottom; }; void OpenDownload(); void LoadIcon(); // Convenience method to paint the 3 vertical bitmaps (bottom, middle, top) // that form the background. void PaintBitmaps(ChromeCanvas* canvas, const SkBitmap* top_bitmap, const SkBitmap* center_bitmap, const SkBitmap* bottom_bitmap, int x, int y, int height, int width); // Sets the state and triggers a repaint. void SetState(State body_state, State drop_down_state); // Whether we are in the dangerous mode. bool IsDangerousMode() { return body_state_ == DANGEROUS; } // Reverts from dangerous mode to normal download mode. void ClearDangerousMode(); // Sets |size| with the size of the Save and Discard buttons (they have the // same size). gfx::Size GetButtonSize(); // Sizes the dangerous download label to a minimum width available using 2 // lines. The size is computed only the first time this method is invoked // and simply returned on subsequent calls. void SizeLabelToMinWidth(); // The different images used for the background. BodyImageSet normal_body_image_set_; BodyImageSet hot_body_image_set_; BodyImageSet pushed_body_image_set_; BodyImageSet dangerous_mode_body_image_set_; DropDownImageSet normal_drop_down_image_set_; DropDownImageSet hot_drop_down_image_set_; DropDownImageSet pushed_drop_down_image_set_; // The warning icon showns for dangerous downloads. SkBitmap* warning_icon_; // The model we query for display information DownloadItem* download_; // Our parent view that owns us. DownloadShelfView* parent_; // Elements of our particular download std::wstring status_text_; bool show_status_text_; // The font used to print the file name and status. ChromeFont font_; // The current state (normal, hot or pushed) of the body and drop-down. State body_state_; State drop_down_state_; // In degrees, for downloads with no known total size. int progress_angle_; // The x coordinate at which the drop-down button starts. int drop_down_x_; // Used when we are showing the menu to show the drop-down as pressed. bool drop_down_pressed_; // The height of the box formed by the background images and its labels. int box_height_; // The y coordinate of the box formed by the background images and its labels. int box_y_; // Whether we are dragging the download button. bool dragging_; // Whether we are tracking a possible drag. bool starting_drag_; // Position that a possible drag started at. gfx::Point drag_start_point_; // For canceling an in progress icon request. CancelableRequestConsumerT icon_consumer_; // A model class to control the status text we display and the cancel // behavior. // This class owns the pointer. scoped_ptr model_; // Hover animations for our body and drop buttons. scoped_ptr body_hover_animation_; scoped_ptr drop_hover_animation_; // Animation for download complete. scoped_ptr complete_animation_; // Progress animation base::RepeatingTimer progress_timer_; // Dangerous mode buttons. views::NativeButton* save_button_; views::NativeButton* discard_button_; // Dangerous mode label. views::Label* dangerous_download_label_; // Whether the dangerous mode label has been sized yet. bool dangerous_download_label_sized_; // The size of the buttons. Cached so animation works when hidden. gfx::Size cached_button_size_; DISALLOW_EVIL_CONSTRUCTORS(DownloadItemView); }; #endif // CHROME_BROWSER_VIEWS_DOWNLOAD_ITEM_VIEW_H__