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" 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ash/wm/maximize_mode/maximize_mode_controller.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/wm/overview/window_selector_controller.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "grit/ash_resources.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "grit/ash_strings.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/border.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/controls/image_view.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Predefined padding for the icon used in this tray. These are to be set to the 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// border of the icon, depending on the current shelf_alignment() 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kHorizontalShelfHorizontalPadding = 8; 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kHorizontalShelfVerticalPadding = 4; 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kVerticalShelfHorizontalPadding = 2; 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kVerticalShelfVerticalPadding = 5; 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace ash { 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochOverviewButtonTray::OverviewButtonTray(StatusAreaWidget* status_area_widget) 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : TrayBackgroundView(status_area_widget), icon_(NULL) { 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetContentsBackground(); 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) icon_ = new views::ImageView(); 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) icon_->SetImage( 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bundle.GetImageNamed(IDR_AURA_UBER_TRAY_OVERVIEW_MODE).ToImageSkia()); 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetIconBorderForShelfAlignment(); 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) tray_container()->AddChildView(icon_); 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Shell::GetInstance()->AddShellObserver(this); 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)OverviewButtonTray::~OverviewButtonTray() { 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Shell::GetInstance()->RemoveShellObserver(this); 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid OverviewButtonTray::UpdateAfterLoginStatusChange( 52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch user::LoginStatus status) { 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) UpdateIconVisibility(); 54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool OverviewButtonTray::PerformAction(const ui::Event& event) { 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Shell::GetInstance()->window_selector_controller()->ToggleOverview(); 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OverviewButtonTray::OnMaximizeModeStarted() { 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) UpdateIconVisibility(); 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OverviewButtonTray::OnMaximizeModeEnded() { 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) UpdateIconVisibility(); 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool OverviewButtonTray::ClickedOutsideBubble() { 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This class has no bubbles dismiss, but acknowledge that the message was 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // handled. 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)base::string16 OverviewButtonTray::GetAccessibleNameForTray() { 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return l10n_util::GetStringUTF16(IDS_ASH_OVERVIEW_BUTTON_ACCESSIBLE_NAME); 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OverviewButtonTray::HideBubbleWithView( 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const views::TrayBubbleView* bubble_view) { 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This class has no bubbles to hide. 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OverviewButtonTray::SetShelfAlignment(ShelfAlignment alignment) { 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (alignment == shelf_alignment()) 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TrayBackgroundView::SetShelfAlignment(alignment); 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetIconBorderForShelfAlignment(); 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OverviewButtonTray::SetIconBorderForShelfAlignment() { 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (shelf_alignment() == SHELF_ALIGNMENT_BOTTOM || 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) shelf_alignment() == SHELF_ALIGNMENT_TOP) { 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) icon_->SetBorder(views::Border::CreateEmptyBorder( 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kHorizontalShelfVerticalPadding, 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kHorizontalShelfHorizontalPadding, 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kHorizontalShelfVerticalPadding, 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kHorizontalShelfHorizontalPadding)); 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) icon_->SetBorder(views::Border::CreateEmptyBorder( 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kVerticalShelfVerticalPadding, 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kVerticalShelfHorizontalPadding, 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kVerticalShelfVerticalPadding, 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kVerticalShelfHorizontalPadding)); 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void OverviewButtonTray::UpdateIconVisibility() { 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SetVisible(Shell::GetInstance()->maximize_mode_controller()-> 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IsMaximizeModeWindowManagerEnabled() && 112e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch Shell::GetInstance()->window_selector_controller()->CanSelect()); 113e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 114e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace ash 116