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