1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/examples/keyboard/keyboard_view.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <algorithm>
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/string16.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/utf_string_conversions.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/examples/keyboard/keyboard_delegate.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/examples/keyboard/keys.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/keycodes/keyboard_code_conversion.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/keycodes/keyboard_codes.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/canvas.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/background.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/controls/button/label_button.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/controls/button/label_button_border.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace mojo {
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace examples {
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int kHorizontalPadding = 6;
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int kVerticalPadding = 8;
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::string16 GetDisplayString(int key_code, int flags) {
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return base::string16(1, ui::GetCharacterFromKeyCode(
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            static_cast<ui::KeyboardCode>(key_code), flags));
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Returns a font that fits in the space provided. |text| is used as a basis
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// for determing the size.
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::FontList CalculateFont(int width, int height, const base::string16& text) {
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::FontList font;
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::FontList last_font;
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  while (gfx::Canvas::GetStringWidth(text, font) < width &&
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         font.GetHeight() < height) {
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    last_font = font;
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    font = font.DeriveWithSizeDelta(2);
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return last_font;
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Returns the total number of keys in |rows|.
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint NumKeys(const std::vector<const Row*>& rows) {
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int result = 0;
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (size_t i = 0; i < rows.size(); ++i)
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    result += static_cast<int>(rows[i]->num_keys);
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return result;
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
56116680a4aac90f2aa7413d9095a592090648e557Ben MurdochKeyboardView::KeyboardView(KeyboardDelegate* delegate)
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : delegate_(delegate),
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      max_keys_in_row_(0),
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      keyboard_layout_(KEYBOARD_LAYOUT_ALPHA) {
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  set_background(views::Background::CreateSolidBackground(SK_ColorBLACK));
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetRows(GetQWERTYRows());
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
64116680a4aac90f2aa7413d9095a592090648e557Ben MurdochKeyboardView::~KeyboardView() {
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KeyboardView::Layout() {
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (width() == 0 || height() == 0 || rows_.empty() ||
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      last_layout_size_ == bounds().size())
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  last_layout_size_ = bounds().size();
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const int button_width =
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      (width() - (max_keys_in_row_ - 1) * kHorizontalPadding) /
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      max_keys_in_row_;
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const int button_height =
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      (height() - (static_cast<int>(rows_.size() - 1) * kVerticalPadding)) /
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      static_cast<int>(rows_.size());
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const int initial_x = (width() - button_width * max_keys_in_row_ -
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         kHorizontalPadding * (max_keys_in_row_ - 1)) / 2;
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (size_t i = 0; i < rows_.size(); ++i) {
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    LayoutRow(*(rows_[i]), static_cast<int>(i), initial_x, button_width,
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              button_height);
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::LabelButtonBorder border(views::Button::STYLE_TEXTBUTTON);
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::Insets insets(border.GetInsets());
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::FontList font = CalculateFont(button_width - insets.width(),
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     button_height - insets.height(),
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     base::ASCIIToUTF16("W"));
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::FontList special_font = CalculateFont(button_width - insets.width(),
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                             button_height - insets.height(),
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                             base::ASCIIToUTF16("?123"));
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  button_font_ = font;
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ResetFonts(font, special_font);
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KeyboardView::SetLayout(KeyboardLayout keyboard_layout) {
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (keyboard_layout_ == keyboard_layout)
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  keyboard_layout_ = keyboard_layout;
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  last_layout_size_ = gfx::Size();
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (keyboard_layout_ == KEYBOARD_LAYOUT_NUMERIC)
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SetRows(GetNumericRows());
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  else
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SetRows(GetQWERTYRows());
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Layout();
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SchedulePaint();
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KeyboardView::LayoutRow(const Row& row,
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             int row_index,
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             int initial_x,
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             int button_width,
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             int button_height) {
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int x = initial_x + row.padding * (button_width + kHorizontalPadding);
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const int y = row_index * (button_height + kVerticalPadding);
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (size_t i = 0; i < row.num_keys; ++i) {
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    views::View* button = GetButton(row_index, static_cast<int>(i));
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int actual_width = button_width;
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (row.keys[i].size > 1) {
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      actual_width = (button_width + kHorizontalPadding) *
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          row.keys[i].size - kHorizontalPadding;
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    button->SetBounds(x, y, actual_width, button_height);
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    x += actual_width + kHorizontalPadding;
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KeyboardView::SetRows(const std::vector<const Row*>& rows) {
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const int num_keys = NumKeys(rows);
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  while (child_count() > num_keys)
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    delete child_at(child_count() - 1);
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (int i = child_count(); i < num_keys; ++i)
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AddChildView(CreateButton());
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  last_layout_size_ = gfx::Size();
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  rows_ = rows;
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  max_keys_in_row_ = 0;
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (size_t i = 0; i < rows_.size(); ++i) {
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    max_keys_in_row_ = std::max(max_keys_in_row_,
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                static_cast<int>(rows_[i]->num_keys));
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ConfigureButtonsInRow(static_cast<int>(i), *rows_[i]);
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KeyboardView::ConfigureButtonsInRow(int row_index, const Row& row) {
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (size_t i = 0; i < row.num_keys; ++i) {
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    views::LabelButton* button = GetButton(row_index, static_cast<int>(i));
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const Key& key(row.keys[i]);
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    switch (key.display_code) {
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case SPECIAL_KEY_SHIFT:
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        // TODO: need image.
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        button->SetText(base::string16());
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case SPECIAL_KEY_NUMERIC:
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        button->SetText(base::ASCIIToUTF16("?123"));
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case SPECIAL_KEY_ALPHA:
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        button->SetText(base::ASCIIToUTF16("ABC"));
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      default:
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        button->SetText(GetDisplayString(key.display_code,
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                         key.event_flags | event_flags()));
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    button->SetState(views::Button::STATE_NORMAL);
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdochviews::View* KeyboardView::CreateButton() {
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::LabelButton* button = new views::LabelButton(this, base::string16());
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  button->SetTextColor(views::Button::STATE_NORMAL, SK_ColorWHITE);
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  button->SetHorizontalAlignment(gfx::ALIGN_CENTER);
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  button->set_background(views::Background::CreateSolidBackground(78, 78, 78));
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  button->SetFontList(button_font_);
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //  button->SetHaloColor(SK_ColorBLACK);
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Turn off animations as we reuse buttons in different layouts. If we didn't
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // do this and you click a button to change the layout then the button you
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // clicked on would animate the transition even though it may now represent a
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // different key.
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  button->SetAnimationDuration(0);
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return button;
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdochviews::LabelButton* KeyboardView::GetButton(int row, int column) {
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int offset = column;
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (int i = 0; i < row; ++i)
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    offset += static_cast<int>(rows_[i]->num_keys);
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return static_cast<views::LabelButton*>(child_at(offset));
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst Key& KeyboardView::GetKeyForButton(views::Button* button) const {
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int index = GetIndexOf(button);
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK_NE(-1, index);
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int row = 0;
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  while (index >= static_cast<int>(rows_[row]->num_keys)) {
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    index -= static_cast<int>(rows_[row]->num_keys);
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    row++;
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return rows_[row]->keys[index];
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KeyboardView::ResetFonts(const gfx::FontList& button_font,
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              const gfx::FontList& special_font) {
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (size_t i = 0; i < rows_.size(); ++i) {
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    for (size_t j = 0; j < rows_[i]->num_keys; ++j) {
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      views::LabelButton* button = GetButton(static_cast<int>(i),
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                             static_cast<int>(j));
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const Key& key(GetKeyForButton(button));
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      switch (key.display_code) {
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        case SPECIAL_KEY_ALPHA:
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        case SPECIAL_KEY_NUMERIC:
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          button->SetFontList(special_font);
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          break;
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        default:
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          button->SetFontList(button_font);
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          break;
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      }
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KeyboardView::ButtonPressed(views::Button* sender,
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 const ui::Event& event) {
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const Key& key(GetKeyForButton(sender));
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  switch (key.display_code) {
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case SPECIAL_KEY_SHIFT:
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      SetLayout((keyboard_layout_ == KEYBOARD_LAYOUT_SHIFT) ?
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                KEYBOARD_LAYOUT_ALPHA : KEYBOARD_LAYOUT_SHIFT);
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return;
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case SPECIAL_KEY_ALPHA:
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      SetLayout(KEYBOARD_LAYOUT_ALPHA);
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return;
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case SPECIAL_KEY_NUMERIC:
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      SetLayout(KEYBOARD_LAYOUT_NUMERIC);
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return;
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    default:
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Windows isn't happy if we pass in the flags used to get the display string.
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN)
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int key_event_flags = 0;
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int key_event_flags = key.event_flags;
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  delegate_->OnKeyPressed(key.keyboard_code(), key_event_flags | event_flags());
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace examples
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace mojo
257