tray_caps_lock.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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"
13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/sys_info.h"
14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chromeos/ime/ime_keyboard.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chromeos/ime/input_method_manager.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h"
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace {
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool CapsLockIsEnabled() {
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  chromeos::input_method::InputMethodManager* ime =
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      chromeos::input_method::InputMethodManager::Get();
32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return (ime && ime->GetImeKeyboard())
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch             ? ime->GetImeKeyboard()->CapsLockIsEnabled()
34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch             : 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 {
112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    chromeos::input_method::ImeKeyboard* keyboard =
113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        chromeos::input_method::InputMethodManager::Get()->GetImeKeyboard();
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (keyboard) {
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      Shell::GetInstance()->metrics()->RecordUserMetricsAction(
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          keyboard->CapsLockIsEnabled() ?
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          ash::UMA_STATUS_AREA_CAPS_LOCK_DISABLED_BY_CLICK :
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          ash::UMA_STATUS_AREA_CAPS_LOCK_ENABLED_BY_CLICK);
119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      keyboard->SetCapsLockEnabled(!keyboard->CapsLockIsEnabled());
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Label* text_label_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Label* shortcut_label_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CapsLockDefaultView);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayCapsLock::TrayCapsLock(SystemTray* system_tray)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_CAPS_LOCK),
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_(NULL),
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      detailed_(NULL),
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      caps_lock_enabled_(CapsLockIsEnabled()),
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      message_shown_(false) {
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  chromeos::input_method::InputMethodManager* ime =
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      chromeos::input_method::InputMethodManager::Get();
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (ime && ime->GetImeKeyboard())
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ime->GetImeKeyboard()->AddObserver(this);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayCapsLock::~TrayCapsLock() {
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  chromeos::input_method::InputMethodManager* ime =
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      chromeos::input_method::InputMethodManager::Get();
145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (ime && ime->GetImeKeyboard())
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ime->GetImeKeyboard()->RemoveObserver(this);
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TrayCapsLock::OnCapsLockChanged(bool enabled) {
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  caps_lock_enabled_ = enabled;
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
152a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (tray_view())
153a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    tray_view()->SetVisible(caps_lock_enabled_);
154a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (default_) {
156a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    default_->Update(caps_lock_enabled_);
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
158a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (caps_lock_enabled_) {
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (!message_shown_) {
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        Shell::GetInstance()->metrics()->RecordUserMetricsAction(
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            ash::UMA_STATUS_AREA_CAPS_LOCK_POPUP);
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        PopupDetailedView(kTrayPopupAutoCloseDelayForTextInSeconds, false);
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        message_shown_ = true;
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      }
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    } else if (detailed_) {
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      detailed_->GetWidget()->Close();
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TrayCapsLock::GetInitialVisibility() {
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return CapsLockIsEnabled();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayCapsLock::CreateDefaultView(user::LoginStatus status) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!caps_lock_enabled_)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(default_ == NULL);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = new CapsLockDefaultView;
180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  default_->Update(caps_lock_enabled_);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return default_;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TrayCapsLock::CreateDetailedView(user::LoginStatus status) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(detailed_ == NULL);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  detailed_ = new views::View;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  detailed_->SetLayoutManager(new
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      views::BoxLayout(views::BoxLayout::kHorizontal,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTrayPopupPaddingHorizontal, 10, kTrayPopupPaddingBetweenItems));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ImageView* image = new views::ImageView;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image->SetImage(bundle.GetImageNamed(IDR_AURA_UBER_TRAY_CAPS_LOCK_DARK).
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ToImageSkia());
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  detailed_->AddChildView(image);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const int string_id = Shell::GetInstance()->system_tray_delegate()->
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            IsSearchKeyMappedToCapsLock() ?
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_ASH_STATUS_TRAY_CAPS_LOCK_CANCEL_BY_SEARCH :
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_ASH_STATUS_TRAY_CAPS_LOCK_CANCEL_BY_ALT_SEARCH;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Label* label = new views::Label(bundle.GetLocalizedString(string_id));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  label->SetMultiLine(true);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  detailed_->AddChildView(label);
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Shell::GetInstance()->metrics()->RecordUserMetricsAction(
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ash::UMA_STATUS_AREA_CAPS_LOCK_DETAILED);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return detailed_;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayCapsLock::DestroyDefaultView() {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_ = NULL;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayCapsLock::DestroyDetailedView() {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  detailed_ = NULL;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
222