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) {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WindowSelectorController* controller =
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Shell::GetInstance()->window_selector_controller();
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  controller->ToggleOverview();
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetDrawBackgroundAsActive(controller->IsSelecting());
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return true;
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OverviewButtonTray::OnMaximizeModeStarted() {
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateIconVisibility();
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OverviewButtonTray::OnMaximizeModeEnded() {
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateIconVisibility();
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool OverviewButtonTray::ClickedOutsideBubble() {
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This class has no bubbles dismiss, but acknowledge that the message was
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // handled.
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return true;
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)base::string16 OverviewButtonTray::GetAccessibleNameForTray() {
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_ASH_OVERVIEW_BUTTON_ACCESSIBLE_NAME);
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OverviewButtonTray::HideBubbleWithView(
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const views::TrayBubbleView* bubble_view) {
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This class has no bubbles to hide.
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OverviewButtonTray::SetShelfAlignment(ShelfAlignment alignment) {
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (alignment == shelf_alignment())
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TrayBackgroundView::SetShelfAlignment(alignment);
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetIconBorderForShelfAlignment();
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OverviewButtonTray::SetIconBorderForShelfAlignment() {
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (shelf_alignment() == SHELF_ALIGNMENT_BOTTOM ||
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      shelf_alignment() == SHELF_ALIGNMENT_TOP) {
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    icon_->SetBorder(views::Border::CreateEmptyBorder(
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        kHorizontalShelfVerticalPadding,
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        kHorizontalShelfHorizontalPadding,
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        kHorizontalShelfVerticalPadding,
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        kHorizontalShelfHorizontalPadding));
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    icon_->SetBorder(views::Border::CreateEmptyBorder(
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        kVerticalShelfVerticalPadding,
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        kVerticalShelfHorizontalPadding,
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        kVerticalShelfVerticalPadding,
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        kVerticalShelfHorizontalPadding));
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void OverviewButtonTray::UpdateIconVisibility() {
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetVisible(Shell::GetInstance()->maximize_mode_controller()->
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                 IsMaximizeModeWindowManagerEnabled() &&
115e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch             Shell::GetInstance()->window_selector_controller()->CanSelect());
116e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
117e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace ash
119