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