[Win] Add key bindings for message box.
authorCheng Zhao <zcbenz@gmail.com>
Thu, 25 Jul 2013 13:04:33 +0000 (21:04 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Thu, 25 Jul 2013 13:04:33 +0000 (21:04 +0800)
browser/message_box_win.cc

index b333a64..ccb6da5 100644 (file)
@@ -21,6 +21,10 @@ namespace atom {
 
 namespace {
 
+// The group used by the buttons.  This name is chosen voluntarily big not to
+// conflict with other groups that could be in the dialog content.
+const int kButtonGroup = 1127;
+
 class MessageDialog : public base::MessageLoop::Dispatcher,
                       public views::WidgetDelegate,
                       public views::View,
@@ -46,11 +50,13 @@ class MessageDialog : public base::MessageLoop::Dispatcher,
   virtual views::Widget* GetWidget() OVERRIDE;
   virtual const views::Widget* GetWidget() const OVERRIDE;
   virtual views::View* GetContentsView() OVERRIDE;
+  virtual views::View* GetInitiallyFocusedView() OVERRIDE;
   virtual ui::ModalType GetModalType() const OVERRIDE;
 
   // Overridden from views::View:
   virtual gfx::Size GetPreferredSize() OVERRIDE;
   virtual void Layout() OVERRIDE;
+  virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE;
 
   // Overridden from views::ButtonListener:
   virtual void ButtonPressed(views::Button* sender,
@@ -94,20 +100,28 @@ MessageDialog::MessageDialog(NativeWindow* parent_window,
     button->set_tag(i);
     button->set_min_size(gfx::Size(60, 20));
     button->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON);
+    button->SetGroup(kButtonGroup);
 
     buttons_.push_back(button);
     AddChildView(button);
   }
+
+  // First button is always default button.
   buttons_[0]->SetIsDefault(true);
+  buttons_[0]->AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE));
 
   views::Widget::InitParams widget_params;
   widget_params.delegate = this;
+  widget_params.top_level = true;
   if (parent_window)
     widget_params.parent = parent_window->GetNativeWindow();
   widget_ = new views::Widget;
   widget_->set_frame_type(views::Widget::FRAME_TYPE_FORCE_NATIVE);
   widget_->Init(widget_params);
 
+  // Bind to ESC.
+  AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE));
+
   set_background(views::Background::CreateSolidBackground(
         skia::COLORREFToSkColor(GetSysColor(COLOR_WINDOW))));
   widget_->Show();
@@ -145,6 +159,13 @@ views::View* MessageDialog::GetContentsView() {
   return this;
 }
 
+views::View* MessageDialog::GetInitiallyFocusedView() {
+  if (buttons_.size() > 0)
+    return buttons_[0];
+  else
+    return this;
+}
+
 ui::ModalType MessageDialog::GetModalType() const {
   return ui::MODAL_TYPE_WINDOW;
 }
@@ -187,6 +208,12 @@ void MessageDialog::Layout() {
                                bounds.height() - height);
 }
 
+bool MessageDialog::AcceleratorPressed(const ui::Accelerator& accelerator) {
+  DCHECK_EQ(accelerator.key_code(), ui::VKEY_ESCAPE);
+  widget_->Close();
+  return true;
+}
+
 void MessageDialog::ButtonPressed(views::Button* sender,
                                   const ui::Event& event) {
   result_ = sender->tag();