| Index: chrome/browser/gtk/repost_form_warning_gtk.cc
|
| diff --git a/chrome/browser/gtk/repost_form_warning_gtk.cc b/chrome/browser/gtk/repost_form_warning_gtk.cc
|
| index 53d1ca153a37856fe1052eb71d7d0090ceb6310f..a3f46819b9ece43b3119c115af0f977a56cadd2f 100644
|
| --- a/chrome/browser/gtk/repost_form_warning_gtk.cc
|
| +++ b/chrome/browser/gtk/repost_form_warning_gtk.cc
|
| @@ -9,45 +9,75 @@
|
| #include "base/message_loop.h"
|
| #include "chrome/browser/gtk/gtk_util.h"
|
| #include "chrome/browser/tab_contents/navigation_controller.h"
|
| +#include "chrome/browser/tab_contents/tab_contents.h"
|
| #include "chrome/common/notification_service.h"
|
| #include "grit/generated_resources.h"
|
|
|
| -RepostFormWarningGtk::RepostFormWarningGtk(
|
| - GtkWindow* parent,
|
| - NavigationController* navigation_controller)
|
| - : navigation_controller_(navigation_controller) {
|
| - dialog_ = gtk_message_dialog_new(
|
| - parent,
|
| - GTK_DIALOG_MODAL,
|
| - GTK_MESSAGE_QUESTION,
|
| - GTK_BUTTONS_NONE,
|
| - "%s",
|
| +RepostFormWarningGtk::RepostFormWarningGtk(GtkWindow* parent,
|
| + TabContents* tab_contents)
|
| + : navigation_controller_(&tab_contents->controller()) {
|
| + dialog_ = gtk_vbox_new(NULL, gtk_util::kContentAreaBorder);
|
| + gtk_box_set_spacing(GTK_BOX(dialog_), gtk_util::kContentAreaSpacing);
|
| + GtkWidget* label = gtk_label_new(
|
| l10n_util::GetStringUTF8(IDS_HTTP_POST_WARNING).c_str());
|
| - gtk_util::ApplyMessageDialogQuirks(dialog_);
|
| - gtk_window_set_title(GTK_WINDOW(dialog_),
|
| - l10n_util::GetStringUTF8(IDS_HTTP_POST_WARNING_TITLE).c_str());
|
| - gtk_util::AddButtonToDialog(dialog_,
|
| - l10n_util::GetStringUTF8(IDS_CANCEL).c_str(),
|
| - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
|
| - gtk_util::AddButtonToDialog(dialog_,
|
| - l10n_util::GetStringUTF8(IDS_HTTP_POST_WARNING_RESEND).c_str(),
|
| - GTK_STOCK_REFRESH, GTK_RESPONSE_OK);
|
| - gtk_util::SetWindowIcon(GTK_WINDOW(dialog_));
|
| -
|
| - g_signal_connect(dialog_, "response", G_CALLBACK(OnResponse), this);
|
| - g_signal_connect(dialog_, "destroy", G_CALLBACK(OnWindowDestroy), this);
|
| -
|
| - gtk_widget_show_all(dialog_);
|
| + GtkWidget* image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_QUESTION,
|
| + GTK_ICON_SIZE_DIALOG);
|
| + gtk_misc_set_alignment(GTK_MISC(image), 0.5, 0.0);
|
| +
|
| + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
|
| + gtk_label_set_selectable(GTK_LABEL(label), TRUE);
|
| +
|
| + GtkWidget *hbox = gtk_hbox_new(FALSE, gtk_util::kControlSpacing);
|
| +
|
| + gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
|
| +
|
| + gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
|
| +
|
| + gtk_box_pack_start(GTK_BOX(dialog_), hbox, FALSE, FALSE, 0);
|
| +
|
| + GtkWidget* buttonBox = gtk_hbutton_box_new();
|
| + gtk_button_box_set_layout(GTK_BUTTON_BOX(buttonBox), GTK_BUTTONBOX_END);
|
| + gtk_box_set_spacing(GTK_BOX(buttonBox), gtk_util::kControlSpacing);
|
| + gtk_box_pack_end(GTK_BOX(dialog_), buttonBox, FALSE, TRUE, 0);
|
| +
|
| + cancel_ = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
|
| + gtk_button_set_label(GTK_BUTTON(cancel_),
|
| + l10n_util::GetStringUTF8(IDS_CANCEL).c_str());
|
| + g_signal_connect(cancel_, "clicked", G_CALLBACK(OnCancelThunk), this);
|
| + gtk_box_pack_end(GTK_BOX(buttonBox), cancel_, FALSE, TRUE, 0);
|
| +
|
| + ok_ = gtk_button_new_from_stock(GTK_STOCK_REFRESH);
|
| + gtk_button_set_label(
|
| + GTK_BUTTON(ok_),
|
| + l10n_util::GetStringUTF8(IDS_HTTP_POST_WARNING_RESEND).c_str());
|
| + g_signal_connect(ok_, "clicked", G_CALLBACK(OnRefreshThunk), this);
|
| + gtk_box_pack_end(GTK_BOX(buttonBox), ok_, FALSE, TRUE, 0);
|
| +
|
| + g_signal_connect(cancel_, "hierarchy-changed",
|
| + G_CALLBACK(OnHierarchyChangedThunk), this);
|
| +
|
| + window_ = tab_contents->CreateConstrainedDialog(this);
|
|
|
| registrar_.Add(this, NotificationType::LOAD_START,
|
| Source<NavigationController>(navigation_controller_));
|
| registrar_.Add(this, NotificationType::TAB_CLOSING,
|
| Source<NavigationController>(navigation_controller_));
|
| + registrar_.Add(this, NotificationType::RELOADING,
|
| + Source<NavigationController>(navigation_controller_));
|
| +
|
| }
|
|
|
| RepostFormWarningGtk::~RepostFormWarningGtk() {
|
| }
|
|
|
| +GtkWidget* RepostFormWarningGtk::GetWidgetRoot() {
|
| + return dialog_;
|
| +}
|
| +
|
| +void RepostFormWarningGtk::DeleteDelegate() {
|
| + MessageLoop::current()->DeleteSoon(FROM_HERE, this);
|
| +}
|
| +
|
| void RepostFormWarningGtk::Observe(NotificationType type,
|
| const NotificationSource& source,
|
| const NotificationDetails& details) {
|
| @@ -56,11 +86,11 @@ void RepostFormWarningGtk::Observe(NotificationType type,
|
| // a navigation controller anymore.
|
| if (dialog_ && navigation_controller_ &&
|
| (type == NotificationType::LOAD_START ||
|
| - type == NotificationType::TAB_CLOSING)) {
|
| + type == NotificationType::TAB_CLOSING ||
|
| + type == NotificationType::RELOADING)) {
|
| DCHECK_EQ(Source<NavigationController>(source).ptr(),
|
| navigation_controller_);
|
| - navigation_controller_ = NULL;
|
| - Destroy();
|
| + OnCancel(dialog_);
|
| }
|
| }
|
|
|
| @@ -69,20 +99,29 @@ void RepostFormWarningGtk::Destroy() {
|
| gtk_widget_destroy(dialog_);
|
| dialog_ = NULL;
|
| }
|
| + window_->CloseConstrainedWindow();
|
| }
|
|
|
| -// static
|
| -void RepostFormWarningGtk::OnResponse(GtkWidget* widget, int response,
|
| - RepostFormWarningGtk* dialog) {
|
| - dialog->Destroy();
|
| - if (response == GTK_RESPONSE_OK) {
|
| - if (dialog->navigation_controller_)
|
| - dialog->navigation_controller_->Reload(false);
|
| +void RepostFormWarningGtk::OnRefresh(GtkWidget* widget) {
|
| + if (navigation_controller_) {
|
| + navigation_controller_->ContinuePendingReload();
|
| + // reloading the page will close the dialog.
|
| }
|
| }
|
|
|
| -// static
|
| -void RepostFormWarningGtk::OnWindowDestroy(GtkWidget* widget,
|
| - RepostFormWarningGtk* dialog) {
|
| - MessageLoop::current()->DeleteSoon(FROM_HERE, dialog);
|
| +void RepostFormWarningGtk::OnCancel(GtkWidget* widget) {
|
| + if (navigation_controller_) {
|
| + navigation_controller_->CancelPendingReload();
|
| + }
|
| + Destroy();
|
| }
|
| +
|
| +void RepostFormWarningGtk::OnHierarchyChanged(GtkWidget* root,
|
| + GtkWidget* previous_toplevel) {
|
| + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
|
| + if (!GTK_WIDGET_TOPLEVEL(gtk_widget_get_toplevel(cancel_))) {
|
| + return;
|
| + }
|
| + gtk_widget_grab_focus(cancel_);
|
| +}
|
| +
|
|
|