1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/views/keyboard_overlay_dialog_view.h"
6
7#include "chrome/browser/chromeos/frame/bubble_window.h"
8#include "chrome/browser/ui/browser_dialogs.h"
9#include "chrome/browser/ui/views/accelerator_table_gtk.h"
10#include "chrome/browser/ui/views/frame/browser_view.h"
11#include "chrome/browser/ui/views/keyboard_overlay_delegate.h"
12#include "chrome/browser/ui/views/window.h"
13#include "content/browser/tab_contents/tab_contents.h"
14#include "content/common/native_web_keyboard_event.h"
15#include "grit/generated_resources.h"
16#include "ui/base/keycodes/keyboard_codes.h"
17#include "ui/base/l10n/l10n_util.h"
18#include "views/events/event.h"
19#include "views/widget/root_view.h"
20#include "views/widget/widget.h"
21#include "views/window/window.h"
22
23#if defined(OS_LINUX)
24#include "views/window/window_gtk.h"
25#endif
26
27namespace {
28struct Accelerator {
29  ui::KeyboardCode keycode;
30  bool shift_pressed;
31  bool ctrl_pressed;
32  bool alt_pressed;
33} kCloseAccelerators[] = {
34  {ui::VKEY_OEM_2, false, true, true},
35  {ui::VKEY_OEM_2, true, true, true},
36  {ui::VKEY_ESCAPE, true, false, false},
37};
38}  // namespace
39
40KeyboardOverlayDialogView::KeyboardOverlayDialogView(
41    Profile* profile,
42    HtmlDialogUIDelegate* delegate,
43    BrowserView* parent_view)
44    : HtmlDialogView(profile, delegate),
45      parent_view_(parent_view) {
46}
47
48KeyboardOverlayDialogView::~KeyboardOverlayDialogView() {
49}
50
51void KeyboardOverlayDialogView::InitDialog() {
52  DOMView::Init(profile(), NULL);
53
54  tab_contents_->set_delegate(this);
55
56  // Set the delegate. This must be done before loading the page. See
57  // the comment above HtmlDialogUI in its header file for why.
58  HtmlDialogUI::GetPropertyAccessor().SetProperty(tab_contents_->property_bag(),
59                                                  this);
60
61  for (size_t i = 0; i < arraysize(kCloseAccelerators); ++i) {
62    views::Accelerator accelerator(kCloseAccelerators[i].keycode,
63                                   kCloseAccelerators[i].shift_pressed,
64                                   kCloseAccelerators[i].ctrl_pressed,
65                                   kCloseAccelerators[i].alt_pressed);
66    close_accelerators_.insert(accelerator);
67    AddAccelerator(accelerator);
68  }
69
70  for (size_t i = 0; i < browser::kAcceleratorMapLength; ++i) {
71    views::Accelerator accelerator(browser::kAcceleratorMap[i].keycode,
72                                   browser::kAcceleratorMap[i].shift_pressed,
73                                   browser::kAcceleratorMap[i].ctrl_pressed,
74                                   browser::kAcceleratorMap[i].alt_pressed);
75    // Skip a sole ALT key since it's handled on the keyboard overlay.
76    if (views::Accelerator(ui::VKEY_MENU, false, false, false) == accelerator) {
77      continue;
78    }
79    // Skip accelerators for closing the dialog since they are already added.
80    if (IsCloseAccelerator(accelerator)) {
81      continue;
82    }
83    AddAccelerator(accelerator);
84  }
85
86  DOMView::LoadURL(GetDialogContentURL());
87}
88
89bool KeyboardOverlayDialogView::AcceleratorPressed(
90    const views::Accelerator& accelerator) {
91  if (!IsCloseAccelerator(accelerator)) {
92    parent_view_->AcceleratorPressed(accelerator);
93  }
94  OnDialogClosed(std::string());
95  return true;
96}
97
98void KeyboardOverlayDialogView::ShowDialog(
99    gfx::NativeWindow owning_window, BrowserView* parent_view) {
100  KeyboardOverlayDelegate* delegate = new KeyboardOverlayDelegate(
101      UTF16ToWide(l10n_util::GetStringUTF16(IDS_KEYBOARD_OVERLAY_TITLE)));
102  KeyboardOverlayDialogView* html_view =
103      new KeyboardOverlayDialogView(parent_view->browser()->profile(),
104                                    delegate,
105                                    parent_view);
106  delegate->set_view(html_view);
107  html_view->InitDialog();
108  chromeos::BubbleWindow::Create(owning_window,
109                                 gfx::Rect(),
110                                 chromeos::BubbleWindow::STYLE_XSHAPE,
111                                 html_view);
112  html_view->window()->Show();
113}
114
115bool KeyboardOverlayDialogView::IsCloseAccelerator(
116    const views::Accelerator& accelerator) {
117  return close_accelerators_.find(accelerator) != close_accelerators_.end();
118}
119