overview_button_tray.cc revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/system/overview/overview_button_tray.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/shelf/shelf_types.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/shell.h" 9e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "ash/system/tray/system_tray_delegate.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/system/tray/tray_utils.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/wm/overview/window_selector_controller.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "grit/ash_resources.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "grit/ash_strings.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/border.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/controls/image_view.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Predefined padding for the icon used in this tray. These are to be set to the 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// border of the icon, depending on the current shelf_alignment() 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kHorizontalShelfHorizontalPadding = 8; 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kHorizontalShelfVerticalPadding = 4; 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kVerticalShelfHorizontalPadding = 2; 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kVerticalShelfVerticalPadding = 5; 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace ash { 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)OverviewButtonTray::OverviewButtonTray( 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) internal::StatusAreaWidget* status_area_widget) 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : TrayBackgroundView(status_area_widget), 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) icon_(NULL) { 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetContentsBackground(); 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) icon_ = new views::ImageView(); 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) icon_->SetImage( 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bundle.GetImageNamed(IDR_AURA_UBER_TRAY_OVERVIEW_MODE).ToImageSkia()); 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetIconBorderForShelfAlignment(); 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) tray_container()->AddChildView(icon_); 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 45e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch UpdateIconVisibility(Shell::GetInstance()-> 46e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IsMaximizeModeWindowManagerEnabled()); 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Shell::GetInstance()->AddShellObserver(this); 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)OverviewButtonTray::~OverviewButtonTray() { 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Shell::GetInstance()->RemoveShellObserver(this); 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid OverviewButtonTray::UpdateAfterLoginStatusChange( 56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch user::LoginStatus status) { 57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch UpdateIconVisibility(Shell::GetInstance()-> 58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IsMaximizeModeWindowManagerEnabled()); 59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool OverviewButtonTray::PerformAction(const ui::Event& event) { 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Shell::GetInstance()->window_selector_controller()->ToggleOverview(); 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OverviewButtonTray::OnMaximizeModeStarted() { 67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // TODO(flackr): once maximize mode has been refactored remove this so that 68e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // UpdateIconVisibility polls Shell for the status directly 69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch UpdateIconVisibility(/* maximize_mode_enabled */ true); 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OverviewButtonTray::OnMaximizeModeEnded() { 73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch UpdateIconVisibility(/* maximize_mode_enabled */ false); 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool OverviewButtonTray::ClickedOutsideBubble() { 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This class has no bubbles dismiss, but acknowledge that the message was 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // handled. 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)base::string16 OverviewButtonTray::GetAccessibleNameForTray() { 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return l10n_util::GetStringUTF16(IDS_ASH_OVERVIEW_BUTTON_ACCESSIBLE_NAME); 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OverviewButtonTray::HideBubbleWithView( 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const views::TrayBubbleView* bubble_view) { 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This class has no bubbles to hide. 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OverviewButtonTray::SetShelfAlignment(ShelfAlignment alignment) { 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (alignment == shelf_alignment()) 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TrayBackgroundView::SetShelfAlignment(alignment); 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetIconBorderForShelfAlignment(); 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OverviewButtonTray::SetIconBorderForShelfAlignment() { 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (shelf_alignment() == SHELF_ALIGNMENT_BOTTOM || 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) shelf_alignment() == SHELF_ALIGNMENT_TOP) { 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) icon_->SetBorder(views::Border::CreateEmptyBorder( 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kHorizontalShelfVerticalPadding, 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kHorizontalShelfHorizontalPadding, 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kHorizontalShelfVerticalPadding, 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kHorizontalShelfHorizontalPadding)); 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) icon_->SetBorder(views::Border::CreateEmptyBorder( 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kVerticalShelfVerticalPadding, 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kVerticalShelfHorizontalPadding, 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kVerticalShelfVerticalPadding, 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kVerticalShelfHorizontalPadding)); 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 116e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid OverviewButtonTray::UpdateIconVisibility(bool maximize_mode_enabled) { 117e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch SetVisible(maximize_mode_enabled && 118e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch Shell::GetInstance()->window_selector_controller()->CanSelect()); 119e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 120e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace ash 122