tray_caps_lock.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/system/chromeos/tray_caps_lock.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/metrics/user_metrics_recorder.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/actionable_view.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/fixed_sized_image_view.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chromeos/ime/input_method_manager.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chromeos/ime/xkeyboard.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool CapsLockIsEnabled() { 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chromeos::input_method::InputMethodManager* ime = 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chromeos::input_method::InputMethodManager::Get(); 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return (ime && ime->GetXKeyboard()) ? ime->GetXKeyboard()->CapsLockIsEnabled() 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : false; 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CapsLockDefaultView : public ActionableView { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapsLockDefaultView() 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : text_label_(new views::Label), 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shortcut_label_(new views::Label) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTrayPopupPaddingHorizontal, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTrayPopupPaddingBetweenItems)); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FixedSizedImageView* image = 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new FixedSizedImageView(0, kTrayPopupItemHeight); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image->SetImage(bundle.GetImageNamed(IDR_AURA_UBER_TRAY_CAPS_LOCK_DARK). 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ToImageSkia()); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(image); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(text_label_); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shortcut_label_->SetEnabled(false); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(shortcut_label_); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~CapsLockDefaultView() {} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates the label text and the shortcut text. 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void Update(bool caps_lock_enabled) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int text_string_id = caps_lock_enabled ? 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_ASH_STATUS_TRAY_CAPS_LOCK_ENABLED : 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_ASH_STATUS_TRAY_CAPS_LOCK_DISABLED; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_label_->SetText(bundle.GetLocalizedString(text_string_id)); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int shortcut_string_id = 0; 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool search_mapped_to_caps_lock = Shell::GetInstance()-> 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) system_tray_delegate()->IsSearchKeyMappedToCapsLock(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (caps_lock_enabled) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shortcut_string_id = search_mapped_to_caps_lock ? 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_ASH_STATUS_TRAY_CAPS_LOCK_SHORTCUT_SEARCH_OR_SHIFT : 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_ASH_STATUS_TRAY_CAPS_LOCK_SHORTCUT_ALT_SEARCH_OR_SHIFT; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shortcut_string_id = search_mapped_to_caps_lock ? 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_ASH_STATUS_TRAY_CAPS_LOCK_SHORTCUT_SEARCH : 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_ASH_STATUS_TRAY_CAPS_LOCK_SHORTCUT_ALT_SEARCH; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shortcut_label_->SetText(bundle.GetLocalizedString(shortcut_string_id)); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layout(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::View: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Layout() OVERRIDE { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View::Layout(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Align the shortcut text with the right end 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int old_x = shortcut_label_->x(); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int new_x = 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) width() - shortcut_label_->width() - kTrayPopupPaddingHorizontal; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shortcut_label_->SetX(new_x); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size text_size = text_label_->size(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_label_->SetSize(gfx::Size(text_size.width() + new_x - old_x, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_size.height())); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE { 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state->role = ui::AX_ROLE_BUTTON; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->name = text_label_->text(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ActionableView: 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool PerformAction(const ui::Event& event) OVERRIDE { 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chromeos::input_method::XKeyboard* xkeyboard = 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chromeos::input_method::InputMethodManager::Get()->GetXKeyboard(); 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) xkeyboard->CapsLockIsEnabled() ? 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_CAPS_LOCK_DISABLED_BY_CLICK : 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_CAPS_LOCK_ENABLED_BY_CLICK); 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) xkeyboard->SetCapsLockEnabled(!xkeyboard->CapsLockIsEnabled()); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* text_label_; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* shortcut_label_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CapsLockDefaultView); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayCapsLock::TrayCapsLock(SystemTray* system_tray) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_CAPS_LOCK), 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_(NULL), 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detailed_(NULL), 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caps_lock_enabled_(CapsLockIsEnabled()), 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_shown_(false) { 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Make sure the event is processed by this before the IME. 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Shell::GetInstance()->PrependPreTargetHandler(this); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayCapsLock::~TrayCapsLock() { 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Shell::GetInstance()->RemovePreTargetHandler(this); 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TrayCapsLock::OnCapsLockChanged(bool enabled) { 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (tray_view()) 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) tray_view()->SetVisible(enabled); 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caps_lock_enabled_ = enabled; 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (default_) { 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) default_->Update(enabled); 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (enabled) { 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!message_shown_) { 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ash::UMA_STATUS_AREA_CAPS_LOCK_POPUP); 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PopupDetailedView(kTrayPopupAutoCloseDelayForTextInSeconds, false); 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) message_shown_ = true; 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else if (detailed_) { 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) detailed_->GetWidget()->Close(); 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TrayCapsLock::OnKeyEvent(ui::KeyEvent* key) { 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (key->type() == ui::ET_KEY_PRESSED && key->key_code() == ui::VKEY_CAPITAL) 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnCapsLockChanged(!caps_lock_enabled_); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TrayCapsLock::GetInitialVisibility() { 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return CapsLockIsEnabled(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayCapsLock::CreateDefaultView(user::LoginStatus status) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!caps_lock_enabled_) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(default_ == NULL); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_ = new CapsLockDefaultView; 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) default_->Update(caps_lock_enabled_); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayCapsLock::CreateDetailedView(user::LoginStatus status) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(detailed_ == NULL); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detailed_ = new views::View; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detailed_->SetLayoutManager(new 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::BoxLayout(views::BoxLayout::kHorizontal, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTrayPopupPaddingHorizontal, 10, kTrayPopupPaddingBetweenItems)); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::ImageView* image = new views::ImageView; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image->SetImage(bundle.GetImageNamed(IDR_AURA_UBER_TRAY_CAPS_LOCK_DARK). 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ToImageSkia()); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detailed_->AddChildView(image); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const int string_id = Shell::GetInstance()->system_tray_delegate()-> 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IsSearchKeyMappedToCapsLock() ? 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_ASH_STATUS_TRAY_CAPS_LOCK_CANCEL_BY_SEARCH : 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_ASH_STATUS_TRAY_CAPS_LOCK_CANCEL_BY_ALT_SEARCH; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* label = new views::Label(bundle.GetLocalizedString(string_id)); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label->SetMultiLine(true); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detailed_->AddChildView(label); 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Shell::GetInstance()->metrics()->RecordUserMetricsAction( 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::UMA_STATUS_AREA_CAPS_LOCK_DETAILED); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return detailed_; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayCapsLock::DestroyDefaultView() { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_ = NULL; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayCapsLock::DestroyDetailedView() { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detailed_ = NULL; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 221