OLD | NEW |
---|---|
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/gtk/download_item_gtk.h" | 5 #include "chrome/browser/gtk/download_item_gtk.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "chrome/browser/download/download_item_model.h" | 8 #include "chrome/browser/download/download_item_model.h" |
9 #include "chrome/browser/download/download_manager.h" | 9 #include "chrome/browser/download/download_manager.h" |
10 #include "chrome/browser/gtk/nine_box.h" | 10 #include "chrome/browser/gtk/nine_box.h" |
11 #include "chrome/common/resource_bundle.h" | 11 #include "chrome/common/resource_bundle.h" |
12 | 12 |
13 #include "grit/theme_resources.h" | 13 #include "grit/theme_resources.h" |
14 | 14 |
15 NineBox* DownloadItemGtk::nine_box_normal_ = NULL; | 15 namespace { |
16 NineBox* DownloadItemGtk::nine_box_prelight_ = NULL; | 16 |
17 NineBox* DownloadItemGtk::nine_box_active_ = NULL; | 17 // The width of the |menu_button_| widget. It has to be at least as wide as the |
18 // bitmap that we use to draw it, i.e. 16, but can be more. | |
19 const int kMenuButtonWidth = 16; | |
20 | |
21 } | |
Dean McNamee
2009/03/05 14:16:01
// namespace
| |
22 | |
23 NineBox* DownloadItemGtk::body_nine_box_normal_ = NULL; | |
24 NineBox* DownloadItemGtk::body_nine_box_prelight_ = NULL; | |
25 NineBox* DownloadItemGtk::body_nine_box_active_ = NULL; | |
26 | |
27 NineBox* DownloadItemGtk::menu_nine_box_normal_ = NULL; | |
28 NineBox* DownloadItemGtk::menu_nine_box_prelight_ = NULL; | |
29 NineBox* DownloadItemGtk::menu_nine_box_active_ = NULL; | |
18 | 30 |
19 DownloadItemGtk::DownloadItemGtk(BaseDownloadItemModel* download_model, | 31 DownloadItemGtk::DownloadItemGtk(BaseDownloadItemModel* download_model, |
20 GtkWidget* parent_shelf) | 32 GtkWidget* parent_shelf) |
21 : download_model_(download_model), | 33 : download_model_(download_model), |
22 parent_shelf_(parent_shelf) { | 34 parent_shelf_(parent_shelf) { |
23 InitNineBoxes(); | 35 InitNineBoxes(); |
24 | 36 |
25 body_ = gtk_button_new(); | 37 body_ = gtk_button_new(); |
26 gtk_widget_set_app_paintable(body_, TRUE); | 38 gtk_widget_set_app_paintable(body_, TRUE); |
27 g_signal_connect(G_OBJECT(body_), "expose-event", | 39 g_signal_connect(G_OBJECT(body_), "expose-event", |
28 G_CALLBACK(OnBodyExpose), this); | 40 G_CALLBACK(OnExpose), this); |
29 | 41 GTK_WIDGET_UNSET_FLAGS(body_, GTK_CAN_FOCUS); |
30 GtkWidget* label = gtk_label_new(download_model->download()->file_name() | 42 GtkWidget* label = gtk_label_new(download_model->download()->GetFileName() |
Dean McNamee
2009/03/05 14:16:01
I would have wrapped this at the first ( if it's p
| |
31 .value().c_str()); | 43 .value().c_str()); |
32 gtk_container_add(GTK_CONTAINER(body_), label); | 44 gtk_container_add(GTK_CONTAINER(body_), label); |
33 | 45 |
46 menu_button_ = gtk_button_new(); | |
47 gtk_widget_set_app_paintable(menu_button_, TRUE); | |
48 GTK_WIDGET_UNSET_FLAGS(menu_button_, GTK_CAN_FOCUS); | |
49 g_signal_connect(G_OBJECT(menu_button_), "expose-event", | |
50 G_CALLBACK(OnExpose), this); | |
51 gtk_widget_set_size_request(menu_button_, kMenuButtonWidth, 0); | |
52 | |
34 hbox_ = gtk_hbox_new(FALSE, 0); | 53 hbox_ = gtk_hbox_new(FALSE, 0); |
35 gtk_box_pack_start(GTK_BOX(hbox_), body_, FALSE, FALSE, 0); | 54 gtk_box_pack_start(GTK_BOX(hbox_), body_, FALSE, FALSE, 0); |
55 gtk_box_pack_start(GTK_BOX(hbox_), menu_button_, FALSE, FALSE, 0); | |
36 gtk_box_pack_start(GTK_BOX(parent_shelf), hbox_, FALSE, FALSE, 0); | 56 gtk_box_pack_start(GTK_BOX(parent_shelf), hbox_, FALSE, FALSE, 0); |
37 gtk_widget_show_all(hbox_); | 57 gtk_widget_show_all(hbox_); |
38 } | 58 } |
39 | 59 |
40 // static | 60 // static |
41 void DownloadItemGtk::InitNineBoxes() { | 61 void DownloadItemGtk::InitNineBoxes() { |
42 if (nine_box_normal_) | 62 if (body_nine_box_normal_) |
43 return; | 63 return; |
44 | 64 |
45 GdkPixbuf* images[9]; | 65 GdkPixbuf* images[9]; |
46 ResourceBundle &rb = ResourceBundle::GetSharedInstance(); | 66 ResourceBundle &rb = ResourceBundle::GetSharedInstance(); |
47 | 67 |
48 int i = 0; | 68 int i = 0; |
49 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_TOP); | 69 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_TOP); |
50 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_TOP); | 70 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_TOP); |
51 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_TOP); | 71 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_TOP); |
52 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_MIDDLE); | 72 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_MIDDLE); |
53 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_MIDDLE); | 73 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_MIDDLE); |
54 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_MIDDLE); | 74 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_MIDDLE); |
55 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_BOTTOM); | 75 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_BOTTOM); |
56 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_BOTTOM); | 76 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_BOTTOM); |
57 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_BOTTOM); | 77 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_BOTTOM); |
58 nine_box_normal_ = new NineBox(images); | 78 body_nine_box_normal_ = new NineBox(images); |
59 | 79 |
60 i = 0; | 80 i = 0; |
61 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_TOP_H); | 81 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_TOP_H); |
62 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_TOP_H); | 82 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_TOP_H); |
63 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_TOP_H); | 83 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_TOP_H); |
64 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_MIDDLE_H); | 84 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_MIDDLE_H); |
65 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_MIDDLE_H); | 85 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_MIDDLE_H); |
66 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_MIDDLE_H); | 86 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_MIDDLE_H); |
67 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_BOTTOM_H); | 87 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_BOTTOM_H); |
68 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_BOTTOM_H); | 88 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_BOTTOM_H); |
69 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_BOTTOM_H); | 89 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_BOTTOM_H); |
70 nine_box_prelight_ = new NineBox(images); | 90 body_nine_box_prelight_ = new NineBox(images); |
71 | 91 |
72 i = 0; | 92 i = 0; |
73 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_TOP_P); | 93 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_TOP_P); |
74 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_TOP_P); | 94 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_TOP_P); |
75 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_TOP_P); | 95 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_TOP_P); |
76 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_MIDDLE_P); | 96 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_MIDDLE_P); |
77 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_MIDDLE_P); | 97 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_MIDDLE_P); |
78 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_MIDDLE_P); | 98 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_MIDDLE_P); |
79 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_BOTTOM_P); | 99 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_LEFT_BOTTOM_P); |
80 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_BOTTOM_P); | 100 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_CENTER_BOTTOM_P); |
81 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_BOTTOM_P); | 101 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_RIGHT_BOTTOM_P); |
82 nine_box_active_ = new NineBox(images); | 102 body_nine_box_active_ = new NineBox(images); |
103 | |
104 i = 0; | |
105 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_MENU_TOP); | |
106 images[i++] = NULL; | |
107 images[i++] = NULL; | |
108 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_MENU_MIDDLE); | |
109 images[i++] = NULL; | |
110 images[i++] = NULL; | |
111 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_MENU_BOTTOM); | |
112 images[i++] = NULL; | |
113 images[i++] = NULL; | |
114 menu_nine_box_normal_ = new NineBox(images); | |
115 | |
116 i = 0; | |
117 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_MENU_TOP_H); | |
118 images[i++] = NULL; | |
119 images[i++] = NULL; | |
120 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_MENU_MIDDLE_H); | |
121 images[i++] = NULL; | |
122 images[i++] = NULL; | |
123 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_MENU_BOTTOM_H); | |
124 images[i++] = NULL; | |
125 images[i++] = NULL; | |
126 menu_nine_box_prelight_ = new NineBox(images); | |
127 | |
128 i = 0; | |
129 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_MENU_TOP_P); | |
130 images[i++] = NULL; | |
131 images[i++] = NULL; | |
132 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_MENU_MIDDLE_P); | |
133 images[i++] = NULL; | |
134 images[i++] = NULL; | |
135 images[i++] = rb.LoadPixbuf(IDR_DOWNLOAD_BUTTON_MENU_BOTTOM_P); | |
136 images[i++] = NULL; | |
137 images[i++] = NULL; | |
138 menu_nine_box_active_ = new NineBox(images); | |
83 } | 139 } |
84 | 140 |
85 // static | 141 // static |
86 gboolean DownloadItemGtk::OnBodyExpose(GtkWidget* widget, GdkEventExpose* e, | 142 gboolean DownloadItemGtk::OnExpose(GtkWidget* widget, GdkEventExpose* e, |
87 DownloadItemGtk* download_item) { | 143 DownloadItemGtk* download_item) { |
88 NineBox* nine_box = NULL; | 144 NineBox* nine_box = NULL; |
145 // If true, this widget is |body_|, otherwise it is |menu_button_|. | |
146 bool is_body = widget == download_item->body_; | |
89 if (GTK_WIDGET_STATE(widget) == GTK_STATE_PRELIGHT) | 147 if (GTK_WIDGET_STATE(widget) == GTK_STATE_PRELIGHT) |
90 nine_box = nine_box_prelight_; | 148 nine_box = is_body ? body_nine_box_prelight_ : menu_nine_box_prelight_; |
91 else if (GTK_WIDGET_STATE(widget) == GTK_STATE_ACTIVE) | 149 else if (GTK_WIDGET_STATE(widget) == GTK_STATE_ACTIVE) |
92 nine_box = nine_box_active_; | 150 nine_box = is_body ? body_nine_box_active_ : menu_nine_box_active_; |
93 else | 151 else |
94 nine_box = nine_box_normal_; | 152 nine_box = is_body ? body_nine_box_normal_ : menu_nine_box_normal_; |
95 | 153 |
96 GdkPixbuf* pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, | 154 GdkPixbuf* pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, |
97 true, // alpha | 155 true, // alpha |
98 8, // bits per channel | 156 8, // bits per channel |
99 widget->allocation.width, | 157 widget->allocation.width, |
100 widget->allocation.height); | 158 widget->allocation.height); |
101 | 159 |
102 nine_box->RenderToPixbuf(pixbuf); | 160 nine_box->RenderToPixbuf(pixbuf); |
103 | 161 |
104 gdk_draw_pixbuf(widget->window, | 162 gdk_draw_pixbuf(widget->window, |
105 widget->style->fg_gc[GTK_WIDGET_STATE(widget)], | 163 widget->style->fg_gc[GTK_WIDGET_STATE(widget)], |
106 pixbuf, | 164 pixbuf, |
107 0, 0, | 165 0, 0, |
108 widget->allocation.x, widget->allocation.y, -1, -1, | 166 widget->allocation.x, widget->allocation.y, -1, -1, |
109 GDK_RGB_DITHER_NONE, 0, 0); | 167 GDK_RGB_DITHER_NONE, 0, 0); |
110 | 168 |
111 gdk_pixbuf_unref(pixbuf); | 169 gdk_pixbuf_unref(pixbuf); |
112 | 170 |
113 gtk_container_propagate_expose(GTK_CONTAINER(widget), | 171 GtkWidget* child = gtk_bin_get_child(GTK_BIN(widget)); |
114 gtk_bin_get_child(GTK_BIN(widget)), | 172 if (child) |
115 e); | 173 gtk_container_propagate_expose(GTK_CONTAINER(widget), child, e); |
116 | 174 |
117 return TRUE; | 175 return TRUE; |
118 } | 176 } |
119 | 177 |
120 | |
OLD | NEW |