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