summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/gtk/html_dialog_gtk.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/gtk/html_dialog_gtk.cc')
-rw-r--r--chrome/browser/ui/gtk/html_dialog_gtk.cc171
1 files changed, 171 insertions, 0 deletions
diff --git a/chrome/browser/ui/gtk/html_dialog_gtk.cc b/chrome/browser/ui/gtk/html_dialog_gtk.cc
new file mode 100644
index 0000000..bec9abd
--- /dev/null
+++ b/chrome/browser/ui/gtk/html_dialog_gtk.cc
@@ -0,0 +1,171 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/gtk/html_dialog_gtk.h"
+
+#include <gtk/gtk.h>
+
+#include "base/utf_string_conversions.h"
+#include "chrome/browser/browser_window.h"
+#include "chrome/browser/dom_ui/html_dialog_ui.h"
+#include "chrome/browser/gtk/gtk_util.h"
+#include "chrome/browser/gtk/tab_contents_container_gtk.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/common/native_web_keyboard_event.h"
+#include "ipc/ipc_message.h"
+
+// static
+void HtmlDialogGtk::ShowHtmlDialogGtk(Browser* browser,
+ HtmlDialogUIDelegate* delegate,
+ gfx::NativeWindow parent_window) {
+ HtmlDialogGtk* html_dialog =
+ new HtmlDialogGtk(browser->profile(), delegate, parent_window);
+ html_dialog->InitDialog();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// HtmlDialogGtk, public:
+
+HtmlDialogGtk::HtmlDialogGtk(Profile* profile,
+ HtmlDialogUIDelegate* delegate,
+ gfx::NativeWindow parent_window)
+ : HtmlDialogTabContentsDelegate(profile),
+ delegate_(delegate),
+ parent_window_(parent_window),
+ dialog_(NULL) {
+}
+
+HtmlDialogGtk::~HtmlDialogGtk() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// HtmlDialogUIDelegate implementation:
+
+bool HtmlDialogGtk::IsDialogModal() const {
+ return delegate_ ? delegate_->IsDialogModal() : false;
+}
+
+std::wstring HtmlDialogGtk::GetDialogTitle() const {
+ return delegate_ ? delegate_->GetDialogTitle() : L"";
+}
+
+GURL HtmlDialogGtk::GetDialogContentURL() const {
+ if (delegate_)
+ return delegate_->GetDialogContentURL();
+ else
+ return GURL();
+}
+
+void HtmlDialogGtk::GetDOMMessageHandlers(
+ std::vector<DOMMessageHandler*>* handlers) const {
+ if (delegate_)
+ delegate_->GetDOMMessageHandlers(handlers);
+ else
+ handlers->clear();
+}
+
+void HtmlDialogGtk::GetDialogSize(gfx::Size* size) const {
+ if (delegate_)
+ delegate_->GetDialogSize(size);
+ else
+ *size = gfx::Size();
+}
+
+std::string HtmlDialogGtk::GetDialogArgs() const {
+ if (delegate_)
+ return delegate_->GetDialogArgs();
+ else
+ return std::string();
+}
+
+void HtmlDialogGtk::OnDialogClosed(const std::string& json_retval) {
+ DCHECK(dialog_);
+
+ Detach();
+ if (delegate_) {
+ HtmlDialogUIDelegate* dialog_delegate = delegate_;
+ delegate_ = NULL; // We will not communicate further with the delegate.
+ dialog_delegate->OnDialogClosed(json_retval);
+ }
+ gtk_widget_destroy(dialog_);
+ delete this;
+}
+
+bool HtmlDialogGtk::ShouldShowDialogTitle() const {
+ return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// TabContentsDelegate implementation:
+
+void HtmlDialogGtk::MoveContents(TabContents* source, const gfx::Rect& pos) {
+ // The contained web page wishes to resize itself. We let it do this because
+ // if it's a dialog we know about, we trust it not to be mean to the user.
+}
+
+void HtmlDialogGtk::ToolbarSizeChanged(TabContents* source,
+ bool is_animating) {
+ // Ignored.
+}
+
+// A simplified version of BrowserWindowGtk::HandleKeyboardEvent().
+// We don't handle global keyboard shortcuts here, but that's fine since
+// they're all browser-specific. (This may change in the future.)
+void HtmlDialogGtk::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {
+ GdkEventKey* os_event = event.os_event;
+ if (!os_event || event.type == WebKit::WebInputEvent::Char)
+ return;
+
+ // To make sure the default key bindings can still work, such as Escape to
+ // close the dialog.
+ gtk_bindings_activate_event(GTK_OBJECT(dialog_), os_event);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// HtmlDialogGtk:
+
+void HtmlDialogGtk::InitDialog() {
+ tab_contents_.reset(
+ new TabContents(profile(), NULL, MSG_ROUTING_NONE, NULL, NULL));
+ tab_contents_->set_delegate(this);
+
+ // This must be done before loading the page; see the comments in
+ // HtmlDialogUI.
+ HtmlDialogUI::GetPropertyAccessor().SetProperty(tab_contents_->property_bag(),
+ this);
+
+ tab_contents_->controller().LoadURL(GetDialogContentURL(),
+ GURL(), PageTransition::START_PAGE);
+ GtkDialogFlags flags = GTK_DIALOG_NO_SEPARATOR;
+ if (delegate_->IsDialogModal())
+ flags = static_cast<GtkDialogFlags>(flags | GTK_DIALOG_MODAL);
+
+ dialog_ = gtk_dialog_new_with_buttons(
+ WideToUTF8(delegate_->GetDialogTitle()).c_str(),
+ parent_window_,
+ flags,
+ NULL);
+
+ g_signal_connect(dialog_, "response", G_CALLBACK(OnResponseThunk), this);
+
+ tab_contents_container_.reset(new TabContentsContainerGtk(NULL));
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_)->vbox),
+ tab_contents_container_->widget(), TRUE, TRUE, 0);
+
+ tab_contents_container_->SetTabContents(tab_contents_.get());
+
+ gfx::Size dialog_size;
+ delegate_->GetDialogSize(&dialog_size);
+
+ gtk_widget_set_size_request(GTK_WIDGET(tab_contents_container_->widget()),
+ dialog_size.width(),
+ dialog_size.height());
+
+ gtk_widget_show_all(dialog_);
+}
+
+void HtmlDialogGtk::OnResponse(GtkWidget* dialog, int response_id) {
+ OnDialogClosed(std::string());
+}