tray_settings.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
1cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar// Use of this source code is governed by a BSD-style license that can be 3cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar// found in the LICENSE file. 4cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 5cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ash/system/chromeos/settings/tray_settings.h" 6cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 7cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ash/shell.h" 8cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ash/system/chromeos/power/power_status.h" 9cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ash/system/chromeos/power/power_status_view.h" 10cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ash/system/tray/actionable_view.h" 11cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ash/system/tray/fixed_sized_image_view.h" 12cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ash/system/tray/system_tray_delegate.h" 13cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ash/system/tray/tray_constants.h" 14cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "base/logging.h" 15cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "base/strings/utf_string_conversions.h" 16cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "grit/ash_resources.h" 17cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "grit/ash_strings.h" 18cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "third_party/skia/include/core/SkColor.h" 19cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ui/base/resource/resource_bundle.h" 20cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ui/gfx/image/image.h" 21cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ui/views/controls/image_view.h" 22cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ui/views/controls/label.h" 23cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ui/views/layout/box_layout.h" 24cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ui/views/layout/fill_layout.h" 25cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar#include "ui/views/view.h" 26cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 27cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarnamespace ash { 28cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarnamespace tray { 29cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 30cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarclass SettingsDefaultView : public ActionableView, 31cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar public PowerStatus::Observer { 32cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar public: 33cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar explicit SettingsDefaultView(user::LoginStatus status) 3488364df7b6429fa96bb5130ea73bd40b0629e30eEric Christopher : login_status_(status), 3588364df7b6429fa96bb5130ea73bd40b0629e30eEric Christopher label_(NULL), 3688364df7b6429fa96bb5130ea73bd40b0629e30eEric Christopher power_status_view_(NULL) { 37cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar PowerStatus::Get()->AddObserver(this); 38cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 39cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar ash::kTrayPopupPaddingHorizontal, 0, 40cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar ash::kTrayPopupPaddingBetweenItems)); 41cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 42cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar bool power_view_right_align = false; 43cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar if (login_status_ != user::LOGGED_IN_NONE && 44cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar login_status_ != user::LOGGED_IN_LOCKED) { 45cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 46cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar views::ImageView* icon = 47cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar new ash::FixedSizedImageView(0, ash::kTrayPopupItemHeight); 48cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar icon->SetImage( 49cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar rb.GetImageNamed(IDR_AURA_UBER_TRAY_SETTINGS).ToImageSkia()); 50cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar icon->set_id(test::kSettingsTrayItemViewId); 51cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar AddChildView(icon); 52cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 53cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar base::string16 text = rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_SETTINGS); 54cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar label_ = new views::Label(text); 55cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar AddChildView(label_); 56cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar SetAccessibleName(text); 57cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 58cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar power_view_right_align = true; 59cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar } 60cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 61cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar if (PowerStatus::Get()->IsBatteryPresent()) { 62cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar power_status_view_ = new ash::PowerStatusView( 63cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar ash::PowerStatusView::VIEW_DEFAULT, power_view_right_align); 64cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar AddChildView(power_status_view_); 65cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar OnPowerStatusChanged(); 66cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar } 67cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar } 68cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 69cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar virtual ~SettingsDefaultView() { 70cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar PowerStatus::Get()->RemoveObserver(this); 71cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar } 72cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 73cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar // Overridden from ash::ActionableView. 74cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar virtual bool PerformAction(const ui::Event& event) OVERRIDE { 75cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar if (login_status_ == user::LOGGED_IN_NONE || 76cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar login_status_ == user::LOGGED_IN_LOCKED) 77cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar return false; 78cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 79cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar ash::Shell::GetInstance()->system_tray_delegate()->ShowSettings(); 80cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar return true; 81cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar } 82cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 83cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar // Overridden from views::View. 84cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar virtual void Layout() OVERRIDE { 85cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar views::View::Layout(); 86cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 87cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar if (label_ && power_status_view_) { 88cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar // Let the box-layout do the layout first. Then move power_status_view_ 89cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar // to right align if it is created. 90cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar gfx::Size size = power_status_view_->GetPreferredSize(); 91cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar gfx::Rect bounds(size); 92cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar bounds.set_x(width() - size.width() - ash::kTrayPopupPaddingBetweenItems); 93cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar bounds.set_y((height() - size.height()) / 2); 94cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar power_status_view_->SetBoundsRect(bounds); 95cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar } 96cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar } 97cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 98cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar // Overridden from views::View. 99cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE { 100cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar views::View::ChildPreferredSizeChanged(child); 101cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar Layout(); 102cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar } 103cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 104cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar // Overridden from PowerStatus::Observer. 105cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar virtual void OnPowerStatusChanged() OVERRIDE { 106cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar if (!PowerStatus::Get()->IsBatteryPresent()) 107cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar return; 108cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 109cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar base::string16 accessible_name = label_ ? 110cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar label_->text() + base::ASCIIToUTF16(", ") + 111cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar PowerStatus::Get()->GetAccessibleNameString() : 112cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar PowerStatus::Get()->GetAccessibleNameString(); 113cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar SetAccessibleName(accessible_name); 114cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar } 115cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 116cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar private: 117cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar user::LoginStatus login_status_; 118cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar views::Label* label_; 119cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar ash::PowerStatusView* power_status_view_; 120cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 121cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar DISALLOW_COPY_AND_ASSIGN(SettingsDefaultView); 122cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar }; 123cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 124cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar} // namespace tray 125cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 126cabc7af293504ad256d2203ae88ee11cbc34c2edErick TryzelaarTraySettings::TraySettings(SystemTray* system_tray) 127cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar : SystemTrayItem(system_tray), 128cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar default_view_(NULL) { 129cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar} 130cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 131cabc7af293504ad256d2203ae88ee11cbc34c2edErick TryzelaarTraySettings::~TraySettings() { 132cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar} 133cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 134cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarviews::View* TraySettings::CreateTrayView(user::LoginStatus status) { 135cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar return NULL; 136cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar} 137cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 138cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarviews::View* TraySettings::CreateDefaultView(user::LoginStatus status) { 139cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar if ((status == user::LOGGED_IN_NONE || status == user::LOGGED_IN_LOCKED) && 140cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar !PowerStatus::Get()->IsBatteryPresent()) 141cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar return NULL; 142cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar if (!ash::Shell::GetInstance()->system_tray_delegate()->ShouldShowSettings()) 143cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar return NULL; 144cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar CHECK(default_view_ == NULL); 145cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar default_view_ = new tray::SettingsDefaultView(status); 146cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar return default_view_; 147cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar} 148cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 149cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarviews::View* TraySettings::CreateDetailedView(user::LoginStatus status) { 150cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar NOTIMPLEMENTED(); 151cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar return NULL; 152cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar} 153cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 154cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarvoid TraySettings::DestroyTrayView() { 155cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar} 156cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 157cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarvoid TraySettings::DestroyDefaultView() { 158cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar default_view_ = NULL; 159cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar} 160cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 161cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarvoid TraySettings::DestroyDetailedView() { 162cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar} 163cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 164cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaarvoid TraySettings::UpdateAfterLoginStatusChange(user::LoginStatus status) { 165cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar} 166cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar 167cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar} // namespace ash 168cabc7af293504ad256d2203ae88ee11cbc34c2edErick Tryzelaar