OLD | NEW |
---|---|
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this |
2 // source code is governed by a BSD-style license that can be found in the | 2 // source code is governed by a BSD-style license that can be found in the |
3 // LICENSE file. | 3 // LICENSE file. |
4 | 4 |
5 #include "chrome/browser/gtk/blocked_popup_container_view_gtk.h" | 5 #include "chrome/browser/gtk/blocked_popup_container_view_gtk.h" |
6 | 6 |
7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
8 #include "base/gfx/gtk_util.h" | 8 #include "base/gfx/gtk_util.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "chrome/browser/gtk/custom_button.h" | 10 #include "chrome/browser/gtk/custom_button.h" |
11 #include "chrome/browser/gtk/gtk_chrome_button.h" | 11 #include "chrome/browser/gtk/gtk_chrome_button.h" |
12 #include "chrome/browser/gtk/gtk_theme_provider.h" | |
12 #include "chrome/browser/profile.h" | 13 #include "chrome/browser/profile.h" |
13 #include "chrome/browser/tab_contents/tab_contents.h" | 14 #include "chrome/browser/tab_contents/tab_contents.h" |
14 #include "chrome/browser/tab_contents/tab_contents_view_gtk.h" | 15 #include "chrome/browser/tab_contents/tab_contents_view_gtk.h" |
15 #include "chrome/common/gtk_util.h" | 16 #include "chrome/common/gtk_util.h" |
16 #include "grit/generated_resources.h" | 17 #include "grit/generated_resources.h" |
17 #include "grit/theme_resources.h" | 18 #include "grit/theme_resources.h" |
18 | 19 |
19 namespace { | 20 namespace { |
20 // The minimal border around the edge of the notification. | 21 // The minimal border around the edge of the notification. |
21 const int kSmallPadding = 2; | 22 const int kSmallPadding = 2; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
53 void BlockedPopupContainerViewGtk::GetURLAndTitleForPopup( | 54 void BlockedPopupContainerViewGtk::GetURLAndTitleForPopup( |
54 size_t index, string16* url, string16* title) const { | 55 size_t index, string16* url, string16* title) const { |
55 DCHECK(url); | 56 DCHECK(url); |
56 DCHECK(title); | 57 DCHECK(title); |
57 TabContents* tab_contents = model_->GetTabContentsAt(index); | 58 TabContents* tab_contents = model_->GetTabContentsAt(index); |
58 const GURL& tab_contents_url = tab_contents->GetURL().GetOrigin(); | 59 const GURL& tab_contents_url = tab_contents->GetURL().GetOrigin(); |
59 *url = UTF8ToUTF16(tab_contents_url.possibly_invalid_spec()); | 60 *url = UTF8ToUTF16(tab_contents_url.possibly_invalid_spec()); |
60 *title = tab_contents->GetTitle(); | 61 *title = tab_contents->GetTitle(); |
61 } | 62 } |
62 | 63 |
64 void BlockedPopupContainerViewGtk::UserChangedTheme( | |
65 GtkThemeProperties* properties) { | |
66 use_gtk_rendering_ = properties->use_gtk_rendering; | |
67 | |
68 gtk_chrome_button_set_use_gtk_rendering( | |
69 GTK_CHROME_BUTTON(menu_button_), use_gtk_rendering_); | |
70 } | |
71 | |
63 // Overridden from BlockedPopupContainerView: | 72 // Overridden from BlockedPopupContainerView: |
64 void BlockedPopupContainerViewGtk::SetPosition() { | 73 void BlockedPopupContainerViewGtk::SetPosition() { |
65 // No-op. Not required with the GTK version. | 74 // No-op. Not required with the GTK version. |
66 } | 75 } |
67 | 76 |
68 void BlockedPopupContainerViewGtk::ShowView() { | 77 void BlockedPopupContainerViewGtk::ShowView() { |
69 // TODO(erg): Animate in. | 78 // TODO(erg): Animate in. |
70 gtk_widget_show_all(container_.get()); | 79 gtk_widget_show_all(container_.get()); |
71 } | 80 } |
72 | 81 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
115 model_->ToggleWhitelistingForHost( | 124 model_->ToggleWhitelistingForHost( |
116 id_size_t - BlockedPopupContainer::kImpossibleNumberOfPopups - 1); | 125 id_size_t - BlockedPopupContainer::kImpossibleNumberOfPopups - 1); |
117 } else { | 126 } else { |
118 model_->LaunchPopupAtIndex(id_size_t - 1); | 127 model_->LaunchPopupAtIndex(id_size_t - 1); |
119 } | 128 } |
120 } | 129 } |
121 | 130 |
122 BlockedPopupContainerViewGtk::BlockedPopupContainerViewGtk( | 131 BlockedPopupContainerViewGtk::BlockedPopupContainerViewGtk( |
123 BlockedPopupContainer* container) | 132 BlockedPopupContainer* container) |
124 : model_(container), | 133 : model_(container), |
134 use_gtk_rendering_(false), | |
125 close_button_(CustomDrawButton::CloseButton()) { | 135 close_button_(CustomDrawButton::CloseButton()) { |
126 Init(); | 136 Init(); |
137 | |
138 GtkThemeProperties properties(container->profile()); | |
139 UserChangedTheme(&properties); | |
127 } | 140 } |
128 | 141 |
129 void BlockedPopupContainerViewGtk::Init() { | 142 void BlockedPopupContainerViewGtk::Init() { |
130 menu_button_ = gtk_chrome_button_new(); | 143 menu_button_ = gtk_chrome_button_new(); |
131 UpdateLabel(); | 144 UpdateLabel(); |
132 g_signal_connect(menu_button_, "clicked", | 145 g_signal_connect(menu_button_, "clicked", |
133 G_CALLBACK(OnMenuButtonClicked), this); | 146 G_CALLBACK(OnMenuButtonClicked), this); |
134 | 147 |
135 GtkWidget* hbox = gtk_hbox_new(FALSE, 0); | 148 GtkWidget* hbox = gtk_hbox_new(FALSE, 0); |
136 gtk_box_pack_start(GTK_BOX(hbox), menu_button_, FALSE, FALSE, kSmallPadding); | 149 gtk_box_pack_start(GTK_BOX(hbox), menu_button_, FALSE, FALSE, kSmallPadding); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
178 container->launch_menu_->PopupAsContext(gtk_get_current_event_time()); | 191 container->launch_menu_->PopupAsContext(gtk_get_current_event_time()); |
179 } | 192 } |
180 | 193 |
181 void BlockedPopupContainerViewGtk::OnCloseButtonClicked( | 194 void BlockedPopupContainerViewGtk::OnCloseButtonClicked( |
182 GtkButton *button, BlockedPopupContainerViewGtk* container) { | 195 GtkButton *button, BlockedPopupContainerViewGtk* container) { |
183 container->model_->set_dismissed(); | 196 container->model_->set_dismissed(); |
184 container->model_->CloseAll(); | 197 container->model_->CloseAll(); |
185 } | 198 } |
186 | 199 |
187 gboolean BlockedPopupContainerViewGtk::OnContainerExpose( | 200 gboolean BlockedPopupContainerViewGtk::OnContainerExpose( |
188 GtkWidget* widget, GdkEventExpose* event) { | 201 GtkWidget* widget, GdkEventExpose* event, |
189 // TODO(erg): When evanm comes through the code, adding gtk theme support, | 202 BlockedPopupContainerViewGtk* container) { |
190 // what's here needs to go in a if block and the else should just paint the | |
191 // normal theme background with a border around the outsides. | |
192 int width = widget->allocation.width; | 203 int width = widget->allocation.width; |
193 int height = widget->allocation.height; | 204 int height = widget->allocation.height; |
194 int half_width = width / 2; | |
195 | 205 |
196 // Clip to our damage rect | 206 // Clip to our damage rect |
197 cairo_t* cr = gdk_cairo_create(GDK_DRAWABLE(widget->window)); | 207 cairo_t* cr = gdk_cairo_create(GDK_DRAWABLE(widget->window)); |
198 cairo_rectangle(cr, event->area.x, event->area.y, | 208 cairo_rectangle(cr, event->area.x, event->area.y, |
199 event->area.width, event->area.height); | 209 event->area.width, event->area.height); |
200 cairo_clip(cr); | 210 cairo_clip(cr); |
201 | 211 |
202 // Draws our background gradient. | 212 if (!container->use_gtk_rendering_) { |
203 cairo_pattern_t* pattern = cairo_pattern_create_linear( | 213 // TODO(erg): We draw the gradient background only when GTK themes are |
tony
2009/07/07 20:46:29
I see, so we still draw the background, it's just
| |
204 half_width, 0, half_width, height); | 214 // off. This isn't a perfect solution as this isn't themed! The views |
205 cairo_pattern_add_color_stop_rgb( | 215 // version doesn't appear to be themed either, so at least for now, |
206 pattern, 0.0, | 216 // constants are OK. |
207 kBackgroundColorTop[0], kBackgroundColorTop[1], kBackgroundColorTop[2]); | 217 int half_width = width / 2; |
208 cairo_pattern_add_color_stop_rgb( | 218 cairo_pattern_t* pattern = cairo_pattern_create_linear( |
209 pattern, 1.0, | 219 half_width, 0, half_width, height); |
210 kBackgroundColorBottom[0], kBackgroundColorBottom[1], | 220 cairo_pattern_add_color_stop_rgb( |
211 kBackgroundColorBottom[2]); | 221 pattern, 0.0, |
212 cairo_set_source(cr, pattern); | 222 kBackgroundColorTop[0], kBackgroundColorTop[1], kBackgroundColorTop[2]); |
213 cairo_paint(cr); | 223 cairo_pattern_add_color_stop_rgb( |
214 cairo_pattern_destroy(pattern); | 224 pattern, 1.0, |
225 kBackgroundColorBottom[0], kBackgroundColorBottom[1], | |
226 kBackgroundColorBottom[2]); | |
227 cairo_set_source(cr, pattern); | |
228 cairo_paint(cr); | |
229 cairo_pattern_destroy(pattern); | |
230 } | |
231 | |
232 // TODO(erg): We need to figure out the border situation, too. We aren't | |
233 // provided a color from the theme system and the Windows implementation | |
234 // still uses constants for color. See the status bubble, too. | |
215 | 235 |
216 // Sets up our stroke pen. | 236 // Sets up our stroke pen. |
217 cairo_set_source_rgb(cr, kBorderColor[0], kBorderColor[1], kBorderColor[2]); | 237 cairo_set_source_rgb(cr, kBorderColor[0], kBorderColor[1], kBorderColor[2]); |
218 cairo_set_line_width(cr, 1.5); | 238 cairo_set_line_width(cr, 1.5); |
219 | 239 |
220 // Draws rounded corners around the edge of the notification, clockwise | 240 // Draws rounded corners around the edge of the notification, clockwise |
221 // starting from the bottom left. (A bezier curve with control points at 90 | 241 // starting from the bottom left. (A bezier curve with control points at 90 |
222 // degree angles forms a circular arc.) | 242 // degree angles forms a circular arc.) |
223 cairo_move_to(cr, 0, height); | 243 cairo_move_to(cr, 0, height); |
224 cairo_line_to(cr, 0, kBackgroundCornerRadius); | 244 cairo_line_to(cr, 0, kBackgroundCornerRadius); |
225 cairo_curve_to(cr, 0, kBackgroundCornerRadius, | 245 cairo_curve_to(cr, 0, kBackgroundCornerRadius, |
226 0, 0, kBackgroundCornerRadius, 0); | 246 0, 0, kBackgroundCornerRadius, 0); |
227 cairo_line_to(cr, width - kBackgroundCornerRadius, 0); | 247 cairo_line_to(cr, width - kBackgroundCornerRadius, 0); |
228 cairo_curve_to(cr, width - kBackgroundCornerRadius, 0, | 248 cairo_curve_to(cr, width - kBackgroundCornerRadius, 0, |
229 width, 0, width, kBackgroundCornerRadius); | 249 width, 0, width, kBackgroundCornerRadius); |
230 cairo_line_to(cr, width, height); | 250 cairo_line_to(cr, width, height); |
231 cairo_stroke(cr); | 251 cairo_stroke(cr); |
232 | 252 |
233 cairo_destroy(cr); | 253 cairo_destroy(cr); |
234 | 254 |
235 return FALSE; // Allow subwidgets to paint. | 255 return FALSE; // Allow subwidgets to paint. |
236 } | 256 } |
OLD | NEW |