Index: chrome/browser/ui/gtk/extensions/extension_install_dialog_gtk.cc |
diff --git a/chrome/browser/ui/gtk/extensions/extension_install_dialog_gtk.cc b/chrome/browser/ui/gtk/extensions/extension_install_dialog_gtk.cc |
index 28bb3e594fb035329f30d75c47cfb9c28e5f7f97..9b6d714af246ee3bae4e933832f34bbdd4adaca1 100644 |
--- a/chrome/browser/ui/gtk/extensions/extension_install_dialog_gtk.cc |
+++ b/chrome/browser/ui/gtk/extensions/extension_install_dialog_gtk.cc |
@@ -31,6 +31,7 @@ namespace { |
const int kLeftColumnMinWidth = 250; |
const int kImageSize = 69; |
+const int kDetailIndent = 20; |
// Additional padding (beyond on ui::kControlSpacing) all sides of each |
// permission in the permissions list. |
@@ -48,6 +49,32 @@ void AddResourceIcon(const gfx::ImageSkia* icon, void* data) { |
gtk_box_pack_start(GTK_BOX(container), icon_widget, FALSE, FALSE, 0); |
} |
+void OnZippyButtonRealize(GtkWidget* event_box, gpointer unused) { |
+ gdk_window_set_cursor(event_box->window, gfx::GetCursor(GDK_HAND2)); |
+} |
+ |
+gboolean OnZippyButtonRelease(GtkWidget* event_box, |
+ GdkEvent* event, |
+ GtkWidget* detail_box) { |
+ if (event->button.button != 1) |
+ return FALSE; |
+ |
+ GtkWidget* arrow = |
+ GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(event_box), "arrow")); |
+ |
+ if (gtk_widget_get_visible(detail_box)) { |
+ gtk_widget_hide(detail_box); |
+ gtk_arrow_set(GTK_ARROW(arrow), GTK_ARROW_RIGHT, GTK_SHADOW_OUT); |
+ } else { |
+ gtk_widget_set_no_show_all(detail_box, FALSE); |
+ gtk_widget_show_all(detail_box); |
+ gtk_widget_set_no_show_all(detail_box, TRUE); |
+ gtk_arrow_set(GTK_ARROW(arrow), GTK_ARROW_DOWN, GTK_SHADOW_OUT); |
+ } |
+ |
+ return TRUE; |
+} |
+ |
} // namespace |
namespace browser { |
@@ -67,6 +94,9 @@ class ExtensionInstallDialog { |
CHROMEGTK_CALLBACK_1(ExtensionInstallDialog, void, OnResponse, int); |
CHROMEGTK_CALLBACK_0(ExtensionInstallDialog, void, OnStoreLinkClick); |
+ GtkWidget* CreateWidgetForIssueAdvice( |
+ const IssueAdviceInfoEntry& issue_advice, int pixel_width); |
+ |
Browser* browser_; |
ExtensionInstallPrompt::Delegate* delegate_; |
std::string extension_id_; // Set for INLINE_INSTALL_PROMPT. |
@@ -127,6 +157,7 @@ ExtensionInstallDialog::ExtensionInstallDialog( |
GtkWidget* left_column_area = gtk_vbox_new(FALSE, ui::kControlSpacing); |
gtk_box_pack_start(GTK_BOX(top_content_hbox), left_column_area, |
TRUE, TRUE, 0); |
+ gtk_widget_set_size_request(left_column_area, kLeftColumnMinWidth, -1); |
GtkWidget* heading_vbox = gtk_vbox_new(FALSE, 0); |
// If we are not going to show anything else, vertically center the title. |
@@ -237,27 +268,25 @@ ExtensionInstallDialog::ExtensionInstallDialog( |
} |
if (show_oauth_issues) { |
- GtkWidget* oauth_issues_container; |
- if (is_inline_install) { |
- oauth_issues_container = content_vbox; |
- gtk_box_pack_start(GTK_BOX(content_vbox), gtk_hseparator_new(), |
- FALSE, FALSE, ui::kControlSpacing); |
- } else { |
- oauth_issues_container = left_column_area; |
- } |
+ // If permissions are shown, then the scopes will go below them and take |
+ // up the entire width of the dialog. Otherwise the scopes will go where |
+ // the permissions usually go. |
+ GtkWidget* oauth_issues_container = |
+ show_permissions ? content_vbox : left_column_area; |
+ int pixel_width = kLeftColumnMinWidth + |
+ (show_permissions ? kImageSize : 0); |
GtkWidget* oauth_issues_header = gtk_util::CreateBoldLabel( |
- "The app wants these scopes:"); |
- gtk_util::SetLabelWidth(oauth_issues_header, kLeftColumnMinWidth); |
+ UTF16ToUTF8(prompt.GetOAuthHeading()).c_str()); |
+ gtk_util::SetLabelWidth(oauth_issues_header, pixel_width); |
gtk_box_pack_start(GTK_BOX(oauth_issues_container), oauth_issues_header, |
FALSE, FALSE, 0); |
// TODO(estade): display the issue details under zippies. |
for (size_t i = 0; i < prompt.GetOAuthIssueCount(); ++i) { |
- GtkWidget* label = gtk_label_new( |
- prompt.GetOAuthIssue(i).description.c_str()); |
- gtk_util::SetLabelWidth(label, kLeftColumnMinWidth); |
- gtk_box_pack_start(GTK_BOX(oauth_issues_container), label, |
+ GtkWidget* issue_advice_widget = |
+ CreateWidgetForIssueAdvice(prompt.GetOAuthIssue(i), pixel_width); |
+ gtk_box_pack_start(GTK_BOX(oauth_issues_container), issue_advice_widget, |
FALSE, FALSE, kPermissionsPadding); |
} |
} |
@@ -274,11 +303,10 @@ ExtensionInstallDialog::~ExtensionInstallDialog() { |
} |
void ExtensionInstallDialog::OnResponse(GtkWidget* dialog, int response_id) { |
- if (response_id == GTK_RESPONSE_ACCEPT) { |
+ if (response_id == GTK_RESPONSE_ACCEPT) |
delegate_->InstallUIProceed(); |
- } else { |
+ else |
delegate_->InstallUIAbort(true); |
- } |
gtk_widget_destroy(dialog_); |
delete this; |
@@ -294,6 +322,63 @@ void ExtensionInstallDialog::OnStoreLinkClick(GtkWidget* sender) { |
OnResponse(dialog_, GTK_RESPONSE_CLOSE); |
} |
+GtkWidget* ExtensionInstallDialog::CreateWidgetForIssueAdvice( |
+ const IssueAdviceInfoEntry& issue_advice, int pixel_width) { |
+ GtkWidget* box = gtk_vbox_new(FALSE, ui::kControlSpacing); |
+ GtkWidget* header = gtk_hbox_new(FALSE, 0); |
+ GtkWidget* event_box = gtk_event_box_new(); |
+ gtk_container_add(GTK_CONTAINER(event_box), header); |
+ gtk_box_pack_start(GTK_BOX(box), event_box, FALSE, FALSE, |
+ kPermissionsPadding); |
+ |
+ GtkWidget* arrow = NULL; |
+ GtkWidget* label = NULL; |
+ int label_pixel_width = pixel_width; |
+ |
+ if (issue_advice.details.empty()) { |
+ label = gtk_label_new(l10n_util::GetStringFUTF8( |
+ IDS_EXTENSION_PERMISSION_LINE, |
+ UTF8ToUTF16(issue_advice.description)).c_str()); |
+ } else { |
+ arrow = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_OUT); |
+ GtkRequisition req; |
+ gtk_widget_size_request(arrow, &req); |
+ label_pixel_width -= req.width; |
+ |
+ label = gtk_label_new(issue_advice.description.c_str()); |
+ |
+ GtkWidget* detail_box = gtk_vbox_new(FALSE, ui::kControlSpacing); |
+ gtk_box_pack_start(GTK_BOX(box), detail_box, FALSE, FALSE, 0); |
+ gtk_widget_set_no_show_all(detail_box, TRUE); |
+ gtk_object_set_data(GTK_OBJECT(event_box), "arrow", arrow); |
+ |
+ for (size_t i = 0; i < issue_advice.details.size(); ++i) { |
+ std::string text = l10n_util::GetStringFUTF8( |
+ IDS_EXTENSION_PERMISSION_LINE, UTF8ToUTF16(issue_advice.details[i])); |
+ GtkWidget* label = gtk_label_new(text.c_str()); |
+ gtk_util::SetLabelWidth(label, pixel_width - kDetailIndent); |
+ |
+ GtkWidget* align = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); |
+ gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, kDetailIndent, 0); |
+ gtk_container_add(GTK_CONTAINER(align), label); |
+ gtk_box_pack_start(GTK_BOX(detail_box), align, FALSE, FALSE, |
+ kPermissionsPadding); |
+ } |
+ |
+ g_signal_connect(event_box, "realize", |
+ G_CALLBACK(OnZippyButtonRealize), NULL); |
+ g_signal_connect(event_box, "button-release-event", |
+ G_CALLBACK(OnZippyButtonRelease), detail_box); |
+ } |
+ |
+ gtk_util::SetLabelWidth(label, label_pixel_width); |
+ if (arrow) |
+ gtk_box_pack_start(GTK_BOX(header), arrow, FALSE, FALSE, 0); |
+ gtk_box_pack_start(GTK_BOX(header), label, TRUE, TRUE, 0); |
+ |
+ return box; |
+} |
+ |
} // namespace browser |
void ShowExtensionInstallDialogImpl( |