• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
27 namespace {
28 struct 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 
KeyboardOverlayDialogView(Profile * profile,HtmlDialogUIDelegate * delegate,BrowserView * parent_view)40 KeyboardOverlayDialogView::KeyboardOverlayDialogView(
41     Profile* profile,
42     HtmlDialogUIDelegate* delegate,
43     BrowserView* parent_view)
44     : HtmlDialogView(profile, delegate),
45       parent_view_(parent_view) {
46 }
47 
~KeyboardOverlayDialogView()48 KeyboardOverlayDialogView::~KeyboardOverlayDialogView() {
49 }
50 
InitDialog()51 void 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 
AcceleratorPressed(const views::Accelerator & accelerator)89 bool 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 
ShowDialog(gfx::NativeWindow owning_window,BrowserView * parent_view)98 void 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 
IsCloseAccelerator(const views::Accelerator & accelerator)115 bool KeyboardOverlayDialogView::IsCloseAccelerator(
116     const views::Accelerator& accelerator) {
117   return close_accelerators_.find(accelerator) != close_accelerators_.end();
118 }
119