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