| 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/website_settings/permission_selector.h" | |
| 6 | |
| 7 #include "base/compiler_specific.h" | |
| 8 #include "base/i18n/rtl.h" | |
| 9 #include "base/strings/utf_string_conversions.h" | |
| 10 #include "chrome/browser/ui/gtk/gtk_theme_service.h" | |
| 11 #include "chrome/browser/ui/gtk/gtk_util.h" | |
| 12 #include "chrome/browser/ui/gtk/menu_gtk.h" | |
| 13 #include "chrome/browser/ui/website_settings/website_settings_ui.h" | |
| 14 #include "grit/generated_resources.h" | |
| 15 #include "grit/theme_resources.h" | |
| 16 #include "ui/base/gtk/gtk_hig_constants.h" | |
| 17 #include "ui/base/l10n/l10n_util.h" | |
| 18 #include "ui/base/models/menu_model.h" | |
| 19 #include "ui/base/resource/resource_bundle.h" | |
| 20 #include "ui/gfx/image/image.h" | |
| 21 | |
| 22 namespace { | |
| 23 | |
| 24 ContentSetting CommandIdToContentSetting(int command_id) { | |
| 25 switch (command_id) { | |
| 26 case PermissionMenuModel::COMMAND_SET_TO_DEFAULT: | |
| 27 return CONTENT_SETTING_DEFAULT; | |
| 28 case PermissionMenuModel::COMMAND_SET_TO_ALLOW: | |
| 29 return CONTENT_SETTING_ALLOW; | |
| 30 case PermissionMenuModel::COMMAND_SET_TO_BLOCK: | |
| 31 return CONTENT_SETTING_BLOCK; | |
| 32 default: | |
| 33 NOTREACHED(); | |
| 34 return CONTENT_SETTING_DEFAULT; | |
| 35 } | |
| 36 } | |
| 37 | |
| 38 } // namespace | |
| 39 | |
| 40 PermissionSelector::PermissionSelector(GtkThemeService* theme_service, | |
| 41 const GURL& url, | |
| 42 ContentSettingsType type, | |
| 43 ContentSetting setting, | |
| 44 ContentSetting default_setting, | |
| 45 content_settings::SettingSource source) | |
| 46 : widget_(NULL), | |
| 47 menu_button_(NULL), | |
| 48 icon_(NULL), | |
| 49 type_(type), | |
| 50 default_setting_(default_setting), | |
| 51 setting_(setting) { | |
| 52 DCHECK_NE(default_setting, CONTENT_SETTING_DEFAULT); | |
| 53 | |
| 54 // Create permission info box. | |
| 55 const int kChildSpacing = 4; | |
| 56 widget_ = gtk_hbox_new(FALSE, kChildSpacing); | |
| 57 | |
| 58 // Add permission type icon. | |
| 59 ContentSetting effective_setting = setting; | |
| 60 if (effective_setting == CONTENT_SETTING_DEFAULT) | |
| 61 effective_setting = default_setting; | |
| 62 GdkPixbuf* pixbuf = WebsiteSettingsUI::GetPermissionIcon( | |
| 63 type, effective_setting).ToGdkPixbuf(); | |
| 64 icon_ = gtk_image_new_from_pixbuf(pixbuf); | |
| 65 gtk_box_pack_start(GTK_BOX(widget_), icon_, FALSE, FALSE, 0); | |
| 66 | |
| 67 // Add a label for the permission type. | |
| 68 GtkWidget* label = theme_service->BuildLabel(l10n_util::GetStringFUTF8( | |
| 69 IDS_WEBSITE_SETTINGS_PERMISSION_TYPE, | |
| 70 WebsiteSettingsUI::PermissionTypeToUIString(type)), | |
| 71 ui::kGdkBlack); | |
| 72 gtk_label_set_line_wrap_mode(GTK_LABEL(label), PANGO_WRAP_WORD_CHAR); | |
| 73 | |
| 74 gtk_box_pack_start(GTK_BOX(widget_), label, FALSE, FALSE, 0); | |
| 75 | |
| 76 // Add the menu button. | |
| 77 menu_button_ = theme_service->BuildChromeButton(); | |
| 78 GtkWidget* button_hbox = gtk_hbox_new(FALSE, 0); | |
| 79 gtk_container_add(GTK_CONTAINER(menu_button_), button_hbox); | |
| 80 | |
| 81 GtkWidget* button_label = theme_service->BuildLabel( | |
| 82 base::UTF16ToUTF8(WebsiteSettingsUI::PermissionActionToUIString( | |
| 83 setting, default_setting, source)), | |
| 84 ui::kGdkBlack); | |
| 85 gtk_box_pack_start(GTK_BOX(button_hbox), button_label, FALSE, FALSE, | |
| 86 ui::kControlSpacing); | |
| 87 | |
| 88 bool user_setting = source == content_settings::SETTING_SOURCE_USER; | |
| 89 gtk_widget_set_sensitive(GTK_WIDGET(menu_button_), user_setting); | |
| 90 if (user_setting) { | |
| 91 GtkWidget* arrow = NULL; | |
| 92 // We don't handle theme changes, which is a bug but they are very unlikely | |
| 93 // to occur while a bubble is grabbing input. | |
| 94 if (theme_service->UsingNativeTheme()) { | |
| 95 arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE); | |
| 96 } else { | |
| 97 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | |
| 98 arrow = gtk_image_new_from_pixbuf( | |
| 99 rb.GetNativeImageNamed(IDR_APP_DROPARROW).ToGdkPixbuf()); | |
| 100 } | |
| 101 gtk_box_pack_start(GTK_BOX(button_hbox), arrow, FALSE, FALSE, 0); | |
| 102 } | |
| 103 gtk_button_set_relief(GTK_BUTTON(menu_button_), GTK_RELIEF_NONE); | |
| 104 gtk_box_pack_start(GTK_BOX(widget_), menu_button_, FALSE, FALSE, 0); | |
| 105 | |
| 106 menu_model_.reset(new PermissionMenuModel(this, url, type, default_setting, | |
| 107 setting)); | |
| 108 MenuGtk::Delegate* delegate = new MenuGtk::Delegate(); | |
| 109 menu_.reset(new MenuGtk(delegate, menu_model_.get())); | |
| 110 g_signal_connect(menu_button_, "button-press-event", | |
| 111 G_CALLBACK(OnMenuButtonPressEventThunk), this); | |
| 112 } | |
| 113 | |
| 114 PermissionSelector::~PermissionSelector() { | |
| 115 } | |
| 116 | |
| 117 void PermissionSelector::AddObserver(PermissionSelectorObserver* observer) { | |
| 118 observer_list_.AddObserver(observer); | |
| 119 } | |
| 120 | |
| 121 ContentSetting PermissionSelector::GetSetting() const { | |
| 122 return setting_; | |
| 123 } | |
| 124 | |
| 125 ContentSettingsType PermissionSelector::GetType() const { | |
| 126 return type_; | |
| 127 } | |
| 128 | |
| 129 gboolean PermissionSelector::OnMenuButtonPressEvent(GtkWidget* button, | |
| 130 GdkEventButton* event) { | |
| 131 if (event->button != 1) | |
| 132 return FALSE; | |
| 133 menu_->PopupForWidget(button, event->button, event->time); | |
| 134 return TRUE; | |
| 135 } | |
| 136 | |
| 137 void PermissionSelector::ExecuteCommand(int command_id) { | |
| 138 setting_ = CommandIdToContentSetting(command_id); | |
| 139 | |
| 140 // Change the permission icon to reflect the selected setting. | |
| 141 ContentSetting effective_setting = setting_; | |
| 142 if (effective_setting == CONTENT_SETTING_DEFAULT) | |
| 143 effective_setting = default_setting_; | |
| 144 GdkPixbuf* pixbuf = WebsiteSettingsUI::GetPermissionIcon( | |
| 145 type_, effective_setting).ToGdkPixbuf(); | |
| 146 gtk_image_set_from_pixbuf(GTK_IMAGE(icon_), pixbuf); | |
| 147 | |
| 148 // Change the text of the menu button to reflect the selected setting. | |
| 149 gtk_button_set_label(GTK_BUTTON(menu_button_), base::UTF16ToUTF8( | |
| 150 WebsiteSettingsUI::PermissionActionToUIString( | |
| 151 setting_, | |
| 152 default_setting_, | |
| 153 content_settings::SETTING_SOURCE_USER)).c_str()); | |
| 154 | |
| 155 FOR_EACH_OBSERVER(PermissionSelectorObserver, | |
| 156 observer_list_, | |
| 157 OnPermissionChanged(this)); | |
| 158 } | |
| 159 | |
| 160 bool PermissionSelector::IsCommandIdChecked(int command_id) { | |
| 161 return setting_ == CommandIdToContentSetting(command_id); | |
| 162 } | |
| OLD | NEW |