OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.h" |
| 6 |
| 7 #include "base/auto_reset.h" |
| 8 #include "base/utf_string_conversions.h" |
| 9 #include "chrome/browser/media_gallery/media_galleries_preferences.h" |
| 10 #include "chrome/browser/ui/gtk/gtk_util.h" |
| 11 #include "grit/generated_resources.h" |
| 12 #include "ui/base/gtk/gtk_hig_constants.h" |
| 13 #include "ui/base/l10n/l10n_util.h" |
| 14 |
| 15 namespace chrome { |
| 16 |
| 17 typedef MediaGalleriesDialogController::KnownGalleryPermissions |
| 18 GalleryPermissions; |
| 19 |
| 20 MediaGalleriesDialogGtk::MediaGalleriesDialogGtk( |
| 21 MediaGalleriesDialogController* controller) |
| 22 : controller_(controller), |
| 23 window_(NULL), |
| 24 confirm_(NULL), |
| 25 checkbox_container_(NULL), |
| 26 ignore_toggles_(false), |
| 27 accepted_(false) { |
| 28 InitWidgets(); |
| 29 window_ = new ConstrainedWindowGtk(controller->tab_contents(), this); |
| 30 } |
| 31 |
| 32 void MediaGalleriesDialogGtk::InitWidgets() { |
| 33 contents_.Own(gtk_vbox_new(FALSE, ui::kContentAreaSpacing)); |
| 34 |
| 35 GtkWidget* header = |
| 36 gtk_util::CreateBoldLabel(UTF16ToUTF8(controller_->GetHeader())); |
| 37 gtk_box_pack_start(GTK_BOX(contents_.get()), header, FALSE, FALSE, 0); |
| 38 |
| 39 GtkWidget* subtext = |
| 40 gtk_label_new(UTF16ToUTF8(controller_->GetSubtext()).c_str()); |
| 41 gtk_box_pack_start(GTK_BOX(contents_.get()), subtext, FALSE, FALSE, 0); |
| 42 |
| 43 checkbox_container_ = gtk_vbox_new(FALSE, 0); |
| 44 gtk_box_pack_start(GTK_BOX(contents_.get()), checkbox_container_, |
| 45 FALSE, FALSE, 0); |
| 46 |
| 47 // As a safeguard against the user skipping reading over the dialog and just |
| 48 // confirming, the button will be unavailable for dialogs without any checks |
| 49 // until the user toggles something. |
| 50 bool confirm_available = false; |
| 51 const GalleryPermissions& permissions = controller_->permissions(); |
| 52 for (GalleryPermissions::const_iterator iter = permissions.begin(); |
| 53 iter != permissions.end(); iter++) { |
| 54 confirm_available = confirm_available || iter->second.second; |
| 55 UpdateGallery(&iter->second.first, iter->second.second); |
| 56 } |
| 57 |
| 58 // Holds the "add gallery" and cancel/confirm buttons. |
| 59 GtkWidget* bottom_area = gtk_hbox_new(FALSE, ui::kControlSpacing); |
| 60 gtk_box_pack_start(GTK_BOX(contents_.get()), bottom_area, FALSE, FALSE, 0); |
| 61 |
| 62 // Add gallery button. |
| 63 GtkWidget* add_folder = gtk_button_new_with_label( |
| 64 l10n_util::GetStringUTF8(IDS_MEDIA_GALLERIES_DIALOG_ADD_GALLERY).c_str()); |
| 65 g_signal_connect(add_folder, "clicked", G_CALLBACK(OnAddFolderThunk), this); |
| 66 gtk_box_pack_start(GTK_BOX(bottom_area), add_folder, FALSE, FALSE, 0); |
| 67 |
| 68 // Confirm/cancel button box. |
| 69 GtkWidget* button_box = gtk_hbutton_box_new(); |
| 70 gtk_button_box_set_layout(GTK_BUTTON_BOX(button_box), GTK_BUTTONBOX_END); |
| 71 gtk_box_set_spacing(GTK_BOX(button_box), ui::kControlSpacing); |
| 72 gtk_box_pack_end(GTK_BOX(bottom_area), button_box, TRUE, TRUE, 0); |
| 73 |
| 74 GtkWidget* cancel = gtk_button_new_with_label(l10n_util::GetStringUTF8( |
| 75 IDS_MEDIA_GALLERIES_DIALOG_CANCEL).c_str()); |
| 76 gtk_button_set_image( |
| 77 GTK_BUTTON(cancel), |
| 78 gtk_image_new_from_stock(GTK_STOCK_CANCEL, GTK_ICON_SIZE_BUTTON)); |
| 79 g_signal_connect(cancel, "clicked", G_CALLBACK(OnCancelThunk), this); |
| 80 gtk_container_add(GTK_CONTAINER(button_box), cancel); |
| 81 |
| 82 confirm_ = gtk_button_new_with_label(l10n_util::GetStringUTF8( |
| 83 IDS_MEDIA_GALLERIES_DIALOG_CONFIRM).c_str()); |
| 84 gtk_button_set_image( |
| 85 GTK_BUTTON(confirm_), |
| 86 gtk_image_new_from_stock(GTK_STOCK_APPLY, GTK_ICON_SIZE_BUTTON)); |
| 87 g_signal_connect(confirm_, "clicked", G_CALLBACK(OnConfirmThunk), this); |
| 88 gtk_container_add(GTK_CONTAINER(button_box), confirm_); |
| 89 |
| 90 gtk_widget_set_sensitive(confirm_, confirm_available); |
| 91 } |
| 92 |
| 93 void MediaGalleriesDialogGtk::UpdateGallery( |
| 94 const MediaGalleryPrefInfo* gallery, |
| 95 bool permitted) { |
| 96 CheckboxMap::iterator iter = checkbox_map_.find(gallery); |
| 97 |
| 98 GtkWidget* widget = NULL; |
| 99 if (iter != checkbox_map_.end()) { |
| 100 widget = iter->second; |
| 101 } else { |
| 102 widget = gtk_check_button_new_with_label( |
| 103 UTF16ToUTF8(gallery->display_name).c_str()); |
| 104 g_signal_connect(widget, "toggled", G_CALLBACK(OnToggledThunk), this); |
| 105 gtk_box_pack_start(GTK_BOX(checkbox_container_), widget, FALSE, FALSE, 0); |
| 106 gtk_widget_show(widget); |
| 107 checkbox_map_[gallery] = widget; |
| 108 } |
| 109 |
| 110 AutoReset<bool> reset(&ignore_toggles_, true); |
| 111 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), permitted); |
| 112 } |
| 113 |
| 114 GtkWidget* MediaGalleriesDialogGtk::GetWidgetRoot() OVERRIDE { |
| 115 return contents_.get(); |
| 116 } |
| 117 |
| 118 GtkWidget* MediaGalleriesDialogGtk::GetFocusWidget() OVERRIDE { |
| 119 return confirm_; |
| 120 } |
| 121 |
| 122 void MediaGalleriesDialogGtk::DeleteDelegate() OVERRIDE { |
| 123 controller_->DialogFinished(accepted_); |
| 124 } |
| 125 |
| 126 void MediaGalleriesDialogGtk::OnToggled(GtkWidget* widget) OVERRIDE { |
| 127 if (ignore_toggles_) |
| 128 return; |
| 129 |
| 130 gtk_widget_set_sensitive(confirm_, TRUE); |
| 131 |
| 132 for (CheckboxMap::iterator iter = checkbox_map_.begin(); |
| 133 iter != checkbox_map_.end(); ++iter) { |
| 134 if (iter->second == widget) { |
| 135 controller_->GalleryToggled( |
| 136 iter->first, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); |
| 137 return; |
| 138 } |
| 139 } |
| 140 |
| 141 NOTREACHED(); |
| 142 return; |
| 143 } |
| 144 |
| 145 void MediaGalleriesDialogGtk::OnAddFolder(GtkWidget* widget) OVERRIDE { |
| 146 controller_->OnAddFolderClicked(); |
| 147 } |
| 148 |
| 149 void MediaGalleriesDialogGtk::OnConfirm(GtkWidget* widget) OVERRIDE { |
| 150 accepted_ = true; |
| 151 window_->CloseConstrainedWindow(); |
| 152 } |
| 153 |
| 154 void MediaGalleriesDialogGtk::OnCancel(GtkWidget* widget) OVERRIDE { |
| 155 window_->CloseConstrainedWindow(); |
| 156 } |
| 157 |
| 158 // MediaGalleriesDialogController ---------------------------------------------- |
| 159 |
| 160 // static |
| 161 MediaGalleriesDialog* MediaGalleriesDialog::Create( |
| 162 MediaGalleriesDialogController* controller) { |
| 163 return new MediaGalleriesDialogGtk(controller); |
| 164 } |
| 165 |
| 166 } // namespace chrome |
OLD | NEW |