1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/system/chromeos/virtual_keyboard/virtual_keyboard_tray.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ash/shelf/shelf.h" 8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/shelf/shelf_constants.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/shell.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/system/status_area_widget.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/system/tray/tray_constants.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/system/tray/tray_utils.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "grit/ash_resources.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "grit/ash_strings.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/event.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/keyboard/keyboard_controller.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/controls/button/image_button.h" 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace ash { 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)VirtualKeyboardTray::VirtualKeyboardTray(StatusAreaWidget* status_area_widget) 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : TrayBackgroundView(status_area_widget), 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) button_(NULL) { 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) button_ = new views::ImageButton(this); 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) button_->SetImage(views::CustomButton::STATE_NORMAL, 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_UBER_TRAY_VIRTUAL_KEYBOARD)); 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) button_->SetImageAlignment(views::ImageButton::ALIGN_CENTER, 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::ImageButton::ALIGN_MIDDLE); 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) tray_container()->AddChildView(button_); 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetContentsBackground(); 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The Shell may not exist in some unit tests. 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (Shell::HasInstance()) { 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Shell::GetInstance()->system_tray_notifier()-> 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AddAccessibilityObserver(this); 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)VirtualKeyboardTray::~VirtualKeyboardTray() { 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The Shell may not exist in some unit tests. 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (Shell::HasInstance()) { 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Shell::GetInstance()->system_tray_notifier()-> 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RemoveAccessibilityObserver(this); 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void VirtualKeyboardTray::SetShelfAlignment(ShelfAlignment alignment) { 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TrayBackgroundView::SetShelfAlignment(alignment); 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) tray_container()->SetBorder(views::Border::NullBorder()); 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Pad button size to align with other controls in the system tray. 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const gfx::ImageSkia image = button_->GetImage( 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) views::CustomButton::STATE_NORMAL); 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int top_padding = (kTrayBarButtonWidth - image.height()) / 2; 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int left_padding = (kTrayBarButtonWidth - image.width()) / 2; 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int bottom_padding = kTrayBarButtonWidth - image.height() - top_padding; 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int right_padding = kTrayBarButtonWidth - image.width() - left_padding; 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Square up the padding if horizontally aligned. Avoid extra padding when 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // vertically aligned as the button would violate the width constraint on the 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // shelf. 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (alignment == SHELF_ALIGNMENT_BOTTOM || alignment == SHELF_ALIGNMENT_TOP) { 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gfx::Insets insets = button_->GetInsets(); 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int additional_padding = std::max(0, top_padding - left_padding); 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) left_padding += additional_padding; 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) right_padding += additional_padding; 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) button_->SetBorder(views::Border::CreateEmptyBorder( 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) top_padding, 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) left_padding, 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bottom_padding, 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) right_padding)); 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)base::string16 VirtualKeyboardTray::GetAccessibleNameForTray() { 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return l10n_util::GetStringUTF16( 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDS_ASH_VIRTUAL_KEYBOARD_TRAY_ACCESSIBLE_NAME); 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void VirtualKeyboardTray::HideBubbleWithView( 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const views::TrayBubbleView* bubble_view) { 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool VirtualKeyboardTray::ClickedOutsideBubble() { 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool VirtualKeyboardTray::PerformAction(const ui::Event& event) { 950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch keyboard::KeyboardController::GetInstance()->ShowKeyboard(true); 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void VirtualKeyboardTray::ButtonPressed(views::Button* sender, 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ui::Event& event) { 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK_EQ(button_, sender); 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PerformAction(event); 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void VirtualKeyboardTray::OnAccessibilityModeChanged( 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AccessibilityNotificationVisibility notify) { 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetVisible(Shell::GetInstance()->accessibility_delegate()-> 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IsVirtualKeyboardEnabled()); 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace ash 112