// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ash/system/chromeos/rotation/tray_rotation_lock.h" #include "ash/shell.h" #include "ash/system/tray/system_tray.h" #include "ash/system/tray/tray_item_more.h" #include "ash/wm/maximize_mode/maximize_mode_controller.h" #include "grit/ash_resources.h" #include "grit/ash_strings.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/display.h" namespace ash { namespace tray { // Extends TrayItemMore, however does not make use of the chevron, nor of the // DetailedView. This was chosen over ActionableView in order to reuse the // layout and styling of labels and images. This allows RotationLockDefaultView // to maintain the look of other system tray items without code duplication. class RotationLockDefaultView : public TrayItemMore, public ShellObserver { public: explicit RotationLockDefaultView(SystemTrayItem* owner); virtual ~RotationLockDefaultView(); // ActionableView: virtual bool PerformAction(const ui::Event& event) OVERRIDE; // ShellObserver: virtual void OnMaximizeModeStarted() OVERRIDE; virtual void OnMaximizeModeEnded() OVERRIDE; private: void UpdateImage(); DISALLOW_COPY_AND_ASSIGN(RotationLockDefaultView); }; RotationLockDefaultView::RotationLockDefaultView(SystemTrayItem* owner) : TrayItemMore(owner, false) { UpdateImage(); SetVisible(Shell::GetInstance()->maximize_mode_controller()-> IsMaximizeModeWindowManagerEnabled()); Shell::GetInstance()->AddShellObserver(this); } RotationLockDefaultView::~RotationLockDefaultView() { Shell::GetInstance()->RemoveShellObserver(this); } bool RotationLockDefaultView::PerformAction(const ui::Event& event) { MaximizeModeController* maximize_mode_controller = Shell::GetInstance()-> maximize_mode_controller(); maximize_mode_controller->SetRotationLocked( !maximize_mode_controller->rotation_locked()); UpdateImage(); return true; } void RotationLockDefaultView::OnMaximizeModeStarted() { UpdateImage(); SetVisible(true); } void RotationLockDefaultView::OnMaximizeModeEnded() { SetVisible(false); } void RotationLockDefaultView::UpdateImage() { base::string16 label; ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); if (Shell::GetInstance()->maximize_mode_controller()->rotation_locked()) { SetImage(bundle.GetImageNamed( IDR_AURA_UBER_TRAY_AUTO_ROTATION_LOCKED_DARK).ToImageSkia()); label = l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ROTATION_LOCK_LOCKED); SetLabel(label); SetAccessibleName(label); } else { SetImage(bundle.GetImageNamed(IDR_AURA_UBER_TRAY_AUTO_ROTATION_DARK). ToImageSkia()); label = l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ROTATION_LOCK_AUTO); SetLabel(label); SetAccessibleName(label); } } } // namespace tray TrayRotationLock::TrayRotationLock(SystemTray* system_tray) : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_AUTO_ROTATION_LOCKED), on_primary_display_(false) { gfx::NativeView native_view = system_tray->GetWidget()->GetNativeView(); gfx::Display parent_display = Shell::GetScreen()-> GetDisplayNearestWindow(native_view); on_primary_display_ = parent_display.IsInternal(); if (on_primary_display_) Shell::GetInstance()->AddShellObserver(this); } TrayRotationLock::~TrayRotationLock() { if (on_primary_display_) Shell::GetInstance()->RemoveShellObserver(this); } void TrayRotationLock::OnRotationLockChanged(bool rotation_locked) { tray_view()->SetVisible(ShouldBeVisible()); } views::View* TrayRotationLock::CreateDefaultView(user::LoginStatus status) { if (on_primary_display_) return new tray::RotationLockDefaultView(this); return NULL; } void TrayRotationLock::OnMaximizeModeStarted() { tray_view()->SetVisible( Shell::GetInstance()->maximize_mode_controller()->rotation_locked()); Shell::GetInstance()->maximize_mode_controller()->AddObserver(this); } void TrayRotationLock::OnMaximizeModeEnded() { tray_view()->SetVisible(false); Shell::GetInstance()->maximize_mode_controller()->RemoveObserver(this); } bool TrayRotationLock::GetInitialVisibility() { return ShouldBeVisible(); } bool TrayRotationLock::ShouldBeVisible() { MaximizeModeController* controller = Shell::GetInstance()-> maximize_mode_controller(); return on_primary_display_ && controller->IsMaximizeModeWindowManagerEnabled() && controller->rotation_locked(); } } // namespace ash