[Win] Show an empty window for ShowMessageBox.
authorCheng Zhao <zcbenz@gmail.com>
Wed, 24 Jul 2013 10:34:50 +0000 (18:34 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Wed, 24 Jul 2013 10:34:50 +0000 (18:34 +0800)
browser/message_box_win.cc

index 23038dc..78693c6 100644 (file)
 
 #include "browser/message_box.h"
 
+#include "base/message_loop.h"
+#include "base/run_loop.h"
+#include "base/utf_string_conversions.h"
+#include "browser/native_window.h"
+#include "ui/views/controls/button/button.h"
+#include "ui/views/controls/message_box_view.h"
+#include "ui/views/layout/grid_layout.h"
+#include "ui/views/widget/widget.h"
+#include "ui/views/widget/widget_delegate.h"
+#include "ui/views/window/client_view.h"
+
 namespace atom {
 
+namespace {
+
+class MessageDialog : public base::MessageLoop::Dispatcher,
+                      public views::WidgetDelegate,
+                      public views::ButtonListener {
+ public:
+  MessageDialog(NativeWindow* parent_window,
+                MessageBoxType type,
+                const std::vector<std::string>& buttons,
+                const std::string& title,
+                const std::string& message,
+                const std::string& detail);
+  virtual ~MessageDialog();
+
+ private:
+  // Overridden from MessageLoop::Dispatcher:
+  virtual bool Dispatch(const base::NativeEvent& event) OVERRIDE;
+
+  // Overridden from views::Widget:
+  virtual void WindowClosing() OVERRIDE;
+  virtual views::Widget* GetWidget() OVERRIDE;
+  virtual const views::Widget* GetWidget() const OVERRIDE;
+  virtual views::ClientView* CreateClientView(views::Widget* widget) OVERRIDE;
+
+  // Overridden from views::ButtonListener:
+  virtual void ButtonPressed(views::Button* sender,
+                             const ui::Event& event) OVERRIDE;
+
+  bool should_close_;
+  views::Widget* widget_;
+  views::MessageBoxView* message_box_view_;
+
+  DISALLOW_COPY_AND_ASSIGN(MessageDialog);
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// MessageDialog, public:
+
+MessageDialog::MessageDialog(NativeWindow* parent_window,
+                             MessageBoxType type,
+                             const std::vector<std::string>& buttons,
+                             const std::string& title,
+                             const std::string& message,
+                             const std::string& detail)
+    : should_close_(false) {
+  views::MessageBoxView::InitParams params(UTF8ToUTF16(title));
+  params.message = UTF8ToUTF16(message);
+  message_box_view_ = new views::MessageBoxView(params);
+
+  views::Widget::InitParams widget_params;
+  widget_params.delegate = this;
+  if (parent_window)
+    widget_params.parent = parent_window->GetNativeWindow();
+  widget_ = new views::Widget;
+  widget_->Init(widget_params);
+
+  widget_->Show();
+}
+
+MessageDialog::~MessageDialog() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// MessageDialog, private:
+
+bool MessageDialog::Dispatch(const base::NativeEvent& event) {
+  TranslateMessage(&event);
+  DispatchMessage(&event);
+  return !should_close_;
+}
+
+void MessageDialog::WindowClosing() {
+  should_close_ = true;
+}
+
+views::Widget* MessageDialog::GetWidget() {
+  return widget_;
+}
+
+const views::Widget* MessageDialog::GetWidget() const {
+  return widget_;
+}
+
+views::ClientView* MessageDialog::CreateClientView(views::Widget* widget) {
+  return new views::ClientView(widget, message_box_view_);
+}
+
+void MessageDialog::ButtonPressed(views::Button* sender,
+                                  const ui::Event& event) {
+}
+
+}  // namespace
+
 int ShowMessageBox(NativeWindow* parent_window,
                    MessageBoxType type,
                    const std::vector<std::string>& buttons,
                    const std::string& title,
                    const std::string& message,
                    const std::string& detail) {
+  MessageDialog dialog(parent_window, type, buttons, title, message, detail);
+  {
+    base::MessageLoop::ScopedNestableTaskAllower allow(
+        base::MessageLoopForUI::current());
+    base::RunLoop run_loop(&dialog);
+    run_loop.Run();
+  }
   return 0;
 }