| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/ui/gtk/download/download_item_gtk.h" | 5 #include "chrome/browser/ui/gtk/download/download_item_gtk.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 | 97 |
| 98 NineBox* DownloadItemGtk::menu_nine_box_normal_ = NULL; | 98 NineBox* DownloadItemGtk::menu_nine_box_normal_ = NULL; |
| 99 NineBox* DownloadItemGtk::menu_nine_box_prelight_ = NULL; | 99 NineBox* DownloadItemGtk::menu_nine_box_prelight_ = NULL; |
| 100 NineBox* DownloadItemGtk::menu_nine_box_active_ = NULL; | 100 NineBox* DownloadItemGtk::menu_nine_box_active_ = NULL; |
| 101 | 101 |
| 102 NineBox* DownloadItemGtk::dangerous_nine_box_ = NULL; | 102 NineBox* DownloadItemGtk::dangerous_nine_box_ = NULL; |
| 103 | 103 |
| 104 using content::DownloadItem; | 104 using content::DownloadItem; |
| 105 | 105 |
| 106 DownloadItemGtk::DownloadItemGtk(DownloadShelfGtk* parent_shelf, | 106 DownloadItemGtk::DownloadItemGtk(DownloadShelfGtk* parent_shelf, |
| 107 DownloadItemModel* download_model) | 107 DownloadItem* download_item) |
| 108 : parent_shelf_(parent_shelf), | 108 : parent_shelf_(parent_shelf), |
| 109 arrow_(NULL), | 109 arrow_(NULL), |
| 110 menu_showing_(false), | 110 menu_showing_(false), |
| 111 theme_service_( | 111 theme_service_( |
| 112 GtkThemeService::GetFrom(parent_shelf->browser()->profile())), | 112 GtkThemeService::GetFrom(parent_shelf->browser()->profile())), |
| 113 progress_angle_(download_util::kStartAngleDegrees), | 113 progress_angle_(download_util::kStartAngleDegrees), |
| 114 download_model_(download_model), | 114 download_model_(download_item), |
| 115 dangerous_prompt_(NULL), | 115 dangerous_prompt_(NULL), |
| 116 dangerous_label_(NULL), | 116 dangerous_label_(NULL), |
| 117 complete_animation_(this), | 117 complete_animation_(this), |
| 118 icon_small_(NULL), | 118 icon_small_(NULL), |
| 119 icon_large_(NULL), | 119 icon_large_(NULL), |
| 120 creation_time_(base::Time::Now()), | 120 creation_time_(base::Time::Now()), |
| 121 download_complete_(false), | 121 download_complete_(false), |
| 122 disabled_while_opening_(false), | 122 disabled_while_opening_(false), |
| 123 weak_ptr_factory_(this) { | 123 weak_ptr_factory_(this) { |
| 124 LoadIcon(); | 124 LoadIcon(); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 GtkWidget* shelf_hbox = parent_shelf->GetHBox(); | 186 GtkWidget* shelf_hbox = parent_shelf->GetHBox(); |
| 187 hbox_.Own(gtk_hbox_new(FALSE, 0)); | 187 hbox_.Own(gtk_hbox_new(FALSE, 0)); |
| 188 g_signal_connect(hbox_.get(), "expose-event", | 188 g_signal_connect(hbox_.get(), "expose-event", |
| 189 G_CALLBACK(OnHboxExposeThunk), this); | 189 G_CALLBACK(OnHboxExposeThunk), this); |
| 190 gtk_box_pack_start(GTK_BOX(hbox_.get()), body_.get(), FALSE, FALSE, 0); | 190 gtk_box_pack_start(GTK_BOX(hbox_.get()), body_.get(), FALSE, FALSE, 0); |
| 191 gtk_box_pack_start(GTK_BOX(hbox_.get()), menu_button_, FALSE, FALSE, 0); | 191 gtk_box_pack_start(GTK_BOX(hbox_.get()), menu_button_, FALSE, FALSE, 0); |
| 192 gtk_box_pack_start(GTK_BOX(shelf_hbox), hbox_.get(), FALSE, FALSE, 0); | 192 gtk_box_pack_start(GTK_BOX(shelf_hbox), hbox_.get(), FALSE, FALSE, 0); |
| 193 // Insert as the leftmost item. | 193 // Insert as the leftmost item. |
| 194 gtk_box_reorder_child(GTK_BOX(shelf_hbox), hbox_.get(), 0); | 194 gtk_box_reorder_child(GTK_BOX(shelf_hbox), hbox_.get(), 0); |
| 195 | 195 |
| 196 get_download()->AddObserver(this); | 196 download()->AddObserver(this); |
| 197 | 197 |
| 198 new_item_animation_.reset(new ui::SlideAnimation(this)); | 198 new_item_animation_.reset(new ui::SlideAnimation(this)); |
| 199 new_item_animation_->SetSlideDuration(kNewItemAnimationDurationMs); | 199 new_item_animation_->SetSlideDuration(kNewItemAnimationDurationMs); |
| 200 gtk_widget_show_all(hbox_.get()); | 200 gtk_widget_show_all(hbox_.get()); |
| 201 | 201 |
| 202 if (download_model_->IsDangerous()) { | 202 if (download_model_.IsDangerous()) { |
| 203 // Hide the download item components for now. | 203 // Hide the download item components for now. |
| 204 gtk_widget_set_no_show_all(body_.get(), TRUE); | 204 gtk_widget_set_no_show_all(body_.get(), TRUE); |
| 205 gtk_widget_set_no_show_all(menu_button_, TRUE); | 205 gtk_widget_set_no_show_all(menu_button_, TRUE); |
| 206 gtk_widget_hide(body_.get()); | 206 gtk_widget_hide(body_.get()); |
| 207 gtk_widget_hide(menu_button_); | 207 gtk_widget_hide(menu_button_); |
| 208 | 208 |
| 209 // Create an hbox to hold it all. | 209 // Create an hbox to hold it all. |
| 210 dangerous_hbox_.Own(gtk_hbox_new(FALSE, kDangerousElementPadding)); | 210 dangerous_hbox_.Own(gtk_hbox_new(FALSE, kDangerousElementPadding)); |
| 211 | 211 |
| 212 // Add padding at the beginning and end. The hbox will add padding between | 212 // Add padding at the beginning and end. The hbox will add padding between |
| (...skipping 19 matching lines...) Expand all Loading... |
| 232 // Create the nevermind button. | 232 // Create the nevermind button. |
| 233 GtkWidget* dangerous_decline = gtk_button_new_with_label( | 233 GtkWidget* dangerous_decline = gtk_button_new_with_label( |
| 234 l10n_util::GetStringUTF8(IDS_DISCARD_DOWNLOAD).c_str()); | 234 l10n_util::GetStringUTF8(IDS_DISCARD_DOWNLOAD).c_str()); |
| 235 g_signal_connect(dangerous_decline, "clicked", | 235 g_signal_connect(dangerous_decline, "clicked", |
| 236 G_CALLBACK(OnDangerousDeclineThunk), this); | 236 G_CALLBACK(OnDangerousDeclineThunk), this); |
| 237 gtk_util::CenterWidgetInHBox(dangerous_hbox_.get(), dangerous_decline, | 237 gtk_util::CenterWidgetInHBox(dangerous_hbox_.get(), dangerous_decline, |
| 238 false, 0); | 238 false, 0); |
| 239 | 239 |
| 240 // Create the ok button. | 240 // Create the ok button. |
| 241 GtkWidget* dangerous_accept = gtk_button_new_with_label( | 241 GtkWidget* dangerous_accept = gtk_button_new_with_label( |
| 242 UTF16ToUTF8(download_model_->GetWarningConfirmButtonText()).c_str()); | 242 UTF16ToUTF8(download_model_.GetWarningConfirmButtonText()).c_str()); |
| 243 g_signal_connect(dangerous_accept, "clicked", | 243 g_signal_connect(dangerous_accept, "clicked", |
| 244 G_CALLBACK(OnDangerousAcceptThunk), this); | 244 G_CALLBACK(OnDangerousAcceptThunk), this); |
| 245 gtk_util::CenterWidgetInHBox(dangerous_hbox_.get(), dangerous_accept, false, | 245 gtk_util::CenterWidgetInHBox(dangerous_hbox_.get(), dangerous_accept, false, |
| 246 0); | 246 0); |
| 247 | 247 |
| 248 // Put it in an alignment so that padding will be added on the left and | 248 // Put it in an alignment so that padding will be added on the left and |
| 249 // right. | 249 // right. |
| 250 dangerous_prompt_ = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); | 250 dangerous_prompt_ = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); |
| 251 gtk_alignment_set_padding(GTK_ALIGNMENT(dangerous_prompt_), | 251 gtk_alignment_set_padding(GTK_ALIGNMENT(dangerous_prompt_), |
| 252 0, 0, kDangerousElementPadding, kDangerousElementPadding); | 252 0, 0, kDangerousElementPadding, kDangerousElementPadding); |
| 253 gtk_container_add(GTK_CONTAINER(dangerous_prompt_), dangerous_hbox_.get()); | 253 gtk_container_add(GTK_CONTAINER(dangerous_prompt_), dangerous_hbox_.get()); |
| 254 gtk_box_pack_start(GTK_BOX(hbox_.get()), dangerous_prompt_, FALSE, FALSE, | 254 gtk_box_pack_start(GTK_BOX(hbox_.get()), dangerous_prompt_, FALSE, FALSE, |
| 255 0); | 255 0); |
| 256 gtk_widget_set_app_paintable(dangerous_prompt_, TRUE); | 256 gtk_widget_set_app_paintable(dangerous_prompt_, TRUE); |
| 257 gtk_widget_set_redraw_on_allocate(dangerous_prompt_, TRUE); | 257 gtk_widget_set_redraw_on_allocate(dangerous_prompt_, TRUE); |
| 258 g_signal_connect(dangerous_prompt_, "expose-event", | 258 g_signal_connect(dangerous_prompt_, "expose-event", |
| 259 G_CALLBACK(OnDangerousPromptExposeThunk), this); | 259 G_CALLBACK(OnDangerousPromptExposeThunk), this); |
| 260 gtk_widget_show_all(dangerous_prompt_); | 260 gtk_widget_show_all(dangerous_prompt_); |
| 261 } | 261 } |
| 262 | 262 |
| 263 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, | 263 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, |
| 264 content::Source<ThemeService>(theme_service_)); | 264 content::Source<ThemeService>(theme_service_)); |
| 265 theme_service_->InitThemesFor(this); | 265 theme_service_->InitThemesFor(this); |
| 266 | 266 |
| 267 // Set the initial width of the widget to be animated. | 267 // Set the initial width of the widget to be animated. |
| 268 if (download_model_->IsDangerous()) { | 268 if (download_model_.IsDangerous()) { |
| 269 gtk_widget_set_size_request(dangerous_hbox_.get(), | 269 gtk_widget_set_size_request(dangerous_hbox_.get(), |
| 270 dangerous_hbox_start_width_, -1); | 270 dangerous_hbox_start_width_, -1); |
| 271 } else { | 271 } else { |
| 272 gtk_widget_set_size_request(body_.get(), kMinDownloadItemWidth, -1); | 272 gtk_widget_set_size_request(body_.get(), kMinDownloadItemWidth, -1); |
| 273 } | 273 } |
| 274 | 274 |
| 275 new_item_animation_->Show(); | 275 new_item_animation_->Show(); |
| 276 | 276 |
| 277 complete_animation_.SetTweenType(ui::Tween::LINEAR); | 277 complete_animation_.SetTweenType(ui::Tween::LINEAR); |
| 278 complete_animation_.SetSlideDuration(kCompleteAnimationDurationMs); | 278 complete_animation_.SetSlideDuration(kCompleteAnimationDurationMs); |
| 279 | 279 |
| 280 // Update the status text and animation state. | 280 // Update the status text and animation state. |
| 281 OnDownloadUpdated(get_download()); | 281 OnDownloadUpdated(download()); |
| 282 } | 282 } |
| 283 | 283 |
| 284 DownloadItemGtk::~DownloadItemGtk() { | 284 DownloadItemGtk::~DownloadItemGtk() { |
| 285 // First close the menu and then destroy the GtkWidgets. Bug#97724 | 285 // First close the menu and then destroy the GtkWidgets. Bug#97724 |
| 286 if (menu_.get()) | 286 if (menu_.get()) |
| 287 menu_.reset(); | 287 menu_.reset(); |
| 288 | 288 |
| 289 StopDownloadProgress(); | 289 StopDownloadProgress(); |
| 290 get_download()->RemoveObserver(this); | 290 download()->RemoveObserver(this); |
| 291 | 291 |
| 292 // We may free some shelf space for showing more download items. | 292 // We may free some shelf space for showing more download items. |
| 293 parent_shelf_->MaybeShowMoreDownloadItems(); | 293 parent_shelf_->MaybeShowMoreDownloadItems(); |
| 294 | 294 |
| 295 hbox_.Destroy(); | 295 hbox_.Destroy(); |
| 296 progress_area_.Destroy(); | 296 progress_area_.Destroy(); |
| 297 body_.Destroy(); | 297 body_.Destroy(); |
| 298 dangerous_hbox_.Destroy(); | 298 dangerous_hbox_.Destroy(); |
| 299 | 299 |
| 300 // Make sure this widget has been destroyed and the pointer we hold to it | 300 // Make sure this widget has been destroyed and the pointer we hold to it |
| 301 // NULLed. | 301 // NULLed. |
| 302 DCHECK(!status_label_); | 302 DCHECK(!status_label_); |
| 303 } | 303 } |
| 304 | 304 |
| 305 void DownloadItemGtk::OnDownloadUpdated(DownloadItem* download) { | 305 void DownloadItemGtk::OnDownloadUpdated(DownloadItem* download_item) { |
| 306 DCHECK_EQ(download, get_download()); | 306 DCHECK_EQ(download(), download_item); |
| 307 | 307 |
| 308 if (dangerous_prompt_ != NULL && !download_model_->IsDangerous()) { | 308 if (dangerous_prompt_ != NULL && !download_model_.IsDangerous()) { |
| 309 // We have been approved. | 309 // We have been approved. |
| 310 gtk_widget_set_no_show_all(body_.get(), FALSE); | 310 gtk_widget_set_no_show_all(body_.get(), FALSE); |
| 311 gtk_widget_set_no_show_all(menu_button_, FALSE); | 311 gtk_widget_set_no_show_all(menu_button_, FALSE); |
| 312 gtk_widget_show_all(hbox_.get()); | 312 gtk_widget_show_all(hbox_.get()); |
| 313 gtk_widget_destroy(dangerous_prompt_); | 313 gtk_widget_destroy(dangerous_prompt_); |
| 314 gtk_widget_set_size_request(body_.get(), kBodyWidth, -1); | 314 gtk_widget_set_size_request(body_.get(), kBodyWidth, -1); |
| 315 dangerous_prompt_ = NULL; | 315 dangerous_prompt_ = NULL; |
| 316 | 316 |
| 317 // We may free some shelf space for showing more download items. | 317 // We may free some shelf space for showing more download items. |
| 318 parent_shelf_->MaybeShowMoreDownloadItems(); | 318 parent_shelf_->MaybeShowMoreDownloadItems(); |
| 319 } | 319 } |
| 320 | 320 |
| 321 if (download->GetUserVerifiedFilePath() != icon_filepath_) { | 321 if (download()->GetUserVerifiedFilePath() != icon_filepath_) { |
| 322 // Turns out the file path is "Unconfirmed %d.crdownload" for dangerous | 322 // Turns out the file path is "Unconfirmed %d.crdownload" for dangerous |
| 323 // downloads. When the download is confirmed, the file is renamed on | 323 // downloads. When the download is confirmed, the file is renamed on |
| 324 // another thread, so reload the icon if the download filename changes. | 324 // another thread, so reload the icon if the download filename changes. |
| 325 LoadIcon(); | 325 LoadIcon(); |
| 326 | 326 |
| 327 UpdateTooltip(); | 327 UpdateTooltip(); |
| 328 } | 328 } |
| 329 | 329 |
| 330 switch (download->GetState()) { | 330 switch (download()->GetState()) { |
| 331 case DownloadItem::CANCELLED: | 331 case DownloadItem::CANCELLED: |
| 332 StopDownloadProgress(); | 332 StopDownloadProgress(); |
| 333 gtk_widget_queue_draw(progress_area_.get()); | 333 gtk_widget_queue_draw(progress_area_.get()); |
| 334 break; | 334 break; |
| 335 case DownloadItem::INTERRUPTED: | 335 case DownloadItem::INTERRUPTED: |
| 336 StopDownloadProgress(); | 336 StopDownloadProgress(); |
| 337 UpdateTooltip(); | 337 UpdateTooltip(); |
| 338 | 338 |
| 339 complete_animation_.Show(); | 339 complete_animation_.Show(); |
| 340 break; | 340 break; |
| 341 case DownloadItem::COMPLETE: | 341 case DownloadItem::COMPLETE: |
| 342 // GetAutoOpened() may change after the download's initial transition to | 342 // GetAutoOpened() may change after the download's initial transition to |
| 343 // COMPLETE, so we check it before the idemopotency shield below. | 343 // COMPLETE, so we check it before the idemopotency shield below. |
| 344 if (download->GetAutoOpened()) { | 344 if (download()->GetAutoOpened()) { |
| 345 parent_shelf_->RemoveDownloadItem(this); // This will delete us! | 345 parent_shelf_->RemoveDownloadItem(this); // This will delete us! |
| 346 return; | 346 return; |
| 347 } | 347 } |
| 348 | 348 |
| 349 // We've already handled the completion specific actions; skip | 349 // We've already handled the completion specific actions; skip |
| 350 // doing the non-idempotent ones again. | 350 // doing the non-idempotent ones again. |
| 351 if (download_complete_) | 351 if (download_complete_) |
| 352 break; | 352 break; |
| 353 | 353 |
| 354 StopDownloadProgress(); | 354 StopDownloadProgress(); |
| 355 | 355 |
| 356 // Set up the widget as a drag source. | 356 // Set up the widget as a drag source. |
| 357 DownloadItemDrag::SetSource(body_.get(), get_download(), icon_large_); | 357 DownloadItemDrag::SetSource(body_.get(), download(), icon_large_); |
| 358 | 358 |
| 359 complete_animation_.Show(); | 359 complete_animation_.Show(); |
| 360 download_complete_ = true; | 360 download_complete_ = true; |
| 361 break; | 361 break; |
| 362 case DownloadItem::IN_PROGRESS: | 362 case DownloadItem::IN_PROGRESS: |
| 363 get_download()->IsPaused() ? | 363 download()->IsPaused() ? |
| 364 StopDownloadProgress() : StartDownloadProgress(); | 364 StopDownloadProgress() : StartDownloadProgress(); |
| 365 break; | 365 break; |
| 366 default: | 366 default: |
| 367 NOTREACHED(); | 367 NOTREACHED(); |
| 368 } | 368 } |
| 369 | 369 |
| 370 status_text_ = UTF16ToUTF8(download_model_->GetStatusText()); | 370 status_text_ = UTF16ToUTF8(download_model_.GetStatusText()); |
| 371 UpdateStatusLabel(status_text_); | 371 UpdateStatusLabel(status_text_); |
| 372 } | 372 } |
| 373 | 373 |
| 374 void DownloadItemGtk::OnDownloadDestroyed(DownloadItem* download) { | 374 void DownloadItemGtk::OnDownloadDestroyed(DownloadItem* download_item) { |
| 375 DCHECK_EQ(download(), download_item); |
| 375 parent_shelf_->RemoveDownloadItem(this); | 376 parent_shelf_->RemoveDownloadItem(this); |
| 376 // This will delete us! | 377 // This will delete us! |
| 377 } | 378 } |
| 378 | 379 |
| 379 void DownloadItemGtk::AnimationProgressed(const ui::Animation* animation) { | 380 void DownloadItemGtk::AnimationProgressed(const ui::Animation* animation) { |
| 380 if (animation == &complete_animation_) { | 381 if (animation == &complete_animation_) { |
| 381 gtk_widget_queue_draw(progress_area_.get()); | 382 gtk_widget_queue_draw(progress_area_.get()); |
| 382 } else { | 383 } else { |
| 383 DCHECK(animation == new_item_animation_.get()); | 384 DCHECK(animation == new_item_animation_.get()); |
| 384 if (download_model_->IsDangerous()) { | 385 if (download_model_.IsDangerous()) { |
| 385 int progress = static_cast<int>((dangerous_hbox_full_width_ - | 386 int progress = static_cast<int>((dangerous_hbox_full_width_ - |
| 386 dangerous_hbox_start_width_) * | 387 dangerous_hbox_start_width_) * |
| 387 animation->GetCurrentValue()); | 388 animation->GetCurrentValue()); |
| 388 int showing_width = dangerous_hbox_start_width_ + progress; | 389 int showing_width = dangerous_hbox_start_width_ + progress; |
| 389 gtk_widget_set_size_request(dangerous_hbox_.get(), showing_width, -1); | 390 gtk_widget_set_size_request(dangerous_hbox_.get(), showing_width, -1); |
| 390 } else { | 391 } else { |
| 391 int showing_width = std::max(kMinDownloadItemWidth, | 392 int showing_width = std::max(kMinDownloadItemWidth, |
| 392 static_cast<int>(kBodyWidth * animation->GetCurrentValue())); | 393 static_cast<int>(kBodyWidth * animation->GetCurrentValue())); |
| 393 gtk_widget_set_size_request(body_.get(), showing_width, -1); | 394 gtk_widget_set_size_request(body_.get(), showing_width, -1); |
| 394 } | 395 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 420 if (arrow_) | 421 if (arrow_) |
| 421 gtk_widget_hide(arrow_); | 422 gtk_widget_hide(arrow_); |
| 422 } | 423 } |
| 423 | 424 |
| 424 UpdateNameLabel(); | 425 UpdateNameLabel(); |
| 425 UpdateStatusLabel(status_text_); | 426 UpdateStatusLabel(status_text_); |
| 426 UpdateDangerWarning(); | 427 UpdateDangerWarning(); |
| 427 } | 428 } |
| 428 } | 429 } |
| 429 | 430 |
| 430 DownloadItem* DownloadItemGtk::get_download() { | |
| 431 return download_model_->download(); | |
| 432 } | |
| 433 | |
| 434 // Download progress animation functions. | 431 // Download progress animation functions. |
| 435 | 432 |
| 436 void DownloadItemGtk::UpdateDownloadProgress() { | 433 void DownloadItemGtk::UpdateDownloadProgress() { |
| 437 progress_angle_ = (progress_angle_ + | 434 progress_angle_ = (progress_angle_ + |
| 438 download_util::kUnknownIncrementDegrees) % | 435 download_util::kUnknownIncrementDegrees) % |
| 439 download_util::kMaxDegrees; | 436 download_util::kMaxDegrees; |
| 440 gtk_widget_queue_draw(progress_area_.get()); | 437 gtk_widget_queue_draw(progress_area_.get()); |
| 441 } | 438 } |
| 442 | 439 |
| 443 void DownloadItemGtk::StartDownloadProgress() { | 440 void DownloadItemGtk::StartDownloadProgress() { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 454 | 451 |
| 455 // Icon loading functions. | 452 // Icon loading functions. |
| 456 | 453 |
| 457 void DownloadItemGtk::OnLoadSmallIconComplete(gfx::Image* image) { | 454 void DownloadItemGtk::OnLoadSmallIconComplete(gfx::Image* image) { |
| 458 icon_small_ = image; | 455 icon_small_ = image; |
| 459 gtk_widget_queue_draw(progress_area_.get()); | 456 gtk_widget_queue_draw(progress_area_.get()); |
| 460 } | 457 } |
| 461 | 458 |
| 462 void DownloadItemGtk::OnLoadLargeIconComplete(gfx::Image* image) { | 459 void DownloadItemGtk::OnLoadLargeIconComplete(gfx::Image* image) { |
| 463 icon_large_ = image; | 460 icon_large_ = image; |
| 464 DownloadItemDrag::SetSource(body_.get(), get_download(), icon_large_); | 461 DownloadItemDrag::SetSource(body_.get(), download(), icon_large_); |
| 465 } | 462 } |
| 466 | 463 |
| 467 void DownloadItemGtk::LoadIcon() { | 464 void DownloadItemGtk::LoadIcon() { |
| 468 cancelable_task_tracker_.TryCancelAll(); | 465 cancelable_task_tracker_.TryCancelAll(); |
| 469 IconManager* im = g_browser_process->icon_manager(); | 466 IconManager* im = g_browser_process->icon_manager(); |
| 470 icon_filepath_ = get_download()->GetUserVerifiedFilePath(); | 467 icon_filepath_ = download()->GetUserVerifiedFilePath(); |
| 471 im->LoadIcon(icon_filepath_, | 468 im->LoadIcon(icon_filepath_, |
| 472 IconLoader::SMALL, | 469 IconLoader::SMALL, |
| 473 base::Bind(&DownloadItemGtk::OnLoadSmallIconComplete, | 470 base::Bind(&DownloadItemGtk::OnLoadSmallIconComplete, |
| 474 base::Unretained(this)), | 471 base::Unretained(this)), |
| 475 &cancelable_task_tracker_); | 472 &cancelable_task_tracker_); |
| 476 im->LoadIcon(icon_filepath_, | 473 im->LoadIcon(icon_filepath_, |
| 477 IconLoader::LARGE, | 474 IconLoader::LARGE, |
| 478 base::Bind(&DownloadItemGtk::OnLoadLargeIconComplete, | 475 base::Bind(&DownloadItemGtk::OnLoadLargeIconComplete, |
| 479 base::Unretained(this)), | 476 base::Unretained(this)), |
| 480 &cancelable_task_tracker_); | 477 &cancelable_task_tracker_); |
| 481 } | 478 } |
| 482 | 479 |
| 483 void DownloadItemGtk::UpdateTooltip() { | 480 void DownloadItemGtk::UpdateTooltip() { |
| 484 string16 tooltip_text = | 481 string16 tooltip_text = |
| 485 download_model_->GetTooltipText(gfx::Font(), kTooltipMaxWidth); | 482 download_model_.GetTooltipText(gfx::Font(), kTooltipMaxWidth); |
| 486 gtk_widget_set_tooltip_text(body_.get(), UTF16ToUTF8(tooltip_text).c_str()); | 483 gtk_widget_set_tooltip_text(body_.get(), UTF16ToUTF8(tooltip_text).c_str()); |
| 487 } | 484 } |
| 488 | 485 |
| 489 void DownloadItemGtk::UpdateNameLabel() { | 486 void DownloadItemGtk::UpdateNameLabel() { |
| 490 // TODO(estade): This is at best an educated guess, since we don't actually | 487 // TODO(estade): This is at best an educated guess, since we don't actually |
| 491 // use gfx::Font() to draw the text. This is why we need to add so | 488 // use gfx::Font() to draw the text. This is why we need to add so |
| 492 // much padding when we set the size request. We need to either use gfx::Font | 489 // much padding when we set the size request. We need to either use gfx::Font |
| 493 // or somehow extend TextElider. | 490 // or somehow extend TextElider. |
| 494 gfx::Font font = gfx::Font(); | 491 gfx::Font font = gfx::Font(); |
| 495 string16 filename; | 492 string16 filename; |
| 496 if (!disabled_while_opening_) { | 493 if (!disabled_while_opening_) { |
| 497 filename = ui::ElideFilename( | 494 filename = ui::ElideFilename( |
| 498 get_download()->GetFileNameToReportUser(), font, kTextWidth); | 495 download()->GetFileNameToReportUser(), font, kTextWidth); |
| 499 } else { | 496 } else { |
| 500 // First, Calculate the download status opening string width. | 497 // First, Calculate the download status opening string width. |
| 501 string16 status_string = | 498 string16 status_string = |
| 502 l10n_util::GetStringFUTF16(IDS_DOWNLOAD_STATUS_OPENING, string16()); | 499 l10n_util::GetStringFUTF16(IDS_DOWNLOAD_STATUS_OPENING, string16()); |
| 503 int status_string_width = font.GetStringWidth(status_string); | 500 int status_string_width = font.GetStringWidth(status_string); |
| 504 // Then, elide the file name. | 501 // Then, elide the file name. |
| 505 string16 filename_string = | 502 string16 filename_string = |
| 506 ui::ElideFilename(get_download()->GetFileNameToReportUser(), font, | 503 ui::ElideFilename(download()->GetFileNameToReportUser(), font, |
| 507 kTextWidth - status_string_width); | 504 kTextWidth - status_string_width); |
| 508 // Last, concat the whole string. | 505 // Last, concat the whole string. |
| 509 filename = l10n_util::GetStringFUTF16(IDS_DOWNLOAD_STATUS_OPENING, | 506 filename = l10n_util::GetStringFUTF16(IDS_DOWNLOAD_STATUS_OPENING, |
| 510 filename_string); | 507 filename_string); |
| 511 } | 508 } |
| 512 | 509 |
| 513 GdkColor color = theme_service_->GetGdkColor( | 510 GdkColor color = theme_service_->GetGdkColor( |
| 514 ThemeService::COLOR_BOOKMARK_TEXT); | 511 ThemeService::COLOR_BOOKMARK_TEXT); |
| 515 gtk_util::SetLabelColor( | 512 gtk_util::SetLabelColor( |
| 516 name_label_, | 513 name_label_, |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 575 gtk_label_set_text(GTK_LABEL(status_label_), status_text.c_str()); | 572 gtk_label_set_text(GTK_LABEL(status_label_), status_text.c_str()); |
| 576 } | 573 } |
| 577 | 574 |
| 578 void DownloadItemGtk::UpdateDangerWarning() { | 575 void DownloadItemGtk::UpdateDangerWarning() { |
| 579 if (dangerous_prompt_) { | 576 if (dangerous_prompt_) { |
| 580 UpdateDangerIcon(); | 577 UpdateDangerIcon(); |
| 581 | 578 |
| 582 // We create |dangerous_warning| as a wide string so we can more easily | 579 // We create |dangerous_warning| as a wide string so we can more easily |
| 583 // calculate its length in characters. | 580 // calculate its length in characters. |
| 584 string16 dangerous_warning = | 581 string16 dangerous_warning = |
| 585 download_model_->GetWarningText(gfx::Font(), kTextWidth); | 582 download_model_.GetWarningText(gfx::Font(), kTextWidth); |
| 586 if (theme_service_->UsingNativeTheme()) { | 583 if (theme_service_->UsingNativeTheme()) { |
| 587 gtk_util::SetLabelColor(dangerous_label_, NULL); | 584 gtk_util::SetLabelColor(dangerous_label_, NULL); |
| 588 } else { | 585 } else { |
| 589 GdkColor color = theme_service_->GetGdkColor( | 586 GdkColor color = theme_service_->GetGdkColor( |
| 590 ThemeService::COLOR_BOOKMARK_TEXT); | 587 ThemeService::COLOR_BOOKMARK_TEXT); |
| 591 gtk_util::SetLabelColor(dangerous_label_, &color); | 588 gtk_util::SetLabelColor(dangerous_label_, &color); |
| 592 } | 589 } |
| 593 | 590 |
| 594 gtk_label_set_text(GTK_LABEL(dangerous_label_), | 591 gtk_label_set_text(GTK_LABEL(dangerous_label_), |
| 595 UTF16ToUTF8(dangerous_warning).c_str()); | 592 UTF16ToUTF8(dangerous_warning).c_str()); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 622 // The width will depend on the text. We must do this each time we possibly | 619 // The width will depend on the text. We must do this each time we possibly |
| 623 // change the label above. | 620 // change the label above. |
| 624 gtk_widget_size_request(dangerous_hbox_.get(), &req); | 621 gtk_widget_size_request(dangerous_hbox_.get(), &req); |
| 625 dangerous_hbox_full_width_ = req.width; | 622 dangerous_hbox_full_width_ = req.width; |
| 626 dangerous_hbox_start_width_ = dangerous_hbox_full_width_ - label_width; | 623 dangerous_hbox_start_width_ = dangerous_hbox_full_width_ - label_width; |
| 627 } | 624 } |
| 628 } | 625 } |
| 629 | 626 |
| 630 void DownloadItemGtk::UpdateDangerIcon() { | 627 void DownloadItemGtk::UpdateDangerIcon() { |
| 631 if (theme_service_->UsingNativeTheme()) { | 628 if (theme_service_->UsingNativeTheme()) { |
| 632 const char* stock = download_model_->IsMalicious() ? | 629 const char* stock = download_model_.IsMalicious() ? |
| 633 GTK_STOCK_DIALOG_ERROR : GTK_STOCK_DIALOG_WARNING; | 630 GTK_STOCK_DIALOG_ERROR : GTK_STOCK_DIALOG_WARNING; |
| 634 gtk_image_set_from_stock( | 631 gtk_image_set_from_stock( |
| 635 GTK_IMAGE(dangerous_image_), stock, GTK_ICON_SIZE_SMALL_TOOLBAR); | 632 GTK_IMAGE(dangerous_image_), stock, GTK_ICON_SIZE_SMALL_TOOLBAR); |
| 636 } else { | 633 } else { |
| 637 // Set the warning icon. | 634 // Set the warning icon. |
| 638 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 635 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| 639 int pixbuf_id = download_model_->IsMalicious() ? IDR_SAFEBROWSING_WARNING | 636 int pixbuf_id = download_model_.IsMalicious() ? IDR_SAFEBROWSING_WARNING |
| 640 : IDR_WARNING; | 637 : IDR_WARNING; |
| 641 gtk_image_set_from_pixbuf(GTK_IMAGE(dangerous_image_), | 638 gtk_image_set_from_pixbuf(GTK_IMAGE(dangerous_image_), |
| 642 rb.GetNativeImageNamed(pixbuf_id).ToGdkPixbuf()); | 639 rb.GetNativeImageNamed(pixbuf_id).ToGdkPixbuf()); |
| 643 } | 640 } |
| 644 } | 641 } |
| 645 | 642 |
| 646 // static | 643 // static |
| 647 void DownloadItemGtk::InitNineBoxes() { | 644 void DownloadItemGtk::InitNineBoxes() { |
| 648 if (body_nine_box_normal_) | 645 if (body_nine_box_normal_) |
| 649 return; | 646 return; |
| 650 | 647 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 712 TRACE_EVENT0("ui::gtk", "DownloadItemGtk::OnHboxExpose"); | 709 TRACE_EVENT0("ui::gtk", "DownloadItemGtk::OnHboxExpose"); |
| 713 if (theme_service_->UsingNativeTheme()) { | 710 if (theme_service_->UsingNativeTheme()) { |
| 714 GtkAllocation allocation; | 711 GtkAllocation allocation; |
| 715 gtk_widget_get_allocation(widget, &allocation); | 712 gtk_widget_get_allocation(widget, &allocation); |
| 716 int border_width = gtk_container_get_border_width(GTK_CONTAINER(widget)); | 713 int border_width = gtk_container_get_border_width(GTK_CONTAINER(widget)); |
| 717 int x = allocation.x + border_width; | 714 int x = allocation.x + border_width; |
| 718 int y = allocation.y + border_width; | 715 int y = allocation.y + border_width; |
| 719 int width = allocation.width - border_width * 2; | 716 int width = allocation.width - border_width * 2; |
| 720 int height = allocation.height - border_width * 2; | 717 int height = allocation.height - border_width * 2; |
| 721 | 718 |
| 722 if (download_model_->IsDangerous()) { | 719 if (download_model_.IsDangerous()) { |
| 723 // Draw a simple frame around the area when we're displaying the warning. | 720 // Draw a simple frame around the area when we're displaying the warning. |
| 724 gtk_paint_shadow(gtk_widget_get_style(widget), | 721 gtk_paint_shadow(gtk_widget_get_style(widget), |
| 725 gtk_widget_get_window(widget), | 722 gtk_widget_get_window(widget), |
| 726 gtk_widget_get_state(widget), | 723 gtk_widget_get_state(widget), |
| 727 static_cast<GtkShadowType>(GTK_SHADOW_OUT), | 724 static_cast<GtkShadowType>(GTK_SHADOW_OUT), |
| 728 &e->area, widget, "frame", | 725 &e->area, widget, "frame", |
| 729 x, y, width, height); | 726 x, y, width, height); |
| 730 } else { | 727 } else { |
| 731 // Manually draw the GTK button border around the download item. We draw | 728 // Manually draw the GTK button border around the download item. We draw |
| 732 // the left part of the button (the file), a divider, and then the right | 729 // the left part of the button (the file), a divider, and then the right |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 823 base::Bind(&DownloadItemGtk::ReenableHbox, | 820 base::Bind(&DownloadItemGtk::ReenableHbox, |
| 824 weak_ptr_factory_.GetWeakPtr()), | 821 weak_ptr_factory_.GetWeakPtr()), |
| 825 base::TimeDelta::FromMilliseconds(kDisabledOnOpenDurationMs)); | 822 base::TimeDelta::FromMilliseconds(kDisabledOnOpenDurationMs)); |
| 826 UpdateNameLabel(); | 823 UpdateNameLabel(); |
| 827 parent_shelf_->ItemOpened(); | 824 parent_shelf_->ItemOpened(); |
| 828 } | 825 } |
| 829 | 826 |
| 830 void DownloadItemGtk::OnClick(GtkWidget* widget) { | 827 void DownloadItemGtk::OnClick(GtkWidget* widget) { |
| 831 UMA_HISTOGRAM_LONG_TIMES("clickjacking.open_download", | 828 UMA_HISTOGRAM_LONG_TIMES("clickjacking.open_download", |
| 832 base::Time::Now() - creation_time_); | 829 base::Time::Now() - creation_time_); |
| 833 get_download()->OpenDownload(); | 830 download()->OpenDownload(); |
| 834 } | 831 } |
| 835 | 832 |
| 836 gboolean DownloadItemGtk::OnButtonPress(GtkWidget* button, | 833 gboolean DownloadItemGtk::OnButtonPress(GtkWidget* button, |
| 837 GdkEventButton* event) { | 834 GdkEventButton* event) { |
| 838 if (event->type == GDK_BUTTON_PRESS && event->button == 3) { | 835 if (event->type == GDK_BUTTON_PRESS && event->button == 3) { |
| 839 ShowPopupMenu(NULL, event); | 836 ShowPopupMenu(NULL, event); |
| 840 return TRUE; | 837 return TRUE; |
| 841 } | 838 } |
| 842 return FALSE; | 839 return FALSE; |
| 843 } | 840 } |
| 844 | 841 |
| 845 gboolean DownloadItemGtk::OnProgressAreaExpose(GtkWidget* widget, | 842 gboolean DownloadItemGtk::OnProgressAreaExpose(GtkWidget* widget, |
| 846 GdkEventExpose* event) { | 843 GdkEventExpose* event) { |
| 847 TRACE_EVENT0("ui::gtk", "DownloadItemGtk::OnProgressAreaExpose"); | 844 TRACE_EVENT0("ui::gtk", "DownloadItemGtk::OnProgressAreaExpose"); |
| 848 | 845 |
| 849 GtkAllocation allocation; | 846 GtkAllocation allocation; |
| 850 gtk_widget_get_allocation(widget, &allocation); | 847 gtk_widget_get_allocation(widget, &allocation); |
| 851 | 848 |
| 852 // Create a transparent canvas. | 849 // Create a transparent canvas. |
| 853 gfx::CanvasSkiaPaint canvas(event, false); | 850 gfx::CanvasSkiaPaint canvas(event, false); |
| 854 if (complete_animation_.is_animating()) { | 851 if (complete_animation_.is_animating()) { |
| 855 if (get_download()->IsInterrupted()) { | 852 if (download()->IsInterrupted()) { |
| 856 download_util::PaintDownloadInterrupted(&canvas, | 853 download_util::PaintDownloadInterrupted(&canvas, |
| 857 allocation.x, allocation.y, | 854 allocation.x, allocation.y, |
| 858 complete_animation_.GetCurrentValue(), | 855 complete_animation_.GetCurrentValue(), |
| 859 download_util::SMALL); | 856 download_util::SMALL); |
| 860 } else { | 857 } else { |
| 861 download_util::PaintDownloadComplete(&canvas, | 858 download_util::PaintDownloadComplete(&canvas, |
| 862 allocation.x, allocation.y, | 859 allocation.x, allocation.y, |
| 863 complete_animation_.GetCurrentValue(), | 860 complete_animation_.GetCurrentValue(), |
| 864 download_util::SMALL); | 861 download_util::SMALL); |
| 865 } | 862 } |
| 866 } else if (get_download()->IsInProgress()) { | 863 } else if (download()->IsInProgress()) { |
| 867 download_util::PaintDownloadProgress(&canvas, | 864 download_util::PaintDownloadProgress(&canvas, |
| 868 allocation.x, allocation.y, | 865 allocation.x, allocation.y, |
| 869 progress_angle_, | 866 progress_angle_, |
| 870 download_model_->PercentComplete(), | 867 download_model_.PercentComplete(), |
| 871 download_util::SMALL); | 868 download_util::SMALL); |
| 872 } | 869 } |
| 873 | 870 |
| 874 // |icon_small_| may be NULL if it is still loading. If the file is an | 871 // |icon_small_| may be NULL if it is still loading. If the file is an |
| 875 // unrecognized type then we will get back a generic system icon. Hence | 872 // unrecognized type then we will get back a generic system icon. Hence |
| 876 // there is no need to use the chromium-specific default download item icon. | 873 // there is no need to use the chromium-specific default download item icon. |
| 877 if (icon_small_) { | 874 if (icon_small_) { |
| 878 const int offset = download_util::kSmallProgressIconOffset; | 875 const int offset = download_util::kSmallProgressIconOffset; |
| 879 canvas.DrawImageInt(icon_small_->AsImageSkia(), | 876 canvas.DrawImageInt(icon_small_->AsImageSkia(), |
| 880 allocation.x + offset, allocation.y + offset); | 877 allocation.x + offset, allocation.y + offset); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 894 return FALSE; | 891 return FALSE; |
| 895 } | 892 } |
| 896 | 893 |
| 897 void DownloadItemGtk::ShowPopupMenu(GtkWidget* button, | 894 void DownloadItemGtk::ShowPopupMenu(GtkWidget* button, |
| 898 GdkEventButton* event) { | 895 GdkEventButton* event) { |
| 899 // Stop any completion animation. | 896 // Stop any completion animation. |
| 900 if (complete_animation_.is_animating()) | 897 if (complete_animation_.is_animating()) |
| 901 complete_animation_.End(); | 898 complete_animation_.End(); |
| 902 | 899 |
| 903 if (!menu_.get()) { | 900 if (!menu_.get()) { |
| 904 menu_.reset(new DownloadShelfContextMenuGtk(download_model_.get(), | 901 menu_.reset(new DownloadShelfContextMenuGtk(this, |
| 905 this, | |
| 906 parent_shelf_->GetNavigator())); | 902 parent_shelf_->GetNavigator())); |
| 907 } | 903 } |
| 908 menu_->Popup(button, event); | 904 menu_->Popup(button, event); |
| 909 } | 905 } |
| 910 | 906 |
| 911 gboolean DownloadItemGtk::OnDangerousPromptExpose(GtkWidget* widget, | 907 gboolean DownloadItemGtk::OnDangerousPromptExpose(GtkWidget* widget, |
| 912 GdkEventExpose* event) { | 908 GdkEventExpose* event) { |
| 913 TRACE_EVENT0("ui::gtk", "DownloadItemGtk::OnDangerousPromptExpose"); | 909 TRACE_EVENT0("ui::gtk", "DownloadItemGtk::OnDangerousPromptExpose"); |
| 914 if (!theme_service_->UsingNativeTheme()) { | 910 if (!theme_service_->UsingNativeTheme()) { |
| 915 // The hbox renderer will take care of the border when in GTK mode. | 911 // The hbox renderer will take care of the border when in GTK mode. |
| 916 dangerous_nine_box_->RenderToWidget(widget); | 912 dangerous_nine_box_->RenderToWidget(widget); |
| 917 } | 913 } |
| 918 return FALSE; // Continue propagation. | 914 return FALSE; // Continue propagation. |
| 919 } | 915 } |
| 920 | 916 |
| 921 void DownloadItemGtk::OnDangerousAccept(GtkWidget* button) { | 917 void DownloadItemGtk::OnDangerousAccept(GtkWidget* button) { |
| 922 UMA_HISTOGRAM_LONG_TIMES("clickjacking.save_download", | 918 UMA_HISTOGRAM_LONG_TIMES("clickjacking.save_download", |
| 923 base::Time::Now() - creation_time_); | 919 base::Time::Now() - creation_time_); |
| 924 get_download()->DangerousDownloadValidated(); | 920 download()->DangerousDownloadValidated(); |
| 925 } | 921 } |
| 926 | 922 |
| 927 void DownloadItemGtk::OnDangerousDecline(GtkWidget* button) { | 923 void DownloadItemGtk::OnDangerousDecline(GtkWidget* button) { |
| 928 UMA_HISTOGRAM_LONG_TIMES("clickjacking.discard_download", | 924 UMA_HISTOGRAM_LONG_TIMES("clickjacking.discard_download", |
| 929 base::Time::Now() - creation_time_); | 925 base::Time::Now() - creation_time_); |
| 930 if (get_download()->IsPartialDownload()) | 926 if (download()->IsPartialDownload()) |
| 931 get_download()->Cancel(true); | 927 download()->Cancel(true); |
| 932 get_download()->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD); | 928 download()->Delete(DownloadItem::DELETE_DUE_TO_USER_DISCARD); |
| 933 } | 929 } |
| OLD | NEW |