15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/auto_reset.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_preferences.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/gtk/gtk_util.h" 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_manager.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/gtk/gtk_hig_constants.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using web_modal::WebContentsModalDialogManager; 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Color used for additional attachment detail text for galleries. 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const GdkColor kDeemphasizedTextColor = GDK_COLOR_RGB(0x96, 0x96, 0x96); 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Width and height of the scrollable area in which galleries are shown. 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kGalleryControlScrollableWidth = 280; 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kGalleryControlScrollableHeight = 192; 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef MediaGalleriesDialogController::GalleryPermissionsVector 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GalleryPermissionsVector; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaGalleriesDialogGtk::MediaGalleriesDialogGtk( 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MediaGalleriesDialogController* controller) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : controller_(controller), 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_(NULL), 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) confirm_(NULL), 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accepted_(false) { 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contents_.reset(gtk_vbox_new(FALSE, ui::kContentAreaSpacing)); 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_object_ref_sink(contents_.get()); 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_signal_connect(contents_.get(), 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "destroy", 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) G_CALLBACK(OnDestroyThunk), 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitWidgets(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // May be NULL during tests. 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (controller->web_contents()) { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_ = CreateWebContentsModalDialogGtk(contents_.get(), confirm_); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsModalDialogManager* web_contents_modal_dialog_manager = 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsModalDialogManager::FromWebContents( 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller->web_contents()); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_modal_dialog_manager->ShowDialog(window_); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaGalleriesDialogGtk::~MediaGalleriesDialogGtk() { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaGalleriesDialogGtk::InitWidgets() { 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_util::RemoveAllChildren(contents_.get()); 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) checkbox_map_.clear(); 631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new_checkbox_map_.clear(); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) confirm_ = NULL; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) GtkWidget* header = gtk_util::LeftAlignMisc(gtk_label_new( 675e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) UTF16ToUTF8(controller_->GetHeader()).c_str())); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_box_pack_start(GTK_BOX(contents_.get()), header, FALSE, FALSE, 0); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* subtext = 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_label_new(UTF16ToUTF8(controller_->GetSubtext()).c_str()); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_label_set_line_wrap(GTK_LABEL(subtext), TRUE); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_set_size_request(subtext, 500, -1); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_box_pack_start(GTK_BOX(contents_.get()), subtext, FALSE, FALSE, 0); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The checkboxes are added inside a scrollable area. 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GtkWidget* scroll_window = 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_scrolled_window_new(NULL, NULL); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_window), 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GTK_POLICY_NEVER, 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GTK_POLICY_AUTOMATIC); 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll_window), 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GTK_SHADOW_ETCHED_IN); 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GtkWidget* checkbox_container = gtk_vbox_new(FALSE, ui::kControlSpacing); 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_widget_set_size_request(scroll_window, 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kGalleryControlScrollableWidth, 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kGalleryControlScrollableHeight); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_container_set_border_width(GTK_CONTAINER(checkbox_container), 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::kGroupIndent); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll_window), 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) checkbox_container); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_widget_show(checkbox_container); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_box_pack_start(GTK_BOX(contents_.get()), scroll_window, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FALSE, FALSE, 0); 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_widget_show(scroll_window); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Attached galleries checkboxes 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GalleryPermissionsVector permissions = controller_->AttachedPermissions(); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (GalleryPermissionsVector::const_iterator iter = permissions.begin(); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != permissions.end(); ++iter) { 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateGalleryInContainer(iter->pref_info, iter->allowed, 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) checkbox_container); 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GalleryPermissionsVector unattached_permissions = 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_->UnattachedPermissions(); 10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!unattached_permissions.empty()) { 10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Separator line and unattached volumes header text. 11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GtkWidget* separator = gtk_hseparator_new(); 11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gtk_box_pack_start(GTK_BOX(checkbox_container), separator, FALSE, FALSE, 0); 11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GtkWidget* unattached_hbox = gtk_hbox_new(FALSE, ui::kLabelSpacing); 11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GtkWidget* unattached_text = gtk_label_new(UTF16ToUTF8( 11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) controller_->GetUnattachedLocationsHeader()).c_str()); 11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gtk_label_set_line_wrap(GTK_LABEL(unattached_text), FALSE); 11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gtk_box_pack_start(GTK_BOX(unattached_hbox), unattached_text, 11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FALSE, FALSE, 0); 11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gtk_box_pack_start(GTK_BOX(checkbox_container), unattached_hbox, 12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FALSE, FALSE, 0); 12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Unattached galleries checkboxes 12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (GalleryPermissionsVector::const_iterator iter = 12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) unattached_permissions.begin(); 12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) iter != unattached_permissions.end(); ++iter) { 12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UpdateGalleryInContainer(iter->pref_info, iter->allowed, 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) checkbox_container); 12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GtkWidget* bottom_area = gtk_hbox_new(FALSE, ui::kControlSpacing); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add gallery button. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* add_folder = gtk_button_new_with_label( 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF8(IDS_MEDIA_GALLERIES_DIALOG_ADD_GALLERY).c_str()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_signal_connect(add_folder, "clicked", G_CALLBACK(OnAddFolderThunk), this); 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gtk_box_pack_start(GTK_BOX(bottom_area), add_folder, FALSE, FALSE, 0); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Confirm/cancel button. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) confirm_ = gtk_button_new_with_label(l10n_util::GetStringUTF8( 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_MEDIA_GALLERIES_DIALOG_CONFIRM).c_str()); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_button_set_image( 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GTK_BUTTON(confirm_), 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_image_new_from_stock(GTK_STOCK_APPLY, GTK_ICON_SIZE_BUTTON)); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_signal_connect(confirm_, "clicked", G_CALLBACK(OnConfirmThunk), this); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_box_pack_end(GTK_BOX(bottom_area), confirm_, FALSE, FALSE, 0); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* cancel = gtk_button_new_with_label(l10n_util::GetStringUTF8( 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_MEDIA_GALLERIES_DIALOG_CANCEL).c_str()); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_button_set_image( 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GTK_BUTTON(cancel), 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_image_new_from_stock(GTK_STOCK_CANCEL, GTK_ICON_SIZE_BUTTON)); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_signal_connect(cancel, "clicked", G_CALLBACK(OnCancelThunk), this); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_box_pack_end(GTK_BOX(bottom_area), cancel, FALSE, FALSE, 0); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_box_pack_start(GTK_BOX(contents_.get()), bottom_area, FALSE, FALSE, 0); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // As a safeguard against the user skipping reading over the dialog and just 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // confirming, the button will be unavailable for dialogs without any checks 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // until the user toggles something. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_set_sensitive(confirm_, controller_->HasPermittedGalleries()); 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_widget_show_all(contents_.get()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void MediaGalleriesDialogGtk::UpdateGalleries() { 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitWidgets(); 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void MediaGalleriesDialogGtk::UpdateGalleryInContainer( 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const MediaGalleryPrefInfo& gallery, 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool permitted, 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GtkWidget* checkbox_container) { 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GtkWidget* hbox = gtk_hbox_new(FALSE, ui::kLabelSpacing); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GtkWidget* widget = gtk_check_button_new(); 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_signal_connect(widget, "toggled", G_CALLBACK(OnToggledThunk), this); 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_box_pack_start(GTK_BOX(checkbox_container), hbox, FALSE, FALSE, 0); 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0); 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string details = UTF16ToUTF8(gallery.GetGalleryAdditionalDetails()); 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GtkWidget* details_label = gtk_label_new(details.c_str()); 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_label_set_line_wrap(GTK_LABEL(details_label), FALSE); 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_util::SetLabelColor(details_label, &kDeemphasizedTextColor); 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_box_pack_start(GTK_BOX(hbox), details_label, FALSE, FALSE, 0); 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_widget_show(hbox); 1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (gallery.pref_id != kInvalidMediaGalleryPrefId) 1861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) checkbox_map_[gallery.pref_id] = widget; 1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) else 1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new_checkbox_map_[widget] = gallery; 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string tooltip_text = UTF16ToUTF8(gallery.GetGalleryTooltip()); 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_widget_set_tooltip_text(widget, tooltip_text.c_str()); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), permitted); 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string label = UTF16ToUTF8(gallery.GetGalleryDisplayName()); 19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // TODO(gbillock): Would be nice to add middle elide behavior here. 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_button_set_label(GTK_BUTTON(widget), label.c_str()); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaGalleriesDialogGtk::OnToggled(GtkWidget* widget) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (confirm_) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_set_sensitive(confirm_, TRUE); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (CheckboxMap::const_iterator iter = checkbox_map_.begin(); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != checkbox_map_.end(); ++iter) { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter->second == widget) { 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller_->DidToggleGalleryId( 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter->first, 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); 2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return; 2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 2121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (NewCheckboxMap::const_iterator iter = new_checkbox_map_.begin(); 2131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) iter != new_checkbox_map_.end(); ++iter) { 2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (iter->first == widget) { 2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) controller_->DidToggleNewGallery( 2161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) iter->second, 2171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); 2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaGalleriesDialogGtk::OnAddFolder(GtkWidget* widget) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_->OnAddFolderClicked(); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaGalleriesDialogGtk::OnConfirm(GtkWidget* widget) { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accepted_ = true; 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (window_) 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_widget_destroy(window_); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MediaGalleriesDialogGtk::OnCancel(GtkWidget* widget) { 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (window_) 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_widget_destroy(window_); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesDialogGtk::OnDestroy(GtkWidget* widget) { 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller_->DialogFinished(accepted_); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MediaGalleriesDialogController ---------------------------------------------- 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaGalleriesDialog* MediaGalleriesDialog::Create( 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MediaGalleriesDialogController* controller) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new MediaGalleriesDialogGtk(controller); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 250