Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1785)

Unified Diff: chrome/browser/gtk/repost_form_warning_gtk.cc

Issue 660434: Make repost form warning tab-modal on Gtk. (Closed)
Patch Set: Fixed a small bug when two tabmodal dialogs were shown. Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/gtk/repost_form_warning_gtk.h ('k') | chrome/browser/tab_contents/tab_contents.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_);
+}
+
« no previous file with comments | « chrome/browser/gtk/repost_form_warning_gtk.h ('k') | chrome/browser/tab_contents/tab_contents.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698