1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
|
// 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 <string>
#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_manager.h"
#include "chrome/browser/icon_manager.h"
#include "chrome/views/event.h"
#include "chrome/views/view.h"
#include "chrome/views/label.h"
class DownloadShelfView;
class SkBitmap;
class DownloadItemView : public ChromeViews::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 Paint(ChromeCanvas* canvas);
virtual void GetPreferredSize(CSize *out);
virtual void OnMouseExited(const ChromeViews::MouseEvent& event);
virtual void OnMouseMoved(const ChromeViews::MouseEvent& event);
virtual bool OnMousePressed(const ChromeViews::MouseEvent& event);
virtual void OnMouseReleased(const ChromeViews::MouseEvent& event,
bool canceled);
virtual bool OnMouseDragged(const ChromeViews::MouseEvent& event);
// 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,
};
// 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);
// The different images used for the background.
BodyImageSet normal_body_image_set_;
BodyImageSet hot_body_image_set_;
BodyImageSet pushed_body_image_set_;
DropDownImageSet normal_drop_down_image_set_;
DropDownImageSet hot_drop_down_image_set_;
DropDownImageSet pushed_drop_down_image_set_;
// The model we query for display information
DownloadItem* download_;
// Our parent view that owns us.
DownloadShelfView* parent_;
// Elements of our particular download
std::wstring file_name_;
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<int, 0> icon_consumer_;
// A model class to control the status text we display and the cancel
// behavior.
// This class owns the pointer.
scoped_ptr<BaseDownloadItemModel> model_;
// Hover animations for our body and drop buttons.
scoped_ptr<SlideAnimation> body_hover_animation_;
scoped_ptr<SlideAnimation> drop_hover_animation_;
// Animation for download complete.
scoped_ptr<SlideAnimation> complete_animation_;
// Progress animation
base::RepeatingTimer<DownloadItemView> progress_timer_;
DISALLOW_EVIL_CONSTRUCTORS(DownloadItemView);
};
#endif // CHROME_BROWSER_VIEWS_DOWNLOAD_ITEM_VIEW_H__
|