Index: chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.cc |
diff --git a/chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.cc b/chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a367ce4be5e41fd1aea8de8670c34af296ac0b27 |
--- /dev/null |
+++ b/chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.cc |
@@ -0,0 +1,163 @@ |
+// Copyright (c) 2012 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. |
+ |
+#include "chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.h" |
+ |
+#include "base/auto_reset.h" |
+#include "base/utf_string_conversions.h" |
+#include "chrome/browser/media_gallery/media_galleries_preferences.h" |
+#include "chrome/browser/ui/gtk/gtk_util.h" |
+#include "grit/generated_resources.h" |
+#include "ui/base/gtk/gtk_hig_constants.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+namespace chrome { |
+ |
+typedef MediaGalleriesDialogController::KnownGalleryPermissions |
+ GalleryPermissions; |
+ |
+MediaGalleriesDialogGtk::MediaGalleriesDialogGtk( |
+ MediaGalleriesDialogController* controller) |
+ : controller_(controller), |
+ window_(NULL), |
+ confirm_(NULL), |
+ checkbox_container_(NULL), |
+ ignore_toggles_(false), |
+ accepted_(false) { |
+ InitWidgets(); |
+ window_ = new ConstrainedWindowGtk(controller->tab_contents(), this); |
+} |
+ |
+void MediaGalleriesDialogGtk::InitWidgets() { |
+ contents_.Own(gtk_vbox_new(FALSE, ui::kContentAreaSpacing)); |
+ |
+ GtkWidget* header = |
+ gtk_util::CreateBoldLabel(UTF16ToUTF8(controller_->GetHeader())); |
+ gtk_box_pack_start(GTK_BOX(contents_.get()), header, FALSE, FALSE, 0); |
+ |
+ GtkWidget* subtext = |
+ gtk_label_new(UTF16ToUTF8(controller_->GetSubtext()).c_str()); |
+ gtk_label_set_line_wrap(GTK_LABEL(subtext), TRUE); |
+ gtk_widget_set_size_request(subtext, 500, -1); |
+ gtk_box_pack_start(GTK_BOX(contents_.get()), subtext, FALSE, FALSE, 0); |
+ |
+ checkbox_container_ = gtk_vbox_new(FALSE, 0); |
+ gtk_box_pack_start(GTK_BOX(contents_.get()), checkbox_container_, |
+ FALSE, FALSE, 0); |
+ |
+ // As a safeguard against the user skipping reading over the dialog and just |
+ // confirming, the button will be unavailable for dialogs without any checks |
+ // until the user toggles something. |
+ bool confirm_available = false; |
+ const GalleryPermissions& permissions = controller_->permissions(); |
+ for (GalleryPermissions::const_iterator iter = permissions.begin(); |
+ iter != permissions.end(); iter++) { |
+ confirm_available = confirm_available || iter->second.allowed; |
+ UpdateGallery(&iter->second.pref_info, iter->second.allowed); |
+ } |
+ |
+ // Holds the "add gallery" and cancel/confirm buttons. |
+ GtkWidget* bottom_area = gtk_hbox_new(FALSE, ui::kControlSpacing); |
+ gtk_box_pack_start(GTK_BOX(contents_.get()), bottom_area, FALSE, FALSE, 0); |
+ |
+ // Add gallery button. |
+ GtkWidget* add_folder = gtk_button_new_with_label( |
+ l10n_util::GetStringUTF8(IDS_MEDIA_GALLERIES_DIALOG_ADD_GALLERY).c_str()); |
+ g_signal_connect(add_folder, "clicked", G_CALLBACK(OnAddFolderThunk), this); |
+ gtk_box_pack_start(GTK_BOX(bottom_area), add_folder, FALSE, FALSE, 0); |
+ |
+ // Confirm/cancel button. |
+ confirm_ = gtk_button_new_with_label(l10n_util::GetStringUTF8( |
+ IDS_MEDIA_GALLERIES_DIALOG_CONFIRM).c_str()); |
+ gtk_button_set_image( |
+ GTK_BUTTON(confirm_), |
+ gtk_image_new_from_stock(GTK_STOCK_APPLY, GTK_ICON_SIZE_BUTTON)); |
+ g_signal_connect(confirm_, "clicked", G_CALLBACK(OnConfirmThunk), this); |
+ gtk_box_pack_end(GTK_BOX(bottom_area), confirm_, FALSE, FALSE, 0); |
+ |
+ GtkWidget* cancel = gtk_button_new_with_label(l10n_util::GetStringUTF8( |
+ IDS_MEDIA_GALLERIES_DIALOG_CANCEL).c_str()); |
+ gtk_button_set_image( |
+ GTK_BUTTON(cancel), |
+ gtk_image_new_from_stock(GTK_STOCK_CANCEL, GTK_ICON_SIZE_BUTTON)); |
+ g_signal_connect(cancel, "clicked", G_CALLBACK(OnCancelThunk), this); |
+ gtk_box_pack_end(GTK_BOX(bottom_area), cancel, FALSE, FALSE, 0); |
+ |
+ gtk_widget_set_sensitive(confirm_, confirm_available); |
+} |
+ |
+void MediaGalleriesDialogGtk::UpdateGallery( |
+ const MediaGalleryPrefInfo* gallery, |
+ bool permitted) { |
+ CheckboxMap::iterator iter = checkbox_map_.find(gallery); |
+ |
+ GtkWidget* widget = NULL; |
+ if (iter != checkbox_map_.end()) { |
+ widget = iter->second; |
+ } else { |
+ widget = gtk_check_button_new_with_label( |
+ UTF16ToUTF8(gallery->display_name).c_str()); |
+ g_signal_connect(widget, "toggled", G_CALLBACK(OnToggledThunk), this); |
+ gtk_box_pack_start(GTK_BOX(checkbox_container_), widget, FALSE, FALSE, 0); |
+ gtk_widget_show(widget); |
+ checkbox_map_[gallery] = widget; |
+ } |
+ |
+ AutoReset<bool> reset(&ignore_toggles_, true); |
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), permitted); |
+} |
+ |
+GtkWidget* MediaGalleriesDialogGtk::GetWidgetRoot() OVERRIDE { |
+ return contents_.get(); |
+} |
+ |
+GtkWidget* MediaGalleriesDialogGtk::GetFocusWidget() OVERRIDE { |
+ return confirm_; |
+} |
+ |
+void MediaGalleriesDialogGtk::DeleteDelegate() OVERRIDE { |
+ controller_->DialogFinished(accepted_); |
+} |
+ |
+void MediaGalleriesDialogGtk::OnToggled(GtkWidget* widget) OVERRIDE { |
+ gtk_widget_set_sensitive(confirm_, TRUE); |
+ |
+ if (ignore_toggles_) |
+ return; |
+ |
+ for (CheckboxMap::iterator iter = checkbox_map_.begin(); |
+ iter != checkbox_map_.end(); ++iter) { |
+ if (iter->second == widget) { |
+ controller_->GalleryToggled( |
+ iter->first, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); |
+ return; |
+ } |
+ } |
+ |
+ NOTREACHED(); |
+ return; |
+} |
+ |
+void MediaGalleriesDialogGtk::OnAddFolder(GtkWidget* widget) OVERRIDE { |
+ controller_->OnAddFolderClicked(); |
+} |
+ |
+void MediaGalleriesDialogGtk::OnConfirm(GtkWidget* widget) OVERRIDE { |
+ accepted_ = true; |
+ window_->CloseConstrainedWindow(); |
+} |
+ |
+void MediaGalleriesDialogGtk::OnCancel(GtkWidget* widget) OVERRIDE { |
+ window_->CloseConstrainedWindow(); |
+} |
+ |
+// MediaGalleriesDialogController ---------------------------------------------- |
+ |
+// static |
+MediaGalleriesDialog* MediaGalleriesDialog::Create( |
+ MediaGalleriesDialogController* controller) { |
+ return new MediaGalleriesDialogGtk(controller); |
+} |
+ |
+} // namespace chrome |