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