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_label_set_line_wrap(GTK_LABEL(subtext), TRUE); |
| 42 gtk_widget_set_size_request(subtext, 500, -1); |
| 43 gtk_box_pack_start(GTK_BOX(contents_.get()), subtext, FALSE, FALSE, 0); |
| 44 |
| 45 checkbox_container_ = gtk_vbox_new(FALSE, 0); |
| 46 gtk_box_pack_start(GTK_BOX(contents_.get()), checkbox_container_, |
| 47 FALSE, FALSE, 0); |
| 48 |
| 49 // As a safeguard against the user skipping reading over the dialog and just |
| 50 // confirming, the button will be unavailable for dialogs without any checks |
| 51 // until the user toggles something. |
| 52 bool confirm_available = false; |
| 53 const GalleryPermissions& permissions = controller_->permissions(); |
| 54 for (GalleryPermissions::const_iterator iter = permissions.begin(); |
| 55 iter != permissions.end(); iter++) { |
| 56 confirm_available = confirm_available || iter->second.allowed; |
| 57 UpdateGallery(&iter->second.pref_info, iter->second.allowed); |
| 58 } |
| 59 |
| 60 // Holds the "add gallery" and cancel/confirm buttons. |
| 61 GtkWidget* bottom_area = gtk_hbox_new(FALSE, ui::kControlSpacing); |
| 62 gtk_box_pack_start(GTK_BOX(contents_.get()), bottom_area, FALSE, FALSE, 0); |
| 63 |
| 64 // Add gallery button. |
| 65 GtkWidget* add_folder = gtk_button_new_with_label( |
| 66 l10n_util::GetStringUTF8(IDS_MEDIA_GALLERIES_DIALOG_ADD_GALLERY).c_str()); |
| 67 g_signal_connect(add_folder, "clicked", G_CALLBACK(OnAddFolderThunk), this); |
| 68 gtk_box_pack_start(GTK_BOX(bottom_area), add_folder, FALSE, FALSE, 0); |
| 69 |
| 70 // Confirm/cancel button. |
| 71 confirm_ = gtk_button_new_with_label(l10n_util::GetStringUTF8( |
| 72 IDS_MEDIA_GALLERIES_DIALOG_CONFIRM).c_str()); |
| 73 gtk_button_set_image( |
| 74 GTK_BUTTON(confirm_), |
| 75 gtk_image_new_from_stock(GTK_STOCK_APPLY, GTK_ICON_SIZE_BUTTON)); |
| 76 g_signal_connect(confirm_, "clicked", G_CALLBACK(OnConfirmThunk), this); |
| 77 gtk_box_pack_end(GTK_BOX(bottom_area), confirm_, FALSE, FALSE, 0); |
| 78 |
| 79 GtkWidget* cancel = gtk_button_new_with_label(l10n_util::GetStringUTF8( |
| 80 IDS_MEDIA_GALLERIES_DIALOG_CANCEL).c_str()); |
| 81 gtk_button_set_image( |
| 82 GTK_BUTTON(cancel), |
| 83 gtk_image_new_from_stock(GTK_STOCK_CANCEL, GTK_ICON_SIZE_BUTTON)); |
| 84 g_signal_connect(cancel, "clicked", G_CALLBACK(OnCancelThunk), this); |
| 85 gtk_box_pack_end(GTK_BOX(bottom_area), cancel, FALSE, FALSE, 0); |
| 86 |
| 87 gtk_widget_set_sensitive(confirm_, confirm_available); |
| 88 } |
| 89 |
| 90 void MediaGalleriesDialogGtk::UpdateGallery( |
| 91 const MediaGalleryPrefInfo* gallery, |
| 92 bool permitted) { |
| 93 CheckboxMap::iterator iter = checkbox_map_.find(gallery); |
| 94 |
| 95 GtkWidget* widget = NULL; |
| 96 if (iter != checkbox_map_.end()) { |
| 97 widget = iter->second; |
| 98 } else { |
| 99 widget = gtk_check_button_new_with_label( |
| 100 UTF16ToUTF8(gallery->display_name).c_str()); |
| 101 g_signal_connect(widget, "toggled", G_CALLBACK(OnToggledThunk), this); |
| 102 gtk_box_pack_start(GTK_BOX(checkbox_container_), widget, FALSE, FALSE, 0); |
| 103 gtk_widget_show(widget); |
| 104 checkbox_map_[gallery] = widget; |
| 105 } |
| 106 |
| 107 AutoReset<bool> reset(&ignore_toggles_, true); |
| 108 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), permitted); |
| 109 } |
| 110 |
| 111 GtkWidget* MediaGalleriesDialogGtk::GetWidgetRoot() OVERRIDE { |
| 112 return contents_.get(); |
| 113 } |
| 114 |
| 115 GtkWidget* MediaGalleriesDialogGtk::GetFocusWidget() OVERRIDE { |
| 116 return confirm_; |
| 117 } |
| 118 |
| 119 void MediaGalleriesDialogGtk::DeleteDelegate() OVERRIDE { |
| 120 controller_->DialogFinished(accepted_); |
| 121 } |
| 122 |
| 123 void MediaGalleriesDialogGtk::OnToggled(GtkWidget* widget) OVERRIDE { |
| 124 gtk_widget_set_sensitive(confirm_, TRUE); |
| 125 |
| 126 if (ignore_toggles_) |
| 127 return; |
| 128 |
| 129 for (CheckboxMap::iterator iter = checkbox_map_.begin(); |
| 130 iter != checkbox_map_.end(); ++iter) { |
| 131 if (iter->second == widget) { |
| 132 controller_->GalleryToggled( |
| 133 iter->first, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); |
| 134 return; |
| 135 } |
| 136 } |
| 137 |
| 138 NOTREACHED(); |
| 139 return; |
| 140 } |
| 141 |
| 142 void MediaGalleriesDialogGtk::OnAddFolder(GtkWidget* widget) OVERRIDE { |
| 143 controller_->OnAddFolderClicked(); |
| 144 } |
| 145 |
| 146 void MediaGalleriesDialogGtk::OnConfirm(GtkWidget* widget) OVERRIDE { |
| 147 accepted_ = true; |
| 148 window_->CloseConstrainedWindow(); |
| 149 } |
| 150 |
| 151 void MediaGalleriesDialogGtk::OnCancel(GtkWidget* widget) OVERRIDE { |
| 152 window_->CloseConstrainedWindow(); |
| 153 } |
| 154 |
| 155 // MediaGalleriesDialogController ---------------------------------------------- |
| 156 |
| 157 // static |
| 158 MediaGalleriesDialog* MediaGalleriesDialog::Create( |
| 159 MediaGalleriesDialogController* controller) { |
| 160 return new MediaGalleriesDialogGtk(controller); |
| 161 } |
| 162 |
| 163 } // namespace chrome |
OLD | NEW |